]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
updated readme
[xonotic/darkplaces.git] / csprogs.c
index 1268888dd6eb7a248a4666602b0dc76a0b65587d..e072a038091b9d396f6461e1743b7d5dc8851ac9 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->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;
@@ -168,10 +168,16 @@ 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);
        }
 
-       // 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.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);
@@ -188,19 +194,13 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
                if(i & 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
-       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;