use vectors for clipping

This commit is contained in:
Potter360 2023-01-08 11:32:40 +01:00
parent dd686b1887
commit 451f58f307
8 changed files with 435 additions and 132 deletions

View File

@ -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(

View File

@ -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);
}

View File

@ -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

View File

@ -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);

View File

@ -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, &centre, 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(&centre, 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
}
}

View File

@ -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];

View File

@ -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;

View File

@ -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++;
}