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;
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;
}