]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
removed rsurface_entity field, and copied all fields that were accessed
[xonotic/darkplaces.git] / gl_rsurf.c
index 91042d0a89c5dc51edb0ce612eac5411f3171567..6f1d9625f74996bfdb24fb1d3aa80ab8e2580497 100644 (file)
@@ -25,7 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #define MAX_LIGHTMAP_SIZE 256
 
-cvar_t r_ambient = {0, "r_ambient", "0", "brighter world cheat (not allowed in multiplayer), value is 0-128"};
+cvar_t r_ambient = {0, "r_ambient", "0", "brightens map, value is 0-128"};
 cvar_t r_lockpvs = {0, "r_lockpvs", "0", "disables pvs switching, allows you to walk around and inspect what is visible from a given location in the map (anything not visible from your current location will not be drawn)"};
 cvar_t r_lockvisibility = {0, "r_lockvisibility", "0", "disables visibility updates, allows you to walk around and inspect what is visible from a given viewpoint in the map (anything offscreen at the moment this is enabled will not be drawn)"};
 cvar_t r_useportalculling = {0, "r_useportalculling", "1", "use advanced portal culling visibility method to improve performance over just Potentially Visible Set, provides an even more significant speed improvement in unvised maps"};
@@ -44,16 +44,30 @@ void R_BuildLightMap (const entity_render_t *ent, msurface_t *surface)
        int *bl, scale;
        unsigned char *lightmap, *out, *stain;
        model_t *model = ent->model;
-       static int intblocklights[MAX_LIGHTMAP_SIZE*MAX_LIGHTMAP_SIZE*3]; // LordHavoc: *3 for colored lighting
-       static unsigned char templight[MAX_LIGHTMAP_SIZE*MAX_LIGHTMAP_SIZE*4];
-
-       // update cached lighting info
-       surface->cached_dlight = 0;
+       int *intblocklights;
+       unsigned char *templight;
 
        smax = (surface->lightmapinfo->extents[0]>>4)+1;
        tmax = (surface->lightmapinfo->extents[1]>>4)+1;
        size = smax*tmax;
        size3 = size*3;
+
+       if (cl.buildlightmapmemorysize < size*sizeof(int[3]))
+       {
+               cl.buildlightmapmemorysize = size*sizeof(int[3]);
+               if (cl.buildlightmapmemory)
+                       Mem_Free(cl.buildlightmapmemory);
+               cl.buildlightmapmemory = Mem_Alloc(cls.levelmempool, cl.buildlightmapmemorysize);
+       }
+
+       // these both point at the same buffer, templight is only used for final
+       // processing and can replace the intblocklights data as it goes
+       intblocklights = (int *)cl.buildlightmapmemory;
+       templight = (unsigned char *)cl.buildlightmapmemory;
+
+       // update cached lighting info
+       surface->cached_dlight = 0;
+
        lightmap = surface->lightmapinfo->samples;
 
 // set to full bright if no light data
@@ -337,6 +351,7 @@ static void R_DrawPortal_Callback(const entity_render_t *ent, const rtlight_t *r
        CHECKGLERROR
        GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        GL_DepthMask(false);
+       GL_DepthRange(0, 1);
        GL_DepthTest(true);
        GL_CullFace(GL_NONE);
        R_Mesh_Matrix(&identitymatrix);
@@ -508,9 +523,9 @@ void R_Q1BSP_DrawSky(entity_render_t *ent)
        if (ent->model == NULL)
                return;
        if (ent == r_refdef.worldentity)
-               R_DrawWorldSurfaces(true);
+               R_DrawWorldSurfaces(true, true, false);
        else
-               R_DrawModelSurfaces(ent, true);
+               R_DrawModelSurfaces(ent, true, true, false);
 }
 
 void R_Q1BSP_Draw(entity_render_t *ent)
@@ -519,9 +534,20 @@ void R_Q1BSP_Draw(entity_render_t *ent)
        if (model == NULL)
                return;
        if (ent == r_refdef.worldentity)
