/* * ================ * R_AliasSetupLighting * ================ */ static void R_AliasSetupLighting(alight_t plighting) { // guarantee that no vertex will ever be lit below LIGHT_MIN, so we don't have // to clamp off the bottom r_ambientlight = plighting.ambientlight; if (r_ambientlight < LIGHT_MIN) { r_ambientlight = LIGHT_MIN; } r_ambientlight = (255 - r_ambientlight) << vid.VID_CBITS; if (r_ambientlight < LIGHT_MIN) { r_ambientlight = LIGHT_MIN; } r_shadelight = plighting.shadelight; if (r_shadelight < 0) { r_shadelight = 0; } r_shadelight *= vid.VID_GRADES; // rotate the lighting vector into the model's frame of reference r_plightvec[0] = mathlib.DotProduct(plighting.plightvec, alias_forward); r_plightvec[1] = -mathlib.DotProduct(plighting.plightvec, alias_right); r_plightvec[2] = mathlib.DotProduct(plighting.plightvec, alias_up); }
/* * ================ * R_AliasDrawModel * ================ */ static void R_AliasDrawModel(alight_t plighting) { r_amodels_drawn++; // cache align pfinalverts = (draw.finalvert_t[])finalverts; pauxverts = auxverts; paliashdr = (model.aliashdr_t)model.Mod_Extradata(currententity.model); pmdl = (model.mdl_t)paliashdr.model; R_AliasSetupSkin(); R_AliasSetUpTransform(currententity.trivial_accept); R_AliasSetupLighting(plighting); R_AliasSetupFrame(); if (currententity.colormap == null) { sys_linux.Sys_Error("R_AliasDrawModel: !currententity.colormap"); } r_affinetridesc.drawtype = (currententity.trivial_accept == 3) && r_recursiveaffinetriangles; if (r_affinetridesc.drawtype) { draw.D_PolysetUpdateTables(); // FIXME: precalc... } else { } acolormap = currententity.colormap; if (currententity != client.cl.viewent) { ziscale = (double)0x8000 * (double)0x10000; } else { ziscale = (double)0x8000 * (double)0x10000 * 3.0; } if (currententity.trivial_accept != 0) { R_AliasPrepareUnclippedPoints(); } else { R_AliasPreparePoints(); } }
/* ============= R_DrawEntitiesOnList ============= */ static void R_DrawEntitiesOnList() { int i, j; int lnum; alight_t lighting = new alight_t(); // FIXME: remove and do real lighting double[] lightvec = {-1, 0, 0}; double[] dist = new double[3] {0, 0, 0}; double add; if (r_drawentities.value == 0) return; for (i=0 ; i<client.cl_numvisedicts ; i++) { currententity = client.cl_visedicts[i]; if (currententity == client.cl_entities[client.cl.viewentity]) { if (chase.chase_active.value == 0) { continue; // don't draw the player } else { currententity.angles[0] *= 0.3; } } switch (currententity.model.type) { case model.modtype_t.mod_sprite: mathlib.VectorCopy (currententity.origin, r_entorigin); mathlib.VectorSubtract(r_origin, r_entorigin, modelorg); R_DrawSprite (); break; case model.modtype_t.mod_alias: /*if (currententity.model.name.CompareTo("progs/flame2.mdl") != 0) continue;*/ mathlib.VectorCopy(currententity.origin, r_entorigin); mathlib.VectorSubtract(r_origin, r_entorigin, modelorg); // see if the bounding box lets us trivially reject, also sets // trivial accept status if (R_AliasCheckBBox ()) { j = R_LightPoint (currententity.origin); lighting.ambientlight = j; lighting.shadelight = j; lighting.plightvec = lightvec; for (lnum=0 ; lnum<client.MAX_DLIGHTS ; lnum++) { if (client.cl_dlights[lnum].die >= client.cl.time) { mathlib.VectorSubtract (currententity.origin, client.cl_dlights[lnum].origin, dist); add = client.cl_dlights[lnum].radius - mathlib.Length(dist); if (add > 0) lighting.ambientlight += (int)add; } } // clamp lighting so it doesn't overbright as much if (lighting.ambientlight > 128) lighting.ambientlight = 128; if (lighting.ambientlight + lighting.shadelight > 192) lighting.shadelight = 192 - lighting.ambientlight; R_AliasDrawModel (lighting); } break; default: break; } } }
/* ================ R_AliasSetupLighting ================ */ static void R_AliasSetupLighting(alight_t plighting) { // guarantee that no vertex will ever be lit below LIGHT_MIN, so we don't have // to clamp off the bottom r_ambientlight = plighting.ambientlight; if (r_ambientlight < LIGHT_MIN) r_ambientlight = LIGHT_MIN; r_ambientlight = (255 - r_ambientlight) << vid.VID_CBITS; if (r_ambientlight < LIGHT_MIN) r_ambientlight = LIGHT_MIN; r_shadelight = plighting.shadelight; if (r_shadelight < 0) r_shadelight = 0; r_shadelight *= vid.VID_GRADES; // rotate the lighting vector into the model's frame of reference r_plightvec[0] = mathlib.DotProduct(plighting.plightvec, alias_forward); r_plightvec[1] = -mathlib.DotProduct(plighting.plightvec, alias_right); r_plightvec[2] = mathlib.DotProduct(plighting.plightvec, alias_up); }
/* ================ R_AliasDrawModel ================ */ static void R_AliasDrawModel(alight_t plighting) { r_amodels_drawn++; // cache align pfinalverts = (draw.finalvert_t[])finalverts; pauxverts = auxverts; paliashdr = (model.aliashdr_t)model.Mod_Extradata (currententity.model); pmdl = (model.mdl_t)paliashdr.model; R_AliasSetupSkin (); R_AliasSetUpTransform (currententity.trivial_accept); R_AliasSetupLighting (plighting); R_AliasSetupFrame (); if (currententity.colormap == null) sys_linux.Sys_Error ("R_AliasDrawModel: !currententity.colormap"); r_affinetridesc.drawtype = (currententity.trivial_accept == 3) && r_recursiveaffinetriangles; if (r_affinetridesc.drawtype) { draw.D_PolysetUpdateTables (); // FIXME: precalc... } else { } acolormap = currententity.colormap; if (currententity != client.cl.viewent) ziscale = (double)0x8000 * (double)0x10000; else ziscale = (double)0x8000 * (double)0x10000 * 3.0; if (currententity.trivial_accept != 0) R_AliasPrepareUnclippedPoints (); else R_AliasPreparePoints (); }
/* * ============= * R_DrawEntitiesOnList * ============= */ static void R_DrawEntitiesOnList() { int i, j; int lnum; alight_t lighting = new alight_t(); // FIXME: remove and do real lighting double[] lightvec = { -1, 0, 0 }; double[] dist = new double[3]; double add; if (r_drawentities.value == 0) { return; } for (i = 0; i < client.cl_numvisedicts; i++) { currententity = client.cl_visedicts[i]; if (currententity == client.cl_entities[client.cl.viewentity]) { continue; // don't draw the player } switch (currententity.model.type) { case model.modtype_t.mod_sprite: mathlib.VectorCopy(currententity.origin, ref r_entorigin); mathlib.VectorSubtract(r_origin, r_entorigin, ref modelorg); R_DrawSprite(); break; case model.modtype_t.mod_alias: /*if (currententity.model.name.CompareTo("progs/flame2.mdl") != 0) * continue;*/ mathlib.VectorCopy(currententity.origin, ref r_entorigin); mathlib.VectorSubtract(r_origin, r_entorigin, ref modelorg); // see if the bounding box lets us trivially reject, also sets // trivial accept status if (R_AliasCheckBBox()) { j = R_LightPoint(currententity.origin); lighting.ambientlight = j; lighting.shadelight = j; lighting.plightvec = lightvec; for (lnum = 0; lnum < client.MAX_DLIGHTS; lnum++) { if (client.cl_dlights[lnum].die >= client.cl.time) { mathlib.VectorSubtract(currententity.origin, client.cl_dlights[lnum].origin, ref dist); add = client.cl_dlights[lnum].radius - mathlib.Length(dist); if (add > 0) { lighting.ambientlight += (int)add; } } } // clamp lighting so it doesn't overbright as much if (lighting.ambientlight > 128) { lighting.ambientlight = 128; } if (lighting.ambientlight + lighting.shadelight > 192) { lighting.shadelight = 192 - lighting.ambientlight; } R_AliasDrawModel(lighting); } break; default: break; } } }