diff --git a/Makefile b/Makefile index 9bd51b8..652c1e2 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ include base.mk include common.mk include headers.mk -OPT = -Og +OPT = -O2 MAKEFILE_PATH := $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))) CFLAGS += -I$(MAKEFILE_PATH) LIB ?= $(MAKEFILE_PATH) diff --git a/example/example.mk b/example/example.mk index f7594ed..3e8b068 100644 --- a/example/example.mk +++ b/example/example.mk @@ -859,3 +859,17 @@ SPECK_OBJ = \ example/speck.elf: LDSCRIPT = $(LIB)/main.lds example/speck.elf: $(START_OBJ) $(SPECK_OBJ) + +MODIFIER_VOLUME_CUBE_OBJ = \ + example/modifier_volume_cube.o \ + holly/core.o \ + holly/region_array.o \ + holly/background.o \ + holly/ta_fifo_polygon_converter.o \ + holly/video_output.o \ + sh7091/serial.o \ + font/terminus/ter_u32n.data.o \ + $(LIBGCC) + +example/modifier_volume_cube.elf: LDSCRIPT = $(LIB)/main.lds +example/modifier_volume_cube.elf: $(START_OBJ) $(MODIFIER_VOLUME_CUBE_OBJ) diff --git a/example/modifier_volume_cube.cpp b/example/modifier_volume_cube.cpp new file mode 100644 index 0000000..5017f5b --- /dev/null +++ b/example/modifier_volume_cube.cpp @@ -0,0 +1,912 @@ +#include + +#include "holly/background.hpp" +#include "holly/core.hpp" +#include "holly/core_bits.hpp" +#include "holly/holly.hpp" +#include "holly/isp_tsp.hpp" +#include "holly/region_array.hpp" +#include "holly/ta_bits.hpp" +#include "holly/ta_fifo_polygon_converter.hpp" +#include "holly/ta_global_parameter.hpp" +#include "holly/ta_parameter.hpp" +#include "holly/ta_vertex_parameter.hpp" +#include "holly/texture_memory_alloc3.hpp" +#include "holly/video_output.hpp" + +#include "sh7091/sh7091.hpp" +#include "sh7091/serial.hpp" + +#include "systembus.hpp" +#include "systembus_bits.hpp" + +#include "memorymap.hpp" + +#include "model/model.h" +#include "model/cube.h" +#include "model/plane/model.h" + +#include "font/terminus/ter_u32n.data.h" + +#include "math/vec2.hpp" +#include "math/vec3.hpp" +#include "math/vec4.hpp" +#include "math/mat3x3.hpp" +#include "math/mat4x4.hpp" +#include "math/math.hpp" + +#define assert(b) \ + do { \ + if (!(b)) { \ + serial::string(__FILE__); \ + serial::character(':'); \ + serial::integer(__LINE__, ' '); \ + serial::string(__func__); \ + serial::string(": assertion failed: "); \ + serial::string(#b); \ + serial::character('\n'); \ + while (1); \ + } \ + } while (0); + +using vec2 = vec<2, float>; +using vec3 = vec<3, float>; +using vec4 = vec<4, float>; +using mat3x3 = mat<3, 3, float>; +using mat4x4 = mat<4, 4, float>; + +const float deg = 0.017453292519943295; + +#define _fsrra(n) \ + ({ \ + float v = (n); \ + asm("fsrra %0" \ + : "=f" (v) \ + : "0" (v)); \ + v; \ + }) + +static inline int max(int a, int b) +{ + return (a > b) ? a : b; +} + +static inline int min(int a, int b) +{ + return (a > b) ? b : a; +} + +void global_polygon_type_0(ta_parameter_writer& writer, bool shadow) +{ + 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 + | (shadow ? obj_control::shadow : 0) + ; + + 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::fog_control::no_fog + | tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + ; + + const uint32_t texture_control_word = 0; + + writer.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 + ); +} + +void global_modifier_volume(ta_parameter_writer& writer) +{ + const uint32_t parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque_modifier_volume + ; + + const uint32_t isp_tsp_instruction_word = isp_tsp_instruction_word::volume_instruction::normal_polygon + | isp_tsp_instruction_word::culling_mode::no_culling; + + writer.append() = + ta_global_parameter::modifier_volume(parameter_control_word, + isp_tsp_instruction_word + ); +} + +void transfer_line(ta_parameter_writer& writer, vec3 p1, vec3 p2, uint32_t base_color) +{ + /* + const uint32_t parameter_control_word = para_control::para_type::sprite + | para_control::list_type::opaque + | obj_control::col_type::packed_color; + + 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::fog_control::no_fog + | tsp_instruction_word::src_alpha_instr::one + | tsp_instruction_word::dst_alpha_instr::zero + ; + + const uint32_t texture_control_word = 0; + */ + + float dy = p2.y - p1.y; + float dx = p2.x - p1.x; + float d = _fsrra(dx * dx + dy * dy) * 0.7f; + float dy1 = dy * d; + float dx1 = dx * d; + + assert(p1.z < 1); + assert(p2.z < 1); + + const vec3 v[4] = { + { p1.x + dy1, p1.y + -dx1, p1.z }, + { p1.x + -dy1, p1.y + dx1, p1.z }, + { p2.x + -dy1, p2.y + dx1, p2.z }, + { p2.x + dy1, p2.y + -dx1, p2.z }, + }; + + /* + writer.append() = + ta_global_parameter::sprite(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + base_color, + 0, // offset_color + 0, // data_size_for_sort_dma + 0); // next_address_for_sort_dma + */ + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false), + v[0].x, v[0].y, v[0].z, + base_color); + + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false), + v[1].x, v[1].y, v[1].z, + base_color); + + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false), + v[3].x, v[3].y, v[3].z, + base_color); + + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(true), + v[2].x, v[2].y, v[2].z, + base_color); +} + +void transfer_glyph(ta_parameter_writer& writer, float x, float y, int c) +{ + constexpr int width = 16; + constexpr int height = 32; + + const uint32_t parameter_control_word = para_control::para_type::sprite + | para_control::list_type::punch_through + | 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::fog_control::no_fog + | tsp_instruction_word::src_alpha_instr::src_alpha + | tsp_instruction_word::dst_alpha_instr::inverse_src_alpha + | tsp_instruction_word::texture_u_size::from_int(width) + | tsp_instruction_word::texture_v_size::from_int(height); + + const int ix = c - ' '; + const int offset = (width * height * ix) / 2; + const uint32_t texture_address = texture_memory_alloc.texture.start + offset; + 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); + + constexpr vec2 v[4] = { + { 0.f, 0.f }, + { 1.f, 0.f }, + { 1.f, 1.f }, + { 0.f, 1.f }, + }; + + constexpr uint32_t base_color = 0; + writer.append() = + ta_global_parameter::sprite(parameter_control_word, + isp_tsp_instruction_word, + tsp_instruction_word, + texture_control_word, + base_color, + 0, // offset_color + 0, // data_size_for_sort_dma + 0); // next_address_for_sort_dma + + writer.append() = + ta_vertex_parameter::sprite_type_1(para_control::para_type::vertex_parameter, + v[0].x * width + x, + v[0].y * height + y, + 0.1f, + v[1].x * width + x, + v[1].y * height + y, + 0.1f, + v[2].x * width + x, + v[2].y * height + y, + 0.1f, + v[3].x * width + x, + v[3].y * height + y, + uv_16bit(v[0].x, v[0].y), + uv_16bit(v[1].x, v[1].y), + uv_16bit(v[2].x, v[2].y)); +} + +vec3 screen_transform(const mat4x4& screen, vec3 v) +{ + v = screen * v; + + float dim = 480 / 2.0 * 1.5; + + return { + v.x / v.z * dim + 640 / 2.0f, + v.y / v.z * dim + 480 / 2.0f, + 1 / v.z, + }; +} + +void render_basis(ta_parameter_writer& writer, const mat4x4& screen) +{ + global_polygon_type_0(writer, false); + + vec3 origin = screen_transform(screen, {0, 0, 0}); + vec3 z = screen_transform(screen, {0, 0, 1}); + vec3 y = screen_transform(screen, {0, 1, 0}); + vec3 x = screen_transform(screen, {1, 0, 0}); + + uint32_t base_color = 0xffffff; + + // magenta: Z + transfer_line(writer, origin, z, base_color); + + // yellow: Y + transfer_line(writer, origin, y, base_color); + + // cyan: X + transfer_line(writer, origin, x, base_color); +} + +void render_basis_text(ta_parameter_writer& writer, const mat4x4& screen) +{ + vec3 z = screen_transform(screen, (vec3){0, 0, 1} * 1.2f); + vec3 y = screen_transform(screen, (vec3){0, 1, 0} * 1.2f); + vec3 x = screen_transform(screen, (vec3){1, 0, 0} * 1.2f); + + transfer_glyph(writer, z.x - 5, z.y - 10, 'z'); + transfer_glyph(writer, y.x - 5, y.y - 10, 'y'); + transfer_glyph(writer, x.x - 5, x.y - 10, 'x'); +} + +//#define LINE_DRAWING 1 + +static inline void render_quad(ta_parameter_writer& writer, + uint32_t base_color, + vec3 ap, + vec3 bp, + vec3 cp, + vec3 dp) +{ +#ifdef LINE_DRAWING + transfer_line(writer, ap, bp, base_color); + transfer_line(writer, bp, cp, base_color); + transfer_line(writer, cp, dp, base_color); + transfer_line(writer, dp, ap, base_color); +#else + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false), + ap.x, ap.y, ap.z, + base_color); + + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false), + bp.x, bp.y, bp.z, + base_color); + + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(false), + dp.x, dp.y, dp.z, + base_color); + + writer.append() = + ta_vertex_parameter::polygon_type_0(polygon_vertex_parameter_control_word(true), + cp.x, cp.y, cp.z, + base_color); +#endif +} + +static inline void render_tri(ta_parameter_writer& writer, + uint32_t base_color, + vec3 ap, + vec3 bp, + vec3 cp) +{ +#ifdef LINE_DRAWING + transfer_line(writer, ap, bp, base_color); + transfer_line(writer, bp, cp, base_color); + transfer_line(writer, cp, ap, base_color); +#else +#endif +} + +static inline void render_last_tri_mod(ta_parameter_writer& writer) +{ +#ifdef LINE_DRAWING +#else + const uint32_t last_parameter_control_word = para_control::para_type::polygon_or_modifier_volume + | para_control::list_type::opaque_modifier_volume + | obj_control::volume::modifier_volume::last_in_volume; + + const uint32_t last_isp_tsp_instruction_word = isp_tsp_instruction_word::volume_instruction::inside_last_polygon + | isp_tsp_instruction_word::culling_mode::no_culling; + + writer.append() = + ta_global_parameter::modifier_volume(last_parameter_control_word, + last_isp_tsp_instruction_word); +#endif +} + +static inline void render_tri_mod(ta_parameter_writer& writer, + vec3 ap, + vec3 bp, + vec3 cp) +{ +#ifdef LINE_DRAWING + transfer_line(writer, ap, bp, base_color); + transfer_line(writer, bp, cp, base_color); + transfer_line(writer, cp, ap, base_color); +#else + writer.append() = + ta_vertex_parameter::modifier_volume(modifier_volume_vertex_parameter_control_word(), + ap.x, ap.y, ap.z, + bp.x, bp.y, bp.z, + cp.x, cp.y, cp.z); +#endif +} + +void set_edge_coloring(uint8_t * edge_coloring, + const int edge_stride, + bool l_dot_n_b, int a, int b) +{ + int ma = min(a, b); + int mb = max(a, b); + + int bit = 1 << ((int)l_dot_n_b); + + edge_coloring[ma * edge_stride + mb] |= bit; +} + +struct edge { + int a; + int b; +}; + +static uint32_t random; + +uint32_t xorshift() +{ + uint32_t x = random; + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + return random = x; +} + +static inline void render_extension_mesh(ta_parameter_writer& writer, + vec3 ap, + vec3 bp, + vec3 cp, + vec3 dp, + vec3 ep, + vec3 fp, + vec3 apo, + vec3 bpo, + vec3 cpo, + vec3 dpo, + vec3 epo, + vec3 fpo) +{ + render_tri_mod(writer, ap, bp, apo); + render_tri_mod(writer, bpo, apo, bp); + + render_tri_mod(writer, bp, cp, bpo); + render_tri_mod(writer, cpo, bpo, cp); + + render_tri_mod(writer, cp, dp, cpo); + render_tri_mod(writer, dpo, cpo, dp); + + render_tri_mod(writer, dp, ep, dpo); + render_tri_mod(writer, epo, dpo, ep); + + render_tri_mod(writer, ep, fp, epo); + render_tri_mod(writer, fpo, epo, fp); + + render_tri_mod(writer, fp, ap, fpo); + render_last_tri_mod(writer); + render_tri_mod(writer, apo, fpo, ap); + + /* + random = 0x12345789; + + render_quad(writer, xorshift(), ap, bp, bpo, apo); + + render_quad(writer, xorshift(), bp, cp, cpo, bpo); + + render_quad(writer, xorshift(), cp, dp, dpo, cpo); + + render_quad(writer, xorshift(), dp, ep, epo, dpo); + + render_quad(writer, xorshift(), ep, fp, fpo, epo); + + render_quad(writer, xorshift(), fp, ap, apo, fpo); + */ +} + +void render_silhouette(ta_parameter_writer& writer, + const mat4x4& screen, + const mat4x4& model, + const vec3 light_vec, + const uint8_t * edge_coloring, + const int edge_stride) +{ + struct edge silhouette[6]; + int ix = 0; + + for (int a = 0; a < edge_stride; a++) { + for (int b = 0; b < edge_stride; b++) { + uint8_t coloring = edge_coloring[a * edge_stride + b]; + if (coloring == 0b11) { + silhouette[ix++] = {a, b}; + } + } + } + assert(ix == 6); + + int last_ix = 0; + int order_ix = 0; + int order_vtx[6]; + order_vtx[order_ix++] = silhouette[0].a; + + // calculate vertex ordering + while (order_ix < 6) { + for (int i = 1; i < 6; i++) { + if (i == last_ix) + continue; + + int last_vtx = order_vtx[order_ix - 1]; + if (last_vtx == silhouette[i].a) { + last_ix = i; + order_vtx[order_ix++] = silhouette[i].b; + break; + } + if (last_vtx == silhouette[i].b) { + last_ix = i; + order_vtx[order_ix++] = silhouette[i].a; + break; + } + } + } + + const vec3 * position = cube_position; + + vec3 ap = screen_transform(screen, model * position[order_vtx[0]]); + vec3 bp = screen_transform(screen, model * position[order_vtx[1]]); + vec3 cp = screen_transform(screen, model * position[order_vtx[2]]); + vec3 dp = screen_transform(screen, model * position[order_vtx[3]]); + vec3 ep = screen_transform(screen, model * position[order_vtx[4]]); + vec3 fp = screen_transform(screen, model * position[order_vtx[5]]); + + float scale = 5; + mat4x4 translate = { + 1, 0, 0, -light_vec.x * scale, + 0, 1, 0, -light_vec.y * scale, + 0, 0, 1, -light_vec.z * scale, + 0, 0, 0, 1, + }; + + mat4x4 model2 = model * translate; + + vec3 apo = screen_transform(screen, model2 * position[order_vtx[0]]); + vec3 bpo = screen_transform(screen, model2 * position[order_vtx[1]]); + vec3 cpo = screen_transform(screen, model2 * position[order_vtx[2]]); + vec3 dpo = screen_transform(screen, model2 * position[order_vtx[3]]); + vec3 epo = screen_transform(screen, model2 * position[order_vtx[4]]); + vec3 fpo = screen_transform(screen, model2 * position[order_vtx[5]]); + + if (0) { // perimeter + uint32_t base_color = 0xff0080; + + transfer_line(writer, ap, bp, base_color); + transfer_line(writer, bp, cp, base_color); + transfer_line(writer, cp, dp, base_color); + transfer_line(writer, dp, ep, base_color); + transfer_line(writer, ep, fp, base_color); + transfer_line(writer, fp, ap, base_color); + } + + if (1) { // near end cap + render_tri_mod(writer, ap, bp, cp); + render_tri_mod(writer, cp, dp, ep); + render_tri_mod(writer, ep, fp, ap); + render_tri_mod(writer, ap, cp, ep); + } + + if (1) { // far end cap + render_tri_mod(writer, apo, bpo, cpo); + render_tri_mod(writer, cpo, dpo, epo); + render_tri_mod(writer, epo, fpo, apo); + render_tri_mod(writer, apo, cpo, epo); + } + + if (1) { + render_extension_mesh(writer, + ap, + bp, + cp, + dp, + ep, + fp, + apo, + bpo, + cpo, + dpo, + epo, + fpo); + } +} + +void render_cube(ta_parameter_writer& writer, + const mat4x4& screen, + const mat4x4& model, + const vec3 light_vec) +{ + const vec3 * normal = cube_normal; + const vec3 * position = cube_position; + const union quadrilateral * quadrilateral = cube_Cube_quadrilateral; + + const int edge_stride = 8; + const int edge_coloring_length = edge_stride * edge_stride; + uint8_t __attribute__((aligned(4))) edge_coloring[edge_coloring_length]; + for (int i = 0; i < edge_coloring_length / 4; i++) + reinterpret_cast(edge_coloring)[i] = 0; + + global_polygon_type_0(writer, false); // no self-shadow + + for (int i = 0; i < 6; i++) { + const union quadrilateral& q = quadrilateral[i]; + vec3 n3 = normal[q.a.normal]; + vec4 n4 = model * (vec4){n3.x, n3.y, n3.z, 0.f}; // no translation component + vec3 n = {n4.x, n4.y, n4.z}; + float l_dot_n = dot(light_vec, n); + bool l_dot_n_b = l_dot_n > 0; + + set_edge_coloring(edge_coloring, edge_stride, l_dot_n_b, q.a.position, q.b.position); + set_edge_coloring(edge_coloring, edge_stride, l_dot_n_b, q.b.position, q.c.position); + set_edge_coloring(edge_coloring, edge_stride, l_dot_n_b, q.c.position, q.d.position); + set_edge_coloring(edge_coloring, edge_stride, l_dot_n_b, q.d.position, q.a.position); + + vec3 ap = model * position[q.a.position]; + vec3 bp = model * position[q.b.position]; + vec3 cp = model * position[q.c.position]; + vec3 dp = model * position[q.d.position]; + + uint32_t base_color = l_dot_n_b ? 0xff8000 : 0x0080ff; + + vec3 sap = screen_transform(screen, ap); + vec3 sbp = screen_transform(screen, bp); + vec3 scp = screen_transform(screen, cp); + vec3 sdp = screen_transform(screen, dp); + + render_quad(writer, + base_color, + sap, + sbp, + scp, + sdp); + } + + if (1) { + // end of opaque list + writer.append() = + ta_global_parameter::end_of_list(para_control::para_type::end_of_list); + + global_modifier_volume(writer); + + render_silhouette(writer, + screen, + model, + light_vec, + edge_coloring, + edge_stride); + } +} + +void render_plane(ta_parameter_writer& writer, + const mat4x4& screen, + const vec3 light_vec) +{ + //const vec3 * normal = plane_normal; + const vec3 * position = plane_position; + const union quadrilateral * quadrilateral = plane_Plane.quadrilateral; + int count = plane_Plane.quadrilateral_count; + + float scale = 3; + const mat4x4 model = { + scale, 0, 0, 0, + 0, scale, 0, 0, + 0, 0, scale, 1, + 0, 0, 0, 1, + }; + + global_polygon_type_0(writer, true); // with shadow + + for (int i = 0; i < count; i++) { + const union quadrilateral& q = quadrilateral[i]; + + vec3 ap = model * position[q.a.position]; + vec3 bp = model * position[q.b.position]; + vec3 cp = model * position[q.c.position]; + vec3 dp = model * position[q.d.position]; + + uint32_t base_color = 0xffff80; + + vec3 sap = screen_transform(screen, ap); + vec3 sbp = screen_transform(screen, bp); + vec3 scp = screen_transform(screen, cp); + vec3 sdp = screen_transform(screen, dp); + + render_quad(writer, + base_color, + sap, + sbp, + scp, + sdp); + } +} + +constexpr inline mat4x4 screen_rotation() +{ + float zt = -0.7853981633974483 / 1.5; + float xt = -0.7853981633974483 * 1; + mat4x4 rx = { + 1, 0, 0, 0, + 0, cos(xt), -sin(xt), 0, + 0, sin(xt), cos(xt), 0, + 0, 0, 0, 1, + }; + + mat4x4 rz = { + cos(zt), -sin(zt), 0, 0, + sin(zt), cos(zt), 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + }; + + mat4x4 t = { + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 2.5, + 0, 0, 0, 1, + }; + + return t * rx * rz; +} + +void render_light_vec(ta_parameter_writer& writer, const mat4x4& screen, vec3 l) +{ + vec3 a = screen_transform(screen, {0, 0, 0}); + vec3 b = screen_transform(screen, l * 0.5f); + + transfer_line(writer, a, b, 0x00ff00); +} + +void transfer_scene(ta_parameter_writer& writer, const mat4x4& screen, vec3 light_vec) +{ + // opaque + render_basis(writer, screen); + + render_light_vec(writer, screen, light_vec); + + if (1) { + render_plane(writer, + screen, + light_vec); + } + + const mat4x4 model = mat4x4() * 0.3f; + render_cube(writer, + screen, + model, + light_vec); + + writer.append() = + ta_global_parameter::end_of_list(para_control::para_type::end_of_list); + + // punch_through + /* + render_basis_text(writer, screen); + + writer.append() = + ta_global_parameter::end_of_list(para_control::para_type::end_of_list); + */ +} + +vec3 update_light() +{ + static float ltheta = 2; + + vec3 light_origin = {0, 0, 0}; + vec3 light_pos = {1, 1, 2}; + + mat3x3 rot = { + cos(ltheta), -sin(ltheta), 0, + sin(ltheta), cos(ltheta), 0, + 0, 0, 1, + }; + + light_pos = rot * light_pos; + ltheta += deg / 8; + + vec3 light_vec = light_origin - light_pos; + + return light_vec; +} + +void transfer_ta_fifo_texture_memory_32byte(void * dst, void * src, int length) +{ + uint32_t out_addr = (uint32_t)dst; + sh7091.CCN.QACR0 = ((reinterpret_cast(out_addr) >> 24) & 0b11100); + sh7091.CCN.QACR1 = ((reinterpret_cast(out_addr) >> 24) & 0b11100); + + volatile uint32_t * base = &store_queue[(out_addr & 0x03ffffc0) / 4]; + uint32_t * src32 = reinterpret_cast(src); + + length = (length + 31) & ~31; // round up to nearest multiple of 32 + while (length > 0) { + base[0] = src32[0]; + base[1] = src32[1]; + base[2] = src32[2]; + base[3] = src32[3]; + base[4] = src32[4]; + base[5] = src32[5]; + base[6] = src32[6]; + base[7] = src32[7]; + asm volatile ("pref @%0" + : // output + : "r" (&base[0]) // input + : "memory"); + length -= 32; + base += 8; + src32 += 8; + } +} + +void transfer_textures() +{ + system.LMMODE0 = 0; // 64-bit address space + system.LMMODE1 = 0; // 64-bit address space + + uint32_t offset = texture_memory_alloc.texture.start; + void * dst = reinterpret_cast(&ta_fifo_texture_memory[offset / 4]); + void * src = reinterpret_cast(&_binary_font_terminus_ter_u32n_data_start); + uint32_t size = reinterpret_cast(&_binary_font_terminus_ter_u32n_data_size); + transfer_ta_fifo_texture_memory_32byte(dst, src, size); +} + +static inline uint16_t argb1555(int a, int r, int g, int b) +{ + return ((a & 1) << 15) | ((r & 31) << 10) | ((g & 31) << 5) | ((b & 31) << 0); +} + +void transfer_palette() +{ + holly.PAL_RAM_CTRL = pal_ram_ctrl::pixel_format::argb1555; + + holly.PALETTE_RAM[ 0 + 0] = argb1555(0, 0, 0, 0); + holly.PALETTE_RAM[ 0 + 1] = argb1555(1, 31, 31, 31); +} + +uint8_t __attribute__((aligned(32))) ta_parameter_buf[1024 * 1024]; + +void main() +{ + serial::init(0); + transfer_textures(); + transfer_palette(); + + constexpr uint32_t ta_alloc = 0 + //ta_alloc_ctrl::pt_opb::_16x4byte + | ta_alloc_ctrl::tm_opb::no_list + | ta_alloc_ctrl::t_opb::no_list + | ta_alloc_ctrl::om_opb::_16x4byte + | ta_alloc_ctrl::o_opb::_16x4byte; + + constexpr int render_passes = 1; + constexpr struct opb_size opb_size[render_passes] = { + { + .opaque = 16 * 4, + .opaque_modifier = 16 * 4, + .translucent = 0, + .translucent_modifier = 0, + //.punch_through = 16 * 4 + } + }; + + holly.SOFTRESET = softreset::pipeline_soft_reset + | softreset::ta_soft_reset; + holly.SOFTRESET = 0; + + core_init(); + holly.FPU_SHAD_SCALE = fpu_shad_scale::simple_shadow_enable::intensity_volume_mode; + video_output::set_mode_vga(); + + const int framebuffer_width = 640; + const int framebuffer_height = 480; + const int tile_width = framebuffer_width / 32; + const int tile_height = framebuffer_height / 32; + + for (int i = 0; i < 2; i++) { + region_array_multipass(tile_width, + tile_height, + opb_size, + render_passes, + texture_memory_alloc.region_array[i].start, + texture_memory_alloc.object_list[i].start); + + background_parameter2(texture_memory_alloc.background[i].start, + 0xff202040); + } + + ta_parameter_writer writer = ta_parameter_writer(ta_parameter_buf); + + int ta = 0; + int core = 0; + + const float degree = 0.017453292519943295 / 5; + float theta = 0; + + const mat4x4 screen = screen_rotation(); + + while (1) { + vec3 light_vec = update_light(); + + ta_polygon_converter_init2(texture_memory_alloc.isp_tsp_parameters[ta].start, + texture_memory_alloc.isp_tsp_parameters[ta].end, + texture_memory_alloc.object_list[ta].start, + texture_memory_alloc.object_list[ta].end, + opb_size[0].total(), + ta_alloc, + tile_width, + tile_height); + writer.offset = 0; + transfer_scene(writer, screen, light_vec); + ta_polygon_converter_writeback(writer.buf, writer.offset); + ta_polygon_converter_transfer(writer.buf, writer.offset); + ta_wait_opaque_modifier_volume_list(); + + core_start_render2(texture_memory_alloc.region_array[core].start, + texture_memory_alloc.isp_tsp_parameters[core].start, + texture_memory_alloc.background[core].start, + texture_memory_alloc.framebuffer[core].start, + framebuffer_width); + core_wait_end_of_render_video(); + + holly.FB_R_SOF1 = texture_memory_alloc.framebuffer[ta].start; + + theta += degree; + } +} diff --git a/font/terminus/ter_u32n.data b/font/terminus/ter_u32n.data new file mode 100644 index 0000000..869cd01 Binary files /dev/null and b/font/terminus/ter_u32n.data differ diff --git a/font/terminus/ter_u32n.data.h b/font/terminus/ter_u32n.data.h new file mode 100644 index 0000000..ef3d461 --- /dev/null +++ b/font/terminus/ter_u32n.data.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_font_terminus_ter_u32n_data_start __asm("_binary_font_terminus_ter_u32n_data_start"); +extern uint32_t _binary_font_terminus_ter_u32n_data_end __asm("_binary_font_terminus_ter_u32n_data_end"); +extern uint32_t _binary_font_terminus_ter_u32n_data_size __asm("_binary_font_terminus_ter_u32n_data_size"); + +#ifdef __cplusplus +} +#endif diff --git a/math/mat4x4.hpp b/math/mat4x4.hpp index ca8a989..4fa3eca 100644 --- a/math/mat4x4.hpp +++ b/math/mat4x4.hpp @@ -80,6 +80,18 @@ mat<4, 4, T>::operator[](int i) const } } +template +inline constexpr mat<4, 4, T> operator+(mat<4, 4, T> const& m1, mat<4, 4, T> const& m2) +{ +#define c(i, j) ( m1[i][j] + m2[i][j] ) + + return mat<4, 4, T>(c(0,0), c(0,1), c(0,2), c(0,3), + c(1,0), c(1,1), c(1,2), c(1,3), + c(2,0), c(2,1), c(2,2), c(2,3), + c(3,0), c(3,1), c(3,2), c(3,3)); +#undef c +} + template inline constexpr mat<4, 4, T> operator*(mat<4, 4, T> const& m1, mat<4, 4, T> const& m2) { @@ -96,6 +108,18 @@ inline constexpr mat<4, 4, T> operator*(mat<4, 4, T> const& m1, mat<4, 4, T> con #undef c } +template +inline constexpr mat<4, 4, T> operator*(mat<4, 4, T> const& m1, float s) +{ +#define c(i, j) ( m1[i][j] * s ) + + return mat<4, 4, T>(c(0,0), c(0,1), c(0,2), c(0,3), + c(1,0), c(1,1), c(1,2), c(1,3), + c(2,0), c(2,1), c(2,2), c(2,3), + c(3,0), c(3,1), c(3,2), c(3,3)); +#undef c +} + template inline constexpr typename mat<4, 4, T>::row_type operator* ( @@ -113,6 +137,23 @@ inline constexpr typename mat<4, 4, T>::row_type operator* #undef c } +template +inline constexpr vec<3, T> operator* +( + mat<4, 4, T> const& m, + vec<3, T> const& v +) +{ +#define c(i) ( \ + m[i][0] * v[0] \ + + m[i][1] * v[1] \ + + m[i][2] * v[2] \ + + m[i][3] ) + + return vec<3, T>(c(0), c(1), c(2)); +#undef c +} + template inline constexpr mat<4, 4, T> transpose(mat<4, 4, T> const& m) { diff --git a/model/cube/model.h b/model/cube/model.h new file mode 100644 index 0000000..de44714 --- /dev/null +++ b/model/cube/model.h @@ -0,0 +1,104 @@ +#pragma once + +#include + +#include "model.h" + +// floating-point +const vertex_position cube_position[] = { + {1.0, 1.0, -1.0}, + {1.0, -1.0, -1.0}, + {1.0, 1.0, 1.0}, + {1.0, -1.0, 1.0}, + {-1.0, 1.0, -1.0}, + {-1.0, -1.0, -1.0}, + {-1.0, 1.0, 1.0}, + {-1.0, -1.0, 1.0}, +}; + +// floating-point +const vertex_texture cube_texture[] = { + {0.625, 0.5}, + {0.875, 0.5}, + {0.875, 0.75}, + {0.625, 0.75}, + {0.375, 0.75}, + {0.625, 1.0}, + {0.375, 1.0}, + {0.375, 0.0}, + {0.625, 0.0}, + {0.625, 0.25}, + {0.375, 0.25}, + {0.125, 0.5}, + {0.375, 0.5}, + {0.125, 0.75}, +}; + +// floating-point +const vertex_normal cube_normal[] = { + {0.0, 1.0, 0.0}, + {0.0, 0.0, 1.0}, + {-1.0, 0.0, 0.0}, + {0.0, -1.0, 0.0}, + {1.0, 0.0, 0.0}, + {0.0, 0.0, -1.0}, +}; + +const union quadrilateral cube_Cube_quadrilateral[] = { + { .v = { + {0, 0, 0}, + {4, 1, 0}, + {6, 2, 0}, + {2, 3, 0}, + }}, + { .v = { + {3, 4, 1}, + {2, 3, 1}, + {6, 5, 1}, + {7, 6, 1}, + }}, + { .v = { + {7, 7, 2}, + {6, 8, 2}, + {4, 9, 2}, + {5, 10, 2}, + }}, + { .v = { + {5, 11, 3}, + {1, 12, 3}, + {3, 4, 3}, + {7, 13, 3}, + }}, + { .v = { + {1, 12, 4}, + {0, 0, 4}, + {2, 3, 4}, + {3, 4, 4}, + }}, + { .v = { + {5, 10, 5}, + {4, 9, 5}, + {0, 0, 5}, + {1, 12, 5}, + }}, +}; + +const struct object cube_Cube = { + .triangle = NULL, + .quadrilateral = &cube_Cube_quadrilateral[0], + .triangle_count = 0, + .quadrilateral_count = 6, + .material = -1, +}; + +const struct object * cube_object_list[] = { + &cube_Cube, +}; + +const struct model cube_model = { + .position = &cube_position[0], + .texture = &cube_texture[0], + .normal = &cube_normal[0], + .object = &cube_object_list[0], + .object_count = 1, +}; diff --git a/model/plane/model.h b/model/plane/model.h new file mode 100644 index 0000000..e56df6a --- /dev/null +++ b/model/plane/model.h @@ -0,0 +1,2411 @@ +#pragma once + +#include + +#include "../model.h" + +// floating-point +vertex_position plane_position[] = { + {-1.0, 1.0, 0.5}, + {-1.0, -1.0, 0.5}, + {1.0, 1.0, 0.5}, + {1.0, -1.0, 0.5}, + {0.875, 1.0, 0.572594}, + {0.75, 1.0, 0.562882}, + {0.625, 1.0, 0.573245}, + {0.5, 1.0, 0.570143}, + {0.375, 1.0, 0.533738}, + {0.25, 1.0, 0.521783}, + {0.125, 1.0, 0.483391}, + {0.0, 1.0, 0.5}, + {-0.125, 1.0, 0.5275}, + {-0.25, 1.0, 0.513289}, + {-0.375, 1.0, 0.462632}, + {-0.5, 1.0, 0.429857}, + {-0.625, 1.0, 0.430386}, + {-0.75, 1.0, 0.402047}, + {-0.875, 1.0, 0.416515}, + {-1.0, 0.875, 0.467632}, + {-1.0, 0.75, 0.443146}, + {-1.0, 0.625, 0.455371}, + {-1.0, 0.5, 0.429857}, + {-1.0, 0.375, 0.448538}, + {-1.0, 0.25, 0.507261}, + {-1.0, 0.125, 0.52536}, + {-1.0, 0.0, 0.5}, + {-1.0, -0.125, 0.489473}, + {-1.0, -0.25, 0.549593}, + {-1.0, -0.375, 0.631163}, + {-1.0, -0.5, 0.640286}, + {-1.0, -0.625, 0.600338}, + {-1.0, -0.75, 0.619736}, + {-1.0, -0.875, 0.56989}, + {-0.875, -1.0, 0.493045}, + {-0.75, -1.0, 0.478217}, + {-0.625, -1.0, 0.489826}, + {-0.5, -1.0, 0.429857}, + {-0.375, -1.0, 0.36812}, + {-0.25, -1.0, 0.437118}, + {-0.125, -1.0, 0.503577}, + {0.0, -1.0, 0.5}, + {0.125, -1.0, 0.496117}, + {0.25, -1.0, 0.514522}, + {0.375, -1.0, 0.582186}, + {0.5, -1.0, 0.640286}, + {0.625, -1.0, 0.645068}, + {0.75, -1.0, 0.584665}, + {0.875, -1.0, 0.500364}, + {1.0, -0.875, 0.511765}, + {1.0, -0.75, 0.529044}, + {1.0, -0.625, 0.531869}, + {1.0, -0.5, 0.5}, + {1.0, -0.375, 0.468131}, + {1.0, -0.25, 0.470956}, + {1.0, -0.125, 0.488235}, + {1.0, 0.0, 0.5}, + {1.0, 0.125, 0.514468}, + {1.0, 0.25, 0.472189}, + {1.0, 0.375, 0.434633}, + {1.0, 0.5, 0.429857}, + {1.0, 0.625, 0.405778}, + {1.0, 0.75, 0.443146}, + {1.0, 0.875, 0.49969}, + {-0.875, 0.875, 0.41664}, + {-0.875, 0.75, 0.39167}, + {-0.875, 0.625, 0.371579}, + {-0.875, 0.5, 0.361486}, + {-0.875, 0.375, 0.393825}, + {-0.875, 0.25, 0.451033}, + {-0.875, 0.125, 0.475818}, + {-0.875, 0.0, 0.458541}, + {-0.875, -0.125, 0.46091}, + {-0.875, -0.25, 0.525519}, + {-0.875, -0.375, 0.5846}, + {-0.875, -0.5, 0.581568}, + {-0.875, -0.625, 0.593727}, + {-0.875, -0.75, 0.607657}, + {-0.875, -0.875, 0.541674}, + {-0.75, 0.875, 0.433877}, + {-0.75, 0.75, 0.408819}, + {-0.75, 0.625, 0.376302}, + {-0.75, 0.5, 0.392388}, + {-0.75, 0.375, 0.401627}, + {-0.75, 0.25, 0.402528}, + {-0.75, 0.125, 0.419563}, + {-0.75, 0.0, 0.423829}, + {-0.75, -0.125, 0.43885}, + {-0.75, -0.25, 0.499474}, + {-0.75, -0.375, 0.569034}, + {-0.75, -0.5, 0.587062}, + {-0.75, -0.625, 0.615338}, + {-0.75, -0.75, 0.58068}, + {-0.75, -0.875, 0.494899}, + {-0.625, 0.875, 0.441811}, + {-0.625, 0.75, 0.427823}, + {-0.625, 0.625, 0.438068}, + {-0.625, 0.5, 0.471957}, + {-0.625, 0.375, 0.435283}, + {-0.625, 0.25, 0.380262}, + {-0.625, 0.125, 0.406204}, + {-0.625, 0.0, 0.44056}, + {-0.625, -0.125, 0.470032}, + {-0.625, -0.25, 0.516197}, + {-0.625, -0.375, 0.556547}, + {-0.625, -0.5, 0.564795}, + {-0.625, -0.625, 0.567675}, + {-0.625, -0.75, 0.518446}, + {-0.625, -0.875, 0.468933}, + {-0.5, 0.875, 0.460172}, + {-0.5, 0.75, 0.492739}, + {-0.5, 0.625, 0.474052}, + {-0.5, 0.5, 0.464929}, + {-0.5, 0.375, 0.455805}, + {-0.5, 0.25, 0.437118}, + {-0.5, 0.125, 0.469685}, + {-0.5, 0.0, 0.5}, + {-0.5, -0.125, 0.519142}, + {-0.5, -0.25, 0.52418}, + {-0.5, -0.375, 0.515811}, + {-0.5, -0.5, 0.5}, + {-0.5, -0.625, 0.504732}, + {-0.5, -0.75, 0.483081}, + {-0.5, -0.875, 0.426309}, + {-0.375, 0.875, 0.500564}, + {-0.375, 0.75, 0.511306}, + {-0.375, 0.625, 0.493172}, + {-0.375, 0.5, 0.461537}, + {-0.375, 0.375, 0.453495}, + {-0.375, 0.25, 0.487146}, + {-0.375, 0.125, 0.523389}, + {-0.375, 0.0, 0.53526}, + {-0.375, -0.125, 0.580528}, + {-0.375, -0.25, 0.5477}, + {-0.375, -0.375, 0.46301}, + {-0.375, -0.5, 0.449734}, + {-0.375, -0.625, 0.467629}, + {-0.375, -0.75, 0.456405}, + {-0.375, -0.875, 0.382664}, + {-0.25, 0.875, 0.54421}, + {-0.25, 0.75, 0.521309}, + {-0.25, 0.625, 0.524437}, + {-0.25, 0.5, 0.495137}, + {-0.25, 0.375, 0.4733}, + {-0.25, 0.25, 0.530073}, + {-0.25, 0.125, 0.587212}, + {-0.25, 0.0, 0.611242}, + {-0.25, -0.125, 0.637214}, + {-0.25, -0.25, 0.537108}, + {-0.25, -0.375, 0.402307}, + {-0.25, -0.5, 0.405677}, + {-0.25, -0.625, 0.427795}, + {-0.25, -0.75, 0.417809}, + {-0.25, -0.875, 0.401556}, + {-0.125, 0.875, 0.539032}, + {-0.125, 0.75, 0.527898}, + {-0.125, 0.625, 0.535597}, + {-0.125, 0.5, 0.521336}, + {-0.125, 0.375, 0.498451}, + {-0.125, 0.25, 0.526253}, + {-0.125, 0.125, 0.562764}, + {-0.125, 0.0, 0.5729}, + {-0.125, -0.125, 0.583635}, + {-0.125, -0.25, 0.501942}, + {-0.125, -0.375, 0.397401}, + {-0.125, -0.5, 0.402838}, + {-0.125, -0.625, 0.407866}, + {-0.125, -0.75, 0.416544}, + {-0.125, -0.875, 0.443849}, + {0.0, 0.875, 0.506081}, + {0.0, 0.75, 0.527811}, + {0.0, 0.625, 0.562353}, + {0.0, 0.5, 0.570143}, + {0.0, 0.375, 0.533738}, + {0.0, 0.25, 0.521783}, + {0.0, 0.125, 0.518463}, + {0.0, 0.0, 0.5}, + {0.0, -0.125, 0.516609}, + {0.0, -0.25, 0.478217}, + {0.0, -0.375, 0.413655}, + {0.0, -0.5, 0.429857}, + {0.0, -0.625, 0.437647}, + {0.0, -0.75, 0.472189}, + {0.0, -0.875, 0.476383}, + {0.125, 0.875, 0.504452}, + {0.125, 0.75, 0.529635}, + {0.125, 0.625, 0.561284}, + {0.125, 0.5, 0.588722}, + {0.125, 0.375, 0.574986}, + {0.125, 0.25, 0.523249}, + {0.125, 0.125, 0.460527}, + {0.125, 0.0, 0.43011}, + {0.125, -0.125, 0.427717}, + {0.125, -0.25, 0.408221}, + {0.125, -0.375, 0.418387}, + {0.125, -0.5, 0.448519}, + {0.125, -0.625, 0.477629}, + {0.125, -0.75, 0.499398}, + {0.125, -0.875, 0.466943}, + {0.25, 0.875, 0.555431}, + {0.25, 0.75, 0.547346}, + {0.25, 0.625, 0.512325}, + {0.25, 0.5, 0.52418}, + {0.25, 0.375, 0.525347}, + {0.25, 0.25, 0.456909}, + {0.25, 0.125, 0.396455}, + {0.25, 0.0, 0.380264}, + {0.25, -0.125, 0.357817}, + {0.25, -0.25, 0.364983}, + {0.25, -0.375, 0.42157}, + {0.25, -0.5, 0.437118}, + {0.25, -0.625, 0.490981}, + {0.25, -0.75, 0.506509}, + {0.25, -0.875, 0.460784}, + {0.375, 0.875, 0.611771}, + {0.375, 0.75, 0.601397}, + {0.375, 0.625, 0.504728}, + {0.375, 0.5, 0.490392}, + {0.375, 0.375, 0.466318}, + {0.375, 0.25, 0.403939}, + {0.375, 0.125, 0.395547}, + {0.375, 0.0, 0.399662}, + {0.375, -0.125, 0.365752}, + {0.375, -0.25, 0.363528}, + {0.375, -0.375, 0.410612}, + {0.375, -0.5, 0.431625}, + {0.375, -0.625, 0.49376}, + {0.375, -0.75, 0.538221}, + {0.375, -0.875, 0.542502}, + {0.5, 0.875, 0.620134}, + {0.5, 0.75, 0.56891}, + {0.5, 0.625, 0.47061}, + {0.5, 0.5, 0.464929}, + {0.5, 0.375, 0.463494}, + {0.5, 0.25, 0.43109}, + {0.5, 0.125, 0.390141}, + {0.5, 0.0, 0.359714}, + {0.5, -0.125, 0.335199}, + {0.5, -0.25, 0.328273}, + {0.5, -0.375, 0.402003}, + {0.5, -0.5, 0.464929}, + {0.5, -0.625, 0.524847}, + {0.5, -0.75, 0.594323}, + {0.5, -0.875, 0.631671}, + {0.625, 0.875, 0.587317}, + {0.625, 0.75, 0.535827}, + {0.625, 0.625, 0.468686}, + {0.625, 0.5, 0.464885}, + {0.625, 0.375, 0.462655}, + {0.625, 0.25, 0.428025}, + {0.625, 0.125, 0.37081}, + {0.625, 0.0, 0.329519}, + {0.625, -0.125, 0.312255}, + {0.625, -0.25, 0.344021}, + {0.625, -0.375, 0.424111}, + {0.625, -0.5, 0.469805}, + {0.625, -0.625, 0.539633}, + {0.625, -0.75, 0.630247}, + {0.625, -0.875, 0.655381}, + {0.75, 0.875, 0.555107}, + {0.75, 0.75, 0.517054}, + {0.75, 0.625, 0.45365}, + {0.75, 0.5, 0.433488}, + {0.75, 0.375, 0.433089}, + {0.75, 0.25, 0.411562}, + {0.75, 0.125, 0.392621}, + {0.75, 0.0, 0.380264}, + {0.75, -0.125, 0.332574}, + {0.75, -0.25, 0.362239}, + {0.75, -0.375, 0.439709}, + {0.75, -0.5, 0.457668}, + {0.75, -0.625, 0.492979}, + {0.75, -0.75, 0.558854}, + {0.75, -0.875, 0.591488}, + {0.875, 0.875, 0.537785}, + {0.875, 0.75, 0.457556}, + {0.875, 0.625, 0.396143}, + {0.875, 0.5, 0.392053}, + {0.875, 0.375, 0.408606}, + {0.875, 0.25, 0.437822}, + {0.875, 0.125, 0.466157}, + {0.875, 0.0, 0.465181}, + {0.875, -0.125, 0.419025}, + {0.875, -0.25, 0.408017}, + {0.875, -0.375, 0.444483}, + {0.875, -0.5, 0.467433}, + {0.875, -0.625, 0.499404}, + {0.875, -0.75, 0.529557}, + {0.875, -0.875, 0.523985}, +}; + +// floating-point +vertex_texture plane_texture[] = { + {0.0625, 0.0625}, + {0.125, 0.0625}, + {0.125, 0.125}, + {0.0625, 0.125}, + {0.1875, 0.0625}, + {0.1875, 0.125}, + {0.25, 0.0625}, + {0.25, 0.125}, + {0.3125, 0.0625}, + {0.3125, 0.125}, + {0.375, 0.0625}, + {0.375, 0.125}, + {0.4375, 0.0625}, + {0.4375, 0.125}, + {0.5, 0.0625}, + {0.5, 0.125}, + {0.5625, 0.0625}, + {0.5625, 0.125}, + {0.625, 0.0625}, + {0.625, 0.125}, + {0.6875, 0.0625}, + {0.6875, 0.125}, + {0.75, 0.0625}, + {0.75, 0.125}, + {0.8125, 0.0625}, + {0.8125, 0.125}, + {0.875, 0.0625}, + {0.875, 0.125}, + {0.9375, 0.0625}, + {0.9375, 0.125}, + {0.125, 0.1875}, + {0.0625, 0.1875}, + {0.1875, 0.1875}, + {0.25, 0.1875}, + {0.3125, 0.1875}, + {0.375, 0.1875}, + {0.4375, 0.1875}, + {0.5, 0.1875}, + {0.5625, 0.1875}, + {0.625, 0.1875}, + {0.6875, 0.1875}, + {0.75, 0.1875}, + {0.8125, 0.1875}, + {0.875, 0.1875}, + {0.9375, 0.1875}, + {0.125, 0.25}, + {0.0625, 0.25}, + {0.1875, 0.25}, + {0.25, 0.25}, + {0.3125, 0.25}, + {0.375, 0.25}, + {0.4375, 0.25}, + {0.5, 0.25}, + {0.5625, 0.25}, + {0.625, 0.25}, + {0.6875, 0.25}, + {0.75, 0.25}, + {0.8125, 0.25}, + {0.875, 0.25}, + {0.9375, 0.25}, + {0.125, 0.3125}, + {0.0625, 0.3125}, + {0.1875, 0.3125}, + {0.25, 0.3125}, + {0.3125, 0.3125}, + {0.375, 0.3125}, + {0.4375, 0.3125}, + {0.5, 0.3125}, + {0.5625, 0.3125}, + {0.625, 0.3125}, + {0.6875, 0.3125}, + {0.75, 0.3125}, + {0.8125, 0.3125}, + {0.875, 0.3125}, + {0.9375, 0.3125}, + {0.125, 0.375}, + {0.0625, 0.375}, + {0.1875, 0.375}, + {0.25, 0.375}, + {0.3125, 0.375}, + {0.375, 0.375}, + {0.4375, 0.375}, + {0.5, 0.375}, + {0.5625, 0.375}, + {0.625, 0.375}, + {0.6875, 0.375}, + {0.75, 0.375}, + {0.8125, 0.375}, + {0.875, 0.375}, + {0.9375, 0.375}, + {0.125, 0.4375}, + {0.0625, 0.4375}, + {0.1875, 0.4375}, + {0.25, 0.4375}, + {0.3125, 0.4375}, + {0.375, 0.4375}, + {0.4375, 0.4375}, + {0.5, 0.4375}, + {0.5625, 0.4375}, + {0.625, 0.4375}, + {0.6875, 0.4375}, + {0.75, 0.4375}, + {0.8125, 0.4375}, + {0.875, 0.4375}, + {0.9375, 0.4375}, + {0.125, 0.5}, + {0.0625, 0.5}, + {0.1875, 0.5}, + {0.25, 0.5}, + {0.3125, 0.5}, + {0.375, 0.5}, + {0.4375, 0.5}, + {0.5, 0.5}, + {0.5625, 0.5}, + {0.625, 0.5}, + {0.6875, 0.5}, + {0.75, 0.5}, + {0.8125, 0.5}, + {0.875, 0.5}, + {0.9375, 0.5}, + {0.125, 0.5625}, + {0.0625, 0.5625}, + {0.1875, 0.5625}, + {0.25, 0.5625}, + {0.3125, 0.5625}, + {0.375, 0.5625}, + {0.4375, 0.5625}, + {0.5, 0.5625}, + {0.5625, 0.5625}, + {0.625, 0.5625}, + {0.6875, 0.5625}, + {0.75, 0.5625}, + {0.8125, 0.5625}, + {0.875, 0.5625}, + {0.9375, 0.5625}, + {0.125, 0.625}, + {0.0625, 0.625}, + {0.1875, 0.625}, + {0.25, 0.625}, + {0.3125, 0.625}, + {0.375, 0.625}, + {0.4375, 0.625}, + {0.5, 0.625}, + {0.5625, 0.625}, + {0.625, 0.625}, + {0.6875, 0.625}, + {0.75, 0.625}, + {0.8125, 0.625}, + {0.875, 0.625}, + {0.9375, 0.625}, + {0.125, 0.6875}, + {0.0625, 0.6875}, + {0.1875, 0.6875}, + {0.25, 0.6875}, + {0.3125, 0.6875}, + {0.375, 0.6875}, + {0.4375, 0.6875}, + {0.5, 0.6875}, + {0.5625, 0.6875}, + {0.625, 0.6875}, + {0.6875, 0.6875}, + {0.75, 0.6875}, + {0.8125, 0.6875}, + {0.875, 0.6875}, + {0.9375, 0.6875}, + {0.125, 0.75}, + {0.0625, 0.75}, + {0.1875, 0.75}, + {0.25, 0.75}, + {0.3125, 0.75}, + {0.375, 0.75}, + {0.4375, 0.75}, + {0.5, 0.75}, + {0.5625, 0.75}, + {0.625, 0.75}, + {0.6875, 0.75}, + {0.75, 0.75}, + {0.8125, 0.75}, + {0.875, 0.75}, + {0.9375, 0.75}, + {0.125, 0.8125}, + {0.0625, 0.8125}, + {0.1875, 0.8125}, + {0.25, 0.8125}, + {0.3125, 0.8125}, + {0.375, 0.8125}, + {0.4375, 0.8125}, + {0.5, 0.8125}, + {0.5625, 0.8125}, + {0.625, 0.8125}, + {0.6875, 0.8125}, + {0.75, 0.8125}, + {0.8125, 0.8125}, + {0.875, 0.8125}, + {0.9375, 0.8125}, + {0.125, 0.875}, + {0.0625, 0.875}, + {0.1875, 0.875}, + {0.25, 0.875}, + {0.3125, 0.875}, + {0.375, 0.875}, + {0.4375, 0.875}, + {0.5, 0.875}, + {0.5625, 0.875}, + {0.625, 0.875}, + {0.6875, 0.875}, + {0.75, 0.875}, + {0.8125, 0.875}, + {0.875, 0.875}, + {0.9375, 0.875}, + {0.125, 0.9375}, + {0.0625, 0.9375}, + {0.1875, 0.9375}, + {0.25, 0.9375}, + {0.3125, 0.9375}, + {0.375, 0.9375}, + {0.4375, 0.9375}, + {0.5, 0.9375}, + {0.5625, 0.9375}, + {0.625, 0.9375}, + {0.6875, 0.9375}, + {0.75, 0.9375}, + {0.8125, 0.9375}, + {0.875, 0.9375}, + {0.9375, 0.9375}, + {0.0, 0.0}, + {0.0625, 0.0}, + {0.0, 0.0625}, + {0.125, 0.0}, + {0.1875, 0.0}, + {0.25, 0.0}, + {0.3125, 0.0}, + {0.375, 0.0}, + {0.4375, 0.0}, + {0.5, 0.0}, + {0.5625, 0.0}, + {0.625, 0.0}, + {0.6875, 0.0}, + {0.75, 0.0}, + {0.8125, 0.0}, + {0.875, 0.0}, + {0.9375, 0.0}, + {1.0, 0.0}, + {1.0, 0.0625}, + {1.0, 0.125}, + {1.0, 0.1875}, + {1.0, 0.25}, + {1.0, 0.3125}, + {1.0, 0.375}, + {1.0, 0.4375}, + {1.0, 0.5}, + {1.0, 0.5625}, + {1.0, 0.625}, + {1.0, 0.6875}, + {1.0, 0.75}, + {1.0, 0.8125}, + {1.0, 0.875}, + {1.0, 0.9375}, + {1.0, 1.0}, + {0.9375, 1.0}, + {0.875, 1.0}, + {0.8125, 1.0}, + {0.75, 1.0}, + {0.6875, 1.0}, + {0.625, 1.0}, + {0.5625, 1.0}, + {0.5, 1.0}, + {0.4375, 1.0}, + {0.375, 1.0}, + {0.3125, 1.0}, + {0.25, 1.0}, + {0.1875, 1.0}, + {0.125, 1.0}, + {0.0625, 1.0}, + {0.0, 0.9375}, + {0.0, 1.0}, + {0.0, 0.875}, + {0.0, 0.8125}, + {0.0, 0.75}, + {0.0, 0.6875}, + {0.0, 0.625}, + {0.0, 0.5625}, + {0.0, 0.5}, + {0.0, 0.4375}, + {0.0, 0.375}, + {0.0, 0.3125}, + {0.0, 0.25}, + {0.0, 0.1875}, + {0.0, 0.125}, +}; + +// floating-point +vertex_normal plane_normal[] = { + {-0.13369323663023402, -0.1944901609916269, 0.9717508403684473}, + {-0.08529965325761427, -0.20519916586708611, 0.9749960366491666}, + {-0.14100361114872287, 0.023700606980317247, 0.9897253471907165}, + {-0.1510052966036692, 0.16220568946433872, 0.9751342034320386}, + {0.156602778157927, 0.22360396676955607, 0.9620170663341365}, + {0.38199761252238257, 0.15249904688393545, 0.9114943031784075}, + {0.34150449935141863, -0.048800642952706384, 0.9386123662993895}, + {0.22090944297596432, 0.06770289402205877, 0.9729415892771194}, + {0.1696054842820028, 0.44141427336129746, 0.8811284917504286}, + {0.14640176561594007, 0.45260545845474365, 0.8796106081679023}, + {0.04020002331602029, 0.059800034684030175, 0.9974005784925033}, + {-0.10639590596430622, 0.1587938897286826, 0.9815622302120582}, + {0.02139899769442144, -0.08259613128781361, 0.9963533319028749}, + {0.2444919685707465, -0.5031834706944771, 0.8288727719766535}, + {-0.1058972138809537, -0.15339596420527196, 0.9824741514451087}, + {-0.3062933871971549, -0.08449817570407962, 0.9481795290249503}, + {-0.4849039447096354, 0.17140139435601465, 0.8576069766611328}, + {-0.4105058579603899, -0.09950141989539293, 0.9064129346048658}, + {-0.04449939547981858, -0.2113971281895202, 0.9763867358762891}, + {0.13909432159022925, 0.16779314998447495, 0.9759601572398543}, + {-0.013299777762570365, 0.15269744844695451, 0.9881834875918823}, + {-0.18539237589530877, 0.172192918711824, 0.9674602140167812}, + {-0.17349250962259208, 0.38688329667424143, 0.9056608989347645}, + {-0.01550046424585635, 0.4024120524214577, 0.9153274144666012}, + {0.13699313065169091, 0.10349481038284677, 0.9851506008616487}, + {0.2674888553090105, 0.11919503384237029, 0.9561601624167322}, + {0.3847009502125205, -0.2936007251946869, 0.8751021615050083}, + {0.29629187430676923, -0.4545875331078545, 0.8399769639476413}, + {-0.3152954061793977, 0.0702989757513849, 0.9463862112533523}, + {-0.37408613849495237, -0.0312988402429618, 0.9268656556294341}, + {-0.1144985905310258, 0.09789879487325262, 0.9885878305587084}, + {-0.05300291921616596, -0.1799099088110992, 0.9822540991343058}, + {-0.2846038962540098, -0.2711037114352145, 0.9195125882134996}, + {-0.4243851595104533, 0.20629278606740462, 0.8816691685682533}, + {-0.4298214787159506, 0.2261112990639284, 0.8741436820512154}, + {-0.3921025937672367, 0.17560116160552605, 0.9030059734042712}, + {-0.21830780136867536, 0.19580699728807438, 0.9560341644913131}, + {0.12890581313871818, 0.12580567333476142, 0.9836443584425385}, + {0.3887149833078029, -0.027901075467681252, 0.9209354981429271}, + {0.4547923845652801, 0.027099546221897735, 0.8901850939754009}, + {0.3538193739102422, -0.2551139691478315, 0.8998492725959185}, + {0.2758876984417836, -0.3760832308225981, 0.884560558324037}, + {-0.22629056161750832, 0.16629306406094405, 0.9597599692465068}, + {-0.14750123090290784, -0.1441012025295527, 0.9785081656847141}, + {-0.061998190609210226, -0.16059531309418001, 0.9850712511150482}, + {0.0226998376967407, -0.06849951023025277, 0.9973928686664834}, + {-0.18719383300075598, 0.058698066224061846, 0.9805676957293874}, + {-0.37139369378861875, 0.24639581623456022, 0.8951847998911456}, + {-0.3311131835338588, 0.15700625132834745, 0.9304370460884998}, + {-0.3505993584037612, 0.23369957233017394, 0.9068983403775557}, + {-0.31979472023275307, -0.10469827144580754, 0.9416844529180225}, + {0.10909718478346953, -0.34679105117238523, 0.9315759609924859}, + {0.3789964677693805, -0.1069990027739412, 0.919191433175764}, + {0.3286976892633667, 0.0850994017533085, 0.9405933876517272}, + {0.2451993330587211, -0.12639965619340274, 0.961197385546667}, + {0.2419134725364388, -0.44902500689897074, 0.8601479029706118}, + {-0.2096067106662647, -0.04750152078553231, 0.9766312673505444}, + {-0.16260328624562287, -0.059101194447209786, 0.9849199054324352}, + {-0.24440000855400043, -0.22960000803600042, 0.9421000329735018}, + {-0.20750423831735185, -0.11610237141515446, 0.971319839410332}, + {-0.2297098628046938, 0.33101421240032064, 0.9152392966428201}, + {-0.37139071349131225, 0.3248918761802029, 0.8697782514667297}, + {-0.4843053637116048, 0.12440137775288795, 0.8660095911093326}, + {-0.45459783384648256, 0.24409883687181347, 0.8565959183301738}, + {-0.1606938696458073, -0.46338232230159987, 0.8714667541774802}, + {0.20950258737293118, -0.6451079671325914, 0.7348090749481138}, + {0.3861973777287078, -0.03649975216752417, 0.9216937417207406}, + {0.31450919323807947, 0.15000438469224775, 0.9373273984802922}, + {0.29840655755615425, -0.08070177344095726, 0.951020898913883}, + {0.07400030599189791, -0.3378013968116637, 0.9383038798945651}, + {-0.005600240787529101, -0.13490580039958494, 0.9908426021935417}, + {-0.07079679864114653, 0.04319804662849619, 0.9965549368046135}, + {-0.14569267038612466, -0.16979145800661613, 0.9746509665432788}, + {-0.19820861829808947, -0.17260750513748863, 0.964841952240145}, + {-0.08059893771300136, 0.31939579039122373, 0.9441875556900233}, + {0.10530616217037438, 0.34882041182361423, 0.931254493951117}, + {0.24149149240458123, 0.13139537102261686, 0.9614661281449477}, + {0.341890444295621, 0.13649618498494376, 0.9297740131794923}, + {0.27589508083456266, -0.5652899209705629, 0.7773861393287025}, + {0.1149999856250027, -0.6869999141250162, 0.7174999103125169}, + {0.030900076323282778, 0.03520008694432213, 0.9989024672921413}, + {0.09020043747318263, 0.10750052137879303, 0.9901048020199347}, + {0.08450083444986033, -0.005200051350760635, 0.9964098395957492}, + {-0.1617936084697436, 0.04359827768405947, 0.985861054328308}, + {0.13090071602887499, 0.04200022974188503, 0.9905054180794554}, + {-0.10460135930349627, 0.16570215331347354, 0.9806127431453963}, + {-0.28921311755842705, -0.02480112488052901, 0.9569434031523473}, + {-0.31110843270835437, -0.21930594436818424, 0.9247250650125853}, + {-0.12210351052639216, 0.06280180557786591, 0.990528478103124}, + {0.18989358740182832, 0.12919563713699958, 0.9732671333238521}, + {0.4243081680108521, -0.03010057944173143, 0.9050174217530548}, + {0.48618659845111806, 0.0949973814332707, 0.86867605527455}, + {0.3110018442464046, -0.41150244021670573, 0.8567050802761891}, + {0.024699114429127932, -0.5600799186945165, 0.828070310071289}, + {-0.16989810989404108, 0.08499905439077983, 0.9817890776572663}, + {-0.221306095960371, 0.04990137455229333, 0.9739268271839373}, + {-0.31909298322244756, 0.1613964509310656, 0.9338794642163704}, + {-0.33029102611472905, 0.11799679407065705, 0.936474556331952}, + {-0.0008000400670098588, 0.18440923544577248, 0.9828492223216115}, + {-0.0028999969405048413, 0.25589973002592725, 0.9666989801331138}, + {-0.06920297163940466, 0.1392059776330221, 0.9878424188642185}, + {-0.22841038605638633, -0.19150870809894038, 0.9545434040753974}, + {-0.16330458484058, -0.24360683935802382, 0.9560268408303397}, + {0.21339370817927014, -0.24949264381784397, 0.9445721497007431}, + {0.4484900570856505, -0.17149619797143603, 0.8771805531227036}, + {0.5354890493609098, 0.04789902047504683, 0.8431827570889245}, + {0.5264091885525799, -0.1918033479566581, 0.8283144583550569}, + {0.24720320377428154, -0.20600266981190127, 0.9468122707665443}, + {-0.09160139143570395, 0.1815027570478195, 0.9791148728678792}, + {-0.22609324669558029, 0.14219575267630039, 0.9636712155706799}, + {-0.2535896778422409, 0.21259134664534865, 0.9436615890367616}, + {-0.070399999648, -0.11209999943950001, 0.991199995044}, + {-0.2643912963817823, 0.06579783397095791, 0.9621683259400564}, + {0.12399898321250649, -0.013399890121351508, 0.9921918640600721}, + {0.40919069306352823, 0.14169677714345538, 0.9013794983564621}, + {0.4149897955263904, -0.0456988762784483, 0.908677655891159}, + {0.3858011612632431, -0.399701203102432, 0.8315025028263003}, + {0.4237994109192283, -0.40029944358416014, 0.8124988706273548}, + {0.4087847587444, -0.1672937625683418, 0.8971665497687762}, + {0.430283763548518, -0.08929663045522346, 0.8982661045680541}, + {0.4119083144532417, -0.04490090633394162, 0.9101183709247276}, + {0.15299800721393397, 0.25489667999236454, 0.9547875639729684}, + {0.03230029571056085, 0.17960164426057987, 0.9832090013196109}, + {-0.007399738904819033, 0.31498888581324264, 0.9490665127788844}, + {-0.0807019150791675, 0.1471034908072558, 0.9858233938667079}, + {-0.003600009774039805, -0.29850081043080046, 0.9544025912065528}, + {-0.40300543053476495, -0.06740090823335772, 0.9127122988810917}, + {-0.1622043917433605, -0.45991245229822125, 0.8730236374349797}, + {0.16330447623704133, -0.009800268629044734, 0.986527041076799}, + {0.34680804604000326, -0.08560198598911267, 0.9340216695541034}, + {0.3689158139153025, -0.43091847171619363, 0.8235353015973207}, + {0.2033943487665282, -0.25989277897945273, 0.9439737720531102}, + {-0.073701455249601, -0.048100949762629686, 0.996119668577036}, + {-0.10610069496182802, -0.21870143249907434, 0.9700063535624238}, + {-0.025899182893669347, 0.019799375339561897, 0.9994684672672786}, + {0.04579732620116234, 0.382677658017136, 0.9227461270400132}, + {0.06499885863006359, 0.14439746440278742, 0.9873826617126891}, + {0.009799592051474168, 0.42088247902708953, 0.9070622397849202}, + {-0.13299340834506904, 0.23128853646777794, 0.9637522328043423}, + {-0.40860723036891267, -0.14930264193362372, 0.900415933000903}, + {0.09330219169422464, -0.23820559551515874, 0.96672270858314}, + {0.20560457578075156, -0.6018133935061104, 0.7717171747568384}, + {0.23110502196669158, -0.07770168847603608, 0.9698210744409238}, + {0.11189818838299499, -0.1008983664686702, 0.9885839949546814}, + {-0.09059903014257346, -0.35309622012519526, 0.9311900316640663}, + {-0.0850024795584936, -0.19290562713921666, 0.9775285149226765}, + {0.17759960484131884, -0.10299977082576486, 0.9786978223997678}, + {0.2648031246953072, -0.21940258896582482, 0.9390110803961234}, + {0.25438794611275345, -0.035398322690218045, 0.9664542056524221}, + {0.15600635504831198, 0.42981750897284926, 0.8893362278491271}, + {-0.09319724792590255, 0.3168906423574948, 0.9438721278675901}, + {-0.22549760297322055, 0.42739545681044105, 0.8754906935833905}, + {-0.30250338351926714, 0.395304421504682, 0.8673097009132574}, + {-0.4972982147026138, 0.1424994884277548, 0.8557969276945443}, + {0.23691039941022818, -0.36921620710112385, 0.8986394466442846}, + {0.11600287110659027, -0.548113565978639, 0.8283205011861097}, + {0.007899607754715168, -0.037898118215658846, 0.9992503834540338}, + {0.003499950388554861, -0.014699791631930414, 0.9998858267188586}, + {0.015099406227524927, -0.25898981542575866, 0.9657620221552036}, + {0.08310045663826383, -0.36420200129549574, 0.9276050972040137}, + {0.18709104697216555, -0.2708870370110083, 0.9442548137670548}, + {0.2052073034578974, -0.16130574097348369, 0.965334356861152}, + {0.02859989289360167, 0.0987996299960785, 0.9946962748694259}, + {-0.12790226452964043, 0.5197092015328705, 0.8447149558106901}, + {-0.09849925633342202, 0.3965970057039104, 0.9126931091930384}, + {-0.06960286874135398, 0.45951893946339306, 0.8854364940171668}, + {-0.16839805248778442, 0.5315938521526496, 0.8300904000600346}, + {-0.22549506960420404, 0.23619483565637692, 0.9451793338797946}, + {0.18849579470572966, -0.3310926134061915, 0.9245793728642846}, + {0.11900183442741666, -0.459607084897821, 0.880113567055205}, + {0.18180917068585992, -0.09380473162999813, 0.978849374407699}, + {0.23689551087260305, -0.010199806715494095, 0.9714815905982856}, + {0.17680346361377863, -0.21570422568717224, 0.9603188128298168}, + {-0.020500236779102204, -0.2913033645732913, 0.9564110466113829}, + {-0.2730026481385305, -0.2018019574884815, 0.9406091239527538}, + {-0.2652930255380367, -0.24249362492639995, 0.9331754671394492}, + {-0.14800235621626656, 0.2360037572097224, 0.9604152899331245}, + {-0.1137028409009703, 0.5297132350505186, 0.8405210006795563}, + {-0.013399990285010566, 0.24669982114269454, 0.968999297475764}, + {0.21189071621164932, 0.3788833995875126, 0.9008605296605704}, + {0.37160874591475385, 0.49261159375028996, 0.7869185203453171}, + {0.46638106298139864, 0.19919191197661795, 0.8618650046819629}, + {0.2675896752515668, -0.41208410004174395, 0.870966394409995}, + {0.3861971942875752, -0.41199700685261775, 0.8252940042608385}, + {0.3664912959350811, -0.08979786732597622, 0.9260780059085365}, + {0.254489563596991, 0.06239744113340761, 0.9650604236835205}, + {-0.0071000243176249315, 0.030700105148040197, 0.9995034233050872}, + {-0.3704919418878949, 0.03489924094976392, 0.9281798123086209}, + {-0.5347907802864211, -0.044999224220061605, 0.8437854532641775}, + {-0.5401021442097688, -0.29580117433299313, 0.7879031279816272}, + {-0.466487801503484, 0.06579827939749035, 0.8820769339897604}, + {-0.18100095749759776, 0.4079021578081222, 0.8949047340585649}, + {-0.05729757006157944, 0.16119316394287272, 0.9852582160850649}, + {-0.06239711232846062, 0.2593879958013251, 0.963755398432217}, + {0.08510036976190992, 0.3573015524786183, 0.9301040413108392}, + {0.3593018881363833, 0.10040052760615888, 0.9278048756274322}, + {0.4707164989024349, -0.11290395735305905, 0.8750306703625037}, + {0.3730806637302852, -0.18009066614265445, 0.9101528280013552}, + {0.47568800805647343, -0.02769930170940575, 0.8791778362061203}, + {0.5160855885111585, -0.12079662680129422, 0.8479763205918666}, + {0.43449293737470396, 0.18009707254587845, 0.8824856553122583}, + {0.3734763036802734, 0.3902752378217154, 0.841546605561762}, + {0.38489266786451515, 0.1559970282849165, 0.9096826707101828}, + {0.3377200324578555, -0.15820938446796784, 0.9278550373538593}, + {0.26958970591361575, -0.03139880105967186, 0.9624632490424895}, + {0.18511034888333955, 0.4387245275803407, 0.8793491613890896}, + {0.23909238383341755, 0.47608483455913886, 0.8462730424015946}, + {0.3879945273757868, 0.022499682644214442, 0.9213870039279638}, + {0.2513907527612364, -0.10689606790046209, 0.9619646147824559}, + {0.07390130436953328, 0.1318023263315898, 0.9885174474869236}, + {0.14469718349673458, -0.4159919027964173, 0.8977825248332295}, + {0.12609626949704958, -0.42498742693295855, 0.896373481182833}, + {0.23188819023519933, -0.24588747726966587, 0.9411520683457076}, + {0.057300894760457584, 0.01680026233814463, 0.9982155872580936}, + {0.3780894930389806, 0.09009749622536936, 0.9213743953613244}, + {0.38810963494128264, -0.040501005449940605, 0.9207228572286497}, + {-0.3306156500622023, 0.07910374446436844, 0.9404445169948429}, + {-0.37661413647692393, 0.32991238349372604, 0.8656324921253994}, + {-0.10919885341805864, 0.314396698851993, 0.9429900986559459}, + {0.05210003881454338, 0.20630015369367177, 0.9771007279403136}, + {-0.046402461019782, 0.3144166755305919, 0.9481502864839509}, + {-0.48839815141649534, 0.30549884368906494, 0.8173969061585653}, + {-0.5007019677626, 0.1642006453098041, 0.84990334012669}, + {-0.11320558230489855, -0.006700330401438343, 0.993548993108805}, + {0.44437167443039133, -0.06129609280509223, 0.8937430301662551}, + {0.5161961982290001, -0.10349923773092116, 0.8501937383461756}, + {0.049799919075197256, -0.13999977250055456, 0.988898393041417}, + {0.05069841671316869, -0.09089716132597699, 0.9945689400969936}, + {-0.1259945017199148, 0.10779529591592713, 0.9861569650490475}, + {-0.24440688992734194, 0.23990676306697764, 0.9395264856249499}, + {-0.21449123821187493, 0.2091914547036095, 0.9540610274030297}, + {-0.3246918730641245, 0.12609684383549769, 0.9373765377588862}, + {-0.4650006184512338, -0.09950013233526402, 0.8797011700033341}, + {-0.3757069562786938, -0.2092038734455756, 0.9028167158062411}, + {-0.31499613502113477, -0.05849928221821075, 0.9472883768429238}, + {-0.30330593120547766, 0.25900506489356645, 0.9170179324610056}, + {-0.22730890841068432, 0.2513098490259788, 0.9408368721195416}, + {-0.24650796603363564, 0.08240266288507739, 0.9656312048765865}, + {-0.18588978099017736, 0.0782956958124308, 0.9794461564275349}, + {0.017799878872236413, -0.3673974998685201, 0.9298936720950921}, + {0.18119626014778545, -0.47199025822160445, 0.8627821923593227}, + {0.40160382931076877, -0.12740121477637437, 0.9069086474151797}, + {0.029998950055121782, -0.1677941273083145, 0.9853655128105668}, + {0.16780149931309457, 0.024800221590969878, 0.9855088055605168}, + {0.11440456426113861, 0.24660983869577607, 0.9623383932560636}, + {-0.15739954590296512, 0.4500987014671194, 0.8789974640959741}, + {-0.24199510569848032, 0.3957919951878451, 0.8858820832160484}, + {-0.32968967757779, 0.20179368193872618, 0.9222711241431475}, + {0.0722964886448177, 0.10769476939207284, 0.9915518414965593}, + {0.23450313884552032, 0.06830091421385517, 0.9697129796951005}, + {-0.035598705298632, 0.16729391563093074, 0.9852641665938796}, + {-0.34181478551832833, 0.2495107928227704, 0.9060391915728656}, + {-0.2717055686626952, 0.25340519359266456, 0.9284190281429746}, + {-0.07020064093477763, 0.16430150007954364, 0.9839089831300242}, + {-0.14150560019494376, 0.1688066806565831, 0.97543860374663}, + {-0.010999643342346842, 0.12679588870996178, 0.9918678392067121}, +}; + +const union quadrilateral plane_Plane_quadrilateral[] = { + { .v = { + {64, 0, 0}, + {65, 1, 0}, + {80, 2, 0}, + {79, 3, 0}, + }}, + { .v = { + {65, 1, 1}, + {66, 4, 1}, + {81, 5, 1}, + {80, 2, 1}, + }}, + { .v = { + {66, 4, 2}, + {67, 6, 2}, + {82, 7, 2}, + {81, 5, 2}, + }}, + { .v = { + {67, 6, 3}, + {68, 8, 3}, + {83, 9, 3}, + {82, 7, 3}, + }}, + { .v = { + {68, 8, 4}, + {69, 10, 4}, + {84, 11, 4}, + {83, 9, 4}, + }}, + { .v = { + {69, 10, 5}, + {70, 12, 5}, + {85, 13, 5}, + {84, 11, 5}, + }}, + { .v = { + {70, 12, 6}, + {71, 14, 6}, + {86, 15, 6}, + {85, 13, 6}, + }}, + { .v = { + {71, 14, 7}, + {72, 16, 7}, + {87, 17, 7}, + {86, 15, 7}, + }}, + { .v = { + {72, 16, 8}, + {73, 18, 8}, + {88, 19, 8}, + {87, 17, 8}, + }}, + { .v = { + {73, 18, 9}, + {74, 20, 9}, + {89, 21, 9}, + {88, 19, 9}, + }}, + { .v = { + {74, 20, 10}, + {75, 22, 10}, + {90, 23, 10}, + {89, 21, 10}, + }}, + { .v = { + {75, 22, 11}, + {76, 24, 11}, + {91, 25, 11}, + {90, 23, 11}, + }}, + { .v = { + {76, 24, 12}, + {77, 26, 12}, + {92, 27, 12}, + {91, 25, 12}, + }}, + { .v = { + {77, 26, 13}, + {78, 28, 13}, + {93, 29, 13}, + {92, 27, 13}, + }}, + { .v = { + {79, 3, 14}, + {80, 2, 14}, + {95, 30, 14}, + {94, 31, 14}, + }}, + { .v = { + {80, 2, 15}, + {81, 5, 15}, + {96, 32, 15}, + {95, 30, 15}, + }}, + { .v = { + {81, 5, 16}, + {82, 7, 16}, + {97, 33, 16}, + {96, 32, 16}, + }}, + { .v = { + {82, 7, 17}, + {83, 9, 17}, + {98, 34, 17}, + {97, 33, 17}, + }}, + { .v = { + {83, 9, 18}, + {84, 11, 18}, + {99, 35, 18}, + {98, 34, 18}, + }}, + { .v = { + {84, 11, 19}, + {85, 13, 19}, + {100, 36, 19}, + {99, 35, 19}, + }}, + { .v = { + {85, 13, 20}, + {86, 15, 20}, + {101, 37, 20}, + {100, 36, 20}, + }}, + { .v = { + {86, 15, 21}, + {87, 17, 21}, + {102, 38, 21}, + {101, 37, 21}, + }}, + { .v = { + {87, 17, 22}, + {88, 19, 22}, + {103, 39, 22}, + {102, 38, 22}, + }}, + { .v = { + {88, 19, 23}, + {89, 21, 23}, + {104, 40, 23}, + {103, 39, 23}, + }}, + { .v = { + {89, 21, 24}, + {90, 23, 24}, + {105, 41, 24}, + {104, 40, 24}, + }}, + { .v = { + {90, 23, 25}, + {91, 25, 25}, + {106, 42, 25}, + {105, 41, 25}, + }}, + { .v = { + {91, 25, 26}, + {92, 27, 26}, + {107, 43, 26}, + {106, 42, 26}, + }}, + { .v = { + {92, 27, 27}, + {93, 29, 27}, + {108, 44, 27}, + {107, 43, 27}, + }}, + { .v = { + {94, 31, 28}, + {95, 30, 28}, + {110, 45, 28}, + {109, 46, 28}, + }}, + { .v = { + {95, 30, 29}, + {96, 32, 29}, + {111, 47, 29}, + {110, 45, 29}, + }}, + { .v = { + {96, 32, 30}, + {97, 33, 30}, + {112, 48, 30}, + {111, 47, 30}, + }}, + { .v = { + {97, 33, 31}, + {98, 34, 31}, + {113, 49, 31}, + {112, 48, 31}, + }}, + { .v = { + {98, 34, 32}, + {99, 35, 32}, + {114, 50, 32}, + {113, 49, 32}, + }}, + { .v = { + {99, 35, 33}, + {100, 36, 33}, + {115, 51, 33}, + {114, 50, 33}, + }}, + { .v = { + {100, 36, 34}, + {101, 37, 34}, + {116, 52, 34}, + {115, 51, 34}, + }}, + { .v = { + {101, 37, 35}, + {102, 38, 35}, + {117, 53, 35}, + {116, 52, 35}, + }}, + { .v = { + {102, 38, 36}, + {103, 39, 36}, + {118, 54, 36}, + {117, 53, 36}, + }}, + { .v = { + {103, 39, 37}, + {104, 40, 37}, + {119, 55, 37}, + {118, 54, 37}, + }}, + { .v = { + {104, 40, 38}, + {105, 41, 38}, + {120, 56, 38}, + {119, 55, 38}, + }}, + { .v = { + {105, 41, 39}, + {106, 42, 39}, + {121, 57, 39}, + {120, 56, 39}, + }}, + { .v = { + {106, 42, 40}, + {107, 43, 40}, + {122, 58, 40}, + {121, 57, 40}, + }}, + { .v = { + {107, 43, 41}, + {108, 44, 41}, + {123, 59, 41}, + {122, 58, 41}, + }}, + { .v = { + {109, 46, 42}, + {110, 45, 42}, + {125, 60, 42}, + {124, 61, 42}, + }}, + { .v = { + {110, 45, 43}, + {111, 47, 43}, + {126, 62, 43}, + {125, 60, 43}, + }}, + { .v = { + {111, 47, 44}, + {112, 48, 44}, + {127, 63, 44}, + {126, 62, 44}, + }}, + { .v = { + {112, 48, 45}, + {113, 49, 45}, + {128, 64, 45}, + {127, 63, 45}, + }}, + { .v = { + {113, 49, 46}, + {114, 50, 46}, + {129, 65, 46}, + {128, 64, 46}, + }}, + { .v = { + {114, 50, 47}, + {115, 51, 47}, + {130, 66, 47}, + {129, 65, 47}, + }}, + { .v = { + {115, 51, 48}, + {116, 52, 48}, + {131, 67, 48}, + {130, 66, 48}, + }}, + { .v = { + {116, 52, 49}, + {117, 53, 49}, + {132, 68, 49}, + {131, 67, 49}, + }}, + { .v = { + {117, 53, 50}, + {118, 54, 50}, + {133, 69, 50}, + {132, 68, 50}, + }}, + { .v = { + {118, 54, 51}, + {119, 55, 51}, + {134, 70, 51}, + {133, 69, 51}, + }}, + { .v = { + {119, 55, 52}, + {120, 56, 52}, + {135, 71, 52}, + {134, 70, 52}, + }}, + { .v = { + {120, 56, 53}, + {121, 57, 53}, + {136, 72, 53}, + {135, 71, 53}, + }}, + { .v = { + {121, 57, 54}, + {122, 58, 54}, + {137, 73, 54}, + {136, 72, 54}, + }}, + { .v = { + {122, 58, 55}, + {123, 59, 55}, + {138, 74, 55}, + {137, 73, 55}, + }}, + { .v = { + {124, 61, 56}, + {125, 60, 56}, + {140, 75, 56}, + {139, 76, 56}, + }}, + { .v = { + {125, 60, 57}, + {126, 62, 57}, + {141, 77, 57}, + {140, 75, 57}, + }}, + { .v = { + {126, 62, 58}, + {127, 63, 58}, + {142, 78, 58}, + {141, 77, 58}, + }}, + { .v = { + {127, 63, 59}, + {128, 64, 59}, + {143, 79, 59}, + {142, 78, 59}, + }}, + { .v = { + {128, 64, 60}, + {129, 65, 60}, + {144, 80, 60}, + {143, 79, 60}, + }}, + { .v = { + {129, 65, 61}, + {130, 66, 61}, + {145, 81, 61}, + {144, 80, 61}, + }}, + { .v = { + {130, 66, 62}, + {131, 67, 62}, + {146, 82, 62}, + {145, 81, 62}, + }}, + { .v = { + {131, 67, 63}, + {132, 68, 63}, + {147, 83, 63}, + {146, 82, 63}, + }}, + { .v = { + {132, 68, 64}, + {133, 69, 64}, + {148, 84, 64}, + {147, 83, 64}, + }}, + { .v = { + {133, 69, 65}, + {134, 70, 65}, + {149, 85, 65}, + {148, 84, 65}, + }}, + { .v = { + {134, 70, 66}, + {135, 71, 66}, + {150, 86, 66}, + {149, 85, 66}, + }}, + { .v = { + {135, 71, 67}, + {136, 72, 67}, + {151, 87, 67}, + {150, 86, 67}, + }}, + { .v = { + {136, 72, 68}, + {137, 73, 68}, + {152, 88, 68}, + {151, 87, 68}, + }}, + { .v = { + {137, 73, 69}, + {138, 74, 69}, + {153, 89, 69}, + {152, 88, 69}, + }}, + { .v = { + {139, 76, 70}, + {140, 75, 70}, + {155, 90, 70}, + {154, 91, 70}, + }}, + { .v = { + {140, 75, 71}, + {141, 77, 71}, + {156, 92, 71}, + {155, 90, 71}, + }}, + { .v = { + {141, 77, 72}, + {142, 78, 72}, + {157, 93, 72}, + {156, 92, 72}, + }}, + { .v = { + {142, 78, 73}, + {143, 79, 73}, + {158, 94, 73}, + {157, 93, 73}, + }}, + { .v = { + {143, 79, 74}, + {144, 80, 74}, + {159, 95, 74}, + {158, 94, 74}, + }}, + { .v = { + {144, 80, 75}, + {145, 81, 75}, + {160, 96, 75}, + {159, 95, 75}, + }}, + { .v = { + {145, 81, 76}, + {146, 82, 76}, + {161, 97, 76}, + {160, 96, 76}, + }}, + { .v = { + {146, 82, 77}, + {147, 83, 77}, + {162, 98, 77}, + {161, 97, 77}, + }}, + { .v = { + {147, 83, 78}, + {148, 84, 78}, + {163, 99, 78}, + {162, 98, 78}, + }}, + { .v = { + {148, 84, 79}, + {149, 85, 79}, + {164, 100, 79}, + {163, 99, 79}, + }}, + { .v = { + {149, 85, 80}, + {150, 86, 80}, + {165, 101, 80}, + {164, 100, 80}, + }}, + { .v = { + {150, 86, 81}, + {151, 87, 81}, + {166, 102, 81}, + {165, 101, 81}, + }}, + { .v = { + {151, 87, 82}, + {152, 88, 82}, + {167, 103, 82}, + {166, 102, 82}, + }}, + { .v = { + {152, 88, 83}, + {153, 89, 83}, + {168, 104, 83}, + {167, 103, 83}, + }}, + { .v = { + {154, 91, 84}, + {155, 90, 84}, + {170, 105, 84}, + {169, 106, 84}, + }}, + { .v = { + {155, 90, 85}, + {156, 92, 85}, + {171, 107, 85}, + {170, 105, 85}, + }}, + { .v = { + {156, 92, 86}, + {157, 93, 86}, + {172, 108, 86}, + {171, 107, 86}, + }}, + { .v = { + {157, 93, 87}, + {158, 94, 87}, + {173, 109, 87}, + {172, 108, 87}, + }}, + { .v = { + {158, 94, 88}, + {159, 95, 88}, + {174, 110, 88}, + {173, 109, 88}, + }}, + { .v = { + {159, 95, 89}, + {160, 96, 89}, + {175, 111, 89}, + {174, 110, 89}, + }}, + { .v = { + {160, 96, 90}, + {161, 97, 90}, + {176, 112, 90}, + {175, 111, 90}, + }}, + { .v = { + {161, 97, 91}, + {162, 98, 91}, + {177, 113, 91}, + {176, 112, 91}, + }}, + { .v = { + {162, 98, 92}, + {163, 99, 92}, + {178, 114, 92}, + {177, 113, 92}, + }}, + { .v = { + {163, 99, 93}, + {164, 100, 93}, + {179, 115, 93}, + {178, 114, 93}, + }}, + { .v = { + {164, 100, 94}, + {165, 101, 94}, + {180, 116, 94}, + {179, 115, 94}, + }}, + { .v = { + {165, 101, 95}, + {166, 102, 95}, + {181, 117, 95}, + {180, 116, 95}, + }}, + { .v = { + {166, 102, 96}, + {167, 103, 96}, + {182, 118, 96}, + {181, 117, 96}, + }}, + { .v = { + {167, 103, 97}, + {168, 104, 97}, + {183, 119, 97}, + {182, 118, 97}, + }}, + { .v = { + {169, 106, 98}, + {170, 105, 98}, + {185, 120, 98}, + {184, 121, 98}, + }}, + { .v = { + {170, 105, 99}, + {171, 107, 99}, + {186, 122, 99}, + {185, 120, 99}, + }}, + { .v = { + {171, 107, 100}, + {172, 108, 100}, + {187, 123, 100}, + {186, 122, 100}, + }}, + { .v = { + {172, 108, 101}, + {173, 109, 101}, + {188, 124, 101}, + {187, 123, 101}, + }}, + { .v = { + {173, 109, 102}, + {174, 110, 102}, + {189, 125, 102}, + {188, 124, 102}, + }}, + { .v = { + {174, 110, 103}, + {175, 111, 103}, + {190, 126, 103}, + {189, 125, 103}, + }}, + { .v = { + {175, 111, 104}, + {176, 112, 104}, + {191, 127, 104}, + {190, 126, 104}, + }}, + { .v = { + {176, 112, 105}, + {177, 113, 105}, + {192, 128, 105}, + {191, 127, 105}, + }}, + { .v = { + {177, 113, 106}, + {178, 114, 106}, + {193, 129, 106}, + {192, 128, 106}, + }}, + { .v = { + {178, 114, 107}, + {179, 115, 107}, + {194, 130, 107}, + {193, 129, 107}, + }}, + { .v = { + {179, 115, 108}, + {180, 116, 108}, + {195, 131, 108}, + {194, 130, 108}, + }}, + { .v = { + {180, 116, 109}, + {181, 117, 109}, + {196, 132, 109}, + {195, 131, 109}, + }}, + { .v = { + {181, 117, 110}, + {182, 118, 110}, + {197, 133, 110}, + {196, 132, 110}, + }}, + { .v = { + {182, 118, 111}, + {183, 119, 111}, + {198, 134, 111}, + {197, 133, 111}, + }}, + { .v = { + {184, 121, 112}, + {185, 120, 112}, + {200, 135, 112}, + {199, 136, 112}, + }}, + { .v = { + {185, 120, 113}, + {186, 122, 113}, + {201, 137, 113}, + {200, 135, 113}, + }}, + { .v = { + {186, 122, 114}, + {187, 123, 114}, + {202, 138, 114}, + {201, 137, 114}, + }}, + { .v = { + {187, 123, 115}, + {188, 124, 115}, + {203, 139, 115}, + {202, 138, 115}, + }}, + { .v = { + {188, 124, 116}, + {189, 125, 116}, + {204, 140, 116}, + {203, 139, 116}, + }}, + { .v = { + {189, 125, 117}, + {190, 126, 117}, + {205, 141, 117}, + {204, 140, 117}, + }}, + { .v = { + {190, 126, 118}, + {191, 127, 118}, + {206, 142, 118}, + {205, 141, 118}, + }}, + { .v = { + {191, 127, 119}, + {192, 128, 119}, + {207, 143, 119}, + {206, 142, 119}, + }}, + { .v = { + {192, 128, 120}, + {193, 129, 120}, + {208, 144, 120}, + {207, 143, 120}, + }}, + { .v = { + {193, 129, 121}, + {194, 130, 121}, + {209, 145, 121}, + {208, 144, 121}, + }}, + { .v = { + {194, 130, 122}, + {195, 131, 122}, + {210, 146, 122}, + {209, 145, 122}, + }}, + { .v = { + {195, 131, 123}, + {196, 132, 123}, + {211, 147, 123}, + {210, 146, 123}, + }}, + { .v = { + {196, 132, 124}, + {197, 133, 124}, + {212, 148, 124}, + {211, 147, 124}, + }}, + { .v = { + {197, 133, 125}, + {198, 134, 125}, + {213, 149, 125}, + {212, 148, 125}, + }}, + { .v = { + {199, 136, 126}, + {200, 135, 126}, + {215, 150, 126}, + {214, 151, 126}, + }}, + { .v = { + {200, 135, 127}, + {201, 137, 127}, + {216, 152, 127}, + {215, 150, 127}, + }}, + { .v = { + {201, 137, 128}, + {202, 138, 128}, + {217, 153, 128}, + {216, 152, 128}, + }}, + { .v = { + {202, 138, 129}, + {203, 139, 129}, + {218, 154, 129}, + {217, 153, 129}, + }}, + { .v = { + {203, 139, 130}, + {204, 140, 130}, + {219, 155, 130}, + {218, 154, 130}, + }}, + { .v = { + {204, 140, 131}, + {205, 141, 131}, + {220, 156, 131}, + {219, 155, 131}, + }}, + { .v = { + {205, 141, 132}, + {206, 142, 132}, + {221, 157, 132}, + {220, 156, 132}, + }}, + { .v = { + {206, 142, 133}, + {207, 143, 133}, + {222, 158, 133}, + {221, 157, 133}, + }}, + { .v = { + {207, 143, 134}, + {208, 144, 134}, + {223, 159, 134}, + {222, 158, 134}, + }}, + { .v = { + {208, 144, 135}, + {209, 145, 135}, + {224, 160, 135}, + {223, 159, 135}, + }}, + { .v = { + {209, 145, 136}, + {210, 146, 136}, + {225, 161, 136}, + {224, 160, 136}, + }}, + { .v = { + {210, 146, 137}, + {211, 147, 137}, + {226, 162, 137}, + {225, 161, 137}, + }}, + { .v = { + {211, 147, 138}, + {212, 148, 138}, + {227, 163, 138}, + {226, 162, 138}, + }}, + { .v = { + {212, 148, 139}, + {213, 149, 139}, + {228, 164, 139}, + {227, 163, 139}, + }}, + { .v = { + {214, 151, 140}, + {215, 150, 140}, + {230, 165, 140}, + {229, 166, 140}, + }}, + { .v = { + {215, 150, 141}, + {216, 152, 141}, + {231, 167, 141}, + {230, 165, 141}, + }}, + { .v = { + {216, 152, 142}, + {217, 153, 142}, + {232, 168, 142}, + {231, 167, 142}, + }}, + { .v = { + {217, 153, 143}, + {218, 154, 143}, + {233, 169, 143}, + {232, 168, 143}, + }}, + { .v = { + {218, 154, 144}, + {219, 155, 144}, + {234, 170, 144}, + {233, 169, 144}, + }}, + { .v = { + {219, 155, 145}, + {220, 156, 145}, + {235, 171, 145}, + {234, 170, 145}, + }}, + { .v = { + {220, 156, 146}, + {221, 157, 146}, + {236, 172, 146}, + {235, 171, 146}, + }}, + { .v = { + {221, 157, 147}, + {222, 158, 147}, + {237, 173, 147}, + {236, 172, 147}, + }}, + { .v = { + {222, 158, 148}, + {223, 159, 148}, + {238, 174, 148}, + {237, 173, 148}, + }}, + { .v = { + {223, 159, 149}, + {224, 160, 149}, + {239, 175, 149}, + {238, 174, 149}, + }}, + { .v = { + {224, 160, 150}, + {225, 161, 150}, + {240, 176, 150}, + {239, 175, 150}, + }}, + { .v = { + {225, 161, 151}, + {226, 162, 151}, + {241, 177, 151}, + {240, 176, 151}, + }}, + { .v = { + {226, 162, 152}, + {227, 163, 152}, + {242, 178, 152}, + {241, 177, 152}, + }}, + { .v = { + {227, 163, 153}, + {228, 164, 153}, + {243, 179, 153}, + {242, 178, 153}, + }}, + { .v = { + {229, 166, 154}, + {230, 165, 154}, + {245, 180, 154}, + {244, 181, 154}, + }}, + { .v = { + {230, 165, 155}, + {231, 167, 155}, + {246, 182, 155}, + {245, 180, 155}, + }}, + { .v = { + {231, 167, 156}, + {232, 168, 156}, + {247, 183, 156}, + {246, 182, 156}, + }}, + { .v = { + {232, 168, 157}, + {233, 169, 157}, + {248, 184, 157}, + {247, 183, 157}, + }}, + { .v = { + {233, 169, 158}, + {234, 170, 158}, + {249, 185, 158}, + {248, 184, 158}, + }}, + { .v = { + {234, 170, 159}, + {235, 171, 159}, + {250, 186, 159}, + {249, 185, 159}, + }}, + { .v = { + {235, 171, 160}, + {236, 172, 160}, + {251, 187, 160}, + {250, 186, 160}, + }}, + { .v = { + {236, 172, 161}, + {237, 173, 161}, + {252, 188, 161}, + {251, 187, 161}, + }}, + { .v = { + {237, 173, 162}, + {238, 174, 162}, + {253, 189, 162}, + {252, 188, 162}, + }}, + { .v = { + {238, 174, 163}, + {239, 175, 163}, + {254, 190, 163}, + {253, 189, 163}, + }}, + { .v = { + {239, 175, 164}, + {240, 176, 164}, + {255, 191, 164}, + {254, 190, 164}, + }}, + { .v = { + {240, 176, 165}, + {241, 177, 165}, + {256, 192, 165}, + {255, 191, 165}, + }}, + { .v = { + {241, 177, 166}, + {242, 178, 166}, + {257, 193, 166}, + {256, 192, 166}, + }}, + { .v = { + {242, 178, 167}, + {243, 179, 167}, + {258, 194, 167}, + {257, 193, 167}, + }}, + { .v = { + {244, 181, 168}, + {245, 180, 168}, + {260, 195, 168}, + {259, 196, 168}, + }}, + { .v = { + {245, 180, 169}, + {246, 182, 169}, + {261, 197, 169}, + {260, 195, 169}, + }}, + { .v = { + {246, 182, 170}, + {247, 183, 170}, + {262, 198, 170}, + {261, 197, 170}, + }}, + { .v = { + {247, 183, 171}, + {248, 184, 171}, + {263, 199, 171}, + {262, 198, 171}, + }}, + { .v = { + {248, 184, 172}, + {249, 185, 172}, + {264, 200, 172}, + {263, 199, 172}, + }}, + { .v = { + {249, 185, 173}, + {250, 186, 173}, + {265, 201, 173}, + {264, 200, 173}, + }}, + { .v = { + {250, 186, 174}, + {251, 187, 174}, + {266, 202, 174}, + {265, 201, 174}, + }}, + { .v = { + {251, 187, 175}, + {252, 188, 175}, + {267, 203, 175}, + {266, 202, 175}, + }}, + { .v = { + {252, 188, 176}, + {253, 189, 176}, + {268, 204, 176}, + {267, 203, 176}, + }}, + { .v = { + {253, 189, 177}, + {254, 190, 177}, + {269, 205, 177}, + {268, 204, 177}, + }}, + { .v = { + {254, 190, 178}, + {255, 191, 178}, + {270, 206, 178}, + {269, 205, 178}, + }}, + { .v = { + {255, 191, 179}, + {256, 192, 179}, + {271, 207, 179}, + {270, 206, 179}, + }}, + { .v = { + {256, 192, 180}, + {257, 193, 180}, + {272, 208, 180}, + {271, 207, 180}, + }}, + { .v = { + {257, 193, 181}, + {258, 194, 181}, + {273, 209, 181}, + {272, 208, 181}, + }}, + { .v = { + {259, 196, 182}, + {260, 195, 182}, + {275, 210, 182}, + {274, 211, 182}, + }}, + { .v = { + {260, 195, 183}, + {261, 197, 183}, + {276, 212, 183}, + {275, 210, 183}, + }}, + { .v = { + {261, 197, 184}, + {262, 198, 184}, + {277, 213, 184}, + {276, 212, 184}, + }}, + { .v = { + {262, 198, 185}, + {263, 199, 185}, + {278, 214, 185}, + {277, 213, 185}, + }}, + { .v = { + {263, 199, 186}, + {264, 200, 186}, + {279, 215, 186}, + {278, 214, 186}, + }}, + { .v = { + {264, 200, 187}, + {265, 201, 187}, + {280, 216, 187}, + {279, 215, 187}, + }}, + { .v = { + {265, 201, 188}, + {266, 202, 188}, + {281, 217, 188}, + {280, 216, 188}, + }}, + { .v = { + {266, 202, 189}, + {267, 203, 189}, + {282, 218, 189}, + {281, 217, 189}, + }}, + { .v = { + {267, 203, 190}, + {268, 204, 190}, + {283, 219, 190}, + {282, 218, 190}, + }}, + { .v = { + {268, 204, 191}, + {269, 205, 191}, + {284, 220, 191}, + {283, 219, 191}, + }}, + { .v = { + {269, 205, 192}, + {270, 206, 192}, + {285, 221, 192}, + {284, 220, 192}, + }}, + { .v = { + {270, 206, 193}, + {271, 207, 193}, + {286, 222, 193}, + {285, 221, 193}, + }}, + { .v = { + {271, 207, 194}, + {272, 208, 194}, + {287, 223, 194}, + {286, 222, 194}, + }}, + { .v = { + {272, 208, 195}, + {273, 209, 195}, + {288, 224, 195}, + {287, 223, 195}, + }}, + { .v = { + {0, 225, 196}, + {19, 226, 196}, + {64, 0, 196}, + {18, 227, 196}, + }}, + { .v = { + {19, 226, 197}, + {20, 228, 197}, + {65, 1, 197}, + {64, 0, 197}, + }}, + { .v = { + {20, 228, 198}, + {21, 229, 198}, + {66, 4, 198}, + {65, 1, 198}, + }}, + { .v = { + {21, 229, 199}, + {22, 230, 199}, + {67, 6, 199}, + {66, 4, 199}, + }}, + { .v = { + {22, 230, 200}, + {23, 231, 200}, + {68, 8, 200}, + {67, 6, 200}, + }}, + { .v = { + {23, 231, 201}, + {24, 232, 201}, + {69, 10, 201}, + {68, 8, 201}, + }}, + { .v = { + {24, 232, 202}, + {25, 233, 202}, + {70, 12, 202}, + {69, 10, 202}, + }}, + { .v = { + {25, 233, 203}, + {26, 234, 203}, + {71, 14, 203}, + {70, 12, 203}, + }}, + { .v = { + {26, 234, 204}, + {27, 235, 204}, + {72, 16, 204}, + {71, 14, 204}, + }}, + { .v = { + {27, 235, 205}, + {28, 236, 205}, + {73, 18, 205}, + {72, 16, 205}, + }}, + { .v = { + {28, 236, 206}, + {29, 237, 206}, + {74, 20, 206}, + {73, 18, 206}, + }}, + { .v = { + {29, 237, 207}, + {30, 238, 207}, + {75, 22, 207}, + {74, 20, 207}, + }}, + { .v = { + {30, 238, 208}, + {31, 239, 208}, + {76, 24, 208}, + {75, 22, 208}, + }}, + { .v = { + {31, 239, 209}, + {32, 240, 209}, + {77, 26, 209}, + {76, 24, 209}, + }}, + { .v = { + {32, 240, 210}, + {33, 241, 210}, + {78, 28, 210}, + {77, 26, 210}, + }}, + { .v = { + {33, 241, 211}, + {1, 242, 211}, + {34, 243, 211}, + {78, 28, 211}, + }}, + { .v = { + {78, 28, 212}, + {34, 243, 212}, + {35, 244, 212}, + {93, 29, 212}, + }}, + { .v = { + {93, 29, 213}, + {35, 244, 213}, + {36, 245, 213}, + {108, 44, 213}, + }}, + { .v = { + {108, 44, 214}, + {36, 245, 214}, + {37, 246, 214}, + {123, 59, 214}, + }}, + { .v = { + {123, 59, 215}, + {37, 246, 215}, + {38, 247, 215}, + {138, 74, 215}, + }}, + { .v = { + {138, 74, 216}, + {38, 247, 216}, + {39, 248, 216}, + {153, 89, 216}, + }}, + { .v = { + {153, 89, 217}, + {39, 248, 217}, + {40, 249, 217}, + {168, 104, 217}, + }}, + { .v = { + {168, 104, 218}, + {40, 249, 218}, + {41, 250, 218}, + {183, 119, 218}, + }}, + { .v = { + {183, 119, 219}, + {41, 250, 219}, + {42, 251, 219}, + {198, 134, 219}, + }}, + { .v = { + {198, 134, 220}, + {42, 251, 220}, + {43, 252, 220}, + {213, 149, 220}, + }}, + { .v = { + {213, 149, 221}, + {43, 252, 221}, + {44, 253, 221}, + {228, 164, 221}, + }}, + { .v = { + {228, 164, 222}, + {44, 253, 222}, + {45, 254, 222}, + {243, 179, 222}, + }}, + { .v = { + {243, 179, 223}, + {45, 254, 223}, + {46, 255, 223}, + {258, 194, 223}, + }}, + { .v = { + {258, 194, 224}, + {46, 255, 224}, + {47, 256, 224}, + {273, 209, 224}, + }}, + { .v = { + {273, 209, 225}, + {47, 256, 225}, + {48, 257, 225}, + {288, 224, 225}, + }}, + { .v = { + {288, 224, 226}, + {48, 257, 226}, + {3, 258, 226}, + {49, 259, 226}, + }}, + { .v = { + {287, 223, 227}, + {288, 224, 227}, + {49, 259, 227}, + {50, 260, 227}, + }}, + { .v = { + {286, 222, 228}, + {287, 223, 228}, + {50, 260, 228}, + {51, 261, 228}, + }}, + { .v = { + {285, 221, 229}, + {286, 222, 229}, + {51, 261, 229}, + {52, 262, 229}, + }}, + { .v = { + {284, 220, 230}, + {285, 221, 230}, + {52, 262, 230}, + {53, 263, 230}, + }}, + { .v = { + {283, 219, 231}, + {284, 220, 231}, + {53, 263, 231}, + {54, 264, 231}, + }}, + { .v = { + {282, 218, 232}, + {283, 219, 232}, + {54, 264, 232}, + {55, 265, 232}, + }}, + { .v = { + {281, 217, 233}, + {282, 218, 233}, + {55, 265, 233}, + {56, 266, 233}, + }}, + { .v = { + {280, 216, 234}, + {281, 217, 234}, + {56, 266, 234}, + {57, 267, 234}, + }}, + { .v = { + {279, 215, 235}, + {280, 216, 235}, + {57, 267, 235}, + {58, 268, 235}, + }}, + { .v = { + {278, 214, 236}, + {279, 215, 236}, + {58, 268, 236}, + {59, 269, 236}, + }}, + { .v = { + {277, 213, 237}, + {278, 214, 237}, + {59, 269, 237}, + {60, 270, 237}, + }}, + { .v = { + {276, 212, 238}, + {277, 213, 238}, + {60, 270, 238}, + {61, 271, 238}, + }}, + { .v = { + {275, 210, 239}, + {276, 212, 239}, + {61, 271, 239}, + {62, 272, 239}, + }}, + { .v = { + {274, 211, 240}, + {275, 210, 240}, + {62, 272, 240}, + {63, 273, 240}, + }}, + { .v = { + {4, 274, 241}, + {274, 211, 241}, + {63, 273, 241}, + {2, 275, 241}, + }}, + { .v = { + {5, 276, 242}, + {259, 196, 242}, + {274, 211, 242}, + {4, 274, 242}, + }}, + { .v = { + {6, 277, 243}, + {244, 181, 243}, + {259, 196, 243}, + {5, 276, 243}, + }}, + { .v = { + {7, 278, 244}, + {229, 166, 244}, + {244, 181, 244}, + {6, 277, 244}, + }}, + { .v = { + {8, 279, 245}, + {214, 151, 245}, + {229, 166, 245}, + {7, 278, 245}, + }}, + { .v = { + {9, 280, 246}, + {199, 136, 246}, + {214, 151, 246}, + {8, 279, 246}, + }}, + { .v = { + {10, 281, 247}, + {184, 121, 247}, + {199, 136, 247}, + {9, 280, 247}, + }}, + { .v = { + {11, 282, 248}, + {169, 106, 248}, + {184, 121, 248}, + {10, 281, 248}, + }}, + { .v = { + {12, 283, 249}, + {154, 91, 249}, + {169, 106, 249}, + {11, 282, 249}, + }}, + { .v = { + {13, 284, 250}, + {139, 76, 250}, + {154, 91, 250}, + {12, 283, 250}, + }}, + { .v = { + {14, 285, 251}, + {124, 61, 251}, + {139, 76, 251}, + {13, 284, 251}, + }}, + { .v = { + {15, 286, 252}, + {109, 46, 252}, + {124, 61, 252}, + {14, 285, 252}, + }}, + { .v = { + {16, 287, 253}, + {94, 31, 253}, + {109, 46, 253}, + {15, 286, 253}, + }}, + { .v = { + {17, 288, 254}, + {79, 3, 254}, + {94, 31, 254}, + {16, 287, 254}, + }}, + { .v = { + {18, 227, 255}, + {64, 0, 255}, + {79, 3, 255}, + {17, 288, 255}, + }}, +}; + +const struct object plane_Plane = { + .triangle = NULL, + .quadrilateral = &plane_Plane_quadrilateral[0], + .triangle_count = 0, + .quadrilateral_count = 256, + .material = -1, +}; + +const struct object * plane_object_list[] = { + &plane_Plane, +}; + +const struct model plane_model = { + .position = &plane_position[0], + .texture = &plane_texture[0], + .normal = &plane_normal[0], + .object = &plane_object_list[0], + .object_count = 1, +}; + diff --git a/model/plane/plane.blend b/model/plane/plane.blend new file mode 100644 index 0000000..87c0aec Binary files /dev/null and b/model/plane/plane.blend differ diff --git a/model/plane/plane.mtl b/model/plane/plane.mtl new file mode 100644 index 0000000..6371c06 --- /dev/null +++ b/model/plane/plane.mtl @@ -0,0 +1,2 @@ +# Blender 4.3.2 MTL File: 'plane.blend' +# www.blender.org diff --git a/model/plane/plane.obj b/model/plane/plane.obj new file mode 100644 index 0000000..f8e69d0 --- /dev/null +++ b/model/plane/plane.obj @@ -0,0 +1,1095 @@ +# Blender 4.3.2 +# www.blender.org +mtllib plane.mtl +o Plane +v -1.000000 1.000000 0.500000 +v -1.000000 -1.000000 0.500000 +v 1.000000 1.000000 0.500000 +v 1.000000 -1.000000 0.500000 +v 0.875000 1.000000 0.572594 +v 0.750000 1.000000 0.562882 +v 0.625000 1.000000 0.573245 +v 0.500000 1.000000 0.570143 +v 0.375000 1.000000 0.533738 +v 0.250000 1.000000 0.521783 +v 0.125000 1.000000 0.483391 +v 0.000000 1.000000 0.500000 +v -0.125000 1.000000 0.527500 +v -0.250000 1.000000 0.513289 +v -0.375000 1.000000 0.462632 +v -0.500000 1.000000 0.429857 +v -0.625000 1.000000 0.430386 +v -0.750000 1.000000 0.402047 +v -0.875000 1.000000 0.416515 +v -1.000000 0.875000 0.467632 +v -1.000000 0.750000 0.443146 +v -1.000000 0.625000 0.455371 +v -1.000000 0.500000 0.429857 +v -1.000000 0.375000 0.448538 +v -1.000000 0.250000 0.507261 +v -1.000000 0.125000 0.525360 +v -1.000000 0.000000 0.500000 +v -1.000000 -0.125000 0.489473 +v -1.000000 -0.250000 0.549593 +v -1.000000 -0.375000 0.631163 +v -1.000000 -0.500000 0.640286 +v -1.000000 -0.625000 0.600338 +v -1.000000 -0.750000 0.619736 +v -1.000000 -0.875000 0.569890 +v -0.875000 -1.000000 0.493045 +v -0.750000 -1.000000 0.478217 +v -0.625000 -1.000000 0.489826 +v -0.500000 -1.000000 0.429857 +v -0.375000 -1.000000 0.368120 +v -0.250000 -1.000000 0.437118 +v -0.125000 -1.000000 0.503577 +v 0.000000 -1.000000 0.500000 +v 0.125000 -1.000000 0.496117 +v 0.250000 -1.000000 0.514522 +v 0.375000 -1.000000 0.582186 +v 0.500000 -1.000000 0.640286 +v 0.625000 -1.000000 0.645068 +v 0.750000 -1.000000 0.584665 +v 0.875000 -1.000000 0.500364 +v 1.000000 -0.875000 0.511765 +v 1.000000 -0.750000 0.529044 +v 1.000000 -0.625000 0.531869 +v 1.000000 -0.500000 0.500000 +v 1.000000 -0.375000 0.468131 +v 1.000000 -0.250000 0.470956 +v 1.000000 -0.125000 0.488235 +v 1.000000 0.000000 0.500000 +v 1.000000 0.125000 0.514468 +v 1.000000 0.250000 0.472189 +v 1.000000 0.375000 0.434633 +v 1.000000 0.500000 0.429857 +v 1.000000 0.625000 0.405778 +v 1.000000 0.750000 0.443146 +v 1.000000 0.875000 0.499690 +v -0.875000 0.875000 0.416640 +v -0.875000 0.750000 0.391670 +v -0.875000 0.625000 0.371579 +v -0.875000 0.500000 0.361486 +v -0.875000 0.375000 0.393825 +v -0.875000 0.250000 0.451033 +v -0.875000 0.125000 0.475818 +v -0.875000 -0.000000 0.458541 +v -0.875000 -0.125000 0.460910 +v -0.875000 -0.250000 0.525519 +v -0.875000 -0.375000 0.584600 +v -0.875000 -0.500000 0.581568 +v -0.875000 -0.625000 0.593727 +v -0.875000 -0.750000 0.607657 +v -0.875000 -0.875000 0.541674 +v -0.750000 0.875000 0.433877 +v -0.750000 0.750000 0.408819 +v -0.750000 0.625000 0.376302 +v -0.750000 0.500000 0.392388 +v -0.750000 0.375000 0.401627 +v -0.750000 0.250000 0.402528 +v -0.750000 0.125000 0.419563 +v -0.750000 0.000000 0.423829 +v -0.750000 -0.125000 0.438850 +v -0.750000 -0.250000 0.499474 +v -0.750000 -0.375000 0.569034 +v -0.750000 -0.500000 0.587062 +v -0.750000 -0.625000 0.615338 +v -0.750000 -0.750000 0.580680 +v -0.750000 -0.875000 0.494899 +v -0.625000 0.875000 0.441811 +v -0.625000 0.750000 0.427823 +v -0.625000 0.625000 0.438068 +v -0.625000 0.500000 0.471957 +v -0.625000 0.375000 0.435283 +v -0.625000 0.250000 0.380262 +v -0.625000 0.125000 0.406204 +v -0.625000 0.000000 0.440560 +v -0.625000 -0.125000 0.470032 +v -0.625000 -0.250000 0.516197 +v -0.625000 -0.375000 0.556547 +v -0.625000 -0.500000 0.564795 +v -0.625000 -0.625000 0.567675 +v -0.625000 -0.750000 0.518446 +v -0.625000 -0.875000 0.468933 +v -0.500000 0.875000 0.460172 +v -0.500000 0.750000 0.492739 +v -0.500000 0.625000 0.474052 +v -0.500000 0.500000 0.464929 +v -0.500000 0.375000 0.455805 +v -0.500000 0.250000 0.437118 +v -0.500000 0.125000 0.469685 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.125000 0.519142 +v -0.500000 -0.250000 0.524180 +v -0.500000 -0.375000 0.515811 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.625000 0.504732 +v -0.500000 -0.750000 0.483081 +v -0.500000 -0.875000 0.426309 +v -0.375000 0.875000 0.500564 +v -0.375000 0.750000 0.511306 +v -0.375000 0.625000 0.493172 +v -0.375000 0.500000 0.461537 +v -0.375000 0.375000 0.453495 +v -0.375000 0.250000 0.487146 +v -0.375000 0.125000 0.523389 +v -0.375000 0.000000 0.535260 +v -0.375000 -0.125000 0.580528 +v -0.375000 -0.250000 0.547700 +v -0.375000 -0.375000 0.463010 +v -0.375000 -0.500000 0.449734 +v -0.375000 -0.625000 0.467629 +v -0.375000 -0.750000 0.456405 +v -0.375000 -0.875000 0.382664 +v -0.250000 0.875000 0.544210 +v -0.250000 0.750000 0.521309 +v -0.250000 0.625000 0.524437 +v -0.250000 0.500000 0.495137 +v -0.250000 0.375000 0.473300 +v -0.250000 0.250000 0.530073 +v -0.250000 0.125000 0.587212 +v -0.250000 0.000000 0.611242 +v -0.250000 -0.125000 0.637214 +v -0.250000 -0.250000 0.537108 +v -0.250000 -0.375000 0.402307 +v -0.250000 -0.500000 0.405677 +v -0.250000 -0.625000 0.427795 +v -0.250000 -0.750000 0.417809 +v -0.250000 -0.875000 0.401556 +v -0.125000 0.875000 0.539032 +v -0.125000 0.750000 0.527898 +v -0.125000 0.625000 0.535597 +v -0.125000 0.500000 0.521336 +v -0.125000 0.375000 0.498451 +v -0.125000 0.250000 0.526253 +v -0.125000 0.125000 0.562764 +v -0.125000 0.000000 0.572900 +v -0.125000 -0.125000 0.583635 +v -0.125000 -0.250000 0.501942 +v -0.125000 -0.375000 0.397401 +v -0.125000 -0.500000 0.402838 +v -0.125000 -0.625000 0.407866 +v -0.125000 -0.750000 0.416544 +v -0.125000 -0.875000 0.443849 +v 0.000000 0.875000 0.506081 +v -0.000000 0.750000 0.527811 +v 0.000000 0.625000 0.562353 +v -0.000000 0.500000 0.570143 +v -0.000000 0.375000 0.533738 +v 0.000000 0.250000 0.521783 +v -0.000000 0.125000 0.518463 +v -0.000000 -0.000000 0.500000 +v -0.000000 -0.125000 0.516609 +v -0.000000 -0.250000 0.478217 +v 0.000000 -0.375000 0.413655 +v -0.000000 -0.500000 0.429857 +v -0.000000 -0.625000 0.437647 +v -0.000000 -0.750000 0.472189 +v -0.000000 -0.875000 0.476383 +v 0.125000 0.875000 0.504452 +v 0.125000 0.750000 0.529635 +v 0.125000 0.625000 0.561284 +v 0.125000 0.500000 0.588722 +v 0.125000 0.375000 0.574986 +v 0.125000 0.250000 0.523249 +v 0.125000 0.125000 0.460527 +v 0.125000 0.000000 0.430110 +v 0.125000 -0.125000 0.427717 +v 0.125000 -0.250000 0.408221 +v 0.125000 -0.375000 0.418387 +v 0.125000 -0.500000 0.448519 +v 0.125000 -0.625000 0.477629 +v 0.125000 -0.750000 0.499398 +v 0.125000 -0.875000 0.466943 +v 0.250000 0.875000 0.555431 +v 0.250000 0.750000 0.547346 +v 0.250000 0.625000 0.512325 +v 0.250000 0.500000 0.524180 +v 0.250000 0.375000 0.525347 +v 0.250000 0.250000 0.456909 +v 0.250000 0.125000 0.396455 +v 0.250000 -0.000000 0.380264 +v 0.250000 -0.125000 0.357817 +v 0.250000 -0.250000 0.364983 +v 0.250000 -0.375000 0.421570 +v 0.250000 -0.500000 0.437118 +v 0.250000 -0.625000 0.490981 +v 0.250000 -0.750000 0.506509 +v 0.250000 -0.875000 0.460784 +v 0.375000 0.875000 0.611771 +v 0.375000 0.750000 0.601397 +v 0.375000 0.625000 0.504728 +v 0.375000 0.500000 0.490392 +v 0.375000 0.375000 0.466318 +v 0.375000 0.250000 0.403939 +v 0.375000 0.125000 0.395547 +v 0.375000 0.000000 0.399662 +v 0.375000 -0.125000 0.365752 +v 0.375000 -0.250000 0.363528 +v 0.375000 -0.375000 0.410612 +v 0.375000 -0.500000 0.431625 +v 0.375000 -0.625000 0.493760 +v 0.375000 -0.750000 0.538221 +v 0.375000 -0.875000 0.542502 +v 0.500000 0.875000 0.620134 +v 0.500000 0.750000 0.568910 +v 0.500000 0.625000 0.470610 +v 0.500000 0.500000 0.464929 +v 0.500000 0.375000 0.463494 +v 0.500000 0.250000 0.431090 +v 0.500000 0.125000 0.390141 +v 0.500000 0.000000 0.359714 +v 0.500000 -0.125000 0.335199 +v 0.500000 -0.250000 0.328273 +v 0.500000 -0.375000 0.402003 +v 0.500000 -0.500000 0.464929 +v 0.500000 -0.625000 0.524847 +v 0.500000 -0.750000 0.594323 +v 0.500000 -0.875000 0.631671 +v 0.625000 0.875000 0.587317 +v 0.625000 0.750000 0.535827 +v 0.625000 0.625000 0.468686 +v 0.625000 0.500000 0.464885 +v 0.625000 0.375000 0.462655 +v 0.625000 0.250000 0.428025 +v 0.625000 0.125000 0.370810 +v 0.625000 0.000000 0.329519 +v 0.625000 -0.125000 0.312255 +v 0.625000 -0.250000 0.344021 +v 0.625000 -0.375000 0.424111 +v 0.625000 -0.500000 0.469805 +v 0.625000 -0.625000 0.539633 +v 0.625000 -0.750000 0.630247 +v 0.625000 -0.875000 0.655381 +v 0.750000 0.875000 0.555107 +v 0.750000 0.750000 0.517054 +v 0.750000 0.625000 0.453650 +v 0.750000 0.500000 0.433488 +v 0.750000 0.375000 0.433089 +v 0.750000 0.250000 0.411562 +v 0.750000 0.125000 0.392621 +v 0.750000 0.000000 0.380264 +v 0.750000 -0.125000 0.332574 +v 0.750000 -0.250000 0.362239 +v 0.750000 -0.375000 0.439709 +v 0.750000 -0.500000 0.457668 +v 0.750000 -0.625000 0.492979 +v 0.750000 -0.750000 0.558854 +v 0.750000 -0.875000 0.591488 +v 0.875000 0.875000 0.537785 +v 0.875000 0.750000 0.457556 +v 0.875000 0.625000 0.396143 +v 0.875000 0.500000 0.392053 +v 0.875000 0.375000 0.408606 +v 0.875000 0.250000 0.437822 +v 0.875000 0.125000 0.466157 +v 0.875000 0.000000 0.465181 +v 0.875000 -0.125000 0.419025 +v 0.875000 -0.250000 0.408017 +v 0.875000 -0.375000 0.444483 +v 0.875000 -0.500000 0.467433 +v 0.875000 -0.625000 0.499404 +v 0.875000 -0.750000 0.529557 +v 0.875000 -0.875000 0.523985 +vn -0.1337 -0.1945 0.9718 +vn -0.0853 -0.2052 0.9750 +vn -0.1410 0.0237 0.9897 +vn -0.1510 0.1622 0.9751 +vn 0.1566 0.2236 0.9620 +vn 0.3820 0.1525 0.9115 +vn 0.3415 -0.0488 0.9386 +vn 0.2209 0.0677 0.9729 +vn 0.1696 0.4414 0.8811 +vn 0.1464 0.4526 0.8796 +vn 0.0402 0.0598 0.9974 +vn -0.1064 0.1588 0.9816 +vn 0.0214 -0.0826 0.9964 +vn 0.2445 -0.5032 0.8289 +vn -0.1059 -0.1534 0.9825 +vn -0.3063 -0.0845 0.9482 +vn -0.4849 0.1714 0.8576 +vn -0.4105 -0.0995 0.9064 +vn -0.0445 -0.2114 0.9764 +vn 0.1391 0.1678 0.9760 +vn -0.0133 0.1527 0.9882 +vn -0.1854 0.1722 0.9675 +vn -0.1735 0.3869 0.9057 +vn -0.0155 0.4024 0.9153 +vn 0.1370 0.1035 0.9852 +vn 0.2675 0.1192 0.9562 +vn 0.3847 -0.2936 0.8751 +vn 0.2963 -0.4546 0.8400 +vn -0.3153 0.0703 0.9464 +vn -0.3741 -0.0313 0.9269 +vn -0.1145 0.0979 0.9886 +vn -0.0530 -0.1799 0.9822 +vn -0.2846 -0.2711 0.9195 +vn -0.4244 0.2063 0.8817 +vn -0.4298 0.2261 0.8741 +vn -0.3921 0.1756 0.9030 +vn -0.2183 0.1958 0.9560 +vn 0.1289 0.1258 0.9836 +vn 0.3887 -0.0279 0.9209 +vn 0.4548 0.0271 0.8902 +vn 0.3538 -0.2551 0.8998 +vn 0.2759 -0.3761 0.8846 +vn -0.2263 0.1663 0.9598 +vn -0.1475 -0.1441 0.9785 +vn -0.0620 -0.1606 0.9851 +vn 0.0227 -0.0685 0.9974 +vn -0.1872 0.0587 0.9806 +vn -0.3714 0.2464 0.8952 +vn -0.3311 0.1570 0.9304 +vn -0.3506 0.2337 0.9069 +vn -0.3198 -0.1047 0.9417 +vn 0.1091 -0.3468 0.9316 +vn 0.3790 -0.1070 0.9192 +vn 0.3287 0.0851 0.9406 +vn 0.2452 -0.1264 0.9612 +vn 0.2419 -0.4490 0.8601 +vn -0.2096 -0.0475 0.9766 +vn -0.1626 -0.0591 0.9849 +vn -0.2444 -0.2296 0.9421 +vn -0.2075 -0.1161 0.9713 +vn -0.2297 0.3310 0.9152 +vn -0.3714 0.3249 0.8698 +vn -0.4843 0.1244 0.8660 +vn -0.4546 0.2441 0.8566 +vn -0.1607 -0.4634 0.8715 +vn 0.2095 -0.6451 0.7348 +vn 0.3862 -0.0365 0.9217 +vn 0.3145 0.1500 0.9373 +vn 0.2984 -0.0807 0.9510 +vn 0.0740 -0.3378 0.9383 +vn -0.0056 -0.1349 0.9908 +vn -0.0708 0.0432 0.9966 +vn -0.1457 -0.1698 0.9747 +vn -0.1982 -0.1726 0.9648 +vn -0.0806 0.3194 0.9442 +vn 0.1053 0.3488 0.9312 +vn 0.2415 0.1314 0.9615 +vn 0.3419 0.1365 0.9298 +vn 0.2759 -0.5653 0.7774 +vn 0.1150 -0.6870 0.7175 +vn 0.0309 0.0352 0.9989 +vn 0.0902 0.1075 0.9901 +vn 0.0845 -0.0052 0.9964 +vn -0.1618 0.0436 0.9859 +vn 0.1309 0.0420 0.9905 +vn -0.1046 0.1657 0.9806 +vn -0.2892 -0.0248 0.9569 +vn -0.3111 -0.2193 0.9247 +vn -0.1221 0.0628 0.9905 +vn 0.1899 0.1292 0.9733 +vn 0.4243 -0.0301 0.9050 +vn 0.4862 0.0950 0.8687 +vn 0.3110 -0.4115 0.8567 +vn 0.0247 -0.5601 0.8281 +vn -0.1699 0.0850 0.9818 +vn -0.2213 0.0499 0.9739 +vn -0.3191 0.1614 0.9339 +vn -0.3303 0.1180 0.9365 +vn -0.0008 0.1844 0.9828 +vn -0.0029 0.2559 0.9667 +vn -0.0692 0.1392 0.9878 +vn -0.2284 -0.1915 0.9545 +vn -0.1633 -0.2436 0.9560 +vn 0.2134 -0.2495 0.9446 +vn 0.4485 -0.1715 0.8772 +vn 0.5355 0.0479 0.8432 +vn 0.5264 -0.1918 0.8283 +vn 0.2472 -0.2060 0.9468 +vn -0.0916 0.1815 0.9791 +vn -0.2261 0.1422 0.9637 +vn -0.2536 0.2126 0.9437 +vn -0.0704 -0.1121 0.9912 +vn -0.2644 0.0658 0.9622 +vn 0.1240 -0.0134 0.9922 +vn 0.4092 0.1417 0.9014 +vn 0.4150 -0.0457 0.9087 +vn 0.3858 -0.3997 0.8315 +vn 0.4238 -0.4003 0.8125 +vn 0.4088 -0.1673 0.8972 +vn 0.4303 -0.0893 0.8983 +vn 0.4119 -0.0449 0.9101 +vn 0.1530 0.2549 0.9548 +vn 0.0323 0.1796 0.9832 +vn -0.0074 0.3150 0.9491 +vn -0.0807 0.1471 0.9858 +vn -0.0036 -0.2985 0.9544 +vn -0.4030 -0.0674 0.9127 +vn -0.1622 -0.4599 0.8730 +vn 0.1633 -0.0098 0.9865 +vn 0.3468 -0.0856 0.9340 +vn 0.3689 -0.4309 0.8235 +vn 0.2034 -0.2599 0.9440 +vn -0.0737 -0.0481 0.9961 +vn -0.1061 -0.2187 0.9700 +vn -0.0259 0.0198 0.9995 +vn 0.0458 0.3827 0.9228 +vn 0.0650 0.1444 0.9874 +vn 0.0098 0.4209 0.9071 +vn -0.1330 0.2313 0.9638 +vn -0.4086 -0.1493 0.9004 +vn 0.0933 -0.2382 0.9667 +vn 0.2056 -0.6018 0.7717 +vn 0.2311 -0.0777 0.9698 +vn 0.1119 -0.1009 0.9886 +vn -0.0906 -0.3531 0.9312 +vn -0.0850 -0.1929 0.9775 +vn 0.1776 -0.1030 0.9787 +vn 0.2648 -0.2194 0.9390 +vn 0.2544 -0.0354 0.9665 +vn 0.1560 0.4298 0.8893 +vn -0.0932 0.3169 0.9439 +vn -0.2255 0.4274 0.8755 +vn -0.3025 0.3953 0.8673 +vn -0.4973 0.1425 0.8558 +vn 0.2369 -0.3692 0.8986 +vn 0.1160 -0.5481 0.8283 +vn 0.0079 -0.0379 0.9993 +vn 0.0035 -0.0147 0.9999 +vn 0.0151 -0.2590 0.9658 +vn 0.0831 -0.3642 0.9276 +vn 0.1871 -0.2709 0.9443 +vn 0.2052 -0.1613 0.9653 +vn 0.0286 0.0988 0.9947 +vn -0.1279 0.5197 0.8447 +vn -0.0985 0.3966 0.9127 +vn -0.0696 0.4595 0.8854 +vn -0.1684 0.5316 0.8301 +vn -0.2255 0.2362 0.9452 +vn 0.1885 -0.3311 0.9246 +vn 0.1190 -0.4596 0.8801 +vn 0.1818 -0.0938 0.9788 +vn 0.2369 -0.0102 0.9715 +vn 0.1768 -0.2157 0.9603 +vn -0.0205 -0.2913 0.9564 +vn -0.2730 -0.2018 0.9406 +vn -0.2653 -0.2425 0.9332 +vn -0.1480 0.2360 0.9604 +vn -0.1137 0.5297 0.8405 +vn -0.0134 0.2467 0.9690 +vn 0.2119 0.3789 0.9009 +vn 0.3716 0.4926 0.7869 +vn 0.4664 0.1992 0.8619 +vn 0.2676 -0.4121 0.8710 +vn 0.3862 -0.4120 0.8253 +vn 0.3665 -0.0898 0.9261 +vn 0.2545 0.0624 0.9651 +vn -0.0071 0.0307 0.9995 +vn -0.3705 0.0349 0.9282 +vn -0.5348 -0.0450 0.8438 +vn -0.5401 -0.2958 0.7879 +vn -0.4665 0.0658 0.8821 +vn -0.1810 0.4079 0.8949 +vn -0.0573 0.1612 0.9853 +vn -0.0624 0.2594 0.9638 +vn 0.0851 0.3573 0.9301 +vn 0.3593 0.1004 0.9278 +vn 0.4707 -0.1129 0.8750 +vn 0.3731 -0.1801 0.9102 +vn 0.4757 -0.0277 0.8792 +vn 0.5161 -0.1208 0.8480 +vn 0.4345 0.1801 0.8825 +vn 0.3735 0.3903 0.8416 +vn 0.3849 0.1560 0.9097 +vn 0.3377 -0.1582 0.9278 +vn 0.2696 -0.0314 0.9625 +vn 0.1851 0.4387 0.8793 +vn 0.2391 0.4761 0.8463 +vn 0.3880 0.0225 0.9214 +vn 0.2514 -0.1069 0.9620 +vn 0.0739 0.1318 0.9885 +vn 0.1447 -0.4160 0.8978 +vn 0.1261 -0.4250 0.8964 +vn 0.2319 -0.2459 0.9412 +vn 0.0573 0.0168 0.9982 +vn 0.3781 0.0901 0.9214 +vn 0.3881 -0.0405 0.9207 +vn -0.3306 0.0791 0.9404 +vn -0.3766 0.3299 0.8656 +vn -0.1092 0.3144 0.9430 +vn 0.0521 0.2063 0.9771 +vn -0.0464 0.3144 0.9481 +vn -0.4884 0.3055 0.8174 +vn -0.5007 0.1642 0.8499 +vn -0.1132 -0.0067 0.9935 +vn 0.4444 -0.0613 0.8938 +vn 0.5162 -0.1035 0.8502 +vn 0.0498 -0.1400 0.9889 +vn 0.0507 -0.0909 0.9946 +vn -0.1260 0.1078 0.9862 +vn -0.2444 0.2399 0.9395 +vn -0.2145 0.2092 0.9541 +vn -0.3247 0.1261 0.9374 +vn -0.4650 -0.0995 0.8797 +vn -0.3757 -0.2092 0.9028 +vn -0.3150 -0.0585 0.9473 +vn -0.3033 0.2590 0.9170 +vn -0.2273 0.2513 0.9408 +vn -0.2465 0.0824 0.9656 +vn -0.1859 0.0783 0.9795 +vn 0.0178 -0.3674 0.9299 +vn 0.1812 -0.4720 0.8628 +vn 0.4016 -0.1274 0.9069 +vn 0.0300 -0.1678 0.9854 +vn 0.1678 0.0248 0.9855 +vn 0.1144 0.2466 0.9623 +vn -0.1574 0.4501 0.8790 +vn -0.2420 0.3958 0.8859 +vn -0.3297 0.2018 0.9223 +vn 0.0723 0.1077 0.9916 +vn 0.2345 0.0683 0.9697 +vn -0.0356 0.1673 0.9853 +vn -0.3418 0.2495 0.9060 +vn -0.2717 0.2534 0.9284 +vn -0.0702 0.1643 0.9839 +vn -0.1415 0.1688 0.9754 +vn -0.0110 0.1268 0.9919 +vt 0.062500 0.062500 +vt 0.125000 0.062500 +vt 0.125000 0.125000 +vt 0.062500 0.125000 +vt 0.187500 0.062500 +vt 0.187500 0.125000 +vt 0.250000 0.062500 +vt 0.250000 0.125000 +vt 0.312500 0.062500 +vt 0.312500 0.125000 +vt 0.375000 0.062500 +vt 0.375000 0.125000 +vt 0.437500 0.062500 +vt 0.437500 0.125000 +vt 0.500000 0.062500 +vt 0.500000 0.125000 +vt 0.562500 0.062500 +vt 0.562500 0.125000 +vt 0.625000 0.062500 +vt 0.625000 0.125000 +vt 0.687500 0.062500 +vt 0.687500 0.125000 +vt 0.750000 0.062500 +vt 0.750000 0.125000 +vt 0.812500 0.062500 +vt 0.812500 0.125000 +vt 0.875000 0.062500 +vt 0.875000 0.125000 +vt 0.937500 0.062500 +vt 0.937500 0.125000 +vt 0.125000 0.187500 +vt 0.062500 0.187500 +vt 0.187500 0.187500 +vt 0.250000 0.187500 +vt 0.312500 0.187500 +vt 0.375000 0.187500 +vt 0.437500 0.187500 +vt 0.500000 0.187500 +vt 0.562500 0.187500 +vt 0.625000 0.187500 +vt 0.687500 0.187500 +vt 0.750000 0.187500 +vt 0.812500 0.187500 +vt 0.875000 0.187500 +vt 0.937500 0.187500 +vt 0.125000 0.250000 +vt 0.062500 0.250000 +vt 0.187500 0.250000 +vt 0.250000 0.250000 +vt 0.312500 0.250000 +vt 0.375000 0.250000 +vt 0.437500 0.250000 +vt 0.500000 0.250000 +vt 0.562500 0.250000 +vt 0.625000 0.250000 +vt 0.687500 0.250000 +vt 0.750000 0.250000 +vt 0.812500 0.250000 +vt 0.875000 0.250000 +vt 0.937500 0.250000 +vt 0.125000 0.312500 +vt 0.062500 0.312500 +vt 0.187500 0.312500 +vt 0.250000 0.312500 +vt 0.312500 0.312500 +vt 0.375000 0.312500 +vt 0.437500 0.312500 +vt 0.500000 0.312500 +vt 0.562500 0.312500 +vt 0.625000 0.312500 +vt 0.687500 0.312500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.875000 0.312500 +vt 0.937500 0.312500 +vt 0.125000 0.375000 +vt 0.062500 0.375000 +vt 0.187500 0.375000 +vt 0.250000 0.375000 +vt 0.312500 0.375000 +vt 0.375000 0.375000 +vt 0.437500 0.375000 +vt 0.500000 0.375000 +vt 0.562500 0.375000 +vt 0.625000 0.375000 +vt 0.687500 0.375000 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.875000 0.375000 +vt 0.937500 0.375000 +vt 0.125000 0.437500 +vt 0.062500 0.437500 +vt 0.187500 0.437500 +vt 0.250000 0.437500 +vt 0.312500 0.437500 +vt 0.375000 0.437500 +vt 0.437500 0.437500 +vt 0.500000 0.437500 +vt 0.562500 0.437500 +vt 0.625000 0.437500 +vt 0.687500 0.437500 +vt 0.750000 0.437500 +vt 0.812500 0.437500 +vt 0.875000 0.437500 +vt 0.937500 0.437500 +vt 0.125000 0.500000 +vt 0.062500 0.500000 +vt 0.187500 0.500000 +vt 0.250000 0.500000 +vt 0.312500 0.500000 +vt 0.375000 0.500000 +vt 0.437500 0.500000 +vt 0.500000 0.500000 +vt 0.562500 0.500000 +vt 0.625000 0.500000 +vt 0.687500 0.500000 +vt 0.750000 0.500000 +vt 0.812500 0.500000 +vt 0.875000 0.500000 +vt 0.937500 0.500000 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.187500 0.562500 +vt 0.250000 0.562500 +vt 0.312500 0.562500 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.562500 0.562500 +vt 0.625000 0.562500 +vt 0.687500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.875000 0.562500 +vt 0.937500 0.562500 +vt 0.125000 0.625000 +vt 0.062500 0.625000 +vt 0.187500 0.625000 +vt 0.250000 0.625000 +vt 0.312500 0.625000 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.500000 0.625000 +vt 0.562500 0.625000 +vt 0.625000 0.625000 +vt 0.687500 0.625000 +vt 0.750000 0.625000 +vt 0.812500 0.625000 +vt 0.875000 0.625000 +vt 0.937500 0.625000 +vt 0.125000 0.687500 +vt 0.062500 0.687500 +vt 0.187500 0.687500 +vt 0.250000 0.687500 +vt 0.312500 0.687500 +vt 0.375000 0.687500 +vt 0.437500 0.687500 +vt 0.500000 0.687500 +vt 0.562500 0.687500 +vt 0.625000 0.687500 +vt 0.687500 0.687500 +vt 0.750000 0.687500 +vt 0.812500 0.687500 +vt 0.875000 0.687500 +vt 0.937500 0.687500 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.187500 0.750000 +vt 0.250000 0.750000 +vt 0.312500 0.750000 +vt 0.375000 0.750000 +vt 0.437500 0.750000 +vt 0.500000 0.750000 +vt 0.562500 0.750000 +vt 0.625000 0.750000 +vt 0.687500 0.750000 +vt 0.750000 0.750000 +vt 0.812500 0.750000 +vt 0.875000 0.750000 +vt 0.937500 0.750000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.187500 0.812500 +vt 0.250000 0.812500 +vt 0.312500 0.812500 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.500000 0.812500 +vt 0.562500 0.812500 +vt 0.625000 0.812500 +vt 0.687500 0.812500 +vt 0.750000 0.812500 +vt 0.812500 0.812500 +vt 0.875000 0.812500 +vt 0.937500 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.312500 0.875000 +vt 0.375000 0.875000 +vt 0.437500 0.875000 +vt 0.500000 0.875000 +vt 0.562500 0.875000 +vt 0.625000 0.875000 +vt 0.687500 0.875000 +vt 0.750000 0.875000 +vt 0.812500 0.875000 +vt 0.875000 0.875000 +vt 0.937500 0.875000 +vt 0.125000 0.937500 +vt 0.062500 0.937500 +vt 0.187500 0.937500 +vt 0.250000 0.937500 +vt 0.312500 0.937500 +vt 0.375000 0.937500 +vt 0.437500 0.937500 +vt 0.500000 0.937500 +vt 0.562500 0.937500 +vt 0.625000 0.937500 +vt 0.687500 0.937500 +vt 0.750000 0.937500 +vt 0.812500 0.937500 +vt 0.875000 0.937500 +vt 0.937500 0.937500 +vt 0.000000 0.000000 +vt 0.062500 0.000000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.187500 0.000000 +vt 0.250000 0.000000 +vt 0.312500 0.000000 +vt 0.375000 0.000000 +vt 0.437500 0.000000 +vt 0.500000 0.000000 +vt 0.562500 0.000000 +vt 0.625000 0.000000 +vt 0.687500 0.000000 +vt 0.750000 0.000000 +vt 0.812500 0.000000 +vt 0.875000 0.000000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.062500 +vt 1.000000 0.125000 +vt 1.000000 0.187500 +vt 1.000000 0.250000 +vt 1.000000 0.312500 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 1.000000 0.500000 +vt 1.000000 0.562500 +vt 1.000000 0.625000 +vt 1.000000 0.687500 +vt 1.000000 0.750000 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt 0.937500 1.000000 +vt 0.875000 1.000000 +vt 0.812500 1.000000 +vt 0.750000 1.000000 +vt 0.687500 1.000000 +vt 0.625000 1.000000 +vt 0.562500 1.000000 +vt 0.500000 1.000000 +vt 0.437500 1.000000 +vt 0.375000 1.000000 +vt 0.312500 1.000000 +vt 0.250000 1.000000 +vt 0.187500 1.000000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.000000 0.937500 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.000000 0.750000 +vt 0.000000 0.687500 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.000000 0.500000 +vt 0.000000 0.437500 +vt 0.000000 0.375000 +vt 0.000000 0.312500 +vt 0.000000 0.250000 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +s 0 +f 65/1/1 66/2/1 81/3/1 80/4/1 +f 66/2/2 67/5/2 82/6/2 81/3/2 +f 67/5/3 68/7/3 83/8/3 82/6/3 +f 68/7/4 69/9/4 84/10/4 83/8/4 +f 69/9/5 70/11/5 85/12/5 84/10/5 +f 70/11/6 71/13/6 86/14/6 85/12/6 +f 71/13/7 72/15/7 87/16/7 86/14/7 +f 72/15/8 73/17/8 88/18/8 87/16/8 +f 73/17/9 74/19/9 89/20/9 88/18/9 +f 74/19/10 75/21/10 90/22/10 89/20/10 +f 75/21/11 76/23/11 91/24/11 90/22/11 +f 76/23/12 77/25/12 92/26/12 91/24/12 +f 77/25/13 78/27/13 93/28/13 92/26/13 +f 78/27/14 79/29/14 94/30/14 93/28/14 +f 80/4/15 81/3/15 96/31/15 95/32/15 +f 81/3/16 82/6/16 97/33/16 96/31/16 +f 82/6/17 83/8/17 98/34/17 97/33/17 +f 83/8/18 84/10/18 99/35/18 98/34/18 +f 84/10/19 85/12/19 100/36/19 99/35/19 +f 85/12/20 86/14/20 101/37/20 100/36/20 +f 86/14/21 87/16/21 102/38/21 101/37/21 +f 87/16/22 88/18/22 103/39/22 102/38/22 +f 88/18/23 89/20/23 104/40/23 103/39/23 +f 89/20/24 90/22/24 105/41/24 104/40/24 +f 90/22/25 91/24/25 106/42/25 105/41/25 +f 91/24/26 92/26/26 107/43/26 106/42/26 +f 92/26/27 93/28/27 108/44/27 107/43/27 +f 93/28/28 94/30/28 109/45/28 108/44/28 +f 95/32/29 96/31/29 111/46/29 110/47/29 +f 96/31/30 97/33/30 112/48/30 111/46/30 +f 97/33/31 98/34/31 113/49/31 112/48/31 +f 98/34/32 99/35/32 114/50/32 113/49/32 +f 99/35/33 100/36/33 115/51/33 114/50/33 +f 100/36/34 101/37/34 116/52/34 115/51/34 +f 101/37/35 102/38/35 117/53/35 116/52/35 +f 102/38/36 103/39/36 118/54/36 117/53/36 +f 103/39/37 104/40/37 119/55/37 118/54/37 +f 104/40/38 105/41/38 120/56/38 119/55/38 +f 105/41/39 106/42/39 121/57/39 120/56/39 +f 106/42/40 107/43/40 122/58/40 121/57/40 +f 107/43/41 108/44/41 123/59/41 122/58/41 +f 108/44/42 109/45/42 124/60/42 123/59/42 +f 110/47/43 111/46/43 126/61/43 125/62/43 +f 111/46/44 112/48/44 127/63/44 126/61/44 +f 112/48/45 113/49/45 128/64/45 127/63/45 +f 113/49/46 114/50/46 129/65/46 128/64/46 +f 114/50/47 115/51/47 130/66/47 129/65/47 +f 115/51/48 116/52/48 131/67/48 130/66/48 +f 116/52/49 117/53/49 132/68/49 131/67/49 +f 117/53/50 118/54/50 133/69/50 132/68/50 +f 118/54/51 119/55/51 134/70/51 133/69/51 +f 119/55/52 120/56/52 135/71/52 134/70/52 +f 120/56/53 121/57/53 136/72/53 135/71/53 +f 121/57/54 122/58/54 137/73/54 136/72/54 +f 122/58/55 123/59/55 138/74/55 137/73/55 +f 123/59/56 124/60/56 139/75/56 138/74/56 +f 125/62/57 126/61/57 141/76/57 140/77/57 +f 126/61/58 127/63/58 142/78/58 141/76/58 +f 127/63/59 128/64/59 143/79/59 142/78/59 +f 128/64/60 129/65/60 144/80/60 143/79/60 +f 129/65/61 130/66/61 145/81/61 144/80/61 +f 130/66/62 131/67/62 146/82/62 145/81/62 +f 131/67/63 132/68/63 147/83/63 146/82/63 +f 132/68/64 133/69/64 148/84/64 147/83/64 +f 133/69/65 134/70/65 149/85/65 148/84/65 +f 134/70/66 135/71/66 150/86/66 149/85/66 +f 135/71/67 136/72/67 151/87/67 150/86/67 +f 136/72/68 137/73/68 152/88/68 151/87/68 +f 137/73/69 138/74/69 153/89/69 152/88/69 +f 138/74/70 139/75/70 154/90/70 153/89/70 +f 140/77/71 141/76/71 156/91/71 155/92/71 +f 141/76/72 142/78/72 157/93/72 156/91/72 +f 142/78/73 143/79/73 158/94/73 157/93/73 +f 143/79/74 144/80/74 159/95/74 158/94/74 +f 144/80/75 145/81/75 160/96/75 159/95/75 +f 145/81/76 146/82/76 161/97/76 160/96/76 +f 146/82/77 147/83/77 162/98/77 161/97/77 +f 147/83/78 148/84/78 163/99/78 162/98/78 +f 148/84/79 149/85/79 164/100/79 163/99/79 +f 149/85/80 150/86/80 165/101/80 164/100/80 +f 150/86/81 151/87/81 166/102/81 165/101/81 +f 151/87/82 152/88/82 167/103/82 166/102/82 +f 152/88/83 153/89/83 168/104/83 167/103/83 +f 153/89/84 154/90/84 169/105/84 168/104/84 +f 155/92/85 156/91/85 171/106/85 170/107/85 +f 156/91/86 157/93/86 172/108/86 171/106/86 +f 157/93/87 158/94/87 173/109/87 172/108/87 +f 158/94/88 159/95/88 174/110/88 173/109/88 +f 159/95/89 160/96/89 175/111/89 174/110/89 +f 160/96/90 161/97/90 176/112/90 175/111/90 +f 161/97/91 162/98/91 177/113/91 176/112/91 +f 162/98/92 163/99/92 178/114/92 177/113/92 +f 163/99/93 164/100/93 179/115/93 178/114/93 +f 164/100/94 165/101/94 180/116/94 179/115/94 +f 165/101/95 166/102/95 181/117/95 180/116/95 +f 166/102/96 167/103/96 182/118/96 181/117/96 +f 167/103/97 168/104/97 183/119/97 182/118/97 +f 168/104/98 169/105/98 184/120/98 183/119/98 +f 170/107/99 171/106/99 186/121/99 185/122/99 +f 171/106/100 172/108/100 187/123/100 186/121/100 +f 172/108/101 173/109/101 188/124/101 187/123/101 +f 173/109/102 174/110/102 189/125/102 188/124/102 +f 174/110/103 175/111/103 190/126/103 189/125/103 +f 175/111/104 176/112/104 191/127/104 190/126/104 +f 176/112/105 177/113/105 192/128/105 191/127/105 +f 177/113/106 178/114/106 193/129/106 192/128/106 +f 178/114/107 179/115/107 194/130/107 193/129/107 +f 179/115/108 180/116/108 195/131/108 194/130/108 +f 180/116/109 181/117/109 196/132/109 195/131/109 +f 181/117/110 182/118/110 197/133/110 196/132/110 +f 182/118/111 183/119/111 198/134/111 197/133/111 +f 183/119/112 184/120/112 199/135/112 198/134/112 +f 185/122/113 186/121/113 201/136/113 200/137/113 +f 186/121/114 187/123/114 202/138/114 201/136/114 +f 187/123/115 188/124/115 203/139/115 202/138/115 +f 188/124/116 189/125/116 204/140/116 203/139/116 +f 189/125/117 190/126/117 205/141/117 204/140/117 +f 190/126/118 191/127/118 206/142/118 205/141/118 +f 191/127/119 192/128/119 207/143/119 206/142/119 +f 192/128/120 193/129/120 208/144/120 207/143/120 +f 193/129/121 194/130/121 209/145/121 208/144/121 +f 194/130/122 195/131/122 210/146/122 209/145/122 +f 195/131/123 196/132/123 211/147/123 210/146/123 +f 196/132/124 197/133/124 212/148/124 211/147/124 +f 197/133/125 198/134/125 213/149/125 212/148/125 +f 198/134/126 199/135/126 214/150/126 213/149/126 +f 200/137/127 201/136/127 216/151/127 215/152/127 +f 201/136/128 202/138/128 217/153/128 216/151/128 +f 202/138/129 203/139/129 218/154/129 217/153/129 +f 203/139/130 204/140/130 219/155/130 218/154/130 +f 204/140/131 205/141/131 220/156/131 219/155/131 +f 205/141/132 206/142/132 221/157/132 220/156/132 +f 206/142/133 207/143/133 222/158/133 221/157/133 +f 207/143/134 208/144/134 223/159/134 222/158/134 +f 208/144/135 209/145/135 224/160/135 223/159/135 +f 209/145/136 210/146/136 225/161/136 224/160/136 +f 210/146/137 211/147/137 226/162/137 225/161/137 +f 211/147/138 212/148/138 227/163/138 226/162/138 +f 212/148/139 213/149/139 228/164/139 227/163/139 +f 213/149/140 214/150/140 229/165/140 228/164/140 +f 215/152/141 216/151/141 231/166/141 230/167/141 +f 216/151/142 217/153/142 232/168/142 231/166/142 +f 217/153/143 218/154/143 233/169/143 232/168/143 +f 218/154/144 219/155/144 234/170/144 233/169/144 +f 219/155/145 220/156/145 235/171/145 234/170/145 +f 220/156/146 221/157/146 236/172/146 235/171/146 +f 221/157/147 222/158/147 237/173/147 236/172/147 +f 222/158/148 223/159/148 238/174/148 237/173/148 +f 223/159/149 224/160/149 239/175/149 238/174/149 +f 224/160/150 225/161/150 240/176/150 239/175/150 +f 225/161/151 226/162/151 241/177/151 240/176/151 +f 226/162/152 227/163/152 242/178/152 241/177/152 +f 227/163/153 228/164/153 243/179/153 242/178/153 +f 228/164/154 229/165/154 244/180/154 243/179/154 +f 230/167/155 231/166/155 246/181/155 245/182/155 +f 231/166/156 232/168/156 247/183/156 246/181/156 +f 232/168/157 233/169/157 248/184/157 247/183/157 +f 233/169/158 234/170/158 249/185/158 248/184/158 +f 234/170/159 235/171/159 250/186/159 249/185/159 +f 235/171/160 236/172/160 251/187/160 250/186/160 +f 236/172/161 237/173/161 252/188/161 251/187/161 +f 237/173/162 238/174/162 253/189/162 252/188/162 +f 238/174/163 239/175/163 254/190/163 253/189/163 +f 239/175/164 240/176/164 255/191/164 254/190/164 +f 240/176/165 241/177/165 256/192/165 255/191/165 +f 241/177/166 242/178/166 257/193/166 256/192/166 +f 242/178/167 243/179/167 258/194/167 257/193/167 +f 243/179/168 244/180/168 259/195/168 258/194/168 +f 245/182/169 246/181/169 261/196/169 260/197/169 +f 246/181/170 247/183/170 262/198/170 261/196/170 +f 247/183/171 248/184/171 263/199/171 262/198/171 +f 248/184/172 249/185/172 264/200/172 263/199/172 +f 249/185/173 250/186/173 265/201/173 264/200/173 +f 250/186/174 251/187/174 266/202/174 265/201/174 +f 251/187/175 252/188/175 267/203/175 266/202/175 +f 252/188/176 253/189/176 268/204/176 267/203/176 +f 253/189/177 254/190/177 269/205/177 268/204/177 +f 254/190/178 255/191/178 270/206/178 269/205/178 +f 255/191/179 256/192/179 271/207/179 270/206/179 +f 256/192/180 257/193/180 272/208/180 271/207/180 +f 257/193/181 258/194/181 273/209/181 272/208/181 +f 258/194/182 259/195/182 274/210/182 273/209/182 +f 260/197/183 261/196/183 276/211/183 275/212/183 +f 261/196/184 262/198/184 277/213/184 276/211/184 +f 262/198/185 263/199/185 278/214/185 277/213/185 +f 263/199/186 264/200/186 279/215/186 278/214/186 +f 264/200/187 265/201/187 280/216/187 279/215/187 +f 265/201/188 266/202/188 281/217/188 280/216/188 +f 266/202/189 267/203/189 282/218/189 281/217/189 +f 267/203/190 268/204/190 283/219/190 282/218/190 +f 268/204/191 269/205/191 284/220/191 283/219/191 +f 269/205/192 270/206/192 285/221/192 284/220/192 +f 270/206/193 271/207/193 286/222/193 285/221/193 +f 271/207/194 272/208/194 287/223/194 286/222/194 +f 272/208/195 273/209/195 288/224/195 287/223/195 +f 273/209/196 274/210/196 289/225/196 288/224/196 +f 1/226/197 20/227/197 65/1/197 19/228/197 +f 20/227/198 21/229/198 66/2/198 65/1/198 +f 21/229/199 22/230/199 67/5/199 66/2/199 +f 22/230/200 23/231/200 68/7/200 67/5/200 +f 23/231/201 24/232/201 69/9/201 68/7/201 +f 24/232/202 25/233/202 70/11/202 69/9/202 +f 25/233/203 26/234/203 71/13/203 70/11/203 +f 26/234/204 27/235/204 72/15/204 71/13/204 +f 27/235/205 28/236/205 73/17/205 72/15/205 +f 28/236/206 29/237/206 74/19/206 73/17/206 +f 29/237/207 30/238/207 75/21/207 74/19/207 +f 30/238/208 31/239/208 76/23/208 75/21/208 +f 31/239/209 32/240/209 77/25/209 76/23/209 +f 32/240/210 33/241/210 78/27/210 77/25/210 +f 33/241/211 34/242/211 79/29/211 78/27/211 +f 34/242/212 2/243/212 35/244/212 79/29/212 +f 79/29/213 35/244/213 36/245/213 94/30/213 +f 94/30/214 36/245/214 37/246/214 109/45/214 +f 109/45/215 37/246/215 38/247/215 124/60/215 +f 124/60/216 38/247/216 39/248/216 139/75/216 +f 139/75/217 39/248/217 40/249/217 154/90/217 +f 154/90/218 40/249/218 41/250/218 169/105/218 +f 169/105/219 41/250/219 42/251/219 184/120/219 +f 184/120/220 42/251/220 43/252/220 199/135/220 +f 199/135/221 43/252/221 44/253/221 214/150/221 +f 214/150/222 44/253/222 45/254/222 229/165/222 +f 229/165/223 45/254/223 46/255/223 244/180/223 +f 244/180/224 46/255/224 47/256/224 259/195/224 +f 259/195/225 47/256/225 48/257/225 274/210/225 +f 274/210/226 48/257/226 49/258/226 289/225/226 +f 289/225/227 49/258/227 4/259/227 50/260/227 +f 288/224/228 289/225/228 50/260/228 51/261/228 +f 287/223/229 288/224/229 51/261/229 52/262/229 +f 286/222/230 287/223/230 52/262/230 53/263/230 +f 285/221/231 286/222/231 53/263/231 54/264/231 +f 284/220/232 285/221/232 54/264/232 55/265/232 +f 283/219/233 284/220/233 55/265/233 56/266/233 +f 282/218/234 283/219/234 56/266/234 57/267/234 +f 281/217/235 282/218/235 57/267/235 58/268/235 +f 280/216/236 281/217/236 58/268/236 59/269/236 +f 279/215/237 280/216/237 59/269/237 60/270/237 +f 278/214/238 279/215/238 60/270/238 61/271/238 +f 277/213/239 278/214/239 61/271/239 62/272/239 +f 276/211/240 277/213/240 62/272/240 63/273/240 +f 275/212/241 276/211/241 63/273/241 64/274/241 +f 5/275/242 275/212/242 64/274/242 3/276/242 +f 6/277/243 260/197/243 275/212/243 5/275/243 +f 7/278/244 245/182/244 260/197/244 6/277/244 +f 8/279/245 230/167/245 245/182/245 7/278/245 +f 9/280/246 215/152/246 230/167/246 8/279/246 +f 10/281/247 200/137/247 215/152/247 9/280/247 +f 11/282/248 185/122/248 200/137/248 10/281/248 +f 12/283/249 170/107/249 185/122/249 11/282/249 +f 13/284/250 155/92/250 170/107/250 12/283/250 +f 14/285/251 140/77/251 155/92/251 13/284/251 +f 15/286/252 125/62/252 140/77/252 14/285/252 +f 16/287/253 110/47/253 125/62/253 15/286/253 +f 17/288/254 95/32/254 110/47/254 16/287/254 +f 18/289/255 80/4/255 95/32/255 17/288/255 +f 19/228/256 65/1/256 80/4/256 18/289/256 diff --git a/tools/ttf_bitmap.cpp b/tools/ttf_bitmap.cpp index 884ab8d..60d2c97 100644 --- a/tools/ttf_bitmap.cpp +++ b/tools/ttf_bitmap.cpp @@ -7,6 +7,23 @@ #include #include FT_FREETYPE_H +#include "../twiddle.hpp" + +bool is_power(int n) +{ + const int min_power = 8; + const int max_power = 1024; + int power = min_power; + + while (power <= max_power) { + if (n == power) + return true; + power *= 2; + } + printf("%d\n", n); + return false; +} + int32_t load_bitmap_char(FT_Face face, FT_ULong char_code, @@ -25,26 +42,24 @@ load_bitmap_char(FT_Face face, //printf("num_grays %d\n", face->glyph->bitmap.num_grays); //printf("pitch %d\n", face->glyph->bitmap.pitch); //printf("width %d\n", face->glyph->bitmap.width); - //printf("char_code %lx rows %d\n", char_code, face->glyph->bitmap.rows); - //assert((face->glyph->bitmap.rows % 8) == 0); - //assert(face->glyph->bitmap.width / face->glyph->bitmap.pitch == 8); + //printf("rows %d\n", face->glyph->bitmap.rows); + assert(face->glyph->bitmap.num_grays == 2); + assert(is_power(face->glyph->bitmap.rows)); + assert(is_power(face->glyph->bitmap.width)); + assert((int)(face->glyph->bitmap.pitch * 8) == (int)(face->glyph->bitmap.width)); for (int y = 0; y < (int)face->glyph->bitmap.rows; y++) { uint8_t * row = &face->glyph->bitmap.buffer[y * face->glyph->bitmap.pitch]; - uint8_t row_out = 0; - for (unsigned int x = 0; x < face->glyph->bitmap.width; x++) { - if (x % 8 == 0) row_out = 0; - const uint8_t bit = (row[x / 8] >> (7 - (x % 8))) & 1; - std::cerr << (bit ? "█" : " "); - row_out |= (bit << (x % 8)); - if (x % 8 == 7 || x == (face->glyph->bitmap.width - 1)) - buf[(y * face->glyph->bitmap.pitch) + (x / 8)] = row_out; + for (int x = 0; x < (int)face->glyph->bitmap.width; x += 1) { + const int bit = (row[x / 8] >> (7 - (x % 8))) & 1; + //std::cerr << (bit ? "█" : " "); + buf[y * face->glyph->bitmap.width + x] = bit; } - std::cerr << "|\n"; + //std::cerr << "|\n"; } // 'pitch' is bytes; 'width' is pixels - return face->glyph->bitmap.rows * face->glyph->bitmap.pitch; + return face->glyph->bitmap.rows * face->glyph->bitmap.width; } template @@ -95,11 +110,16 @@ int main(int argc, char *argv[]) assert(end > start); - uint32_t pixels_per_glyph = (face->size->metrics.height * face->size->metrics.max_advance); + int width = face->size->metrics.max_advance >> 6; + int height = face->size->metrics.height >> 6; + uint32_t pixels_per_glyph = width * height; assert(pixels_per_glyph % 8 == 0); - uint32_t bytes_per_glyph = pixels_per_glyph / 8; + uint32_t bytes_per_glyph = pixels_per_glyph; uint32_t num_glyphs = (end - start) + 1; - uint8_t buf[bytes_per_glyph * num_glyphs]; + uint32_t buf_size = bytes_per_glyph * num_glyphs; + uint8_t * buf = (uint8_t *)malloc(buf_size); + + uint8_t * twiddle_buf = (uint8_t *)malloc(buf_size / 2); uint32_t bitmap_offset = 0; for (uint32_t char_code = start; char_code <= end; char_code++) { @@ -111,16 +131,22 @@ int main(int argc, char *argv[]) return -1; } + printf("twiddle %d %d %d %d\n", bitmap_offset, bitmap_offset / 2, width, height); + twiddle::texture_4bpp(&twiddle_buf[bitmap_offset / 2], + &buf[bitmap_offset], + width, + height); + bitmap_offset += bitmap_size; - assert(bitmap_offset < (sizeof (buf))); + assert(bitmap_offset <= buf_size); } - std::cerr << "bitmap_offset: 0x" << std::dec << bitmap_offset << '\n'; + printf("bitmap_offset: %d\n", bitmap_offset); FILE * out = fopen(output_file_path, "w"); if (out == NULL) { perror("fopen(w)"); return -1; } - fwrite(reinterpret_cast(&buf), bitmap_offset, 1, out); + fwrite(reinterpret_cast(twiddle_buf), bitmap_offset / 2, 1, out); fclose(out); }