diff --git a/example/cube.cpp b/example/cube.cpp index d4c57ff..83e143e 100644 --- a/example/cube.cpp +++ b/example/cube.cpp @@ -3,17 +3,19 @@ #include "align.hpp" #include "vga.hpp" -#include "holly.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" #include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" #include "holly/texture_memory_alloc.hpp" #include "memorymap.hpp" -#include "serial.hpp" #include "geometry/cube.hpp" #include "math/vec4.hpp" @@ -59,10 +61,14 @@ void transform(ta_parameter_writer& parameter, | tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::fog_control::no_fog; - parameter.append() = global_polygon_type_0(parameter_control_word, - isp_tsp_instruction_word, - tsp_instruction_word, - 0); + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + 0, // texture_control_word + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); auto& face = cube::faces[face_ix]; constexpr uint32_t strip_length = 3; @@ -116,13 +122,14 @@ void transform(ta_parameter_writer& parameter, y += 240.f; z = 1 / z; - parameter.append() = - vertex_polygon_type_1(x, y, z, + parameter.append() = + ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, color.w, // alpha color.x, // r color.y, // g - color.z, // b - end_of_strip); + color.z // b + ); } } @@ -163,8 +170,6 @@ void main() , .punch_through = 0 }; - constexpr uint32_t tiles = (640 / 32) * (320 / 32); - holly.SOFTRESET = softreset::pipeline_soft_reset | softreset::ta_soft_reset; holly.SOFTRESET = 0; @@ -182,8 +187,10 @@ void main() }; while (1) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc, - 640, 480); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); //lights[0].x = cos(theta) * 10; //lights[0].z = sin(theta) * 10; @@ -195,7 +202,7 @@ void main() for (uint32_t i = 0; i < cube::num_faces; i++) { transform(parameter, i, theta, lights); } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_opaque_list(); core_start_render(frame_ix, num_frames); diff --git a/example/example.mk b/example/example.mk index 0a2adcf..70530cb 100644 --- a/example/example.mk +++ b/example/example.mk @@ -40,7 +40,6 @@ FONT_BITMAP_OBJ = \ holly/region_array.o \ holly/background.o \ holly/ta_fifo_polygon_converter.o \ - serial.o \ sperrypc.data.o example/font_bitmap.elf: LDSCRIPT = $(LIB)/alt.lds @@ -53,7 +52,6 @@ FONT_OUTLINE_OBJ = \ holly/region_array.o \ holly/background.o \ holly/ta_fifo_polygon_converter.o \ - serial.o \ dejavusansmono.data.o example/font_outline.elf: LDSCRIPT = $(LIB)/alt.lds @@ -66,7 +64,6 @@ FONT_OUTLINE_PUNCH_THROUGH_OBJ = \ holly/region_array.o \ holly/background.o \ holly/ta_fifo_polygon_converter.o \ - serial.o \ dejavusansmono_mono.data.o example/font_outline_punch_through.elf: LDSCRIPT = $(LIB)/alt.lds @@ -185,7 +182,6 @@ MACAW_CUBE_RENDER_TO_TEXTURE_OBJ = \ holly/region_array.o \ holly/background.o \ holly/ta_fifo_polygon_converter.o \ - serial.o \ macaw.data.o example/macaw_cube_render_to_texture.elf: LDSCRIPT = $(LIB)/alt.lds @@ -203,7 +199,7 @@ example/maple_device_request.elf: $(START_OBJ) $(MAPLE_DEVICE_REQUEST_OBJ) MAPLE_CONTROLLER_OBJ = \ example/maple_controller.o \ vga.o \ - serial.o \ + sh7091/serial.o \ maple/maple.o example/maple_controller.elf: LDSCRIPT = $(LIB)/alt.lds @@ -237,7 +233,6 @@ MAPLE_ANALOG_OBJ = \ holly/region_array.o \ holly/background.o \ holly/ta_fifo_polygon_converter.o \ - serial.o \ maple/maple.o example/maple_analog.elf: LDSCRIPT = $(LIB)/alt.lds diff --git a/example/font_bitmap.cpp b/example/font_bitmap.cpp index 511dd63..c0822b6 100644 --- a/example/font_bitmap.cpp +++ b/example/font_bitmap.cpp @@ -1,20 +1,22 @@ #include #include "align.hpp" - #include "vga.hpp" -#include "holly.hpp" + +#include "holly/texture_memory_alloc.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" -#include "holly/ta_parameter.hpp" #include "holly/ta_fifo_polygon_converter.hpp" -#include "holly/texture_memory_alloc.hpp" +#include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "memorymap.hpp" #include "holly/background.hpp" #include "holly/region_array.hpp" -#include "holly/ta_bits.hpp" #include "twiddle.hpp" -#include "serial.hpp" #include "sperrypc.hpp" @@ -92,25 +94,35 @@ constexpr uint32_t strip_length = (sizeof (strip_vertices)) / (sizeof (struct ve uint32_t transform(uint32_t * ta_parameter_buf, const char * s, const uint32_t len) { auto parameter = ta_parameter_writer(ta_parameter_buf); - uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); for (uint32_t string_ix = 0; string_ix < len; string_ix++) { - auto polygon = global_polygon_type_0(texture_address); - polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::opaque - | obj_control::col_type::packed_color - | obj_control::texture; + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::_8 // 8px - | tsp_instruction_word::texture_v_size::_8; // 8px + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; - polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette - | texture_control_word::scan_order::twiddled - | texture_control_word::texture_address((texture_address + 8 * 8 * (s[string_ix] - ' ')) / 8); - parameter.append() = polygon; + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(8) + | tsp_instruction_word::texture_v_size::from_int(8); + + const uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); + const uint32_t texture_control_word = texture_control_word::pixel_format::_4bpp_palette + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address((texture_address + 8 * 8 * (s[string_ix] - ' ')) / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { bool end_of_strip = i == strip_length - 1; @@ -125,16 +137,18 @@ uint32_t transform(uint32_t * ta_parameter_buf, const char * s, const uint32_t l y += 240.f; z = 1.f / (z + 10.f); - parameter.append() = - vertex_polygon_type_3(x, y, z, - strip_vertices[i].u, - strip_vertices[i].v, - 0x00000000, // base_color - end_of_strip); + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + strip_vertices[i].u, + strip_vertices[i].v, + 0, // base_color + 0 // offset_color + ); } } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); return parameter.offset; } @@ -236,8 +250,6 @@ void main() , .punch_through = 0 }; - constexpr uint32_t tiles = (640 / 32) * (320 / 32); - holly.SOFTRESET = softreset::pipeline_soft_reset | softreset::ta_soft_reset; holly.SOFTRESET = 0; @@ -251,8 +263,10 @@ void main() const char ana[18] = "A from ana i know"; while (true) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc, - 640, 480); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); uint32_t ta_parameter_size = transform(ta_parameter_buf, ana, 17); ta_polygon_converter_transfer(ta_parameter_buf, ta_parameter_size); ta_wait_opaque_list(); diff --git a/example/font_outline.cpp b/example/font_outline.cpp index ed35b49..d367e84 100644 --- a/example/font_outline.cpp +++ b/example/font_outline.cpp @@ -1,27 +1,27 @@ #include #include "align.hpp" - #include "vga.hpp" -#include "holly.hpp" + +#include "holly/texture_memory_alloc.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" -#include "holly/ta_parameter.hpp" #include "holly/ta_fifo_polygon_converter.hpp" -#include "holly/texture_memory_alloc.hpp" +#include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "memorymap.hpp" #include "holly/background.hpp" #include "holly/region_array.hpp" -#include "holly/ta_bits.hpp" #include "twiddle.hpp" -#include "serial.hpp" #include "palette.hpp" #include "font/font.hpp" #include "dejavusansmono.hpp" -#include "sperrypc.hpp" - struct vertex { float x; float y; @@ -58,27 +58,35 @@ uint32_t transform(ta_parameter_writer& parameter, continue; } - auto polygon = global_polygon_type_0(texture_address); - polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::translucent - | obj_control::col_type::packed_color - | obj_control::texture; + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::translucent + | obj_control::col_type::packed_color + | obj_control::texture; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha - | tsp_instruction_word::dst_alpha_instr::one - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::use_alpha - | tsp_instruction_word::texture_u_size::from_int(texture_width) - | tsp_instruction_word::texture_v_size::from_int(texture_height); + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; - polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette - | texture_control_word::scan_order::twiddled - | texture_control_word::texture_address(texture_address / 8); - parameter.append() = polygon; + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha + | tsp_instruction_word::dst_alpha_instr::one + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::use_alpha + | tsp_instruction_word::texture_u_size::from_int(texture_width) + | tsp_instruction_word::texture_v_size::from_int(texture_height); + + const uint32_t texture_control_word = texture_control_word::pixel_format::_4bpp_palette + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -99,11 +107,14 @@ uint32_t transform(ta_parameter_writer& parameter, u = u / static_cast(texture_width); v = v / static_cast(texture_height); - parameter.append() = - vertex_polygon_type_3(x, y, z, - u, v, - 0x00000000, // base_color - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + u, v, + 0, // base_color + 0 // offset_color + ); } advance += glyph.metrics.horiAdvance; @@ -117,26 +128,34 @@ uint32_t transform2(ta_parameter_writer& parameter, { uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); - auto polygon = global_polygon_type_0(texture_address); - polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::translucent - | obj_control::col_type::packed_color - | obj_control::texture; + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::translucent + | obj_control::col_type::packed_color + | obj_control::texture; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::from_int(texture_width) - | tsp_instruction_word::texture_v_size::from_int(texture_height); + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; - polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette - | texture_control_word::scan_order::twiddled - | texture_control_word::texture_address(texture_address / 8); - parameter.append() = polygon; + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(texture_width) + | tsp_instruction_word::texture_v_size::from_int(texture_height); + + const uint32_t texture_control_word = texture_control_word::pixel_format::_4bpp_palette + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -150,11 +169,14 @@ uint32_t transform2(ta_parameter_writer& parameter, float u = strip_vertices[i].u; float v = strip_vertices[i].v; - parameter.append() = - vertex_polygon_type_3(x, y, z, - u, v, - 0x00000000, // base_color - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + u, v, + 0, // base_color + 0 // offset_color + ); } return parameter.offset; @@ -230,8 +252,6 @@ void main() , .punch_through = 0 }; - constexpr uint32_t tiles = (640 / 32) * (320 / 32); - holly.SOFTRESET = softreset::pipeline_soft_reset | softreset::ta_soft_reset; holly.SOFTRESET = 0; @@ -246,8 +266,10 @@ void main() const char cabal[27] = "where is this secret cabal"; while (true) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc, - 640, 480); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); auto parameter = ta_parameter_writer(ta_parameter_buf); @@ -268,7 +290,7 @@ void main() cabal, 26, font->glyph_height * 1); - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_translucent_list(); diff --git a/example/font_outline_punch_through.cpp b/example/font_outline_punch_through.cpp index 4544b0a..78c9ade 100644 --- a/example/font_outline_punch_through.cpp +++ b/example/font_outline_punch_through.cpp @@ -1,27 +1,27 @@ #include #include "align.hpp" - #include "vga.hpp" -#include "holly.hpp" + +#include "holly/texture_memory_alloc.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" -#include "holly/ta_parameter.hpp" #include "holly/ta_fifo_polygon_converter.hpp" -#include "holly/texture_memory_alloc.hpp" +#include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "memorymap.hpp" #include "holly/background.hpp" #include "holly/region_array.hpp" -#include "holly/ta_bits.hpp" #include "twiddle.hpp" -#include "serial.hpp" #include "palette.hpp" #include "font/font.hpp" #include "dejavusansmono_mono.hpp" -#include "sperrypc.hpp" - struct vertex { float x; float y; @@ -58,27 +58,34 @@ uint32_t transform(ta_parameter_writer& parameter, continue; } - auto polygon = global_polygon_type_0(texture_address); - polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::punch_through - | obj_control::col_type::packed_color - | obj_control::texture; + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::punch_through + | obj_control::col_type::packed_color + | obj_control::texture; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha - | tsp_instruction_word::dst_alpha_instr::one - | tsp_instruction_word::fog_control::no_fog - //| tsp_instruction_word::use_alpha - | tsp_instruction_word::texture_u_size::from_int(texture_width) - | tsp_instruction_word::texture_v_size::from_int(texture_height); + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; - polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette - | texture_control_word::scan_order::twiddled - | texture_control_word::texture_address(texture_address / 8); - parameter.append() = polygon; + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(texture_width) + | tsp_instruction_word::texture_v_size::from_int(texture_height); + + const uint32_t texture_control_word = texture_control_word::pixel_format::_4bpp_palette + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -99,11 +106,14 @@ uint32_t transform(ta_parameter_writer& parameter, u = u / static_cast(texture_width); v = v / static_cast(texture_height); - parameter.append() = - vertex_polygon_type_3(x, y, z, - u, v, - 0x00000000, // base_color - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + u, v, + 0, // base_color + 0 // offset_color + ); } advance += glyph.metrics.horiAdvance; @@ -117,26 +127,34 @@ uint32_t transform2(ta_parameter_writer& parameter, { uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); - auto polygon = global_polygon_type_0(texture_address); - polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::opaque - | obj_control::col_type::packed_color - | obj_control::texture; + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::from_int(texture_width) - | tsp_instruction_word::texture_v_size::from_int(texture_height); + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; - polygon.texture_control_word = texture_control_word::pixel_format::_4bpp_palette - | texture_control_word::scan_order::twiddled - | texture_control_word::texture_address(texture_address / 8); - parameter.append() = polygon; + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::src_alpha + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(texture_width) + | tsp_instruction_word::texture_v_size::from_int(texture_height); + + const uint32_t texture_control_word = texture_control_word::pixel_format::_4bpp_palette + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -150,11 +168,14 @@ uint32_t transform2(ta_parameter_writer& parameter, float u = strip_vertices[i].u; float v = strip_vertices[i].v; - parameter.append() = - vertex_polygon_type_3(x, y, z, - u, v, - 0x00000000, // base_color - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + u, v, + 0, // base_color + 0 // offset_color + ); } return parameter.offset; @@ -234,8 +255,6 @@ void main() , .punch_through = 16 * 4 }; - constexpr uint32_t tiles = (640 / 32) * (320 / 32); - holly.SOFTRESET = softreset::pipeline_soft_reset | softreset::ta_soft_reset; holly.SOFTRESET = 0; @@ -251,15 +270,17 @@ void main() const char cabal[27] = "where is this secret cabal"; while (true) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc, - 640, 480); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); auto parameter = ta_parameter_writer(ta_parameter_buf); transform2(parameter, font->texture_width, font->texture_height); - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); transform(parameter, font->texture_width, font->texture_height, @@ -275,7 +296,7 @@ void main() cabal, 26, font->glyph_height * 1); - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_punch_through_list(); diff --git a/example/icosphere.cpp b/example/icosphere.cpp index 7482bd4..50135d1 100644 --- a/example/icosphere.cpp +++ b/example/icosphere.cpp @@ -1,19 +1,21 @@ #include #include "align.hpp" - #include "vga.hpp" -#include "holly.hpp" + +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/isp_tsp.hpp" #include "holly/ta_bits.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" #include "holly/texture_memory_alloc.hpp" #include "memorymap.hpp" -#include "serial.hpp" #include "geometry/icosphere.hpp" #include "geometry/suzanne.hpp" @@ -21,7 +23,7 @@ constexpr float half_degree = 0.01745329f / 2; -#define MODEL suzanne +#define MODEL icosphere vec3 rotate(const vec3& vertex, const float theta) @@ -61,16 +63,18 @@ void transform(ta_parameter_writer& parameter, | tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::fog_control::no_fog; - parameter.append() = global_polygon_type_0(parameter_control_word, - isp_tsp_instruction_word, - tsp_instruction_word, - 0); + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + 0, // texture_control_word + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); auto& face = MODEL::faces[face_ix]; constexpr uint32_t strip_length = 3; for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - // world transform uint32_t vertex_ix = face[i].vertex; auto& vertex = MODEL::vertices[vertex_ix]; @@ -130,13 +134,15 @@ void transform(ta_parameter_writer& parameter, y += 240.f; z = 1 / z; - parameter.append() = - vertex_polygon_type_1(x, y, z, - color.w, // alpha - color.x, // r - color.y, // g - color.z, // b - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + color.w, // alpha + color.x, // r + color.y, // g + color.z // b + ); } } @@ -156,10 +162,14 @@ void transform2(ta_parameter_writer& parameter, | tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::fog_control::no_fog; - parameter.append() = global_polygon_type_0(parameter_control_word, - isp_tsp_instruction_word, - tsp_instruction_word, - 0); + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + 0, // texture_control_word + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); constexpr vec3 triangle[] = { { 0.f, -1.f, 0.f}, @@ -169,7 +179,6 @@ void transform2(ta_parameter_writer& parameter, constexpr uint32_t strip_length = 3; for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; float x = triangle[i].x; float y = triangle[i].y; float z = triangle[i].z; @@ -196,13 +205,15 @@ void transform2(ta_parameter_writer& parameter, y += 240.f; z = 1 / z; - parameter.append() = - vertex_polygon_type_1(x, y, z, - color.w, // alpha - color.x, // r - color.y, // g - color.z, // b - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + color.w, // alpha + color.x, // r + color.y, // g + color.z // b + ); } } @@ -285,7 +296,7 @@ void main() transform2(parameter, lights[1], {0.f, 1.f, 0.f, 1.f}); transform2(parameter, lights[2], {0.f, 0.f, 1.f, 1.f}); - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_opaque_list(); core_start_render(frame_ix, num_frames); diff --git a/example/macaw.cpp b/example/macaw.cpp index d80de67..aca90d8 100644 --- a/example/macaw.cpp +++ b/example/macaw.cpp @@ -4,12 +4,15 @@ #include "vga.hpp" #include "holly/texture_memory_alloc.hpp" -#include "holly.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" #include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" #include "memorymap.hpp" @@ -38,16 +41,39 @@ static float theta = 0; constexpr float half_degree = 0.01745329f / 2.f; uint32_t transform(uint32_t * ta_parameter_buf, - const vertex * strip_vertices, - const uint32_t strip_length) + const vertex * strip_vertices, + const uint32_t strip_length) { auto parameter = ta_parameter_writer(ta_parameter_buf); - uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); - parameter.append() = global_polygon_type_0(texture_address); + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; + + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; + + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(128) + | tsp_instruction_word::texture_v_size::from_int(128); + + const uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); + const uint32_t texture_control_word = texture_control_word::pixel_format::_565 + | texture_control_word::scan_order::non_twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -62,15 +88,18 @@ uint32_t transform(uint32_t * ta_parameter_buf, y += 240.f; z = 1.f / (z + 10.f); - parameter.append() = - vertex_polygon_type_3(x, y, z, - strip_vertices[i].u, - strip_vertices[i].v, - strip_vertices[i].color, - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + strip_vertices[i].u, + strip_vertices[i].v, + strip_vertices[i].color, + 0 // offset_color + ); } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); return parameter.offset; } @@ -79,14 +108,14 @@ void init_texture_memory(const struct opb_size& opb_size) { auto mem = reinterpret_cast(texture_memory32); - background_parameter(mem->background); + background_parameter(mem->background, 0xff00ff00); region_array2(mem->region_array, - (offsetof (struct texture_memory_alloc, object_list)), - 640 / 32, // width - 480 / 32, // height - opb_size - ); + (offsetof (struct texture_memory_alloc, object_list)), + 640 / 32, // width + 480 / 32, // height + opb_size + ); } void copy_macaw_texture() @@ -116,22 +145,20 @@ void main() uint32_t * ta_parameter_buf = align_32byte(_ta_parameter_buf); constexpr uint32_t ta_alloc = ta_alloc_ctrl::pt_opb::no_list - | ta_alloc_ctrl::tm_opb::no_list - | ta_alloc_ctrl::t_opb::no_list - | ta_alloc_ctrl::om_opb::no_list + | ta_alloc_ctrl::tm_opb::no_list + | ta_alloc_ctrl::t_opb::no_list + | ta_alloc_ctrl::om_opb::no_list | ta_alloc_ctrl::o_opb::_16x4byte; constexpr struct opb_size opb_size = { .opaque = 16 * 4 - , .opaque_modifier = 0 - , .translucent = 0 - , .translucent_modifier = 0 - , .punch_through = 0 - }; - - constexpr uint32_t tiles = (640 / 32) * (320 / 32); + , .opaque_modifier = 0 + , .translucent = 0 + , .translucent_modifier = 0 + , .punch_through = 0 + }; holly.SOFTRESET = softreset::pipeline_soft_reset - | softreset::ta_soft_reset; + | softreset::ta_soft_reset; holly.SOFTRESET = 0; core_init(); @@ -141,7 +168,10 @@ void main() constexpr uint32_t num_frames = 1; while (true) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); uint32_t ta_parameter_size = transform(ta_parameter_buf, strip_vertices, strip_length); ta_polygon_converter_transfer(ta_parameter_buf, ta_parameter_size); ta_wait_opaque_list(); diff --git a/example/macaw_cube.cpp b/example/macaw_cube.cpp index 06954b8..5e4a2c3 100644 --- a/example/macaw_cube.cpp +++ b/example/macaw_cube.cpp @@ -1,21 +1,22 @@ #include #include "align.hpp" - #include "vga.hpp" -#include "holly.hpp" + +#include "holly/texture_memory_alloc.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" #include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" -#include "holly/texture_memory_alloc.hpp" #include "memorymap.hpp" -#include "serial.hpp" - #include "macaw.hpp" struct vertex { @@ -63,12 +64,35 @@ void transform(ta_parameter_writer& parameter, const vertex * strip_vertices, const uint32_t strip_length) { - uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); - parameter.append() = global_polygon_type_0(); + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; + + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; + + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(128) + | tsp_instruction_word::texture_v_size::from_int(128); + + const uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); + const uint32_t texture_control_word = texture_control_word::pixel_format::_565 + | texture_control_word::scan_order::non_twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -98,12 +122,15 @@ void transform(ta_parameter_writer& parameter, z = 1 / z; - parameter.append() = - vertex_polygon_type_0(x, y, z, - //strip_vertices[i].u, - //strip_vertices[i].v, - color, - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + strip_vertices[i].u, + strip_vertices[i].v, + 0, // base_color + 0 // offset_color + ); } } @@ -160,8 +187,6 @@ void main() , .punch_through = 0 }; - constexpr uint32_t tiles = (640 / 32) * (320 / 32); - holly.SOFTRESET = softreset::pipeline_soft_reset | softreset::ta_soft_reset; holly.SOFTRESET = 0; @@ -173,12 +198,16 @@ void main() constexpr uint32_t num_frames = 1; while (1) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc, 640, 480); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); + auto parameter = ta_parameter_writer(ta_parameter_buf); for (uint32_t i = 0; i < num_faces; i++) { transform(parameter, cube_faces[i], 4); } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_opaque_list(); core_start_render(frame_ix, num_frames); diff --git a/example/macaw_cube_render_to_texture.cpp b/example/macaw_cube_render_to_texture.cpp index 785f0ea..1a04a38 100644 --- a/example/macaw_cube_render_to_texture.cpp +++ b/example/macaw_cube_render_to_texture.cpp @@ -1,21 +1,22 @@ #include #include "align.hpp" - #include "vga.hpp" -#include "holly.hpp" + +#include "holly/texture_memory_alloc.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" #include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" -#include "holly/texture_memory_alloc.hpp" #include "memorymap.hpp" -#include "serial.hpp" - #include "macaw.hpp" struct vertex { @@ -67,51 +68,71 @@ void transform(ta_parameter_writer& parameter, const uint32_t texture_address, const uint32_t texture_width) { - auto polygon = global_polygon_type_0(texture_address); + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; + + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; + + const uint32_t texture_control_word = texture_control_word::pixel_format::_565 + | texture_control_word::scan_order::non_twiddled + | texture_control_word::texture_address(texture_address / 8); + + uint32_t tsp_instruction_word = 0; switch (texture_width) { case 32: - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::_32 - | tsp_instruction_word::texture_v_size::_32 - | tsp_instruction_word::use_alpha; + tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(32) + | tsp_instruction_word::texture_v_size::from_int(32) + | tsp_instruction_word::use_alpha; break; case 64: - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::_64 - | tsp_instruction_word::texture_v_size::_64 - | tsp_instruction_word::use_alpha; + tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(64) + | tsp_instruction_word::texture_v_size::from_int(64) + | tsp_instruction_word::use_alpha; break; case 128: - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::_128 - | tsp_instruction_word::texture_v_size::_128 - | tsp_instruction_word::use_alpha; + tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(128) + | tsp_instruction_word::texture_v_size::from_int(128) + | tsp_instruction_word::use_alpha; break; case 256: - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::_256 - | tsp_instruction_word::texture_v_size::_256 - | tsp_instruction_word::use_alpha; + tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(256) + | tsp_instruction_word::texture_v_size::from_int(256) + | tsp_instruction_word::use_alpha; break; case 512: - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::zero - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::texture_u_size::_512 - | tsp_instruction_word::texture_v_size::_512 - | tsp_instruction_word::use_alpha; + tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(512) + | tsp_instruction_word::texture_v_size::from_int(512) + | tsp_instruction_word::use_alpha; break; default: break; } - parameter.append() = polygon; + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { bool end_of_strip = i == strip_length - 1; @@ -144,12 +165,14 @@ void transform(ta_parameter_writer& parameter, z = 1 / z; - parameter.append() = - vertex_polygon_type_3(x, y, z, - strip_vertices[i].u, - strip_vertices[i].v, - color, - end_of_strip); + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + strip_vertices[i].u, + strip_vertices[i].v, + 0, // base_color + 0 // offset_color + ); } } @@ -186,9 +209,10 @@ void render(const uint32_t width, const uint32_t height, const uint32_t texture_width, uint32_t * ta_parameter_buf) { - const uint32_t tiles = (width / 32) * (height / 32); - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc, - width, height); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + width / 32, + height / 32); auto parameter = ta_parameter_writer(ta_parameter_buf); for (uint32_t i = 0; i < num_faces; i++) { @@ -197,7 +221,7 @@ void render(const uint32_t width, const uint32_t height, texture_address, texture_width); } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_opaque_list(); } diff --git a/example/macaw_twiddle.cpp b/example/macaw_twiddle.cpp index 88aff2c..29c4235 100644 --- a/example/macaw_twiddle.cpp +++ b/example/macaw_twiddle.cpp @@ -4,12 +4,15 @@ #include "vga.hpp" #include "holly/texture_memory_alloc.hpp" -#include "holly.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" #include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" #include "memorymap.hpp" @@ -43,16 +46,35 @@ uint32_t transform(uint32_t * ta_parameter_buf, const uint32_t strip_length) { auto parameter = ta_parameter_writer(ta_parameter_buf); - uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); - auto polygon = global_polygon_type_0(texture_address); - polygon.texture_control_word = texture_control_word::pixel_format::_565 - | texture_control_word::scan_order::twiddled - | texture_control_word::texture_address(texture_address / 8); - parameter.append() = polygon; + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; + + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; + + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(128) + | tsp_instruction_word::texture_v_size::from_int(128); + + const uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); + const uint32_t texture_control_word = texture_control_word::pixel_format::_565 + | texture_control_word::scan_order::twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -67,15 +89,18 @@ uint32_t transform(uint32_t * ta_parameter_buf, y += 240.f; z = 1.f / (z + 10.f); - parameter.append() = - vertex_polygon_type_3(x, y, z, - strip_vertices[i].u, - strip_vertices[i].v, - strip_vertices[i].color, - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + strip_vertices[i].u, + strip_vertices[i].v, + strip_vertices[i].color, + 0 // offset_color + ); } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); return parameter.offset; } @@ -84,7 +109,7 @@ void init_texture_memory(const struct opb_size& opb_size) { auto mem = reinterpret_cast(texture_memory32); - background_parameter(mem->background); + background_parameter(mem->background, 0xff00ff00); region_array2(mem->region_array, (offsetof (struct texture_memory_alloc, object_list)), @@ -132,8 +157,6 @@ void main() , .punch_through = 0 }; - constexpr uint32_t tiles = (640 / 32) * (320 / 32); - holly.SOFTRESET = softreset::pipeline_soft_reset | softreset::ta_soft_reset; holly.SOFTRESET = 0; @@ -145,7 +168,10 @@ void main() constexpr uint32_t num_frames = 1; while (true) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); uint32_t ta_parameter_size = transform(ta_parameter_buf, strip_vertices, strip_length); ta_polygon_converter_transfer(ta_parameter_buf, ta_parameter_size); ta_wait_opaque_list(); diff --git a/example/maple_analog.cpp b/example/maple_analog.cpp index 7f78a31..1db8500 100644 --- a/example/maple_analog.cpp +++ b/example/maple_analog.cpp @@ -4,17 +4,20 @@ #include "align.hpp" #include "vga.hpp" -#include "holly.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/ta_global_parameter.hpp" #include "holly/ta_bits.hpp" +#include "holly/isp_tsp.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" #include "holly/texture_memory_alloc.hpp" #include "memorymap.hpp" -#include "serial.hpp" +#include "sh7091/serial.hpp" #include "geometry/border.hpp" #include "geometry/circle.hpp" @@ -57,15 +60,6 @@ void do_get_condition(uint32_t * command_buf, return; } - /* - bool a = ft0::data_transfer::digital_button::a(data_fields.data.digital_button); - if (a == 0) { - serial::string("port "); - serial::integer(port); - serial::string(" `a` press "); - serial::integer(a); - } - */ data[port].analog_axis_3 = data_fields.data.analog_axis_3; data[port].analog_axis_4 = data_fields.data.analog_axis_4; } @@ -73,7 +67,7 @@ void do_get_condition(uint32_t * command_buf, void transform(ta_parameter_writer& parameter, const vec3 * vertices, - const face& face, + const face_vn& face, const vec4& color, const vec3& position, const float scale @@ -91,14 +85,17 @@ void transform(ta_parameter_writer& parameter, | tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::fog_control::no_fog; - parameter.append() = global_polygon_type_0(parameter_control_word, - isp_tsp_instruction_word, - tsp_instruction_word, - 0); + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + 0, // texture_control_word + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); constexpr uint32_t strip_length = 3; for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; // world transform uint32_t vertex_ix = face[i].vertex; @@ -131,13 +128,16 @@ void transform(ta_parameter_writer& parameter, y += 240.f; z = 1 / z; - parameter.append() = - vertex_polygon_type_1(x, y, z, - color.w, // alpha - color.x, // r - color.y, // g - color.z, // b - end_of_strip); + bool end_of_strip = i == strip_length - 1; + + parameter.append() = + ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + color.w, // alpha + color.x, // r + color.y, // g + color.z // b + ); } } @@ -223,7 +223,7 @@ void main() ); } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_opaque_list(); core_start_render(frame_ix, num_frames); diff --git a/example/maple_controller.cpp b/example/maple_controller.cpp index 4688bfe..0e2652d 100644 --- a/example/maple_controller.cpp +++ b/example/maple_controller.cpp @@ -4,10 +4,11 @@ #include "align.hpp" #include "maple/maple.hpp" +#include "maple/maple_impl.hpp" #include "maple/maple_bus_bits.hpp" #include "maple/maple_bus_commands.hpp" #include "maple/maple_bus_ft0.hpp" -#include "serial.hpp" +#include "sh7091/serial.hpp" uint32_t _command_buf[1024 / 4 + 32] = {0}; uint32_t _receive_buf[1024 / 4 + 32] = {0}; @@ -47,10 +48,11 @@ void do_get_condition(uint32_t port) std::byteswap(function_type::controller)); maple::dma_start(command_buf); - using response_type = struct maple::command_response>; - auto response = reinterpret_cast(receive_buf); + using response_type = data_transfer; + using command_response_type = struct maple::command_response; + auto response = reinterpret_cast(receive_buf); auto& bus_data = response->bus_data; - if (bus_data.command_code != data_transfer::command_code) { + if (bus_data.command_code != response_type::command_code) { return; } auto& data_fields = bus_data.data_fields; @@ -69,20 +71,17 @@ void do_get_condition(uint32_t port) void do_device_request() { - using response_type = struct maple::command_response; - constexpr uint32_t response_size = align_32byte(sizeof (response_type)); + using command_type = device_request; + using response_type = device_status; - maple::init_host_command_all_ports(command_buf, receive_buf, - device_request::command_code, - (sizeof (device_request::data_fields)), // command_data_size - (sizeof (device_status::data_fields))); // response_data_size + maple::init_host_command_all_ports(command_buf, receive_buf); maple::dma_start(command_buf); + using command_response_type = struct maple::command_response; + auto response = reinterpret_cast(receive_buf); for (uint8_t port = 0; port < 4; port++) { - auto response = reinterpret_cast(&receive_buf[response_size * port / 4]); - - auto& bus_data = response->bus_data; - auto& data_fields = response->bus_data.data_fields; + auto& bus_data = response[port].bus_data; + auto& data_fields = response[port].bus_data.data_fields; if (bus_data.command_code != device_status::command_code) { // the controller is disconnected } else { diff --git a/example/translucency.cpp b/example/translucency.cpp index 02a1961..914e0e3 100644 --- a/example/translucency.cpp +++ b/example/translucency.cpp @@ -3,15 +3,18 @@ #include "align.hpp" #include "vga.hpp" -#include "holly/texture_memory_alloc.hpp" -#include "holly.hpp" +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/isp_tsp.hpp" #include "holly/ta_bits.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" +#include "holly/texture_memory_alloc.hpp" #include "memorymap.hpp" #include "macaw.hpp" @@ -43,29 +46,60 @@ uint32_t transform(uint32_t * ta_parameter_buf, bool translucent) { auto parameter = ta_parameter_writer(ta_parameter_buf); - uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); if (translucent) { // translucent untextured - auto polygon = global_polygon_type_0(); - polygon.parameter_control_word = para_control::para_type::polygon_or_modifier_volume - | para_control::list_type::translucent - | obj_control::col_type::packed_color - | obj_control::gouraud; + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::translucent + | obj_control::col_type::packed_color + | obj_control::gouraud; - polygon.tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one - | tsp_instruction_word::dst_alpha_instr::src_alpha - | tsp_instruction_word::fog_control::no_fog - | tsp_instruction_word::use_alpha; + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; - parameter.append() = polygon; + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::src_alpha + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::use_alpha; + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + 0, // texture_control_word + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); } else { - // opaque textured - parameter.append() = global_polygon_type_0(texture_address); + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque + | obj_control::col_type::packed_color + | obj_control::texture; + + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::depth_compare_mode::greater + | isp_tsp_instruction_word::culling_mode::no_culling; + + const uint32_t tsp_instruction_word = tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + | tsp_instruction_word::fog_control::no_fog + | tsp_instruction_word::texture_u_size::from_int(128) + | tsp_instruction_word::texture_v_size::from_int(128); + + const uint32_t texture_address = (offsetof (struct texture_memory_alloc, texture)); + const uint32_t texture_control_word = texture_control_word::pixel_format::_565 + | texture_control_word::scan_order::non_twiddled + | texture_control_word::texture_address(texture_address / 8); + + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); } for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - float x = strip_vertices[i].x; float y = strip_vertices[i].y; float z = strip_vertices[i].z; @@ -80,15 +114,18 @@ uint32_t transform(uint32_t * ta_parameter_buf, y += 240.f; z = 1.f / (z + 10.f); - parameter.append() = - vertex_polygon_type_3(x, y, z, - strip_vertices[i].u, - strip_vertices[i].v, - strip_vertices[i].color, - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_3(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + strip_vertices[i].u, + strip_vertices[i].v, + strip_vertices[i].color, + 0 // offset_color + ); } - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); return parameter.offset; } @@ -97,7 +134,7 @@ void init_texture_memory(const struct opb_size& opb_size) { auto mem = reinterpret_cast(texture_memory32); - background_parameter(mem->background); + background_parameter(mem->background, 0xffffff00); region_array2(mem->region_array, (offsetof (struct texture_memory_alloc, object_list)), @@ -142,8 +179,6 @@ void main() , .punch_through = 0 }; - constexpr uint32_t tiles = (640 / 32) * (320 / 32); - holly.SOFTRESET = softreset::pipeline_soft_reset | softreset::ta_soft_reset; holly.SOFTRESET = 0; @@ -155,7 +190,10 @@ void main() constexpr uint32_t num_frames = 1; while (true) { - ta_polygon_converter_init(opb_size.total() * tiles, ta_alloc); + ta_polygon_converter_init(opb_size.total(), + ta_alloc, + 640 / 32, + 480 / 32); uint32_t ta_parameter_size = 0; ta_parameter_size += transform(&ta_parameter_buf[ta_parameter_size / 4], strip_vertices, strip_length, 0); ta_parameter_size += transform(&ta_parameter_buf[ta_parameter_size / 4], strip_vertices, strip_length, 1); diff --git a/example/wiffle_attenuation.cpp b/example/wiffle_attenuation.cpp index d87b24e..fd71083 100644 --- a/example/wiffle_attenuation.cpp +++ b/example/wiffle_attenuation.cpp @@ -1,19 +1,21 @@ #include #include "align.hpp" - #include "vga.hpp" -#include "holly.hpp" + +#include "holly/holly.hpp" #include "holly/core.hpp" #include "holly/core_bits.hpp" #include "holly/ta_fifo_polygon_converter.hpp" #include "holly/ta_parameter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/isp_tsp.hpp" #include "holly/ta_bits.hpp" #include "holly/region_array.hpp" #include "holly/background.hpp" #include "holly/texture_memory_alloc.hpp" #include "memorymap.hpp" -#include "serial.hpp" #include "geometry/wiffle.hpp" #include "math/vec4.hpp" @@ -59,16 +61,19 @@ void transform(ta_parameter_writer& parameter, | tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::fog_control::no_fog; - parameter.append() = global_polygon_type_0(parameter_control_word, - isp_tsp_instruction_word, - tsp_instruction_word, - 0); + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + 0, // texture_control_word + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); + auto& face = MODEL::faces[face_ix]; constexpr uint32_t strip_length = 3; for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; - // world transform uint32_t vertex_ix = face[i].vertex; auto& vertex = MODEL::vertices[vertex_ix]; @@ -140,13 +145,15 @@ void transform(ta_parameter_writer& parameter, y += 240.f; z = 1 / z; - parameter.append() = - vertex_polygon_type_1(x, y, z, - color.w, // alpha - color.x, // r - color.y, // g - color.z, // b - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + color.w, // alpha + color.x, // r + color.y, // g + color.z // b + ); } } @@ -166,10 +173,14 @@ void transform2(ta_parameter_writer& parameter, | tsp_instruction_word::dst_alpha_instr::zero | tsp_instruction_word::fog_control::no_fog; - parameter.append() = global_polygon_type_0(parameter_control_word, - isp_tsp_instruction_word, - tsp_instruction_word, - 0); + parameter.append() = + ta_global_parameter::polygon_type_0(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + 0, // texture_control_word + 0, // data_size_for_sort_dma + 0 // next_address_for_sort_dma + ); constexpr vec3 triangle[] = { { 0.f, -1.f, 0.f}, @@ -179,7 +190,6 @@ void transform2(ta_parameter_writer& parameter, constexpr uint32_t strip_length = 3; for (uint32_t i = 0; i < strip_length; i++) { - bool end_of_strip = i == strip_length - 1; float x = triangle[i].x; float y = triangle[i].y; float z = triangle[i].z; @@ -206,13 +216,15 @@ void transform2(ta_parameter_writer& parameter, y += 240.f; z = 1 / z; - parameter.append() = - vertex_polygon_type_1(x, y, z, - color.w, // alpha - color.x, // r - color.y, // g - color.z, // b - end_of_strip); + bool end_of_strip = i == strip_length - 1; + parameter.append() = + ta_vertex_parameter::polygon_type_1(polygon_vertex_parameter_control_word(end_of_strip), + x, y, z, + color.w, // alpha + color.x, // r + color.y, // g + color.z // b + ); } } @@ -295,7 +307,7 @@ void main() transform2(parameter, lights[1], {0.f, 1.f, 0.f, 1.f}); transform2(parameter, lights[2], {0.f, 0.f, 1.f, 1.f}); - parameter.append() = global_end_of_list(); + parameter.append() = ta_global_parameter::end_of_list(para_control::para_type::end_of_list); ta_polygon_converter_transfer(ta_parameter_buf, parameter.offset); ta_wait_opaque_list(); core_start_render(frame_ix, num_frames); diff --git a/geometry/border.hpp b/geometry/border.hpp index 5b4ce2c..62d8230 100644 --- a/geometry/border.hpp +++ b/geometry/border.hpp @@ -17,12 +17,12 @@ namespace border { { -0.950000f, 0.000000f, 0.950000f }, { -0.950000f, 0.000000f, -0.950000f }, }; - + constexpr vec3 normals[] = { { -0.000000f, 1.000000f, -0.000000f }, }; - - constexpr face faces[] = { + + constexpr face_vn faces[] = { {{ 5, 0}, {11, 0}, { 7, 0}}, {{ 4, 0}, {10, 0}, { 9, 0}}, {{ 5, 0}, { 8, 0}, {11, 0}}, @@ -36,7 +36,7 @@ namespace border { {{11, 0}, { 8, 0}, { 2, 0}}, {{ 1, 0}, { 3, 0}, { 6, 0}}, }; - - constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face)); - + + constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face_vn)); + } diff --git a/geometry/circle.hpp b/geometry/circle.hpp index dbe2dea..6c2d50b 100644 --- a/geometry/circle.hpp +++ b/geometry/circle.hpp @@ -37,12 +37,12 @@ namespace circle { { 0.382683f, 0.000000f, -0.923880f }, { 0.195090f, 0.000000f, -0.980785f }, }; - + constexpr vec3 normals[] = { { -0.000000f, 1.000000f, -0.000000f }, }; - - constexpr face faces[] = { + + constexpr face_vn faces[] = { {{31, 0}, { 0, 0}, { 1, 0}}, {{30, 0}, {31, 0}, { 1, 0}}, {{20, 0}, {13, 0}, {18, 0}}, @@ -74,7 +74,7 @@ namespace circle { {{17, 0}, {14, 0}, {15, 0}}, {{16, 0}, {17, 0}, {15, 0}}, }; - - constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face)); - + + constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face_vn)); + } diff --git a/geometry/cube.hpp b/geometry/cube.hpp index 3a3b11d..92b7444 100644 --- a/geometry/cube.hpp +++ b/geometry/cube.hpp @@ -13,14 +13,14 @@ namespace cube { { 1.000000f, -1.000000f, -1.000000f }, { 1.000000f, 1.000000f, -1.000000f }, }; - + constexpr vec2 texture[] = { { 1.000000f, 1.000000f }, { 1.000000f, 0.000000f }, { 0.000000f, 1.000000f }, { 0.000000f, 0.000000f }, }; - + constexpr vec3 normals[] = { { -1.000000f, -0.000000f, -0.000000f }, { -0.000000f, -0.000000f, -1.000000f }, @@ -29,8 +29,8 @@ namespace cube { { -0.000000f, -1.000000f, -0.000000f }, { -0.000000f, 1.000000f, -0.000000f }, }; - - constexpr face faces[] = { + + constexpr face_vtn faces[] = { {{1, 0, 0}, {2, 0, 0}, {0, 1, 0}}, {{3, 1, 1}, {6, 2, 1}, {2, 3, 1}}, {{7, 0, 2}, {4, 3, 2}, {6, 1, 2}}, @@ -44,7 +44,7 @@ namespace cube { {{6, 2, 4}, {4, 3, 4}, {0, 1, 4}}, {{3, 1, 5}, {1, 0, 5}, {5, 2, 5}}, }; - - constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face)); - + + constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face_vtn)); + } diff --git a/geometry/icosphere.hpp b/geometry/icosphere.hpp index 4f53e03..af960bb 100644 --- a/geometry/icosphere.hpp +++ b/geometry/icosphere.hpp @@ -47,7 +47,7 @@ namespace icosphere { { -0.425323f, 0.850654f, -0.309011f }, { 0.162456f, 0.850654f, -0.499995f }, }; - + constexpr vec3 normals[] = { { 0.102400f, -0.943500f, 0.315100f }, { 0.700200f, -0.661700f, 0.268000f }, @@ -130,8 +130,8 @@ namespace icosphere { { 0.187600f, -0.794700f, 0.577300f }, { 0.471300f, -0.661700f, 0.583100f }, }; - - constexpr face faces[] = { + + constexpr face_vn faces[] = { {{ 0, 0}, {13, 0}, {12, 0}}, {{ 1, 1}, {13, 1}, {15, 1}}, {{ 0, 2}, {12, 2}, {17, 2}}, @@ -213,7 +213,7 @@ namespace icosphere { {{12, 78}, {13, 78}, {14, 78}}, {{13, 79}, { 1, 79}, {14, 79}}, }; - - constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face)); - + + constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face_vn)); + } diff --git a/geometry/suzanne.hpp b/geometry/suzanne.hpp index f70882b..394441a 100644 --- a/geometry/suzanne.hpp +++ b/geometry/suzanne.hpp @@ -512,7 +512,7 @@ namespace suzanne { { 0.859375f, -0.382813f, 0.382812f }, { -0.859375f, -0.382812f, 0.382813f }, }; - + constexpr vec3 normals[] = { { 0.661700f, 0.202600f, -0.721900f }, { -0.661700f, 0.202600f, -0.721900f }, @@ -1456,108 +1456,108 @@ namespace suzanne { { -0.360400f, 0.828300f, 0.429000f }, { 0.360400f, 0.828300f, 0.429000f }, }; - - constexpr face faces[] = { - {{46, 0}, { 2, 0}, {44, 0}}, - {{ 3, 1}, {47, 1}, {45, 1}}, - {{44, 2}, { 4, 2}, {42, 2}}, - {{ 5, 3}, {45, 3}, {43, 3}}, - {{ 2, 4}, { 6, 4}, { 4, 4}}, - {{ 7, 5}, { 3, 5}, { 5, 5}}, - {{ 0, 6}, { 8, 6}, { 2, 6}}, - {{ 9, 7}, { 1, 7}, { 3, 7}}, - {{10, 8}, {14, 8}, { 8, 8}}, - {{15, 9}, {11, 9}, { 9, 9}}, - {{ 8, 10}, {16, 10}, { 6, 10}}, - {{17, 11}, { 9, 11}, { 7, 11}}, - {{20, 12}, {16, 12}, {14, 12}}, - {{21, 13}, {17, 13}, {19, 13}}, - {{22, 14}, {14, 14}, {12, 14}}, - {{23, 15}, {15, 15}, {21, 15}}, - {{22, 16}, {26, 16}, {20, 16}}, - {{27, 17}, {23, 17}, {21, 17}}, - {{26, 18}, {18, 18}, {20, 18}}, - {{27, 19}, {19, 19}, {29, 19}}, - {{32, 20}, {28, 20}, {26, 20}}, - {{33, 21}, {29, 21}, {31, 21}}, - {{34, 22}, {26, 22}, {24, 22}}, - {{35, 23}, {27, 23}, {33, 23}}, - {{36, 24}, {32, 24}, {34, 24}}, - {{37, 25}, {33, 25}, {39, 25}}, - {{38, 26}, {30, 26}, {32, 26}}, - {{39, 27}, {31, 27}, {41, 27}}, - {{44, 28}, {40, 28}, {38, 28}}, - {{45, 29}, {41, 29}, {43, 29}}, - {{46, 30}, {38, 30}, {36, 30}}, - {{47, 31}, {39, 31}, {45, 31}}, - {{36, 32}, {48, 32}, {46, 32}}, - {{37, 33}, {49, 33}, {51, 33}}, - {{34, 34}, {50, 34}, {36, 34}}, - {{35, 35}, {51, 35}, {53, 35}}, - {{24, 36}, {52, 36}, {34, 36}}, - {{25, 37}, {53, 37}, {55, 37}}, - {{22, 38}, {54, 38}, {24, 38}}, - {{23, 39}, {55, 39}, {57, 39}}, - {{22, 40}, {58, 40}, {56, 40}}, - {{59, 41}, {23, 41}, {57, 41}}, - {{12, 42}, {62, 42}, {58, 42}}, - {{63, 43}, {13, 43}, {59, 43}}, - {{10, 44}, {64, 44}, {62, 44}}, - {{65, 45}, {11, 45}, {63, 45}}, - {{ 0, 46}, {48, 46}, {64, 46}}, - {{49, 47}, { 1, 47}, {65, 47}}, - {{60, 48}, {64, 48}, {48, 48}}, - {{49, 49}, {65, 49}, {61, 49}}, - {{62, 50}, {64, 50}, {60, 50}}, - {{61, 51}, {65, 51}, {63, 51}}, - {{60, 52}, {58, 52}, {62, 52}}, - {{63, 53}, {59, 53}, {61, 53}}, - {{60, 54}, {56, 54}, {58, 54}}, - {{59, 55}, {57, 55}, {61, 55}}, - {{60, 56}, {54, 56}, {56, 56}}, - {{57, 57}, {55, 57}, {61, 57}}, - {{60, 58}, {52, 58}, {54, 58}}, - {{55, 59}, {53, 59}, {61, 59}}, - {{60, 60}, {50, 60}, {52, 60}}, - {{53, 61}, {51, 61}, {61, 61}}, - {{60, 62}, {48, 62}, {50, 62}}, - {{51, 63}, {49, 63}, {61, 63}}, - {{173, 64}, {90, 64}, {88, 64}}, - {{174, 65}, {90, 65}, {175, 65}}, - {{171, 66}, {88, 66}, {86, 66}}, - {{172, 67}, {89, 67}, {174, 67}}, - {{84, 68}, {171, 68}, {86, 68}}, - {{172, 69}, {85, 69}, {87, 69}}, - {{82, 70}, {169, 70}, {84, 70}}, - {{170, 71}, {83, 71}, {85, 71}}, - {{80, 72}, {167, 72}, {82, 72}}, - {{168, 73}, {81, 73}, {83, 73}}, - {{78, 74}, {145, 74}, {163, 74}}, - {{146, 75}, {79, 75}, {164, 75}}, - {{93, 76}, {145, 76}, {91, 76}}, - {{94, 77}, {146, 77}, {148, 77}}, - {{93, 78}, {149, 78}, {147, 78}}, - {{150, 79}, {94, 79}, {148, 79}}, - {{97, 80}, {149, 80}, {95, 80}}, - {{98, 81}, {150, 81}, {152, 81}}, - {{99, 82}, {151, 82}, {97, 82}}, - {{100, 83}, {152, 83}, {154, 83}}, - {{101, 84}, {153, 84}, {99, 84}}, - {{102, 85}, {154, 85}, {156, 85}}, - {{101, 86}, {157, 86}, {155, 86}}, - {{158, 87}, {102, 87}, {156, 87}}, - {{105, 88}, {157, 88}, {103, 88}}, - {{106, 89}, {158, 89}, {160, 89}}, - {{107, 90}, {159, 90}, {105, 90}}, - {{108, 91}, {160, 91}, {162, 91}}, - {{66, 92}, {161, 92}, {107, 92}}, - {{66, 93}, {162, 93}, {67, 93}}, - {{127, 94}, {161, 94}, {109, 94}}, - {{128, 95}, {162, 95}, {160, 95}}, - {{127, 96}, {157, 96}, {159, 96}}, - {{158, 97}, {128, 97}, {160, 97}}, - {{155, 98}, {178, 98}, {125, 98}}, - {{156, 99}, {179, 99}, {158, 99}}, + + constexpr face_vn faces[] = { + {{ 46, 0}, { 2, 0}, { 44, 0}}, + {{ 3, 1}, { 47, 1}, { 45, 1}}, + {{ 44, 2}, { 4, 2}, { 42, 2}}, + {{ 5, 3}, { 45, 3}, { 43, 3}}, + {{ 2, 4}, { 6, 4}, { 4, 4}}, + {{ 7, 5}, { 3, 5}, { 5, 5}}, + {{ 0, 6}, { 8, 6}, { 2, 6}}, + {{ 9, 7}, { 1, 7}, { 3, 7}}, + {{ 10, 8}, { 14, 8}, { 8, 8}}, + {{ 15, 9}, { 11, 9}, { 9, 9}}, + {{ 8, 10}, { 16, 10}, { 6, 10}}, + {{ 17, 11}, { 9, 11}, { 7, 11}}, + {{ 20, 12}, { 16, 12}, { 14, 12}}, + {{ 21, 13}, { 17, 13}, { 19, 13}}, + {{ 22, 14}, { 14, 14}, { 12, 14}}, + {{ 23, 15}, { 15, 15}, { 21, 15}}, + {{ 22, 16}, { 26, 16}, { 20, 16}}, + {{ 27, 17}, { 23, 17}, { 21, 17}}, + {{ 26, 18}, { 18, 18}, { 20, 18}}, + {{ 27, 19}, { 19, 19}, { 29, 19}}, + {{ 32, 20}, { 28, 20}, { 26, 20}}, + {{ 33, 21}, { 29, 21}, { 31, 21}}, + {{ 34, 22}, { 26, 22}, { 24, 22}}, + {{ 35, 23}, { 27, 23}, { 33, 23}}, + {{ 36, 24}, { 32, 24}, { 34, 24}}, + {{ 37, 25}, { 33, 25}, { 39, 25}}, + {{ 38, 26}, { 30, 26}, { 32, 26}}, + {{ 39, 27}, { 31, 27}, { 41, 27}}, + {{ 44, 28}, { 40, 28}, { 38, 28}}, + {{ 45, 29}, { 41, 29}, { 43, 29}}, + {{ 46, 30}, { 38, 30}, { 36, 30}}, + {{ 47, 31}, { 39, 31}, { 45, 31}}, + {{ 36, 32}, { 48, 32}, { 46, 32}}, + {{ 37, 33}, { 49, 33}, { 51, 33}}, + {{ 34, 34}, { 50, 34}, { 36, 34}}, + {{ 35, 35}, { 51, 35}, { 53, 35}}, + {{ 24, 36}, { 52, 36}, { 34, 36}}, + {{ 25, 37}, { 53, 37}, { 55, 37}}, + {{ 22, 38}, { 54, 38}, { 24, 38}}, + {{ 23, 39}, { 55, 39}, { 57, 39}}, + {{ 22, 40}, { 58, 40}, { 56, 40}}, + {{ 59, 41}, { 23, 41}, { 57, 41}}, + {{ 12, 42}, { 62, 42}, { 58, 42}}, + {{ 63, 43}, { 13, 43}, { 59, 43}}, + {{ 10, 44}, { 64, 44}, { 62, 44}}, + {{ 65, 45}, { 11, 45}, { 63, 45}}, + {{ 0, 46}, { 48, 46}, { 64, 46}}, + {{ 49, 47}, { 1, 47}, { 65, 47}}, + {{ 60, 48}, { 64, 48}, { 48, 48}}, + {{ 49, 49}, { 65, 49}, { 61, 49}}, + {{ 62, 50}, { 64, 50}, { 60, 50}}, + {{ 61, 51}, { 65, 51}, { 63, 51}}, + {{ 60, 52}, { 58, 52}, { 62, 52}}, + {{ 63, 53}, { 59, 53}, { 61, 53}}, + {{ 60, 54}, { 56, 54}, { 58, 54}}, + {{ 59, 55}, { 57, 55}, { 61, 55}}, + {{ 60, 56}, { 54, 56}, { 56, 56}}, + {{ 57, 57}, { 55, 57}, { 61, 57}}, + {{ 60, 58}, { 52, 58}, { 54, 58}}, + {{ 55, 59}, { 53, 59}, { 61, 59}}, + {{ 60, 60}, { 50, 60}, { 52, 60}}, + {{ 53, 61}, { 51, 61}, { 61, 61}}, + {{ 60, 62}, { 48, 62}, { 50, 62}}, + {{ 51, 63}, { 49, 63}, { 61, 63}}, + {{173, 64}, { 90, 64}, { 88, 64}}, + {{174, 65}, { 90, 65}, {175, 65}}, + {{171, 66}, { 88, 66}, { 86, 66}}, + {{172, 67}, { 89, 67}, {174, 67}}, + {{ 84, 68}, {171, 68}, { 86, 68}}, + {{172, 69}, { 85, 69}, { 87, 69}}, + {{ 82, 70}, {169, 70}, { 84, 70}}, + {{170, 71}, { 83, 71}, { 85, 71}}, + {{ 80, 72}, {167, 72}, { 82, 72}}, + {{168, 73}, { 81, 73}, { 83, 73}}, + {{ 78, 74}, {145, 74}, {163, 74}}, + {{146, 75}, { 79, 75}, {164, 75}}, + {{ 93, 76}, {145, 76}, { 91, 76}}, + {{ 94, 77}, {146, 77}, {148, 77}}, + {{ 93, 78}, {149, 78}, {147, 78}}, + {{150, 79}, { 94, 79}, {148, 79}}, + {{ 97, 80}, {149, 80}, { 95, 80}}, + {{ 98, 81}, {150, 81}, {152, 81}}, + {{ 99, 82}, {151, 82}, { 97, 82}}, + {{100, 83}, {152, 83}, {154, 83}}, + {{101, 84}, {153, 84}, { 99, 84}}, + {{102, 85}, {154, 85}, {156, 85}}, + {{101, 86}, {157, 86}, {155, 86}}, + {{158, 87}, {102, 87}, {156, 87}}, + {{105, 88}, {157, 88}, {103, 88}}, + {{106, 89}, {158, 89}, {160, 89}}, + {{107, 90}, {159, 90}, {105, 90}}, + {{108, 91}, {160, 91}, {162, 91}}, + {{ 66, 92}, {161, 92}, {107, 92}}, + {{ 66, 93}, {162, 93}, { 67, 93}}, + {{127, 94}, {161, 94}, {109, 94}}, + {{128, 95}, {162, 95}, {160, 95}}, + {{127, 96}, {157, 96}, {159, 96}}, + {{158, 97}, {128, 97}, {160, 97}}, + {{155, 98}, {178, 98}, {125, 98}}, + {{156, 99}, {179, 99}, {158, 99}}, {{153, 100}, {125, 100}, {123, 100}}, {{154, 101}, {126, 101}, {156, 101}}, {{151, 102}, {123, 102}, {121, 102}}, @@ -1573,7 +1573,7 @@ namespace suzanne { {{113, 111}, {176, 111}, {163, 111}}, {{176, 112}, {114, 112}, {164, 112}}, {{161, 113}, {111, 113}, {109, 113}}, - {{162, 114}, {112, 114}, {67, 114}}, + {{162, 114}, {112, 114}, { 67, 114}}, {{111, 115}, {177, 115}, {182, 115}}, {{177, 116}, {112, 116}, {183, 116}}, {{180, 117}, {177, 117}, {176, 117}}, @@ -1590,24 +1590,24 @@ namespace suzanne { {{168, 128}, {131, 128}, {185, 128}}, {{189, 129}, {186, 129}, {143, 129}}, {{189, 130}, {187, 130}, {188, 130}}, - {{186, 131}, {68, 131}, {184, 131}}, - {{187, 132}, {68, 132}, {188, 132}}, - {{130, 133}, {68, 133}, {129, 133}}, - {{131, 133}, {68, 133}, {185, 133}}, + {{186, 131}, { 68, 131}, {184, 131}}, + {{187, 132}, { 68, 132}, {188, 132}}, + {{130, 133}, { 68, 133}, {129, 133}}, + {{131, 133}, { 68, 133}, {185, 133}}, {{141, 134}, {190, 134}, {143, 134}}, {{191, 135}, {142, 135}, {144, 135}}, {{194, 136}, {141, 136}, {139, 136}}, {{195, 137}, {142, 137}, {193, 137}}, {{196, 138}, {139, 138}, {138, 138}}, {{197, 139}, {140, 139}, {195, 139}}, - {{70, 140}, {138, 140}, {137, 140}}, - {{70, 141}, {138, 141}, {197, 141}}, - {{143, 142}, {69, 142}, {189, 142}}, - {{144, 143}, {69, 143}, {191, 143}}, - {{190, 144}, {207, 144}, {69, 144}}, + {{ 70, 140}, {138, 140}, {137, 140}}, + {{ 70, 141}, {138, 141}, {197, 141}}, + {{143, 142}, { 69, 142}, {189, 142}}, + {{144, 143}, { 69, 143}, {191, 143}}, + {{190, 144}, {207, 144}, { 69, 144}}, {{191, 145}, {207, 145}, {206, 145}}, - {{70, 146}, {199, 146}, {196, 146}}, - {{200, 147}, {70, 147}, {197, 147}}, + {{ 70, 146}, {199, 146}, {196, 146}}, + {{200, 147}, { 70, 147}, {197, 147}}, {{196, 148}, {201, 148}, {194, 148}}, {{202, 149}, {197, 149}, {195, 149}}, {{201, 150}, {192, 150}, {194, 150}}, @@ -1626,14 +1626,14 @@ namespace suzanne { {{144, 163}, {211, 163}, {213, 163}}, {{186, 164}, {212, 164}, {143, 164}}, {{187, 165}, {213, 165}, {166, 165}}, - {{208, 166}, {165, 166}, {80, 166}}, + {{208, 166}, {165, 166}, { 80, 166}}, {{209, 167}, {166, 167}, {213, 167}}, {{214, 168}, {212, 168}, {208, 168}}, {{215, 169}, {213, 169}, {211, 169}}, - {{78, 170}, {210, 170}, {214, 170}}, - {{211, 171}, {79, 171}, {215, 171}}, + {{ 78, 170}, {210, 170}, {214, 170}}, + {{211, 171}, { 79, 171}, {215, 171}}, {{129, 172}, {221, 172}, {130, 172}}, - {{129, 173}, {222, 173}, {71, 173}}, + {{129, 173}, {222, 173}, { 71, 173}}, {{132, 174}, {221, 174}, {219, 174}}, {{222, 175}, {133, 175}, {220, 175}}, {{134, 176}, {219, 176}, {217, 176}}, @@ -1646,8 +1646,8 @@ namespace suzanne { {{227, 181}, {218, 181}, {229, 181}}, {{219, 140}, {224, 140}, {226, 140}}, {{225, 182}, {220, 182}, {227, 182}}, - {{71, 183}, {224, 183}, {221, 183}}, - {{71, 184}, {225, 184}, {223, 184}}, + {{ 71, 183}, {224, 183}, {221, 183}}, + {{ 71, 184}, {225, 184}, {223, 184}}, {{223, 185}, {228, 185}, {224, 185}}, {{229, 186}, {223, 186}, {225, 186}}, {{224, 187}, {228, 187}, {226, 187}}, @@ -1704,74 +1704,74 @@ namespace suzanne { {{282, 238}, {254, 238}, {260, 238}}, {{231, 239}, {279, 239}, {281, 239}}, {{280, 240}, {232, 240}, {282, 240}}, - {{66, 241}, {283, 241}, {72, 241}}, - {{284, 242}, {66, 242}, {72, 242}}, + {{ 66, 241}, {283, 241}, { 72, 241}}, + {{284, 242}, { 66, 242}, { 72, 242}}, {{107, 243}, {285, 243}, {283, 243}}, {{286, 244}, {108, 244}, {284, 244}}, {{103, 245}, {285, 245}, {105, 245}}, {{104, 246}, {286, 246}, {288, 246}}, {{101, 247}, {287, 247}, {103, 247}}, {{102, 248}, {288, 248}, {290, 248}}, - {{99, 249}, {289, 249}, {101, 249}}, + {{ 99, 249}, {289, 249}, {101, 249}}, {{100, 250}, {290, 250}, {292, 250}}, - {{99, 251}, {293, 251}, {291, 251}}, + {{ 99, 251}, {293, 251}, {291, 251}}, {{294, 252}, {100, 252}, {292, 252}}, - {{95, 253}, {293, 253}, {97, 253}}, - {{96, 254}, {294, 254}, {296, 254}}, - {{95, 255}, {297, 255}, {295, 255}}, - {{298, 256}, {96, 256}, {296, 256}}, - {{93, 257}, {299, 257}, {297, 257}}, - {{300, 258}, {94, 258}, {298, 258}}, + {{ 95, 253}, {293, 253}, { 97, 253}}, + {{ 96, 254}, {294, 254}, {296, 254}}, + {{ 95, 255}, {297, 255}, {295, 255}}, + {{298, 256}, { 96, 256}, {296, 256}}, + {{ 93, 257}, {299, 257}, {297, 257}}, + {{300, 258}, { 94, 258}, {298, 258}}, {{308, 259}, {337, 259}, {307, 259}}, {{308, 260}, {338, 260}, {328, 260}}, {{307, 261}, {335, 261}, {306, 261}}, {{307, 262}, {336, 262}, {338, 262}}, {{306, 263}, {339, 263}, {305, 263}}, {{306, 264}, {340, 264}, {336, 264}}, - {{88, 265}, {305, 265}, {339, 265}}, - {{305, 266}, {89, 266}, {340, 266}}, - {{86, 267}, {339, 267}, {333, 267}}, - {{340, 268}, {87, 268}, {334, 268}}, - {{84, 269}, {333, 269}, {329, 269}}, - {{334, 270}, {85, 270}, {330, 270}}, - {{82, 271}, {329, 271}, {331, 271}}, - {{330, 272}, {83, 272}, {332, 272}}, + {{ 88, 265}, {305, 265}, {339, 265}}, + {{305, 266}, { 89, 266}, {340, 266}}, + {{ 86, 267}, {339, 267}, {333, 267}}, + {{340, 268}, { 87, 268}, {334, 268}}, + {{ 84, 269}, {333, 269}, {329, 269}}, + {{334, 270}, { 85, 270}, {330, 270}}, + {{ 82, 271}, {329, 271}, {331, 271}}, + {{330, 272}, { 83, 272}, {332, 272}}, {{329, 273}, {337, 273}, {331, 273}}, {{338, 274}, {330, 274}, {332, 274}}, {{333, 275}, {335, 275}, {329, 275}}, {{334, 276}, {336, 276}, {340, 276}}, {{331, 277}, {327, 277}, {325, 277}}, {{332, 278}, {328, 278}, {338, 278}}, - {{80, 279}, {331, 279}, {325, 279}}, - {{332, 280}, {81, 280}, {326, 280}}, + {{ 80, 279}, {331, 279}, {325, 279}}, + {{332, 280}, { 81, 280}, {326, 280}}, {{341, 281}, {214, 281}, {208, 281}}, {{342, 282}, {215, 282}, {344, 282}}, - {{325, 283}, {208, 283}, {80, 283}}, + {{325, 283}, {208, 283}, { 80, 283}}, {{326, 284}, {209, 284}, {342, 284}}, - {{214, 285}, {345, 285}, {78, 285}}, + {{214, 285}, {345, 285}, { 78, 285}}, {{215, 286}, {346, 286}, {344, 286}}, - {{345, 287}, {91, 287}, {78, 287}}, - {{346, 288}, {92, 288}, {300, 288}}, - {{323, 289}, {303, 289}, {76, 289}}, + {{345, 287}, { 91, 287}, { 78, 287}}, + {{346, 288}, { 92, 288}, {300, 288}}, + {{323, 289}, {303, 289}, { 76, 289}}, {{324, 290}, {303, 290}, {352, 290}}, - {{351, 291}, {77, 291}, {303, 291}}, - {{352, 292}, {77, 292}, {350, 292}}, - {{77, 293}, {347, 293}, {304, 293}}, - {{348, 294}, {77, 294}, {304, 294}}, + {{351, 291}, { 77, 291}, {303, 291}}, + {{352, 292}, { 77, 292}, {350, 292}}, + {{ 77, 293}, {347, 293}, {304, 293}}, + {{348, 294}, { 77, 294}, {304, 294}}, {{304, 295}, {327, 295}, {308, 295}}, {{328, 296}, {304, 296}, {308, 296}}, {{327, 297}, {341, 297}, {325, 297}}, {{328, 298}, {342, 298}, {348, 298}}, {{295, 299}, {317, 299}, {309, 299}}, {{318, 300}, {296, 300}, {310, 300}}, - {{315, 301}, {76, 301}, {75, 301}}, - {{316, 302}, {76, 302}, {324, 302}}, + {{315, 301}, { 76, 301}, { 75, 301}}, + {{316, 302}, { 76, 302}, {324, 302}}, {{357, 303}, {302, 303}, {301, 303}}, {{358, 304}, {302, 304}, {356, 304}}, - {{302, 305}, {353, 305}, {74, 305}}, - {{354, 306}, {302, 306}, {74, 306}}, - {{74, 307}, {315, 307}, {75, 307}}, - {{316, 308}, {74, 308}, {75, 308}}, + {{302, 305}, {353, 305}, { 74, 305}}, + {{354, 306}, {302, 306}, { 74, 306}}, + {{ 74, 307}, {315, 307}, { 75, 307}}, + {{316, 308}, { 74, 308}, { 75, 308}}, {{291, 309}, {361, 309}, {363, 309}}, {{362, 310}, {292, 310}, {364, 310}}, {{363, 311}, {367, 311}, {365, 311}}, @@ -1792,14 +1792,14 @@ namespace suzanne { {{364, 326}, {358, 326}, {366, 326}}, {{291, 327}, {359, 327}, {289, 327}}, {{292, 328}, {360, 328}, {364, 328}}, - {{359, 329}, {301, 329}, {73, 329}}, + {{359, 329}, {301, 329}, { 73, 329}}, {{360, 330}, {301, 330}, {358, 330}}, {{285, 331}, {289, 331}, {283, 331}}, {{286, 332}, {290, 332}, {288, 332}}, - {{283, 333}, {359, 333}, {73, 333}}, - {{360, 334}, {284, 334}, {73, 334}}, - {{72, 335}, {283, 335}, {73, 335}}, - {{73, 336}, {284, 336}, {72, 336}}, + {{283, 333}, {359, 333}, { 73, 333}}, + {{360, 334}, {284, 334}, { 73, 334}}, + {{ 72, 335}, {283, 335}, { 73, 335}}, + {{ 73, 336}, {284, 336}, { 72, 336}}, {{295, 337}, {361, 337}, {293, 337}}, {{296, 338}, {362, 338}, {310, 338}}, {{309, 339}, {367, 339}, {361, 339}}, @@ -1958,74 +1958,74 @@ namespace suzanne { {{504, 487}, {314, 487}, {322, 487}}, {{319, 488}, {503, 488}, {389, 488}}, {{504, 489}, {320, 489}, {390, 489}}, - {{46, 490}, { 0, 490}, { 2, 490}}, - {{ 3, 491}, { 1, 491}, {47, 491}}, - {{44, 492}, { 2, 492}, { 4, 492}}, - {{ 5, 493}, { 3, 493}, {45, 493}}, - {{ 2, 494}, { 8, 494}, { 6, 494}}, - {{ 7, 495}, { 9, 495}, { 3, 495}}, - {{ 0, 496}, {10, 496}, { 8, 496}}, - {{ 9, 497}, {11, 497}, { 1, 497}}, - {{10, 498}, {12, 498}, {14, 498}}, - {{15, 499}, {13, 499}, {11, 499}}, - {{ 8, 500}, {14, 500}, {16, 500}}, - {{17, 501}, {15, 501}, { 9, 501}}, - {{20, 502}, {18, 502}, {16, 502}}, - {{21, 503}, {15, 503}, {17, 503}}, - {{22, 504}, {20, 504}, {14, 504}}, - {{23, 505}, {13, 505}, {15, 505}}, - {{22, 506}, {24, 506}, {26, 506}}, - {{27, 507}, {25, 507}, {23, 507}}, - {{26, 508}, {28, 508}, {18, 508}}, - {{27, 509}, {21, 509}, {19, 509}}, - {{32, 510}, {30, 510}, {28, 510}}, - {{33, 511}, {27, 511}, {29, 511}}, - {{34, 512}, {32, 512}, {26, 512}}, - {{35, 513}, {25, 513}, {27, 513}}, - {{36, 514}, {38, 514}, {32, 514}}, - {{37, 515}, {35, 515}, {33, 515}}, - {{38, 516}, {40, 516}, {30, 516}}, - {{39, 517}, {33, 517}, {31, 517}}, - {{44, 518}, {42, 518}, {40, 518}}, - {{45, 519}, {39, 519}, {41, 519}}, - {{46, 520}, {44, 520}, {38, 520}}, - {{47, 521}, {37, 521}, {39, 521}}, - {{36, 522}, {50, 522}, {48, 522}}, - {{37, 523}, {47, 523}, {49, 523}}, - {{34, 524}, {52, 524}, {50, 524}}, - {{35, 525}, {37, 525}, {51, 525}}, - {{24, 526}, {54, 526}, {52, 526}}, - {{25, 527}, {35, 527}, {53, 527}}, - {{22, 528}, {56, 528}, {54, 528}}, - {{23, 529}, {25, 529}, {55, 529}}, - {{22, 530}, {12, 530}, {58, 530}}, - {{59, 531}, {13, 531}, {23, 531}}, - {{12, 532}, {10, 532}, {62, 532}}, - {{63, 533}, {11, 533}, {13, 533}}, - {{10, 534}, { 0, 534}, {64, 534}}, - {{65, 535}, { 1, 535}, {11, 535}}, - {{ 0, 536}, {46, 536}, {48, 536}}, - {{49, 537}, {47, 537}, { 1, 537}}, - {{173, 538}, {175, 538}, {90, 538}}, - {{174, 539}, {89, 539}, {90, 539}}, - {{171, 540}, {173, 540}, {88, 540}}, - {{172, 541}, {87, 541}, {89, 541}}, - {{84, 542}, {169, 542}, {171, 542}}, - {{172, 543}, {170, 543}, {85, 543}}, - {{82, 544}, {167, 544}, {169, 544}}, - {{170, 545}, {168, 545}, {83, 545}}, - {{80, 546}, {165, 546}, {167, 546}}, - {{168, 547}, {166, 547}, {81, 547}}, - {{78, 548}, {91, 548}, {145, 548}}, - {{146, 549}, {92, 549}, {79, 549}}, - {{93, 550}, {147, 550}, {145, 550}}, - {{94, 551}, {92, 551}, {146, 551}}, - {{93, 552}, {95, 552}, {149, 552}}, - {{150, 553}, {96, 553}, {94, 553}}, - {{97, 554}, {151, 554}, {149, 554}}, - {{98, 555}, {96, 555}, {150, 555}}, - {{99, 556}, {153, 556}, {151, 556}}, - {{100, 557}, {98, 557}, {152, 557}}, + {{ 46, 490}, { 0, 490}, { 2, 490}}, + {{ 3, 491}, { 1, 491}, { 47, 491}}, + {{ 44, 492}, { 2, 492}, { 4, 492}}, + {{ 5, 493}, { 3, 493}, { 45, 493}}, + {{ 2, 494}, { 8, 494}, { 6, 494}}, + {{ 7, 495}, { 9, 495}, { 3, 495}}, + {{ 0, 496}, { 10, 496}, { 8, 496}}, + {{ 9, 497}, { 11, 497}, { 1, 497}}, + {{ 10, 498}, { 12, 498}, { 14, 498}}, + {{ 15, 499}, { 13, 499}, { 11, 499}}, + {{ 8, 500}, { 14, 500}, { 16, 500}}, + {{ 17, 501}, { 15, 501}, { 9, 501}}, + {{ 20, 502}, { 18, 502}, { 16, 502}}, + {{ 21, 503}, { 15, 503}, { 17, 503}}, + {{ 22, 504}, { 20, 504}, { 14, 504}}, + {{ 23, 505}, { 13, 505}, { 15, 505}}, + {{ 22, 506}, { 24, 506}, { 26, 506}}, + {{ 27, 507}, { 25, 507}, { 23, 507}}, + {{ 26, 508}, { 28, 508}, { 18, 508}}, + {{ 27, 509}, { 21, 509}, { 19, 509}}, + {{ 32, 510}, { 30, 510}, { 28, 510}}, + {{ 33, 511}, { 27, 511}, { 29, 511}}, + {{ 34, 512}, { 32, 512}, { 26, 512}}, + {{ 35, 513}, { 25, 513}, { 27, 513}}, + {{ 36, 514}, { 38, 514}, { 32, 514}}, + {{ 37, 515}, { 35, 515}, { 33, 515}}, + {{ 38, 516}, { 40, 516}, { 30, 516}}, + {{ 39, 517}, { 33, 517}, { 31, 517}}, + {{ 44, 518}, { 42, 518}, { 40, 518}}, + {{ 45, 519}, { 39, 519}, { 41, 519}}, + {{ 46, 520}, { 44, 520}, { 38, 520}}, + {{ 47, 521}, { 37, 521}, { 39, 521}}, + {{ 36, 522}, { 50, 522}, { 48, 522}}, + {{ 37, 523}, { 47, 523}, { 49, 523}}, + {{ 34, 524}, { 52, 524}, { 50, 524}}, + {{ 35, 525}, { 37, 525}, { 51, 525}}, + {{ 24, 526}, { 54, 526}, { 52, 526}}, + {{ 25, 527}, { 35, 527}, { 53, 527}}, + {{ 22, 528}, { 56, 528}, { 54, 528}}, + {{ 23, 529}, { 25, 529}, { 55, 529}}, + {{ 22, 530}, { 12, 530}, { 58, 530}}, + {{ 59, 531}, { 13, 531}, { 23, 531}}, + {{ 12, 532}, { 10, 532}, { 62, 532}}, + {{ 63, 533}, { 11, 533}, { 13, 533}}, + {{ 10, 534}, { 0, 534}, { 64, 534}}, + {{ 65, 535}, { 1, 535}, { 11, 535}}, + {{ 0, 536}, { 46, 536}, { 48, 536}}, + {{ 49, 537}, { 47, 537}, { 1, 537}}, + {{173, 538}, {175, 538}, { 90, 538}}, + {{174, 539}, { 89, 539}, { 90, 539}}, + {{171, 540}, {173, 540}, { 88, 540}}, + {{172, 541}, { 87, 541}, { 89, 541}}, + {{ 84, 542}, {169, 542}, {171, 542}}, + {{172, 543}, {170, 543}, { 85, 543}}, + {{ 82, 544}, {167, 544}, {169, 544}}, + {{170, 545}, {168, 545}, { 83, 545}}, + {{ 80, 546}, {165, 546}, {167, 546}}, + {{168, 547}, {166, 547}, { 81, 547}}, + {{ 78, 548}, { 91, 548}, {145, 548}}, + {{146, 549}, { 92, 549}, { 79, 549}}, + {{ 93, 550}, {147, 550}, {145, 550}}, + {{ 94, 551}, { 92, 551}, {146, 551}}, + {{ 93, 552}, { 95, 552}, {149, 552}}, + {{150, 553}, { 96, 553}, { 94, 553}}, + {{ 97, 554}, {151, 554}, {149, 554}}, + {{ 98, 555}, { 96, 555}, {150, 555}}, + {{ 99, 556}, {153, 556}, {151, 556}}, + {{100, 557}, { 98, 557}, {152, 557}}, {{101, 558}, {155, 558}, {153, 558}}, {{102, 559}, {100, 559}, {154, 559}}, {{101, 560}, {103, 560}, {157, 560}}, @@ -2034,8 +2034,8 @@ namespace suzanne { {{106, 563}, {104, 563}, {158, 563}}, {{107, 564}, {161, 564}, {159, 564}}, {{108, 565}, {106, 565}, {160, 565}}, - {{66, 566}, {67, 566}, {161, 566}}, - {{66, 567}, {108, 567}, {162, 567}}, + {{ 66, 566}, { 67, 566}, {161, 566}}, + {{ 66, 567}, {108, 567}, {162, 567}}, {{127, 568}, {159, 568}, {161, 568}}, {{128, 569}, {110, 569}, {162, 569}}, {{127, 570}, {178, 570}, {157, 570}}, @@ -2056,10 +2056,10 @@ namespace suzanne { {{146, 585}, {164, 585}, {114, 585}}, {{113, 586}, {180, 586}, {176, 586}}, {{176, 587}, {181, 587}, {114, 587}}, - {{161, 588}, {67, 588}, {111, 588}}, + {{161, 588}, { 67, 588}, {111, 588}}, {{162, 589}, {110, 589}, {112, 589}}, - {{111, 590}, {67, 590}, {177, 590}}, - {{177, 591}, {67, 591}, {112, 591}}, + {{111, 590}, { 67, 590}, {177, 590}}, + {{177, 591}, { 67, 591}, {112, 591}}, {{180, 592}, {182, 592}, {177, 592}}, {{181, 593}, {176, 593}, {177, 593}}, {{134, 594}, {136, 594}, {175, 594}}, @@ -2074,23 +2074,23 @@ namespace suzanne { {{168, 603}, {170, 603}, {131, 603}}, {{189, 130}, {188, 130}, {186, 130}}, {{189, 604}, {144, 604}, {187, 604}}, - {{186, 132}, {188, 132}, {68, 132}}, - {{187, 605}, {185, 605}, {68, 605}}, - {{130, 133}, {184, 133}, {68, 133}}, - {{131, 133}, {129, 133}, {68, 133}}, + {{186, 132}, {188, 132}, { 68, 132}}, + {{187, 605}, {185, 605}, { 68, 605}}, + {{130, 133}, {184, 133}, { 68, 133}}, + {{131, 133}, {129, 133}, { 68, 133}}, {{141, 606}, {192, 606}, {190, 606}}, {{191, 607}, {193, 607}, {142, 607}}, {{194, 608}, {192, 608}, {141, 608}}, {{195, 609}, {140, 609}, {142, 609}}, {{196, 610}, {194, 610}, {139, 610}}, {{197, 611}, {138, 611}, {140, 611}}, - {{70, 612}, {196, 612}, {138, 612}}, - {{143, 613}, {190, 613}, {69, 613}}, - {{144, 614}, {189, 614}, {69, 614}}, + {{ 70, 612}, {196, 612}, {138, 612}}, + {{143, 613}, {190, 613}, { 69, 613}}, + {{144, 614}, {189, 614}, { 69, 614}}, {{190, 144}, {205, 144}, {207, 144}}, - {{191, 145}, {69, 145}, {207, 145}}, - {{70, 615}, {198, 615}, {199, 615}}, - {{200, 616}, {198, 616}, {70, 616}}, + {{191, 145}, { 69, 145}, {207, 145}}, + {{ 70, 615}, {198, 615}, {199, 615}}, + {{200, 616}, {198, 616}, { 70, 616}}, {{196, 617}, {199, 617}, {201, 617}}, {{202, 618}, {200, 618}, {197, 618}}, {{201, 619}, {203, 619}, {192, 619}}, @@ -2110,12 +2110,12 @@ namespace suzanne { {{186, 633}, {165, 633}, {212, 633}}, {{187, 634}, {144, 634}, {213, 634}}, {{208, 635}, {212, 635}, {165, 635}}, - {{209, 636}, {81, 636}, {166, 636}}, + {{209, 636}, { 81, 636}, {166, 636}}, {{214, 637}, {210, 637}, {212, 637}}, {{215, 638}, {209, 638}, {213, 638}}, - {{78, 639}, {163, 639}, {210, 639}}, - {{211, 640}, {164, 640}, {79, 640}}, - {{129, 641}, {71, 641}, {221, 641}}, + {{ 78, 639}, {163, 639}, {210, 639}}, + {{211, 640}, {164, 640}, { 79, 640}}, + {{129, 641}, { 71, 641}, {221, 641}}, {{129, 642}, {131, 642}, {222, 642}}, {{132, 643}, {130, 643}, {221, 643}}, {{222, 644}, {131, 644}, {133, 644}}, @@ -2129,8 +2129,8 @@ namespace suzanne { {{227, 650}, {220, 650}, {218, 650}}, {{219, 140}, {221, 140}, {224, 140}}, {{225, 182}, {222, 182}, {220, 182}}, - {{71, 183}, {223, 183}, {224, 183}}, - {{71, 184}, {222, 184}, {225, 184}}, + {{ 71, 183}, {223, 183}, {224, 183}}, + {{ 71, 184}, {222, 184}, {225, 184}}, {{223, 651}, {230, 651}, {228, 651}}, {{229, 652}, {230, 652}, {223, 652}}, {{182, 653}, {180, 653}, {233, 653}}, @@ -2185,74 +2185,74 @@ namespace suzanne { {{282, 700}, {232, 700}, {254, 700}}, {{231, 701}, {233, 701}, {279, 701}}, {{280, 702}, {234, 702}, {232, 702}}, - {{66, 703}, {107, 703}, {283, 703}}, - {{284, 704}, {108, 704}, {66, 704}}, + {{ 66, 703}, {107, 703}, {283, 703}}, + {{284, 704}, {108, 704}, { 66, 704}}, {{107, 705}, {105, 705}, {285, 705}}, {{286, 706}, {106, 706}, {108, 706}}, {{103, 707}, {287, 707}, {285, 707}}, {{104, 708}, {106, 708}, {286, 708}}, {{101, 709}, {289, 709}, {287, 709}}, {{102, 710}, {104, 710}, {288, 710}}, - {{99, 711}, {291, 711}, {289, 711}}, + {{ 99, 711}, {291, 711}, {289, 711}}, {{100, 712}, {102, 712}, {290, 712}}, - {{99, 713}, {97, 713}, {293, 713}}, - {{294, 714}, {98, 714}, {100, 714}}, - {{95, 715}, {295, 715}, {293, 715}}, - {{96, 716}, {98, 716}, {294, 716}}, - {{95, 717}, {93, 717}, {297, 717}}, - {{298, 718}, {94, 718}, {96, 718}}, - {{93, 719}, {91, 719}, {299, 719}}, - {{300, 720}, {92, 720}, {94, 720}}, + {{ 99, 713}, { 97, 713}, {293, 713}}, + {{294, 714}, { 98, 714}, {100, 714}}, + {{ 95, 715}, {295, 715}, {293, 715}}, + {{ 96, 716}, { 98, 716}, {294, 716}}, + {{ 95, 717}, { 93, 717}, {297, 717}}, + {{298, 718}, { 94, 718}, { 96, 718}}, + {{ 93, 719}, { 91, 719}, {299, 719}}, + {{300, 720}, { 92, 720}, { 94, 720}}, {{308, 721}, {327, 721}, {337, 721}}, {{308, 722}, {307, 722}, {338, 722}}, {{307, 723}, {337, 723}, {335, 723}}, {{307, 724}, {306, 724}, {336, 724}}, {{306, 725}, {335, 725}, {339, 725}}, {{306, 726}, {305, 726}, {340, 726}}, - {{88, 727}, {90, 727}, {305, 727}}, - {{305, 728}, {90, 728}, {89, 728}}, - {{86, 729}, {88, 729}, {339, 729}}, - {{340, 730}, {89, 730}, {87, 730}}, - {{84, 731}, {86, 731}, {333, 731}}, - {{334, 732}, {87, 732}, {85, 732}}, - {{82, 733}, {84, 733}, {329, 733}}, - {{330, 734}, {85, 734}, {83, 734}}, + {{ 88, 727}, { 90, 727}, {305, 727}}, + {{305, 728}, { 90, 728}, { 89, 728}}, + {{ 86, 729}, { 88, 729}, {339, 729}}, + {{340, 730}, { 89, 730}, { 87, 730}}, + {{ 84, 731}, { 86, 731}, {333, 731}}, + {{334, 732}, { 87, 732}, { 85, 732}}, + {{ 82, 733}, { 84, 733}, {329, 733}}, + {{330, 734}, { 85, 734}, { 83, 734}}, {{329, 735}, {335, 735}, {337, 735}}, {{338, 736}, {336, 736}, {330, 736}}, {{333, 737}, {339, 737}, {335, 737}}, {{334, 738}, {330, 738}, {336, 738}}, {{331, 739}, {337, 739}, {327, 739}}, {{332, 740}, {326, 740}, {328, 740}}, - {{80, 741}, {82, 741}, {331, 741}}, - {{332, 742}, {83, 742}, {81, 742}}, + {{ 80, 741}, { 82, 741}, {331, 741}}, + {{332, 742}, { 83, 742}, { 81, 742}}, {{341, 743}, {343, 743}, {214, 743}}, {{342, 744}, {209, 744}, {215, 744}}, {{325, 745}, {341, 745}, {208, 745}}, - {{326, 746}, {81, 746}, {209, 746}}, + {{326, 746}, { 81, 746}, {209, 746}}, {{214, 747}, {343, 747}, {345, 747}}, - {{215, 748}, {79, 748}, {346, 748}}, - {{345, 749}, {299, 749}, {91, 749}}, - {{346, 750}, {79, 750}, {92, 750}}, + {{215, 748}, { 79, 748}, {346, 748}}, + {{345, 749}, {299, 749}, { 91, 749}}, + {{346, 750}, { 79, 750}, { 92, 750}}, {{323, 751}, {351, 751}, {303, 751}}, - {{324, 752}, {76, 752}, {303, 752}}, - {{351, 753}, {349, 753}, {77, 753}}, - {{352, 754}, {303, 754}, {77, 754}}, - {{77, 755}, {349, 755}, {347, 755}}, - {{348, 756}, {350, 756}, {77, 756}}, + {{324, 752}, { 76, 752}, {303, 752}}, + {{351, 753}, {349, 753}, { 77, 753}}, + {{352, 754}, {303, 754}, { 77, 754}}, + {{ 77, 755}, {349, 755}, {347, 755}}, + {{348, 756}, {350, 756}, { 77, 756}}, {{304, 757}, {347, 757}, {327, 757}}, {{328, 758}, {348, 758}, {304, 758}}, {{327, 759}, {347, 759}, {341, 759}}, {{328, 760}, {326, 760}, {342, 760}}, {{295, 761}, {297, 761}, {317, 761}}, {{318, 762}, {298, 762}, {296, 762}}, - {{315, 763}, {323, 763}, {76, 763}}, - {{316, 764}, {75, 764}, {76, 764}}, + {{315, 763}, {323, 763}, { 76, 763}}, + {{316, 764}, { 75, 764}, { 76, 764}}, {{357, 765}, {355, 765}, {302, 765}}, {{358, 766}, {301, 766}, {302, 766}}, {{302, 767}, {355, 767}, {353, 767}}, {{354, 768}, {356, 768}, {302, 768}}, - {{74, 769}, {353, 769}, {315, 769}}, - {{316, 770}, {354, 770}, {74, 770}}, + {{ 74, 769}, {353, 769}, {315, 769}}, + {{316, 770}, {354, 770}, { 74, 770}}, {{291, 771}, {293, 771}, {361, 771}}, {{362, 772}, {294, 772}, {292, 772}}, {{363, 773}, {361, 773}, {367, 773}}, @@ -2274,7 +2274,7 @@ namespace suzanne { {{291, 789}, {363, 789}, {359, 789}}, {{292, 790}, {290, 790}, {360, 790}}, {{359, 791}, {357, 791}, {301, 791}}, - {{360, 792}, {73, 792}, {301, 792}}, + {{360, 792}, { 73, 792}, {301, 792}}, {{285, 793}, {287, 793}, {289, 793}}, {{286, 794}, {284, 794}, {290, 794}}, {{283, 795}, {289, 795}, {359, 795}}, @@ -2426,7 +2426,7 @@ namespace suzanne { {{319, 939}, {321, 939}, {503, 939}}, {{504, 940}, {322, 940}, {320, 940}}, }; - - constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face)); - + + constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face_vn)); + } diff --git a/geometry/wiffle.hpp b/geometry/wiffle.hpp index c0b57dd..fac99ce 100644 --- a/geometry/wiffle.hpp +++ b/geometry/wiffle.hpp @@ -269,7 +269,7 @@ namespace wiffle { { 40.000000f, -27.082212f, 4.775324f }, { 40.000000f, -23.815699f, 13.749999f }, }; - + constexpr vec3 normals[] = { { -1.000000f, -0.000000f, -0.000000f }, { -0.000000f, -0.000000f, 1.000000f }, @@ -334,586 +334,586 @@ namespace wiffle { { -0.984800f, -0.000000f, 0.173600f }, { 0.500000f, -0.500000f, -0.707100f }, }; - - constexpr face faces[] = { - {{ 0, 0}, { 1, 0}, { 2, 0}}, - {{ 1, 0}, { 3, 0}, { 2, 0}}, - {{ 0, 0}, { 4, 0}, { 1, 0}}, - {{ 3, 0}, { 5, 0}, { 2, 0}}, - {{ 6, 0}, { 7, 0}, { 0, 0}}, - {{ 0, 0}, { 7, 0}, { 4, 0}}, - {{ 2, 0}, { 8, 0}, { 9, 0}}, - {{ 5, 0}, { 8, 0}, { 2, 0}}, - {{ 6, 0}, {10, 0}, { 7, 0}}, - {{ 8, 0}, {11, 0}, { 9, 0}}, - {{ 6, 0}, {12, 0}, {10, 0}}, - {{11, 0}, {13, 0}, { 9, 0}}, - {{12, 0}, {14, 0}, {15, 0}}, - {{15, 0}, {14, 0}, {16, 0}}, - {{ 6, 0}, {14, 0}, {12, 0}}, - {{17, 0}, {18, 0}, {19, 0}}, - {{19, 0}, {18, 0}, {13, 0}}, - {{13, 0}, {18, 0}, { 9, 0}}, - {{20, 0}, {21, 0}, {22, 0}}, - {{22, 0}, {21, 0}, {17, 0}}, - {{17, 0}, {21, 0}, {18, 0}}, - {{16, 0}, {23, 0}, {24, 0}}, - {{24, 0}, {23, 0}, {25, 0}}, - {{25, 0}, {23, 0}, {20, 0}}, - {{14, 0}, {23, 0}, {16, 0}}, - {{20, 0}, {23, 0}, {21, 0}}, - {{26, 1}, {21, 1}, {27, 1}}, - {{28, 1}, {26, 1}, {27, 1}}, - {{29, 1}, {21, 1}, {26, 1}}, - {{30, 1}, {28, 1}, {27, 1}}, - {{31, 1}, {18, 1}, {21, 1}}, - {{31, 1}, {21, 1}, {29, 1}}, - {{32, 1}, {27, 1}, {33, 1}}, - {{32, 1}, {30, 1}, {27, 1}}, - {{34, 1}, {18, 1}, {31, 1}}, - {{35, 1}, {32, 1}, {33, 1}}, - {{36, 1}, {18, 1}, {34, 1}}, - {{37, 1}, {35, 1}, {33, 1}}, - {{38, 1}, {39, 1}, {40, 1}}, - {{38, 1}, {40, 1}, {37, 1}}, - {{38, 1}, {37, 1}, {33, 1}}, - {{41, 1}, {36, 1}, {42, 1}}, - {{41, 1}, {42, 1}, {43, 1}}, - {{41, 1}, {18, 1}, {36, 1}}, - {{44, 1}, {45, 1}, {46, 1}}, - {{44, 1}, {46, 1}, {39, 1}}, - {{44, 1}, {39, 1}, {38, 1}}, - {{47, 1}, {43, 1}, {48, 1}}, - {{47, 1}, {48, 1}, {49, 1}}, - {{47, 1}, {49, 1}, {45, 1}}, - {{47, 1}, {41, 1}, {43, 1}}, - {{47, 1}, {45, 1}, {44, 1}}, - {{50, 2}, { 9, 2}, {18, 2}}, - {{50, 2}, {51, 2}, { 9, 2}}, - {{52, 2}, { 9, 2}, {51, 2}}, - {{52, 2}, {50, 2}, {18, 2}}, - {{41, 2}, { 9, 2}, {52, 2}}, - {{41, 2}, {52, 2}, {18, 2}}, - {{53, 3}, {54, 3}, { 2, 3}}, - {{53, 3}, { 2, 3}, {55, 3}}, - {{56, 3}, {55, 3}, { 2, 3}}, - {{57, 3}, {54, 3}, {53, 3}}, - {{58, 3}, { 2, 3}, { 9, 3}}, - {{58, 3}, {56, 3}, { 2, 3}}, - {{59, 3}, {60, 3}, {54, 3}}, - {{59, 3}, {54, 3}, {57, 3}}, - {{61, 3}, {58, 3}, { 9, 3}}, - {{62, 3}, {60, 3}, {59, 3}}, - {{63, 3}, {61, 3}, { 9, 3}}, - {{64, 3}, {63, 3}, { 9, 3}}, - {{65, 3}, {66, 3}, {67, 3}}, - {{65, 3}, {68, 3}, {66, 3}}, - {{65, 3}, {62, 3}, {68, 3}}, - {{65, 3}, {60, 3}, {62, 3}}, - {{41, 3}, {69, 3}, {64, 3}}, - {{41, 3}, {70, 3}, {69, 3}}, - {{41, 3}, {64, 3}, { 9, 3}}, - {{47, 3}, {71, 3}, {70, 3}}, - {{47, 3}, {70, 3}, {41, 3}}, - {{72, 3}, {73, 3}, {71, 3}}, - {{72, 3}, {74, 3}, {73, 3}}, - {{72, 3}, {67, 3}, {74, 3}}, - {{72, 3}, {65, 3}, {67, 3}}, - {{72, 3}, {71, 3}, {47, 3}}, - {{75, 4}, {54, 4}, {76, 4}}, - {{76, 4}, {54, 4}, { 0, 4}}, - {{76, 4}, { 2, 4}, {77, 4}}, - {{77, 4}, { 2, 4}, {75, 4}}, - {{ 0, 4}, { 2, 4}, {76, 4}}, - {{75, 4}, { 2, 4}, {54, 4}}, - {{ 6, 5}, {78, 5}, {79, 5}}, - {{78, 5}, {80, 5}, {79, 5}}, - {{ 6, 5}, {81, 5}, {78, 5}}, - {{79, 5}, {82, 5}, {83, 5}}, - {{80, 5}, {82, 5}, {79, 5}}, - {{ 0, 5}, {84, 5}, { 6, 5}}, - {{ 6, 5}, {84, 5}, {81, 5}}, - {{82, 5}, {85, 5}, {83, 5}}, - {{ 0, 5}, {86, 5}, {84, 5}}, - {{85, 5}, {87, 5}, {83, 5}}, - {{ 0, 5}, {88, 5}, {86, 5}}, - {{87, 5}, {89, 5}, {83, 5}}, - {{90, 5}, {91, 5}, {92, 5}}, - {{92, 5}, {91, 5}, {89, 5}}, - {{89, 5}, {91, 5}, {83, 5}}, - {{88, 5}, {54, 5}, {93, 5}}, - {{93, 5}, {54, 5}, {94, 5}}, - {{ 0, 5}, {54, 5}, {88, 5}}, - {{95, 5}, {96, 5}, {97, 5}}, - {{97, 5}, {96, 5}, {90, 5}}, - {{90, 5}, {96, 5}, {91, 5}}, - {{94, 5}, {60, 5}, {98, 5}}, - {{98, 5}, {60, 5}, {99, 5}}, - {{99, 5}, {60, 5}, {95, 5}}, - {{54, 5}, {60, 5}, {94, 5}}, - {{95, 5}, {60, 5}, {96, 5}}, - {{ 6, 6}, {100, 6}, {101, 6}}, - {{ 6, 6}, {79, 6}, {100, 6}}, - {{102, 6}, {14, 6}, {101, 6}}, - {{100, 6}, {14, 6}, {102, 6}}, - {{101, 6}, {14, 6}, { 6, 6}}, - {{79, 6}, {14, 6}, {100, 6}}, - {{79, 7}, {103, 7}, {14, 7}}, - {{14, 7}, {103, 7}, {104, 7}}, - {{104, 7}, {105, 7}, {14, 7}}, - {{83, 7}, {106, 7}, {79, 7}}, - {{79, 7}, {106, 7}, {103, 7}}, - {{14, 7}, {107, 7}, {23, 7}}, - {{105, 7}, {107, 7}, {14, 7}}, - {{83, 7}, {108, 7}, {106, 7}}, - {{107, 7}, {109, 7}, {23, 7}}, - {{83, 7}, {110, 7}, {108, 7}}, - {{109, 7}, {111, 7}, {23, 7}}, - {{111, 7}, {112, 7}, {23, 7}}, - {{113, 7}, {114, 7}, {115, 7}}, - {{116, 7}, {114, 7}, {113, 7}}, - {{110, 7}, {114, 7}, {116, 7}}, - {{83, 7}, {114, 7}, {110, 7}}, - {{117, 7}, {27, 7}, {112, 7}}, - {{112, 7}, {27, 7}, {23, 7}}, - {{118, 7}, {33, 7}, {117, 7}}, - {{119, 7}, {33, 7}, {118, 7}}, - {{117, 7}, {33, 7}, {27, 7}}, - {{120, 7}, {121, 7}, {119, 7}}, - {{122, 7}, {121, 7}, {120, 7}}, - {{115, 7}, {121, 7}, {122, 7}}, - {{119, 7}, {121, 7}, {33, 7}}, - {{114, 7}, {121, 7}, {115, 7}}, - {{123, 8}, {21, 8}, {23, 8}}, - {{123, 8}, {23, 8}, {124, 8}}, - {{125, 8}, {124, 8}, {23, 8}}, - {{27, 8}, {125, 8}, {23, 8}}, - {{27, 8}, {21, 8}, {123, 8}}, - {{27, 8}, {123, 8}, {125, 8}}, - {{ 4, 9}, { 7, 9}, {126, 9}}, - {{ 4, 9}, {126, 9}, {127, 9}}, - {{ 1, 10}, {127, 10}, {128, 10}}, - {{ 1, 10}, { 4, 10}, {127, 10}}, - {{ 3, 11}, {128, 11}, {129, 11}}, - {{ 3, 11}, { 1, 11}, {128, 11}}, - {{ 5, 12}, {129, 12}, {130, 12}}, - {{ 5, 12}, { 3, 12}, {129, 12}}, - {{ 8, 7}, {130, 7}, {131, 7}}, - {{ 8, 7}, { 5, 7}, {130, 7}}, - {{11, 13}, {132, 13}, {133, 13}}, - {{11, 14}, {131, 14}, {132, 14}}, - {{11, 14}, { 8, 14}, {131, 14}}, - {{13, 15}, {133, 15}, {134, 15}}, - {{13, 13}, {11, 13}, {133, 13}}, - {{19, 16}, {134, 16}, {135, 16}}, - {{19, 15}, {13, 15}, {134, 15}}, - {{17, 17}, {135, 17}, {136, 17}}, - {{17, 16}, {19, 16}, {135, 16}}, - {{22, 17}, {17, 17}, {136, 17}}, - {{20, 18}, {136, 18}, {137, 18}}, - {{20, 18}, {22, 18}, {136, 18}}, - {{25, 19}, {137, 19}, {138, 19}}, - {{25, 19}, {20, 19}, {137, 19}}, - {{24, 3}, {139, 3}, {140, 3}}, - {{24, 20}, {138, 20}, {139, 20}}, - {{24, 20}, {25, 20}, {138, 20}}, - {{16, 3}, {24, 3}, {140, 3}}, - {{15, 21}, {16, 21}, {140, 21}}, - {{15, 21}, {140, 21}, {141, 21}}, - {{12, 22}, {15, 22}, {141, 22}}, - {{12, 23}, {142, 23}, {143, 23}}, - {{12, 22}, {141, 22}, {142, 22}}, - {{10, 23}, {12, 23}, {143, 23}}, - {{ 7, 24}, {10, 24}, {143, 24}}, - {{ 7, 24}, {143, 24}, {126, 24}}, - {{144, 25}, {72, 25}, {47, 25}}, - {{144, 25}, {145, 25}, {72, 25}}, - {{146, 25}, {72, 25}, {145, 25}}, - {{44, 25}, {146, 25}, {144, 25}}, - {{44, 25}, {72, 25}, {146, 25}}, - {{44, 25}, {144, 25}, {47, 25}}, - {{147, 26}, {96, 26}, {65, 26}}, - {{148, 26}, {147, 26}, {65, 26}}, - {{149, 26}, {96, 26}, {147, 26}}, - {{150, 26}, {148, 26}, {65, 26}}, - {{72, 26}, {150, 26}, {65, 26}}, - {{151, 26}, {91, 26}, {96, 26}}, - {{151, 26}, {96, 26}, {149, 26}}, - {{152, 26}, {150, 26}, {72, 26}}, - {{153, 26}, {91, 26}, {151, 26}}, - {{154, 26}, {152, 26}, {72, 26}}, - {{155, 26}, {91, 26}, {153, 26}}, - {{156, 26}, {154, 26}, {72, 26}}, - {{114, 26}, {155, 26}, {157, 26}}, - {{114, 26}, {157, 26}, {158, 26}}, - {{114, 26}, {91, 26}, {155, 26}}, - {{44, 26}, {159, 26}, {160, 26}}, - {{44, 26}, {160, 26}, {156, 26}}, - {{44, 26}, {156, 26}, {72, 26}}, - {{38, 26}, {161, 26}, {162, 26}}, - {{38, 26}, {162, 26}, {159, 26}}, - {{38, 26}, {159, 26}, {44, 26}}, - {{121, 26}, {158, 26}, {163, 26}}, - {{121, 26}, {163, 26}, {164, 26}}, - {{121, 26}, {164, 26}, {161, 26}}, - {{121, 26}, {114, 26}, {158, 26}}, - {{121, 26}, {161, 26}, {38, 26}}, - {{165, 27}, {33, 27}, {121, 27}}, - {{165, 27}, {121, 27}, {166, 27}}, - {{167, 27}, {166, 27}, {121, 27}}, - {{38, 27}, {167, 27}, {121, 27}}, - {{38, 27}, {33, 27}, {165, 27}}, - {{38, 27}, {165, 27}, {167, 27}}, - {{168, 28}, {169, 28}, {39, 28}}, - {{168, 28}, {39, 28}, {46, 28}}, - {{170, 29}, {45, 29}, {49, 29}}, - {{170, 30}, {46, 30}, {45, 30}}, - {{170, 30}, {168, 30}, {46, 30}}, - {{171, 29}, {170, 29}, {49, 29}}, - {{172, 31}, {49, 31}, {48, 31}}, - {{172, 31}, {171, 31}, {49, 31}}, - {{173, 7}, {48, 7}, {43, 7}}, - {{173, 7}, {172, 7}, {48, 7}}, - {{174, 32}, {43, 32}, {42, 32}}, - {{174, 32}, {173, 32}, {43, 32}}, - {{175, 33}, {36, 33}, {34, 33}}, - {{175, 34}, {42, 34}, {36, 34}}, - {{175, 34}, {174, 34}, {42, 34}}, - {{176, 35}, {34, 35}, {31, 35}}, - {{176, 33}, {175, 33}, {34, 33}}, - {{177, 35}, {176, 35}, {31, 35}}, - {{178, 36}, {29, 36}, {26, 36}}, - {{178, 37}, {31, 37}, {29, 37}}, - {{178, 37}, {177, 37}, {31, 37}}, - {{179, 36}, {178, 36}, {26, 36}}, - {{180, 38}, {26, 38}, {28, 38}}, - {{180, 38}, {179, 38}, {26, 38}}, - {{181, 39}, {28, 39}, {30, 39}}, - {{181, 39}, {180, 39}, {28, 39}}, - {{182, 40}, {32, 40}, {35, 40}}, - {{182, 3}, {30, 3}, {32, 3}}, - {{182, 3}, {181, 3}, {30, 3}}, - {{183, 40}, {182, 40}, {35, 40}}, - {{184, 41}, {183, 41}, {35, 41}}, - {{184, 42}, {37, 42}, {40, 42}}, - {{184, 41}, {35, 41}, {37, 41}}, - {{185, 42}, {184, 42}, {40, 42}}, - {{169, 43}, {185, 43}, {40, 43}}, - {{169, 43}, {40, 43}, {39, 43}}, - {{128, 26}, {76, 26}, {77, 26}}, - {{129, 26}, {128, 26}, {77, 26}}, - {{127, 26}, {76, 26}, {128, 26}}, - {{130, 26}, {129, 26}, {77, 26}}, - {{126, 26}, {76, 26}, {127, 26}}, - {{101, 26}, {76, 26}, {126, 26}}, - {{51, 26}, {131, 26}, {130, 26}}, - {{51, 26}, {130, 26}, {77, 26}}, - {{143, 26}, {101, 26}, {126, 26}}, - {{132, 26}, {131, 26}, {51, 26}}, - {{142, 26}, {101, 26}, {143, 26}}, - {{133, 26}, {132, 26}, {51, 26}}, - {{102, 26}, {142, 26}, {141, 26}}, - {{102, 26}, {101, 26}, {142, 26}}, - {{140, 26}, {102, 26}, {141, 26}}, - {{50, 26}, {134, 26}, {133, 26}}, - {{50, 26}, {133, 26}, {51, 26}}, - {{135, 26}, {134, 26}, {50, 26}}, - {{139, 26}, {102, 26}, {140, 26}}, - {{123, 26}, {137, 26}, {136, 26}}, - {{123, 26}, {136, 26}, {135, 26}}, - {{123, 26}, {135, 26}, {50, 26}}, - {{124, 26}, {139, 26}, {138, 26}}, - {{124, 26}, {138, 26}, {137, 26}}, - {{124, 26}, {102, 26}, {139, 26}}, - {{124, 26}, {137, 26}, {123, 26}}, - {{123, 5}, {179, 5}, {125, 5}}, - {{179, 5}, {180, 5}, {125, 5}}, - {{123, 5}, {178, 5}, {179, 5}}, - {{180, 5}, {181, 5}, {125, 5}}, - {{123, 5}, {177, 5}, {178, 5}}, - {{123, 5}, {50, 5}, {177, 5}}, - {{125, 5}, {182, 5}, {165, 5}}, - {{181, 5}, {182, 5}, {125, 5}}, - {{50, 5}, {176, 5}, {177, 5}}, - {{182, 5}, {183, 5}, {165, 5}}, - {{50, 5}, {175, 5}, {176, 5}}, - {{183, 5}, {184, 5}, {165, 5}}, - {{185, 5}, {167, 5}, {184, 5}}, - {{184, 5}, {167, 5}, {165, 5}}, - {{175, 5}, {52, 5}, {174, 5}}, - {{174, 5}, {52, 5}, {173, 5}}, - {{50, 5}, {52, 5}, {175, 5}}, - {{185, 5}, {169, 5}, {167, 5}}, - {{52, 5}, {172, 5}, {173, 5}}, - {{170, 5}, {146, 5}, {168, 5}}, - {{168, 5}, {146, 5}, {169, 5}}, - {{169, 5}, {146, 5}, {167, 5}}, - {{172, 5}, {144, 5}, {171, 5}}, - {{171, 5}, {144, 5}, {170, 5}}, - {{52, 5}, {144, 5}, {172, 5}}, - {{170, 5}, {144, 5}, {146, 5}}, - {{75, 7}, {186, 7}, {77, 7}}, - {{75, 7}, {187, 7}, {186, 7}}, - {{186, 7}, {188, 7}, {77, 7}}, - {{75, 7}, {189, 7}, {187, 7}}, - {{188, 7}, {190, 7}, {77, 7}}, - {{191, 7}, {192, 7}, {75, 7}}, - {{75, 7}, {192, 7}, {189, 7}}, - {{190, 7}, {51, 7}, {77, 7}}, - {{190, 7}, {193, 7}, {51, 7}}, - {{191, 7}, {194, 7}, {192, 7}}, - {{193, 7}, {195, 7}, {51, 7}}, - {{191, 7}, {196, 7}, {194, 7}}, - {{196, 7}, {197, 7}, {198, 7}}, - {{191, 7}, {197, 7}, {196, 7}}, - {{199, 7}, {52, 7}, {195, 7}}, - {{200, 7}, {52, 7}, {199, 7}}, - {{195, 7}, {52, 7}, {51, 7}}, - {{197, 7}, {201, 7}, {198, 7}}, - {{200, 7}, {202, 7}, {52, 7}}, - {{203, 7}, {144, 7}, {202, 7}}, - {{204, 7}, {144, 7}, {203, 7}}, - {{202, 7}, {144, 7}, {52, 7}}, - {{205, 7}, {145, 7}, {204, 7}}, - {{201, 7}, {145, 7}, {205, 7}}, - {{204, 7}, {145, 7}, {144, 7}}, - {{197, 7}, {145, 7}, {201, 7}}, - {{206, 44}, {96, 44}, {191, 44}}, - {{191, 44}, {96, 44}, {60, 44}}, - {{191, 44}, {65, 44}, {197, 44}}, - {{197, 44}, {65, 44}, {206, 44}}, - {{60, 44}, {65, 44}, {191, 44}}, - {{206, 44}, {65, 44}, {96, 44}}, - {{74, 45}, {67, 45}, {201, 45}}, - {{74, 45}, {201, 45}, {205, 45}}, - {{73, 46}, {204, 46}, {203, 46}}, - {{73, 47}, {205, 47}, {204, 47}}, - {{73, 47}, {74, 47}, {205, 47}}, - {{71, 46}, {73, 46}, {203, 46}}, - {{70, 48}, {203, 48}, {202, 48}}, - {{70, 48}, {71, 48}, {203, 48}}, - {{69, 5}, {202, 5}, {200, 5}}, - {{69, 5}, {70, 5}, {202, 5}}, - {{64, 49}, {200, 49}, {199, 49}}, - {{64, 49}, {69, 49}, {200, 49}}, - {{63, 50}, {195, 50}, {193, 50}}, - {{63, 51}, {199, 51}, {195, 51}}, - {{63, 51}, {64, 51}, {199, 51}}, - {{61, 52}, {193, 52}, {190, 52}}, - {{61, 50}, {63, 50}, {193, 50}}, - {{58, 52}, {61, 52}, {190, 52}}, - {{56, 53}, {188, 53}, {186, 53}}, - {{56, 54}, {190, 54}, {188, 54}}, - {{56, 54}, {58, 54}, {190, 54}}, - {{55, 53}, {56, 53}, {186, 53}}, - {{53, 55}, {186, 55}, {187, 55}}, - {{53, 55}, {55, 55}, {186, 55}}, - {{57, 56}, {187, 56}, {189, 56}}, - {{57, 56}, {53, 56}, {187, 56}}, - {{59, 57}, {192, 57}, {194, 57}}, - {{59, 1}, {189, 1}, {192, 1}}, - {{59, 1}, {57, 1}, {189, 1}}, - {{62, 57}, {59, 57}, {194, 57}}, - {{68, 58}, {62, 58}, {194, 58}}, - {{68, 59}, {196, 59}, {198, 59}}, - {{68, 58}, {194, 58}, {196, 58}}, - {{66, 59}, {68, 59}, {198, 59}}, - {{67, 60}, {66, 60}, {198, 60}}, - {{67, 60}, {198, 60}, {201, 60}}, - {{207, 1}, {101, 1}, {100, 1}}, - {{208, 1}, {207, 1}, {100, 1}}, - {{209, 1}, {101, 1}, {207, 1}}, - {{210, 1}, {208, 1}, {100, 1}}, - {{211, 1}, {101, 1}, {209, 1}}, - {{76, 1}, {101, 1}, {211, 1}}, - {{212, 1}, {100, 1}, {213, 1}}, - {{212, 1}, {210, 1}, {100, 1}}, - {{214, 1}, {76, 1}, {211, 1}}, - {{215, 1}, {212, 1}, {213, 1}}, - {{216, 1}, {76, 1}, {214, 1}}, - {{217, 1}, {215, 1}, {213, 1}}, - {{218, 1}, {219, 1}, {217, 1}}, - {{218, 1}, {217, 1}, {213, 1}}, - {{75, 1}, {216, 1}, {220, 1}}, - {{75, 1}, {220, 1}, {221, 1}}, - {{75, 1}, {76, 1}, {216, 1}}, - {{222, 1}, {219, 1}, {218, 1}}, - {{223, 1}, {75, 1}, {221, 1}}, - {{206, 1}, {224, 1}, {225, 1}}, - {{206, 1}, {225, 1}, {222, 1}}, - {{206, 1}, {222, 1}, {218, 1}}, - {{191, 1}, {223, 1}, {226, 1}}, - {{191, 1}, {226, 1}, {224, 1}}, - {{191, 1}, {75, 1}, {223, 1}}, - {{191, 1}, {224, 1}, {206, 1}}, - {{213, 61}, {91, 61}, {218, 61}}, - {{83, 61}, {91, 61}, {213, 61}}, - {{227, 61}, {114, 61}, {213, 61}}, - {{218, 61}, {114, 61}, {227, 61}}, - {{213, 61}, {114, 61}, {83, 61}}, - {{91, 61}, {114, 61}, {218, 61}}, - {{97, 28}, {90, 28}, {222, 28}}, - {{97, 28}, {222, 28}, {225, 28}}, - {{95, 29}, {224, 29}, {226, 29}}, - {{95, 30}, {225, 30}, {224, 30}}, - {{95, 30}, {97, 30}, {225, 30}}, - {{99, 29}, {95, 29}, {226, 29}}, - {{98, 31}, {226, 31}, {223, 31}}, - {{98, 31}, {99, 31}, {226, 31}}, - {{94, 7}, {223, 7}, {221, 7}}, - {{94, 7}, {98, 7}, {223, 7}}, - {{93, 32}, {221, 32}, {220, 32}}, - {{93, 32}, {94, 32}, {221, 32}}, - {{88, 33}, {216, 33}, {214, 33}}, - {{88, 34}, {220, 34}, {216, 34}}, - {{88, 34}, {93, 34}, {220, 34}}, - {{86, 35}, {214, 35}, {211, 35}}, - {{86, 33}, {88, 33}, {214, 33}}, - {{84, 35}, {86, 35}, {211, 35}}, - {{81, 36}, {209, 36}, {207, 36}}, - {{81, 37}, {211, 37}, {209, 37}}, - {{81, 37}, {84, 37}, {211, 37}}, - {{78, 36}, {81, 36}, {207, 36}}, - {{80, 38}, {207, 38}, {208, 38}}, - {{80, 38}, {78, 38}, {207, 38}}, - {{82, 39}, {208, 39}, {210, 39}}, - {{82, 39}, {80, 39}, {208, 39}}, - {{85, 40}, {212, 40}, {215, 40}}, - {{85, 3}, {210, 3}, {212, 3}}, - {{85, 3}, {82, 3}, {210, 3}}, - {{87, 40}, {85, 40}, {215, 40}}, - {{89, 41}, {87, 41}, {215, 41}}, - {{89, 42}, {217, 42}, {219, 42}}, - {{89, 41}, {215, 41}, {217, 41}}, - {{92, 42}, {89, 42}, {219, 42}}, - {{90, 43}, {92, 43}, {219, 43}}, - {{90, 43}, {219, 43}, {222, 43}}, - {{228, 3}, {100, 3}, {102, 3}}, - {{229, 3}, {100, 3}, {228, 3}}, - {{230, 3}, {228, 3}, {102, 3}}, - {{231, 3}, {100, 3}, {229, 3}}, - {{232, 3}, {230, 3}, {102, 3}}, - {{233, 3}, {213, 3}, {100, 3}}, - {{233, 3}, {100, 3}, {231, 3}}, - {{124, 3}, {232, 3}, {102, 3}}, - {{234, 3}, {232, 3}, {124, 3}}, - {{235, 3}, {213, 3}, {233, 3}}, - {{236, 3}, {234, 3}, {124, 3}}, - {{237, 3}, {213, 3}, {235, 3}}, - {{227, 3}, {237, 3}, {238, 3}}, - {{227, 3}, {213, 3}, {237, 3}}, - {{125, 3}, {239, 3}, {236, 3}}, - {{125, 3}, {240, 3}, {239, 3}}, - {{125, 3}, {236, 3}, {124, 3}}, - {{241, 3}, {227, 3}, {238, 3}}, - {{242, 3}, {240, 3}, {125, 3}}, - {{165, 3}, {243, 3}, {242, 3}}, - {{165, 3}, {244, 3}, {243, 3}}, - {{165, 3}, {242, 3}, {125, 3}}, - {{166, 3}, {245, 3}, {244, 3}}, - {{166, 3}, {241, 3}, {245, 3}}, - {{166, 3}, {227, 3}, {241, 3}}, - {{166, 3}, {244, 3}, {165, 3}}, - {{245, 45}, {241, 45}, {115, 45}}, - {{245, 45}, {115, 45}, {122, 45}}, - {{244, 46}, {120, 46}, {119, 46}}, - {{244, 47}, {122, 47}, {120, 47}}, - {{244, 47}, {245, 47}, {122, 47}}, - {{243, 46}, {244, 46}, {119, 46}}, - {{242, 48}, {119, 48}, {118, 48}}, - {{242, 48}, {243, 48}, {119, 48}}, - {{240, 5}, {118, 5}, {117, 5}}, - {{240, 5}, {242, 5}, {118, 5}}, - {{239, 49}, {117, 49}, {112, 49}}, - {{239, 49}, {240, 49}, {117, 49}}, - {{236, 50}, {111, 50}, {109, 50}}, - {{236, 51}, {112, 51}, {111, 51}}, - {{236, 51}, {239, 51}, {112, 51}}, - {{234, 52}, {109, 52}, {107, 52}}, - {{234, 50}, {236, 50}, {109, 50}}, - {{232, 52}, {234, 52}, {107, 52}}, - {{230, 53}, {105, 53}, {104, 53}}, - {{230, 54}, {107, 54}, {105, 54}}, - {{230, 54}, {232, 54}, {107, 54}}, - {{228, 53}, {230, 53}, {104, 53}}, - {{229, 55}, {104, 55}, {103, 55}}, - {{229, 55}, {228, 55}, {104, 55}}, - {{231, 56}, {103, 56}, {106, 56}}, - {{231, 56}, {229, 56}, {103, 56}}, - {{233, 57}, {108, 57}, {110, 57}}, - {{233, 1}, {106, 1}, {108, 1}}, - {{233, 1}, {231, 1}, {106, 1}}, - {{235, 57}, {233, 57}, {110, 57}}, - {{237, 58}, {235, 58}, {110, 58}}, - {{237, 59}, {116, 59}, {113, 59}}, - {{237, 58}, {110, 58}, {116, 58}}, - {{238, 59}, {237, 59}, {113, 59}}, - {{241, 60}, {238, 60}, {113, 60}}, - {{241, 60}, {113, 60}, {115, 60}}, - {{206, 0}, {246, 0}, {197, 0}}, - {{246, 0}, {247, 0}, {197, 0}}, - {{206, 0}, {248, 0}, {246, 0}}, - {{247, 0}, {249, 0}, {197, 0}}, - {{206, 0}, {250, 0}, {248, 0}}, - {{206, 0}, {218, 0}, {250, 0}}, - {{251, 0}, {145, 0}, {249, 0}}, - {{249, 0}, {145, 0}, {197, 0}}, - {{218, 0}, {252, 0}, {250, 0}}, - {{251, 0}, {253, 0}, {145, 0}}, - {{218, 0}, {254, 0}, {252, 0}}, - {{253, 0}, {255, 0}, {145, 0}}, - {{254, 0}, {227, 0}, {256, 0}}, - {{218, 0}, {227, 0}, {254, 0}}, - {{227, 0}, {257, 0}, {256, 0}}, - {{258, 0}, {146, 0}, {255, 0}}, - {{255, 0}, {146, 0}, {145, 0}}, - {{258, 0}, {259, 0}, {146, 0}}, - {{260, 0}, {167, 0}, {261, 0}}, - {{261, 0}, {167, 0}, {259, 0}}, - {{259, 0}, {167, 0}, {146, 0}}, - {{257, 0}, {166, 0}, {262, 0}}, - {{262, 0}, {166, 0}, {263, 0}}, - {{263, 0}, {166, 0}, {260, 0}}, - {{227, 0}, {166, 0}, {257, 0}}, - {{260, 0}, {166, 0}, {167, 0}}, - {{248, 9}, {250, 9}, {151, 9}}, - {{248, 9}, {151, 9}, {149, 9}}, - {{246, 11}, {147, 11}, {148, 11}}, - {{246, 10}, {149, 10}, {147, 10}}, - {{246, 10}, {248, 10}, {149, 10}}, - {{247, 11}, {246, 11}, {148, 11}}, - {{249, 12}, {148, 12}, {150, 12}}, - {{249, 12}, {247, 12}, {148, 12}}, - {{251, 7}, {150, 7}, {152, 7}}, - {{251, 7}, {249, 7}, {150, 7}}, - {{253, 14}, {152, 14}, {154, 14}}, - {{253, 14}, {251, 14}, {152, 14}}, - {{255, 15}, {156, 15}, {160, 15}}, - {{255, 13}, {154, 13}, {156, 13}}, - {{255, 13}, {253, 13}, {154, 13}}, - {{258, 16}, {160, 16}, {159, 16}}, - {{258, 15}, {255, 15}, {160, 15}}, - {{259, 16}, {258, 16}, {159, 16}}, - {{261, 18}, {162, 18}, {161, 18}}, - {{261, 17}, {159, 17}, {162, 17}}, - {{261, 17}, {259, 17}, {159, 17}}, - {{260, 18}, {261, 18}, {161, 18}}, - {{263, 19}, {161, 19}, {164, 19}}, - {{263, 19}, {260, 19}, {161, 19}}, - {{262, 20}, {164, 20}, {163, 20}}, - {{262, 20}, {263, 20}, {164, 20}}, - {{257, 21}, {158, 21}, {157, 21}}, - {{257, 3}, {163, 3}, {158, 3}}, - {{257, 3}, {262, 3}, {163, 3}}, - {{256, 21}, {257, 21}, {157, 21}}, - {{254, 22}, {256, 22}, {157, 22}}, - {{254, 23}, {155, 23}, {153, 23}}, - {{254, 22}, {157, 22}, {155, 22}}, - {{252, 23}, {254, 23}, {153, 23}}, - {{250, 24}, {252, 24}, {153, 24}}, - {{250, 24}, {153, 24}, {151, 24}}, + + constexpr face_vn faces[] = { + {{ 0, 0}, { 1, 0}, { 2, 0}}, + {{ 1, 0}, { 3, 0}, { 2, 0}}, + {{ 0, 0}, { 4, 0}, { 1, 0}}, + {{ 3, 0}, { 5, 0}, { 2, 0}}, + {{ 6, 0}, { 7, 0}, { 0, 0}}, + {{ 0, 0}, { 7, 0}, { 4, 0}}, + {{ 2, 0}, { 8, 0}, { 9, 0}}, + {{ 5, 0}, { 8, 0}, { 2, 0}}, + {{ 6, 0}, { 10, 0}, { 7, 0}}, + {{ 8, 0}, { 11, 0}, { 9, 0}}, + {{ 6, 0}, { 12, 0}, { 10, 0}}, + {{ 11, 0}, { 13, 0}, { 9, 0}}, + {{ 12, 0}, { 14, 0}, { 15, 0}}, + {{ 15, 0}, { 14, 0}, { 16, 0}}, + {{ 6, 0}, { 14, 0}, { 12, 0}}, + {{ 17, 0}, { 18, 0}, { 19, 0}}, + {{ 19, 0}, { 18, 0}, { 13, 0}}, + {{ 13, 0}, { 18, 0}, { 9, 0}}, + {{ 20, 0}, { 21, 0}, { 22, 0}}, + {{ 22, 0}, { 21, 0}, { 17, 0}}, + {{ 17, 0}, { 21, 0}, { 18, 0}}, + {{ 16, 0}, { 23, 0}, { 24, 0}}, + {{ 24, 0}, { 23, 0}, { 25, 0}}, + {{ 25, 0}, { 23, 0}, { 20, 0}}, + {{ 14, 0}, { 23, 0}, { 16, 0}}, + {{ 20, 0}, { 23, 0}, { 21, 0}}, + {{ 26, 1}, { 21, 1}, { 27, 1}}, + {{ 28, 1}, { 26, 1}, { 27, 1}}, + {{ 29, 1}, { 21, 1}, { 26, 1}}, + {{ 30, 1}, { 28, 1}, { 27, 1}}, + {{ 31, 1}, { 18, 1}, { 21, 1}}, + {{ 31, 1}, { 21, 1}, { 29, 1}}, + {{ 32, 1}, { 27, 1}, { 33, 1}}, + {{ 32, 1}, { 30, 1}, { 27, 1}}, + {{ 34, 1}, { 18, 1}, { 31, 1}}, + {{ 35, 1}, { 32, 1}, { 33, 1}}, + {{ 36, 1}, { 18, 1}, { 34, 1}}, + {{ 37, 1}, { 35, 1}, { 33, 1}}, + {{ 38, 1}, { 39, 1}, { 40, 1}}, + {{ 38, 1}, { 40, 1}, { 37, 1}}, + {{ 38, 1}, { 37, 1}, { 33, 1}}, + {{ 41, 1}, { 36, 1}, { 42, 1}}, + {{ 41, 1}, { 42, 1}, { 43, 1}}, + {{ 41, 1}, { 18, 1}, { 36, 1}}, + {{ 44, 1}, { 45, 1}, { 46, 1}}, + {{ 44, 1}, { 46, 1}, { 39, 1}}, + {{ 44, 1}, { 39, 1}, { 38, 1}}, + {{ 47, 1}, { 43, 1}, { 48, 1}}, + {{ 47, 1}, { 48, 1}, { 49, 1}}, + {{ 47, 1}, { 49, 1}, { 45, 1}}, + {{ 47, 1}, { 41, 1}, { 43, 1}}, + {{ 47, 1}, { 45, 1}, { 44, 1}}, + {{ 50, 2}, { 9, 2}, { 18, 2}}, + {{ 50, 2}, { 51, 2}, { 9, 2}}, + {{ 52, 2}, { 9, 2}, { 51, 2}}, + {{ 52, 2}, { 50, 2}, { 18, 2}}, + {{ 41, 2}, { 9, 2}, { 52, 2}}, + {{ 41, 2}, { 52, 2}, { 18, 2}}, + {{ 53, 3}, { 54, 3}, { 2, 3}}, + {{ 53, 3}, { 2, 3}, { 55, 3}}, + {{ 56, 3}, { 55, 3}, { 2, 3}}, + {{ 57, 3}, { 54, 3}, { 53, 3}}, + {{ 58, 3}, { 2, 3}, { 9, 3}}, + {{ 58, 3}, { 56, 3}, { 2, 3}}, + {{ 59, 3}, { 60, 3}, { 54, 3}}, + {{ 59, 3}, { 54, 3}, { 57, 3}}, + {{ 61, 3}, { 58, 3}, { 9, 3}}, + {{ 62, 3}, { 60, 3}, { 59, 3}}, + {{ 63, 3}, { 61, 3}, { 9, 3}}, + {{ 64, 3}, { 63, 3}, { 9, 3}}, + {{ 65, 3}, { 66, 3}, { 67, 3}}, + {{ 65, 3}, { 68, 3}, { 66, 3}}, + {{ 65, 3}, { 62, 3}, { 68, 3}}, + {{ 65, 3}, { 60, 3}, { 62, 3}}, + {{ 41, 3}, { 69, 3}, { 64, 3}}, + {{ 41, 3}, { 70, 3}, { 69, 3}}, + {{ 41, 3}, { 64, 3}, { 9, 3}}, + {{ 47, 3}, { 71, 3}, { 70, 3}}, + {{ 47, 3}, { 70, 3}, { 41, 3}}, + {{ 72, 3}, { 73, 3}, { 71, 3}}, + {{ 72, 3}, { 74, 3}, { 73, 3}}, + {{ 72, 3}, { 67, 3}, { 74, 3}}, + {{ 72, 3}, { 65, 3}, { 67, 3}}, + {{ 72, 3}, { 71, 3}, { 47, 3}}, + {{ 75, 4}, { 54, 4}, { 76, 4}}, + {{ 76, 4}, { 54, 4}, { 0, 4}}, + {{ 76, 4}, { 2, 4}, { 77, 4}}, + {{ 77, 4}, { 2, 4}, { 75, 4}}, + {{ 0, 4}, { 2, 4}, { 76, 4}}, + {{ 75, 4}, { 2, 4}, { 54, 4}}, + {{ 6, 5}, { 78, 5}, { 79, 5}}, + {{ 78, 5}, { 80, 5}, { 79, 5}}, + {{ 6, 5}, { 81, 5}, { 78, 5}}, + {{ 79, 5}, { 82, 5}, { 83, 5}}, + {{ 80, 5}, { 82, 5}, { 79, 5}}, + {{ 0, 5}, { 84, 5}, { 6, 5}}, + {{ 6, 5}, { 84, 5}, { 81, 5}}, + {{ 82, 5}, { 85, 5}, { 83, 5}}, + {{ 0, 5}, { 86, 5}, { 84, 5}}, + {{ 85, 5}, { 87, 5}, { 83, 5}}, + {{ 0, 5}, { 88, 5}, { 86, 5}}, + {{ 87, 5}, { 89, 5}, { 83, 5}}, + {{ 90, 5}, { 91, 5}, { 92, 5}}, + {{ 92, 5}, { 91, 5}, { 89, 5}}, + {{ 89, 5}, { 91, 5}, { 83, 5}}, + {{ 88, 5}, { 54, 5}, { 93, 5}}, + {{ 93, 5}, { 54, 5}, { 94, 5}}, + {{ 0, 5}, { 54, 5}, { 88, 5}}, + {{ 95, 5}, { 96, 5}, { 97, 5}}, + {{ 97, 5}, { 96, 5}, { 90, 5}}, + {{ 90, 5}, { 96, 5}, { 91, 5}}, + {{ 94, 5}, { 60, 5}, { 98, 5}}, + {{ 98, 5}, { 60, 5}, { 99, 5}}, + {{ 99, 5}, { 60, 5}, { 95, 5}}, + {{ 54, 5}, { 60, 5}, { 94, 5}}, + {{ 95, 5}, { 60, 5}, { 96, 5}}, + {{ 6, 6}, {100, 6}, {101, 6}}, + {{ 6, 6}, { 79, 6}, {100, 6}}, + {{102, 6}, { 14, 6}, {101, 6}}, + {{100, 6}, { 14, 6}, {102, 6}}, + {{101, 6}, { 14, 6}, { 6, 6}}, + {{ 79, 6}, { 14, 6}, {100, 6}}, + {{ 79, 7}, {103, 7}, { 14, 7}}, + {{ 14, 7}, {103, 7}, {104, 7}}, + {{104, 7}, {105, 7}, { 14, 7}}, + {{ 83, 7}, {106, 7}, { 79, 7}}, + {{ 79, 7}, {106, 7}, {103, 7}}, + {{ 14, 7}, {107, 7}, { 23, 7}}, + {{105, 7}, {107, 7}, { 14, 7}}, + {{ 83, 7}, {108, 7}, {106, 7}}, + {{107, 7}, {109, 7}, { 23, 7}}, + {{ 83, 7}, {110, 7}, {108, 7}}, + {{109, 7}, {111, 7}, { 23, 7}}, + {{111, 7}, {112, 7}, { 23, 7}}, + {{113, 7}, {114, 7}, {115, 7}}, + {{116, 7}, {114, 7}, {113, 7}}, + {{110, 7}, {114, 7}, {116, 7}}, + {{ 83, 7}, {114, 7}, {110, 7}}, + {{117, 7}, { 27, 7}, {112, 7}}, + {{112, 7}, { 27, 7}, { 23, 7}}, + {{118, 7}, { 33, 7}, {117, 7}}, + {{119, 7}, { 33, 7}, {118, 7}}, + {{117, 7}, { 33, 7}, { 27, 7}}, + {{120, 7}, {121, 7}, {119, 7}}, + {{122, 7}, {121, 7}, {120, 7}}, + {{115, 7}, {121, 7}, {122, 7}}, + {{119, 7}, {121, 7}, { 33, 7}}, + {{114, 7}, {121, 7}, {115, 7}}, + {{123, 8}, { 21, 8}, { 23, 8}}, + {{123, 8}, { 23, 8}, {124, 8}}, + {{125, 8}, {124, 8}, { 23, 8}}, + {{ 27, 8}, {125, 8}, { 23, 8}}, + {{ 27, 8}, { 21, 8}, {123, 8}}, + {{ 27, 8}, {123, 8}, {125, 8}}, + {{ 4, 9}, { 7, 9}, {126, 9}}, + {{ 4, 9}, {126, 9}, {127, 9}}, + {{ 1, 10}, {127, 10}, {128, 10}}, + {{ 1, 10}, { 4, 10}, {127, 10}}, + {{ 3, 11}, {128, 11}, {129, 11}}, + {{ 3, 11}, { 1, 11}, {128, 11}}, + {{ 5, 12}, {129, 12}, {130, 12}}, + {{ 5, 12}, { 3, 12}, {129, 12}}, + {{ 8, 7}, {130, 7}, {131, 7}}, + {{ 8, 7}, { 5, 7}, {130, 7}}, + {{ 11, 13}, {132, 13}, {133, 13}}, + {{ 11, 14}, {131, 14}, {132, 14}}, + {{ 11, 14}, { 8, 14}, {131, 14}}, + {{ 13, 15}, {133, 15}, {134, 15}}, + {{ 13, 13}, { 11, 13}, {133, 13}}, + {{ 19, 16}, {134, 16}, {135, 16}}, + {{ 19, 15}, { 13, 15}, {134, 15}}, + {{ 17, 17}, {135, 17}, {136, 17}}, + {{ 17, 16}, { 19, 16}, {135, 16}}, + {{ 22, 17}, { 17, 17}, {136, 17}}, + {{ 20, 18}, {136, 18}, {137, 18}}, + {{ 20, 18}, { 22, 18}, {136, 18}}, + {{ 25, 19}, {137, 19}, {138, 19}}, + {{ 25, 19}, { 20, 19}, {137, 19}}, + {{ 24, 3}, {139, 3}, {140, 3}}, + {{ 24, 20}, {138, 20}, {139, 20}}, + {{ 24, 20}, { 25, 20}, {138, 20}}, + {{ 16, 3}, { 24, 3}, {140, 3}}, + {{ 15, 21}, { 16, 21}, {140, 21}}, + {{ 15, 21}, {140, 21}, {141, 21}}, + {{ 12, 22}, { 15, 22}, {141, 22}}, + {{ 12, 23}, {142, 23}, {143, 23}}, + {{ 12, 22}, {141, 22}, {142, 22}}, + {{ 10, 23}, { 12, 23}, {143, 23}}, + {{ 7, 24}, { 10, 24}, {143, 24}}, + {{ 7, 24}, {143, 24}, {126, 24}}, + {{144, 25}, { 72, 25}, { 47, 25}}, + {{144, 25}, {145, 25}, { 72, 25}}, + {{146, 25}, { 72, 25}, {145, 25}}, + {{ 44, 25}, {146, 25}, {144, 25}}, + {{ 44, 25}, { 72, 25}, {146, 25}}, + {{ 44, 25}, {144, 25}, { 47, 25}}, + {{147, 26}, { 96, 26}, { 65, 26}}, + {{148, 26}, {147, 26}, { 65, 26}}, + {{149, 26}, { 96, 26}, {147, 26}}, + {{150, 26}, {148, 26}, { 65, 26}}, + {{ 72, 26}, {150, 26}, { 65, 26}}, + {{151, 26}, { 91, 26}, { 96, 26}}, + {{151, 26}, { 96, 26}, {149, 26}}, + {{152, 26}, {150, 26}, { 72, 26}}, + {{153, 26}, { 91, 26}, {151, 26}}, + {{154, 26}, {152, 26}, { 72, 26}}, + {{155, 26}, { 91, 26}, {153, 26}}, + {{156, 26}, {154, 26}, { 72, 26}}, + {{114, 26}, {155, 26}, {157, 26}}, + {{114, 26}, {157, 26}, {158, 26}}, + {{114, 26}, { 91, 26}, {155, 26}}, + {{ 44, 26}, {159, 26}, {160, 26}}, + {{ 44, 26}, {160, 26}, {156, 26}}, + {{ 44, 26}, {156, 26}, { 72, 26}}, + {{ 38, 26}, {161, 26}, {162, 26}}, + {{ 38, 26}, {162, 26}, {159, 26}}, + {{ 38, 26}, {159, 26}, { 44, 26}}, + {{121, 26}, {158, 26}, {163, 26}}, + {{121, 26}, {163, 26}, {164, 26}}, + {{121, 26}, {164, 26}, {161, 26}}, + {{121, 26}, {114, 26}, {158, 26}}, + {{121, 26}, {161, 26}, { 38, 26}}, + {{165, 27}, { 33, 27}, {121, 27}}, + {{165, 27}, {121, 27}, {166, 27}}, + {{167, 27}, {166, 27}, {121, 27}}, + {{ 38, 27}, {167, 27}, {121, 27}}, + {{ 38, 27}, { 33, 27}, {165, 27}}, + {{ 38, 27}, {165, 27}, {167, 27}}, + {{168, 28}, {169, 28}, { 39, 28}}, + {{168, 28}, { 39, 28}, { 46, 28}}, + {{170, 29}, { 45, 29}, { 49, 29}}, + {{170, 30}, { 46, 30}, { 45, 30}}, + {{170, 30}, {168, 30}, { 46, 30}}, + {{171, 29}, {170, 29}, { 49, 29}}, + {{172, 31}, { 49, 31}, { 48, 31}}, + {{172, 31}, {171, 31}, { 49, 31}}, + {{173, 7}, { 48, 7}, { 43, 7}}, + {{173, 7}, {172, 7}, { 48, 7}}, + {{174, 32}, { 43, 32}, { 42, 32}}, + {{174, 32}, {173, 32}, { 43, 32}}, + {{175, 33}, { 36, 33}, { 34, 33}}, + {{175, 34}, { 42, 34}, { 36, 34}}, + {{175, 34}, {174, 34}, { 42, 34}}, + {{176, 35}, { 34, 35}, { 31, 35}}, + {{176, 33}, {175, 33}, { 34, 33}}, + {{177, 35}, {176, 35}, { 31, 35}}, + {{178, 36}, { 29, 36}, { 26, 36}}, + {{178, 37}, { 31, 37}, { 29, 37}}, + {{178, 37}, {177, 37}, { 31, 37}}, + {{179, 36}, {178, 36}, { 26, 36}}, + {{180, 38}, { 26, 38}, { 28, 38}}, + {{180, 38}, {179, 38}, { 26, 38}}, + {{181, 39}, { 28, 39}, { 30, 39}}, + {{181, 39}, {180, 39}, { 28, 39}}, + {{182, 40}, { 32, 40}, { 35, 40}}, + {{182, 3}, { 30, 3}, { 32, 3}}, + {{182, 3}, {181, 3}, { 30, 3}}, + {{183, 40}, {182, 40}, { 35, 40}}, + {{184, 41}, {183, 41}, { 35, 41}}, + {{184, 42}, { 37, 42}, { 40, 42}}, + {{184, 41}, { 35, 41}, { 37, 41}}, + {{185, 42}, {184, 42}, { 40, 42}}, + {{169, 43}, {185, 43}, { 40, 43}}, + {{169, 43}, { 40, 43}, { 39, 43}}, + {{128, 26}, { 76, 26}, { 77, 26}}, + {{129, 26}, {128, 26}, { 77, 26}}, + {{127, 26}, { 76, 26}, {128, 26}}, + {{130, 26}, {129, 26}, { 77, 26}}, + {{126, 26}, { 76, 26}, {127, 26}}, + {{101, 26}, { 76, 26}, {126, 26}}, + {{ 51, 26}, {131, 26}, {130, 26}}, + {{ 51, 26}, {130, 26}, { 77, 26}}, + {{143, 26}, {101, 26}, {126, 26}}, + {{132, 26}, {131, 26}, { 51, 26}}, + {{142, 26}, {101, 26}, {143, 26}}, + {{133, 26}, {132, 26}, { 51, 26}}, + {{102, 26}, {142, 26}, {141, 26}}, + {{102, 26}, {101, 26}, {142, 26}}, + {{140, 26}, {102, 26}, {141, 26}}, + {{ 50, 26}, {134, 26}, {133, 26}}, + {{ 50, 26}, {133, 26}, { 51, 26}}, + {{135, 26}, {134, 26}, { 50, 26}}, + {{139, 26}, {102, 26}, {140, 26}}, + {{123, 26}, {137, 26}, {136, 26}}, + {{123, 26}, {136, 26}, {135, 26}}, + {{123, 26}, {135, 26}, { 50, 26}}, + {{124, 26}, {139, 26}, {138, 26}}, + {{124, 26}, {138, 26}, {137, 26}}, + {{124, 26}, {102, 26}, {139, 26}}, + {{124, 26}, {137, 26}, {123, 26}}, + {{123, 5}, {179, 5}, {125, 5}}, + {{179, 5}, {180, 5}, {125, 5}}, + {{123, 5}, {178, 5}, {179, 5}}, + {{180, 5}, {181, 5}, {125, 5}}, + {{123, 5}, {177, 5}, {178, 5}}, + {{123, 5}, { 50, 5}, {177, 5}}, + {{125, 5}, {182, 5}, {165, 5}}, + {{181, 5}, {182, 5}, {125, 5}}, + {{ 50, 5}, {176, 5}, {177, 5}}, + {{182, 5}, {183, 5}, {165, 5}}, + {{ 50, 5}, {175, 5}, {176, 5}}, + {{183, 5}, {184, 5}, {165, 5}}, + {{185, 5}, {167, 5}, {184, 5}}, + {{184, 5}, {167, 5}, {165, 5}}, + {{175, 5}, { 52, 5}, {174, 5}}, + {{174, 5}, { 52, 5}, {173, 5}}, + {{ 50, 5}, { 52, 5}, {175, 5}}, + {{185, 5}, {169, 5}, {167, 5}}, + {{ 52, 5}, {172, 5}, {173, 5}}, + {{170, 5}, {146, 5}, {168, 5}}, + {{168, 5}, {146, 5}, {169, 5}}, + {{169, 5}, {146, 5}, {167, 5}}, + {{172, 5}, {144, 5}, {171, 5}}, + {{171, 5}, {144, 5}, {170, 5}}, + {{ 52, 5}, {144, 5}, {172, 5}}, + {{170, 5}, {144, 5}, {146, 5}}, + {{ 75, 7}, {186, 7}, { 77, 7}}, + {{ 75, 7}, {187, 7}, {186, 7}}, + {{186, 7}, {188, 7}, { 77, 7}}, + {{ 75, 7}, {189, 7}, {187, 7}}, + {{188, 7}, {190, 7}, { 77, 7}}, + {{191, 7}, {192, 7}, { 75, 7}}, + {{ 75, 7}, {192, 7}, {189, 7}}, + {{190, 7}, { 51, 7}, { 77, 7}}, + {{190, 7}, {193, 7}, { 51, 7}}, + {{191, 7}, {194, 7}, {192, 7}}, + {{193, 7}, {195, 7}, { 51, 7}}, + {{191, 7}, {196, 7}, {194, 7}}, + {{196, 7}, {197, 7}, {198, 7}}, + {{191, 7}, {197, 7}, {196, 7}}, + {{199, 7}, { 52, 7}, {195, 7}}, + {{200, 7}, { 52, 7}, {199, 7}}, + {{195, 7}, { 52, 7}, { 51, 7}}, + {{197, 7}, {201, 7}, {198, 7}}, + {{200, 7}, {202, 7}, { 52, 7}}, + {{203, 7}, {144, 7}, {202, 7}}, + {{204, 7}, {144, 7}, {203, 7}}, + {{202, 7}, {144, 7}, { 52, 7}}, + {{205, 7}, {145, 7}, {204, 7}}, + {{201, 7}, {145, 7}, {205, 7}}, + {{204, 7}, {145, 7}, {144, 7}}, + {{197, 7}, {145, 7}, {201, 7}}, + {{206, 44}, { 96, 44}, {191, 44}}, + {{191, 44}, { 96, 44}, { 60, 44}}, + {{191, 44}, { 65, 44}, {197, 44}}, + {{197, 44}, { 65, 44}, {206, 44}}, + {{ 60, 44}, { 65, 44}, {191, 44}}, + {{206, 44}, { 65, 44}, { 96, 44}}, + {{ 74, 45}, { 67, 45}, {201, 45}}, + {{ 74, 45}, {201, 45}, {205, 45}}, + {{ 73, 46}, {204, 46}, {203, 46}}, + {{ 73, 47}, {205, 47}, {204, 47}}, + {{ 73, 47}, { 74, 47}, {205, 47}}, + {{ 71, 46}, { 73, 46}, {203, 46}}, + {{ 70, 48}, {203, 48}, {202, 48}}, + {{ 70, 48}, { 71, 48}, {203, 48}}, + {{ 69, 5}, {202, 5}, {200, 5}}, + {{ 69, 5}, { 70, 5}, {202, 5}}, + {{ 64, 49}, {200, 49}, {199, 49}}, + {{ 64, 49}, { 69, 49}, {200, 49}}, + {{ 63, 50}, {195, 50}, {193, 50}}, + {{ 63, 51}, {199, 51}, {195, 51}}, + {{ 63, 51}, { 64, 51}, {199, 51}}, + {{ 61, 52}, {193, 52}, {190, 52}}, + {{ 61, 50}, { 63, 50}, {193, 50}}, + {{ 58, 52}, { 61, 52}, {190, 52}}, + {{ 56, 53}, {188, 53}, {186, 53}}, + {{ 56, 54}, {190, 54}, {188, 54}}, + {{ 56, 54}, { 58, 54}, {190, 54}}, + {{ 55, 53}, { 56, 53}, {186, 53}}, + {{ 53, 55}, {186, 55}, {187, 55}}, + {{ 53, 55}, { 55, 55}, {186, 55}}, + {{ 57, 56}, {187, 56}, {189, 56}}, + {{ 57, 56}, { 53, 56}, {187, 56}}, + {{ 59, 57}, {192, 57}, {194, 57}}, + {{ 59, 1}, {189, 1}, {192, 1}}, + {{ 59, 1}, { 57, 1}, {189, 1}}, + {{ 62, 57}, { 59, 57}, {194, 57}}, + {{ 68, 58}, { 62, 58}, {194, 58}}, + {{ 68, 59}, {196, 59}, {198, 59}}, + {{ 68, 58}, {194, 58}, {196, 58}}, + {{ 66, 59}, { 68, 59}, {198, 59}}, + {{ 67, 60}, { 66, 60}, {198, 60}}, + {{ 67, 60}, {198, 60}, {201, 60}}, + {{207, 1}, {101, 1}, {100, 1}}, + {{208, 1}, {207, 1}, {100, 1}}, + {{209, 1}, {101, 1}, {207, 1}}, + {{210, 1}, {208, 1}, {100, 1}}, + {{211, 1}, {101, 1}, {209, 1}}, + {{ 76, 1}, {101, 1}, {211, 1}}, + {{212, 1}, {100, 1}, {213, 1}}, + {{212, 1}, {210, 1}, {100, 1}}, + {{214, 1}, { 76, 1}, {211, 1}}, + {{215, 1}, {212, 1}, {213, 1}}, + {{216, 1}, { 76, 1}, {214, 1}}, + {{217, 1}, {215, 1}, {213, 1}}, + {{218, 1}, {219, 1}, {217, 1}}, + {{218, 1}, {217, 1}, {213, 1}}, + {{ 75, 1}, {216, 1}, {220, 1}}, + {{ 75, 1}, {220, 1}, {221, 1}}, + {{ 75, 1}, { 76, 1}, {216, 1}}, + {{222, 1}, {219, 1}, {218, 1}}, + {{223, 1}, { 75, 1}, {221, 1}}, + {{206, 1}, {224, 1}, {225, 1}}, + {{206, 1}, {225, 1}, {222, 1}}, + {{206, 1}, {222, 1}, {218, 1}}, + {{191, 1}, {223, 1}, {226, 1}}, + {{191, 1}, {226, 1}, {224, 1}}, + {{191, 1}, { 75, 1}, {223, 1}}, + {{191, 1}, {224, 1}, {206, 1}}, + {{213, 61}, { 91, 61}, {218, 61}}, + {{ 83, 61}, { 91, 61}, {213, 61}}, + {{227, 61}, {114, 61}, {213, 61}}, + {{218, 61}, {114, 61}, {227, 61}}, + {{213, 61}, {114, 61}, { 83, 61}}, + {{ 91, 61}, {114, 61}, {218, 61}}, + {{ 97, 28}, { 90, 28}, {222, 28}}, + {{ 97, 28}, {222, 28}, {225, 28}}, + {{ 95, 29}, {224, 29}, {226, 29}}, + {{ 95, 30}, {225, 30}, {224, 30}}, + {{ 95, 30}, { 97, 30}, {225, 30}}, + {{ 99, 29}, { 95, 29}, {226, 29}}, + {{ 98, 31}, {226, 31}, {223, 31}}, + {{ 98, 31}, { 99, 31}, {226, 31}}, + {{ 94, 7}, {223, 7}, {221, 7}}, + {{ 94, 7}, { 98, 7}, {223, 7}}, + {{ 93, 32}, {221, 32}, {220, 32}}, + {{ 93, 32}, { 94, 32}, {221, 32}}, + {{ 88, 33}, {216, 33}, {214, 33}}, + {{ 88, 34}, {220, 34}, {216, 34}}, + {{ 88, 34}, { 93, 34}, {220, 34}}, + {{ 86, 35}, {214, 35}, {211, 35}}, + {{ 86, 33}, { 88, 33}, {214, 33}}, + {{ 84, 35}, { 86, 35}, {211, 35}}, + {{ 81, 36}, {209, 36}, {207, 36}}, + {{ 81, 37}, {211, 37}, {209, 37}}, + {{ 81, 37}, { 84, 37}, {211, 37}}, + {{ 78, 36}, { 81, 36}, {207, 36}}, + {{ 80, 38}, {207, 38}, {208, 38}}, + {{ 80, 38}, { 78, 38}, {207, 38}}, + {{ 82, 39}, {208, 39}, {210, 39}}, + {{ 82, 39}, { 80, 39}, {208, 39}}, + {{ 85, 40}, {212, 40}, {215, 40}}, + {{ 85, 3}, {210, 3}, {212, 3}}, + {{ 85, 3}, { 82, 3}, {210, 3}}, + {{ 87, 40}, { 85, 40}, {215, 40}}, + {{ 89, 41}, { 87, 41}, {215, 41}}, + {{ 89, 42}, {217, 42}, {219, 42}}, + {{ 89, 41}, {215, 41}, {217, 41}}, + {{ 92, 42}, { 89, 42}, {219, 42}}, + {{ 90, 43}, { 92, 43}, {219, 43}}, + {{ 90, 43}, {219, 43}, {222, 43}}, + {{228, 3}, {100, 3}, {102, 3}}, + {{229, 3}, {100, 3}, {228, 3}}, + {{230, 3}, {228, 3}, {102, 3}}, + {{231, 3}, {100, 3}, {229, 3}}, + {{232, 3}, {230, 3}, {102, 3}}, + {{233, 3}, {213, 3}, {100, 3}}, + {{233, 3}, {100, 3}, {231, 3}}, + {{124, 3}, {232, 3}, {102, 3}}, + {{234, 3}, {232, 3}, {124, 3}}, + {{235, 3}, {213, 3}, {233, 3}}, + {{236, 3}, {234, 3}, {124, 3}}, + {{237, 3}, {213, 3}, {235, 3}}, + {{227, 3}, {237, 3}, {238, 3}}, + {{227, 3}, {213, 3}, {237, 3}}, + {{125, 3}, {239, 3}, {236, 3}}, + {{125, 3}, {240, 3}, {239, 3}}, + {{125, 3}, {236, 3}, {124, 3}}, + {{241, 3}, {227, 3}, {238, 3}}, + {{242, 3}, {240, 3}, {125, 3}}, + {{165, 3}, {243, 3}, {242, 3}}, + {{165, 3}, {244, 3}, {243, 3}}, + {{165, 3}, {242, 3}, {125, 3}}, + {{166, 3}, {245, 3}, {244, 3}}, + {{166, 3}, {241, 3}, {245, 3}}, + {{166, 3}, {227, 3}, {241, 3}}, + {{166, 3}, {244, 3}, {165, 3}}, + {{245, 45}, {241, 45}, {115, 45}}, + {{245, 45}, {115, 45}, {122, 45}}, + {{244, 46}, {120, 46}, {119, 46}}, + {{244, 47}, {122, 47}, {120, 47}}, + {{244, 47}, {245, 47}, {122, 47}}, + {{243, 46}, {244, 46}, {119, 46}}, + {{242, 48}, {119, 48}, {118, 48}}, + {{242, 48}, {243, 48}, {119, 48}}, + {{240, 5}, {118, 5}, {117, 5}}, + {{240, 5}, {242, 5}, {118, 5}}, + {{239, 49}, {117, 49}, {112, 49}}, + {{239, 49}, {240, 49}, {117, 49}}, + {{236, 50}, {111, 50}, {109, 50}}, + {{236, 51}, {112, 51}, {111, 51}}, + {{236, 51}, {239, 51}, {112, 51}}, + {{234, 52}, {109, 52}, {107, 52}}, + {{234, 50}, {236, 50}, {109, 50}}, + {{232, 52}, {234, 52}, {107, 52}}, + {{230, 53}, {105, 53}, {104, 53}}, + {{230, 54}, {107, 54}, {105, 54}}, + {{230, 54}, {232, 54}, {107, 54}}, + {{228, 53}, {230, 53}, {104, 53}}, + {{229, 55}, {104, 55}, {103, 55}}, + {{229, 55}, {228, 55}, {104, 55}}, + {{231, 56}, {103, 56}, {106, 56}}, + {{231, 56}, {229, 56}, {103, 56}}, + {{233, 57}, {108, 57}, {110, 57}}, + {{233, 1}, {106, 1}, {108, 1}}, + {{233, 1}, {231, 1}, {106, 1}}, + {{235, 57}, {233, 57}, {110, 57}}, + {{237, 58}, {235, 58}, {110, 58}}, + {{237, 59}, {116, 59}, {113, 59}}, + {{237, 58}, {110, 58}, {116, 58}}, + {{238, 59}, {237, 59}, {113, 59}}, + {{241, 60}, {238, 60}, {113, 60}}, + {{241, 60}, {113, 60}, {115, 60}}, + {{206, 0}, {246, 0}, {197, 0}}, + {{246, 0}, {247, 0}, {197, 0}}, + {{206, 0}, {248, 0}, {246, 0}}, + {{247, 0}, {249, 0}, {197, 0}}, + {{206, 0}, {250, 0}, {248, 0}}, + {{206, 0}, {218, 0}, {250, 0}}, + {{251, 0}, {145, 0}, {249, 0}}, + {{249, 0}, {145, 0}, {197, 0}}, + {{218, 0}, {252, 0}, {250, 0}}, + {{251, 0}, {253, 0}, {145, 0}}, + {{218, 0}, {254, 0}, {252, 0}}, + {{253, 0}, {255, 0}, {145, 0}}, + {{254, 0}, {227, 0}, {256, 0}}, + {{218, 0}, {227, 0}, {254, 0}}, + {{227, 0}, {257, 0}, {256, 0}}, + {{258, 0}, {146, 0}, {255, 0}}, + {{255, 0}, {146, 0}, {145, 0}}, + {{258, 0}, {259, 0}, {146, 0}}, + {{260, 0}, {167, 0}, {261, 0}}, + {{261, 0}, {167, 0}, {259, 0}}, + {{259, 0}, {167, 0}, {146, 0}}, + {{257, 0}, {166, 0}, {262, 0}}, + {{262, 0}, {166, 0}, {263, 0}}, + {{263, 0}, {166, 0}, {260, 0}}, + {{227, 0}, {166, 0}, {257, 0}}, + {{260, 0}, {166, 0}, {167, 0}}, + {{248, 9}, {250, 9}, {151, 9}}, + {{248, 9}, {151, 9}, {149, 9}}, + {{246, 11}, {147, 11}, {148, 11}}, + {{246, 10}, {149, 10}, {147, 10}}, + {{246, 10}, {248, 10}, {149, 10}}, + {{247, 11}, {246, 11}, {148, 11}}, + {{249, 12}, {148, 12}, {150, 12}}, + {{249, 12}, {247, 12}, {148, 12}}, + {{251, 7}, {150, 7}, {152, 7}}, + {{251, 7}, {249, 7}, {150, 7}}, + {{253, 14}, {152, 14}, {154, 14}}, + {{253, 14}, {251, 14}, {152, 14}}, + {{255, 15}, {156, 15}, {160, 15}}, + {{255, 13}, {154, 13}, {156, 13}}, + {{255, 13}, {253, 13}, {154, 13}}, + {{258, 16}, {160, 16}, {159, 16}}, + {{258, 15}, {255, 15}, {160, 15}}, + {{259, 16}, {258, 16}, {159, 16}}, + {{261, 18}, {162, 18}, {161, 18}}, + {{261, 17}, {159, 17}, {162, 17}}, + {{261, 17}, {259, 17}, {159, 17}}, + {{260, 18}, {261, 18}, {161, 18}}, + {{263, 19}, {161, 19}, {164, 19}}, + {{263, 19}, {260, 19}, {161, 19}}, + {{262, 20}, {164, 20}, {163, 20}}, + {{262, 20}, {263, 20}, {164, 20}}, + {{257, 21}, {158, 21}, {157, 21}}, + {{257, 3}, {163, 3}, {158, 3}}, + {{257, 3}, {262, 3}, {163, 3}}, + {{256, 21}, {257, 21}, {157, 21}}, + {{254, 22}, {256, 22}, {157, 22}}, + {{254, 23}, {155, 23}, {153, 23}}, + {{254, 22}, {157, 22}, {155, 22}}, + {{252, 23}, {254, 23}, {153, 23}}, + {{250, 24}, {252, 24}, {153, 24}}, + {{250, 24}, {153, 24}, {151, 24}}, }; - - constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face)); - + + constexpr uint32_t num_faces = (sizeof (faces)) / (sizeof (face_vn)); + } diff --git a/holly/ta_bits.hpp b/holly/ta_bits.hpp index 1bf9ee6..ecf0723 100644 --- a/holly/ta_bits.hpp +++ b/holly/ta_bits.hpp @@ -1,3 +1,5 @@ +#pragma once + #include #include "../float_uint32.hpp" @@ -35,41 +37,53 @@ namespace ta_alloc_ctrl { namespace opb_mode { constexpr uint32_t increasing_addresses = 0 << 20; constexpr uint32_t decreasing_addresses = 1 << 20; + + constexpr uint32_t bit_mask = 0x1 << 20; } - + namespace pt_opb { constexpr uint32_t no_list = 0 << 16; constexpr uint32_t _8x4byte = 1 << 16; constexpr uint32_t _16x4byte = 2 << 16; constexpr uint32_t _32x4byte = 3 << 16; + + constexpr uint32_t bit_mask = 0x3 << 16; } - + namespace tm_opb { constexpr uint32_t no_list = 0 << 12; constexpr uint32_t _8x4byte = 1 << 12; constexpr uint32_t _16x4byte = 2 << 12; constexpr uint32_t _32x4byte = 3 << 12; + + constexpr uint32_t bit_mask = 0x3 << 12; } - + namespace t_opb { constexpr uint32_t no_list = 0 << 8; constexpr uint32_t _8x4byte = 1 << 8; constexpr uint32_t _16x4byte = 2 << 8; constexpr uint32_t _32x4byte = 3 << 8; + + constexpr uint32_t bit_mask = 0x3 << 8; } - + namespace om_opb { constexpr uint32_t no_list = 0 << 4; constexpr uint32_t _8x4byte = 1 << 4; constexpr uint32_t _16x4byte = 2 << 4; constexpr uint32_t _32x4byte = 3 << 4; + + constexpr uint32_t bit_mask = 0x3 << 4; } - + namespace o_opb { constexpr uint32_t no_list = 0 << 0; constexpr uint32_t _8x4byte = 1 << 0; constexpr uint32_t _16x4byte = 2 << 0; constexpr uint32_t _32x4byte = 3 << 0; + + constexpr uint32_t bit_mask = 0x3 << 0; } } @@ -85,13 +99,17 @@ namespace ta_yuv_tex_ctrl { namespace yuv_form { constexpr uint32_t yuv420 = 0 << 24; constexpr uint32_t yuv422 = 1 << 24; + + constexpr uint32_t bit_mask = 0x1 << 24; } - + namespace yuv_tex { constexpr uint32_t one_texture = 0 << 16; constexpr uint32_t multiple_textures = 1 << 16; + + constexpr uint32_t bit_mask = 0x1 << 16; } - + constexpr uint32_t yuv_v_size(uint32_t num) { return (num & 0x3f) << 8; } constexpr uint32_t yuv_u_size(uint32_t num) { return (num & 0x3f) << 0; } } diff --git a/maple/maple.cpp b/maple/maple.cpp index 0fbb854..a16b9af 100644 --- a/maple/maple.cpp +++ b/maple/maple.cpp @@ -3,8 +3,8 @@ #include "align.hpp" -#include "sh7091.hpp" -#include "sh7091_bits.hpp" +#include "sh7091/sh7091.hpp" +#include "sh7091/sh7091_bits.hpp" #include "systembus.hpp" #include "systembus_bits.hpp" @@ -97,9 +97,11 @@ void init_block_write(uint32_t * command_buf, uint32_t * receive_buf, void dma_start(uint32_t * command_buf) { - sh7091.DMAC.DMAOR = DMAOR__DDT // on-demand data transfer mode - | DMAOR__PR__CH2_CH0_CH1_CH3 // priority mode; CH2 > CH0 > CH1 > CH3 - | DMAOR__DME; // DMAC master enable + using namespace dmac; + + sh7091.DMAC.DMAOR = dmaor::ddt::on_demand_data_transfer_mode /* on-demand data transfer mode */ + | dmaor::pr::ch2_ch0_ch1_ch3 /* priority mode; CH2 > CH0 > CH1 > CH3 */ + | dmaor::dme::operation_enabled_on_all_channels; /* DMAC master enable */ // clear maple-DMA end status system.ISTNRM = ISTNRM__END_OF_DMA_MAPLE_DMA; diff --git a/maple/maple_impl.hpp b/maple/maple_impl.hpp index d777bce..2e3069d 100644 --- a/maple/maple_impl.hpp +++ b/maple/maple_impl.hpp @@ -43,4 +43,34 @@ void init_host_command_all_ports(uint32_t * command_buf, uint32_t * receive_buf, host_command[3].bus_data.data_fields = data_fields; } +template +void init_host_command_all_ports(uint32_t * command_buf, uint32_t * receive_buf) +{ + using command_type = maple::host_command; + using response_type = maple::command_response; + + auto host_command = reinterpret_cast(command_buf); + auto response_command = reinterpret_cast(receive_buf); + + init_host_command((uint32_t*)&host_command[0], (uint32_t*)&response_command[0], + host_instruction::port_select::a, // destination_port + ap::de::device | ap::port_select::a, C::command_code, (sizeof (typename C::data_fields)), + false); // end_flag + + init_host_command((uint32_t*)&host_command[1], (uint32_t*)&response_command[1], + host_instruction::port_select::b, // destination_port + ap::de::device | ap::port_select::b, C::command_code, (sizeof (typename C::data_fields)), + false); // end_flag + + init_host_command((uint32_t*)&host_command[2], (uint32_t*)&response_command[2], + host_instruction::port_select::c, // destination_port + ap::de::device | ap::port_select::c, C::command_code, (sizeof (typename C::data_fields)), + false); // end_flag + + init_host_command((uint32_t*)&host_command[3], (uint32_t*)&response_command[3], + host_instruction::port_select::d, // destination_port + ap::de::device | ap::port_select::d, C::command_code, (sizeof (typename C::data_fields)), + true); // end_flag +} + } diff --git a/math/vec2.hpp b/math/vec2.hpp index dc76b80..2366e9b 100644 --- a/math/vec2.hpp +++ b/math/vec2.hpp @@ -107,6 +107,12 @@ inline constexpr vec<2, T> operator*(vec<2, T> const& v1, T const& scalar) return v1 * vec<2, T>(scalar); } +template +inline constexpr vec<2, T> operator*(T const& scalar, vec<2, T> const& v1) +{ + return vec<2, T>(scalar) * v1; +} + template inline constexpr vec<2, T> operator/(vec<2, T> const& v1, vec<2, T> const& v2) { diff --git a/sh7091/serial.cpp b/sh7091/serial.cpp index ba028bc..8011fbf 100644 --- a/sh7091/serial.cpp +++ b/sh7091/serial.cpp @@ -9,24 +9,29 @@ namespace serial { void init() { + using namespace scif; + sh7091.SCIF.SCSCR2 = 0; sh7091.SCIF.SCSMR2 = 0; sh7091.SCIF.SCBRR2 = 1; // 520833.3 - sh7091.SCIF.SCFCR2 = SCFCR2__TFRST | SCFCR2__RFRST; + sh7091.SCIF.SCFCR2 = scfcr2::tfrst::reset_operation_enabled + | scfcr2::rfrst::reset_operation_enabled; // tx/rx trigger on 1 byte sh7091.SCIF.SCFCR2 = 0; sh7091.SCIF.SCSPTR2 = 0; sh7091.SCIF.SCLSR2 = 0; - sh7091.SCIF.SCSCR2 = SCSCR2__TE | SCSCR2__RE; + sh7091.SCIF.SCSCR2 = scscr2::te::transmission_enabled + | scscr2::re::reception_enabled; } void character(const char c) { + using namespace scif; // wait for transmit fifo to become empty - while ((sh7091.SCIF.SCFSR2 & SCFSR2__TDFE) == 0); + while ((sh7091.SCIF.SCFSR2 & scfsr2::tdfe::bit_mask) == 0); for (int i = 0; i < 100000; i++) { asm volatile ("nop;"); diff --git a/tools/obj_to_cpp.py b/tools/obj_to_cpp.py index 4ee6db6..12e6418 100644 --- a/tools/obj_to_cpp.py +++ b/tools/obj_to_cpp.py @@ -111,7 +111,7 @@ def generate_vertices(vertices): else: assert type(p_c) is Vertex p = p_c - yield f"{{ {v.x:9f}f, {v.y:9f}f, {v.z:9f}f }}," + yield f"{{ {p.x:9f}f, {p.y:9f}f, {p.z:9f}f }}," yield "};" yield ""