diff --git a/Makefile b/Makefile index e93b055..9e983af 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ triangle.elf: $(DEFAULT) arm9/triangle.bin.o triangle_rotating.elf: $(DEFAULT) arm9/triangle_rotating.bin.o texture.elf: $(DEFAULT) arm9/texture.bin.o cube.elf: $(DEFAULT) arm9/cube.bin.o +icosphere.elf: $(DEFAULT) arm9/icosphere.bin.o TARGET = arm-none-eabi- AARCH = -march=armv4t -mlittle-endian diff --git a/arm7/arm7.lds b/arm7/arm7.lds index 5c09ee8..9fe7410 100644 --- a/arm7/arm7.lds +++ b/arm7/arm7.lds @@ -6,7 +6,7 @@ MEMORY } SECTIONS { - . = ORIGIN(ram) + 0x8000; + . = ORIGIN(ram) + 0x390000; .text ALIGN(4) : { diff --git a/arm9/Makefile b/arm9/Makefile index 02fd1fb..1172c32 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -24,6 +24,8 @@ texture.elf: start.o examples/texture.o ../res/hotaru_futaba.data.o ../res/hotar cube.elf: start.o examples/cube.o ../math/cos_table_fp12.o ../math/cos.o +icosphere.elf: start.o examples/icosphere.o ../math/cos_table_fp12.o ../math/cos.o + CFLAGS += -I../include -I../ include arm9.mk diff --git a/arm9/examples/cube.c b/arm9/examples/cube.c index e01d274..7b0db55 100644 --- a/arm9/examples/cube.c +++ b/arm9/examples/cube.c @@ -163,25 +163,25 @@ void main() for (int i = 0; i < 6; i++) { io_registers.a.COLOR = face_colors[i]; - struct vertex_position * a = &cube_positions[cube_faces[i].a.position]; + struct vertex_position * a = &cube_positions[cube_quadrilaterals[i].a.position]; io_registers.a.VTX_10 = 0 | VTX_10__z_coordinate(a->z) | VTX_10__y_coordinate(a->y) | VTX_10__x_coordinate(a->x); - struct vertex_position * b = &cube_positions[cube_faces[i].b.position]; + struct vertex_position * b = &cube_positions[cube_quadrilaterals[i].b.position]; io_registers.a.VTX_10 = 0 | VTX_10__z_coordinate(b->z) | VTX_10__y_coordinate(b->y) | VTX_10__x_coordinate(b->x); - struct vertex_position * c = &cube_positions[cube_faces[i].c.position]; + struct vertex_position * c = &cube_positions[cube_quadrilaterals[i].c.position]; io_registers.a.VTX_10 = 0 | VTX_10__z_coordinate(c->z) | VTX_10__y_coordinate(c->y) | VTX_10__x_coordinate(c->x); - struct vertex_position * d = &cube_positions[cube_faces[i].d.position]; + struct vertex_position * d = &cube_positions[cube_quadrilaterals[i].d.position]; io_registers.a.VTX_10 = 0 | VTX_10__z_coordinate(d->z) | VTX_10__y_coordinate(d->y) diff --git a/arm9/examples/icosphere.c b/arm9/examples/icosphere.c new file mode 100644 index 0000000..bcff3b1 --- /dev/null +++ b/arm9/examples/icosphere.c @@ -0,0 +1,265 @@ +#include "io_registers.h" +#include "bits.h" + +#include "models/icosphere.h" +#include "math/math.h" + +void main() +{ + // power control + io_registers.a.POWCNT = 0 + | POWCNT__lcd_output_destination__a_to_upper__b_to_lower + | POWCNT__geometry_engine__enable + | POWCNT__rendering_engine__enable + | POWCNT__lcd__enable; + + // enable bg0 and 3d graphics + io_registers.a.DISPCNT = 0 + | DISPCNT__display_mode__graphics_display + | DISPCNT__bg0__enable + | DISPCNT__display_selection_for_bg0__3d_graphics + ; + + // disable all 3d effects + io_registers.a.DISP3DCNT = 0 + | DISP3DCNT__clear_image__disable + | DISP3DCNT__fog_master__disable + | DISP3DCNT__edge_marking__disable + | DISP3DCNT__anti_aliasing__disable + | DISP3DCNT__alpha_blending__disable + | DISP3DCNT__alpha_test__disable + | DISP3DCNT__texture_mapping__disable; + + // clear matrix stack status + io_registers.a.GXSTAT |= GXSTAT__matrix_stack_status__overflow_or_underflow; + + // load identity matrices + io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__projection; + io_registers.a.MTX_IDENTITY = 0; + + /* + io_registers.a.MTX_SCALE = ((192 << 12) / (256)) / 2; + io_registers.a.MTX_SCALE = 0.5 * 4096; + io_registers.a.MTX_SCALE = 0.5 * 4096; + */ + + // load a symmetric perspective matrix, with aspect ratio correction + io_registers.a.MTX_LOAD_4X4 = (192 << 12) / 256; + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = 0; + + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = 1 << 12; + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = 0; + + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = -(1 << 12); + + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = 0; + io_registers.a.MTX_LOAD_4X4 = -(1 << 12); + io_registers.a.MTX_LOAD_4X4 = 0; + + // translate the viewpoint + io_registers.a.MTX_TRANS = 0; + io_registers.a.MTX_TRANS = 0; + io_registers.a.MTX_TRANS = (int)(-2.1 * (float)(1 << 12)); + + io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position; + io_registers.a.MTX_IDENTITY = 0; + + io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position_and_vector; + io_registers.a.MTX_IDENTITY = 0; + + // set the 3d clear color to a dark red + io_registers.a.CLEAR_COLOR = 0 + | CLEAR_COLOR__clear_polygon_id(31) + | CLEAR_COLOR__alpha_value(31) + | CLEAR_COLOR__blue(1) + | CLEAR_COLOR__green(1) + | CLEAR_COLOR__red(10); + + // set the depth buffer clear value to the maximum value + io_registers.a.CLEAR_DEPTH = CLEAR_DEPTH__value(0x7fff); + + // the following polygons are fully opaque; backface culling is + // enabled + io_registers.a.POLYGON_ATTR = 0 + | POLYGON_ATTR__alpha_value(31) + | POLYGON_ATTR__render_front_surface__enable + | POLYGON_ATTR__render_back_surface__enable + | POLYGON_ATTR__light_2__enable + | POLYGON_ATTR__light_1__enable + | POLYGON_ATTR__light_0__enable; + + // the 3d viewport is the entire display area + io_registers.a.VIEWPORT = 0 + | VIEWPORT__y2(191) + | VIEWPORT__x2(255) + | VIEWPORT__y1(0) + | VIEWPORT__x1(0); + + // normalized 45° vector + int c = 0.57735 * 512; + + // lighting + io_registers.a.LIGHT_VECTOR = 0 + | LIGHT_VECTOR__light_number(0) + | LIGHT_VECTOR__decimal_z(-c) + | LIGHT_VECTOR__decimal_y(-c) + | LIGHT_VECTOR__decimal_x(-c); + + io_registers.a.LIGHT_VECTOR = 0 + | LIGHT_VECTOR__light_number(1) + | LIGHT_VECTOR__decimal_z(-c) + | LIGHT_VECTOR__decimal_y(-c) + | LIGHT_VECTOR__decimal_x(c); + + io_registers.a.LIGHT_VECTOR = 0 + | LIGHT_VECTOR__light_number(2) + | LIGHT_VECTOR__decimal_z(-c) + | LIGHT_VECTOR__decimal_y(c) + | LIGHT_VECTOR__decimal_x(-c); + + io_registers.a.LIGHT_COLOR = 0 + | LIGHT_COLOR__light_number(0) + | LIGHT_COLOR__blue(1) + | LIGHT_COLOR__green(1) + | LIGHT_COLOR__red(31); + + io_registers.a.LIGHT_COLOR = 0 + | LIGHT_COLOR__light_number(1) + | LIGHT_COLOR__blue(1) + | LIGHT_COLOR__green(31) + | LIGHT_COLOR__red(1); + + io_registers.a.LIGHT_COLOR = 0 + | LIGHT_COLOR__light_number(2) + | LIGHT_COLOR__blue(31) + | LIGHT_COLOR__green(1) + | LIGHT_COLOR__red(1); + + // degrees + int theta = 0; + + while (1) { + // calculate sin/cos for 2d rotation; signed fp20.12 result + int cos = cos_fp12(theta); + int sin = sin_fp12(theta); + + int cos2 = cos_fp12(theta >> 1); + int sin2 = sin_fp12(theta >> 1); + + io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position_and_vector; + // reset position matrix + io_registers.a.MTX_IDENTITY = 0; + + // multiply by a z-axis rotation + io_registers.a.MTX_MULT_3X3 = cos; + io_registers.a.MTX_MULT_3X3 = -sin; + io_registers.a.MTX_MULT_3X3 = 0; + + io_registers.a.MTX_MULT_3X3 = sin; + io_registers.a.MTX_MULT_3X3 = cos; + io_registers.a.MTX_MULT_3X3 = 0; + + io_registers.a.MTX_MULT_3X3 = 0; + io_registers.a.MTX_MULT_3X3 = 0; + io_registers.a.MTX_MULT_3X3 = 1 << 12; + + // multiply by a y-axis rotation + io_registers.a.MTX_MULT_3X3 = cos2; + io_registers.a.MTX_MULT_3X3 = 0; + io_registers.a.MTX_MULT_3X3 = sin2; + + io_registers.a.MTX_MULT_3X3 = 0; + io_registers.a.MTX_MULT_3X3 = 1 << 12; + io_registers.a.MTX_MULT_3X3 = 0; + + io_registers.a.MTX_MULT_3X3 = -sin2; + io_registers.a.MTX_MULT_3X3 = 0; + io_registers.a.MTX_MULT_3X3 = cos2; + + // multiply by a x-axis rotation + io_registers.a.MTX_MULT_3X3 = cos2; + io_registers.a.MTX_MULT_3X3 = -sin2; + io_registers.a.MTX_MULT_3X3 = 0; + + io_registers.a.MTX_MULT_3X3 = sin2; + io_registers.a.MTX_MULT_3X3 = cos2; + io_registers.a.MTX_MULT_3X3 = 0; + + io_registers.a.MTX_MULT_3X3 = 0; + io_registers.a.MTX_MULT_3X3 = 0; + io_registers.a.MTX_MULT_3X3 = 1 << 12; + + // cube faces + + io_registers.a.DIF_AMB = 0 + | DIF_AMB__ambient_blue(1) + | DIF_AMB__ambient_green(1) + | DIF_AMB__ambient_red(1) + | DIF_AMB__diffuse_blue(10) + | DIF_AMB__diffuse_green(10) + | DIF_AMB__diffuse_red(10); + + io_registers.a.SPE_EMI = 0 + | SPE_EMI__specular_blue(30) + | SPE_EMI__specular_green(30) + | SPE_EMI__specular_red(30); + + // the following vertices are a triangles + io_registers.a.BEGIN_VTXS = BEGIN_VTXS__type__triangle; + + const int num_faces = (sizeof (icosphere_triangles)) / (sizeof (struct triangle)); + for (int i = 0; i < num_faces; i++) { + + struct vertex_normal * an = &icosphere_normals[icosphere_triangles[i].a.normal]; + io_registers.a.NORMAL = 0 + | NORMAL__z_component(an->z) + | NORMAL__y_component(an->y) + | NORMAL__x_component(an->x); + + struct vertex_position * a = &icosphere_positions[icosphere_triangles[i].a.position]; + io_registers.a.VTX_10 = 0 + | VTX_10__z_coordinate(a->z) + | VTX_10__y_coordinate(a->y) + | VTX_10__x_coordinate(a->x); + + struct vertex_position * b = &icosphere_positions[icosphere_triangles[i].b.position]; + io_registers.a.VTX_10 = 0 + | VTX_10__z_coordinate(b->z) + | VTX_10__y_coordinate(b->y) + | VTX_10__x_coordinate(b->x); + + struct vertex_position * c = &icosphere_positions[icosphere_triangles[i].c.position]; + io_registers.a.VTX_10 = 0 + | VTX_10__z_coordinate(c->z) + | VTX_10__y_coordinate(c->y) + | VTX_10__x_coordinate(c->x); + } + + // end of the quadrilateral + io_registers.a.END_VTXS = 0; + + // wait for the end of the current frame + while (io_registers.a.VCOUNT != 262); + while (io_registers.a.VCOUNT == 262); + + // wait for the geometry engine + while (io_registers.a.GXSTAT & GXSTAT__geometry_engine_busy); + + // swap buffers + io_registers.a.SWAP_BUFFERS = 0; + + // increment theta once per frame + theta += 1; + if (theta >= 360 * 2) { + theta = 0; + } + } +} diff --git a/cartridge.lds b/cartridge.lds index 559990a..9d13b4a 100644 --- a/cartridge.lds +++ b/cartridge.lds @@ -24,7 +24,7 @@ SECTIONS KEEP(*(.data.arm9*.bin)) } AT>rom - . = 0x02000000 + 0x8000; + . = 0x02000000 + 0x390000; _arm7 = .; diff --git a/icosphere.h b/icosphere.h new file mode 100644 index 0000000..e69de29 diff --git a/models/Makefile b/models/Makefile new file mode 100644 index 0000000..bbf4bf3 --- /dev/null +++ b/models/Makefile @@ -0,0 +1,4 @@ +all: $(patsubst %.obj,%.h,$(wildcard *.obj)) + +%.h: %.obj + python render_obj_fixed_point_c_source.py $< $(basename $<) > $@ diff --git a/models/cube.h b/models/cube.h index 203435b..985c332 100644 --- a/models/cube.h +++ b/models/cube.h @@ -30,7 +30,7 @@ struct vertex_normal cube_normals[] = { {0, 0, -512}, }; -struct face cube_faces[] = { +struct quadrilateral cube_quadrilaterals[] = { { {0, 0, 0}, {4, 1, 0}, diff --git a/models/icosphere.h b/models/icosphere.h new file mode 100644 index 0000000..85b135d --- /dev/null +++ b/models/icosphere.h @@ -0,0 +1,2304 @@ +#include "model.h" + +// .6 fixed-point +struct vertex_position icosphere_positions[] = { + {0, -64, 0}, + {46, -29, 33}, + {-18, -29, 54}, + {-58, -29, 0}, + {-18, -29, -55}, + {46, -29, -34}, + {17, 28, 54}, + {-47, 28, 33}, + {-47, 28, -34}, + {17, 28, -55}, + {57, 28, 0}, + {0, 64, 0}, + {-15, -43, 45}, + {-11, -55, 31}, + {-5, -62, 15}, + {13, -62, 9}, + {27, -55, 19}, + {39, -43, 28}, + {34, -33, 43}, + {16, -34, 51}, + {-2, -33, 55}, + {52, -33, -19}, + {54, -34, 0}, + {52, -33, 18}, + {13, -62, -10}, + {27, -55, -20}, + {39, -43, -29}, + {-49, -43, 0}, + {-34, -55, 0}, + {-17, -62, 0}, + {-31, -33, 45}, + {-45, -34, 31}, + {-54, -33, 15}, + {-15, -43, -46}, + {-11, -55, -32}, + {-5, -62, -16}, + {-54, -33, -16}, + {-45, -34, -32}, + {-31, -33, -46}, + {-2, -33, -56}, + {16, -34, -52}, + {34, -33, -44}, + {61, 16, 9}, + {60, 0, 19}, + {55, -17, 28}, + {55, -17, -29}, + {60, 0, -20}, + {61, 16, -10}, + {9, 16, 61}, + {0, 0, 64}, + {-10, -17, 61}, + {43, -17, 43}, + {37, 0, 51}, + {27, 16, 55}, + {-56, 16, 28}, + {-61, 0, 19}, + {-62, -17, 9}, + {-28, -17, 55}, + {-38, 0, 51}, + {-44, 16, 43}, + {-44, 16, -44}, + {-38, 0, -52}, + {-28, -17, -56}, + {-62, -17, -10}, + {-61, 0, -20}, + {-56, 16, -29}, + {27, 16, -56}, + {37, 0, -52}, + {43, -17, -44}, + {-10, -17, -62}, + {0, 0, -64}, + {9, 16, -62}, + {53, 32, 15}, + {44, 33, 31}, + {30, 32, 45}, + {1, 32, 55}, + {-17, 33, 51}, + {-35, 32, 43}, + {-53, 32, 18}, + {-55, 33, 0}, + {-53, 32, -19}, + {-35, 32, -44}, + {-17, 33, -52}, + {1, 32, -56}, + {30, 32, -46}, + {44, 33, -32}, + {53, 32, -16}, + {4, 61, 15}, + {10, 54, 31}, + {14, 42, 45}, + {48, 42, 0}, + {33, 54, 0}, + {16, 61, 0}, + {-14, 61, 9}, + {-28, 54, 19}, + {-40, 42, 28}, + {-14, 61, -10}, + {-28, 54, -20}, + {-40, 42, -29}, + {4, 61, -16}, + {10, 54, -32}, + {14, 42, -46}, + {23, 57, -17}, + {40, 46, -17}, + {28, 46, -34}, + {-9, 57, -28}, + {-4, 46, -45}, + {-24, 46, -38}, + {-29, 57, 0}, + {-43, 46, -11}, + {-43, 46, 10}, + {-9, 57, 27}, + {-24, 46, 37}, + {-4, 46, 44}, + {23, 57, 16}, + {28, 46, 33}, + {40, 46, 16}, + {55, 17, -28}, + {51, 0, -38}, + {42, 17, -45}, + {-9, 17, -61}, + {-20, 0, -61}, + {-29, 17, -55}, + {-61, 17, -11}, + {-64, 0, 0}, + {-61, 17, 10}, + {-29, 17, 54}, + {-20, -1, 60}, + {-9, 17, 60}, + {42, 17, 44}, + {51, -1, 37}, + {55, 17, 27}, + {19, 0, -61}, + {28, -18, -55}, + {8, -18, -61}, + {-52, 0, -38}, + {-43, -18, -45}, + {-56, -18, -28}, + {-52, 0, 37}, + {-56, -18, 27}, + {-43, -18, 44}, + {19, 0, 60}, + {8, -18, 60}, + {28, -18, 54}, + {64, 0, 0}, + {60, -18, 10}, + {60, -18, -11}, + {23, -47, -38}, + {8, -58, -28}, + {3, -47, -45}, + {-29, -47, -34}, + {-24, -58, -17}, + {-41, -47, -17}, + {-41, -47, 16}, + {-24, -58, 16}, + {-29, -47, 33}, + {42, -47, -11}, + {42, -47, 10}, + {28, -58, 0}, + {3, -47, 44}, + {8, -58, 27}, + {23, -47, 37}, +}; + +// .15 fixed-point +struct vertex_texture icosphere_textures[] = { + {5957, 0}, + {6702, 1289}, + {5213, 1289}, + {8936, 5159}, + {9681, 3869}, + {10426, 5159}, + {29789, 0}, + {30533, 1289}, + {29044, 1289}, + {23831, 0}, + {24576, 1289}, + {23086, 1289}, + {17873, 0}, + {18618, 1289}, + {17128, 1289}, + {9681, 6449}, + {2978, 5159}, + {4468, 5159}, + {3723, 6449}, + {26810, 5159}, + {28299, 5159}, + {27554, 6449}, + {20852, 5159}, + {22341, 5159}, + {21597, 6449}, + {14894, 5159}, + {16384, 5159}, + {15639, 6449}, + {8192, 6449}, + {2234, 6449}, + {26065, 6449}, + {20107, 6449}, + {14149, 6449}, + {5957, 10319}, + {7447, 10319}, + {6702, 11609}, + {0, 10319}, + {1489, 10319}, + {744, 11609}, + {23831, 10319}, + {25320, 10319}, + {24576, 11609}, + {17873, 10319}, + {19362, 10319}, + {18618, 11609}, + {11915, 10319}, + {13405, 10319}, + {12660, 11609}, + {14149, 14189}, + {15639, 14189}, + {14894, 15479}, + {13405, 12899}, + {14894, 12899}, + {14149, 11609}, + {16384, 12899}, + {15639, 11609}, + {17128, 11609}, + {14894, 10319}, + {16384, 10319}, + {20107, 14189}, + {21597, 14189}, + {20852, 15479}, + {19362, 12899}, + {20852, 12899}, + {20107, 11609}, + {22341, 12899}, + {21597, 11609}, + {23086, 11609}, + {20852, 10319}, + {22341, 10319}, + {26065, 14189}, + {27554, 14189}, + {26810, 15479}, + {25320, 12899}, + {26810, 12899}, + {26065, 11609}, + {28299, 12899}, + {27554, 11609}, + {29044, 11609}, + {26810, 10319}, + {28299, 10319}, + {29789, 10319}, + {2234, 14189}, + {3723, 14189}, + {2978, 15479}, + {1489, 12899}, + {2978, 12899}, + {2234, 11609}, + {4468, 12899}, + {3723, 11609}, + {5213, 11609}, + {2978, 10319}, + {4468, 10319}, + {8192, 14189}, + {9681, 14189}, + {8936, 15479}, + {7447, 12899}, + {8936, 12899}, + {8192, 11609}, + {10426, 12899}, + {9681, 11609}, + {11170, 11609}, + {8936, 10319}, + {10426, 10319}, + {12660, 9029}, + {13405, 7739}, + {14149, 9029}, + {14894, 7739}, + {15639, 9029}, + {16384, 7739}, + {17128, 9029}, + {18618, 9029}, + {19362, 7739}, + {20107, 9029}, + {20852, 7739}, + {21597, 9029}, + {22341, 7739}, + {23086, 9029}, + {24576, 9029}, + {25320, 7739}, + {26065, 9029}, + {26810, 7739}, + {27554, 9029}, + {28299, 7739}, + {29044, 9029}, + {744, 9029}, + {1489, 7739}, + {2234, 9029}, + {2978, 7739}, + {3723, 9029}, + {4468, 7739}, + {5213, 9029}, + {6702, 9029}, + {7447, 7739}, + {8192, 9029}, + {8936, 7739}, + {9681, 9029}, + {10426, 7739}, + {11170, 9029}, + {17873, 7739}, + {17128, 6449}, + {18618, 6449}, + {17873, 5159}, + {19362, 5159}, + {23831, 7739}, + {23086, 6449}, + {24576, 6449}, + {23831, 5159}, + {25320, 5159}, + {30533, 9029}, + {29789, 7739}, + {29044, 6449}, + {31278, 7739}, + {30533, 6449}, + {32023, 6449}, + {29789, 5159}, + {31278, 5159}, + {32768, 5159}, + {5957, 7739}, + {5213, 6449}, + {6702, 6449}, + {5957, 5159}, + {7447, 5159}, + {11915, 7739}, + {11170, 6449}, + {12660, 6449}, + {11915, 5159}, + {13405, 5159}, + {15639, 3869}, + {16384, 2579}, + {17128, 3869}, + {17873, 2579}, + {18618, 3869}, + {19362, 2579}, + {20107, 3869}, + {21597, 3869}, + {22341, 2579}, + {23086, 3869}, + {23831, 2579}, + {24576, 3869}, + {25320, 2579}, + {26065, 3869}, + {27554, 3869}, + {28299, 2579}, + {29044, 3869}, + {29789, 2579}, + {30533, 3869}, + {31278, 2579}, + {32023, 3869}, + {14149, 3869}, + {12660, 3869}, + {11170, 3869}, + {13405, 2579}, + {11915, 2579}, + {12660, 1289}, + {10426, 2579}, + {11170, 1289}, + {11915, 0}, + {3723, 3869}, + {4468, 2579}, + {5213, 3869}, + {5957, 2579}, + {6702, 3869}, + {7447, 2579}, + {8192, 3869}, +}; + +// .9 fixed-point +struct vertex_normal icosphere_normals[] = { + {24, -506, 75}, + {370, -284, 210}, + {-65, -506, 46}, + {-65, -506, -47}, + {24, -506, -76}, + {419, -205, 210}, + {-72, -205, 464}, + {-464, -205, 75}, + {-216, -205, -418}, + {330, -205, -334}, + {394, -155, 286}, + {-151, -155, 464}, + {-489, -155, 0}, + {-151, -155, -465}, + {394, -155, -287}, + {175, 283, 388}, + {-316, 283, 286}, + {-371, 283, -211}, + {86, 283, -418}, + {423, 283, -47}, + {64, 505, -47}, + {200, 468, -47}, + {329, 388, -47}, + {119, 490, -87}, + {106, 468, -177}, + {264, 428, -94}, + {251, 406, -183}, + {170, 428, -223}, + {146, 388, -300}, + {385, 326, -87}, + {371, 304, -177}, + {306, 344, -223}, + {282, 304, -300}, + {201, 326, -340}, + {175, 283, -389}, + {-25, 505, -76}, + {17, 468, -205}, + {57, 388, -329}, + {-46, 490, -141}, + {-135, 468, -156}, + {-8, 428, -281}, + {-97, 406, -296}, + {-159, 428, -232}, + {-240, 388, -232}, + {36, 326, -394}, + {-53, 304, -408}, + {-118, 344, -361}, + {-198, 304, -361}, + {-261, 326, -297}, + {-316, 283, -287}, + {-80, 505, 0}, + {-190, 468, -80}, + {-295, 388, -156}, + {-148, 490, 0}, + {-190, 468, 79}, + {-270, 428, -80}, + {-311, 406, 0}, + {-270, 428, 79}, + {-295, 388, 155}, + {-363, 326, -157}, + {-405, 304, -77}, + {-379, 344, 0}, + {-405, 304, 76}, + {-363, 326, 156}, + {-371, 283, 210}, + {-25, 505, 75}, + {-135, 468, 155}, + {-240, 388, 231}, + {-46, 490, 140}, + {17, 468, 204}, + {-159, 428, 231}, + {-97, 406, 295}, + {-8, 428, 280}, + {57, 388, 328}, + {-261, 326, 296}, + {-198, 304, 360}, + {-118, 344, 360}, + {-53, 304, 407}, + {36, 326, 393}, + {86, 283, 417}, + {64, 505, 46}, + {106, 468, 176}, + {146, 388, 299}, + {119, 490, 86}, + {200, 468, 46}, + {170, 428, 222}, + {251, 406, 182}, + {264, 428, 93}, + {329, 388, 46}, + {201, 326, 339}, + {282, 304, 299}, + {306, 344, 222}, + {371, 304, 176}, + {385, 326, 86}, + {423, 283, 46}, + {463, 204, -76}, + {479, 89, -156}, + {454, -41, -232}, + {458, 178, -141}, + {411, 225, -205}, + {454, 49, -232}, + {406, 96, -296}, + {386, 184, -281}, + {322, 225, -329}, + {408, -88, -297}, + {360, -41, -361}, + {360, 49, -361}, + {296, 89, -408}, + {275, 178, -394}, + {215, 204, -418}, + {71, 204, -465}, + {0, 89, -505}, + {-80, -41, -505}, + {8, 178, -480}, + {-68, 225, -455}, + {-80, 49, -504}, + {-156, 96, -479}, + {-148, 184, -455}, + {-213, 225, -408}, + {-156, -88, -480}, + {-232, -41, -455}, + {-232, 49, -455}, + {-297, 89, -408}, + {-289, 178, -384}, + {-331, 204, -334}, + {-420, 204, -211}, + {-480, 89, -156}, + {-505, -41, -80}, + {-454, 178, -157}, + {-454, 225, -77}, + {-504, 49, -80}, + {-503, 96, 0}, + {-478, 184, 0}, + {-454, 225, 76}, + {-505, -88, 0}, + {-505, -41, 79}, + {-504, 49, 79}, + {-480, 89, 155}, + {-454, 178, 156}, + {-420, 204, 210}, + {-331, 204, 333}, + {-297, 89, 407}, + {-232, -41, 454}, + {-289, 178, 383}, + {-213, 225, 407}, + {-232, 49, 454}, + {-156, 96, 478}, + {-148, 184, 454}, + {-68, 225, 454}, + {-156, -88, 479}, + {-80, -41, 504}, + {-80, 49, 503}, + {0, 89, 504}, + {8, 178, 479}, + {71, 204, 464}, + {215, 204, 417}, + {296, 89, 407}, + {360, -41, 360}, + {275, 178, 393}, + {322, 225, 328}, + {360, 49, 360}, + {406, 96, 295}, + {386, 184, 280}, + {411, 225, 204}, + {408, -88, 296}, + {454, -41, 231}, + {454, 49, 231}, + {479, 89, 155}, + {458, 178, 140}, + {463, 204, 75}, + {150, 154, -465}, + {231, 40, -455}, + {296, -90, -408}, + {155, 87, -480}, + {79, 40, -505}, + {231, -50, -455}, + {155, -97, -479}, + {79, -50, -504}, + {-1, -90, -505}, + {288, -179, -384}, + {212, -226, -408}, + {147, -185, -455}, + {67, -226, -455}, + {-9, -179, -480}, + {-72, -205, -465}, + {-395, 154, -287}, + {-361, 40, -361}, + {-297, -90, -408}, + {-409, 87, -297}, + {-455, 40, -232}, + {-361, -50, -361}, + {-407, -97, -296}, + {-455, -50, -232}, + {-480, -90, -156}, + {-276, -179, -394}, + {-323, -226, -329}, + {-387, -185, -281}, + {-412, -226, -205}, + {-459, -179, -141}, + {-464, -205, -76}, + {-395, 154, 286}, + {-455, 40, 231}, + {-480, -90, 155}, + {-409, 87, 296}, + {-361, 40, 360}, + {-455, -50, 231}, + {-407, -97, 295}, + {-361, -50, 360}, + {-297, -90, 407}, + {-459, -179, 140}, + {-412, -226, 204}, + {-387, -185, 280}, + {-323, -226, 328}, + {-276, -179, 393}, + {-216, -205, 417}, + {150, 154, 464}, + {79, 40, 504}, + {-1, -90, 504}, + {155, 87, 479}, + {231, 40, 454}, + {79, -50, 503}, + {155, -97, 478}, + {231, -50, 454}, + {296, -90, 407}, + {-9, -179, 479}, + {67, -226, 454}, + {147, -185, 454}, + {212, -226, 407}, + {288, -179, 383}, + {330, -205, 333}, + {488, 154, 0}, + {504, 40, 79}, + {479, -90, 155}, + {504, 87, 0}, + {504, 40, -80}, + {503, -50, 79}, + {502, -97, 0}, + {503, -50, -80}, + {479, -90, -156}, + {453, -179, 156}, + {453, -226, 76}, + {477, -185, 0}, + {453, -226, -77}, + {453, -179, -157}, + {419, -205, -211}, + {315, -284, -287}, + {239, -389, -232}, + {134, -469, -156}, + {260, -327, -297}, + {197, -305, -361}, + {158, -429, -232}, + {96, -407, -296}, + {117, -345, -361}, + {52, -305, -408}, + {45, -491, -141}, + {-18, -469, -205}, + {7, -429, -281}, + {-58, -389, -329}, + {-37, -327, -394}, + {-87, -284, -418}, + {-176, -284, -389}, + {-147, -389, -300}, + {-107, -469, -177}, + {-202, -327, -340}, + {-283, -305, -300}, + {-171, -429, -223}, + {-252, -407, -183}, + {-307, -345, -223}, + {-372, -305, -177}, + {-120, -491, -87}, + {-201, -469, -47}, + {-265, -429, -94}, + {-330, -389, -47}, + {-386, -327, -87}, + {-424, -284, -47}, + {-424, -284, 46}, + {-330, -389, 46}, + {-201, -469, 46}, + {-386, -327, 86}, + {-372, -305, 176}, + {-265, -429, 93}, + {-252, -407, 182}, + {-307, -345, 222}, + {-283, -305, 299}, + {-120, -491, 86}, + {-107, -469, 176}, + {-171, -429, 222}, + {-147, -389, 299}, + {-202, -327, 339}, + {-176, -284, 388}, + {370, -284, -211}, + {404, -305, -77}, + {404, -305, 76}, + {362, -327, -157}, + {294, -389, -156}, + {378, -345, 0}, + {310, -407, 0}, + {269, -429, -80}, + {189, -469, -80}, + {362, -327, 156}, + {294, -389, 155}, + {269, -429, 79}, + {189, -469, 79}, + {147, -491, 0}, + {79, -506, 0}, + {-87, -284, 417}, + {-58, -389, 328}, + {-18, -469, 204}, + {-37, -327, 393}, + {52, -305, 407}, + {7, -429, 280}, + {96, -407, 295}, + {117, -345, 360}, + {197, -305, 360}, + {45, -491, 140}, + {134, -469, 155}, + {158, -429, 231}, + {239, -389, 231}, + {260, -327, 296}, + {315, -284, 286}, +}; + +struct triangle icosphere_triangles[] = { + { + {0, 0, 0}, + {15, 1, 0}, + {14, 2, 0}, + }, + { + {1, 3, 1}, + {17, 4, 1}, + {23, 5, 1}, + }, + { + {0, 6, 2}, + {14, 7, 2}, + {29, 8, 2}, + }, + { + {0, 9, 3}, + {29, 10, 3}, + {35, 11, 3}, + }, + { + {0, 12, 4}, + {35, 13, 4}, + {24, 14, 4}, + }, + { + {1, 3, 5}, + {23, 5, 5}, + {44, 15, 5}, + }, + { + {2, 16, 6}, + {20, 17, 6}, + {50, 18, 6}, + }, + { + {3, 19, 7}, + {32, 20, 7}, + {56, 21, 7}, + }, + { + {4, 22, 8}, + {38, 23, 8}, + {62, 24, 8}, + }, + { + {5, 25, 9}, + {41, 26, 9}, + {68, 27, 9}, + }, + { + {1, 3, 10}, + {44, 15, 10}, + {51, 28, 10}, + }, + { + {2, 16, 11}, + {50, 18, 11}, + {57, 29, 11}, + }, + { + {3, 19, 12}, + {56, 21, 12}, + {63, 30, 12}, + }, + { + {4, 22, 13}, + {62, 24, 13}, + {69, 31, 13}, + }, + { + {5, 25, 14}, + {68, 27, 14}, + {45, 32, 14}, + }, + { + {6, 33, 15}, + {74, 34, 15}, + {89, 35, 15}, + }, + { + {7, 36, 16}, + {77, 37, 16}, + {95, 38, 16}, + }, + { + {8, 39, 17}, + {80, 40, 17}, + {98, 41, 17}, + }, + { + {9, 42, 18}, + {83, 43, 18}, + {101, 44, 18}, + }, + { + {10, 45, 19}, + {86, 46, 19}, + {90, 47, 19}, + }, + { + {92, 48, 20}, + {99, 49, 20}, + {11, 50, 20}, + }, + { + {91, 51, 21}, + {102, 52, 21}, + {92, 48, 21}, + }, + { + {90, 47, 22}, + {103, 53, 22}, + {91, 51, 22}, + }, + { + {92, 48, 23}, + {102, 52, 23}, + {99, 49, 23}, + }, + { + {102, 52, 24}, + {100, 54, 24}, + {99, 49, 24}, + }, + { + {91, 51, 25}, + {103, 53, 25}, + {102, 52, 25}, + }, + { + {103, 53, 26}, + {104, 55, 26}, + {102, 52, 26}, + }, + { + {102, 52, 27}, + {104, 55, 27}, + {100, 54, 27}, + }, + { + {104, 55, 28}, + {101, 56, 28}, + {100, 54, 28}, + }, + { + {90, 47, 29}, + {86, 46, 29}, + {103, 53, 29}, + }, + { + {86, 46, 30}, + {85, 57, 30}, + {103, 53, 30}, + }, + { + {103, 53, 31}, + {85, 57, 31}, + {104, 55, 31}, + }, + { + {85, 57, 32}, + {84, 58, 32}, + {104, 55, 32}, + }, + { + {104, 55, 33}, + {84, 58, 33}, + {101, 56, 33}, + }, + { + {84, 58, 34}, + {9, 42, 34}, + {101, 56, 34}, + }, + { + {99, 59, 35}, + {96, 60, 35}, + {11, 61, 35}, + }, + { + {100, 62, 36}, + {105, 63, 36}, + {99, 59, 36}, + }, + { + {101, 44, 37}, + {106, 64, 37}, + {100, 62, 37}, + }, + { + {99, 59, 38}, + {105, 63, 38}, + {96, 60, 38}, + }, + { + {105, 63, 39}, + {97, 65, 39}, + {96, 60, 39}, + }, + { + {100, 62, 40}, + {106, 64, 40}, + {105, 63, 40}, + }, + { + {106, 64, 41}, + {107, 66, 41}, + {105, 63, 41}, + }, + { + {105, 63, 42}, + {107, 66, 42}, + {97, 65, 42}, + }, + { + {107, 66, 43}, + {98, 67, 43}, + {97, 65, 43}, + }, + { + {101, 44, 44}, + {83, 43, 44}, + {106, 64, 44}, + }, + { + {83, 43, 45}, + {82, 68, 45}, + {106, 64, 45}, + }, + { + {106, 64, 46}, + {82, 68, 46}, + {107, 66, 46}, + }, + { + {82, 68, 47}, + {81, 69, 47}, + {107, 66, 47}, + }, + { + {107, 66, 48}, + {81, 69, 48}, + {98, 67, 48}, + }, + { + {81, 69, 49}, + {8, 39, 49}, + {98, 67, 49}, + }, + { + {96, 70, 50}, + {93, 71, 50}, + {11, 72, 50}, + }, + { + {97, 73, 51}, + {108, 74, 51}, + {96, 70, 51}, + }, + { + {98, 41, 52}, + {109, 75, 52}, + {97, 73, 52}, + }, + { + {96, 70, 53}, + {108, 74, 53}, + {93, 71, 53}, + }, + { + {108, 74, 54}, + {94, 76, 54}, + {93, 71, 54}, + }, + { + {97, 73, 55}, + {109, 75, 55}, + {108, 74, 55}, + }, + { + {109, 75, 56}, + {110, 77, 56}, + {108, 74, 56}, + }, + { + {108, 74, 57}, + {110, 77, 57}, + {94, 76, 57}, + }, + { + {110, 77, 58}, + {95, 78, 58}, + {94, 76, 58}, + }, + { + {98, 41, 59}, + {80, 40, 59}, + {109, 75, 59}, + }, + { + {80, 40, 60}, + {79, 79, 60}, + {109, 75, 60}, + }, + { + {109, 75, 61}, + {79, 79, 61}, + {110, 77, 61}, + }, + { + {79, 79, 62}, + {78, 80, 62}, + {110, 77, 62}, + }, + { + {110, 77, 63}, + {78, 80, 63}, + {95, 78, 63}, + }, + { + {78, 80, 64}, + {7, 81, 64}, + {95, 78, 64}, + }, + { + {93, 82, 65}, + {87, 83, 65}, + {11, 84, 65}, + }, + { + {94, 85, 66}, + {111, 86, 66}, + {93, 82, 66}, + }, + { + {95, 38, 67}, + {112, 87, 67}, + {94, 85, 67}, + }, + { + {93, 82, 68}, + {111, 86, 68}, + {87, 83, 68}, + }, + { + {111, 86, 69}, + {88, 88, 69}, + {87, 83, 69}, + }, + { + {94, 85, 70}, + {112, 87, 70}, + {111, 86, 70}, + }, + { + {112, 87, 71}, + {113, 89, 71}, + {111, 86, 71}, + }, + { + {111, 86, 72}, + {113, 89, 72}, + {88, 88, 72}, + }, + { + {113, 89, 73}, + {89, 90, 73}, + {88, 88, 73}, + }, + { + {95, 38, 74}, + {77, 37, 74}, + {112, 87, 74}, + }, + { + {77, 37, 75}, + {76, 91, 75}, + {112, 87, 75}, + }, + { + {112, 87, 76}, + {76, 91, 76}, + {113, 89, 76}, + }, + { + {76, 91, 77}, + {75, 92, 77}, + {113, 89, 77}, + }, + { + {113, 89, 78}, + {75, 92, 78}, + {89, 90, 78}, + }, + { + {75, 92, 79}, + {6, 33, 79}, + {89, 90, 79}, + }, + { + {87, 93, 80}, + {92, 94, 80}, + {11, 95, 80}, + }, + { + {88, 96, 81}, + {114, 97, 81}, + {87, 93, 81}, + }, + { + {89, 35, 82}, + {115, 98, 82}, + {88, 96, 82}, + }, + { + {87, 93, 83}, + {114, 97, 83}, + {92, 94, 83}, + }, + { + {114, 97, 84}, + {91, 99, 84}, + {92, 94, 84}, + }, + { + {88, 96, 85}, + {115, 98, 85}, + {114, 97, 85}, + }, + { + {115, 98, 86}, + {116, 100, 86}, + {114, 97, 86}, + }, + { + {114, 97, 87}, + {116, 100, 87}, + {91, 99, 87}, + }, + { + {116, 100, 88}, + {90, 101, 88}, + {91, 99, 88}, + }, + { + {89, 35, 89}, + {74, 34, 89}, + {115, 98, 89}, + }, + { + {74, 34, 90}, + {73, 102, 90}, + {115, 98, 90}, + }, + { + {115, 98, 91}, + {73, 102, 91}, + {116, 100, 91}, + }, + { + {73, 102, 92}, + {72, 103, 92}, + {116, 100, 92}, + }, + { + {116, 100, 93}, + {72, 103, 93}, + {90, 101, 93}, + }, + { + {72, 103, 94}, + {10, 45, 94}, + {90, 101, 94}, + }, + { + {47, 104, 95}, + {86, 46, 95}, + {10, 45, 95}, + }, + { + {46, 105, 96}, + {117, 106, 96}, + {47, 104, 96}, + }, + { + {45, 32, 97}, + {118, 107, 97}, + {46, 105, 97}, + }, + { + {47, 104, 98}, + {117, 106, 98}, + {86, 46, 98}, + }, + { + {117, 106, 99}, + {85, 57, 99}, + {86, 46, 99}, + }, + { + {46, 105, 100}, + {118, 107, 100}, + {117, 106, 100}, + }, + { + {118, 107, 101}, + {119, 108, 101}, + {117, 106, 101}, + }, + { + {117, 106, 102}, + {119, 108, 102}, + {85, 57, 102}, + }, + { + {119, 108, 103}, + {84, 58, 103}, + {85, 57, 103}, + }, + { + {45, 32, 104}, + {68, 27, 104}, + {118, 107, 104}, + }, + { + {68, 27, 105}, + {67, 109, 105}, + {118, 107, 105}, + }, + { + {118, 107, 106}, + {67, 109, 106}, + {119, 108, 106}, + }, + { + {67, 109, 107}, + {66, 110, 107}, + {119, 108, 107}, + }, + { + {119, 108, 108}, + {66, 110, 108}, + {84, 58, 108}, + }, + { + {66, 110, 109}, + {9, 42, 109}, + {84, 58, 109}, + }, + { + {71, 111, 110}, + {83, 43, 110}, + {9, 42, 110}, + }, + { + {70, 112, 111}, + {120, 113, 111}, + {71, 111, 111}, + }, + { + {69, 31, 112}, + {121, 114, 112}, + {70, 112, 112}, + }, + { + {71, 111, 113}, + {120, 113, 113}, + {83, 43, 113}, + }, + { + {120, 113, 114}, + {82, 68, 114}, + {83, 43, 114}, + }, + { + {70, 112, 115}, + {121, 114, 115}, + {120, 113, 115}, + }, + { + {121, 114, 116}, + {122, 115, 116}, + {120, 113, 116}, + }, + { + {120, 113, 117}, + {122, 115, 117}, + {82, 68, 117}, + }, + { + {122, 115, 118}, + {81, 69, 118}, + {82, 68, 118}, + }, + { + {69, 31, 119}, + {62, 24, 119}, + {121, 114, 119}, + }, + { + {62, 24, 120}, + {61, 116, 120}, + {121, 114, 120}, + }, + { + {121, 114, 121}, + {61, 116, 121}, + {122, 115, 121}, + }, + { + {61, 116, 122}, + {60, 117, 122}, + {122, 115, 122}, + }, + { + {122, 115, 123}, + {60, 117, 123}, + {81, 69, 123}, + }, + { + {60, 117, 124}, + {8, 39, 124}, + {81, 69, 124}, + }, + { + {65, 118, 125}, + {80, 40, 125}, + {8, 39, 125}, + }, + { + {64, 119, 126}, + {123, 120, 126}, + {65, 118, 126}, + }, + { + {63, 30, 127}, + {124, 121, 127}, + {64, 119, 127}, + }, + { + {65, 118, 128}, + {123, 120, 128}, + {80, 40, 128}, + }, + { + {123, 120, 129}, + {79, 79, 129}, + {80, 40, 129}, + }, + { + {64, 119, 130}, + {124, 121, 130}, + {123, 120, 130}, + }, + { + {124, 121, 131}, + {125, 122, 131}, + {123, 120, 131}, + }, + { + {123, 120, 132}, + {125, 122, 132}, + {79, 79, 132}, + }, + { + {125, 122, 133}, + {78, 80, 133}, + {79, 79, 133}, + }, + { + {63, 30, 134}, + {56, 21, 134}, + {124, 121, 134}, + }, + { + {56, 21, 135}, + {55, 123, 135}, + {124, 121, 135}, + }, + { + {124, 121, 136}, + {55, 123, 136}, + {125, 122, 136}, + }, + { + {55, 123, 137}, + {54, 124, 137}, + {125, 122, 137}, + }, + { + {125, 122, 138}, + {54, 124, 138}, + {78, 80, 138}, + }, + { + {54, 124, 139}, + {7, 81, 139}, + {78, 80, 139}, + }, + { + {59, 125, 140}, + {77, 37, 140}, + {7, 36, 140}, + }, + { + {58, 126, 141}, + {126, 127, 141}, + {59, 125, 141}, + }, + { + {57, 29, 142}, + {127, 128, 142}, + {58, 126, 142}, + }, + { + {59, 125, 143}, + {126, 127, 143}, + {77, 37, 143}, + }, + { + {126, 127, 144}, + {76, 91, 144}, + {77, 37, 144}, + }, + { + {58, 126, 145}, + {127, 128, 145}, + {126, 127, 145}, + }, + { + {127, 128, 146}, + {128, 129, 146}, + {126, 127, 146}, + }, + { + {126, 127, 147}, + {128, 129, 147}, + {76, 91, 147}, + }, + { + {128, 129, 148}, + {75, 92, 148}, + {76, 91, 148}, + }, + { + {57, 29, 149}, + {50, 18, 149}, + {127, 128, 149}, + }, + { + {50, 18, 150}, + {49, 130, 150}, + {127, 128, 150}, + }, + { + {127, 128, 151}, + {49, 130, 151}, + {128, 129, 151}, + }, + { + {49, 130, 152}, + {48, 131, 152}, + {128, 129, 152}, + }, + { + {128, 129, 153}, + {48, 131, 153}, + {75, 92, 153}, + }, + { + {48, 131, 154}, + {6, 33, 154}, + {75, 92, 154}, + }, + { + {53, 132, 155}, + {74, 34, 155}, + {6, 33, 155}, + }, + { + {52, 133, 156}, + {129, 134, 156}, + {53, 132, 156}, + }, + { + {51, 28, 157}, + {130, 135, 157}, + {52, 133, 157}, + }, + { + {53, 132, 158}, + {129, 134, 158}, + {74, 34, 158}, + }, + { + {129, 134, 159}, + {73, 102, 159}, + {74, 34, 159}, + }, + { + {52, 133, 160}, + {130, 135, 160}, + {129, 134, 160}, + }, + { + {130, 135, 161}, + {131, 136, 161}, + {129, 134, 161}, + }, + { + {129, 134, 162}, + {131, 136, 162}, + {73, 102, 162}, + }, + { + {131, 136, 163}, + {72, 103, 163}, + {73, 102, 163}, + }, + { + {51, 28, 164}, + {44, 15, 164}, + {130, 135, 164}, + }, + { + {44, 15, 165}, + {43, 137, 165}, + {130, 135, 165}, + }, + { + {130, 135, 166}, + {43, 137, 166}, + {131, 136, 166}, + }, + { + {43, 137, 167}, + {42, 138, 167}, + {131, 136, 167}, + }, + { + {131, 136, 168}, + {42, 138, 168}, + {72, 103, 168}, + }, + { + {42, 138, 169}, + {10, 45, 169}, + {72, 103, 169}, + }, + { + {66, 110, 170}, + {71, 111, 170}, + {9, 42, 170}, + }, + { + {67, 109, 171}, + {132, 139, 171}, + {66, 110, 171}, + }, + { + {68, 27, 172}, + {133, 140, 172}, + {67, 109, 172}, + }, + { + {66, 110, 173}, + {132, 139, 173}, + {71, 111, 173}, + }, + { + {132, 139, 174}, + {70, 112, 174}, + {71, 111, 174}, + }, + { + {67, 109, 175}, + {133, 140, 175}, + {132, 139, 175}, + }, + { + {133, 140, 176}, + {134, 141, 176}, + {132, 139, 176}, + }, + { + {132, 139, 177}, + {134, 141, 177}, + {70, 112, 177}, + }, + { + {134, 141, 178}, + {69, 31, 178}, + {70, 112, 178}, + }, + { + {68, 27, 179}, + {41, 26, 179}, + {133, 140, 179}, + }, + { + {41, 26, 180}, + {40, 142, 180}, + {133, 140, 180}, + }, + { + {133, 140, 181}, + {40, 142, 181}, + {134, 141, 181}, + }, + { + {40, 142, 182}, + {39, 143, 182}, + {134, 141, 182}, + }, + { + {134, 141, 183}, + {39, 143, 183}, + {69, 31, 183}, + }, + { + {39, 143, 184}, + {4, 22, 184}, + {69, 31, 184}, + }, + { + {60, 117, 185}, + {65, 118, 185}, + {8, 39, 185}, + }, + { + {61, 116, 186}, + {135, 144, 186}, + {60, 117, 186}, + }, + { + {62, 24, 187}, + {136, 145, 187}, + {61, 116, 187}, + }, + { + {60, 117, 188}, + {135, 144, 188}, + {65, 118, 188}, + }, + { + {135, 144, 189}, + {64, 119, 189}, + {65, 118, 189}, + }, + { + {61, 116, 190}, + {136, 145, 190}, + {135, 144, 190}, + }, + { + {136, 145, 191}, + {137, 146, 191}, + {135, 144, 191}, + }, + { + {135, 144, 192}, + {137, 146, 192}, + {64, 119, 192}, + }, + { + {137, 146, 193}, + {63, 30, 193}, + {64, 119, 193}, + }, + { + {62, 24, 194}, + {38, 23, 194}, + {136, 145, 194}, + }, + { + {38, 23, 195}, + {37, 147, 195}, + {136, 145, 195}, + }, + { + {136, 145, 196}, + {37, 147, 196}, + {137, 146, 196}, + }, + { + {37, 147, 197}, + {36, 148, 197}, + {137, 146, 197}, + }, + { + {137, 146, 198}, + {36, 148, 198}, + {63, 30, 198}, + }, + { + {36, 148, 199}, + {3, 19, 199}, + {63, 30, 199}, + }, + { + {54, 124, 200}, + {59, 149, 200}, + {7, 81, 200}, + }, + { + {55, 123, 201}, + {138, 150, 201}, + {54, 124, 201}, + }, + { + {56, 21, 202}, + {139, 151, 202}, + {55, 123, 202}, + }, + { + {54, 124, 203}, + {138, 150, 203}, + {59, 149, 203}, + }, + { + {138, 150, 204}, + {58, 152, 204}, + {59, 149, 204}, + }, + { + {55, 123, 205}, + {139, 151, 205}, + {138, 150, 205}, + }, + { + {139, 151, 206}, + {140, 153, 206}, + {138, 150, 206}, + }, + { + {138, 150, 207}, + {140, 153, 207}, + {58, 152, 207}, + }, + { + {140, 153, 208}, + {57, 154, 208}, + {58, 152, 208}, + }, + { + {56, 21, 209}, + {32, 20, 209}, + {139, 151, 209}, + }, + { + {32, 20, 210}, + {31, 155, 210}, + {139, 151, 210}, + }, + { + {139, 151, 211}, + {31, 155, 211}, + {140, 153, 211}, + }, + { + {31, 155, 212}, + {30, 156, 212}, + {140, 153, 212}, + }, + { + {140, 153, 213}, + {30, 156, 213}, + {57, 154, 213}, + }, + { + {30, 156, 214}, + {2, 157, 214}, + {57, 154, 214}, + }, + { + {48, 131, 215}, + {53, 132, 215}, + {6, 33, 215}, + }, + { + {49, 130, 216}, + {141, 158, 216}, + {48, 131, 216}, + }, + { + {50, 18, 217}, + {142, 159, 217}, + {49, 130, 217}, + }, + { + {48, 131, 218}, + {141, 158, 218}, + {53, 132, 218}, + }, + { + {141, 158, 219}, + {52, 133, 219}, + {53, 132, 219}, + }, + { + {49, 130, 220}, + {142, 159, 220}, + {141, 158, 220}, + }, + { + {142, 159, 221}, + {143, 160, 221}, + {141, 158, 221}, + }, + { + {141, 158, 222}, + {143, 160, 222}, + {52, 133, 222}, + }, + { + {143, 160, 223}, + {51, 28, 223}, + {52, 133, 223}, + }, + { + {50, 18, 224}, + {20, 17, 224}, + {142, 159, 224}, + }, + { + {20, 17, 225}, + {19, 161, 225}, + {142, 159, 225}, + }, + { + {142, 159, 226}, + {19, 161, 226}, + {143, 160, 226}, + }, + { + {19, 161, 227}, + {18, 162, 227}, + {143, 160, 227}, + }, + { + {143, 160, 228}, + {18, 162, 228}, + {51, 28, 228}, + }, + { + {18, 162, 229}, + {1, 3, 229}, + {51, 28, 229}, + }, + { + {42, 138, 230}, + {47, 104, 230}, + {10, 45, 230}, + }, + { + {43, 137, 231}, + {144, 163, 231}, + {42, 138, 231}, + }, + { + {44, 15, 232}, + {145, 164, 232}, + {43, 137, 232}, + }, + { + {42, 138, 233}, + {144, 163, 233}, + {47, 104, 233}, + }, + { + {144, 163, 234}, + {46, 105, 234}, + {47, 104, 234}, + }, + { + {43, 137, 235}, + {145, 164, 235}, + {144, 163, 235}, + }, + { + {145, 164, 236}, + {146, 165, 236}, + {144, 163, 236}, + }, + { + {144, 163, 237}, + {146, 165, 237}, + {46, 105, 237}, + }, + { + {146, 165, 238}, + {45, 32, 238}, + {46, 105, 238}, + }, + { + {44, 15, 239}, + {23, 5, 239}, + {145, 164, 239}, + }, + { + {23, 5, 240}, + {22, 166, 240}, + {145, 164, 240}, + }, + { + {145, 164, 241}, + {22, 166, 241}, + {146, 165, 241}, + }, + { + {22, 166, 242}, + {21, 167, 242}, + {146, 165, 242}, + }, + { + {146, 165, 243}, + {21, 167, 243}, + {45, 32, 243}, + }, + { + {21, 167, 244}, + {5, 25, 244}, + {45, 32, 244}, + }, + { + {26, 168, 245}, + {41, 26, 245}, + {5, 25, 245}, + }, + { + {25, 169, 246}, + {147, 170, 246}, + {26, 168, 246}, + }, + { + {24, 14, 247}, + {148, 171, 247}, + {25, 169, 247}, + }, + { + {26, 168, 248}, + {147, 170, 248}, + {41, 26, 248}, + }, + { + {147, 170, 249}, + {40, 142, 249}, + {41, 26, 249}, + }, + { + {25, 169, 250}, + {148, 171, 250}, + {147, 170, 250}, + }, + { + {148, 171, 251}, + {149, 172, 251}, + {147, 170, 251}, + }, + { + {147, 170, 252}, + {149, 172, 252}, + {40, 142, 252}, + }, + { + {149, 172, 253}, + {39, 143, 253}, + {40, 142, 253}, + }, + { + {24, 14, 254}, + {35, 13, 254}, + {148, 171, 254}, + }, + { + {35, 13, 255}, + {34, 173, 255}, + {148, 171, 255}, + }, + { + {148, 171, 256}, + {34, 173, 256}, + {149, 172, 256}, + }, + { + {34, 173, 257}, + {33, 174, 257}, + {149, 172, 257}, + }, + { + {149, 172, 258}, + {33, 174, 258}, + {39, 143, 258}, + }, + { + {33, 174, 259}, + {4, 22, 259}, + {39, 143, 259}, + }, + { + {33, 175, 260}, + {38, 23, 260}, + {4, 22, 260}, + }, + { + {34, 176, 261}, + {150, 177, 261}, + {33, 175, 261}, + }, + { + {35, 11, 262}, + {151, 178, 262}, + {34, 176, 262}, + }, + { + {33, 175, 263}, + {150, 177, 263}, + {38, 23, 263}, + }, + { + {150, 177, 264}, + {37, 147, 264}, + {38, 23, 264}, + }, + { + {34, 176, 265}, + {151, 178, 265}, + {150, 177, 265}, + }, + { + {151, 178, 266}, + {152, 179, 266}, + {150, 177, 266}, + }, + { + {150, 177, 267}, + {152, 179, 267}, + {37, 147, 267}, + }, + { + {152, 179, 268}, + {36, 148, 268}, + {37, 147, 268}, + }, + { + {35, 11, 269}, + {29, 10, 269}, + {151, 178, 269}, + }, + { + {29, 10, 270}, + {28, 180, 270}, + {151, 178, 270}, + }, + { + {151, 178, 271}, + {28, 180, 271}, + {152, 179, 271}, + }, + { + {28, 180, 272}, + {27, 181, 272}, + {152, 179, 272}, + }, + { + {152, 179, 273}, + {27, 181, 273}, + {36, 148, 273}, + }, + { + {27, 181, 274}, + {3, 19, 274}, + {36, 148, 274}, + }, + { + {27, 182, 275}, + {32, 20, 275}, + {3, 19, 275}, + }, + { + {28, 183, 276}, + {153, 184, 276}, + {27, 182, 276}, + }, + { + {29, 8, 277}, + {154, 185, 277}, + {28, 183, 277}, + }, + { + {27, 182, 278}, + {153, 184, 278}, + {32, 20, 278}, + }, + { + {153, 184, 279}, + {31, 155, 279}, + {32, 20, 279}, + }, + { + {28, 183, 280}, + {154, 185, 280}, + {153, 184, 280}, + }, + { + {154, 185, 281}, + {155, 186, 281}, + {153, 184, 281}, + }, + { + {153, 184, 282}, + {155, 186, 282}, + {31, 155, 282}, + }, + { + {155, 186, 283}, + {30, 156, 283}, + {31, 155, 283}, + }, + { + {29, 8, 284}, + {14, 7, 284}, + {154, 185, 284}, + }, + { + {14, 7, 285}, + {13, 187, 285}, + {154, 185, 285}, + }, + { + {154, 185, 286}, + {13, 187, 286}, + {155, 186, 286}, + }, + { + {13, 187, 287}, + {12, 188, 287}, + {155, 186, 287}, + }, + { + {155, 186, 288}, + {12, 188, 288}, + {30, 156, 288}, + }, + { + {12, 188, 289}, + {2, 157, 289}, + {30, 156, 289}, + }, + { + {21, 167, 290}, + {26, 189, 290}, + {5, 25, 290}, + }, + { + {22, 166, 291}, + {156, 190, 291}, + {21, 167, 291}, + }, + { + {23, 5, 292}, + {157, 191, 292}, + {22, 166, 292}, + }, + { + {21, 167, 293}, + {156, 190, 293}, + {26, 189, 293}, + }, + { + {156, 190, 294}, + {25, 192, 294}, + {26, 189, 294}, + }, + { + {22, 166, 295}, + {157, 191, 295}, + {156, 190, 295}, + }, + { + {157, 191, 296}, + {158, 193, 296}, + {156, 190, 296}, + }, + { + {156, 190, 297}, + {158, 193, 297}, + {25, 192, 297}, + }, + { + {158, 193, 298}, + {24, 194, 298}, + {25, 192, 298}, + }, + { + {23, 5, 299}, + {17, 4, 299}, + {157, 191, 299}, + }, + { + {17, 4, 300}, + {16, 195, 300}, + {157, 191, 300}, + }, + { + {157, 191, 301}, + {16, 195, 301}, + {158, 193, 301}, + }, + { + {16, 195, 302}, + {15, 196, 302}, + {158, 193, 302}, + }, + { + {158, 193, 303}, + {15, 196, 303}, + {24, 194, 303}, + }, + { + {15, 196, 304}, + {0, 197, 304}, + {24, 194, 304}, + }, + { + {12, 198, 305}, + {20, 17, 305}, + {2, 16, 305}, + }, + { + {13, 199, 306}, + {159, 200, 306}, + {12, 198, 306}, + }, + { + {14, 2, 307}, + {160, 201, 307}, + {13, 199, 307}, + }, + { + {12, 198, 308}, + {159, 200, 308}, + {20, 17, 308}, + }, + { + {159, 200, 309}, + {19, 161, 309}, + {20, 17, 309}, + }, + { + {13, 199, 310}, + {160, 201, 310}, + {159, 200, 310}, + }, + { + {160, 201, 311}, + {161, 202, 311}, + {159, 200, 311}, + }, + { + {159, 200, 312}, + {161, 202, 312}, + {19, 161, 312}, + }, + { + {161, 202, 313}, + {18, 162, 313}, + {19, 161, 313}, + }, + { + {14, 2, 314}, + {15, 1, 314}, + {160, 201, 314}, + }, + { + {15, 1, 315}, + {16, 203, 315}, + {160, 201, 315}, + }, + { + {160, 201, 316}, + {16, 203, 316}, + {161, 202, 316}, + }, + { + {16, 203, 317}, + {17, 204, 317}, + {161, 202, 317}, + }, + { + {161, 202, 318}, + {17, 204, 318}, + {18, 162, 318}, + }, + { + {17, 204, 319}, + {1, 3, 319}, + {18, 162, 319}, + }, +}; + diff --git a/models/icosphere.obj b/models/icosphere.obj new file mode 100644 index 0000000..bc118e6 --- /dev/null +++ b/models/icosphere.obj @@ -0,0 +1,1011 @@ +# Blender 4.1.1 +# www.blender.org +o Icosphere +v 0.000000 -1.000000 0.000000 +v 0.723607 -0.447220 0.525725 +v -0.276388 -0.447220 0.850649 +v -0.894426 -0.447216 0.000000 +v -0.276388 -0.447220 -0.850649 +v 0.723607 -0.447220 -0.525725 +v 0.276388 0.447220 0.850649 +v -0.723607 0.447220 0.525725 +v -0.723607 0.447220 -0.525725 +v 0.276388 0.447220 -0.850649 +v 0.894426 0.447216 0.000000 +v 0.000000 1.000000 0.000000 +v -0.232822 -0.657519 0.716563 +v -0.162456 -0.850654 0.499995 +v -0.077607 -0.967950 0.238853 +v 0.203181 -0.967950 0.147618 +v 0.425323 -0.850654 0.309011 +v 0.609547 -0.657519 0.442856 +v 0.531941 -0.502302 0.681712 +v 0.262869 -0.525738 0.809012 +v -0.029639 -0.502302 0.864184 +v 0.812729 -0.502301 -0.295238 +v 0.850648 -0.525736 0.000000 +v 0.812729 -0.502301 0.295238 +v 0.203181 -0.967950 -0.147618 +v 0.425323 -0.850654 -0.309011 +v 0.609547 -0.657519 -0.442856 +v -0.753442 -0.657515 0.000000 +v -0.525730 -0.850652 0.000000 +v -0.251147 -0.967949 0.000000 +v -0.483971 -0.502302 0.716565 +v -0.688189 -0.525736 0.499997 +v -0.831051 -0.502299 0.238853 +v -0.232822 -0.657519 -0.716563 +v -0.162456 -0.850654 -0.499995 +v -0.077607 -0.967950 -0.238853 +v -0.831051 -0.502299 -0.238853 +v -0.688189 -0.525736 -0.499997 +v -0.483971 -0.502302 -0.716565 +v -0.029639 -0.502302 -0.864184 +v 0.262869 -0.525738 -0.809012 +v 0.531941 -0.502302 -0.681712 +v 0.956626 0.251149 0.147618 +v 0.951058 -0.000000 0.309013 +v 0.860698 -0.251151 0.442858 +v 0.860698 -0.251151 -0.442858 +v 0.951058 0.000000 -0.309013 +v 0.956626 0.251149 -0.147618 +v 0.155215 0.251152 0.955422 +v 0.000000 -0.000000 1.000000 +v -0.155215 -0.251152 0.955422 +v 0.687159 -0.251152 0.681715 +v 0.587786 0.000000 0.809017 +v 0.436007 0.251152 0.864188 +v -0.860698 0.251151 0.442858 +v -0.951058 -0.000000 0.309013 +v -0.956626 -0.251149 0.147618 +v -0.436007 -0.251152 0.864188 +v -0.587786 0.000000 0.809017 +v -0.687159 0.251152 0.681715 +v -0.687159 0.251152 -0.681715 +v -0.587786 -0.000000 -0.809017 +v -0.436007 -0.251152 -0.864188 +v -0.956626 -0.251149 -0.147618 +v -0.951058 0.000000 -0.309013 +v -0.860698 0.251151 -0.442858 +v 0.436007 0.251152 -0.864188 +v 0.587786 -0.000000 -0.809017 +v 0.687159 -0.251152 -0.681715 +v -0.155215 -0.251152 -0.955422 +v 0.000000 0.000000 -1.000000 +v 0.155215 0.251152 -0.955422 +v 0.831051 0.502299 0.238853 +v 0.688189 0.525736 0.499997 +v 0.483971 0.502302 0.716565 +v 0.029639 0.502302 0.864184 +v -0.262869 0.525738 0.809012 +v -0.531941 0.502302 0.681712 +v -0.812729 0.502301 0.295238 +v -0.850648 0.525736 0.000000 +v -0.812729 0.502301 -0.295238 +v -0.531941 0.502302 -0.681712 +v -0.262869 0.525738 -0.809012 +v 0.029639 0.502302 -0.864184 +v 0.483971 0.502302 -0.716565 +v 0.688189 0.525736 -0.499997 +v 0.831051 0.502299 -0.238853 +v 0.077607 0.967950 0.238853 +v 0.162456 0.850654 0.499995 +v 0.232822 0.657519 0.716563 +v 0.753442 0.657515 0.000000 +v 0.525730 0.850652 0.000000 +v 0.251147 0.967949 0.000000 +v -0.203181 0.967950 0.147618 +v -0.425323 0.850654 0.309011 +v -0.609547 0.657519 0.442856 +v -0.203181 0.967950 -0.147618 +v -0.425323 0.850654 -0.309011 +v -0.609547 0.657519 -0.442856 +v 0.077607 0.967950 -0.238853 +v 0.162456 0.850654 -0.499995 +v 0.232822 0.657519 -0.716563 +v 0.361800 0.894429 -0.262863 +v 0.638194 0.723610 -0.262864 +v 0.447209 0.723612 -0.525728 +v -0.138197 0.894430 -0.425319 +v -0.052790 0.723612 -0.688185 +v -0.361804 0.723612 -0.587778 +v -0.447210 0.894429 0.000000 +v -0.670817 0.723611 -0.162457 +v -0.670817 0.723611 0.162457 +v -0.138197 0.894430 0.425319 +v -0.361804 0.723612 0.587778 +v -0.052790 0.723612 0.688185 +v 0.361800 0.894429 0.262863 +v 0.447209 0.723612 0.525728 +v 0.638194 0.723610 0.262864 +v 0.861804 0.276396 -0.425322 +v 0.809019 0.000000 -0.587782 +v 0.670821 0.276397 -0.688189 +v -0.138199 0.276397 -0.951055 +v -0.309016 -0.000000 -0.951057 +v -0.447215 0.276397 -0.850649 +v -0.947213 0.276396 -0.162458 +v -1.000000 0.000001 0.000000 +v -0.947213 0.276397 0.162458 +v -0.447216 0.276397 0.850648 +v -0.309017 -0.000001 0.951056 +v -0.138199 0.276397 0.951055 +v 0.670820 0.276396 0.688190 +v 0.809019 -0.000002 0.587783 +v 0.861804 0.276394 0.425323 +v 0.309017 -0.000000 -0.951056 +v 0.447216 -0.276398 -0.850648 +v 0.138199 -0.276398 -0.951055 +v -0.809018 -0.000000 -0.587783 +v -0.670819 -0.276397 -0.688191 +v -0.861803 -0.276396 -0.425324 +v -0.809018 0.000000 0.587783 +v -0.861803 -0.276396 0.425324 +v -0.670819 -0.276397 0.688191 +v 0.309017 0.000000 0.951056 +v 0.138199 -0.276398 0.951055 +v 0.447216 -0.276398 0.850648 +v 1.000000 0.000000 0.000000 +v 0.947213 -0.276396 0.162458 +v 0.947213 -0.276396 -0.162458 +v 0.361803 -0.723612 -0.587779 +v 0.138197 -0.894429 -0.425321 +v 0.052789 -0.723611 -0.688186 +v -0.447211 -0.723612 -0.525727 +v -0.361801 -0.894429 -0.262863 +v -0.638195 -0.723609 -0.262863 +v -0.638195 -0.723609 0.262864 +v -0.361801 -0.894428 0.262864 +v -0.447211 -0.723610 0.525729 +v 0.670817 -0.723611 -0.162457 +v 0.670818 -0.723610 0.162458 +v 0.447211 -0.894428 0.000001 +v 0.052790 -0.723612 0.688185 +v 0.138199 -0.894429 0.425321 +v 0.361805 -0.723611 0.587779 +vn 0.0482 -0.9878 0.1482 +vn 0.7230 -0.5545 0.4121 +vn -0.1261 -0.9878 0.0916 +vn -0.1261 -0.9878 -0.0916 +vn 0.0482 -0.9878 -0.1482 +vn 0.8193 -0.3987 0.4121 +vn -0.1387 -0.3987 0.9065 +vn -0.9050 -0.3987 0.1482 +vn -0.4206 -0.3987 -0.8149 +vn 0.6451 -0.3987 -0.6519 +vn 0.7711 -0.3024 0.5603 +vn -0.2945 -0.3024 0.9065 +vn -0.9532 -0.3024 -0.0000 +vn -0.2945 -0.3024 -0.9065 +vn 0.7711 -0.3024 -0.5603 +vn 0.3427 0.5545 0.7583 +vn -0.6153 0.5545 0.5603 +vn -0.7230 0.5545 -0.4121 +vn 0.1685 0.5545 -0.8149 +vn 0.8271 0.5545 -0.0916 +vn 0.1261 0.9878 -0.0916 +vn 0.3912 0.9158 -0.0915 +vn 0.6441 0.7594 -0.0915 +vn 0.2334 0.9575 -0.1696 +vn 0.2079 0.9158 -0.3438 +vn 0.5168 0.8363 -0.1830 +vn 0.4911 0.7947 -0.3568 +vn 0.3338 0.8363 -0.4350 +vn 0.2860 0.7594 -0.5843 +vn 0.7520 0.6369 -0.1696 +vn 0.7261 0.5955 -0.3438 +vn 0.5987 0.6726 -0.4350 +vn 0.5513 0.5955 -0.5843 +vn 0.3936 0.6369 -0.6628 +vn 0.3427 0.5545 -0.7583 +vn -0.0482 0.9878 -0.1482 +vn 0.0339 0.9158 -0.4003 +vn 0.1121 0.7594 -0.6409 +vn -0.0891 0.9575 -0.2743 +vn -0.2627 0.9158 -0.3039 +vn -0.0144 0.8363 -0.5481 +vn -0.1876 0.7947 -0.5773 +vn -0.3105 0.8363 -0.4519 +vn -0.4674 0.7594 -0.4526 +vn 0.0711 0.6369 -0.7676 +vn -0.1026 0.5955 -0.7968 +vn -0.2287 0.6726 -0.7038 +vn -0.3854 0.5955 -0.7049 +vn -0.5087 0.6369 -0.5792 +vn -0.6153 0.5545 -0.5603 +vn -0.1558 0.9878 -0.0000 +vn -0.3702 0.9158 -0.1560 +vn -0.5749 0.7594 -0.3046 +vn -0.2885 0.9575 -0.0000 +vn -0.3702 0.9158 0.1560 +vn -0.5257 0.8363 -0.1557 +vn -0.6071 0.7947 -0.0000 +vn -0.5257 0.8363 0.1557 +vn -0.5749 0.7594 0.3046 +vn -0.7081 0.6369 -0.3049 +vn -0.7895 0.5955 -0.1487 +vn -0.7400 0.6726 -0.0000 +vn -0.7895 0.5955 0.1487 +vn -0.7081 0.6369 0.3049 +vn -0.7230 0.5545 0.4121 +vn -0.0482 0.9878 0.1482 +vn -0.2627 0.9158 0.3039 +vn -0.4674 0.7594 0.4526 +vn -0.0891 0.9575 0.2743 +vn 0.0339 0.9158 0.4003 +vn -0.3105 0.8363 0.4519 +vn -0.1876 0.7947 0.5773 +vn -0.0144 0.8363 0.5481 +vn 0.1121 0.7594 0.6409 +vn -0.5087 0.6369 0.5792 +vn -0.3854 0.5955 0.7049 +vn -0.2287 0.6726 0.7038 +vn -0.1026 0.5955 0.7968 +vn 0.0711 0.6369 0.7676 +vn 0.1685 0.5545 0.8149 +vn 0.1261 0.9878 0.0916 +vn 0.2079 0.9158 0.3438 +vn 0.2860 0.7594 0.5843 +vn 0.2334 0.9575 0.1696 +vn 0.3912 0.9158 0.0915 +vn 0.3338 0.8363 0.4350 +vn 0.4911 0.7947 0.3568 +vn 0.5168 0.8363 0.1830 +vn 0.6441 0.7594 0.0915 +vn 0.3936 0.6369 0.6628 +vn 0.5513 0.5955 0.5843 +vn 0.5987 0.6726 0.4350 +vn 0.7261 0.5955 0.3438 +vn 0.7520 0.6369 0.1696 +vn 0.8271 0.5545 0.0916 +vn 0.9050 0.3987 -0.1482 +vn 0.9366 0.1745 -0.3039 +vn 0.8883 -0.0784 -0.4526 +vn 0.8963 0.3485 -0.2743 +vn 0.8039 0.4399 -0.4003 +vn 0.8869 0.0962 -0.4519 +vn 0.7947 0.1876 -0.5773 +vn 0.7544 0.3611 -0.5481 +vn 0.6291 0.4399 -0.6409 +vn 0.7972 -0.1702 -0.5792 +vn 0.7049 -0.0784 -0.7049 +vn 0.7038 0.0962 -0.7038 +vn 0.5785 0.1745 -0.7968 +vn 0.5379 0.3485 -0.7676 +vn 0.4206 0.3987 -0.8149 +vn 0.1387 0.3987 -0.9065 +vn 0.0004 0.1745 -0.9846 +vn -0.1560 -0.0784 -0.9846 +vn 0.0160 0.3485 -0.9372 +vn -0.1323 0.4399 -0.8883 +vn -0.1557 0.0962 -0.9831 +vn -0.3035 0.1876 -0.9342 +vn -0.2882 0.3611 -0.8869 +vn -0.4151 0.4399 -0.7964 +vn -0.3045 -0.1702 -0.9372 +vn -0.4526 -0.0784 -0.8883 +vn -0.4519 0.0962 -0.8869 +vn -0.5791 0.1745 -0.7964 +vn -0.5638 0.3485 -0.7488 +vn -0.6451 0.3987 -0.6519 +vn -0.8193 0.3987 -0.4121 +vn -0.9363 0.1745 -0.3046 +vn -0.9846 -0.0784 -0.1560 +vn -0.8864 0.3485 -0.3049 +vn -0.8857 0.4399 -0.1487 +vn -0.9831 0.0962 -0.1557 +vn -0.9822 0.1876 -0.0000 +vn -0.9325 0.3611 -0.0000 +vn -0.8857 0.4399 0.1487 +vn -0.9854 -0.1702 -0.0000 +vn -0.9846 -0.0784 0.1560 +vn -0.9831 0.0962 0.1557 +vn -0.9363 0.1745 0.3046 +vn -0.8864 0.3485 0.3049 +vn -0.8193 0.3987 0.4121 +vn -0.6451 0.3987 0.6519 +vn -0.5791 0.1745 0.7964 +vn -0.4526 -0.0784 0.8883 +vn -0.5638 0.3485 0.7488 +vn -0.4151 0.4399 0.7964 +vn -0.4519 0.0962 0.8869 +vn -0.3035 0.1876 0.9342 +vn -0.2882 0.3611 0.8869 +vn -0.1323 0.4399 0.8883 +vn -0.3045 -0.1702 0.9372 +vn -0.1560 -0.0784 0.9846 +vn -0.1557 0.0962 0.9831 +vn 0.0004 0.1745 0.9846 +vn 0.0160 0.3485 0.9372 +vn 0.1387 0.3987 0.9065 +vn 0.4206 0.3987 0.8149 +vn 0.5785 0.1745 0.7968 +vn 0.7049 -0.0784 0.7049 +vn 0.5379 0.3485 0.7676 +vn 0.6291 0.4399 0.6409 +vn 0.7038 0.0962 0.7038 +vn 0.7947 0.1876 0.5773 +vn 0.7544 0.3611 0.5481 +vn 0.8039 0.4399 0.4003 +vn 0.7972 -0.1702 0.5792 +vn 0.8883 -0.0784 0.4526 +vn 0.8869 0.0962 0.4519 +vn 0.9366 0.1745 0.3039 +vn 0.8963 0.3485 0.2744 +vn 0.9050 0.3987 0.1482 +vn 0.2945 0.3024 -0.9065 +vn 0.4526 0.0784 -0.8883 +vn 0.5791 -0.1745 -0.7964 +vn 0.3045 0.1702 -0.9372 +vn 0.1560 0.0784 -0.9846 +vn 0.4519 -0.0962 -0.8869 +vn 0.3035 -0.1876 -0.9342 +vn 0.1557 -0.0962 -0.9831 +vn -0.0004 -0.1745 -0.9846 +vn 0.5638 -0.3485 -0.7488 +vn 0.4151 -0.4399 -0.7964 +vn 0.2882 -0.3611 -0.8869 +vn 0.1323 -0.4399 -0.8883 +vn -0.0160 -0.3485 -0.9372 +vn -0.1387 -0.3987 -0.9065 +vn -0.7711 0.3024 -0.5603 +vn -0.7049 0.0784 -0.7049 +vn -0.5785 -0.1745 -0.7968 +vn -0.7972 0.1702 -0.5792 +vn -0.8883 0.0784 -0.4526 +vn -0.7038 -0.0962 -0.7038 +vn -0.7947 -0.1876 -0.5774 +vn -0.8869 -0.0962 -0.4519 +vn -0.9366 -0.1745 -0.3039 +vn -0.5379 -0.3485 -0.7676 +vn -0.6291 -0.4399 -0.6409 +vn -0.7544 -0.3611 -0.5481 +vn -0.8039 -0.4399 -0.4003 +vn -0.8963 -0.3485 -0.2744 +vn -0.9050 -0.3987 -0.1482 +vn -0.7711 0.3024 0.5603 +vn -0.8883 0.0784 0.4526 +vn -0.9366 -0.1745 0.3039 +vn -0.7972 0.1702 0.5792 +vn -0.7049 0.0784 0.7049 +vn -0.8869 -0.0962 0.4519 +vn -0.7947 -0.1876 0.5774 +vn -0.7038 -0.0962 0.7038 +vn -0.5785 -0.1745 0.7968 +vn -0.8963 -0.3485 0.2744 +vn -0.8039 -0.4399 0.4003 +vn -0.7544 -0.3611 0.5481 +vn -0.6291 -0.4399 0.6409 +vn -0.5379 -0.3485 0.7676 +vn -0.4206 -0.3987 0.8149 +vn 0.2945 0.3024 0.9065 +vn 0.1560 0.0784 0.9846 +vn -0.0004 -0.1745 0.9846 +vn 0.3045 0.1702 0.9372 +vn 0.4526 0.0784 0.8883 +vn 0.1557 -0.0962 0.9831 +vn 0.3035 -0.1876 0.9342 +vn 0.4519 -0.0962 0.8869 +vn 0.5791 -0.1745 0.7964 +vn -0.0160 -0.3485 0.9372 +vn 0.1323 -0.4399 0.8883 +vn 0.2882 -0.3611 0.8869 +vn 0.4151 -0.4399 0.7964 +vn 0.5638 -0.3485 0.7488 +vn 0.6451 -0.3987 0.6519 +vn 0.9532 0.3024 -0.0000 +vn 0.9846 0.0784 0.1560 +vn 0.9363 -0.1745 0.3046 +vn 0.9854 0.1702 -0.0000 +vn 0.9846 0.0784 -0.1560 +vn 0.9831 -0.0962 0.1557 +vn 0.9822 -0.1876 -0.0000 +vn 0.9831 -0.0962 -0.1557 +vn 0.9363 -0.1745 -0.3046 +vn 0.8864 -0.3485 0.3049 +vn 0.8857 -0.4399 0.1487 +vn 0.9325 -0.3611 -0.0000 +vn 0.8857 -0.4399 -0.1487 +vn 0.8864 -0.3485 -0.3049 +vn 0.8193 -0.3987 -0.4121 +vn 0.6153 -0.5545 -0.5603 +vn 0.4674 -0.7594 -0.4526 +vn 0.2627 -0.9158 -0.3039 +vn 0.5087 -0.6369 -0.5792 +vn 0.3854 -0.5955 -0.7049 +vn 0.3105 -0.8363 -0.4519 +vn 0.1876 -0.7947 -0.5773 +vn 0.2287 -0.6726 -0.7038 +vn 0.1026 -0.5955 -0.7968 +vn 0.0891 -0.9575 -0.2744 +vn -0.0339 -0.9158 -0.4003 +vn 0.0144 -0.8363 -0.5481 +vn -0.1121 -0.7594 -0.6409 +vn -0.0711 -0.6369 -0.7676 +vn -0.1685 -0.5545 -0.8149 +vn -0.3427 -0.5545 -0.7583 +vn -0.2860 -0.7594 -0.5843 +vn -0.2079 -0.9158 -0.3438 +vn -0.3936 -0.6369 -0.6628 +vn -0.5513 -0.5955 -0.5843 +vn -0.3338 -0.8363 -0.4350 +vn -0.4911 -0.7947 -0.3568 +vn -0.5987 -0.6726 -0.4350 +vn -0.7261 -0.5955 -0.3438 +vn -0.2334 -0.9575 -0.1696 +vn -0.3912 -0.9158 -0.0915 +vn -0.5168 -0.8363 -0.1830 +vn -0.6441 -0.7594 -0.0915 +vn -0.7520 -0.6369 -0.1696 +vn -0.8271 -0.5545 -0.0916 +vn -0.8271 -0.5545 0.0916 +vn -0.6441 -0.7594 0.0915 +vn -0.3912 -0.9158 0.0915 +vn -0.7520 -0.6369 0.1696 +vn -0.7261 -0.5955 0.3438 +vn -0.5168 -0.8363 0.1830 +vn -0.4911 -0.7947 0.3568 +vn -0.5987 -0.6726 0.4350 +vn -0.5513 -0.5955 0.5843 +vn -0.2334 -0.9575 0.1696 +vn -0.2079 -0.9158 0.3438 +vn -0.3338 -0.8363 0.4350 +vn -0.2860 -0.7594 0.5843 +vn -0.3936 -0.6369 0.6628 +vn -0.3427 -0.5545 0.7583 +vn 0.7230 -0.5545 -0.4121 +vn 0.7895 -0.5955 -0.1487 +vn 0.7895 -0.5955 0.1487 +vn 0.7081 -0.6369 -0.3049 +vn 0.5749 -0.7594 -0.3046 +vn 0.7400 -0.6726 -0.0000 +vn 0.6071 -0.7947 -0.0000 +vn 0.5257 -0.8363 -0.1557 +vn 0.3702 -0.9158 -0.1559 +vn 0.7081 -0.6369 0.3049 +vn 0.5749 -0.7594 0.3046 +vn 0.5257 -0.8363 0.1557 +vn 0.3702 -0.9158 0.1560 +vn 0.2885 -0.9575 -0.0000 +vn 0.1558 -0.9878 -0.0000 +vn -0.1685 -0.5545 0.8149 +vn -0.1121 -0.7594 0.6409 +vn -0.0339 -0.9158 0.4003 +vn -0.0711 -0.6369 0.7676 +vn 0.1026 -0.5955 0.7968 +vn 0.0144 -0.8363 0.5481 +vn 0.1876 -0.7947 0.5773 +vn 0.2287 -0.6726 0.7038 +vn 0.3854 -0.5955 0.7049 +vn 0.0891 -0.9575 0.2743 +vn 0.2627 -0.9158 0.3039 +vn 0.3105 -0.8363 0.4519 +vn 0.4674 -0.7594 0.4526 +vn 0.5087 -0.6369 0.5792 +vn 0.6153 -0.5545 0.5603 +vt 0.181819 0.000000 +vt 0.204546 0.039365 +vt 0.159092 0.039365 +vt 0.272728 0.157461 +vt 0.295455 0.118096 +vt 0.318182 0.157461 +vt 0.909091 0.000000 +vt 0.931818 0.039365 +vt 0.886364 0.039365 +vt 0.727273 0.000000 +vt 0.750000 0.039365 +vt 0.704546 0.039365 +vt 0.545455 0.000000 +vt 0.568182 0.039365 +vt 0.522728 0.039365 +vt 0.295455 0.196826 +vt 0.090910 0.157461 +vt 0.136364 0.157461 +vt 0.113637 0.196826 +vt 0.818182 0.157461 +vt 0.863636 0.157461 +vt 0.840909 0.196826 +vt 0.636364 0.157461 +vt 0.681818 0.157461 +vt 0.659091 0.196826 +vt 0.454546 0.157461 +vt 0.500000 0.157461 +vt 0.477273 0.196826 +vt 0.250001 0.196826 +vt 0.068182 0.196826 +vt 0.795455 0.196826 +vt 0.613637 0.196826 +vt 0.431819 0.196826 +vt 0.181819 0.314921 +vt 0.227273 0.314921 +vt 0.204546 0.354286 +vt 0.000000 0.314921 +vt 0.045455 0.314921 +vt 0.022727 0.354286 +vt 0.727273 0.314921 +vt 0.772727 0.314921 +vt 0.750000 0.354286 +vt 0.545455 0.314921 +vt 0.590909 0.314921 +vt 0.568182 0.354286 +vt 0.363637 0.314921 +vt 0.409091 0.314921 +vt 0.386364 0.354286 +vt 0.431819 0.433017 +vt 0.477273 0.433017 +vt 0.454546 0.472382 +vt 0.409091 0.393651 +vt 0.454546 0.393651 +vt 0.431819 0.354286 +vt 0.500000 0.393651 +vt 0.477273 0.354286 +vt 0.522728 0.354286 +vt 0.454546 0.314921 +vt 0.500000 0.314921 +vt 0.613637 0.433017 +vt 0.659091 0.433017 +vt 0.636364 0.472382 +vt 0.590909 0.393651 +vt 0.636364 0.393651 +vt 0.613637 0.354286 +vt 0.681818 0.393651 +vt 0.659091 0.354286 +vt 0.704546 0.354286 +vt 0.636364 0.314921 +vt 0.681818 0.314921 +vt 0.795455 0.433017 +vt 0.840909 0.433017 +vt 0.818182 0.472382 +vt 0.772727 0.393651 +vt 0.818182 0.393651 +vt 0.795455 0.354286 +vt 0.863636 0.393651 +vt 0.840909 0.354286 +vt 0.886364 0.354286 +vt 0.818182 0.314921 +vt 0.863636 0.314921 +vt 0.909091 0.314921 +vt 0.068182 0.433017 +vt 0.113637 0.433017 +vt 0.090910 0.472382 +vt 0.045455 0.393651 +vt 0.090910 0.393651 +vt 0.068182 0.354286 +vt 0.136365 0.393651 +vt 0.113637 0.354286 +vt 0.159092 0.354286 +vt 0.090909 0.314921 +vt 0.136364 0.314921 +vt 0.250001 0.433017 +vt 0.295455 0.433017 +vt 0.272728 0.472382 +vt 0.227273 0.393651 +vt 0.272728 0.393651 +vt 0.250001 0.354286 +vt 0.318182 0.393651 +vt 0.295455 0.354286 +vt 0.340910 0.354286 +vt 0.272728 0.314921 +vt 0.318182 0.314921 +vt 0.386364 0.275556 +vt 0.409091 0.236191 +vt 0.431819 0.275556 +vt 0.454546 0.236191 +vt 0.477273 0.275556 +vt 0.500000 0.236191 +vt 0.522728 0.275556 +vt 0.568182 0.275556 +vt 0.590909 0.236191 +vt 0.613637 0.275556 +vt 0.636364 0.236191 +vt 0.659091 0.275556 +vt 0.681818 0.236191 +vt 0.704546 0.275556 +vt 0.750000 0.275556 +vt 0.772727 0.236191 +vt 0.795455 0.275556 +vt 0.818182 0.236191 +vt 0.840909 0.275556 +vt 0.863636 0.236191 +vt 0.886364 0.275556 +vt 0.022727 0.275556 +vt 0.045455 0.236191 +vt 0.068182 0.275556 +vt 0.090910 0.236191 +vt 0.113637 0.275556 +vt 0.136364 0.236191 +vt 0.159092 0.275556 +vt 0.204546 0.275556 +vt 0.227273 0.236191 +vt 0.250001 0.275556 +vt 0.272728 0.236191 +vt 0.295455 0.275556 +vt 0.318182 0.236191 +vt 0.340910 0.275556 +vt 0.545455 0.236191 +vt 0.522728 0.196826 +vt 0.568182 0.196826 +vt 0.545455 0.157461 +vt 0.590909 0.157461 +vt 0.727273 0.236191 +vt 0.704546 0.196826 +vt 0.750000 0.196826 +vt 0.727273 0.157461 +vt 0.772727 0.157461 +vt 0.931818 0.275556 +vt 0.909091 0.236191 +vt 0.886364 0.196826 +vt 0.954545 0.236191 +vt 0.931818 0.196826 +vt 0.977273 0.196826 +vt 0.909091 0.157461 +vt 0.954545 0.157461 +vt 1.000000 0.157461 +vt 0.181819 0.236191 +vt 0.159092 0.196826 +vt 0.204546 0.196826 +vt 0.181819 0.157461 +vt 0.227274 0.157461 +vt 0.363637 0.236191 +vt 0.340910 0.196826 +vt 0.386364 0.196826 +vt 0.363637 0.157461 +vt 0.409092 0.157461 +vt 0.477273 0.118096 +vt 0.500000 0.078731 +vt 0.522728 0.118096 +vt 0.545455 0.078731 +vt 0.568182 0.118096 +vt 0.590909 0.078731 +vt 0.613637 0.118096 +vt 0.659091 0.118096 +vt 0.681818 0.078731 +vt 0.704546 0.118096 +vt 0.727273 0.078731 +vt 0.750000 0.118096 +vt 0.772727 0.078731 +vt 0.795455 0.118096 +vt 0.840909 0.118096 +vt 0.863636 0.078731 +vt 0.886364 0.118096 +vt 0.909091 0.078731 +vt 0.931818 0.118096 +vt 0.954545 0.078731 +vt 0.977273 0.118096 +vt 0.431819 0.118096 +vt 0.386364 0.118096 +vt 0.340910 0.118096 +vt 0.409091 0.078731 +vt 0.363637 0.078730 +vt 0.386364 0.039365 +vt 0.318182 0.078731 +vt 0.340910 0.039365 +vt 0.363637 0.000000 +vt 0.113637 0.118096 +vt 0.136365 0.078731 +vt 0.159092 0.118096 +vt 0.181819 0.078731 +vt 0.204546 0.118096 +vt 0.227273 0.078731 +vt 0.250001 0.118096 +s 0 +f 1/1/1 16/2/1 15/3/1 +f 2/4/2 18/5/2 24/6/2 +f 1/7/3 15/8/3 30/9/3 +f 1/10/4 30/11/4 36/12/4 +f 1/13/5 36/14/5 25/15/5 +f 2/4/6 24/6/6 45/16/6 +f 3/17/7 21/18/7 51/19/7 +f 4/20/8 33/21/8 57/22/8 +f 5/23/9 39/24/9 63/25/9 +f 6/26/10 42/27/10 69/28/10 +f 2/4/11 45/16/11 52/29/11 +f 3/17/12 51/19/12 58/30/12 +f 4/20/13 57/22/13 64/31/13 +f 5/23/14 63/25/14 70/32/14 +f 6/26/15 69/28/15 46/33/15 +f 7/34/16 75/35/16 90/36/16 +f 8/37/17 78/38/17 96/39/17 +f 9/40/18 81/41/18 99/42/18 +f 10/43/19 84/44/19 102/45/19 +f 11/46/20 87/47/20 91/48/20 +f 93/49/21 100/50/21 12/51/21 +f 92/52/22 103/53/22 93/49/22 +f 91/48/23 104/54/23 92/52/23 +f 93/49/24 103/53/24 100/50/24 +f 103/53/25 101/55/25 100/50/25 +f 92/52/26 104/54/26 103/53/26 +f 104/54/27 105/56/27 103/53/27 +f 103/53/28 105/56/28 101/55/28 +f 105/56/29 102/57/29 101/55/29 +f 91/48/30 87/47/30 104/54/30 +f 87/47/31 86/58/31 104/54/31 +f 104/54/32 86/58/32 105/56/32 +f 86/58/33 85/59/33 105/56/33 +f 105/56/34 85/59/34 102/57/34 +f 85/59/35 10/43/35 102/57/35 +f 100/60/36 97/61/36 12/62/36 +f 101/63/37 106/64/37 100/60/37 +f 102/45/38 107/65/38 101/63/38 +f 100/60/39 106/64/39 97/61/39 +f 106/64/40 98/66/40 97/61/40 +f 101/63/41 107/65/41 106/64/41 +f 107/65/42 108/67/42 106/64/42 +f 106/64/43 108/67/43 98/66/43 +f 108/67/44 99/68/44 98/66/44 +f 102/45/45 84/44/45 107/65/45 +f 84/44/46 83/69/46 107/65/46 +f 107/65/47 83/69/47 108/67/47 +f 83/69/48 82/70/48 108/67/48 +f 108/67/49 82/70/49 99/68/49 +f 82/70/50 9/40/50 99/68/50 +f 97/71/51 94/72/51 12/73/51 +f 98/74/52 109/75/52 97/71/52 +f 99/42/53 110/76/53 98/74/53 +f 97/71/54 109/75/54 94/72/54 +f 109/75/55 95/77/55 94/72/55 +f 98/74/56 110/76/56 109/75/56 +f 110/76/57 111/78/57 109/75/57 +f 109/75/58 111/78/58 95/77/58 +f 111/78/59 96/79/59 95/77/59 +f 99/42/60 81/41/60 110/76/60 +f 81/41/61 80/80/61 110/76/61 +f 110/76/62 80/80/62 111/78/62 +f 80/80/63 79/81/63 111/78/63 +f 111/78/64 79/81/64 96/79/64 +f 79/81/65 8/82/65 96/79/65 +f 94/83/66 88/84/66 12/85/66 +f 95/86/67 112/87/67 94/83/67 +f 96/39/68 113/88/68 95/86/68 +f 94/83/69 112/87/69 88/84/69 +f 112/87/70 89/89/70 88/84/70 +f 95/86/71 113/88/71 112/87/71 +f 113/88/72 114/90/72 112/87/72 +f 112/87/73 114/90/73 89/89/73 +f 114/90/74 90/91/74 89/89/74 +f 96/39/75 78/38/75 113/88/75 +f 78/38/76 77/92/76 113/88/76 +f 113/88/77 77/92/77 114/90/77 +f 77/92/78 76/93/78 114/90/78 +f 114/90/79 76/93/79 90/91/79 +f 76/93/80 7/34/80 90/91/80 +f 88/94/81 93/95/81 12/96/81 +f 89/97/82 115/98/82 88/94/82 +f 90/36/83 116/99/83 89/97/83 +f 88/94/84 115/98/84 93/95/84 +f 115/98/85 92/100/85 93/95/85 +f 89/97/86 116/99/86 115/98/86 +f 116/99/87 117/101/87 115/98/87 +f 115/98/88 117/101/88 92/100/88 +f 117/101/89 91/102/89 92/100/89 +f 90/36/90 75/35/90 116/99/90 +f 75/35/91 74/103/91 116/99/91 +f 116/99/92 74/103/92 117/101/92 +f 74/103/93 73/104/93 117/101/93 +f 117/101/94 73/104/94 91/102/94 +f 73/104/95 11/46/95 91/102/95 +f 48/105/96 87/47/96 11/46/96 +f 47/106/97 118/107/97 48/105/97 +f 46/33/98 119/108/98 47/106/98 +f 48/105/99 118/107/99 87/47/99 +f 118/107/100 86/58/100 87/47/100 +f 47/106/101 119/108/101 118/107/101 +f 119/108/102 120/109/102 118/107/102 +f 118/107/103 120/109/103 86/58/103 +f 120/109/104 85/59/104 86/58/104 +f 46/33/105 69/28/105 119/108/105 +f 69/28/106 68/110/106 119/108/106 +f 119/108/107 68/110/107 120/109/107 +f 68/110/108 67/111/108 120/109/108 +f 120/109/109 67/111/109 85/59/109 +f 67/111/110 10/43/110 85/59/110 +f 72/112/111 84/44/111 10/43/111 +f 71/113/112 121/114/112 72/112/112 +f 70/32/113 122/115/113 71/113/113 +f 72/112/114 121/114/114 84/44/114 +f 121/114/115 83/69/115 84/44/115 +f 71/113/116 122/115/116 121/114/116 +f 122/115/117 123/116/117 121/114/117 +f 121/114/118 123/116/118 83/69/118 +f 123/116/119 82/70/119 83/69/119 +f 70/32/120 63/25/120 122/115/120 +f 63/25/121 62/117/121 122/115/121 +f 122/115/122 62/117/122 123/116/122 +f 62/117/123 61/118/123 123/116/123 +f 123/116/124 61/118/124 82/70/124 +f 61/118/125 9/40/125 82/70/125 +f 66/119/126 81/41/126 9/40/126 +f 65/120/127 124/121/127 66/119/127 +f 64/31/128 125/122/128 65/120/128 +f 66/119/129 124/121/129 81/41/129 +f 124/121/130 80/80/130 81/41/130 +f 65/120/131 125/122/131 124/121/131 +f 125/122/132 126/123/132 124/121/132 +f 124/121/133 126/123/133 80/80/133 +f 126/123/134 79/81/134 80/80/134 +f 64/31/135 57/22/135 125/122/135 +f 57/22/136 56/124/136 125/122/136 +f 125/122/137 56/124/137 126/123/137 +f 56/124/138 55/125/138 126/123/138 +f 126/123/139 55/125/139 79/81/139 +f 55/125/140 8/82/140 79/81/140 +f 60/126/141 78/38/141 8/37/141 +f 59/127/142 127/128/142 60/126/142 +f 58/30/143 128/129/143 59/127/143 +f 60/126/144 127/128/144 78/38/144 +f 127/128/145 77/92/145 78/38/145 +f 59/127/146 128/129/146 127/128/146 +f 128/129/147 129/130/147 127/128/147 +f 127/128/148 129/130/148 77/92/148 +f 129/130/149 76/93/149 77/92/149 +f 58/30/150 51/19/150 128/129/150 +f 51/19/151 50/131/151 128/129/151 +f 128/129/152 50/131/152 129/130/152 +f 50/131/153 49/132/153 129/130/153 +f 129/130/154 49/132/154 76/93/154 +f 49/132/155 7/34/155 76/93/155 +f 54/133/156 75/35/156 7/34/156 +f 53/134/157 130/135/157 54/133/157 +f 52/29/158 131/136/158 53/134/158 +f 54/133/159 130/135/159 75/35/159 +f 130/135/160 74/103/160 75/35/160 +f 53/134/161 131/136/161 130/135/161 +f 131/136/162 132/137/162 130/135/162 +f 130/135/163 132/137/163 74/103/163 +f 132/137/164 73/104/164 74/103/164 +f 52/29/165 45/16/165 131/136/165 +f 45/16/166 44/138/166 131/136/166 +f 131/136/167 44/138/167 132/137/167 +f 44/138/168 43/139/168 132/137/168 +f 132/137/169 43/139/169 73/104/169 +f 43/139/170 11/46/170 73/104/170 +f 67/111/171 72/112/171 10/43/171 +f 68/110/172 133/140/172 67/111/172 +f 69/28/173 134/141/173 68/110/173 +f 67/111/174 133/140/174 72/112/174 +f 133/140/175 71/113/175 72/112/175 +f 68/110/176 134/141/176 133/140/176 +f 134/141/177 135/142/177 133/140/177 +f 133/140/178 135/142/178 71/113/178 +f 135/142/179 70/32/179 71/113/179 +f 69/28/180 42/27/180 134/141/180 +f 42/27/181 41/143/181 134/141/181 +f 134/141/182 41/143/182 135/142/182 +f 41/143/183 40/144/183 135/142/183 +f 135/142/184 40/144/184 70/32/184 +f 40/144/185 5/23/185 70/32/185 +f 61/118/186 66/119/186 9/40/186 +f 62/117/187 136/145/187 61/118/187 +f 63/25/188 137/146/188 62/117/188 +f 61/118/189 136/145/189 66/119/189 +f 136/145/190 65/120/190 66/119/190 +f 62/117/191 137/146/191 136/145/191 +f 137/146/192 138/147/192 136/145/192 +f 136/145/193 138/147/193 65/120/193 +f 138/147/194 64/31/194 65/120/194 +f 63/25/195 39/24/195 137/146/195 +f 39/24/196 38/148/196 137/146/196 +f 137/146/197 38/148/197 138/147/197 +f 38/148/198 37/149/198 138/147/198 +f 138/147/199 37/149/199 64/31/199 +f 37/149/200 4/20/200 64/31/200 +f 55/125/201 60/150/201 8/82/201 +f 56/124/202 139/151/202 55/125/202 +f 57/22/203 140/152/203 56/124/203 +f 55/125/204 139/151/204 60/150/204 +f 139/151/205 59/153/205 60/150/205 +f 56/124/206 140/152/206 139/151/206 +f 140/152/207 141/154/207 139/151/207 +f 139/151/208 141/154/208 59/153/208 +f 141/154/209 58/155/209 59/153/209 +f 57/22/210 33/21/210 140/152/210 +f 33/21/211 32/156/211 140/152/211 +f 140/152/212 32/156/212 141/154/212 +f 32/156/213 31/157/213 141/154/213 +f 141/154/214 31/157/214 58/155/214 +f 31/157/215 3/158/215 58/155/215 +f 49/132/216 54/133/216 7/34/216 +f 50/131/217 142/159/217 49/132/217 +f 51/19/218 143/160/218 50/131/218 +f 49/132/219 142/159/219 54/133/219 +f 142/159/220 53/134/220 54/133/220 +f 50/131/221 143/160/221 142/159/221 +f 143/160/222 144/161/222 142/159/222 +f 142/159/223 144/161/223 53/134/223 +f 144/161/224 52/29/224 53/134/224 +f 51/19/225 21/18/225 143/160/225 +f 21/18/226 20/162/226 143/160/226 +f 143/160/227 20/162/227 144/161/227 +f 20/162/228 19/163/228 144/161/228 +f 144/161/229 19/163/229 52/29/229 +f 19/163/230 2/4/230 52/29/230 +f 43/139/231 48/105/231 11/46/231 +f 44/138/232 145/164/232 43/139/232 +f 45/16/233 146/165/233 44/138/233 +f 43/139/234 145/164/234 48/105/234 +f 145/164/235 47/106/235 48/105/235 +f 44/138/236 146/165/236 145/164/236 +f 146/165/237 147/166/237 145/164/237 +f 145/164/238 147/166/238 47/106/238 +f 147/166/239 46/33/239 47/106/239 +f 45/16/240 24/6/240 146/165/240 +f 24/6/241 23/167/241 146/165/241 +f 146/165/242 23/167/242 147/166/242 +f 23/167/243 22/168/243 147/166/243 +f 147/166/244 22/168/244 46/33/244 +f 22/168/245 6/26/245 46/33/245 +f 27/169/246 42/27/246 6/26/246 +f 26/170/247 148/171/247 27/169/247 +f 25/15/248 149/172/248 26/170/248 +f 27/169/249 148/171/249 42/27/249 +f 148/171/250 41/143/250 42/27/250 +f 26/170/251 149/172/251 148/171/251 +f 149/172/252 150/173/252 148/171/252 +f 148/171/253 150/173/253 41/143/253 +f 150/173/254 40/144/254 41/143/254 +f 25/15/255 36/14/255 149/172/255 +f 36/14/256 35/174/256 149/172/256 +f 149/172/257 35/174/257 150/173/257 +f 35/174/258 34/175/258 150/173/258 +f 150/173/259 34/175/259 40/144/259 +f 34/175/260 5/23/260 40/144/260 +f 34/176/261 39/24/261 5/23/261 +f 35/177/262 151/178/262 34/176/262 +f 36/12/263 152/179/263 35/177/263 +f 34/176/264 151/178/264 39/24/264 +f 151/178/265 38/148/265 39/24/265 +f 35/177/266 152/179/266 151/178/266 +f 152/179/267 153/180/267 151/178/267 +f 151/178/268 153/180/268 38/148/268 +f 153/180/269 37/149/269 38/148/269 +f 36/12/270 30/11/270 152/179/270 +f 30/11/271 29/181/271 152/179/271 +f 152/179/272 29/181/272 153/180/272 +f 29/181/273 28/182/273 153/180/273 +f 153/180/274 28/182/274 37/149/274 +f 28/182/275 4/20/275 37/149/275 +f 28/183/276 33/21/276 4/20/276 +f 29/184/277 154/185/277 28/183/277 +f 30/9/278 155/186/278 29/184/278 +f 28/183/279 154/185/279 33/21/279 +f 154/185/280 32/156/280 33/21/280 +f 29/184/281 155/186/281 154/185/281 +f 155/186/282 156/187/282 154/185/282 +f 154/185/283 156/187/283 32/156/283 +f 156/187/284 31/157/284 32/156/284 +f 30/9/285 15/8/285 155/186/285 +f 15/8/286 14/188/286 155/186/286 +f 155/186/287 14/188/287 156/187/287 +f 14/188/288 13/189/288 156/187/288 +f 156/187/289 13/189/289 31/157/289 +f 13/189/290 3/158/290 31/157/290 +f 22/168/291 27/190/291 6/26/291 +f 23/167/292 157/191/292 22/168/292 +f 24/6/293 158/192/293 23/167/293 +f 22/168/294 157/191/294 27/190/294 +f 157/191/295 26/193/295 27/190/295 +f 23/167/296 158/192/296 157/191/296 +f 158/192/297 159/194/297 157/191/297 +f 157/191/298 159/194/298 26/193/298 +f 159/194/299 25/195/299 26/193/299 +f 24/6/300 18/5/300 158/192/300 +f 18/5/301 17/196/301 158/192/301 +f 158/192/302 17/196/302 159/194/302 +f 17/196/303 16/197/303 159/194/303 +f 159/194/304 16/197/304 25/195/304 +f 16/197/305 1/198/305 25/195/305 +f 13/199/306 21/18/306 3/17/306 +f 14/200/307 160/201/307 13/199/307 +f 15/3/308 161/202/308 14/200/308 +f 13/199/309 160/201/309 21/18/309 +f 160/201/310 20/162/310 21/18/310 +f 14/200/311 161/202/311 160/201/311 +f 161/202/312 162/203/312 160/201/312 +f 160/201/313 162/203/313 20/162/313 +f 162/203/314 19/163/314 20/162/314 +f 15/3/315 16/2/315 161/202/315 +f 16/2/316 17/204/316 161/202/316 +f 161/202/317 17/204/317 162/203/317 +f 17/204/318 18/205/318 162/203/318 +f 162/203/319 18/205/319 19/163/319 +f 18/205/320 2/4/320 19/163/320 diff --git a/models/model.h b/models/model.h index 07b6a4e..1bd1d2e 100644 --- a/models/model.h +++ b/models/model.h @@ -8,7 +8,13 @@ struct index_ptn { uint16_t normal; }; -struct face { +struct triangle { + struct index_ptn a; + struct index_ptn b; + struct index_ptn c; +}; + +struct quadrilateral { struct index_ptn a; struct index_ptn b; struct index_ptn c; diff --git a/models/parse_obj_fixed_point.py b/models/parse_obj_fixed_point.py index 103c1a3..2ac7b18 100644 --- a/models/parse_obj_fixed_point.py +++ b/models/parse_obj_fixed_point.py @@ -33,7 +33,13 @@ class IndexVTN: vertex_normal: int @dataclass -class Face: +class Triangle: + a: IndexVTN + b: IndexVTN + c: IndexVTN + +@dataclass +class Quadrilateral: a: IndexVTN b: IndexVTN c: IndexVTN @@ -82,8 +88,12 @@ def parse_vertex_indices(args): def parse_face(args): vertices = args.split() - assert len(vertices) == 4, vertices - yield Face(*map(parse_vertex_indices, vertices)) + if len(vertices) == 3: + yield Triangle(*map(parse_vertex_indices, vertices)) + elif len(vertices) == 4: + yield Quadrilateral(*map(parse_vertex_indices, vertices)) + else: + assert False, (len(vertices), args) def parse_obj_line(line): prefixes = [ diff --git a/models/render_obj_fixed_point_c_source.py b/models/render_obj_fixed_point_c_source.py index 1e04471..6e50c2d 100644 --- a/models/render_obj_fixed_point_c_source.py +++ b/models/render_obj_fixed_point_c_source.py @@ -6,7 +6,8 @@ from parse_obj_fixed_point import parse_obj_file from parse_obj_fixed_point import VertexPosition from parse_obj_fixed_point import VertexNormal from parse_obj_fixed_point import VertexTexture -from parse_obj_fixed_point import Face +from parse_obj_fixed_point import Triangle +from parse_obj_fixed_point import Quadrilateral vertex_position_fraction_bits = 6 # 4.6 vertex_normal_fraction_bits = 9 # s.9 @@ -29,12 +30,18 @@ def render_face(face): yield from render_index_vtn(index_vtn) yield "}," -def render_faces(prefix, faces): - yield f"struct face {prefix}_faces[] = {{" +def render_faces(prefix, name, faces): + yield f"struct {name} {prefix}_{name}s[] = {{" for face in faces: yield from render_face(face) yield "};" +def render_triangles(prefix, faces): + yield from render_faces(prefix, "triangle", faces) + +def render_quadrilateral(prefix, faces): + yield from render_faces(prefix, "quadrilateral", faces) + def xyz(vec): return (vec.x, vec.y, vec.z) @@ -87,5 +94,8 @@ render(render_header()) render(render_vertex_positions(prefix, d[VertexPosition])) render(render_vertex_texture(prefix, d[VertexTexture])) render(render_vertex_normals(prefix, d[VertexNormal])) -render(render_faces(prefix, d[Face])) +if Triangle in d: + render(render_triangles(prefix, d[Triangle])) +if Quadrilateral in d: + render(render_quadrilateral(prefix, d[Quadrilateral])) sys.stdout.write(out.getvalue()) diff --git a/patch.py b/patch.py index 602bd55..7d29eb7 100644 --- a/patch.py +++ b/patch.py @@ -66,8 +66,3 @@ buf[0x15f] = header_crc_b[1] with open(sys.argv[2], 'wb') as f: f.write(buf) - assert len(buf) <= 131072, len(buf) - i = 131072 - len(buf) - while i > 0: - f.write(bytes([0])) - i -= 1