gfx: model render pass switch + lmap fix

main
Dominik Madarász 2024-04-12 00:22:52 +02:00
parent d05c92a9b7
commit fd6b9ef639
6 changed files with 223 additions and 34 deletions

View File

@ -1036,6 +1036,7 @@ typedef struct renderstate_t {
float clear_color[4]; float clear_color[4];
double clear_depth; double clear_depth;
bool depth_test_enabled; bool depth_test_enabled;
bool depth_write_enabled;
unsigned depth_func; unsigned depth_func;
bool blend_enabled; bool blend_enabled;
unsigned blend_func; unsigned blend_func;
@ -1361,6 +1362,12 @@ enum SHADING_MODE {
SHADING_PHONG, SHADING_PHONG,
SHADING_PBR, SHADING_PBR,
}; };
enum RENDER_PASS {
RENDER_PASS_NORMAL,
RENDER_PASS_SHADOW,
RENDER_PASS_LIGHTMAP,
NUM_RENDER_PASSES
};
typedef struct model_t { typedef struct model_t {
struct iqm_t *iqm; struct iqm_t *iqm;
int shading; int shading;
@ -1390,7 +1397,7 @@ typedef struct model_t {
float *instanced_matrices; float *instanced_matrices;
unsigned num_instances; unsigned num_instances;
int stored_flags; int stored_flags;
renderstate_t rs; renderstate_t rs[NUM_RENDER_PASSES];
} model_t; } model_t;
enum BILLBOARD_MODE { enum BILLBOARD_MODE {
BILLBOARD_X = 0x1, BILLBOARD_X = 0x1,
@ -1413,6 +1420,8 @@ enum BILLBOARD_MODE {
void model_set_texture(model_t, texture_t t); void model_set_texture(model_t, texture_t t);
bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out); bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out);
void model_destroy(model_t); void model_destroy(model_t);
unsigned model_getpass();
unsigned model_setpass(unsigned pass);
vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe); vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe);
typedef struct anims_t { typedef struct anims_t {
int inuse; int inuse;

View File

@ -17041,6 +17041,7 @@ typedef struct renderstate_t {
// Depth test // Depth test
bool depth_test_enabled; bool depth_test_enabled;
bool depth_write_enabled;
unsigned depth_func; unsigned depth_func;
// Blending // Blending
@ -17615,6 +17616,14 @@ enum SHADING_MODE {
SHADING_PBR, SHADING_PBR,
}; };
enum RENDER_PASS {
RENDER_PASS_NORMAL,
RENDER_PASS_SHADOW,
RENDER_PASS_LIGHTMAP,
NUM_RENDER_PASSES
};
typedef struct model_t { typedef struct model_t {
struct iqm_t *iqm; // private struct iqm_t *iqm; // private
@ -17652,7 +17661,7 @@ typedef struct model_t {
unsigned num_instances; unsigned num_instances;
int stored_flags; int stored_flags;
renderstate_t rs; renderstate_t rs[NUM_RENDER_PASSES];
} model_t; } model_t;
enum BILLBOARD_MODE { enum BILLBOARD_MODE {
@ -17679,6 +17688,9 @@ API void model_set_texture(model_t, texture_t t);
API bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out); API bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out);
API void model_destroy(model_t); API void model_destroy(model_t);
API unsigned model_getpass();
API unsigned model_setpass(unsigned pass);
API vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe); API vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe);
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
@ -370139,6 +370151,7 @@ renderstate_t renderstate() {
// Enable depth test by default with less or equal function // Enable depth test by default with less or equal function
state.depth_test_enabled = GL_TRUE; state.depth_test_enabled = GL_TRUE;
state.depth_write_enabled = GL_TRUE;
state.depth_func = GL_LEQUAL; state.depth_func = GL_LEQUAL;
// Disable blending by default // Disable blending by default
@ -370208,6 +370221,9 @@ void renderstate_apply(const renderstate_t *state) {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
} }
// Apply depth write
glDepthMask(state->depth_write_enabled);
// Apply blending // Apply blending
if (state->blend_enabled) { if (state->blend_enabled) {
glEnable(GL_BLEND); glEnable(GL_BLEND);
@ -373785,20 +373801,47 @@ bool model_load_textures(iqm_t *q, const struct iqmheader *hdr, model_t *model,
return true; return true;
} }
static
void model_set_renderstates(model_t *m) {
for (int i = 0; i<NUM_RENDER_PASSES; ++i) {
m->rs[i] = renderstate();
}
// Normal pass
renderstate_t *normal_rs = &m->rs[RENDER_PASS_NORMAL];
{
normal_rs->blend_enabled = 1;
normal_rs->blend_src = GL_SRC_ALPHA;
normal_rs->blend_dst = GL_ONE_MINUS_SRC_ALPHA;
normal_rs->cull_face_mode = GL_BACK;
normal_rs->front_face = GL_CW;
}
// Shadow pass @todo
renderstate_t *shadow_rs = &m->rs[RENDER_PASS_SHADOW];
{
shadow_rs->blend_enabled = 1;
shadow_rs->blend_src = GL_SRC_ALPHA;
shadow_rs->blend_dst = GL_ONE_MINUS_SRC_ALPHA;
shadow_rs->cull_face_mode = GL_BACK;
shadow_rs->front_face = GL_CW;
}
// Lightmap pass
renderstate_t *lightmap_rs = &m->rs[RENDER_PASS_LIGHTMAP];
{
lightmap_rs->blend_enabled = 0;
lightmap_rs->cull_face_enabled = 0;
lightmap_rs->front_face = GL_CW;
}
}
model_t model_from_mem(const void *mem, int len, int flags) { model_t model_from_mem(const void *mem, int len, int flags) {
model_t m = {0}; model_t m = {0};
{
m.rs = renderstate();
m.rs.blend_enabled = 1;
m.rs.blend_src = GL_SRC_ALPHA;
m.rs.blend_dst = GL_ONE_MINUS_SRC_ALPHA;
m.rs.cull_face_mode = GL_BACK;
m.rs.front_face = GL_CW;
}
m.stored_flags = flags; m.stored_flags = flags;
m.shading = SHADING_PHONG; m.shading = SHADING_PHONG;
model_set_renderstates(&m);
const char *ptr = (const char *)mem; const char *ptr = (const char *)mem;
// can't cache shader programs since we enable features via flags here // can't cache shader programs since we enable features via flags here
@ -374080,7 +374123,7 @@ void model_draw_call(model_t m, int shader) {
handle old_shader = last_shader; handle old_shader = last_shader;
shader_bind(shader); shader_bind(shader);
renderstate_apply(&m.rs); renderstate_apply(&m.rs[model_getpass()]);
glBindVertexArray( q->vao ); glBindVertexArray( q->vao );
@ -374227,6 +374270,19 @@ void model_destroy(model_t m) {
FREE(q); FREE(q);
} }
static unsigned model_renderpass = RENDER_PASS_NORMAL;
unsigned model_getpass() {
return model_renderpass;
}
unsigned model_setpass(unsigned pass) {
ASSERT(pass < NUM_RENDER_PASSES);
unsigned old_pass = model_renderpass;
model_renderpass = pass;
return old_pass;
}
anims_t animations(const char *pathfile, int flags) { anims_t animations(const char *pathfile, int flags) {
anims_t a = {0}; anims_t a = {0};
a.anims = animlist(pathfile); a.anims = animlist(pathfile);
@ -374284,6 +374340,8 @@ void lightmap_bake(lightmap_t *lm, int bounces, void (*drawscene)(lightmap_t *lm
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
unsigned old_pass = model_setpass(RENDER_PASS_LIGHTMAP);
for (int b = 0; b < bounces; b++) { for (int b = 0; b < bounces; b++) {
for (int i = 0; i < array_count(lm->models); i++) { for (int i = 0; i < array_count(lm->models); i++) {
model_t *m = lm->models[i]; model_t *m = lm->models[i];
@ -374310,6 +374368,8 @@ void lightmap_bake(lightmap_t *lm, int bounces, void (*drawscene)(lightmap_t *lm
} }
} }
model_setpass(old_pass);
// postprocess texture // postprocess texture
for (int i = 0; i < array_count(lm->models); i++) { for (int i = 0; i < array_count(lm->models); i++) {
model_t *m = lm->models[i]; model_t *m = lm->models[i];

View File

@ -67,6 +67,7 @@ renderstate_t renderstate() {
// Enable depth test by default with less or equal function // Enable depth test by default with less or equal function
state.depth_test_enabled = GL_TRUE; state.depth_test_enabled = GL_TRUE;
state.depth_write_enabled = GL_TRUE;
state.depth_func = GL_LEQUAL; state.depth_func = GL_LEQUAL;
// Disable blending by default // Disable blending by default
@ -136,6 +137,9 @@ void renderstate_apply(const renderstate_t *state) {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
} }
// Apply depth write
glDepthMask(state->depth_write_enabled);
// Apply blending // Apply blending
if (state->blend_enabled) { if (state->blend_enabled) {
glEnable(GL_BLEND); glEnable(GL_BLEND);
@ -3713,20 +3717,47 @@ bool model_load_textures(iqm_t *q, const struct iqmheader *hdr, model_t *model,
return true; return true;
} }
static
void model_set_renderstates(model_t *m) {
for (int i = 0; i<NUM_RENDER_PASSES; ++i) {
m->rs[i] = renderstate();
}
// Normal pass
renderstate_t *normal_rs = &m->rs[RENDER_PASS_NORMAL];
{
normal_rs->blend_enabled = 1;
normal_rs->blend_src = GL_SRC_ALPHA;
normal_rs->blend_dst = GL_ONE_MINUS_SRC_ALPHA;
normal_rs->cull_face_mode = GL_BACK;
normal_rs->front_face = GL_CW;
}
// Shadow pass @todo
renderstate_t *shadow_rs = &m->rs[RENDER_PASS_SHADOW];
{
shadow_rs->blend_enabled = 1;
shadow_rs->blend_src = GL_SRC_ALPHA;
shadow_rs->blend_dst = GL_ONE_MINUS_SRC_ALPHA;
shadow_rs->cull_face_mode = GL_BACK;
shadow_rs->front_face = GL_CW;
}
// Lightmap pass
renderstate_t *lightmap_rs = &m->rs[RENDER_PASS_LIGHTMAP];
{
lightmap_rs->blend_enabled = 0;
lightmap_rs->cull_face_enabled = 0;
lightmap_rs->front_face = GL_CW;
}
}
model_t model_from_mem(const void *mem, int len, int flags) { model_t model_from_mem(const void *mem, int len, int flags) {
model_t m = {0}; model_t m = {0};
{
m.rs = renderstate();
m.rs.blend_enabled = 1;
m.rs.blend_src = GL_SRC_ALPHA;
m.rs.blend_dst = GL_ONE_MINUS_SRC_ALPHA;
m.rs.cull_face_mode = GL_BACK;
m.rs.front_face = GL_CW;
}
m.stored_flags = flags; m.stored_flags = flags;
m.shading = SHADING_PHONG; m.shading = SHADING_PHONG;
model_set_renderstates(&m);
const char *ptr = (const char *)mem; const char *ptr = (const char *)mem;
// can't cache shader programs since we enable features via flags here // can't cache shader programs since we enable features via flags here
@ -4008,7 +4039,7 @@ void model_draw_call(model_t m, int shader) {
handle old_shader = last_shader; handle old_shader = last_shader;
shader_bind(shader); shader_bind(shader);
renderstate_apply(&m.rs); renderstate_apply(&m.rs[model_getpass()]);
glBindVertexArray( q->vao ); glBindVertexArray( q->vao );
@ -4155,6 +4186,19 @@ void model_destroy(model_t m) {
FREE(q); FREE(q);
} }
static unsigned model_renderpass = RENDER_PASS_NORMAL;
unsigned model_getpass() {
return model_renderpass;
}
unsigned model_setpass(unsigned pass) {
ASSERT(pass < NUM_RENDER_PASSES);
unsigned old_pass = model_renderpass;
model_renderpass = pass;
return old_pass;
}
anims_t animations(const char *pathfile, int flags) { anims_t animations(const char *pathfile, int flags) {
anims_t a = {0}; anims_t a = {0};
a.anims = animlist(pathfile); a.anims = animlist(pathfile);
@ -4212,6 +4256,8 @@ void lightmap_bake(lightmap_t *lm, int bounces, void (*drawscene)(lightmap_t *lm
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
unsigned old_pass = model_setpass(RENDER_PASS_LIGHTMAP);
for (int b = 0; b < bounces; b++) { for (int b = 0; b < bounces; b++) {
for (int i = 0; i < array_count(lm->models); i++) { for (int i = 0; i < array_count(lm->models); i++) {
model_t *m = lm->models[i]; model_t *m = lm->models[i];
@ -4238,6 +4284,8 @@ void lightmap_bake(lightmap_t *lm, int bounces, void (*drawscene)(lightmap_t *lm
} }
} }
model_setpass(old_pass);
// postprocess texture // postprocess texture
for (int i = 0; i < array_count(lm->models); i++) { for (int i = 0; i < array_count(lm->models); i++) {
model_t *m = lm->models[i]; model_t *m = lm->models[i];

View File

@ -19,6 +19,7 @@ typedef struct renderstate_t {
// Depth test // Depth test
bool depth_test_enabled; bool depth_test_enabled;
bool depth_write_enabled;
unsigned depth_func; unsigned depth_func;
// Blending // Blending
@ -593,6 +594,14 @@ enum SHADING_MODE {
SHADING_PBR, SHADING_PBR,
}; };
enum RENDER_PASS {
RENDER_PASS_NORMAL,
RENDER_PASS_SHADOW,
RENDER_PASS_LIGHTMAP,
NUM_RENDER_PASSES
};
typedef struct model_t { typedef struct model_t {
struct iqm_t *iqm; // private struct iqm_t *iqm; // private
@ -630,7 +639,7 @@ typedef struct model_t {
unsigned num_instances; unsigned num_instances;
int stored_flags; int stored_flags;
renderstate_t rs; renderstate_t rs[NUM_RENDER_PASSES];
} model_t; } model_t;
enum BILLBOARD_MODE { enum BILLBOARD_MODE {
@ -657,6 +666,9 @@ API void model_set_texture(model_t, texture_t t);
API bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out); API bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out);
API void model_destroy(model_t); API void model_destroy(model_t);
API unsigned model_getpass();
API unsigned model_setpass(unsigned pass);
API vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe); API vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe);
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -17238,6 +17238,7 @@ renderstate_t renderstate() {
// Enable depth test by default with less or equal function // Enable depth test by default with less or equal function
state.depth_test_enabled = GL_TRUE; state.depth_test_enabled = GL_TRUE;
state.depth_write_enabled = GL_TRUE;
state.depth_func = GL_LEQUAL; state.depth_func = GL_LEQUAL;
// Disable blending by default // Disable blending by default
@ -17307,6 +17308,9 @@ void renderstate_apply(const renderstate_t *state) {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
} }
// Apply depth write
glDepthMask(state->depth_write_enabled);
// Apply blending // Apply blending
if (state->blend_enabled) { if (state->blend_enabled) {
glEnable(GL_BLEND); glEnable(GL_BLEND);
@ -20884,20 +20888,47 @@ bool model_load_textures(iqm_t *q, const struct iqmheader *hdr, model_t *model,
return true; return true;
} }
static
void model_set_renderstates(model_t *m) {
for (int i = 0; i<NUM_RENDER_PASSES; ++i) {
m->rs[i] = renderstate();
}
// Normal pass
renderstate_t *normal_rs = &m->rs[RENDER_PASS_NORMAL];
{
normal_rs->blend_enabled = 1;
normal_rs->blend_src = GL_SRC_ALPHA;
normal_rs->blend_dst = GL_ONE_MINUS_SRC_ALPHA;
normal_rs->cull_face_mode = GL_BACK;
normal_rs->front_face = GL_CW;
}
// Shadow pass @todo
renderstate_t *shadow_rs = &m->rs[RENDER_PASS_SHADOW];
{
shadow_rs->blend_enabled = 1;
shadow_rs->blend_src = GL_SRC_ALPHA;
shadow_rs->blend_dst = GL_ONE_MINUS_SRC_ALPHA;
shadow_rs->cull_face_mode = GL_BACK;
shadow_rs->front_face = GL_CW;
}
// Lightmap pass
renderstate_t *lightmap_rs = &m->rs[RENDER_PASS_LIGHTMAP];
{
lightmap_rs->blend_enabled = 0;
lightmap_rs->cull_face_enabled = 0;
lightmap_rs->front_face = GL_CW;
}
}
model_t model_from_mem(const void *mem, int len, int flags) { model_t model_from_mem(const void *mem, int len, int flags) {
model_t m = {0}; model_t m = {0};
{
m.rs = renderstate();
m.rs.blend_enabled = 1;
m.rs.blend_src = GL_SRC_ALPHA;
m.rs.blend_dst = GL_ONE_MINUS_SRC_ALPHA;
m.rs.cull_face_mode = GL_BACK;
m.rs.front_face = GL_CW;
}
m.stored_flags = flags; m.stored_flags = flags;
m.shading = SHADING_PHONG; m.shading = SHADING_PHONG;
model_set_renderstates(&m);
const char *ptr = (const char *)mem; const char *ptr = (const char *)mem;
// can't cache shader programs since we enable features via flags here // can't cache shader programs since we enable features via flags here
@ -21179,7 +21210,7 @@ void model_draw_call(model_t m, int shader) {
handle old_shader = last_shader; handle old_shader = last_shader;
shader_bind(shader); shader_bind(shader);
renderstate_apply(&m.rs); renderstate_apply(&m.rs[model_getpass()]);
glBindVertexArray( q->vao ); glBindVertexArray( q->vao );
@ -21326,6 +21357,19 @@ void model_destroy(model_t m) {
FREE(q); FREE(q);
} }
static unsigned model_renderpass = RENDER_PASS_NORMAL;
unsigned model_getpass() {
return model_renderpass;
}
unsigned model_setpass(unsigned pass) {
ASSERT(pass < NUM_RENDER_PASSES);
unsigned old_pass = model_renderpass;
model_renderpass = pass;
return old_pass;
}
anims_t animations(const char *pathfile, int flags) { anims_t animations(const char *pathfile, int flags) {
anims_t a = {0}; anims_t a = {0};
a.anims = animlist(pathfile); a.anims = animlist(pathfile);
@ -21383,6 +21427,8 @@ void lightmap_bake(lightmap_t *lm, int bounces, void (*drawscene)(lightmap_t *lm
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
unsigned old_pass = model_setpass(RENDER_PASS_LIGHTMAP);
for (int b = 0; b < bounces; b++) { for (int b = 0; b < bounces; b++) {
for (int i = 0; i < array_count(lm->models); i++) { for (int i = 0; i < array_count(lm->models); i++) {
model_t *m = lm->models[i]; model_t *m = lm->models[i];
@ -21409,6 +21455,8 @@ void lightmap_bake(lightmap_t *lm, int bounces, void (*drawscene)(lightmap_t *lm
} }
} }
model_setpass(old_pass);
// postprocess texture // postprocess texture
for (int i = 0; i < array_count(lm->models); i++) { for (int i = 0; i < array_count(lm->models); i++) {
model_t *m = lm->models[i]; model_t *m = lm->models[i];

View File

@ -3108,6 +3108,7 @@ typedef struct renderstate_t {
// Depth test // Depth test
bool depth_test_enabled; bool depth_test_enabled;
bool depth_write_enabled;
unsigned depth_func; unsigned depth_func;
// Blending // Blending
@ -3682,6 +3683,14 @@ enum SHADING_MODE {
SHADING_PBR, SHADING_PBR,
}; };
enum RENDER_PASS {
RENDER_PASS_NORMAL,
RENDER_PASS_SHADOW,
RENDER_PASS_LIGHTMAP,
NUM_RENDER_PASSES
};
typedef struct model_t { typedef struct model_t {
struct iqm_t *iqm; // private struct iqm_t *iqm; // private
@ -3719,7 +3728,7 @@ typedef struct model_t {
unsigned num_instances; unsigned num_instances;
int stored_flags; int stored_flags;
renderstate_t rs; renderstate_t rs[NUM_RENDER_PASSES];
} model_t; } model_t;
enum BILLBOARD_MODE { enum BILLBOARD_MODE {
@ -3746,6 +3755,9 @@ API void model_set_texture(model_t, texture_t t);
API bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out); API bool model_get_bone_pose(model_t m, unsigned joint, mat34 *out);
API void model_destroy(model_t); API void model_destroy(model_t);
API unsigned model_getpass();
API unsigned model_setpass(unsigned pass);
API vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe); API vec3 pose(bool forward, float curframe, int minframe, int maxframe, bool loop, float *opt_retframe);
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------