]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
r_showtris/r_shownormals/r_showcollisionbrushes are no longer obscured
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 1 Oct 2007 03:37:39 +0000 (03:37 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Mon, 1 Oct 2007 03:37:39 +0000 (03:37 +0000)
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
gl_rsurf.c
model_alias.c
model_brush.c
model_shared.h
render.h

index af984312c766ff15cb98dc0669ac1e0d563709a6..d5f50d07002364845df6427e0b561be677437eb0 100644 (file)
@@ -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;
 static void R_DrawModelsAddWaterPlanes(void)
 {
        int i;
@@ -3289,6 +3308,21 @@ void R_RenderScene(qboolean addwaterplanes)
                qglUseProgramObjectARB(0);CHECKGLERROR
        }
 
                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();
        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;
 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;
        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();
        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_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);
 }
 
 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;
 {
        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));
 
        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;
        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();
                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;
 {
        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));
 
        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;
        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();
                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);
-       }
 }
 }
index d18e540aa9d892bb434fd4ebb57e021dbd6ac640..5cd7f27a3ebafa89394167a4eb3cc14e5a0bba9c 100644 (file)
@@ -547,9 +547,9 @@ void R_Q1BSP_DrawSky(entity_render_t *ent)
        if (ent->model == NULL)
                return;
        if (ent == r_refdef.worldentity)
        if (ent->model == NULL)
                return;
        if (ent == r_refdef.worldentity)
-               R_DrawWorldSurfaces(true, true, false, false);
+               R_DrawWorldSurfaces(true, true, false, false, false);
        else
        else
-               R_DrawModelSurfaces(ent, true, true, false, false);
+               R_DrawModelSurfaces(ent, true, true, false, false, false);
 }
 
 void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent)
 }
 
 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)
        if (model == NULL)
                return;
        if (ent == r_refdef.worldentity)
-               R_DrawWorldSurfaces(false, false, false, true);
+               R_DrawWorldSurfaces(false, false, false, true, false);
        else
        else
-               R_DrawModelSurfaces(ent, false, false, false, true);
+               R_DrawModelSurfaces(ent, false, false, false, true, false);
 }
 
 void R_Q1BSP_Draw(entity_render_t *ent)
 }
 
 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)
        if (model == NULL)
                return;
        if (ent == r_refdef.worldentity)
-               R_DrawWorldSurfaces(false, true, false, false);
+               R_DrawWorldSurfaces(false, true, false, false, false);
        else
        else
-               R_DrawModelSurfaces(ent, false, true, false, false);
+               R_DrawModelSurfaces(ent, false, true, false, false, false);
 }
 
 void R_Q1BSP_DrawDepth(entity_render_t *ent)
 }
 
 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)
        if (model == NULL)
                return;
        if (ent == r_refdef.worldentity)
-               R_DrawWorldSurfaces(false, false, true, false);
+               R_DrawWorldSurfaces(false, false, true, false, false);
        else
        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
 }
 
 typedef struct r_q1bsp_getlightinfo_s
index c53867e454b901365162da0e34adad96f4659f35..b891b1faea22f1f181546bb716bdc79093aa636b 100644 (file)
@@ -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->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;
        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->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->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;
        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->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;
        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->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;
        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";
                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;
 
        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->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;
        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";
                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->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;
        loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
        loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
        loadmodel->DrawLight = R_Q1BSP_DrawLight;
index 833787e1de58792aa2521a17e8dd028fe73a163e..00df8ca01600c66aa9a8e7205238eb83e6da867b 100644 (file)
@@ -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->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;
                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->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;
        mod->GetLightInfo = R_Q1BSP_GetLightInfo;
        mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
        mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
index eaf147ac2d125e7471a2d4bad9e6fdbda785c3b2..ea5e58770a921f689e0770013ab498f23580c3d5 100644 (file)
@@ -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);
        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
        // 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_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);
 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);
index 039d697f353a91d28dc4e2a19a28c3b797836b74..3fd24e9020205292794791c06fba0e64b72b863e 100644 (file)
--- 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_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);
 
 void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generatetangents, int texturenumsurfaces, msurface_t **texturesurfacelist);
 void RSurf_DrawBatch_Simple(int texturenumsurfaces, msurface_t **texturesurfacelist);