- Inici de soport per a diferents altures de sostre i piso dels sectors

This commit is contained in:
2025-09-28 13:14:04 +02:00
parent 960bc8b995
commit cae12a86af

View File

@@ -9,6 +9,8 @@
struct vec2 { float x, y; };
struct wall { Uint16 v1, v2; vec2 normal; float u1, u2; int portal; };
struct sector {
float floor_height;
float ceiling_height;
std::vector<wall> walls;
std::vector<vec2> verts;
};
@@ -25,7 +27,8 @@ std::vector<sector> sectors;
int current_sector;
vec2 position = { 128.0f, 192.0f };
float height = 32.0f;
float height = 48.0f;
float real_height = 48.0f;
float orientation = 90.0f;
float accel = 500.0f;
@@ -133,6 +136,9 @@ void createMap()
current_sector = 0;
{
sector s;
s.floor_height = 0.0f;
s.ceiling_height = 128.0f;
s.verts.push_back({ 64.0f, 0.0f});
s.verts.push_back({256.0f, 0.0f});
s.verts.push_back({256.0f, 64.0f});
@@ -155,6 +161,9 @@ void createMap()
{
sector s;
s.floor_height = 0.0f;
s.ceiling_height = 128.0f;
s.verts.push_back({256.0f, 0.0f});
s.verts.push_back({ 64.0f, 0.0f});
s.verts.push_back({ 64.0f,-256.0f});
@@ -203,16 +212,19 @@ void drawColumn(sector &s, int screen_column, int start, int end, float a_inc, v
}
if (w)
{
const int tex_height = 64;
const float sector_height = s.ceiling_height - s.floor_height;
map::putp(result.x, result.y, 6);
dist *= SDL_cosf(a_inc*DEG_TO_RAD);
const vec2 AB = {s.verts[w->v2].x-s.verts[w->v1].x, s.verts[w->v2].y-s.verts[w->v1].y};
const vec2 AP = {result.x-s.verts[w->v1].x, result.y-s.verts[w->v1].y};
float v = dot(AP,AB) / dot(AB,AB); v *= w->u2; v = (v-int(v))*64.0f;
//const float v = distance(s.verts[w.v1], result);
float wall_height = (64*277)/dist;
float dpix = 64/wall_height;
float v = dot(AP,AB) / dot(AB,AB); v *= w->u2; v = (v-int(v))*tex_height;
float wall_height = (sector_height*277)/dist; // [64=altura sector]
float dpix = tex_height/wall_height; // [64=crec que altura sector]
float cpix = 0;
float wall_start = 120-(wall_height/64)*(64-height);
float wall_start = 120-(wall_height/sector_height)*(sector_height-(height-s.floor_height)); // [64=els dos crec que altura sector]
if (wall_start<start) {
cpix = (start-wall_start)*dpix;
wall_height -= (start-wall_start);
@@ -221,19 +233,20 @@ void drawColumn(sector &s, int screen_column, int start, int end, float a_inc, v
// Pinta el sostre
for (int y=start; y<wall_start-1; y++) {
float straight_dist = (277 * (64-height)) / (y - (240 >> 1));
float straight_dist = (277 * (sector_height-(height-s.floor_height))) / (y - (240 >> 1));
float actual_dist = straight_dist / SDL_cosf(a_inc*DEG_TO_RAD);
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) - position.x)) % 64;
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) - position.y)) % 64;
putp(screen_column, y, gif[tx+ty*64]);
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) - position.x)) % tex_height;
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) - position.y)) % tex_height;
putp(screen_column, y, gif[tx+ty*tex_height]);
}
if (w->portal == -1)
{
// Pinta la pared
for (int i=0; i<wall_height; ++i) {
if (wall_start+i>=end) break;
putp(screen_column, wall_start+i, gif[(int(v)%64)+int(cpix)*64]);
putp(screen_column, wall_start+i, gif[(int(v)%tex_height)+int(cpix)*tex_height]);
cpix += dpix;
}
} else {
@@ -244,11 +257,11 @@ void drawColumn(sector &s, int screen_column, int start, int end, float a_inc, v
// Pinta el piso
int paint_end = wall_start+wall_height-1;
for (int y=paint_end+1; y<end-1; y++) {
float straight_dist = (277 * height) / (y - (240 >> 1));
float straight_dist = (277 * (height-s.floor_height)) / (y - (240 >> 1));
float actual_dist = straight_dist / SDL_cosf(a_inc*DEG_TO_RAD);
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) + position.x)) % 64;
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) + position.y)) % 64;
putp(screen_column, y, gif[tx+ty*64]);
int tx = abs(int(actual_dist * SDL_cosf(angle*DEG_TO_RAD) + position.x)) % tex_height;
int ty = abs(int(actual_dist * SDL_sinf(angle*DEG_TO_RAD) + position.y)) % tex_height;
putp(screen_column, y, gif[tx+ty*tex_height]);
}
//line(screen_column, 120-(wall_height), screen_column, 120+(wall_height), 5);
}
@@ -337,7 +350,7 @@ int main(int argc, char *argv[])
millis = SDL_GetTicks();
bobbing += dt*1000.0f;
height = 32 + SDL_sinf(bobbing*DEG_TO_RAD)*(speed/100.0f);
height = real_height + SDL_sinf(bobbing*DEG_TO_RAD)*(speed/100.0f);
while (SDL_PollEvent(&e))
{
@@ -346,8 +359,31 @@ int main(int argc, char *argv[])
}
const bool *keys = SDL_GetKeyboardState(NULL);
if (keys[SDL_SCANCODE_Q]) height += dt*speed;
if (keys[SDL_SCANCODE_A]) height -= dt*speed;
if (keys[SDL_SCANCODE_Q])
{
real_height += dt*100.0f;
}
if (keys[SDL_SCANCODE_A])
{
real_height -= dt*100.0f;
}
if (keys[SDL_SCANCODE_W])
{
//real_height += dt*100.0f;
sectors[0].ceiling_height -= dt*100.0f;
sectors[1].ceiling_height -= dt*100.0f;
sectors[0].floor_height -= dt*100.0f;
sectors[1].floor_height -= dt*100.0f;
}
if (keys[SDL_SCANCODE_S])
{
//real_height -= dt*100.0f;
sectors[0].ceiling_height += dt*100.0f;
sectors[1].ceiling_height += dt*100.0f;
sectors[0].floor_height += dt*100.0f;
sectors[1].floor_height += dt*100.0f;
}
if (keys[SDL_SCANCODE_RIGHT])
{
orientation += dt*rspeed;
@@ -428,6 +464,9 @@ int main(int argc, char *argv[])
}
debug::println("fps:", fps);
debug::println("sector:", current_sector);
debug::println("height:", real_height);
debug::println("ceil_height:", sectors[0].ceiling_height);
debug::println("floor_height:", sectors[0].floor_height);
debug::render(sdl_renderer);
SDL_RenderPresent(sdl_renderer);