diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a4fd13..e961143 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ add_executable(addin ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}}) target_compile_definitions(addin PRIVATE -D__BSD_VISIBLE=1) target_compile_options(addin PRIVATE -Wall -Wextra -Os -fno-use-cxa-atexit) target_link_options(addin PRIVATE -Wl,-Map=map -Wl,--print-memory-usage) -target_link_libraries(addin Gint::Gint) +target_link_libraries(addin PRIVATE Gint::Gint -lstdc++) if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G) generate_g1a( diff --git a/src/game.cpp b/src/game.cpp index 2f6cf50..01ed8ec 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -18,6 +18,6 @@ Game::Game() void Game::new_game() { // pour exemple - map = &map_moulin; + map = &map_exemple; player.teleport(160,0,player.height,180,10); } diff --git a/src/map.cpp b/src/map.cpp index 1214a06..c648604 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -153,7 +153,7 @@ const unsigned char sprite_mur_moulin[]={ }; const unsigned char sprite_pale_moulin[]={ - 0x3, 0xc0, + 0x3, 0xc0, 0x7, 0xe0, 0x7, 0xe0, 0xf, 0xf0, @@ -234,33 +234,343 @@ Texture tex_pale_moulin = {sprite_pale_moulin, NULL, 16, 64, 0, 0}; -// EXEMPLE -const VertexPoint exemple_v[] = { - {0, -30, 0}, - {0, 30, 0}, - {0, -30, 60}, - {0, 30, 60}}; -const TexturePoint exemple_t[] = { - {0, 0}, - {1, 0}, - {0, 1}, - {1, 1}}; -const Face exemple_f[] = { - {&tex_brique, &tex_black, {0, 2, 1}, {0, 2, 1}}, - {&tex_black, &tex_tuile, {1, 2, 3}, {1, 2, 3}}}; -const Mesh exemple_m = {exemple_v, 4, exemple_t, 4, exemple_f, 2}; -Object exemple_o1 = {&exemple_m, {0, 0, 0}, N, 0}; - -Object* objects_exemple[] = {&exemple_o1}; +const VertexPoint huma_v[] = { + {3, -2, 14}, + {3, -2, 9}, + {3, 2, 9}, + {3, 2, 14}, + {0, -2, 14}, + {0, -2, 9}, + {0, 2, 14}, + {0, 2, 9}, + {3, -1, 17}, + {3, -1, 15}, + {3, 1, 15}, + {3, 1, 17}, + {0, -1, 17}, + {0, -1, 15}, + {0, 1, 17}, + {0, 1, 15}, + {3, -2, 8}, + {3, -2, 3}, + {3, 0, 3}, + {3, 0, 8}, + {0, -2, 8}, + {0, -2, 3}, + {0, 0, 8}, + {0, 0, 3}, + {3, -3, 14}, + {3, -3, 9}, + {3, -2, 9}, + {3, -2, 14}, + {0, -3, 14}, + {0, -3, 9}, + {0, -2, 14}, + {0, -2, 9}, + {3, 2, 14}, + {3, 2, 9}, + {3, 3, 9}, + {3, 3, 14}, + {0, 2, 14}, + {0, 2, 9}, + {0, 3, 14}, + {0, 3, 9}, + {2, 0, 15}, + {2, 0, 14}, + {2, 0, 14}, + {2, 0, 15}, + {1, 0, 15}, + {1, 0, 14}, + {1, 0, 15}, + {1, 0, 14}, + {3, -2, 9}, + {3, -2, 8}, + {3, 2, 8}, + {3, 2, 9}, + {0, -2, 9}, + {0, -2, 8}, + {0, 2, 9}, + {0, 2, 8}, + {3, 0, 8}, + {3, 0, 3}, + {3, 2, 3}, + {3, 2, 8}, + {0, 0, 8}, + {0, 0, 3}, + {0, 2, 8}, + {0, 2, 3}, + {13, -2, 14}, + {13, -2, 9}, + {13, 2, 9}, + {13, 2, 14}, + {10, -2, 14}, + {10, -2, 9}, + {10, 2, 14}, + {10, 2, 9}, + {13, -1, 17}, + {13, -1, 15}, + {13, 1, 15}, + {13, 1, 17}, + {10, -1, 17}, + {10, -1, 15}, + {10, 1, 17}, + {10, 1, 15}, + {13, -2, 8}, + {13, -2, 3}, + {13, 0, 3}, + {13, 0, 8}, + {10, -2, 8}, + {10, -2, 3}, + {10, 0, 8}, + {10, 0, 3}, + {13, -3, 14}, + {13, -3, 9}, + {13, -2, 9}, + {13, -2, 14}, + {10, -3, 14}, + {10, -3, 9}, + {10, -2, 14}, + {10, -2, 9}, + {13, 2, 14}, + {13, 2, 9}, + {13, 3, 9}, + {13, 3, 14}, + {10, 2, 14}, + {10, 2, 9}, + {10, 3, 14}, + {10, 3, 9}, + {12, 0, 15}, + {12, 0, 14}, + {12, 0, 14}, + {12, 0, 15}, + {11, 0, 15}, + {11, 0, 14}, + {11, 0, 15}, + {11, 0, 14}, + {13, -2, 9}, + {13, -2, 8}, + {13, 2, 8}, + {13, 2, 9}, + {10, -2, 9}, + {10, -2, 8}, + {10, 2, 9}, + {10, 2, 8}, + {13, 0, 8}, + {13, 0, 3}, + {13, 2, 3}, + {13, 2, 8}, + {10, 0, 8}, + {10, 0, 3}, + {10, 2, 8}, + {10, 2, 3}, +}; +const TexturePoint huma_t[] = { + {0,1} +}; +const Face huma_f[] = { + {&tex_black, &tex_black, {0, 1, 2}, {0,0,0}}, + {&tex_black, &tex_black, {0, 2, 3}, {0,0,0}}, + {&tex_black, &tex_black, {4, 5, 1}, {0,0,0}}, + {&tex_black, &tex_black, {4, 1, 0}, {0,0,0}}, + {&tex_black, &tex_black, {6, 7, 5}, {0,0,0}}, + {&tex_black, &tex_black, {6, 5, 4}, {0,0,0}}, + {&tex_black, &tex_black, {3, 2, 7}, {0,0,0}}, + {&tex_black, &tex_black, {3, 7, 6}, {0,0,0}}, + {&tex_black, &tex_black, {6, 4, 0}, {0,0,0}}, + {&tex_black, &tex_black, {6, 0, 3}, {0,0,0}}, + {&tex_black, &tex_black, {1, 5, 7}, {0,0,0}}, + {&tex_black, &tex_black, {1, 7, 2}, {0,0,0}}, + {&tex_black, &tex_black, {8, 9, 10}, {0,0,0}}, + {&tex_black, &tex_black, {8, 10, 11}, {0,0,0}}, + {&tex_black, &tex_black, {12, 13, 9}, {0,0,0}}, + {&tex_black, &tex_black, {12, 9, 8}, {0,0,0}}, + {&tex_black, &tex_black, {14, 15, 13}, {0,0,0}}, + {&tex_black, &tex_black, {14, 13, 12}, {0,0,0}}, + {&tex_black, &tex_black, {11, 10, 15}, {0,0,0}}, + {&tex_black, &tex_black, {11, 15, 14}, {0,0,0}}, + {&tex_black, &tex_black, {14, 12, 8}, {0,0,0}}, + {&tex_black, &tex_black, {14, 8, 11}, {0,0,0}}, + {&tex_black, &tex_black, {9, 13, 15}, {0,0,0}}, + {&tex_black, &tex_black, {9, 15, 10}, {0,0,0}}, + {&tex_black, &tex_black, {16, 17, 18}, {0,0,0}}, + {&tex_black, &tex_black, {16, 18, 19}, {0,0,0}}, + {&tex_black, &tex_black, {20, 21, 17}, {0,0,0}}, + {&tex_black, &tex_black, {20, 17, 16}, {0,0,0}}, + {&tex_black, &tex_black, {22, 23, 21}, {0,0,0}}, + {&tex_black, &tex_black, {22, 21, 20}, {0,0,0}}, + {&tex_black, &tex_black, {19, 18, 23}, {0,0,0}}, + {&tex_black, &tex_black, {19, 23, 22}, {0,0,0}}, + {&tex_black, &tex_black, {22, 20, 16}, {0,0,0}}, + {&tex_black, &tex_black, {22, 16, 19}, {0,0,0}}, + {&tex_black, &tex_black, {17, 21, 23}, {0,0,0}}, + {&tex_black, &tex_black, {17, 23, 18}, {0,0,0}}, + {&tex_black, &tex_black, {24, 25, 26}, {0,0,0}}, + {&tex_black, &tex_black, {24, 26, 27}, {0,0,0}}, + {&tex_black, &tex_black, {28, 29, 25}, {0,0,0}}, + {&tex_black, &tex_black, {28, 25, 24}, {0,0,0}}, + {&tex_black, &tex_black, {30, 31, 29}, {0,0,0}}, + {&tex_black, &tex_black, {30, 29, 28}, {0,0,0}}, + {&tex_black, &tex_black, {27, 26, 31}, {0,0,0}}, + {&tex_black, &tex_black, {27, 31, 30}, {0,0,0}}, + {&tex_black, &tex_black, {30, 28, 24}, {0,0,0}}, + {&tex_black, &tex_black, {30, 24, 27}, {0,0,0}}, + {&tex_black, &tex_black, {25, 29, 31}, {0,0,0}}, + {&tex_black, &tex_black, {25, 31, 26}, {0,0,0}}, + {&tex_black, &tex_black, {32, 33, 34}, {0,0,0}}, + {&tex_black, &tex_black, {32, 34, 35}, {0,0,0}}, + {&tex_black, &tex_black, {36, 37, 33}, {0,0,0}}, + {&tex_black, &tex_black, {36, 33, 32}, {0,0,0}}, + {&tex_black, &tex_black, {38, 39, 37}, {0,0,0}}, + {&tex_black, &tex_black, {38, 37, 36}, {0,0,0}}, + {&tex_black, &tex_black, {35, 34, 39}, {0,0,0}}, + {&tex_black, &tex_black, {35, 39, 38}, {0,0,0}}, + {&tex_black, &tex_black, {38, 36, 32}, {0,0,0}}, + {&tex_black, &tex_black, {38, 32, 35}, {0,0,0}}, + {&tex_black, &tex_black, {33, 37, 39}, {0,0,0}}, + {&tex_black, &tex_black, {33, 39, 34}, {0,0,0}}, + {&tex_black, &tex_black, {40, 41, 42}, {0,0,0}}, + {&tex_black, &tex_black, {40, 42, 43}, {0,0,0}}, + {&tex_black, &tex_black, {44, 45, 41}, {0,0,0}}, + {&tex_black, &tex_black, {44, 41, 40}, {0,0,0}}, + {&tex_black, &tex_black, {46, 47, 45}, {0,0,0}}, + {&tex_black, &tex_black, {46, 45, 44}, {0,0,0}}, + {&tex_black, &tex_black, {43, 42, 47}, {0,0,0}}, + {&tex_black, &tex_black, {43, 47, 46}, {0,0,0}}, + {&tex_black, &tex_black, {46, 44, 40}, {0,0,0}}, + {&tex_black, &tex_black, {46, 40, 43}, {0,0,0}}, + {&tex_black, &tex_black, {41, 45, 47}, {0,0,0}}, + {&tex_black, &tex_black, {41, 47, 42}, {0,0,0}}, + {&tex_black, &tex_black, {48, 49, 50}, {0,0,0}}, + {&tex_black, &tex_black, {48, 50, 51}, {0,0,0}}, + {&tex_black, &tex_black, {52, 53, 49}, {0,0,0}}, + {&tex_black, &tex_black, {52, 49, 48}, {0,0,0}}, + {&tex_black, &tex_black, {54, 55, 53}, {0,0,0}}, + {&tex_black, &tex_black, {54, 53, 52}, {0,0,0}}, + {&tex_black, &tex_black, {51, 50, 55}, {0,0,0}}, + {&tex_black, &tex_black, {51, 55, 54}, {0,0,0}}, + {&tex_black, &tex_black, {54, 52, 48}, {0,0,0}}, + {&tex_black, &tex_black, {54, 48, 51}, {0,0,0}}, + {&tex_black, &tex_black, {49, 53, 55}, {0,0,0}}, + {&tex_black, &tex_black, {49, 55, 50}, {0,0,0}}, + {&tex_black, &tex_black, {56, 57, 58}, {0,0,0}}, + {&tex_black, &tex_black, {56, 58, 59}, {0,0,0}}, + {&tex_black, &tex_black, {60, 61, 57}, {0,0,0}}, + {&tex_black, &tex_black, {60, 57, 56}, {0,0,0}}, + {&tex_black, &tex_black, {62, 63, 61}, {0,0,0}}, + {&tex_black, &tex_black, {62, 61, 60}, {0,0,0}}, + {&tex_black, &tex_black, {59, 58, 63}, {0,0,0}}, + {&tex_black, &tex_black, {59, 63, 62}, {0,0,0}}, + {&tex_black, &tex_black, {62, 60, 56}, {0,0,0}}, + {&tex_black, &tex_black, {62, 56, 59}, {0,0,0}}, + {&tex_black, &tex_black, {57, 61, 63}, {0,0,0}}, + {&tex_black, &tex_black, {57, 63, 58}, {0,0,0}}, + {&tex_black, &tex_black, {64, 65, 66}, {0,0,0}}, + {&tex_black, &tex_black, {64, 66, 67}, {0,0,0}}, + {&tex_black, &tex_black, {68, 69, 65}, {0,0,0}}, + {&tex_black, &tex_black, {68, 65, 64}, {0,0,0}}, + {&tex_black, &tex_black, {70, 71, 69}, {0,0,0}}, + {&tex_black, &tex_black, {70, 69, 68}, {0,0,0}}, + {&tex_black, &tex_black, {67, 66, 71}, {0,0,0}}, + {&tex_black, &tex_black, {67, 71, 70}, {0,0,0}}, + {&tex_black, &tex_black, {70, 68, 64}, {0,0,0}}, + {&tex_black, &tex_black, {70, 64, 67}, {0,0,0}}, + {&tex_black, &tex_black, {65, 69, 71}, {0,0,0}}, + {&tex_black, &tex_black, {65, 71, 66}, {0,0,0}}, + {&tex_black, &tex_black, {72, 73, 74}, {0,0,0}}, + {&tex_black, &tex_black, {72, 74, 75}, {0,0,0}}, + {&tex_black, &tex_black, {76, 77, 73}, {0,0,0}}, + {&tex_black, &tex_black, {76, 73, 72}, {0,0,0}}, + {&tex_black, &tex_black, {78, 79, 77}, {0,0,0}}, + {&tex_black, &tex_black, {78, 77, 76}, {0,0,0}}, + {&tex_black, &tex_black, {75, 74, 79}, {0,0,0}}, + {&tex_black, &tex_black, {75, 79, 78}, {0,0,0}}, + {&tex_black, &tex_black, {78, 76, 72}, {0,0,0}}, + {&tex_black, &tex_black, {78, 72, 75}, {0,0,0}}, + {&tex_black, &tex_black, {73, 77, 79}, {0,0,0}}, + {&tex_black, &tex_black, {73, 79, 74}, {0,0,0}}, + {&tex_black, &tex_black, {80, 81, 82}, {0,0,0}}, + {&tex_black, &tex_black, {80, 82, 83}, {0,0,0}}, + {&tex_black, &tex_black, {84, 85, 81}, {0,0,0}}, + {&tex_black, &tex_black, {84, 81, 80}, {0,0,0}}, + {&tex_black, &tex_black, {86, 87, 85}, {0,0,0}}, + {&tex_black, &tex_black, {86, 85, 84}, {0,0,0}}, + {&tex_black, &tex_black, {83, 82, 87}, {0,0,0}}, + {&tex_black, &tex_black, {83, 87, 86}, {0,0,0}}, + {&tex_black, &tex_black, {86, 84, 80}, {0,0,0}}, + {&tex_black, &tex_black, {86, 80, 83}, {0,0,0}}, + {&tex_black, &tex_black, {81, 85, 87}, {0,0,0}}, + {&tex_black, &tex_black, {81, 87, 82}, {0,0,0}}, + {&tex_black, &tex_black, {88, 89, 90}, {0,0,0}}, + {&tex_black, &tex_black, {88, 90, 91}, {0,0,0}}, + {&tex_black, &tex_black, {92, 93, 89}, {0,0,0}}, + {&tex_black, &tex_black, {92, 89, 88}, {0,0,0}}, + {&tex_black, &tex_black, {94, 95, 93}, {0,0,0}}, + {&tex_black, &tex_black, {94, 93, 92}, {0,0,0}}, + {&tex_black, &tex_black, {91, 90, 95}, {0,0,0}}, + {&tex_black, &tex_black, {91, 95, 94}, {0,0,0}}, + {&tex_black, &tex_black, {94, 92, 88}, {0,0,0}}, + {&tex_black, &tex_black, {94, 88, 91}, {0,0,0}}, + {&tex_black, &tex_black, {89, 93, 95}, {0,0,0}}, + {&tex_black, &tex_black, {89, 95, 90}, {0,0,0}}, + {&tex_black, &tex_black, {96, 97, 98}, {0,0,0}}, + {&tex_black, &tex_black, {96, 98, 99}, {0,0,0}}, + {&tex_black, &tex_black, {100, 101, 97}, {0,0,0}}, + {&tex_black, &tex_black, {100, 97, 96}, {0,0,0}}, + {&tex_black, &tex_black, {102, 103, 101}, {0,0,0}}, + {&tex_black, &tex_black, {102, 101, 100}, {0,0,0}}, + {&tex_black, &tex_black, {99, 98, 103}, {0,0,0}}, + {&tex_black, &tex_black, {99, 103, 102}, {0,0,0}}, + {&tex_black, &tex_black, {102, 100, 96}, {0,0,0}}, + {&tex_black, &tex_black, {102, 96, 99}, {0,0,0}}, + {&tex_black, &tex_black, {97, 101, 103}, {0,0,0}}, + {&tex_black, &tex_black, {97, 103, 98}, {0,0,0}}, + {&tex_black, &tex_black, {104, 105, 106}, {0,0,0}}, + {&tex_black, &tex_black, {104, 106, 107}, {0,0,0}}, + {&tex_black, &tex_black, {108, 109, 105}, {0,0,0}}, + {&tex_black, &tex_black, {108, 105, 104}, {0,0,0}}, + {&tex_black, &tex_black, {110, 111, 109}, {0,0,0}}, + {&tex_black, &tex_black, {110, 109, 108}, {0,0,0}}, + {&tex_black, &tex_black, {107, 106, 111}, {0,0,0}}, + {&tex_black, &tex_black, {107, 111, 110}, {0,0,0}}, + {&tex_black, &tex_black, {110, 108, 104}, {0,0,0}}, + {&tex_black, &tex_black, {110, 104, 107}, {0,0,0}}, + {&tex_black, &tex_black, {105, 109, 111}, {0,0,0}}, + {&tex_black, &tex_black, {105, 111, 106}, {0,0,0}}, + {&tex_black, &tex_black, {112, 113, 114}, {0,0,0}}, + {&tex_black, &tex_black, {112, 114, 115}, {0,0,0}}, + {&tex_black, &tex_black, {116, 117, 113}, {0,0,0}}, + {&tex_black, &tex_black, {116, 113, 112}, {0,0,0}}, + {&tex_black, &tex_black, {118, 119, 117}, {0,0,0}}, + {&tex_black, &tex_black, {118, 117, 116}, {0,0,0}}, + {&tex_black, &tex_black, {115, 114, 119}, {0,0,0}}, + {&tex_black, &tex_black, {115, 119, 118}, {0,0,0}}, + {&tex_black, &tex_black, {118, 116, 112}, {0,0,0}}, + {&tex_black, &tex_black, {118, 112, 115}, {0,0,0}}, + {&tex_black, &tex_black, {113, 117, 119}, {0,0,0}}, + {&tex_black, &tex_black, {113, 119, 114}, {0,0,0}}, + {&tex_black, &tex_black, {120, 121, 122}, {0,0,0}}, + {&tex_black, &tex_black, {120, 122, 123}, {0,0,0}}, + {&tex_black, &tex_black, {124, 125, 121}, {0,0,0}}, + {&tex_black, &tex_black, {124, 121, 120}, {0,0,0}}, + {&tex_black, &tex_black, {126, 127, 125}, {0,0,0}}, + {&tex_black, &tex_black, {126, 125, 124}, {0,0,0}}, + {&tex_black, &tex_black, {123, 122, 127}, {0,0,0}}, + {&tex_black, &tex_black, {123, 127, 126}, {0,0,0}}, + {&tex_black, &tex_black, {126, 124, 120}, {0,0,0}}, + {&tex_black, &tex_black, {126, 120, 123}, {0,0,0}}, + {&tex_black, &tex_black, {121, 125, 127}, {0,0,0}}, + {&tex_black, &tex_black, {121, 127, 122}, {0,0,0}}, +}; +const Mesh huma_m = {huma_v, 128, huma_t, 1, huma_f, 192}; +Object huma_o1 = {&huma_m, {0, 20, 0}, N, 0}; +Object* objects_exemple[] = {&huma_o1}; Map map_exemple = {objects_exemple, 1, true, true}; - - // MOULIN #define L1 30 #define L2 35 @@ -326,6 +636,12 @@ const VertexPoint pale_moulin_v[] = { {0, -E, -R1}, {0, 0, 0} }; + +// {3,-9,-60} +// {-3,9,-60} +// {0,7,-13} +// {0,-7,-13} +// {0,0,0} const TexturePoint pale_moulin_t[] = { LB, // 0 RB, // 1 diff --git a/src/windmill.hpp b/src/windmill.hpp index 8b798ee..c4a0825 100644 --- a/src/windmill.hpp +++ b/src/windmill.hpp @@ -9,6 +9,7 @@ #include "camera.hpp" #include "Geometry.hpp" #include +#include #define get_vram_address() ((char *)gint_vram) @@ -111,17 +112,11 @@ struct Mesh class WMesh { public: - Vertex* v; - int v_length; - int v_length_allocated; - TexturePoint* t; - int t_length; - int t_length_allocated; - Face* f; - int f_length; - int f_length_allocated; - - void from_mesh(const Mesh* mesh, int margin); + std::vector v; + std::vector t; + std::vector f; + + void from_mesh(const Mesh* mesh); void free_memory(); void add_vertex(Vertex vertex); }; @@ -187,13 +182,13 @@ public: void draw_body(); // transformation 3D des vertex - void transform_model_to_world(Object* object, Vertex vertex[], int vertex_length); - void transform_world_to_camera(Vertex vertex[], int vertex_length); - void transform_camera_to_screen(Vertex vertex[], int vertex_length); + void transform_model_to_world(Object* object, std::vector &vertex); + void transform_world_to_camera(std::vector &vertex); + void transform_camera_to_screen(std::vector &vertex); // test visiblilite bool object_in_frustrum(Object* object); - void clip_frustrum(WMesh* mesh); + void clip_frustrum(WMesh &mesh); bool inside_frustrum(Vertex vertex, Plane plane, int offset = 0); Vertex clip_plane(Vertex vertex[], int vertex_length); Vertex clip_onto_plane(Vertex vertexA, Vertex vertexB, Plane plane); @@ -201,7 +196,7 @@ public: int get_visible_face(Vertex* a, Vertex* b, Vertex* c); // dessin des triangles - void render_triangles(WMesh mesh); + void render_triangles(WMesh &mesh); void render_triangle_texture(Vertex* vertex1, Vertex* vertex2, Vertex* vertex3, const Texture* texture); void render_triangle_color(Vertex* vertex0, Vertex* vertex1, Vertex* vertex2, color_t color); diff --git a/src/windmill_clip.cpp b/src/windmill_clip.cpp index 534ad3f..473da39 100644 --- a/src/windmill_clip.cpp +++ b/src/windmill_clip.cpp @@ -28,11 +28,12 @@ extern Texture tex_black; bool Windmill::object_in_frustrum(Object* object) { Vertex centre(object->sphere.x, object->sphere.y, object->sphere.z); + std::vector vCentre = {centre}; // calcul des coordonnees dans le repère monde apres rotation et translation du centre de l objet - transform_model_to_world(object, ¢re, 1); + transform_model_to_world(object, vCentre); // calcul des coordonnees du centre dans le repère camera apres rotation et translation de la camera - transform_world_to_camera(¢re, 1); + transform_world_to_camera(vCentre); // si la camera est dans la sphere if (centre.x*centre.x + centre.y*centre.y + centre.z*centre.z < object->sphere.square_radius) @@ -84,20 +85,20 @@ bool Windmill::object_in_frustrum(Object* object) return false;*/ } -void Windmill::clip_frustrum(WMesh* mesh) +void Windmill::clip_frustrum(WMesh &mesh) { //pour chaque plan for (int p = 0; p<5 ; p++) { Plane plane = camera.frustrum.sides[p]; - int init_f_length = mesh->f_length; // car sinon on va faire du clipping sur des points nouveaux issues du clipping... + int init_f_length = mesh.f.size(); // car sinon on va faire du clipping sur des points nouveaux issues du clipping... // pour chaque triangle for (int f=0; ff[f]; + Face triangle = mesh.f[f]; if (triangle.visible) { @@ -112,19 +113,19 @@ void Windmill::clip_frustrum(WMesh* mesh) for (int E = 0; E<3; E++) { // 2 vertexs correspondants à chaque segment - Vertex vertexE(mesh->v[triangle.v[E]].x, mesh->v[triangle.v[E]].y, mesh->v[triangle.v[E]].z, mesh->t[triangle.t[E]].u,mesh->t[triangle.t[E]].v); - Vertex vertexS(mesh->v[triangle.v[S]].x, mesh->v[triangle.v[S]].y, mesh->v[triangle.v[S]].z, mesh->t[triangle.t[S]].u,mesh->t[triangle.t[S]].v); + Vertex vertexE(mesh.v[triangle.v[E]].x, mesh.v[triangle.v[E]].y, mesh.v[triangle.v[E]].z, mesh.t[triangle.t[E]].u,mesh.t[triangle.t[E]].v); + Vertex vertexS(mesh.v[triangle.v[S]].x, mesh.v[triangle.v[S]].y, mesh.v[triangle.v[S]].z, mesh.t[triangle.t[S]].u,mesh.t[triangle.t[S]].v); // teste si un des deux points du segment est en dehors du frustrum if (inside_frustrum(vertexE, plane) == true) { if (inside_frustrum(vertexS, plane) == false) { // on sauvegarde dans v_ok - v_ok[ok_indice] = mesh->v_length; - t_ok[ok_indice] = mesh->t_length; + v_ok[ok_indice] = mesh.v.size(); + t_ok[ok_indice] = mesh.t.size(); ok_indice++; // on créée un vertex sécant de notre segment et du bord de l'écran - mesh->add_vertex(clip_onto_plane(vertexE, vertexS, plane)); + mesh.add_vertex(clip_onto_plane(vertexE, vertexS, plane)); } v_ok[ok_indice] = triangle.v[E]; @@ -134,22 +135,22 @@ void Windmill::clip_frustrum(WMesh* mesh) else if (inside_frustrum(vertexS, plane) == true) { // on sauvegarde dans v_ok - v_ok[ok_indice] = mesh->v_length; - t_ok[ok_indice] = mesh->t_length; + v_ok[ok_indice] = mesh.v.size(); + t_ok[ok_indice] = mesh.t.size(); ok_indice++; // on créée un vertex sécant de notre segment et du bord de l'écran - mesh->add_vertex(clip_onto_plane(vertexE, vertexS, plane)); + mesh.add_vertex(clip_onto_plane(vertexE, vertexS, plane)); } S = E; } // maintenant on passe à la génération des faces à partir de nos nouveaux segments - + // aucun point dans le frustrum if (ok_indice == 0) { - mesh->f[f].visible = false; + mesh.f[f].visible = false; } // soit les 3 points à l'intérieur du triangle, soit 2 point ouside -> on modifie la face en cours @@ -163,7 +164,7 @@ void Windmill::clip_frustrum(WMesh* mesh) edited_triangle.v[i] = v_ok[i]; edited_triangle.t[i] = t_ok[i]; } - mesh->f[f] = edited_triangle; // pas de verif d'overflow + mesh.f[f] = edited_triangle; // pas de verif d'overflow } // 1 point en dehors = 2 triangles -> on modifie face en cours, et on ajoute une face @@ -173,6 +174,7 @@ void Windmill::clip_frustrum(WMesh* mesh) Face new_triangle; new_triangle.texture_front = triangle.texture_front; new_triangle.texture_back = triangle.texture_back; + new_triangle.v[0] = v_ok[0]; new_triangle.t[0] = t_ok[0]; new_triangle.v[1] = v_ok[2]; @@ -180,8 +182,7 @@ void Windmill::clip_frustrum(WMesh* mesh) new_triangle.v[2] = v_ok[3]; new_triangle.t[2] = t_ok[3]; - mesh->f[mesh->f_length] = new_triangle; // pas de verif d'overflow - mesh->f_length++; + mesh.f.push_back(new_triangle); // pas de verif d'overflow } } diff --git a/src/windmill_draw.cpp b/src/windmill_draw.cpp index 13a55d8..2dedd30 100644 --- a/src/windmill_draw.cpp +++ b/src/windmill_draw.cpp @@ -76,13 +76,13 @@ void Windmill::draw_horizon() int hx = camera.x + distance * camera.cos_yaw; int hy = camera.y + distance * camera.sin_yaw; - Vertex horizon = Vertex(hx, hy, 0); + std::vector horizon = {Vertex(hx, hy, 0)}; - transform_world_to_camera(&horizon, 1); - transform_camera_to_screen(&horizon, 1); - if (inside_viewport(horizon.x, horizon.y)) + transform_world_to_camera(horizon); + transform_camera_to_screen(horizon); + if (inside_viewport(horizon[0].x, horizon[0].y)) { - dline(viewport.x1, horizon.y, viewport.x2, horizon.y, C_BLACK); + dline(viewport.x1, horizon[0].y, viewport.x2, horizon[0].y, C_BLACK); } } @@ -107,14 +107,14 @@ void Windmill::draw_ground() int x = dx + i*esp; int y = dy + j*esp; - Vertex ground = Vertex(x, y, 0); - transform_world_to_camera(&ground, 1); - if (ground.z > 0) + std::vector ground = {Vertex(x, y, 0)}; + transform_world_to_camera(ground); + if (ground[0].z > 0) { - transform_camera_to_screen(&ground, 1); - if (inside_viewport(ground.x, ground.y) == true) + transform_camera_to_screen(ground); + if (inside_viewport(ground[0].x, ground[0].y) == true) { - dpixel(ground.x, ground.y, C_BLACK); + dpixel(ground[0].x, ground[0].y, C_BLACK); } } } @@ -125,6 +125,7 @@ void Windmill::draw_ground() void Windmill::draw_objects() { + // pour chaque objet for(i=0; iobject_length; i++) { // récupère l'objet en cours @@ -137,23 +138,25 @@ void Windmill::draw_objects() if (object-> visible && object_in_frustrum(object)) { // copie le mesh avec plus de memoires disponible pour possiblement ajouter des points au clipping - WMesh mesh; mesh.from_mesh(object->mesh, 20); + WMesh mesh; + mesh.from_mesh(object->mesh); + // calcul des coordonnees dans le repère monde apres rotation et translation de l objet - transform_model_to_world(object, mesh.v, mesh.v_length); + transform_model_to_world(object, mesh.v); // calcul des coordonnees dans le repère camera apres rotation et translation de la camera - transform_world_to_camera(mesh.v, mesh.v_length); + transform_world_to_camera(mesh.v); // coupe 3D selon le frustrum de la camera - clip_frustrum(&mesh); // SI OBJECT IN FRUSTRUM DIT QUE L'OBJET EST PARTEILLEMENT DANS FRUSTRUM + clip_frustrum(mesh); // SI OBJECT IN FRUSTRUM DIT QUE L'OBJET EST PARTEILLEMENT DANS FRUSTRUM // calcul des coordonnes apres perspective et decalage au centre de l ecran - transform_camera_to_screen(mesh.v, mesh.v_length); + transform_camera_to_screen(mesh.v); if (log) { - for (int v = 0; v &vertex) { int cos = 0, sin = 0; @@ -46,7 +46,7 @@ void Windmill::transform_model_to_world(Object* object, Vertex vertex[], int ver } // transformation de chaque vertex - for (int k = 0; k &vertex) { - for (int k = 0; k &vertex) { - for (int k = 0; kv_length; - v_length_allocated = mesh->v_length * margin; - v = (Vertex*) malloc(v_length_allocated * sizeof(Vertex)); - if(v == NULL){ - debug_pop("FATAL ERROR IN \nALLOCATION OF VERTEX\n(WMesh::from_mesh)"); - debug_pop("TOTAL MALLOC SIZE : \n%i", v_length_allocated * sizeof(Vertex)); - exit(0); - } - for (int i = 0; i < mesh->v_length; i++) - { - //v[i].FromVertexPoint(mesh->v[i]) - v[i].x = mesh->v[i].x; - v[i].y = mesh->v[i].y; - v[i].z = mesh->v[i].z; - } - - t_length = mesh->t_length; - t_length_allocated = mesh->t_length * margin; - t = (TexturePoint*) malloc(t_length_allocated * sizeof(TexturePoint)); - if(t == NULL){ - debug_pop("FATAL ERROR IN \nALLOCATION OF TEXTURE\n (WMesh::from_mesh)"); - debug_pop("TOTAL MALLOC SIZE : \n%i", t_length_allocated * sizeof(TexturePoint)); - exit(0); - } - memcpy(t, mesh->t, mesh->t_length * sizeof(TexturePoint)); - - f_length = mesh->f_length; - f_length_allocated = mesh->f_length * margin; - f = (Face*) malloc(f_length_allocated * sizeof(Face)); - if(f == NULL){ - debug_pop("FATAL ERROR IN \nALLOCATION OF FACE\nWMesh::from_mesh)"); - debug_pop("TOTAL MALLOC SIZE : \n%i" + f_length_allocated * sizeof(Face)); - exit(0); - } - memcpy(f, mesh->f, mesh->f_length * sizeof(Face)); -} - void WMesh::free_memory() { - free(v); - free(t); - free(f); + // no sense with std::vector } void WMesh::add_vertex(Vertex vertex) { - v[v_length].x = vertex.x; - v[v_length].y = vertex.y; - v[v_length].z = vertex.z; - t[t_length].u = vertex.u; - t[t_length].v = vertex.v; + v.push_back(vertex); + + TexturePoint tex; + tex.u = vertex.u; + tex.v = vertex.v; + + t.push_back(tex); +} + +void WMesh::from_mesh(const Mesh* mesh) +{ + v.clear(); + for (int i = 0; i < mesh->v_length; i++) + { + v.push_back(Vertex(mesh->v[i].x,mesh->v[i].y,mesh->v[i].z)); + } + + t.clear(); + for (int i = 0; i < mesh->t_length; i++) + { + TexturePoint tex; + tex.u = mesh->t[i].u; + tex.v = mesh->t[i].v; + t.push_back(tex); + } + f.clear(); + for (int i = 0; i < mesh->f_length; i++) + { + Face fa; + fa.texture_front = mesh->f[i].texture_front; + fa.texture_back = mesh->f[i].texture_back; + memcpy(fa.t,mesh->f[i].t,3); + memcpy(fa.v,mesh->f[i].v,3); + fa.visible = mesh->f[i].visible; + + f.push_back(fa); + } - if (v_length < v_length_allocated) v_length++; - if (t_length < t_length_allocated) t_length++; }