From a35299e26177c19fe919e581bd12da1a302cf426 Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 10 Oct 2003 03:07:18 +0000 Subject: [PATCH] this should fix skybox in q3bsp (extra preprocessing pass to look for sky surfaces before rendering normal surfaces, only used if the map has sky surfaces) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3561 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rsurf.c | 125 ++++++++++++++++++++++++++++++++------------------ model_brush.c | 8 +++- 2 files changed, 88 insertions(+), 45 deletions(-) diff --git a/gl_rsurf.c b/gl_rsurf.c index 3edeb3ed..dd32b9bc 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -1661,8 +1661,13 @@ void R_DrawWorld(entity_render_t *ent) { if (ent->model == NULL) return; - if (!ent->model->brushq1.numleafs && ent->model->Draw) - ent->model->Draw(ent); + if (!ent->model->brushq1.numleafs) + { + if (ent->model->DrawSky) + ent->model->DrawSky(ent); + if (ent->model->Draw) + ent->model->Draw(ent); + } else { R_PrepareSurfaces(ent); @@ -1792,49 +1797,54 @@ void R_DrawCollisionBrush(colbrushf_t *brush) R_Mesh_Draw(brush->numpoints, brush->numtriangles, brush->elements); } -void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face) +void R_Q3BSP_DrawSkyFace(entity_render_t *ent, q3mface_t *face) { rmeshstate_t m; if (!face->num_triangles) return; - if (face->texture->renderflags) + if (skyrendernow) { - if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) - { - if (skyrendernow) - { - skyrendernow = false; - if (skyrendermasked) - R_Sky(); - } + skyrendernow = false; + if (skyrendermasked) + R_Sky(); + } - R_Mesh_Matrix(&ent->matrix); + R_Mesh_Matrix(&ent->matrix); - GL_Color(fogcolor[0], fogcolor[1], fogcolor[2], 1); - if (skyrendermasked) - { - // depth-only (masking) - qglColorMask(0,0,0,0); - // just to make sure that braindead drivers don't draw anything - // despite that colormask... - GL_BlendFunc(GL_ZERO, GL_ONE); - } - else - { - // fog sky - GL_BlendFunc(GL_ONE, GL_ZERO); - } - GL_DepthMask(true); - GL_DepthTest(true); + GL_Color(fogcolor[0], fogcolor[1], fogcolor[2], 1); + if (skyrendermasked) + { + // depth-only (masking) + qglColorMask(0,0,0,0); + // just to make sure that braindead drivers don't draw anything + // despite that colormask... + GL_BlendFunc(GL_ZERO, GL_ONE); + } + else + { + // fog sky + GL_BlendFunc(GL_ONE, GL_ZERO); + } + GL_DepthMask(true); + GL_DepthTest(true); - memset(&m, 0, sizeof(m)); - R_Mesh_State_Texture(&m); + memset(&m, 0, sizeof(m)); + R_Mesh_State_Texture(&m); + + GL_VertexPointer(face->data_vertex3f); + R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i); + qglColorMask(1,1,1,1); +} - GL_VertexPointer(face->data_vertex3f); - R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i); - qglColorMask(1,1,1,1); +void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face) +{ + rmeshstate_t m; + if (!face->num_triangles) + return; + if (face->texture->renderflags) + { + if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) return; - } if (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_NODRAW) return; } @@ -1863,12 +1873,6 @@ void R_Q3BSP_DrawFace(entity_render_t *ent, q3mface_t *face) R_Mesh_Draw(face->num_vertices, face->num_triangles, face->data_element3i); } -/* -void R_Q3BSP_DrawSky(entity_render_t *ent) -{ -} -*/ - void R_Q3BSP_RecursiveWorldNode(entity_render_t *ent, q3mnode_t *node, const vec3_t modelorg, qbyte *pvs, int markframe) { int i; @@ -1888,7 +1892,37 @@ void R_Q3BSP_RecursiveWorldNode(entity_render_t *ent, q3mnode_t *node, const vec leaf->firstleafface[i]->markframe = markframe; } +static int r_q3bsp_framecount = -1; +void R_Q3BSP_DrawSky(entity_render_t *ent) +{ + int i; + q3mface_t *face; + vec3_t modelorg; + model_t *model; + qbyte *pvs; + R_Mesh_Matrix(&ent->matrix); + model = ent->model; + if (r_drawcollisionbrushes.integer < 2) + { + Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); + if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer && (pvs = model->brush.GetPVS(model, modelorg))) + { + if (r_q3bsp_framecount != r_framecount) + { + r_q3bsp_framecount = r_framecount; + R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, r_framecount); + } + for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++) + if (face->markframe == r_framecount && (face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) && !R_CullBox(face->mins, face->maxs)) + R_Q3BSP_DrawSkyFace(ent, face); + } + else + for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++) + if ((face->texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY)) + R_Q3BSP_DrawSkyFace(ent, face); + } +} void R_Q3BSP_Draw(entity_render_t *ent) { @@ -1897,7 +1931,6 @@ void R_Q3BSP_Draw(entity_render_t *ent) vec3_t modelorg; model_t *model; qbyte *pvs; - static int markframe = 0; R_Mesh_Matrix(&ent->matrix); model = ent->model; if (r_drawcollisionbrushes.integer < 2) @@ -1905,9 +1938,13 @@ void R_Q3BSP_Draw(entity_render_t *ent) Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer && (pvs = model->brush.GetPVS(model, modelorg))) { - R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, ++markframe); + if (r_q3bsp_framecount != r_framecount) + { + r_q3bsp_framecount = r_framecount; + R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, r_framecount); + } for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++) - if (face->markframe == markframe && !R_CullBox(face->mins, face->maxs)) + if (face->markframe == r_framecount && !R_CullBox(face->mins, face->maxs)) R_Q3BSP_DrawFace(ent, face); } else diff --git a/model_brush.c b/model_brush.c index 584d1727..4470a42d 100644 --- a/model_brush.c +++ b/model_brush.c @@ -4563,7 +4563,7 @@ static int Mod_Q3BSP_NativeContentsFromSuperContents(model_t *model, int superco return nativecontents; } -//extern void R_Q3BSP_DrawSky(struct entity_render_s *ent); +extern void R_Q3BSP_DrawSky(struct entity_render_s *ent); extern void R_Q3BSP_Draw(struct entity_render_s *ent); extern void R_Q3BSP_DrawShadowVolume(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius); extern void R_Q3BSP_DrawLight(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltofilter, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz); @@ -4665,6 +4665,12 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer) mod->yawmaxs[2] = mod->normalmaxs[2]; mod->radius = modelradius; mod->radius2 = modelradius * modelradius; + + for (i = 0;i < mod->brushq3.data_thismodel->numfaces;i++) + if (mod->brushq3.data_thismodel->firstface[i].texture->renderflags & Q3MTEXTURERENDERFLAGS_SKY) + break; + if (i < mod->brushq3.data_thismodel->numfaces) + mod->DrawSky = R_Q3BSP_DrawSky; } } -- 2.39.2