use vectors for clipping
This commit is contained in:
parent
dd686b1887
commit
451f58f307
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
358
src/map.cpp
358
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
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "camera.hpp"
|
||||
#include "Geometry.hpp"
|
||||
#include <stdio.h>
|
||||
#include <vector>
|
||||
|
||||
#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<Vertex> v;
|
||||
std::vector<TexturePoint> t;
|
||||
std::vector<Face> 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> &vertex);
|
||||
void transform_world_to_camera(std::vector<Vertex> &vertex);
|
||||
void transform_camera_to_screen(std::vector<Vertex> &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);
|
||||
|
||||
|
|
|
@ -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<Vertex> 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; f<init_f_length; f++)
|
||||
{
|
||||
// triangle en cours
|
||||
Face triangle = mesh->f[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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<Vertex> 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<Vertex> 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; i<map->object_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<mesh.v_length; v++)
|
||||
for (int v = 0; v<mesh.v.size(); v++)
|
||||
{
|
||||
dpixel(mesh.v[v].x, mesh.v[v].y, C_BLACK);
|
||||
}
|
||||
|
@ -347,9 +350,9 @@ void Windmill::draw_body()
|
|||
//----------------------------------------------------------------------------------------------------
|
||||
// DESSIN DES TRIANGLES
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
void Windmill::render_triangles(WMesh mesh)
|
||||
void Windmill::render_triangles(WMesh &mesh)
|
||||
{
|
||||
for (int f = 0; f<mesh.f_length; f++)
|
||||
for (int f = 0; f<mesh.f.size(); f++)
|
||||
{
|
||||
Face triangle = mesh.f[f];
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ extern Texture tex_black;
|
|||
//----------------------------------------------------------------------------------------------------
|
||||
// TRANSFORMATION 3D
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
void Windmill::transform_model_to_world(Object* object, Vertex vertex[], int vertex_length)
|
||||
void Windmill::transform_model_to_world(Object* object, std::vector<Vertex> &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_length; k++)
|
||||
for (int k = 0; k<vertex.size(); k++)
|
||||
{
|
||||
int vertex_x = vertex[k].x;
|
||||
int vertex_y = vertex[k].y;
|
||||
|
@ -102,9 +102,9 @@ void Windmill::transform_model_to_world(Object* object, Vertex vertex[], int ver
|
|||
}
|
||||
|
||||
|
||||
void Windmill::transform_world_to_camera(Vertex vertex[], int vertex_length)
|
||||
void Windmill::transform_world_to_camera(std::vector<Vertex> &vertex)
|
||||
{
|
||||
for (int k = 0; k<vertex_length; k++)
|
||||
for (int k = 0; k<vertex.size(); k++)
|
||||
{
|
||||
// translation
|
||||
int vertex_x = int(camera.x) - vertex[k].x;
|
||||
|
@ -118,9 +118,9 @@ void Windmill::transform_world_to_camera(Vertex vertex[], int vertex_length)
|
|||
}
|
||||
|
||||
|
||||
void Windmill::transform_camera_to_screen(Vertex vertex[], int vertex_length)
|
||||
void Windmill::transform_camera_to_screen(std::vector<Vertex> &vertex)
|
||||
{
|
||||
for (int k = 0; k<vertex_length; k++)
|
||||
for (int k = 0; k<vertex.size(); k++)
|
||||
{
|
||||
// perspective
|
||||
vertex[k].x = (vertex[k].x * camera.scale_coef) / vertex[k].z + shift_x;
|
||||
|
|
|
@ -195,61 +195,49 @@ void Vertex::set_xyz(int _x, int _y, int _z)
|
|||
// WMESH
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
|
||||
void WMesh::from_mesh(const Mesh* mesh, int margin)
|
||||
{
|
||||
// Double allocated memory because 3D clipping could generate more vertices and copy mesh into working mesh
|
||||
v_length = mesh->v_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++;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue