// The Digital Grove Codebase // Copyright (c) Ryan Fleury. All rights reserved. #include "base/base_inc.h" #include "n64/n64.h" #include "render/render_inc.h" #include "base/base_inc.c" #include "n64/n64.c" #include "render/render_inc.c" typedef struct SubModel SubModel; struct SubModel { U16 material_num; U16 *idxs; UAddr idxs_count; U64 id; }; typedef struct Model Model; struct Model { Vec3F32 *vtx; UAddr vtx_count; SubModel *sub_models; UAddr sub_models_count; }; R_Material materials[] = { {{1, 0.5f, 0, 1}}, // yellow {{0, 1, 0, 1}}, // green {{1, 0, 0, 1}}, // red {{0, 0, 1, 1}}, // blue }; extern Model n64_logo_model; extern Model dg_logo_model; function B32 Run(U64 tick_idx, Arena *permanent_arena, GamePad game_pads[GAME_PAD_SLOT_COUNT]) { B32 keep_running = 1; //- rjf: get/update camera state local_persist F32 yaw = 0.125f; local_persist F32 pitch = 0.125f; local_persist F32 zoom = 5.f; { // rjf: stick -> adjust yaw/pitch yaw += 0.1f * game_pads[0].sticks[0].x; pitch += 0.1f * game_pads[0].sticks[0].y; pitch = Clamp(-0.24f, pitch, +0.24f); // rjf: z -> zoom in if(BitArrayGet(game_pads[0].buttons, GamePadButtonKind_Z)) { zoom -= 0.1f; } // rjf: r -> zoom out else if(BitArrayGet(game_pads[0].buttons, GamePadButtonKind_RightBumper)) { zoom += 0.1f; } } //- rjf: camera state -> view projection F32 cos_pitch = CosF32(pitch); F32 cos_pitch_zoom = cos_pitch*zoom; Vec3F32 eye = V3F32(cos_pitch_zoom*CosF32(yaw), cos_pitch_zoom*SinF32(yaw), zoom*SinF32(pitch)); Mat4x4F32 view = MakeLookAt4x4F32(eye, V3F32(0, 0, 0), V3F32(0, 0, 1)); Mat4x4F32 projection = MakePerspective4x4F32(0.25f, (F32)N64_FB_WIDTH/N64_FB_HEIGHT, 0.01f, 50.f); //- rjf: get/update selected model local_persist S32 model_num = 0; if(BitArrayGet(n64_state.game_pads[0].buttons, GamePadButtonKind_CRight) && !BitArrayGet(n64_state.game_pads[0].last_buttons, GamePadButtonKind_CRight)) { model_num += 1; if(model_num > 2) { model_num = 0; } } if(BitArrayGet(n64_state.game_pads[0].buttons, GamePadButtonKind_CLeft) && !BitArrayGet(n64_state.game_pads[0].last_buttons, GamePadButtonKind_CLeft)) { model_num -= 1; if(model_num < 0) { model_num = 2; } } Model *model = &n64_logo_model; switch(model_num) { default: case 0: {}break; case 1: { model = &dg_logo_model; }break; case 2: { // model = &n64_controller_model; }break; } //- rjf: set up render pass R_PassParams pass_params = { view, projection, V3F32(+0.5f, +0.1f, -1), }; R_Pass(&pass_params); //- rjf: draw model R_BufferHandle vtx_buffer = R_BufferHandleFromData(model->vtx, model->vtx_count, sizeof(model->vtx[0])); for EachIndex(sub_model_idx, model->sub_models_count) { SubModel *sub_model = &model->sub_models[sub_model_idx]; R_Material material = materials[sub_model->material_num-1]; R_BufferHandle idx_buffer = R_BufferHandleFromData(sub_model->idxs, sub_model->idxs_count, sizeof(sub_model->idxs[0])); R_SubModelHandle handle = R_SubModelHandleFromBuffers(vtx_buffer, idx_buffer); R_SubModel(handle, material, MakeMat4x4F32(1.f)); } //- rjf: gradient test #if 0 #if 0 { U16 *p = N64_Framebuffer(); int midpoint = N64_FB_WIDTH - (tick_idx%N64_FB_WIDTH); for(int i = 0; i < N64_FB_WIDTH*N64_FB_HEIGHT; i += 1) { // NOTE(rjf): RGBA5551 (R5 G5 B5 A1) // // - 0xF801 = bright red // - 0x07C1 = bright green // - 0x003F = bright blue // - 0xFFFF = white // - 0x0001 = black (with alpha) // F32 pct = (F32)(i%N64_FB_WIDTH) / N64_FB_WIDTH; U16 red = (U16)(pct * 0x1f); U16 color = 0x0001 | (red<<11); if((i%N64_FB_WIDTH) > midpoint) { F32 pct = (F32)(N64_FB_WIDTH - (i%N64_FB_WIDTH)) / N64_FB_WIDTH; U16 green = (U16)(pct * 0x1f); color |= (green<<6); } { F32 pct = ((F32)(i / N64_FB_WIDTH) / N64_FB_HEIGHT); U16 blue = (U16)(pct * 0x1f); color |= (blue<<1); } p[i] = color; } } #endif #if 1 U16 *p = N64_Framebuffer(); for(int i = 0; i < N64_FB_WIDTH*N64_FB_HEIGHT; i += 1) { if(i%N64_FB_WIDTH > tick_idx%N64_FB_WIDTH) { p[i] = 0xf801; } else { p[i] = 0x0001; } } #endif Temp scratch = ScratchBegin(0); #if 0 Vec2F32 text_pos = {150, 64 + 32.f}; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 1, 1, 1), SF("DP status_flags: %ib", N64_DP_REGS->status_flags)).y; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 1, 1, 1), SF("MI_VERSION: %ix", *N64_MI_VERSION)).y; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 1, 1, 1), S("ABCDEFGHIJKLMNOPQRSTUVWXYZ")).y; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 1, 1, 1), S("abcdefghijklmnopqrstuvwxyz")).y; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 1, 1, 1), S("0123456789")).y; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 1, 1, 1), S("`~!@#$%^&*()-_=+[]{};:'\"|\\.,<>?/")).y; text_pos.y += 4; text_pos.y += N64_DrawDebugString(1, text_pos, V4F32(1, 0.8f, 0, 1), S("Hello, N64!")).y; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 1, 1, 1), SF("Memory Size = %i", N64_BOOT_INFO->memory_size)).y; text_pos.y += N64_DrawDebugString(0, text_pos, V4F32(1, 0, 0, 1), SF("DP STATUS = %ib", N64_DP_REGS->status_flags)).y; N64_DrawMonochromeBitmap(V2F32(320 - 32, 240 - 48), V4F32(1, 1, 0, 1), n64_dgtlgrove_logo_32x48, 32, 48); #endif Vec2F32 button_pos = {16, 48}; for(U64 idx = 0; idx < 4; idx += 1) { B32 controller_is_connected = (n64_state.joybus_port_states[idx].id == N64_JoyBus_ID_N64Controller); Vec4F32 color = controller_is_connected ? V4F32(1, 1, 1, 1) : V4F32(1, 0, 0, 1); N64_DrawMonochromeBitmap(V2F32(16 + 32*idx, 16), color, n64_controller_icon_32x32, 32, 32); if(controller_is_connected) { N64_DrawDebugString(0, V2F32(16 + 32*idx + 16 - N64_SMALL_DEFAULT_FONT_GLYPH_WIDTH/2 + 8*game_pads[idx].sticks[0].x, 16 + 16 - N64_SMALL_DEFAULT_FONT_GLYPH_HEIGHT/2 + -8*game_pads[idx].sticks[0].y), V4F32(1, 1, 0, 1), S("*")); } if(controller_is_connected) { // button_pos.y += N64_DrawDebugString(0, button_pos, V4F32(1, 1, 1, 1), SF("Stick")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_A)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0, 0, 1, 1), S("A")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_B)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0, 1, 0, 1), S("B")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_Start)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(1, 0, 0, 1), S("Start")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_CLeft)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(1, 1, 0, 1), S("C<")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_CUp)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(1, 1, 0, 1), S("C^")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_CRight)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(1, 1, 0, 1), S("C>")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_CDown)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(1, 1, 0, 1), S("Cv")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_DLeft)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0.5f, 0.5f, 0.5f, 1), S("D<")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_DUp)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0.5f, 0.5f, 0.5f, 1), S("D^")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_DRight)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0.5f, 0.5f, 0.5f, 1), S("D>")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_DDown)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0.5f, 0.5f, 0.5f, 1), S("Dv")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_Z)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0.5f, 0.5f, 0.5f, 1), S("Z")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_LeftBumper)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0.5f, 0.5f, 0.5f, 1), S("L")).y; } if(BitArrayGet(game_pads[idx].buttons, GamePadButtonKind_RightBumper)) { button_pos.y += N64_DrawDebugString(1, button_pos, V4F32(0.5f, 0.5f, 0.5f, 1), S("R")).y; } } ScratchEnd(scratch); #endif //- rjf: digital grove splash test #if 0 F32 t_pct = (F32)tick_idx / 80.f; if(t_pct > 1.f) { t_pct = 1.f; } { U16 *p = N64_Framebuffer(); U8 bayer[16] = { 0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5 }; F32 dither_step = 1.f / 31.f; for(U32 off = 0; off < N64_FB_WIDTH*N64_FB_HEIGHT; off += 1) { U32 x = off%N64_FB_WIDTH; U32 y = off/N64_FB_WIDTH; F32 x_pct = (F32)x/N64_FB_WIDTH; F32 y_pct = (F32)y/N64_FB_HEIGHT; Vec4F32 color = V4F32(t_pct * (0.04f + 0.08f*x_pct - 0.03f*y_pct), t_pct * (0.15f - 0.04f*y_pct), t_pct * (0.03f + 0.04f*y_pct), 1.f); U32 x_bayer = x%4; U32 y_bayer = y%4; F32 bayer_f = (bayer[y_bayer*4 + x_bayer] / 16.f); Vec4F32 color_dithered = color; color_dithered.x += (bayer_f - 0.5f) * dither_step; color_dithered.y += (bayer_f - 0.5f) * dither_step; color_dithered.z += (bayer_f - 0.5f) * dither_step; p[off] = RGBA5551From4F32(color_dithered); } } // Vec4F32 logo_color = V4F32(1*t_pct, 0.8f*t_pct, 0, 1); // N64_DrawMonochromeBitmap(V2F32(160 - 16, 120 - 24 + 32*(1-t_pct)), logo_color, n64_dgtlgrove_logo_32x48, 32, 48); // N64_DrawDebugString(1, V2F32(160 - 6.5f*N64_BIG_DEFAULT_FONT_GLYPH_WIDTH, 120+30 + 32*(1-t_pct)), logo_color, S("Digital Grove 64")); #endif return keep_running; } global Vec3F32 n64_logo_model_vtx[] = { { -0.319213, -0.322617, 0.083041 }, { -0.319213, -0.671946, 0.719425 }, { -0.319213, 0.332592, -0.051930 }, { -0.691264, 0.339679, -0.737678 }, { -0.691264, -0.321049, -0.737678 }, { -0.691264, -0.319959, 0.719425 }, { -0.691264, 0.689761, 0.087923 }, { -0.319213, 0.339679, -0.737678 }, { -0.691264, -0.322617, 0.083041 }, { -0.319213, -0.321049, -0.737678 }, { -0.691264, -0.671946, -0.737678 }, { -0.319213, -0.671946, -0.737678 }, { -0.691264, -0.671946, 0.719425 }, { -0.319213, -0.319959, 0.719425 }, { -0.691264, 0.332592, -0.051930 }, { -0.691264, 0.332592, 0.087923 }, { -0.319213, 0.332592, 0.087923 }, { -0.319213, 0.689761, 0.087923 }, { -0.691264, 0.689761, -0.737678 }, { -0.319213, 0.689761, -0.737678 }, { -0.319213, -0.671946, 0.086702 }, { -0.691264, 0.689761, -0.049576 }, { -0.319213, 0.689761, -0.051523 }, { -0.691264, 0.689761, 0.726424 }, { -0.691264, 0.332592, 0.726424 }, { -0.319213, 0.332592, 0.726424 }, { -0.319213, 0.689761, 0.726424 }, { 0.328262, 0.332592, -0.731953 }, { 0.328262, 0.689761, -0.731953 }, { 0.328262, 0.332592, -0.040641 }, { 0.328262, 0.689761, -0.040641 }, { 0.663334, 0.332592, -0.731953 }, { 0.663334, 0.689761, -0.731953 }, { 0.663334, 0.332592, -0.040641 }, { 0.663334, 0.689761, -0.040641 }, { 0.328262, 0.332592, 0.089613 }, { 0.328262, 0.689761, 0.089613 }, { 0.663334, 0.332592, 0.089613 }, { 0.663334, 0.689761, 0.089613 }, { 0.328262, 0.332592, 0.726182 }, { 0.328262, 0.689761, 0.726182 }, { 0.663334, 0.332592, 0.726182 }, { 0.663334, 0.689761, 0.726182 }, { 0.663334, -0.324375, -0.734938 }, { 0.328262, -0.324375, -0.734938 }, { 0.663333, -0.324375, -0.039661 }, { 0.328262, -0.324375, -0.039662 }, { 0.663334, -0.677543, -0.734938 }, { 0.328262, -0.677543, -0.734938 }, { 0.663333, -0.677543, -0.039661 }, { 0.328262, -0.677543, -0.039662 }, { 0.663333, -0.324375, 0.099964 }, { 0.328262, -0.324375, 0.099964 }, { 0.663333, -0.677543, 0.099964 }, { 0.328262, -0.677543, 0.099964 }, { 0.663333, -0.324375, 0.720610 }, { 0.328261, -0.324375, 0.720610 }, { 0.663333, -0.677543, 0.720610 }, { 0.328261, -0.677543, 0.720610 }, { -0.691264, -0.671946, 0.086713 }, { -0.691264, -0.671946, -0.042679 }, { -0.319213, -0.671946, -0.040508 }, { -0.319213, -0.322617, -0.040018 }, { -0.691264, -0.322617, -0.044321 }, }; global U16 n64_logo_model_tri_faces__yellow[] = { 14, 13, 2, 27, 25, 26, 40, 43, 41, 57, 58, 56, 14, 6, 13, 27, 24, 25, 40, 42, 43, 57, 59, 58, }; global U16 n64_logo_model_tri_faces__green[] = { 15, 8, 3, 9, 14, 1, 63, 9, 1, 12, 5, 10, 12, 61, 11, 3, 16, 15, 7, 27, 18, 18, 22, 7, 8, 19, 20, 47, 1, 14, 23, 19, 22, 25, 63, 26, 29, 32, 28, 37, 8, 20, 23, 37, 20, 31, 33, 29, 34, 36, 30, 31, 39, 35, 36, 3, 8, 37, 43, 39, 46, 53, 52, 48, 51, 49, 44, 49, 45, 50, 55, 51, 55, 58, 59, 57, 34, 30, 60, 2, 13, 62, 60, 61, 21, 51, 2, 1, 49, 21, 47, 44, 45, 38, 40, 36, 15, 4, 8, 9, 6, 14, 63, 64, 9, 12, 11, 5, 12, 62, 61, 3, 17, 16, 7, 24, 27, 18, 23, 22, 8, 4, 19, 47, 45, 1, 23, 20, 19, 25, 64, 63, 29, 33, 32, 37, 36, 8, 23, 41, 37, 31, 35, 33, 34, 38, 36, 31, 37, 39, 36, 40, 3, 37, 41, 43, 46, 47, 53, 48, 50, 51, 44, 48, 49, 50, 54, 55, 55, 54, 58, 57, 56, 34, 60, 21, 2, 62, 21, 60, 21, 49, 51, 1, 45, 49, 47, 46, 44, 38, 42, 40, }; global U16 n64_logo_model_tri_faces__red[] = { 10, 16, 17, 40, 23, 3, 2, 47, 14, 52, 28, 32, 10, 5, 16, 40, 41, 23, 2, 51, 47, 52, 53, 28, }; global U16 n64_logo_model_tri_faces__blue[] = { 17, 23, 18, 11, 64, 5, 22, 4, 15, 1, 62, 63, 63, 17, 26, 22, 16, 7, 12, 63, 62, 16, 24, 7, 27, 17, 18, 33, 34, 32, 34, 52, 32, 35, 38, 34, 30, 37, 31, 39, 42, 38, 46, 48, 44, 52, 58, 54, 51, 53, 47, 46, 54, 50, 59, 53, 55, 60, 6, 9, 28, 31, 29, 16, 64, 25, 61, 9, 64, 53, 30, 28, 17, 3, 23, 11, 61, 64, 22, 19, 4, 1, 21, 62, 63, 10, 17, 22, 15, 16, 12, 10, 63, 16, 25, 24, 27, 26, 17, 33, 35, 34, 34, 56, 52, 35, 39, 38, 30, 36, 37, 39, 43, 42, 46, 50, 48, 52, 56, 58, 51, 55, 53, 46, 52, 54, 59, 57, 53, 60, 13, 6, 28, 30, 31, 16, 5, 64, 61, 60, 9, 53, 57, 30, }; SubModel n64_logo_submodels[] = { {1, ArrayAndCount(n64_logo_model_tri_faces__yellow)}, {2, ArrayAndCount(n64_logo_model_tri_faces__green)}, {3, ArrayAndCount(n64_logo_model_tri_faces__red)}, {4, ArrayAndCount(n64_logo_model_tri_faces__blue)}, }; Model n64_logo_model = { ArrayAndCount(n64_logo_model_vtx), ArrayAndCount(n64_logo_submodels), }; global Vec3F32 dg_logo_model_vtx[] = { { 0.085057, 0.094957, -2.584146 }, { 0.084919, -0.027923, -2.658362 }, { 0.083808, -0.171746, -2.550864 }, { 0.083306, -0.107028, -2.394031 }, { 0.084125, 0.080334, -2.405339 }, { 0.086326, 0.278994, -2.690513 }, { 0.086225, 0.063105, -2.850055 }, { 0.084853, -0.226452, -2.810704 }, { 0.083159, -0.367724, -2.581724 }, { 0.082095, -0.334552, -2.335907 }, { 0.082196, -0.118662, -2.176362 }, { 0.083569, 0.170893, -2.215714 }, { 0.085262, 0.312166, -2.444695 }, { 0.082318, -0.135191, -2.215159 }, { 0.075256, -0.133749, -0.766794 }, { 0.068438, -0.894210, -0.004996 }, { 0.060581, -0.892605, 1.606462 }, { 0.059976, -0.130628, 2.366775 }, { 0.056730, -0.025024, 3.120139 }, { 0.061291, 0.084822, 2.277215 }, { 0.062657, -0.607715, 1.418925 }, { 0.068886, -0.608987, 0.141494 }, { 0.075700, 0.081880, -0.677655 }, { 0.083340, 0.080320, -2.244440 }, { 0.064875, -0.875355, 0.740968 }, { 0.057463, -1.609634, 1.646470 }, { 0.065358, -0.664627, 0.818029 }, { 0.078421, 0.011302, -1.294146 }, { 0.077959, 0.627437, -0.684809 }, { 0.068811, 0.750083, 1.292086 }, { 0.071499, 0.844370, 0.820083 }, { 0.079242, 0.843008, -0.767747 }, { 0.079871, 0.049410, -1.559573 }, { 0.074583, 0.687116, 0.056670 }, { 0.074556, 1.285580, 0.562082 }, { 0.075410, 0.757468, -0.054058 }, { 0.056820, -0.262075, 2.903636 }, { 0.056290, -0.354120, 2.935505 }, { 0.054757, -0.443627, 3.174871 }, { 0.056529, -0.201492, 3.013897 }, { 0.071368, 0.941992, 0.928360 }, { 0.070890, 0.941275, 1.025741 }, { 0.070886, 1.137012, 1.190092 }, { 0.071973, 1.066184, 0.908125 }, { -0.027071, 0.095414, -2.584693 }, { -0.027210, -0.027466, -2.658910 }, { -0.028321, -0.171288, -2.551411 }, { -0.028822, -0.106571, -2.394578 }, { -0.028003, 0.080791, -2.405887 }, { -0.025802, 0.279451, -2.691060 }, { -0.025903, 0.063562, -2.850603 }, { -0.027276, -0.225994, -2.811251 }, { -0.028969, -0.367267, -2.582272 }, { -0.030033, -0.334095, -2.336454 }, { -0.029932, -0.118205, -2.176909 }, { -0.028560, 0.171350, -2.216261 }, { -0.026866, 0.312623, -2.445242 }, { -0.029810, -0.134734, -2.215707 }, { -0.036872, -0.133292, -0.767341 }, { -0.043690, -0.893753, -0.005543 }, { -0.051548, -0.892148, 1.605915 }, { -0.052152, -0.130171, 2.366227 }, { -0.055398, -0.024567, 3.119591 }, { -0.050837, 0.085279, 2.276668 }, { -0.049471, -0.607258, 1.418378 }, { -0.043242, -0.608530, 0.140947 }, { -0.036429, 0.082337, -0.678202 }, { -0.028789, 0.080777, -2.244987 }, { -0.047254, -0.874897, 0.740421 }, { -0.054666, -1.609177, 1.645923 }, { -0.046771, -0.664170, 0.817482 }, { -0.033708, 0.011759, -1.294693 }, { -0.034170, 0.627894, -0.685356 }, { -0.043318, 0.750540, 1.291539 }, { -0.040630, 0.844827, 0.819536 }, { -0.032886, 0.843465, -0.768294 }, { -0.032257, 0.049867, -1.560121 }, { -0.037545, 0.687573, 0.056123 }, { -0.037572, 1.286037, 0.561534 }, { -0.036718, 0.757925, -0.054605 }, { -0.055308, -0.261618, 2.903088 }, { -0.055839, -0.353663, 2.934958 }, { -0.057372, -0.443170, 3.174324 }, { -0.055599, -0.201035, 3.013350 }, { -0.040760, 0.942449, 0.927813 }, { -0.041238, 0.941732, 1.025193 }, { -0.041243, 1.137469, 1.189545 }, { -0.040155, 1.066641, 0.907578 }, }; global U16 dg_logo_model_tri_faces[] = { 1, 13, 5, 2, 6, 1, 18, 20, 19, 17, 20, 18, 17, 21, 20, 16, 21, 17, 16, 22, 21, 16, 23, 22, 15, 23, 16, 15, 24, 23, 14, 24, 15, 1, 6, 13, 3, 4, 10, 2, 3, 8, 5, 13, 12, 4, 11, 10, 3, 9, 8, 2, 7, 6, 4, 5, 11, 5, 12, 11, 3, 10, 9, 2, 8, 7, 45, 49, 57, 46, 45, 50, 62, 63, 64, 61, 62, 64, 61, 64, 65, 60, 61, 65, 60, 65, 66, 60, 66, 67, 59, 60, 67, 59, 67, 68, 58, 59, 68, 45, 57, 50, 47, 54, 48, 46, 52, 47, 49, 56, 57, 48, 54, 55, 47, 52, 53, 46, 50, 51, 48, 55, 49, 49, 55, 56, 47, 53, 54, 46, 51, 52, 53, 8, 9, 54, 9, 10, 67, 22, 23, 55, 10, 11, 60, 15, 16, 63, 18, 19, 56, 11, 12, 57, 12, 13, 68, 23, 24, 64, 19, 20, 49, 1, 5, 62, 17, 18, 59, 14, 15, 45, 2, 1, 58, 24, 14, 46, 3, 2, 47, 4, 3, 65, 20, 21, 48, 5, 4, 61, 16, 17, 50, 13, 6, 51, 6, 7, 52, 7, 8, 66, 21, 22, 53, 52, 8, 54, 53, 9, 67, 66, 22, 55, 54, 10, 60, 59, 15, 63, 62, 18, 56, 55, 11, 57, 56, 12, 68, 67, 23, 64, 63, 19, 49, 45, 1, 62, 61, 17, 59, 58, 14, 45, 46, 2, 58, 68, 24, 46, 47, 3, 47, 48, 4, 65, 64, 20, 48, 49, 5, 61, 60, 16, 50, 57, 13, 51, 50, 6, 52, 51, 7, 66, 65, 21, 25, 27, 26, 69, 70, 71, 70, 25, 26, 71, 26, 27, 69, 27, 25, 70, 69, 25, 71, 70, 26, 69, 71, 27, 29, 31, 30, 29, 32, 31, 29, 33, 32, 28, 33, 29, 73, 74, 75, 73, 75, 76, 73, 76, 77, 72, 73, 77, 76, 31, 32, 77, 32, 33, 73, 28, 29, 72, 33, 28, 75, 30, 31, 74, 29, 30, 76, 75, 31, 77, 76, 32, 73, 72, 28, 72, 77, 33, 75, 74, 30, 74, 73, 29, 34, 36, 35, 78, 79, 80, 80, 35, 36, 79, 34, 35, 78, 36, 34, 80, 79, 35, 79, 78, 34, 78, 80, 36, 38, 40, 39, 38, 37, 40, 82, 83, 84, 82, 84, 81, 82, 37, 38, 84, 39, 40, 83, 38, 39, 81, 40, 37, 82, 81, 37, 84, 83, 39, 83, 82, 38, 81, 84, 40, 42, 44, 43, 41, 44, 42, 86, 87, 88, 85, 86, 88, 88, 43, 44, 87, 42, 43, 86, 41, 42, 85, 44, 41, 88, 87, 43, 87, 86, 42, 86, 85, 41, 85, 88, 44, }; SubModel dg_logo_submodels[] = { {1, ArrayAndCount(dg_logo_model_tri_faces)}, }; Model dg_logo_model = { ArrayAndCount(dg_logo_model_vtx), ArrayAndCount(dg_logo_submodels), };