-               R_DrawWorldSurfaces(false);
+               R_DrawWorldSurfaces(false, true, false);
+       else
+               R_DrawModelSurfaces(ent, false, true, false);
+}
+
+void R_Q1BSP_DrawDepth(entity_render_t *ent)
+{
+       model_t *model = ent->model;
+       if (model == NULL)
+               return;
+       if (ent == r_refdef.worldentity)
+               R_DrawWorldSurfaces(false, false, true);
        else
-               R_DrawModelSurfaces(ent, false);
+               R_DrawModelSurfaces(ent, false, false, true);
 }
 
 typedef struct r_q1bsp_getlightinfo_s
@@ -982,7 +1008,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
        model_t *model = ent->model;
        msurface_t *surface;
        int i, k, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex;
-       qboolean usebufferobject;
+       qboolean usebufferobject, culltriangles;
        const int *element3i;
        msurface_t *batchsurfacelist[RSURF_MAX_BATCHSURFACES];
        int batchelements[BATCHSIZE*3];
@@ -991,6 +1017,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
        RSurf_ActiveModelEntity(ent, true, true);
        R_UpdateAllTextureInfo(ent);
        CHECKGLERROR
+       culltriangles = r_shadow_culltriangles.integer && !(ent->flags & RENDER_NOSELFSHADOW);
        element3i = rsurface_model->surfmesh.data_element3i;
        // this is a double loop because non-visible surface skipping has to be
        // fast, and even if this is not the world model (and hence no visibility
@@ -1020,7 +1047,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                        rsurface_texture = tex->currentframe;
                        if (rsurface_texture->currentmaterialflags & (MATERIALFLAG_WALL | MATERIALFLAG_WATER))
                        {
-                               if (rsurface_texture->currentmaterialflags & MATERIALFLAG_BLENDED)
+                               if (rsurface_texture->currentmaterialflags & MATERIALFLAGMASK_DEPTHSORTED)
                                {
                                        vec3_t tempcenter, center;
                                        for (l = k;l < batchnumsurfaces && tex == batchsurfacelist[l]->texture;l++)
@@ -1029,8 +1056,8 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                                                tempcenter[0] = (surface->mins[0] + surface->maxs[0]) * 0.5f;
                                                tempcenter[1] = (surface->mins[1] + surface->maxs[1]) * 0.5f;
                                                tempcenter[2] = (surface->mins[2] + surface->maxs[2]) * 0.5f;
-                                               Matrix4x4_Transform(&rsurface_entity->matrix, tempcenter, center);
-                                               R_MeshQueue_AddTransparent(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST ? r_view.origin : center, R_Q1BSP_DrawLight_TransparentCallback, rsurface_entity, surface - rsurface_model->data_surfaces, r_shadow_rtlight);
+                                               Matrix4x4_Transform(&rsurface_matrix, tempcenter, center);
+                                               R_MeshQueue_AddTransparent(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST ? r_view.origin : center, R_Q1BSP_DrawLight_TransparentCallback, ent, surface - rsurface_model->data_surfaces, r_shadow_rtlight);
                                        }
                                }
                                else
@@ -1048,7 +1075,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                                                RSurf_PrepareVerticesForBatch(true, true, 1, &surface);
                                                for (m = surface->num_firsttriangle, mend = m + surface->num_triangles;m < mend;m++)
                                                {
-                                                       if (r_shadow_culltriangles.integer)
+                                                       if (culltriangles)
                                                        {
                                                                if (trispvs)
                                                                {
@@ -1109,6 +1136,7 @@ void R_ReplaceWorldTexture (void)
        texture_t       *t;
        int                     i;
        const char      *r, *newt;
+       skinframe_t *skinframe;
        m = r_refdef.worldmodel;
 
        if(Cmd_Argc() < 2)
@@ -1130,15 +1158,15 @@ void R_ReplaceWorldTexture (void)
        {
                if(t->width && !strcasecmp(t->name, r))
                {
-                       if(Mod_LoadSkinFrame(&t->skinframes[0], (char*)newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, r_fullbrights.integer))
+                       if ((skinframe = R_SkinFrame_LoadExternal((char*)newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true)))
                        {
+                               t->skinframes[0] = skinframe;
                                Con_Printf("%s replaced with %s\n", r, newt);
                                return;
                        }
                        else
                        {
                                Con_Printf("%s was not found\n", newt);
-                               Mod_LoadSkinFrame(&t->skinframes[0], (char*)r, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, r_fullbrights.integer);//back to default
                                return;
                        }
                }