X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=csprogs.c;h=5a241863c8710636429f47a018ad38118e9887f6;hp=1268888dd6eb7a248a4666602b0dc76a0b65587d;hb=397530aecdd5492236e3dc5620ee7126078c07f3;hpb=16742571f9a7d696a654668febdc10b4f4affd57 diff --git a/csprogs.c b/csprogs.c index 1268888d..5a241863 100644 --- 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; @@ -109,7 +109,7 @@ void CSQC_Think (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; @@ -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.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); - 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; @@ -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); } - // 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); // 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 - 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; + if (e->render.flags & RENDER_VIEWMODEL) + e->render.flags |= RENDER_NOSELFSHADOW; return true; }