From 15c442ea999fd0159430991b3a13aa92311f142f Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 1 Oct 2007 03:37:39 +0000 Subject: [PATCH] r_showtris/r_shownormals/r_showcollisionbrushes are no longer obscured by bmodels and things that are drawn later, they now get their own rendering stage, and have been moved after transparencies, also changed them to use alpha blend, where their value controls the opacity git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7599 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 284 ++++++++++++++++++++++++++----------------------- gl_rsurf.c | 26 +++-- model_alias.c | 12 ++- model_brush.c | 2 + model_shared.h | 3 + render.h | 4 +- 6 files changed, 187 insertions(+), 144 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index af984312..d5f50d07 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -2089,6 +2089,25 @@ static void R_DrawModelsDepth(void) } } +static void R_DrawModelsDebug(void) +{ + int i; + entity_render_t *ent; + + if (!r_drawentities.integer) + return; + + for (i = 0;i < r_refdef.numentities;i++) + { + if (!r_viewcache.entityvisible[i]) + continue; + ent = r_refdef.entities[i]; + r_refdef.stats.entities++; + if (ent->model && ent->model->DrawDebug != NULL) + ent->model->DrawDebug(ent); + } +} + static void R_DrawModelsAddWaterPlanes(void) { int i; @@ -3289,6 +3308,21 @@ void R_RenderScene(qboolean addwaterplanes) qglUseProgramObjectARB(0);CHECKGLERROR } + if (r_view.showdebug && r_refdef.worldmodel && r_refdef.worldmodel->DrawDebug && (r_showtris.value > 0 || r_shownormals.value > 0 || r_showcollisionbrushes.value > 0)) + { + r_refdef.worldmodel->DrawDebug(r_refdef.worldentity); + if (r_timereport_active) + R_TimeReport("worlddebug"); + R_DrawModelsDebug(); + if (r_timereport_active) + R_TimeReport("modeldebug"); + } + + if (gl_support_fragment_shader) + { + qglUseProgramObjectARB(0);CHECKGLERROR + } + if (cl.csqc_vidvars.drawworld) { R_DrawCoronas(); @@ -3687,30 +3721,6 @@ void R_Mesh_AddBrushMeshFromPlanes(rmesh_t *mesh, int numplanes, mplane_t *plane } } -static void R_DrawCollisionBrush(const colbrushf_t *brush) -{ - int i; - R_Mesh_VertexPointer(brush->points->v, 0, 0); - i = (int)(((size_t)brush) / sizeof(colbrushf_t)); - GL_Color((i & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 5) & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 10) & 31) * (1.0f / 32.0f) * r_view.colorscale, 0.2f); - GL_LockArrays(0, brush->numpoints); - R_Mesh_Draw(0, brush->numpoints, brush->numtriangles, brush->elements, 0, 0); - GL_LockArrays(0, 0); -} - -static void R_DrawCollisionSurface(const entity_render_t *ent, const msurface_t *surface) -{ - int i; - if (!surface->num_collisiontriangles) - return; - R_Mesh_VertexPointer(surface->data_collisionvertex3f, 0, 0); - i = (int)(((size_t)surface) / sizeof(msurface_t)); - GL_Color((i & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 5) & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 10) & 31) * (1.0f / 32.0f) * r_view.colorscale, 0.2f); - GL_LockArrays(0, surface->num_collisionvertices); - R_Mesh_Draw(0, surface->num_collisionvertices, surface->num_collisiontriangles, surface->data_collisionelement3i, 0, 0); - GL_LockArrays(0, 0); -} - static void R_Texture_AddLayer(texture_t *t, qboolean depthmask, int blendfunc1, int blendfunc2, texturelayertype_t type, rtexture_t *texture, const matrix4x4_t *matrix, float r, float g, float b, float a) { texturelayer_t *layer; @@ -5843,118 +5853,134 @@ void R_DrawLocs(void) } } -void R_DrawCollisionBrushes(entity_render_t *ent) +void R_DrawDebugModel(entity_render_t *ent) { - int i; + int i, j, k, l, flagsmask; + const int *elements; q3mbrush_t *brush; msurface_t *surface; model_t *model = ent->model; - if (!model->brush.num_brushes) - return; - CHECKGLERROR + vec3_t v; + + flagsmask = MATERIALFLAG_SKY | MATERIALFLAG_WATER | MATERIALFLAG_WALL; + R_Mesh_ColorPointer(NULL, 0, 0); R_Mesh_ResetTextureState(); - GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); - GL_DepthMask(false); GL_DepthRange(0, 1); GL_DepthTest(!r_showdisabledepthtest.integer); - GL_PolygonOffset(r_refdef.polygonfactor + r_showcollisionbrushes_polygonfactor.value, r_refdef.polygonoffset + r_showcollisionbrushes_polygonoffset.value); - for (i = 0, brush = model->brush.data_brushes + model->firstmodelbrush;i < model->nummodelbrushes;i++, brush++) - if (brush->colbrushf && brush->colbrushf->numtriangles) - R_DrawCollisionBrush(brush->colbrushf); - for (i = 0, surface = model->data_surfaces + model->firstmodelsurface;i < model->nummodelsurfaces;i++, surface++) - if (surface->num_collisiontriangles) - R_DrawCollisionSurface(ent, surface); - GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset); -} + GL_DepthMask(false); + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -void R_DrawTrianglesAndNormals(entity_render_t *ent, qboolean drawtris, qboolean drawnormals, int flagsmask) -{ - int i, j, k, l; - const int *elements; - msurface_t *surface; - model_t *model = ent->model; - vec3_t v; - CHECKGLERROR - GL_DepthRange(0, 1); - GL_DepthTest(!r_showdisabledepthtest.integer); - GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset); - GL_DepthMask(true); - GL_BlendFunc(GL_ONE, GL_ZERO); - R_Mesh_ColorPointer(NULL, 0, 0); - R_Mesh_ResetTextureState(); - for (i = 0, j = model->firstmodelsurface, surface = model->data_surfaces + j;i < model->nummodelsurfaces;i++, j++, surface++) + if (r_showcollisionbrushes.value > 0 && model->brush.num_brushes) { - if (ent == r_refdef.worldentity && !r_viewcache.world_surfacevisible[j]) - continue; - rsurface.texture = surface->texture->currentframe; - if ((rsurface.texture->currentmaterialflags & flagsmask) && surface->num_triangles) + GL_PolygonOffset(r_refdef.polygonfactor + r_showcollisionbrushes_polygonfactor.value, r_refdef.polygonoffset + r_showcollisionbrushes_polygonoffset.value); + for (i = 0, brush = model->brush.data_brushes + model->firstmodelbrush;i < model->nummodelbrushes;i++, brush++) { - RSurf_PrepareVerticesForBatch(true, true, 1, &surface); - if (drawtris) + if (brush->colbrushf && brush->colbrushf->numtriangles) { - if (!rsurface.texture->currentlayers->depthmask) - GL_Color(r_showtris.value * r_view.colorscale, 0, 0, 1); - else if (ent == r_refdef.worldentity) - GL_Color(r_showtris.value * r_view.colorscale, r_showtris.value * r_view.colorscale, r_showtris.value * r_view.colorscale, 1); - else - GL_Color(0, r_showtris.value * r_view.colorscale, 0, 1); - elements = (ent->model->surfmesh.data_element3i + 3 * surface->num_firsttriangle); - CHECKGLERROR - qglBegin(GL_LINES); - for (k = 0;k < surface->num_triangles;k++, elements += 3) - { -#define GLVERTEXELEMENT(n) qglVertex3f(rsurface.vertex3f[elements[n]*3+0], rsurface.vertex3f[elements[n]*3+1], rsurface.vertex3f[elements[n]*3+2]) - GLVERTEXELEMENT(0);GLVERTEXELEMENT(1); - GLVERTEXELEMENT(1);GLVERTEXELEMENT(2); - GLVERTEXELEMENT(2);GLVERTEXELEMENT(0); - } - qglEnd(); - CHECKGLERROR + R_Mesh_VertexPointer(brush->colbrushf->points->v, 0, 0); + GL_Color((i & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 5) & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 10) & 31) * (1.0f / 32.0f) * r_view.colorscale, r_showcollisionbrushes.value); + R_Mesh_Draw(0, brush->colbrushf->numpoints, brush->colbrushf->numtriangles, brush->colbrushf->elements, 0, 0); } - if (drawnormals) + } + for (i = 0, surface = model->data_surfaces + model->firstmodelsurface;i < model->nummodelsurfaces;i++, surface++) + { + if (surface->num_collisiontriangles) { - GL_Color(r_shownormals.value * r_view.colorscale, 0, 0, 1); - qglBegin(GL_LINES); - for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) - { - VectorCopy(rsurface.vertex3f + l * 3, v); - qglVertex3f(v[0], v[1], v[2]); - VectorMA(v, 8, rsurface.svector3f + l * 3, v); - qglVertex3f(v[0], v[1], v[2]); - } - qglEnd(); - CHECKGLERROR - GL_Color(0, 0, r_shownormals.value * r_view.colorscale, 1); - qglBegin(GL_LINES); - for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) + R_Mesh_VertexPointer(surface->data_collisionvertex3f, 0, 0); + GL_Color((i & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 5) & 31) * (1.0f / 32.0f) * r_view.colorscale, ((i >> 10) & 31) * (1.0f / 32.0f) * r_view.colorscale, r_showcollisionbrushes.value); + R_Mesh_Draw(0, surface->num_collisionvertices, surface->num_collisiontriangles, surface->data_collisionelement3i, 0, 0); + } + } + } + + GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset); + + if (r_showtris.integer || r_shownormals.integer) + { + if (r_showdisabledepthtest.integer) + { + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GL_DepthMask(false); + } + else + { + GL_BlendFunc(GL_ONE, GL_ZERO); + GL_DepthMask(true); + } + for (i = 0, j = model->firstmodelsurface, surface = model->data_surfaces + j;i < model->nummodelsurfaces;i++, j++, surface++) + { + if (ent == r_refdef.worldentity && !r_viewcache.world_surfacevisible[j]) + continue; + rsurface.texture = surface->texture->currentframe; + if ((rsurface.texture->currentmaterialflags & flagsmask) && surface->num_triangles) + { + RSurf_PrepareVerticesForBatch(true, true, 1, &surface); + if (r_showtris.value > 0) { - VectorCopy(rsurface.vertex3f + l * 3, v); - qglVertex3f(v[0], v[1], v[2]); - VectorMA(v, 8, rsurface.tvector3f + l * 3, v); - qglVertex3f(v[0], v[1], v[2]); + if (!rsurface.texture->currentlayers->depthmask) + GL_Color(r_view.colorscale, 0, 0, r_showtris.value); + else if (ent == r_refdef.worldentity) + GL_Color(r_view.colorscale, r_view.colorscale, r_view.colorscale, r_showtris.value); + else + GL_Color(0, r_view.colorscale, 0, r_showtris.value); + elements = (ent->model->surfmesh.data_element3i + 3 * surface->num_firsttriangle); + CHECKGLERROR + qglBegin(GL_LINES); + for (k = 0;k < surface->num_triangles;k++, elements += 3) + { +#define GLVERTEXELEMENT(n) qglVertex3f(rsurface.vertex3f[elements[n]*3+0], rsurface.vertex3f[elements[n]*3+1], rsurface.vertex3f[elements[n]*3+2]) + GLVERTEXELEMENT(0);GLVERTEXELEMENT(1); + GLVERTEXELEMENT(1);GLVERTEXELEMENT(2); + GLVERTEXELEMENT(2);GLVERTEXELEMENT(0); + } + qglEnd(); + CHECKGLERROR } - qglEnd(); - CHECKGLERROR - GL_Color(0, r_shownormals.value * r_view.colorscale, 0, 1); - qglBegin(GL_LINES); - for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) + if (r_shownormals.value > 0) { - VectorCopy(rsurface.vertex3f + l * 3, v); - qglVertex3f(v[0], v[1], v[2]); - VectorMA(v, 8, rsurface.normal3f + l * 3, v); - qglVertex3f(v[0], v[1], v[2]); + GL_Color(r_view.colorscale, 0, 0, r_shownormals.value); + qglBegin(GL_LINES); + for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) + { + VectorCopy(rsurface.vertex3f + l * 3, v); + qglVertex3f(v[0], v[1], v[2]); + VectorMA(v, 8, rsurface.svector3f + l * 3, v); + qglVertex3f(v[0], v[1], v[2]); + } + qglEnd(); + CHECKGLERROR + GL_Color(0, 0, r_view.colorscale, r_shownormals.value); + qglBegin(GL_LINES); + for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) + { + VectorCopy(rsurface.vertex3f + l * 3, v); + qglVertex3f(v[0], v[1], v[2]); + VectorMA(v, 8, rsurface.tvector3f + l * 3, v); + qglVertex3f(v[0], v[1], v[2]); + } + qglEnd(); + CHECKGLERROR + GL_Color(0, r_view.colorscale, 0, r_shownormals.value); + qglBegin(GL_LINES); + for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) + { + VectorCopy(rsurface.vertex3f + l * 3, v); + qglVertex3f(v[0], v[1], v[2]); + VectorMA(v, 8, rsurface.normal3f + l * 3, v); + qglVertex3f(v[0], v[1], v[2]); + } + qglEnd(); + CHECKGLERROR } - qglEnd(); - CHECKGLERROR } } + rsurface.texture = NULL; } - rsurface.texture = NULL; } extern void R_BuildLightMap(const entity_render_t *ent, msurface_t *surface); -void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes) +void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes, qboolean debug) { int i, j, endj, f, flagsmask; int counttriangles = 0; @@ -5986,6 +6012,13 @@ void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean dep R_UpdateAllTextureInfo(r_refdef.worldentity); flagsmask = addwaterplanes ? (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFLECTION) : (skysurfaces ? MATERIALFLAG_SKY : (MATERIALFLAG_WATER | MATERIALFLAG_WALL)); + + if (debug) + { + R_DrawDebugModel(r_refdef.worldentity); + return; + } + f = 0; t = NULL; rsurface.uselightmaptexture = false; @@ -6024,18 +6057,9 @@ void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean dep R_QueueSurfaceList(r_refdef.worldentity, numsurfacelist, surfacelist, flagsmask, writedepth, depthonly, addwaterplanes); r_refdef.stats.entities_triangles += counttriangles; RSurf_CleanUp(); - - if (r_view.showdebug) - { - if (r_showcollisionbrushes.integer && !skysurfaces && !addwaterplanes && !depthonly) - R_DrawCollisionBrushes(r_refdef.worldentity); - - if ((r_showtris.integer || r_shownormals.integer) && !addwaterplanes && !depthonly) - R_DrawTrianglesAndNormals(r_refdef.worldentity, r_showtris.integer, r_shownormals.integer, flagsmask); - } } -void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes) +void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes, qboolean debug) { int i, f, flagsmask; int counttriangles = 0; @@ -6075,6 +6099,13 @@ void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean wr R_UpdateAllTextureInfo(ent); flagsmask = addwaterplanes ? (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFLECTION) : (skysurfaces ? MATERIALFLAG_SKY : (MATERIALFLAG_WATER | MATERIALFLAG_WALL)); + + if (debug) + { + R_DrawDebugModel(ent); + return; + } + f = 0; t = NULL; rsurface.uselightmaptexture = false; @@ -6104,13 +6135,4 @@ void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean wr R_QueueSurfaceList(ent, numsurfacelist, surfacelist, flagsmask, writedepth, depthonly, addwaterplanes); r_refdef.stats.entities_triangles += counttriangles; RSurf_CleanUp(); - - if (r_view.showdebug) - { - if (r_showcollisionbrushes.integer && !skysurfaces && !addwaterplanes && !depthonly) - R_DrawCollisionBrushes(ent); - - if ((r_showtris.integer || r_shownormals.integer) && !addwaterplanes && !depthonly) - R_DrawTrianglesAndNormals(ent, r_showtris.integer, r_shownormals.integer, flagsmask); - } } diff --git a/gl_rsurf.c b/gl_rsurf.c index d18e540a..5cd7f27a 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -547,9 +547,9 @@ void R_Q1BSP_DrawSky(entity_render_t *ent) if (ent->model == NULL) return; if (ent == r_refdef.worldentity) - R_DrawWorldSurfaces(true, true, false, false); + R_DrawWorldSurfaces(true, true, false, false, false); else - R_DrawModelSurfaces(ent, true, true, false, false); + R_DrawModelSurfaces(ent, true, true, false, false, false); } void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent) @@ -558,9 +558,9 @@ void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent) if (model == NULL) return; if (ent == r_refdef.worldentity) - R_DrawWorldSurfaces(false, false, false, true); + R_DrawWorldSurfaces(false, false, false, true, false); else - R_DrawModelSurfaces(ent, false, false, false, true); + R_DrawModelSurfaces(ent, false, false, false, true, false); } void R_Q1BSP_Draw(entity_render_t *ent) @@ -569,9 +569,9 @@ void R_Q1BSP_Draw(entity_render_t *ent) if (model == NULL) return; if (ent == r_refdef.worldentity) - R_DrawWorldSurfaces(false, true, false, false); + R_DrawWorldSurfaces(false, true, false, false, false); else - R_DrawModelSurfaces(ent, false, true, false, false); + R_DrawModelSurfaces(ent, false, true, false, false, false); } void R_Q1BSP_DrawDepth(entity_render_t *ent) @@ -580,9 +580,19 @@ void R_Q1BSP_DrawDepth(entity_render_t *ent) if (model == NULL) return; if (ent == r_refdef.worldentity) - R_DrawWorldSurfaces(false, false, true, false); + R_DrawWorldSurfaces(false, false, true, false, false); else - R_DrawModelSurfaces(ent, false, false, true, false); + R_DrawModelSurfaces(ent, false, false, true, false, false); +} + +void R_Q1BSP_DrawDebug(entity_render_t *ent) +{ + if (ent->model == NULL) + return; + if (ent == r_refdef.worldentity) + R_DrawWorldSurfaces(false, false, false, false, true); + else + R_DrawModelSurfaces(ent, false, false, false, false, true); } typedef struct r_q1bsp_getlightinfo_s diff --git a/model_alias.c b/model_alias.c index c53867e4..b891b1fa 100644 --- a/model_alias.c +++ b/model_alias.c @@ -790,6 +790,7 @@ void Mod_IDP0_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawAddWaterPlanes = NULL; loadmodel->Draw = R_Q1BSP_Draw; loadmodel->DrawDepth = R_Q1BSP_DrawDepth; + loadmodel->DrawDebug = R_Q1BSP_DrawDebug; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1104,12 +1105,13 @@ void Mod_IDP2_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->name, version, MD2ALIAS_VERSION); loadmodel->modeldatatypestring = "MD2"; - + loadmodel->type = mod_alias; loadmodel->DrawSky = NULL; loadmodel->DrawAddWaterPlanes = NULL; loadmodel->Draw = R_Q1BSP_Draw; loadmodel->DrawDepth = R_Q1BSP_DrawDepth; + loadmodel->DrawDebug = R_Q1BSP_DrawDebug; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1346,6 +1348,7 @@ void Mod_IDP3_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawAddWaterPlanes = NULL; loadmodel->Draw = R_Q1BSP_Draw; loadmodel->DrawDepth = R_Q1BSP_DrawDepth; + loadmodel->DrawDebug = R_Q1BSP_DrawDebug; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1551,6 +1554,7 @@ void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawAddWaterPlanes = NULL; loadmodel->Draw = R_Q1BSP_Draw; loadmodel->DrawDepth = R_Q1BSP_DrawDepth; + loadmodel->DrawDebug = R_Q1BSP_DrawDebug; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1810,7 +1814,7 @@ void Mod_DARKPLACESMODEL_Load(model_t *mod, void *buffer, void *bufferend) Host_Error ("Mod_DARKPLACESMODEL_Load: only type 2 (hierarchical skeletal pose) models are currently supported (name = %s)", loadmodel->name); loadmodel->modeldatatypestring = "DPM"; - + loadmodel->type = mod_alias; loadmodel->synctype = ST_RAND; @@ -1847,6 +1851,7 @@ void Mod_DARKPLACESMODEL_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawAddWaterPlanes = NULL; loadmodel->Draw = R_Q1BSP_Draw; loadmodel->DrawDepth = R_Q1BSP_DrawDepth; + loadmodel->DrawDebug = R_Q1BSP_DrawDebug; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -2113,12 +2118,13 @@ void Mod_PSKMODEL_Load(model_t *mod, void *buffer, void *bufferend) Host_Error ("Mod_PSKMODEL_Load: %s is not an Unreal Engine ActorX (.psk + .psa) model", loadmodel->name); loadmodel->modeldatatypestring = "PSK"; - + loadmodel->type = mod_alias; loadmodel->DrawSky = NULL; loadmodel->DrawAddWaterPlanes = NULL; loadmodel->Draw = R_Q1BSP_Draw; loadmodel->DrawDepth = R_Q1BSP_DrawDepth; + loadmodel->DrawDebug = R_Q1BSP_DrawDebug; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; diff --git a/model_brush.c b/model_brush.c index 833787e1..00df8ca0 100644 --- a/model_brush.c +++ b/model_brush.c @@ -3630,6 +3630,7 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) mod->DrawAddWaterPlanes = NULL; mod->Draw = R_Q1BSP_Draw; mod->DrawDepth = R_Q1BSP_DrawDepth; + mod->DrawDebug = R_Q1BSP_DrawDebug; mod->GetLightInfo = R_Q1BSP_GetLightInfo; mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; @@ -5618,6 +5619,7 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend) mod->brush.PointInLeaf = Mod_Q1BSP_PointInLeaf; mod->Draw = R_Q1BSP_Draw; mod->DrawDepth = R_Q1BSP_DrawDepth; + mod->DrawDebug = R_Q1BSP_DrawDebug; mod->GetLightInfo = R_Q1BSP_GetLightInfo; mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; diff --git a/model_shared.h b/model_shared.h index eaf147ac..ea5e5877 100644 --- a/model_shared.h +++ b/model_shared.h @@ -826,6 +826,8 @@ typedef struct model_s void(*Draw)(struct entity_render_s *ent); // draw the model to the depth buffer (no color rendering at all) void(*DrawDepth)(struct entity_render_s *ent); + // draw any enabled debugging effects on this model (such as showing triangles, normals, collision brushes...) + void(*DrawDebug)(struct entity_render_s *ent); // gathers info on which clusters and surfaces are lit by light, as well as calculating a bounding box void(*GetLightInfo)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs); // compile a shadow volume for the model based on light source @@ -934,6 +936,7 @@ void R_Q1BSP_DrawAddWaterPlanes(struct entity_render_s *ent); void R_Q1BSP_DrawSky(struct entity_render_s *ent); void R_Q1BSP_Draw(struct entity_render_s *ent); void R_Q1BSP_DrawDepth(struct entity_render_s *ent); +void R_Q1BSP_DrawDebug(struct entity_render_s *ent); void R_Q1BSP_GetLightInfo(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs); void R_Q1BSP_CompileShadowVolume(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist); void R_Q1BSP_DrawShadowVolume(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs); diff --git a/render.h b/render.h index 039d697f..3fd24e90 100644 --- a/render.h +++ b/render.h @@ -353,8 +353,8 @@ struct msurface_s; void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t); void R_UpdateAllTextureInfo(entity_render_t *ent); void R_QueueTextureSurfaceList(int texturenumsurfaces, msurface_t **texturesurfacelist); -void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes); -void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes); +void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes, qboolean debug); +void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes, qboolean debug); void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generatetangents, int texturenumsurfaces, msurface_t **texturesurfacelist); void RSurf_DrawBatch_Simple(int texturenumsurfaces, msurface_t **texturesurfacelist); -- 2.39.2