stage3d: store fovy, aspect, near and far as parameters to the camera
this means glm_mat_proj_perspective is no longer meant to be called by the stage code. The parameters are set to sensible defaults of the pbr stages. I found that the old stages use STAGE3D_DEFAULT_ASPECT which is somehow stretched. I did not change the behavior but added a FIXME comment to lines that should at some point just be deleted to use the correct default aspect. I did not fix the extra stage code to avoid conflicts.
This commit is contained in:
parent
c386ea622c
commit
7fa35409d8
12 changed files with 47 additions and 14 deletions
|
@ -229,6 +229,12 @@ static void credits_init(void) {
|
|||
memset(&credits, 0, sizeof(credits));
|
||||
stage3d_init(&stage_3d_context, 64);
|
||||
|
||||
stage_3d_context.cam.fovy = M_PI/3; // FIXME
|
||||
stage_3d_context.cam.aspect = 0.7f; // FIXME
|
||||
stage_3d_context.cam.near = 100;
|
||||
stage_3d_context.cam.far = 9000;
|
||||
|
||||
|
||||
stage_3d_context.cx[0] = 0;
|
||||
stage_3d_context.cx[1] = 600;
|
||||
stage_3d_context.crot[0] = 0;
|
||||
|
@ -377,7 +383,6 @@ static void credits_draw(void) {
|
|||
r_mat_mv_push();
|
||||
r_enable(RCAP_DEPTH_TEST);
|
||||
|
||||
r_mat_proj_perspective(M_PI/3, 0.7f, 100, 9000);
|
||||
r_mat_proj_translate(0, SCREEN_H / 3.0f, 0);
|
||||
|
||||
stage3d_draw(&stage_3d_context, 10000, 1, (Stage3DSegment[]) { credits_towerwall_draw, stage6_towerwall_pos });
|
||||
|
|
|
@ -61,6 +61,11 @@ void stage1_bg_init_fullstage(void) {
|
|||
stage_3d_context.cx[2] = 700;
|
||||
stage_3d_context.cv[1] = 8;
|
||||
|
||||
stage_3d_context.cam.aspect = STAGE3D_DEFAULT_ASPECT; // FIXME
|
||||
stage_3d_context.cam.near = 500;
|
||||
stage_3d_context.cam.far = 10000;
|
||||
|
||||
|
||||
INVOKE_TASK(animate_bg, draw_data);
|
||||
}
|
||||
|
||||
|
|
|
@ -362,8 +362,6 @@ static uint stage1_snow_pos(Stage3D *s3d, vec3 p, float maxrange) {
|
|||
}
|
||||
|
||||
void stage1_draw(void) {
|
||||
r_mat_proj_perspective(STAGE3D_DEFAULT_FOVY, STAGE3D_DEFAULT_ASPECT, 500, 10000);
|
||||
|
||||
Stage3DSegment segs[] = {
|
||||
{ stage1_water_draw, stage1_water_pos },
|
||||
{ stage1_waterplants_draw, stage1_waterplants_pos },
|
||||
|
|
|
@ -130,8 +130,6 @@ static bool stage2_bloom(Framebuffer *fb) {
|
|||
}
|
||||
|
||||
void stage2_draw(void) {
|
||||
r_mat_proj_perspective(STAGE3D_DEFAULT_FOVY, STAGE3D_DEFAULT_ASPECT, 500, 5000);
|
||||
|
||||
Stage3DSegment segs[] = {
|
||||
{ stage2_bg_ground_draw, stage2_bg_pos },
|
||||
{ stage2_bg_grass_draw, stage2_bg_grass_pos },
|
||||
|
@ -144,6 +142,10 @@ void stage2_draw(void) {
|
|||
|
||||
void stage2_drawsys_init(void) {
|
||||
stage3d_init(&stage_3d_context, 16);
|
||||
stage_3d_context.cam.fovy = STAGE3D_DEFAULT_FOVY;
|
||||
stage_3d_context.cam.aspect = STAGE3D_DEFAULT_ASPECT; // FIXME
|
||||
stage_3d_context.cam.near = 500;
|
||||
stage_3d_context.cam.far = 5000;
|
||||
}
|
||||
|
||||
void stage2_drawsys_shutdown(void) {
|
||||
|
|
|
@ -259,7 +259,6 @@ static void stage3_end(void) {
|
|||
}
|
||||
|
||||
static void stage3_draw(void) {
|
||||
r_mat_proj_perspective(STAGE3D_DEFAULT_FOVY, VIEWPORT_W/(real)VIEWPORT_H, 1, 60);
|
||||
stage3d_draw(&stage_3d_context, 120, 2, (Stage3DSegment[]) { stage3_bg_ground_draw, stage3_bg_pos, stage3_bg_leaves_draw, stage3_bg_pos });
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@ TASK(update_stage_3d, NO_ARGS) {
|
|||
}
|
||||
|
||||
TASK(animate_bg_fullstage, NO_ARGS) {
|
||||
stage_3d_context.cam.far = 300;
|
||||
|
||||
stage_3d_context.cam.pos[2] = -1.8;
|
||||
stage_3d_context.cam.pos[1] = -30;
|
||||
stage_3d_context.cam.rot.v[0] = 80;
|
||||
|
|
|
@ -165,8 +165,6 @@ static void stage4_corridor_draw(vec3 pos) {
|
|||
}
|
||||
|
||||
void stage4_draw(void) {
|
||||
r_mat_proj_perspective(STAGE3D_DEFAULT_FOVY, VIEWPORT_W/(double)VIEWPORT_H, 1, 300);
|
||||
|
||||
Stage3DSegment segs[] = {
|
||||
{ stage4_lake_draw, stage4_lake_pos },
|
||||
{ stage4_corridor_draw, stage4_corridor_pos },
|
||||
|
|
|
@ -15,6 +15,10 @@
|
|||
#include "stageutils.h"
|
||||
|
||||
void stage5_update(void) {
|
||||
stage_3d_context.cam.aspect = STAGE3D_DEFAULT_ASPECT; // FIXME
|
||||
stage_3d_context.cam.near = 100;
|
||||
stage_3d_context.cam.far = 20000;
|
||||
|
||||
Stage5DrawData *stage5_draw_data = stage5_get_draw_data();
|
||||
|
||||
TIMER(&global.timer);
|
||||
|
|
|
@ -58,7 +58,6 @@ static void stage5_stairs_draw(vec3 pos) {
|
|||
}
|
||||
|
||||
void stage5_draw(void) {
|
||||
r_mat_proj_perspective(STAGE3D_DEFAULT_FOVY, STAGE3D_DEFAULT_ASPECT, 100, 20000);
|
||||
stage3d_draw(&stage_3d_context, 30000, 1, (Stage3DSegment[]) { stage5_stairs_draw, stage5_stairs_pos });
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,10 @@ void stage6_drawsys_init(void) {
|
|||
stage6_draw_data->stars.position[3*i+2] = z/r;
|
||||
}
|
||||
|
||||
stage_3d_context.cam.aspect = STAGE3D_DEFAULT_ASPECT; // FIXME
|
||||
stage_3d_context.cam.near = 100;
|
||||
stage_3d_context.cam.far = 9000;
|
||||
|
||||
stage_3d_context.cx[1] = -230;
|
||||
stage_3d_context.crot[0] = 90;
|
||||
stage_3d_context.crot[2] = -40;
|
||||
|
@ -154,8 +158,6 @@ static void stage6_skysphere_draw(vec3 pos) {
|
|||
}
|
||||
|
||||
void stage6_draw(void) {
|
||||
r_mat_proj_perspective(STAGE3D_DEFAULT_FOVY, STAGE3D_DEFAULT_ASPECT, 100, 9000);
|
||||
|
||||
Stage3DSegment segs[] = {
|
||||
{ stage6_skysphere_draw, stage6_skysphere_pos },
|
||||
{ stage6_towertop_draw, stage6_towertop_pos },
|
||||
|
@ -322,5 +324,3 @@ void elly_global_rule(Boss *b, int time) {
|
|||
global.boss->glowcolor = *HSL(time/120.0, 1.0, 0.25);
|
||||
global.boss->shadowcolor = *HSLA_MUL_ALPHA((time+20)/120.0, 1.0, 0.25, 0.5);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -17,10 +17,19 @@ Stage3D stage_3d_context;
|
|||
|
||||
void stage3d_init(Stage3D *s, uint pos_buffer_size) {
|
||||
memset(s, 0, sizeof(*s));
|
||||
camera3d_init(&s->cam);
|
||||
s->pos_buffer_size = pos_buffer_size;
|
||||
s->pos_buffer = calloc(s->pos_buffer_size, sizeof(vec3));
|
||||
}
|
||||
|
||||
void camera3d_init(Camera3D *cam) {
|
||||
memset(cam, 0, sizeof(*cam));
|
||||
cam->fovy = STAGE3D_DEFAULT_FOVY;
|
||||
cam->aspect = VIEWPORT_W/(real)VIEWPORT_H;
|
||||
cam->near = STAGE3D_DEFAULT_NEAR;
|
||||
cam->far = STAGE3D_DEFAULT_FAR;
|
||||
}
|
||||
|
||||
void camera3d_update(Camera3D *cam) {
|
||||
glm_vec3_add(cam->pos, cam->vel, cam->pos);
|
||||
}
|
||||
|
@ -55,6 +64,8 @@ void stage3d_draw(Stage3D *s, float maxrange, uint nsegments, const Stage3DSegme
|
|||
r_mat_mv_push();
|
||||
stage3d_apply_transforms(s, *r_mat_mv_current_ptr());
|
||||
|
||||
r_mat_proj_perspective(s->cam.fovy, s->cam.aspect, s->cam.near, s->cam.far);
|
||||
|
||||
for(uint i = 0; i < nsegments; ++i) {
|
||||
const Stage3DSegment *seg = segments + i;
|
||||
stage3d_draw_segment(s, seg->pos, seg->draw, maxrange);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "taisei.h"
|
||||
|
||||
#include "util.h"
|
||||
#include "global.h" // remove when STAGE3D_DEFAULT_ASPECT aspect is removed
|
||||
|
||||
typedef struct Stage3D Stage3D;
|
||||
|
||||
|
@ -32,6 +33,12 @@ typedef struct Camera3D {
|
|||
vec3 pos;
|
||||
vec3 vel;
|
||||
Camera3DRotation rot;
|
||||
|
||||
real fovy;
|
||||
real aspect;
|
||||
real near;
|
||||
real far;
|
||||
|
||||
} Camera3D;
|
||||
|
||||
// #define STAGE3D_DEPRECATED(...) attr_deprecated(__VA_ARGS__)
|
||||
|
@ -55,7 +62,9 @@ struct Stage3D {
|
|||
extern Stage3D stage_3d_context;
|
||||
|
||||
#define STAGE3D_DEFAULT_FOVY ((float)M_PI / 4.258f)
|
||||
#define STAGE3D_DEFAULT_ASPECT ((0.75f * VIEWPORT_W) / VIEWPORT_H)
|
||||
#define STAGE3D_DEFAULT_ASPECT ((0.75f * VIEWPORT_W) / VIEWPORT_H) // deprecated
|
||||
#define STAGE3D_DEFAULT_NEAR 1
|
||||
#define STAGE3D_DEFAULT_FAR 60
|
||||
|
||||
void stage3d_init(Stage3D *s, uint pos_buffer_size);
|
||||
void stage3d_update(Stage3D *s);
|
||||
|
@ -64,6 +73,7 @@ void stage3d_apply_transforms(Stage3D *s, mat4 mat);
|
|||
void stage3d_draw_segment(Stage3D *s, SegmentPositionRule pos_rule, SegmentDrawRule draw_rule, float maxrange);
|
||||
void stage3d_draw(Stage3D *s, float maxrange, uint nsegments, const Stage3DSegment segments[nsegments]);
|
||||
|
||||
void camera3d_init(Camera3D *cam);
|
||||
void camera3d_update(Camera3D *cam);
|
||||
void camera3d_apply_transforms(Camera3D *cam, mat4 mat);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue