]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
added DP_SV_MODELFLAGS_AS_EFFECTS extension, this adds EF_ROCKET and
[xonotic/darkplaces.git] / csprogs.c
index 1268888dd6eb7a248a4666602b0dc76a0b65587d..5a241863c8710636429f47a018ad38118e9887f6 100644 (file)
--- a/csprogs.c
+++ b/csprogs.c
@@ -66,8 +66,8 @@ static void CSQC_SetGlobals (void)
                prog->globals.client->time = cl.time;
                prog->globals.client->frametime = cl.time - csqc_frametime;
                csqc_frametime = cl.time;
                prog->globals.client->time = cl.time;
                prog->globals.client->frametime = cl.time - csqc_frametime;
                csqc_frametime = cl.time;
-               prog->globals.client->servercommandframe = cl.servermovesequence;
-               prog->globals.client->clientcommandframe = cl.movesequence;
+               prog->globals.client->servercommandframe = cls.servermovesequence;
+               prog->globals.client->clientcommandframe = cls.movesequence;
                VectorCopy(cl.viewangles, prog->globals.client->input_angles);
                VectorCopy(cl.viewangles, csqc_angles);
                prog->globals.client->input_buttons = cl.cmd.buttons;
                VectorCopy(cl.viewangles, prog->globals.client->input_angles);
                VectorCopy(cl.viewangles, csqc_angles);
                prog->globals.client->input_buttons = cl.cmd.buttons;
@@ -109,7 +109,7 @@ void CSQC_Think (prvm_edict_t *ed)
 extern cvar_t cl_noplayershadow;
 qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
 {
 extern cvar_t cl_noplayershadow;
 qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
 {
-       int i, renderflags;
+       int renderflags;
        float scale;
        prvm_eval_t *val;
        entity_t *e;
        float scale;
        prvm_eval_t *val;
        entity_t *e;
@@ -128,14 +128,14 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        e->render.colormap = (int)ed->fields.client->colormap;
        e->render.frame = (int)ed->fields.client->frame;
        e->render.skinnum = (int)ed->fields.client->skin;
        e->render.colormap = (int)ed->fields.client->colormap;
        e->render.frame = (int)ed->fields.client->frame;
        e->render.skinnum = (int)ed->fields.client->skin;
-       e->render.effects |= e->render.model->flags2 & (EF_FULLBRIGHT | EF_ADDITIVE);
+       e->render.effects |= e->render.model->effects;
        scale = 1;
        renderflags = 0;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.renderflags)) && val->_float)     renderflags = (int)val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.alpha)) && val->_float)           e->render.alpha = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.scale)) && val->_float)           e->render.scale = scale = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.colormod)) && VectorLength2(val->vector)) VectorCopy(val->vector, e->render.colormod);
        scale = 1;
        renderflags = 0;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.renderflags)) && val->_float)     renderflags = (int)val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.alpha)) && val->_float)           e->render.alpha = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.scale)) && val->_float)           e->render.scale = scale = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.colormod)) && VectorLength2(val->vector)) VectorCopy(val->vector, e->render.colormod);
-       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.effects)) && val->_float) e->render.effects = (int)val->_float;
+       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.effects)) && val->_float) e->render.effects |= (int)val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.tag_entity)) && val->edict)
        {
                int tagentity;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.tag_entity)) && val->edict)
        {
                int tagentity;
@@ -168,41 +168,41 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
                Matrix4x4_CreateFromQuakeEntity(&matrix2, ed->fields.client->origin[0], ed->fields.client->origin[1], ed->fields.client->origin[2], angles[0], angles[1], angles[2], scale);
        }
 
                Matrix4x4_CreateFromQuakeEntity(&matrix2, ed->fields.client->origin[0], ed->fields.client->origin[1], ed->fields.client->origin[2], angles[0], angles[1], angles[2], scale);
        }
 
-       // FIXME: csqc has frame1/frame2/frame1time/frame2time/lerpfrac but this implementation's cl_entvars_t lacks those fields
+       // set up the animation data
+       // self.frame is the interpolation target (new frame)
+       // self.frame1time is the animation base time for the interpolation target
+       // self.frame2 is the interpolation start (previous frame)
+       // self.frame2time is the animation base time for the interpolation start
        e->render.frame1 = e->render.frame = ed->fields.client->frame;
        e->render.frame1 = e->render.frame = ed->fields.client->frame;
-       e->render.frame1time = e->render.frame2time = 0;
-       e->render.framelerp = 0;
+       if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2))) e->render.frame1 = val->_float;
+       if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame1time))) e->render.frame2time = val->_float;
+       if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2time))) e->render.frame1time = val->_float;
+       if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.lerpfrac))) e->render.framelerp = val->_float;
 
        // concat the matrices to make the entity relative to its tag
        Matrix4x4_Concat(&e->render.matrix, &tagmatrix, &matrix2);
        // make the other useful stuff
        CL_UpdateRenderEntity(&e->render);
 
 
        // concat the matrices to make the entity relative to its tag
        Matrix4x4_Concat(&e->render.matrix, &tagmatrix, &matrix2);
        // make the other useful stuff
        CL_UpdateRenderEntity(&e->render);
 
-       i = 0;
-       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.renderflags)) && val->_float)
+       if(renderflags)
        {
        {
-               i = (int)val->_float;
-               if(i & RF_VIEWMODEL)    e->render.flags |= RENDER_VIEWMODEL;
-               if(i & RF_EXTERNALMODEL)e->render.flags |= RENDER_EXTERIORMODEL;
-               if(i & RF_DEPTHHACK)    e->render.effects |= EF_NODEPTHTEST;
-               if(i & RF_ADDITIVE)             e->render.effects |= EF_ADDITIVE;
+               if(renderflags & RF_VIEWMODEL)  e->render.flags |= RENDER_VIEWMODEL;
+               if(renderflags & RF_EXTERNALMODEL)e->render.flags |= RENDER_EXTERIORMODEL;
+               if(renderflags & RF_DEPTHHACK)  e->render.effects |= EF_NODEPTHTEST;
+               if(renderflags & RF_ADDITIVE)           e->render.effects |= EF_ADDITIVE;
        }
 
        }
 
-       // transparent stuff can't be lit during the opaque stage
-       if (e->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || e->render.alpha < 1)
-               e->render.flags |= RENDER_TRANSPARENT;
-       // double sided rendering mode causes backfaces to be visible
-       // (mostly useful on transparent stuff)
-       if (e->render.effects & EF_DOUBLESIDED)
-               e->render.flags |= RENDER_NOCULLFACE;
        // either fullbright or lit
        if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
                e->render.flags |= RENDER_LIGHT;
        // hide player shadow during intermission or nehahra movie
        // either fullbright or lit
        if (!(e->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
                e->render.flags |= RENDER_LIGHT;
        // hide player shadow during intermission or nehahra movie
-       if (!(e->render.effects & EF_NOSHADOW)
-        && !(e->render.flags & (RENDER_VIEWMODEL | RENDER_TRANSPARENT))
+       if (!(e->render.effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST))
+        &&  (e->render.alpha >= 1)
+        && !(e->render.flags & RENDER_VIEWMODEL)
         && (!(e->render.flags & RENDER_EXTERIORMODEL) || (!cl.intermission && cls.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer)))
                e->render.flags |= RENDER_SHADOW;
         && (!(e->render.flags & RENDER_EXTERIORMODEL) || (!cl.intermission && cls.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer)))
                e->render.flags |= RENDER_SHADOW;
+       if (e->render.flags & RENDER_VIEWMODEL)
+               e->render.flags |= RENDER_NOSELFSHADOW;
 
        return true;
 }
 
        return true;
 }