]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
use larger batches for shadowmaps
[xonotic/darkplaces.git] / csprogs.c
index 5ed99d11026be6c6e3825b26b87f7e5b82e06fdb..75e7f106918eb59aeeadd92057756d1350ad8839 100644 (file)
--- a/csprogs.c
+++ b/csprogs.c
@@ -153,6 +153,7 @@ void CSQC_Think (prvm_edict_t *ed)
 }
 
 extern cvar_t cl_noplayershadow;
+extern cvar_t r_equalize_entities_fullbright;
 qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
 {
        int renderflags;
@@ -180,6 +181,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.alpha)) && val->_float)           entrender->alpha = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.scale)) && val->_float)           entrender->scale = scale = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.colormod)) && VectorLength2(val->vector)) VectorCopy(val->vector, entrender->colormod);
+       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.glowmod)) && VectorLength2(val->vector))  VectorCopy(val->vector, entrender->glowmod);
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.effects)) && val->_float) entrender->effects |= (int)val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.tag_entity)) && val->edict)
        {
@@ -192,6 +194,10 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        }
        else
                Matrix4x4_CreateIdentity(&tagmatrix);
+       if (!VectorLength2(entrender->colormod))
+               VectorSet(entrender->colormod, 1, 1, 1);
+       if (!VectorLength2(entrender->glowmod))
+               VectorSet(entrender->glowmod, 1, 1, 1);
 
        if (renderflags & RF_USEAXIS)
        {
@@ -239,12 +245,18 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        // concat the matrices to make the entity relative to its tag
        Matrix4x4_Concat(&entrender->matrix, &tagmatrix, &matrix2);
 
+       // transparent offset
+       if ((renderflags & RF_USETRANSPARENTOFFSET) && (val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.transparent_offset)))
+               entrender->transparent_offset = val->_float;
+
        if(renderflags)
        {
-               if(renderflags & RF_VIEWMODEL)  entrender->flags |= RENDER_VIEWMODEL;
+               if(renderflags & RF_VIEWMODEL)  entrender->flags |= RENDER_VIEWMODEL | RENDER_NODEPTHTEST;
                if(renderflags & RF_EXTERNALMODEL)entrender->flags |= RENDER_EXTERIORMODEL;
-               if(renderflags & RF_DEPTHHACK)  entrender->effects |= EF_NODEPTHTEST;
-               if(renderflags & RF_ADDITIVE)           entrender->effects |= EF_ADDITIVE;
+               if(renderflags & RF_NOCULL)             entrender->flags |= RENDER_NOCULL;
+               if(renderflags & RF_DEPTHHACK)  entrender->flags |= RENDER_NODEPTHTEST;
+               if(renderflags & RF_ADDITIVE)           entrender->flags |= RENDER_ADDITIVE;
+
        }
 
        c = (int)ed->fields.client->colormap;
@@ -257,8 +269,13 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
 
        entrender->flags &= ~(RENDER_SHADOW | RENDER_LIGHT | RENDER_NOSELFSHADOW);
        // either fullbright or lit
-       if (!(entrender->effects & EF_FULLBRIGHT) && !r_fullbright.integer)
-               entrender->flags |= RENDER_LIGHT;
+       if(!r_fullbright.integer)
+       {
+               if (!(entrender->effects & EF_FULLBRIGHT))
+                       entrender->flags |= RENDER_LIGHT;
+               else if(r_equalize_entities_fullbright.integer)
+                       entrender->flags |= RENDER_LIGHT | RENDER_EQUALIZE;
+       }
        // hide player shadow during intermission or nehahra movie
        if (!(entrender->effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST))
         &&  (entrender->alpha >= 1)
@@ -269,6 +286,12 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
                entrender->flags |= RENDER_NOSELFSHADOW;
        if (entrender->effects & EF_NOSELFSHADOW)
                entrender->flags |= RENDER_NOSELFSHADOW;
+       if (entrender->effects & EF_NODEPTHTEST)
+               entrender->flags |= RENDER_NODEPTHTEST;
+       if (entrender->effects & EF_ADDITIVE)
+               entrender->flags |= RENDER_ADDITIVE;
+       if (entrender->effects & EF_DOUBLESIDED)
+               entrender->flags |= RENDER_DOUBLESIDED;
 
        // make the other useful stuff
        CL_UpdateRenderEntity(entrender);
@@ -720,6 +743,8 @@ void CL_VM_CB_FreeEdict(prvm_edict_t *ed)
 {
        World_UnlinkEdict(ed);
        memset(ed->fields.client, 0, sizeof(*ed->fields.client));
+       World_Physics_RemoveFromEntity(&cl.world, ed);
+       World_Physics_RemoveJointFromEntity(&cl.world, ed);
 }
 
 void CL_VM_CB_CountEdicts(void)