From: Jacob Lifshay Date: Wed, 23 Aug 2017 04:31:43 +0000 (-0700) Subject: rendering works X-Git-Tag: gsoc-2017~31 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=70853db7a8f851b63509e497e7fb35adb0b92bc0;p=kazan.git rendering works --- diff --git a/src/demo/demo.cpp b/src/demo/demo.cpp index 20b5d47..797309f 100644 --- a/src/demo/demo.cpp +++ b/src/demo/demo.cpp @@ -241,6 +241,26 @@ pipeline::Pipeline_layout_handle make_pipeline_layout() return pipeline::Pipeline_layout_handle::make(pipeline_layout_create_info); } +template +util::optional parse_unsigned_integer(util::string_view str, Integer_type max_value = std::numeric_limits::max()) noexcept +{ + static_assert(std::is_unsigned::value, ""); + if(str.empty()) + return {}; + Integer_type retval = 0; + for(char ch : str) + { + if(ch < '0' || ch > '9') + return {}; + unsigned ch_value = ch - '0'; + if(retval > max_value / 10 || (retval == max_value / 10 && ch_value > max_value % 10)) + return {}; + retval *= 10; + retval += ch_value; + } + return retval; +} + int test_main(int argc, char **argv) { if(SDL_Init(0) < 0) @@ -257,18 +277,26 @@ int test_main(int argc, char **argv) } shutdown_sdl; const char *vertex_shader_filename = "test-files/tri.vert.spv"; const char *fragment_shader_filename = "test-files/tri.frag.spv"; + const char *vertex_count_str = "633"; if(argc > 1) { - if(argc != 3 || argv[1][0] == '-' || argv[2][0] == '-') + if(argc != 4 || argv[1][0] == '-' || argv[2][0] == '-' || argv[3][0] == '-') { - std::cerr << "usage: demo [ ]\n"; + std::cerr << "usage: demo [ ]\n"; return 1; } vertex_shader_filename = argv[1]; fragment_shader_filename = argv[2]; + vertex_count_str = argv[3]; } try { + auto vertex_count = parse_unsigned_integer(vertex_count_str); + if(!vertex_count) + throw std::runtime_error("invalid value for vertex count, must be a decimal integer"); + constexpr auto max_vertex_count = 50000000; + if(*vertex_count > max_vertex_count) + throw std::runtime_error("vertex count is too large"); auto vertex_shader = load_shader(vertex_shader_filename); auto fragment_shader = load_shader(fragment_shader_filename); auto pipeline_layout = make_pipeline_layout(); @@ -358,8 +386,9 @@ int test_main(int argc, char **argv) .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, .primitiveRestartEnable = false, }; - static constexpr std::size_t window_width = 640; - static constexpr std::size_t window_height = 480; + static constexpr std::size_t window_width = 1024; + static_assert(window_width % 4 == 0, ""); + static constexpr std::size_t window_height = window_width * 3ULL / 4; static constexpr std::size_t viewport_count = 1; VkViewport viewports[viewport_count] = { { @@ -492,14 +521,14 @@ int test_main(int argc, char **argv) image::Image color_attachment(image::Image_descriptor(image_create_info), image::allocate_memory_tag); VkClearColorValue clear_color; - // set clear_color to opaque red - clear_color.float32[0] = 1; - clear_color.float32[1] = 0; - clear_color.float32[2] = 0; + // set clear_color to opaque gray + clear_color.float32[0] = 0.25; + clear_color.float32[1] = 0.25; + clear_color.float32[2] = 0.25; clear_color.float32[3] = 1; color_attachment.clear(clear_color); constexpr std::uint32_t vertex_start_index = 0; - constexpr std::uint32_t vertex_end_index = 3; + std::uint32_t vertex_end_index = *vertex_count; constexpr std::uint32_t instance_id = 0; graphics_pipeline->run(vertex_start_index, vertex_end_index, instance_id, color_attachment); typedef std::uint32_t Pixel_type; @@ -543,7 +572,8 @@ int test_main(int argc, char **argv) rgba(0, 0, 0xFF, 0), rgba(0, 0, 0, 0xFF))); if(!surface) - throw std::runtime_error(std::string("SDL_CreateRGBSurfaceFrom failed: ") + SDL_GetError()); + throw std::runtime_error(std::string("SDL_CreateRGBSurfaceFrom failed: ") + + SDL_GetError()); const char *output_file = "output.bmp"; if(SDL_SaveBMP(surface.get(), output_file) < 0) throw std::runtime_error(std::string("SDL_SaveBMP failed: ") + SDL_GetError()); diff --git a/src/pipeline/pipeline.cpp b/src/pipeline/pipeline.cpp index 1f20c32..9c7cd93 100644 --- a/src/pipeline/pipeline.cpp +++ b/src/pipeline/pipeline.cpp @@ -755,21 +755,24 @@ void Graphics_pipeline::run(std::uint32_t vertex_start_index, min_y = clipped_scissor_rect_min.y; if(end_y > clipped_scissor_rect_end.y) end_y = clipped_scissor_rect_end.y; - constexpr int scale = 1 << 8; + constexpr int log2_scale = 16; + constexpr auto scale = 1LL << log2_scale; + typedef std::int64_t Edge_equation_integer_type; struct Edge_equation { - std::int32_t a; - std::int32_t b; - std::int32_t c; - std::int32_t padding; + Edge_equation_integer_type a; + Edge_equation_integer_type b; + Edge_equation_integer_type c; + Edge_equation_integer_type padding; constexpr Edge_equation() noexcept : a(), b(), c(), padding() { } - constexpr Edge_equation(std::int32_t a, std::int32_t b, std::int32_t c) noexcept - : a(a), - b(b), - c(c), - padding() + constexpr Edge_equation(Edge_equation_integer_type a, + Edge_equation_integer_type b, + Edge_equation_integer_type c) noexcept : a(a), + b(b), + c(c), + padding() { } constexpr bool inside(std::int32_t x, std::int32_t y) const noexcept @@ -778,36 +781,49 @@ void Graphics_pipeline::run(std::uint32_t vertex_start_index, } }; Edge_equation edge_equations[triangle_vertex_count]; + bool skip_triangle = false; for(std::size_t start_vertex_index = 0, end_vertex_index = 1, other_vertex_index = 2; start_vertex_index < triangle_vertex_count; start_vertex_index++) { - float x1 = framebuffer_coordinates[start_vertex_index].x; - float y1 = framebuffer_coordinates[start_vertex_index].y; - float x2 = framebuffer_coordinates[end_vertex_index].x; - float y2 = framebuffer_coordinates[end_vertex_index].y; - [[gnu::unused]] float x3 = framebuffer_coordinates[other_vertex_index].x; - [[gnu::unused]] float y3 = framebuffer_coordinates[other_vertex_index].y; - std::int32_t a; - std::int32_t b; - std::int32_t c; + float x1_float = framebuffer_coordinates[start_vertex_index].x; + float y1_float = framebuffer_coordinates[start_vertex_index].y; + float x2_float = framebuffer_coordinates[end_vertex_index].x; + float y2_float = framebuffer_coordinates[end_vertex_index].y; + [[gnu::unused]] float x3_float = framebuffer_coordinates[other_vertex_index].x; + [[gnu::unused]] float y3_float = framebuffer_coordinates[other_vertex_index].y; + auto x1_fixed = static_cast(x1_float * scale); + auto y1_fixed = static_cast(y1_float * scale); + auto x2_fixed = static_cast(x2_float * scale); + auto y2_fixed = static_cast(y2_float * scale); + [[gnu::unused]] auto x3_fixed = + static_cast(x3_float * scale); + [[gnu::unused]] auto y3_fixed = + static_cast(y3_float * scale); + Edge_equation_integer_type a; + Edge_equation_integer_type b; + Edge_equation_integer_type c; { // solve a * x1 + b * y1 + c == 0 && // a * x2 + b * y2 + c == 0 && - // max(abs(a), abs(b)) == scale && // a * x3 + b * y3 + c >= 0 - float divisor = std::fmax(std::fabs(x2 - x1), std::fabs(y1 - y2)); - float factor = scale / divisor; - float a_float = (y1 - y2) * factor; - float b_float = (x2 - x1) * factor; - float c_float = (x1 * y2 - x2 * y1) * factor; + if(x1_fixed == x2_fixed && y1_fixed == y2_fixed) + { + // rounded to a zero-area triangle + skip_triangle = true; + break; + } + Edge_equation_integer_type a_fixed = (y1_fixed - y2_fixed) * scale; + Edge_equation_integer_type b_fixed = (x2_fixed - x1_fixed) * scale; + Edge_equation_integer_type c_fixed = + (x1_fixed * y2_fixed - x2_fixed * y1_fixed); // offset to end up checking at pixel center instead of top-left pixel corner - c_float += 0.5f * (a_float + b_float); + c_fixed += (a_fixed + b_fixed) / 2; - a = a_float; - b = b_float; - c = c_float; + a = a_fixed; + b = b_fixed; + c = c_fixed; if(orientation > 0) { // fix sign @@ -820,6 +836,7 @@ void Graphics_pipeline::run(std::uint32_t vertex_start_index, if(a < 0 || (a == 0 && b < 0)) { // not a top-left edge, fixup c + // effectively changes the '>=' to '>' in Edge_equation::inside c--; } @@ -829,6 +846,8 @@ void Graphics_pipeline::run(std::uint32_t vertex_start_index, if(++other_vertex_index >= triangle_vertex_count) other_vertex_index = 0; } + if(skip_triangle) + continue; auto fs = this->fragment_shader_function; for(std::int32_t y = min_y; y < end_y; y++) { @@ -840,10 +859,13 @@ void Graphics_pipeline::run(std::uint32_t vertex_start_index, inside &= edge_equation.inside(x, y); } if(inside) - fs(reinterpret_cast( + { + auto *pixel = reinterpret_cast( color_attachment_memory + (static_cast(x) * color_attachment_pixel_size - + static_cast(y) * color_attachment_stride))); + + static_cast(y) * color_attachment_stride)); + fs(pixel); + } } } }; diff --git a/src/spirv_to_llvm/core_instructions.cpp b/src/spirv_to_llvm/core_instructions.cpp index 1a75d6b..739f04a 100644 --- a/src/spirv_to_llvm/core_instructions.cpp +++ b/src/spirv_to_llvm/core_instructions.cpp @@ -846,6 +846,30 @@ void Spirv_to_llvm::handle_instruction_op_constant_composite(Op_constant_composi type, ::LLVMConstVector(constituents.data(), constituents.size())); break; } + else if(auto *array_type = dynamic_cast(type.get())) + { + if(instruction.constituents.size() != array_type->get_element_count()) + throw Parser_error(instruction_start_index, + instruction_start_index, + "wrong number of constituents for type"); + std::vector<::LLVMValueRef> constituents; + constituents.reserve(instruction.constituents.size()); + for(Id_ref constituent : instruction.constituents) + { + auto &constituent_state = get_id_state(constituent); + if(!constituent_state.constant) + throw Parser_error(instruction_start_index, + instruction_start_index, + "constituent must be a constant or OpUndef"); + constituents.push_back(constituent_state.constant->get_or_make_value()); + } + state.constant = std::make_shared( + type, + ::LLVMConstArray(array_type->get_element_type()->get_or_make_type().type, + constituents.data(), + constituents.size())); + break; + } else { throw Parser_error(instruction_start_index, @@ -1551,12 +1575,11 @@ void Spirv_to_llvm::handle_instruction_op_access_chain(Op_access_chain instructi instruction_start_index, "unimplemented composite type for OpAccessChain"); } - void operator()(Array_type_descriptor &) + void operator()(Array_type_descriptor &type) { -#warning finish - throw Parser_error(instruction_start_index, - instruction_start_index, - "unimplemented composite type for OpAccessChain"); + auto &index_value = this_->get_id_state(index).value.value(); + llvm_indexes.push_back(index_value.value); + current_type = type.get_element_type(); } void operator()(Pointer_type_descriptor &) { @@ -2451,11 +2474,26 @@ void Spirv_to_llvm::handle_instruction_op_s_negate(Op_s_negate instruction, void Spirv_to_llvm::handle_instruction_op_f_negate(Op_f_negate instruction, std::size_t instruction_start_index) { -#warning finish - throw Parser_error(instruction_start_index, - instruction_start_index, - "instruction not implemented: " - + std::string(get_enumerant_name(instruction.get_operation()))); + switch(stage) + { + case Stage::calculate_types: + break; + case Stage::generate_code: + { + auto &state = get_id_state(instruction.result); + if(!state.decorations.empty()) + throw Parser_error(instruction_start_index, + instruction_start_index, + "decorations on instruction not implemented: " + + std::string(get_enumerant_name(instruction.get_operation()))); + auto result_type = get_type(instruction.result_type, instruction_start_index); + auto &arg = get_id_state(instruction.operand).value.value(); + state.value = + Value(::LLVMBuildFNeg(builder.get(), arg.value, get_name(instruction.result).c_str()), + result_type); + break; + } + } } void Spirv_to_llvm::handle_instruction_op_i_add(Op_i_add instruction, @@ -2567,11 +2605,27 @@ void Spirv_to_llvm::handle_instruction_op_f_div(Op_f_div instruction, void Spirv_to_llvm::handle_instruction_op_u_mod(Op_u_mod instruction, std::size_t instruction_start_index) { -#warning finish - throw Parser_error(instruction_start_index, - instruction_start_index, - "instruction not implemented: " - + std::string(get_enumerant_name(instruction.get_operation()))); + switch(stage) + { + case Stage::calculate_types: + break; + case Stage::generate_code: + { + auto &state = get_id_state(instruction.result); + if(!state.decorations.empty()) + throw Parser_error(instruction_start_index, + instruction_start_index, + "decorations on instruction not implemented: " + + std::string(get_enumerant_name(instruction.get_operation()))); + auto result_type = get_type(instruction.result_type, instruction_start_index); + state.value = Value(::LLVMBuildURem(builder.get(), + get_id_state(instruction.operand_1).value.value().value, + get_id_state(instruction.operand_2).value.value().value, + get_name(instruction.result).c_str()), + result_type); + break; + } + } } void Spirv_to_llvm::handle_instruction_op_s_rem(Op_s_rem instruction, diff --git a/test-files/tri.vert b/test-files/tri.vert index eea2ca9..4635b2e 100644 --- a/test-files/tri.vert +++ b/test-files/tri.vert @@ -2,5 +2,641 @@ void main() { - gl_Position = vec4(gl_VertexIndex * 0.25, gl_VertexIndex % 2 * 0.5, 0.0, 1.0); + const int vertex_count = 633; + const vec4 vertices[vertex_count] = vec4[]( + vec4(0.262847, -0.208541, 0.0, 1), + vec4(0.266826, -0.211157, 0.0, 1), + vec4(0.264865, -0.212128, 0.0, 1), + vec4(0.262847, -0.208541, 0.0, 1), + vec4(0.268003, -0.208243, 0.0, 1), + vec4(0.266826, -0.211157, 0.0, 1), + vec4(0.259485, -0.202265, 0.0, 1), + vec4(0.268003, -0.208243, 0.0, 1), + vec4(0.262847, -0.208541, 0.0, 1), + vec4(0.259485, -0.202265, 0.0, 1), + vec4(0.268395, -0.203386, 0.0, 1), + vec4(0.268003, -0.208243, 0.0, 1), + vec4(0.259485, -0.202265, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.268395, -0.203386, 0.0, 1), + vec4(0.254777, -0.193298, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.259485, -0.202265, 0.0, 1), + vec4(0.246595, -0.178354, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.254777, -0.193298, 0.0, 1), + vec4(0.238861, -0.164904, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.246595, -0.178354, 0.0, 1), + vec4(0.231576, -0.152949, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.238861, -0.164904, 0.0, 1), + vec4(0.225019, -0.142898, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.231576, -0.152949, 0.0, 1), + vec4(0.219471, -0.135165, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.225019, -0.142898, 0.0, 1), + vec4(0.214932, -0.129747, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.219471, -0.135165, 0.0, 1), + vec4(0.211093, -0.125787, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.214932, -0.129747, 0.0, 1), + vec4(0.207646, -0.122425, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.211093, -0.125787, 0.0, 1), + vec4(0.207646, -0.122425, 0.0, 1), + vec4(0.319337, -0.125376, 0.0, 1), + vec4(0.268395, -0.125376, 0.0, 1), + vec4(0.207646, -0.122425, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.319337, -0.125376, 0.0, 1), + vec4(0.204592, -0.119660, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.207646, -0.122425, 0.0, 1), + vec4(0.202042, -0.117381, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.204592, -0.119660, 0.0, 1), + vec4(0.200109, -0.115476, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.202042, -0.117381, 0.0, 1), + vec4(0.198792, -0.113944, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.200109, -0.115476, 0.0, 1), + vec4(0.197951, -0.112449, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.198792, -0.113944, 0.0, 1), + vec4(0.197447, -0.110656, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.197951, -0.112449, 0.0, 1), + vec4(0.197279, -0.108564, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.197447, -0.110656, 0.0, 1), + vec4(0.197503, -0.106845, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.197279, -0.108564, 0.0, 1), + vec4(0.198175, -0.105276, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.197503, -0.106845, 0.0, 1), + vec4(0.199296, -0.103856, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.198175, -0.105276, 0.0, 1), + vec4(0.226028, -0.103856, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.199296, -0.103856, 0.0, 1), + vec4(0.226028, 0.098565, 0.0, 1), + vec4(0.268395, -0.103856, 0.0, 1), + vec4(0.226028, -0.103856, 0.0, 1), + vec4(0.268395, -0.103856, 0.0, 1), + vec4(0.319337, -0.103856, 0.0, 1), + vec4(0.226028, -0.103856, 0.0, 1), + vec4(0.226028, 0.098565, 0.0, 1), + vec4(0.268395, 0.088477, 0.0, 1), + vec4(0.268395, -0.103856, 0.0, 1), + vec4(0.226028, 0.098565, 0.0, 1), + vec4(0.269068, 0.107643, 0.0, 1), + vec4(0.268395, 0.088477, 0.0, 1), + vec4(0.231016, 0.146013, 0.0, 1), + vec4(0.269068, 0.107643, 0.0, 1), + vec4(0.226028, 0.098565, 0.0, 1), + vec4(0.231016, 0.146013, 0.0, 1), + vec4(0.271085, 0.122999, 0.0, 1), + vec4(0.269068, 0.107643, 0.0, 1), + vec4(0.231016, 0.146013, 0.0, 1), + vec4(0.274448, 0.134543, 0.0, 1), + vec4(0.271085, 0.122999, 0.0, 1), + vec4(0.315021, 0.138541, 0.0, 1), + vec4(0.331442, 0.132862, 0.0, 1), + vec4(0.324885, 0.125464, 0.0, 1), + vec4(0.315021, 0.138541, 0.0, 1), + vec4(0.313957, 0.161256, 0.0, 1), + vec4(0.331442, 0.132862, 0.0, 1), + vec4(0.231016, 0.146013, 0.0, 1), + vec4(0.279379, 0.142576, 0.0, 1), + vec4(0.274448, 0.134543, 0.0, 1), + vec4(0.304934, 0.146386, 0.0, 1), + vec4(0.313957, 0.161256, 0.0, 1), + vec4(0.315021, 0.138541, 0.0, 1), + vec4(0.231016, 0.146013, 0.0, 1), + vec4(0.286104, 0.147395, 0.0, 1), + vec4(0.279379, 0.142576, 0.0, 1), + vec4(0.245979, 0.174482, 0.0, 1), + vec4(0.286104, 0.147395, 0.0, 1), + vec4(0.231016, 0.146013, 0.0, 1), + vec4(0.294622, 0.149002, 0.0, 1), + vec4(0.313957, 0.161256, 0.0, 1), + vec4(0.304934, 0.146386, 0.0, 1), + vec4(0.245979, 0.174482, 0.0, 1), + vec4(0.294622, 0.149002, 0.0, 1), + vec4(0.286104, 0.147395, 0.0, 1), + vec4(0.245979, 0.174482, 0.0, 1), + vec4(0.313957, 0.161256, 0.0, 1), + vec4(0.294622, 0.149002, 0.0, 1), + vec4(0.245979, 0.174482, 0.0, 1), + vec4(0.293782, 0.178293, 0.0, 1), + vec4(0.313957, 0.161256, 0.0, 1), + vec4(0.270917, 0.183971, 0.0, 1), + vec4(0.293782, 0.178293, 0.0, 1), + vec4(0.245979, 0.174482, 0.0, 1), + vec4(0.071158, -0.128851, 0.0, 1), + vec4(0.100720, -0.130719, 0.0, 1), + vec4(0.089848, -0.131429, 0.0, 1), + vec4(0.071158, -0.128851, 0.0, 1), + vec4(0.111143, -0.128589, 0.0, 1), + vec4(0.100720, -0.130719, 0.0, 1), + vec4(0.054766, -0.121117, 0.0, 1), + vec4(0.111143, -0.128589, 0.0, 1), + vec4(0.071158, -0.128851, 0.0, 1), + vec4(0.054766, -0.121117, 0.0, 1), + vec4(0.121119, -0.125040, 0.0, 1), + vec4(0.111143, -0.128589, 0.0, 1), + vec4(0.142582, -0.121640, 0.0, 1), + vec4(0.152390, -0.125376, 0.0, 1), + vec4(0.146842, -0.125376, 0.0, 1), + vec4(0.142582, -0.121640, 0.0, 1), + vec4(0.154407, -0.033917, 0.0, 1), + vec4(0.152390, -0.125376, 0.0, 1), + vec4(0.054766, -0.121117, 0.0, 1), + vec4(0.129581, -0.121491, 0.0, 1), + vec4(0.121119, -0.125040, 0.0, 1), + vec4(0.139893, -0.119398, 0.0, 1), + vec4(0.154407, -0.033917, 0.0, 1), + vec4(0.142582, -0.121640, 0.0, 1), + vec4(0.054766, -0.121117, 0.0, 1), + vec4(0.135465, -0.119361, 0.0, 1), + vec4(0.129581, -0.121491, 0.0, 1), + vec4(0.040672, -0.108228, 0.0, 1), + vec4(0.080629, -0.115214, 0.0, 1), + vec4(0.054766, -0.121117, 0.0, 1), + vec4(0.080629, -0.115214, 0.0, 1), + vec4(0.091361, -0.116634, 0.0, 1), + vec4(0.054766, -0.121117, 0.0, 1), + vec4(0.091361, -0.116634, 0.0, 1), + vec4(0.135465, -0.119361, 0.0, 1), + vec4(0.054766, -0.121117, 0.0, 1), + vec4(0.138772, -0.118651, 0.0, 1), + vec4(0.154407, -0.033917, 0.0, 1), + vec4(0.139893, -0.119398, 0.0, 1), + vec4(0.091361, -0.116634, 0.0, 1), + vec4(0.138772, -0.118651, 0.0, 1), + vec4(0.135465, -0.119361, 0.0, 1), + vec4(0.091361, -0.116634, 0.0, 1), + vec4(0.104811, -0.114542, 0.0, 1), + vec4(0.138772, -0.118651, 0.0, 1), + vec4(0.104811, -0.114542, 0.0, 1), + vec4(0.116243, -0.108265, 0.0, 1), + vec4(0.138772, -0.118651, 0.0, 1), + vec4(0.116243, -0.108265, 0.0, 1), + vec4(0.125658, -0.097804, 0.0, 1), + vec4(0.138772, -0.118651, 0.0, 1), + vec4(0.125658, -0.097804, 0.0, 1), + vec4(0.133616, -0.082337, 0.0, 1), + vec4(0.138772, -0.118651, 0.0, 1), + vec4(0.133616, -0.082337, 0.0, 1), + vec4(0.154407, -0.033917, 0.0, 1), + vec4(0.138772, -0.118651, 0.0, 1), + vec4(0.040672, -0.108228, 0.0, 1), + vec4(0.071298, -0.110955, 0.0, 1), + vec4(0.080629, -0.115214, 0.0, 1), + vec4(0.040672, -0.108228, 0.0, 1), + vec4(0.063368, -0.103856, 0.0, 1), + vec4(0.071298, -0.110955, 0.0, 1), + vec4(0.029884, -0.091303, 0.0, 1), + vec4(0.063368, -0.103856, 0.0, 1), + vec4(0.040672, -0.108228, 0.0, 1), + vec4(0.029884, -0.091303, 0.0, 1), + vec4(0.057344, -0.094516, 0.0, 1), + vec4(0.063368, -0.103856, 0.0, 1), + vec4(0.029884, -0.091303, 0.0, 1), + vec4(0.053729, -0.083532, 0.0, 1), + vec4(0.057344, -0.094516, 0.0, 1), + vec4(0.023411, -0.071465, 0.0, 1), + vec4(0.053729, -0.083532, 0.0, 1), + vec4(0.029884, -0.091303, 0.0, 1), + vec4(0.023411, -0.071465, 0.0, 1), + vec4(0.052524, -0.070904, 0.0, 1), + vec4(0.053729, -0.083532, 0.0, 1), + vec4(0.140677, -0.061041, 0.0, 1), + vec4(0.154407, -0.033917, 0.0, 1), + vec4(0.133616, -0.082337, 0.0, 1), + vec4(0.021253, -0.048712, 0.0, 1), + vec4(0.052524, -0.070904, 0.0, 1), + vec4(0.023411, -0.071465, 0.0, 1), + vec4(0.021253, -0.048712, 0.0, 1), + vec4(0.054934, -0.052971, 0.0, 1), + vec4(0.052524, -0.070904, 0.0, 1), + vec4(0.146842, -0.033917, 0.0, 1), + vec4(0.154407, -0.033917, 0.0, 1), + vec4(0.140677, -0.061041, 0.0, 1), + vec4(0.021253, -0.048712, 0.0, 1), + vec4(0.062163, -0.037728, 0.0, 1), + vec4(0.054934, -0.052971, 0.0, 1), + vec4(0.022738, -0.030554, 0.0, 1), + vec4(0.062163, -0.037728, 0.0, 1), + vec4(0.021253, -0.048712, 0.0, 1), + vec4(0.022738, -0.030554, 0.0, 1), + vec4(0.074212, -0.025174, 0.0, 1), + vec4(0.062163, -0.037728, 0.0, 1), + vec4(0.027194, -0.013742, 0.0, 1), + vec4(0.074212, -0.025174, 0.0, 1), + vec4(0.022738, -0.030554, 0.0, 1), + vec4(0.027194, -0.013742, 0.0, 1), + vec4(0.128684, 0.017865, 0.0, 1), + vec4(0.074212, -0.025174, 0.0, 1), + vec4(0.034619, 0.001725, 0.0, 1), + vec4(0.128684, 0.017865, 0.0, 1), + vec4(0.027194, -0.013742, 0.0, 1), + vec4(0.045631, 0.016744, 0.0, 1), + vec4(0.128684, 0.017865, 0.0, 1), + vec4(0.034619, 0.001725, 0.0, 1), + vec4(0.060846, 0.032212, 0.0, 1), + vec4(0.128684, 0.017865, 0.0, 1), + vec4(0.045631, 0.016744, 0.0, 1), + vec4(0.060846, 0.032212, 0.0, 1), + vec4(0.142386, 0.030007, 0.0, 1), + vec4(0.128684, 0.017865, 0.0, 1), + vec4(0.060846, 0.032212, 0.0, 1), + vec4(0.153230, 0.042224, 0.0, 1), + vec4(0.142386, 0.030007, 0.0, 1), + vec4(0.080265, 0.048127, 0.0, 1), + vec4(0.153230, 0.042224, 0.0, 1), + vec4(0.060846, 0.032212, 0.0, 1), + vec4(0.080265, 0.048127, 0.0, 1), + vec4(0.161216, 0.054516, 0.0, 1), + vec4(0.153230, 0.042224, 0.0, 1), + vec4(0.109518, 0.070320, 0.0, 1), + vec4(0.161216, 0.054516, 0.0, 1), + vec4(0.080265, 0.048127, 0.0, 1), + vec4(0.109518, 0.070320, 0.0, 1), + vec4(0.166680, 0.067555, 0.0, 1), + vec4(0.161216, 0.054516, 0.0, 1), + vec4(0.109518, 0.070320, 0.0, 1), + vec4(0.169959, 0.082014, 0.0, 1), + vec4(0.166680, 0.067555, 0.0, 1), + vec4(0.124089, 0.084891, 0.0, 1), + vec4(0.169959, 0.082014, 0.0, 1), + vec4(0.109518, 0.070320, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.029828, 0.075027, 0.0, 1), + vec4(0.021758, 0.075027, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.035544, 0.103347, 0.0, 1), + vec4(0.029828, 0.075027, 0.0, 1), + vec4(0.124089, 0.084891, 0.0, 1), + vec4(0.171051, 0.097892, 0.0, 1), + vec4(0.169959, 0.082014, 0.0, 1), + vec4(0.132831, 0.101703, 0.0, 1), + vec4(0.171051, 0.097892, 0.0, 1), + vec4(0.124089, 0.084891, 0.0, 1), + vec4(0.132831, 0.101703, 0.0, 1), + vec4(0.168726, 0.120159, 0.0, 1), + vec4(0.171051, 0.097892, 0.0, 1), + vec4(0.135745, 0.120757, 0.0, 1), + vec4(0.168726, 0.120159, 0.0, 1), + vec4(0.132831, 0.101703, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.041932, 0.125539, 0.0, 1), + vec4(0.035544, 0.103347, 0.0, 1), + vec4(0.135745, 0.120757, 0.0, 1), + vec4(0.161749, 0.140334, 0.0, 1), + vec4(0.168726, 0.120159, 0.0, 1), + vec4(0.134484, 0.134543, 0.0, 1), + vec4(0.161749, 0.140334, 0.0, 1), + vec4(0.135745, 0.120757, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.048994, 0.141604, 0.0, 1), + vec4(0.041932, 0.125539, 0.0, 1), + vec4(0.130702, 0.146312, 0.0, 1), + vec4(0.161749, 0.140334, 0.0, 1), + vec4(0.134484, 0.134543, 0.0, 1), + vec4(0.130702, 0.146312, 0.0, 1), + vec4(0.150120, 0.158417, 0.0, 1), + vec4(0.161749, 0.140334, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.061155, 0.156922, 0.0, 1), + vec4(0.048994, 0.141604, 0.0, 1), + vec4(0.124397, 0.156063, 0.0, 1), + vec4(0.150120, 0.158417, 0.0, 1), + vec4(0.130702, 0.146312, 0.0, 1), + vec4(0.115963, 0.163348, 0.0, 1), + vec4(0.150120, 0.158417, 0.0, 1), + vec4(0.124397, 0.156063, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.035264, 0.172763, 0.0, 1), + vec4(0.061155, 0.156922, 0.0, 1), + vec4(0.035264, 0.172763, 0.0, 1), + vec4(0.039915, 0.171867, 0.0, 1), + vec4(0.061155, 0.156922, 0.0, 1), + vec4(0.039915, 0.171867, 0.0, 1), + vec4(0.076118, 0.166113, 0.0, 1), + vec4(0.061155, 0.156922, 0.0, 1), + vec4(0.115963, 0.163348, 0.0, 1), + vec4(0.135241, 0.172614, 0.0, 1), + vec4(0.150120, 0.158417, 0.0, 1), + vec4(0.105791, 0.167719, 0.0, 1), + vec4(0.135241, 0.172614, 0.0, 1), + vec4(0.115963, 0.163348, 0.0, 1), + vec4(0.039915, 0.171867, 0.0, 1), + vec4(0.093883, 0.169177, 0.0, 1), + vec4(0.076118, 0.166113, 0.0, 1), + vec4(0.093883, 0.169177, 0.0, 1), + vec4(0.135241, 0.172614, 0.0, 1), + vec4(0.105791, 0.167719, 0.0, 1), + vec4(0.039915, 0.171867, 0.0, 1), + vec4(0.135241, 0.172614, 0.0, 1), + vec4(0.093883, 0.169177, 0.0, 1), + vec4(0.045071, 0.172539, 0.0, 1), + vec4(0.135241, 0.172614, 0.0, 1), + vec4(0.039915, 0.171867, 0.0, 1), + vec4(0.053813, 0.174557, 0.0, 1), + vec4(0.135241, 0.172614, 0.0, 1), + vec4(0.045071, 0.172539, 0.0, 1), + vec4(0.053813, 0.174557, 0.0, 1), + vec4(0.118513, 0.181132, 0.0, 1), + vec4(0.135241, 0.172614, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.031397, 0.175453, 0.0, 1), + vec4(0.035264, 0.172763, 0.0, 1), + vec4(0.066142, 0.177919, 0.0, 1), + vec4(0.118513, 0.181132, 0.0, 1), + vec4(0.053813, 0.174557, 0.0, 1), + vec4(0.021758, 0.179936, 0.0, 1), + vec4(0.028314, 0.179936, 0.0, 1), + vec4(0.031397, 0.175453, 0.0, 1), + vec4(0.079312, 0.181281, 0.0, 1), + vec4(0.118513, 0.181132, 0.0, 1), + vec4(0.066142, 0.177919, 0.0, 1), + vec4(0.079312, 0.181281, 0.0, 1), + vec4(0.099935, 0.183971, 0.0, 1), + vec4(0.118513, 0.181132, 0.0, 1), + vec4(0.090576, 0.183299, 0.0, 1), + vec4(0.099935, 0.183971, 0.0, 1), + vec4(0.079312, 0.181281, 0.0, 1), + vec4(-0.131375, -0.127057, 0.0, 1), + vec4(-0.078668, -0.128701, 0.0, 1), + vec4(-0.102318, -0.132101, 0.0, 1), + vec4(-0.131375, -0.127057, 0.0, 1), + vec4(-0.058830, -0.118502, 0.0, 1), + vec4(-0.078668, -0.128701, 0.0, 1), + vec4(-0.156678, -0.111926, 0.0, 1), + vec4(-0.058830, -0.118502, 0.0, 1), + vec4(-0.131375, -0.127057, 0.0, 1), + vec4(-0.156678, -0.111926, 0.0, 1), + vec4(-0.042802, -0.101503, 0.0, 1), + vec4(-0.058830, -0.118502, 0.0, 1), + vec4(-0.178226, -0.086708, 0.0, 1), + vec4(-0.143060, -0.099298, 0.0, 1), + vec4(-0.156678, -0.111926, 0.0, 1), + vec4(-0.143060, -0.099298, 0.0, 1), + vec4(-0.116945, -0.107891, 0.0, 1), + vec4(-0.156678, -0.111926, 0.0, 1), + vec4(-0.116945, -0.107891, 0.0, 1), + vec4(-0.042802, -0.101503, 0.0, 1), + vec4(-0.156678, -0.111926, 0.0, 1), + vec4(-0.102878, -0.106023, 0.0, 1), + vec4(-0.042802, -0.101503, 0.0, 1), + vec4(-0.116945, -0.107891, 0.0, 1), + vec4(-0.091614, -0.100419, 0.0, 1), + vec4(-0.042802, -0.101503, 0.0, 1), + vec4(-0.102878, -0.106023, 0.0, 1), + vec4(-0.091614, -0.100419, 0.0, 1), + vec4(-0.030417, -0.077629, 0.0, 1), + vec4(-0.042802, -0.101503, 0.0, 1), + vec4(-0.083152, -0.091079, 0.0, 1), + vec4(-0.030417, -0.077629, 0.0, 1), + vec4(-0.091614, -0.100419, 0.0, 1), + vec4(-0.178226, -0.086708, 0.0, 1), + vec4(-0.160881, -0.073519, 0.0, 1), + vec4(-0.143060, -0.099298, 0.0, 1), + vec4(-0.076707, -0.076882, 0.0, 1), + vec4(-0.030417, -0.077629, 0.0, 1), + vec4(-0.083152, -0.091079, 0.0, 1), + vec4(-0.194618, -0.053195, 0.0, 1), + vec4(-0.160881, -0.073519, 0.0, 1), + vec4(-0.178226, -0.086708, 0.0, 1), + vec4(-0.076707, -0.076882, 0.0, 1), + vec4(-0.021506, -0.046806, 0.0, 1), + vec4(-0.030417, -0.077629, 0.0, 1), + vec4(-0.071495, -0.056707, 0.0, 1), + vec4(-0.021506, -0.046806, 0.0, 1), + vec4(-0.076707, -0.076882, 0.0, 1), + vec4(-0.194618, -0.053195, 0.0, 1), + vec4(-0.170408, -0.030554, 0.0, 1), + vec4(-0.160881, -0.073519, 0.0, 1), + vec4(-0.067516, -0.030554, 0.0, 1), + vec4(-0.021506, -0.046806, 0.0, 1), + vec4(-0.071495, -0.056707, 0.0, 1), + vec4(-0.204453, -0.013182, 0.0, 1), + vec4(-0.170408, -0.030554, 0.0, 1), + vec4(-0.194618, -0.053195, 0.0, 1), + vec4(-0.067516, -0.030554, 0.0, 1), + vec4(-0.016070, -0.009035, 0.0, 1), + vec4(-0.021506, -0.046806, 0.0, 1), + vec4(-0.204453, -0.013182, 0.0, 1), + vec4(-0.067516, -0.030554, 0.0, 1), + vec4(-0.170408, -0.030554, 0.0, 1), + vec4(-0.204453, -0.013182, 0.0, 1), + vec4(-0.016070, -0.009035, 0.0, 1), + vec4(-0.067516, -0.030554, 0.0, 1), + vec4(-0.207731, 0.033333, 0.0, 1), + vec4(-0.171417, -0.009035, 0.0, 1), + vec4(-0.204453, -0.013182, 0.0, 1), + vec4(-0.171417, -0.009035, 0.0, 1), + vec4(-0.016070, -0.009035, 0.0, 1), + vec4(-0.204453, -0.013182, 0.0, 1), + vec4(-0.207731, 0.033333, 0.0, 1), + vec4(-0.170016, 0.017903, 0.0, 1), + vec4(-0.171417, -0.009035, 0.0, 1), + vec4(-0.207731, 0.033333, 0.0, 1), + vec4(-0.167157, 0.042224, 0.0, 1), + vec4(-0.170016, 0.017903, 0.0, 1), + vec4(-0.204901, 0.076335, 0.0, 1), + vec4(-0.167157, 0.042224, 0.0, 1), + vec4(-0.207731, 0.033333, 0.0, 1), + vec4(-0.204901, 0.076335, 0.0, 1), + vec4(-0.162842, 0.063931, 0.0, 1), + vec4(-0.167157, 0.042224, 0.0, 1), + vec4(-0.204901, 0.076335, 0.0, 1), + vec4(-0.157294, 0.082612, 0.0, 1), + vec4(-0.162842, 0.063931, 0.0, 1), + vec4(-0.026634, 0.090046, 0.0, 1), + vec4(-0.006487, 0.071665, 0.0, 1), + vec4(-0.014557, 0.066957, 0.0, 1), + vec4(-0.026634, 0.090046, 0.0, 1), + vec4(-0.018256, 0.105140, 0.0, 1), + vec4(-0.006487, 0.071665, 0.0, 1), + vec4(-0.196411, 0.112986, 0.0, 1), + vec4(-0.157294, 0.082612, 0.0, 1), + vec4(-0.204901, 0.076335, 0.0, 1), + vec4(-0.196411, 0.112986, 0.0, 1), + vec4(-0.150737, 0.097855, 0.0, 1), + vec4(-0.157294, 0.082612, 0.0, 1), + vec4(-0.038655, 0.108204, 0.0, 1), + vec4(-0.018256, 0.105140, 0.0, 1), + vec4(-0.026634, 0.090046, 0.0, 1), + vec4(-0.196411, 0.112986, 0.0, 1), + vec4(-0.143172, 0.109661, 0.0, 1), + vec4(-0.150737, 0.097855, 0.0, 1), + vec4(-0.038655, 0.108204, 0.0, 1), + vec4(-0.032715, 0.132937, 0.0, 1), + vec4(-0.018256, 0.105140, 0.0, 1), + vec4(-0.050620, 0.121429, 0.0, 1), + vec4(-0.032715, 0.132937, 0.0, 1), + vec4(-0.038655, 0.108204, 0.0, 1), + vec4(-0.196411, 0.112986, 0.0, 1), + vec4(-0.135074, 0.118777, 0.0, 1), + vec4(-0.143172, 0.109661, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.135074, 0.118777, 0.0, 1), + vec4(-0.196411, 0.112986, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.126920, 0.125950, 0.0, 1), + vec4(-0.135074, 0.118777, 0.0, 1), + vec4(-0.063257, 0.130396, 0.0, 1), + vec4(-0.032715, 0.132937, 0.0, 1), + vec4(-0.050620, 0.121429, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.118710, 0.131181, 0.0, 1), + vec4(-0.126920, 0.125950, 0.0, 1), + vec4(-0.077295, 0.135776, 0.0, 1), + vec4(-0.032715, 0.132937, 0.0, 1), + vec4(-0.063257, 0.130396, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.110332, 0.134730, 0.0, 1), + vec4(-0.118710, 0.131181, 0.0, 1), + vec4(-0.077295, 0.135776, 0.0, 1), + vec4(-0.049863, 0.155054, 0.0, 1), + vec4(-0.032715, 0.132937, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.101673, 0.136859, 0.0, 1), + vec4(-0.110332, 0.134730, 0.0, 1), + vec4(-0.092735, 0.137569, 0.0, 1), + vec4(-0.049863, 0.155054, 0.0, 1), + vec4(-0.077295, 0.135776, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.092735, 0.137569, 0.0, 1), + vec4(-0.101673, 0.136859, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.049863, 0.155054, 0.0, 1), + vec4(-0.092735, 0.137569, 0.0, 1), + vec4(-0.163291, 0.165889, 0.0, 1), + vec4(-0.049863, 0.155054, 0.0, 1), + vec4(-0.182261, 0.143285, 0.0, 1), + vec4(-0.163291, 0.165889, 0.0, 1), + vec4(-0.069253, 0.171119, 0.0, 1), + vec4(-0.049863, 0.155054, 0.0, 1), + vec4(-0.140342, 0.179451, 0.0, 1), + vec4(-0.069253, 0.171119, 0.0, 1), + vec4(-0.163291, 0.165889, 0.0, 1), + vec4(-0.140342, 0.179451, 0.0, 1), + vec4(-0.090437, 0.180758, 0.0, 1), + vec4(-0.069253, 0.171119, 0.0, 1), + vec4(-0.113414, 0.183971, 0.0, 1), + vec4(-0.090437, 0.180758, 0.0, 1), + vec4(-0.140342, 0.179451, 0.0, 1), + vec4(-0.518424, -0.153621, 0.0, 1), + vec4(-0.491860, -0.209513, 0.0, 1), + vec4(-0.515398, -0.267945, 0.0, 1), + vec4(-0.491860, -0.209513, 0.0, 1), + vec4(-0.482866, -0.224233, 0.0, 1), + vec4(-0.515398, -0.267945, 0.0, 1), + vec4(-0.482866, -0.224233, 0.0, 1), + vec4(-0.470172, -0.232826, 0.0, 1), + vec4(-0.515398, -0.267945, 0.0, 1), + vec4(-0.470172, -0.232826, 0.0, 1), + vec4(-0.451259, -0.237982, 0.0, 1), + vec4(-0.515398, -0.267945, 0.0, 1), + vec4(-0.451259, -0.237982, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.515398, -0.267945, 0.0, 1), + vec4(-0.451259, -0.237982, 0.0, 1), + vec4(-0.426124, -0.239700, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.426124, -0.239700, 0.0, 1), + vec4(-0.398888, -0.239700, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.398888, -0.239700, 0.0, 1), + vec4(-0.347442, -0.239700, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.347442, -0.239700, 0.0, 1), + vec4(-0.320206, -0.239700, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.320206, -0.239700, 0.0, 1), + vec4(-0.294791, -0.238019, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.294791, -0.238019, 0.0, 1), + vec4(-0.275709, -0.232975, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.275709, -0.232975, 0.0, 1), + vec4(-0.262960, -0.224569, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.262960, -0.224569, 0.0, 1), + vec4(-0.254021, -0.209961, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.254021, -0.209961, 0.0, 1), + vec4(-0.227906, -0.153621, 0.0, 1), + vec4(-0.230932, -0.267945, 0.0, 1), + vec4(-0.398888, 0.096547, 0.0, 1), + vec4(-0.347442, -0.239700, 0.0, 1), + vec4(-0.398888, -0.239700, 0.0, 1), + vec4(-0.398888, 0.096547, 0.0, 1), + vec4(-0.347442, 0.103945, 0.0, 1), + vec4(-0.347442, -0.239700, 0.0, 1), + vec4(-0.246372, -0.186312, 0.0, 1), + vec4(-0.227906, -0.153621, 0.0, 1), + vec4(-0.254021, -0.209961, 0.0, 1), + vec4(-0.518424, -0.153621, 0.0, 1), + vec4(-0.499678, -0.185976, 0.0, 1), + vec4(-0.491860, -0.209513, 0.0, 1), + vec4(-0.240011, -0.153621, 0.0, 1), + vec4(-0.227906, -0.153621, 0.0, 1), + vec4(-0.246372, -0.186312, 0.0, 1), + vec4(-0.518424, -0.153621, 0.0, 1), + vec4(-0.506319, -0.153621, 0.0, 1), + vec4(-0.499678, -0.185976, 0.0, 1), + vec4(-0.399785, 0.121691, 0.0, 1), + vec4(-0.347442, 0.103945, 0.0, 1), + vec4(-0.398888, 0.096547, 0.0, 1), + vec4(-0.399785, 0.121691, 0.0, 1), + vec4(-0.346489, 0.125689, 0.0, 1), + vec4(-0.347442, 0.103945, 0.0, 1), + vec4(-0.402475, 0.139736, 0.0, 1), + vec4(-0.346489, 0.125689, 0.0, 1), + vec4(-0.399785, 0.121691, 0.0, 1), + vec4(-0.402475, 0.139736, 0.0, 1), + vec4(-0.343631, 0.141604, 0.0, 1), + vec4(-0.346489, 0.125689, 0.0, 1), + vec4(-0.406958, 0.150683, 0.0, 1), + vec4(-0.343631, 0.141604, 0.0, 1), + vec4(-0.402475, 0.139736, 0.0, 1), + vec4(-0.406958, 0.150683, 0.0, 1), + vec4(-0.338868, 0.151692, 0.0, 1), + vec4(-0.343631, 0.141604, 0.0, 1), + vec4(-0.414916, 0.157146, 0.0, 1), + vec4(-0.338868, 0.151692, 0.0, 1), + vec4(-0.406958, 0.150683, 0.0, 1), + vec4(-0.414916, 0.157146, 0.0, 1), + vec4(-0.330630, 0.157894, 0.0, 1), + vec4(-0.338868, 0.151692, 0.0, 1), + vec4(-0.428029, 0.161742, 0.0, 1), + vec4(-0.330630, 0.157894, 0.0, 1), + vec4(-0.414916, 0.157146, 0.0, 1), + vec4(-0.428029, 0.161742, 0.0, 1), + vec4(-0.317348, 0.162153, 0.0, 1), + vec4(-0.330630, 0.157894, 0.0, 1), + vec4(-0.446299, 0.164469, 0.0, 1), + vec4(-0.317348, 0.162153, 0.0, 1), + vec4(-0.428029, 0.161742, 0.0, 1), + vec4(-0.446299, 0.164469, 0.0, 1), + vec4(-0.299022, 0.164469, 0.0, 1), + vec4(-0.317348, 0.162153, 0.0, 1), + vec4(-0.446299, 0.177246, 0.0, 1), + vec4(-0.299022, 0.164469, 0.0, 1), + vec4(-0.446299, 0.164469, 0.0, 1), + vec4(-0.446299, 0.177246, 0.0, 1), + vec4(-0.299022, 0.177246, 0.0, 1), + vec4(-0.299022, 0.164469, 0.0, 1) + ); + gl_Position = vertices[uint(gl_VertexIndex) % vertex_count]; } diff --git a/test-files/tri.vert.spv b/test-files/tri.vert.spv index f786d09..ea84248 100644 Binary files a/test-files/tri.vert.spv and b/test-files/tri.vert.spv differ