From 70853db7a8f851b63509e497e7fb35adb0b92bc0 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Tue, 22 Aug 2017 21:31:43 -0700 Subject: [PATCH] rendering works --- src/demo/demo.cpp | 50 +- src/pipeline/pipeline.cpp | 84 ++-- src/spirv_to_llvm/core_instructions.cpp | 84 +++- test-files/tri.vert | 638 +++++++++++++++++++++++- test-files/tri.vert.spv | Bin 1000 -> 15956 bytes 5 files changed, 799 insertions(+), 57 deletions(-) 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 f786d0985abbc4e397bad2fae183aab8803e8a60..ea84248060c58320c30a483a85030023296d26a0 100644 GIT binary patch literal 15956 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 AH2?qr delta 384 zcmX|-JrBWP6oqf=qZal3tyGNufJ6`@lgVI_h{hr$Vi1wkVlqib|Hf}HoBalf#5vVh zntmvFhhFN5Yh0)q#;*xq^IOMeWz0*vRut3&UWYQhwFv2_YT?|MenKI zU0cGEM27}U&jPr#|=9aSj2*^=@6u z?FKW`@VIva&7B!Q?<^5t=K_ye)SW!eymLVha}@zS=2LS@fv@INpy@I5Sd0OKNDXiS aiww`e0}N$Y8^l2Z^bnnz{U7|IHuwVf1s(|i -- 2.30.2