X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=clvm_cmds.c;h=7d2ccfd4261fd46ea110744c36641f73f9224cea;hb=bd4f4aadea9be9173b4ab04ab2f98c86a2bc7410;hp=bbb29e248a5a34ce2662de30c95c58ffd8fe8e1a;hpb=8603a48360a8ad27c781778f2a727dff178ceb82;p=xonotic%2Fdarkplaces.git diff --git a/clvm_cmds.c b/clvm_cmds.c index bbb29e24..7d2ccfd4 100644 --- a/clvm_cmds.c +++ b/clvm_cmds.c @@ -165,15 +165,16 @@ static void VM_CL_setsize (prvm_prog_t *prog) CL_LinkEdict(e); } -// #8 void(entity e, float chan, string samp, float volume, float atten) sound +// #8 void(entity e, float chan, string samp, float volume, float atten[, float pitchchange[, float flags]]) sound static void VM_CL_sound (prvm_prog_t *prog) { const char *sample; int channel; prvm_edict_t *entity; - float volume; + float fvolume; float attenuation; float pitchchange; + float startposition; int flags; vec3_t org; @@ -182,10 +183,10 @@ static void VM_CL_sound (prvm_prog_t *prog) entity = PRVM_G_EDICT(OFS_PARM0); channel = (int)PRVM_G_FLOAT(OFS_PARM1); sample = PRVM_G_STRING(OFS_PARM2); - volume = PRVM_G_FLOAT(OFS_PARM3); + fvolume = PRVM_G_FLOAT(OFS_PARM3); attenuation = PRVM_G_FLOAT(OFS_PARM4); - if (volume < 0 || volume > 1) + if (fvolume < 0 || fvolume > 1) { VM_Warning(prog, "VM_CL_sound: volume must be in range 0-1\n"); return; @@ -201,12 +202,23 @@ static void VM_CL_sound (prvm_prog_t *prog) pitchchange = 0; else pitchchange = PRVM_G_FLOAT(OFS_PARM5); - // ignoring prog->argc < 7 for now (no flags supported yet) if (prog->argc < 7) flags = 0; else - flags = PRVM_G_FLOAT(OFS_PARM6); + { + // LordHavoc: we only let the qc set certain flags, others are off-limits + flags = (int)PRVM_G_FLOAT(OFS_PARM6) & (CHANNELFLAG_RELIABLE | CHANNELFLAG_FORCELOOP | CHANNELFLAG_PAUSED | CHANNELFLAG_FULLVOLUME); + } + + // sound_starttime exists instead of sound_startposition because in a + // networking sense you might not know when something is being received, + // so making sounds match up in sync would be impossible if relative + // position was sent + if (PRVM_clientglobalfloat(sound_starttime)) + startposition = cl.time - PRVM_clientglobalfloat(sound_starttime); + else + startposition = 0; channel = CHAN_USER2ENGINE(channel); @@ -217,14 +229,14 @@ static void VM_CL_sound (prvm_prog_t *prog) } CL_VM_GetEntitySoundOrigin(MAX_EDICTS + PRVM_NUM_FOR_EDICT(entity), org); - S_StartSound_StartPosition_Flags(MAX_EDICTS + PRVM_NUM_FOR_EDICT(entity), channel, S_FindName(sample), org, volume, attenuation, 0, flags, pitchchange > 0.0f ? pitchchange * 0.01f : 1.0f); + S_StartSound_StartPosition_Flags(MAX_EDICTS + PRVM_NUM_FOR_EDICT(entity), channel, S_FindName(sample), org, fvolume, attenuation, startposition, flags, pitchchange > 0.0f ? pitchchange * 0.01f : 1.0f); } // #483 void(vector origin, string sample, float volume, float attenuation) pointsound static void VM_CL_pointsound(prvm_prog_t *prog) { const char *sample; - float volume; + float fvolume; float attenuation; vec3_t org; @@ -232,10 +244,10 @@ static void VM_CL_pointsound(prvm_prog_t *prog) VectorCopy( PRVM_G_VECTOR(OFS_PARM0), org); sample = PRVM_G_STRING(OFS_PARM1); - volume = PRVM_G_FLOAT(OFS_PARM2); + fvolume = PRVM_G_FLOAT(OFS_PARM2); attenuation = PRVM_G_FLOAT(OFS_PARM3); - if (volume < 0 || volume > 1) + if (fvolume < 0 || fvolume > 1) { VM_Warning(prog, "VM_CL_pointsound: volume must be in range 0-1\n"); return; @@ -248,7 +260,7 @@ static void VM_CL_pointsound(prvm_prog_t *prog) } // Send World Entity as Entity to Play Sound (for CSQC, that is MAX_EDICTS) - S_StartSound(MAX_EDICTS, 0, S_FindName(sample), org, volume, attenuation); + S_StartSound(MAX_EDICTS, 0, S_FindName(sample), org, fvolume, attenuation); } // #14 entity() spawn @@ -290,7 +302,7 @@ static void VM_CL_traceline (prvm_prog_t *prog) if (VEC_IS_NAN(v1[0]) || VEC_IS_NAN(v1[1]) || VEC_IS_NAN(v1[2]) || VEC_IS_NAN(v2[0]) || VEC_IS_NAN(v2[1]) || VEC_IS_NAN(v2[2])) prog->error_cmd("%s: NAN errors detected in traceline('%f %f %f', '%f %f %f', %i, entity %i)\n", prog->name, v1[0], v1[1], v1[2], v2[0], v2[1], v2[2], move, PRVM_EDICT_TO_PROG(ent)); - trace = CL_TraceLine(v1, v2, move, ent, CL_GenericHitSuperContentsMask(ent), CL_HitNetworkBrushModels(move), CL_HitNetworkPlayers(move), &svent, true, false); + trace = CL_TraceLine(v1, v2, move, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendtracelinelength.value, CL_HitNetworkBrushModels(move), CL_HitNetworkPlayers(move), &svent, true, false); CL_VM_SetTraceGlobals(prog, &trace, svent); // R_TimeReport("traceline"); @@ -330,7 +342,7 @@ static void VM_CL_tracebox (prvm_prog_t *prog) if (VEC_IS_NAN(v1[0]) || VEC_IS_NAN(v1[1]) || VEC_IS_NAN(v1[2]) || VEC_IS_NAN(v2[0]) || VEC_IS_NAN(v2[1]) || VEC_IS_NAN(v2[2])) prog->error_cmd("%s: NAN errors detected in tracebox('%f %f %f', '%f %f %f', '%f %f %f', '%f %f %f', %i, entity %i)\n", prog->name, v1[0], v1[1], v1[2], m1[0], m1[1], m1[2], m2[0], m2[1], m2[2], v2[0], v2[1], v2[2], move, PRVM_EDICT_TO_PROG(ent)); - trace = CL_TraceBox(v1, m1, m2, v2, move, ent, CL_GenericHitSuperContentsMask(ent), CL_HitNetworkBrushModels(move), CL_HitNetworkPlayers(move), &svent, true); + trace = CL_TraceBox(v1, m1, m2, v2, move, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendtraceboxlength.value, CL_HitNetworkBrushModels(move), CL_HitNetworkPlayers(move), &svent, true); CL_VM_SetTraceGlobals(prog, &trace, svent); // R_TimeReport("tracebox"); @@ -366,7 +378,7 @@ static trace_t CL_Trace_Toss (prvm_prog_t *prog, prvm_edict_t *tossent, prvm_edi VectorCopy(PRVM_clientedictvector(tossent, origin), start); VectorCopy(PRVM_clientedictvector(tossent, mins), mins); VectorCopy(PRVM_clientedictvector(tossent, maxs), maxs); - trace = CL_TraceBox(start, mins, maxs, end, MOVE_NORMAL, tossent, CL_GenericHitSuperContentsMask(tossent), true, true, NULL, true); + trace = CL_TraceBox(start, mins, maxs, end, MOVE_NORMAL, tossent, CL_GenericHitSuperContentsMask(tossent), 0, 0, collision_extendmovelength.value, true, true, NULL, true); VectorCopy (trace.endpos, PRVM_clientedictvector(tossent, origin)); if (trace.fraction < 1) @@ -443,22 +455,6 @@ static void VM_CL_precache_model (prvm_prog_t *prog) VM_Warning(prog, "VM_CL_precache_model: model \"%s\" not found\n", name); } -static int CSQC_EntitiesInBox (prvm_prog_t *prog, vec3_t mins, vec3_t maxs, int maxlist, prvm_edict_t **list) -{ - prvm_edict_t *ent; - int i, k; - - ent = PRVM_NEXT_EDICT(prog->edicts); - for(k=0,i=1; inum_edicts ;i++, ent = PRVM_NEXT_EDICT(ent)) - { - if (ent->priv.required->free) - continue; - if(BoxesOverlap(mins, maxs, PRVM_clientedictvector(ent, absmin), PRVM_clientedictvector(ent, absmax))) - list[k++] = ent; - } - return k; -} - // #22 entity(vector org, float rad) findradius static void VM_CL_findradius (prvm_prog_t *prog) { @@ -490,7 +486,7 @@ static void VM_CL_findradius (prvm_prog_t *prog) maxs[0] = org[0] + (radius + 1); maxs[1] = org[1] + (radius + 1); maxs[2] = org[2] + (radius + 1); - numtouchedicts = CSQC_EntitiesInBox(prog, mins, maxs, MAX_EDICTS, touchedicts); + numtouchedicts = World_EntitiesInBox(&cl.world, mins, maxs, MAX_EDICTS, touchedicts); if (numtouchedicts > MAX_EDICTS) { // this never happens //[515]: for what then ? @@ -556,7 +552,7 @@ static void VM_CL_droptofloor (prvm_prog_t *prog) VectorCopy(PRVM_clientedictvector(ent, origin), end); end[2] -= 256; - trace = CL_TraceBox(start, mins, maxs, end, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), true, true, NULL, true); + trace = CL_TraceBox(start, mins, maxs, end, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, true, NULL, true); if (trace.fraction != 1) { @@ -634,7 +630,7 @@ realcheck: start[0] = stop[0] = (mins[0] + maxs[0])*0.5; start[1] = stop[1] = (mins[1] + maxs[1])*0.5; stop[2] = start[2] - 2*sv_stepheight.value; - trace = CL_TraceLine(start, stop, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), true, true, NULL, true, false); + trace = CL_TraceLine(start, stop, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, true, NULL, true, false); if (trace.fraction == 1.0) return; @@ -648,7 +644,7 @@ realcheck: start[0] = stop[0] = x ? maxs[0] : mins[0]; start[1] = stop[1] = y ? maxs[1] : mins[1]; - trace = CL_TraceLine(start, stop, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), true, true, NULL, true, false); + trace = CL_TraceLine(start, stop, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, true, NULL, true, false); if (trace.fraction != 1.0 && trace.endpos[2] > bottom) bottom = trace.endpos[2]; @@ -666,7 +662,7 @@ static void VM_CL_pointcontents (prvm_prog_t *prog) vec3_t point; VM_SAFEPARMCOUNT(1, VM_CL_pointcontents); VectorCopy(PRVM_G_VECTOR(OFS_PARM0), point); - PRVM_G_FLOAT(OFS_RETURN) = Mod_Q1BSP_NativeContentsFromSuperContents(NULL, CL_PointSuperContents(point)); + PRVM_G_FLOAT(OFS_RETURN) = Mod_Q1BSP_NativeContentsFromSuperContents(CL_PointSuperContents(point)); } // #48 void(vector o, vector d, float color, float count) particle @@ -700,17 +696,12 @@ static void VM_CL_getlight (prvm_prog_t *prog) { vec3_t ambientcolor, diffusecolor, diffusenormal; vec3_t p; + int flags = prog->argc >= 2 ? PRVM_G_FLOAT(OFS_PARM1) : LP_LIGHTMAP; VM_SAFEPARMCOUNTRANGE(1, 3, VM_CL_getlight); VectorCopy(PRVM_G_VECTOR(OFS_PARM0), p); - VectorClear(ambientcolor); - VectorClear(diffusecolor); - VectorClear(diffusenormal); - if (prog->argc >= 2) - R_CompleteLightPoint(ambientcolor, diffusecolor, diffusenormal, p, PRVM_G_FLOAT(OFS_PARM1)); - else if (cl.worldmodel && cl.worldmodel->brush.LightPoint) - cl.worldmodel->brush.LightPoint(cl.worldmodel, p, ambientcolor, diffusecolor, diffusenormal); + R_CompleteLightPoint(ambientcolor, diffusecolor, diffusenormal, p, flags, r_refdef.scene.lightmapintensity, r_refdef.scene.ambientintensity); VectorMA(ambientcolor, 0.5, diffusecolor, PRVM_G_VECTOR(OFS_RETURN)); if (PRVM_clientglobalvector(getlight_ambient)) VectorCopy(ambientcolor, PRVM_clientglobalvector(getlight_ambient)); @@ -723,11 +714,14 @@ static void VM_CL_getlight (prvm_prog_t *prog) //============================================================================ //[515]: SCENE MANAGER builtins +extern cvar_t v_yshearing; void CSQC_R_RecalcView (void) { extern matrix4x4_t viewmodelmatrix_nobob; extern matrix4x4_t viewmodelmatrix_withbob; Matrix4x4_CreateFromQuakeEntity(&r_refdef.view.matrix, cl.csqc_vieworigin[0], cl.csqc_vieworigin[1], cl.csqc_vieworigin[2], cl.csqc_viewangles[0], cl.csqc_viewangles[1], cl.csqc_viewangles[2], 1); + if (v_yshearing.value > 0) + Matrix4x4_QuakeToDuke3D(&r_refdef.view.matrix, &r_refdef.view.matrix, v_yshearing.value); Matrix4x4_Copy(&viewmodelmatrix_nobob, &r_refdef.view.matrix); Matrix4x4_ConcatScale(&viewmodelmatrix_nobob, cl_viewmodel_scale.value); Matrix4x4_Concat(&viewmodelmatrix_withbob, &r_refdef.view.matrix, &cl.csqc_viewmodelmatrixfromengine); @@ -759,7 +753,6 @@ static void VM_CL_R_AddEntities (prvm_prog_t *prog) VM_SAFEPARMCOUNT(1, VM_CL_R_AddEntities); drawmask = (int)PRVM_G_FLOAT(OFS_PARM0); CSQC_RelinkAllEntities(drawmask); - CL_RelinkLightFlashes(); PRVM_clientglobalfloat(time) = cl.time; for(i=1;inum_edicts;i++) @@ -1181,7 +1174,7 @@ static void VM_CL_project (prvm_prog_t *prog) VM_SAFEPARMCOUNT(1, VM_CL_project); VectorCopy(PRVM_G_VECTOR(OFS_PARM0), f); - Matrix4x4_Invert_Simple(&m, &r_refdef.view.matrix); + Matrix4x4_Invert_Full(&m, &r_refdef.view.matrix); Matrix4x4_Transform(&m, f, v); if(v_flipped.integer) v[1] = -v[1]; @@ -1341,7 +1334,7 @@ static void VM_CL_trailparticles (prvm_prog_t *prog) if (i < 0) return; - CL_ParticleEffect(i, 1, start, end, velocity, velocity, NULL, prog->argc >= 5 ? (int)PRVM_G_FLOAT(OFS_PARM4) : 0); + CL_ParticleTrail(i, 1, start, end, velocity, velocity, NULL, prog->argc >= 5 ? (int)PRVM_G_FLOAT(OFS_PARM4) : 0, true, true, NULL, NULL, 1); } //#337 void(float effectnum, vector origin, vector dir, float count[, float color]) pointparticles (EXT_CSQC) @@ -1368,10 +1361,13 @@ static void VM_CL_boxparticles (prvm_prog_t *prog) vec3_t origin_from, origin_to, dir_from, dir_to; float count; int flags; - float tintmins[4], tintmaxs[4]; + qboolean istrail; + float tintmins[4], tintmaxs[4], fade; VM_SAFEPARMCOUNTRANGE(7, 8, VM_CL_boxparticles); effectnum = (int)PRVM_G_FLOAT(OFS_PARM0); + if (effectnum < 0) + return; // own = PRVM_G_EDICT(OFS_PARM1); // TODO find use for this VectorCopy(PRVM_G_VECTOR(OFS_PARM2), origin_from); VectorCopy(PRVM_G_VECTOR(OFS_PARM3), origin_to ); @@ -1382,8 +1378,12 @@ static void VM_CL_boxparticles (prvm_prog_t *prog) flags = PRVM_G_FLOAT(OFS_PARM7); else flags = 0; + Vector4Set(tintmins, 1, 1, 1, 1); Vector4Set(tintmaxs, 1, 1, 1, 1); + fade = 1; + istrail = false; + if(flags & 1) // read alpha { tintmins[3] = PRVM_clientglobalfloat(particles_alphamin); @@ -1394,9 +1394,19 @@ static void VM_CL_boxparticles (prvm_prog_t *prog) VectorCopy(PRVM_clientglobalvector(particles_colormin), tintmins); VectorCopy(PRVM_clientglobalvector(particles_colormax), tintmaxs); } - if (effectnum < 0) - return; - CL_ParticleTrail(effectnum, count, origin_from, origin_to, dir_from, dir_to, NULL, 0, true, true, tintmins, tintmaxs); + if(flags & 4) // read fade + { + fade = PRVM_clientglobalfloat(particles_fade); + } + if(flags & 128) // draw as trail + { + istrail = true; + } + + if (istrail) + CL_ParticleTrail(effectnum, count, origin_from, origin_to, dir_from, dir_to, NULL, 0, true, true, tintmins, tintmaxs, fade); + else + CL_ParticleBox(effectnum, count, origin_from, origin_to, dir_from, dir_to, NULL, 0, true, true, tintmins, tintmaxs, fade); } //#531 void(float pause) setpause @@ -1433,9 +1443,9 @@ static void VM_CL_getmousepos(prvm_prog_t *prog) //#345 float(float framenum) getinputstate (EXT_CSQC) static void VM_CL_getinputstate (prvm_prog_t *prog) { - int i, frame; + unsigned int i, frame; VM_SAFEPARMCOUNT(1, VM_CL_getinputstate); - frame = (int)PRVM_G_FLOAT(OFS_PARM0); + frame = (unsigned int)PRVM_G_FLOAT(OFS_PARM0); PRVM_G_FLOAT(OFS_RETURN) = false; for (i = 0;i < CL_MAX_USERCMDS;i++) { @@ -1591,20 +1601,6 @@ static void VM_CL_getplayerkey (prvm_prog_t *prog) else if(!strcasecmp(c, "viewentity")) dpsnprintf(t, sizeof(t), "%i", i+1); - else - if(gamemode == GAME_XONOTIC && !strcasecmp(c, "TEMPHACK_origin")) - { - // PLEASE REMOVE THIS once deltalisten() of EXT_CSQC_1 - // is implemented, or Xonotic uses CSQC-networked - // players, whichever comes first - entity_t *e = cl.entities + (i+1); - if(e->state_current.active) - { - vec3_t origin; - Matrix4x4_OriginFromMatrix(&e->render.matrix, origin); - dpsnprintf(t, sizeof(t), VECTOR_LOSSLESS_FORMAT, origin[0], origin[1], origin[2]); - } - } if(!t[0]) return; PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, t); @@ -1705,14 +1701,14 @@ static void VM_CL_ReadPicture (prvm_prog_t *prog) const char *name; unsigned char *data; unsigned char *buf; - int size; + unsigned short size; int i; cachepic_t *pic; VM_SAFEPARMCOUNT(0, VM_CL_ReadPicture); name = MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring)); - size = MSG_ReadShort(&cl_message); + size = (unsigned short) MSG_ReadShort(&cl_message); // check if a texture of that name exists // if yes, it is used and the data is discarded @@ -1876,6 +1872,9 @@ static void VM_CL_copyentity (prvm_prog_t *prog) return; } memcpy(out->fields.fp, in->fields.fp, prog->entityfields * sizeof(prvm_vec_t)); + + if (VectorCompare(PRVM_clientedictvector(out, absmin), PRVM_clientedictvector(out, absmax))) + return; CL_LinkEdict(out); } @@ -2452,7 +2451,7 @@ static int CL_GetEntityLocalTagMatrix(prvm_prog_t *prog, prvm_edict_t *ent, int extern cvar_t cl_bob; extern cvar_t cl_bobcycle; extern cvar_t cl_bobup; -int CL_GetTagMatrix (prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *ent, int tagindex) +int CL_GetTagMatrix (prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *ent, int tagindex, prvm_vec_t *shadingorigin) { int ret; int attachloop; @@ -2525,6 +2524,16 @@ int CL_GetTagMatrix (prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *ent, int Matrix4x4_AdjustOrigin(out, 0, 0, bound(-7, bob, 4)); } */ + + // return the origin of the view + if (shadingorigin) + Matrix4x4_OriginFromMatrix(&r_refdef.view.matrix, shadingorigin); + } + else + { + // return the origin of the root entity in the chain + if (shadingorigin) + Matrix4x4_OriginFromMatrix(out, shadingorigin); } return 0; } @@ -2581,7 +2590,7 @@ static void VM_CL_gettaginfo (prvm_prog_t *prog) e = PRVM_G_EDICT(OFS_PARM0); tagindex = (int)PRVM_G_FLOAT(OFS_PARM1); - returncode = CL_GetTagMatrix(prog, &tag_matrix, e, tagindex); + returncode = CL_GetTagMatrix(prog, &tag_matrix, e, tagindex, NULL); Matrix4x4_ToVectors(&tag_matrix, forward, left, up, origin); VectorCopy(forward, PRVM_clientglobalvector(v_forward)); VectorScale(left, -1, PRVM_clientglobalvector(v_right)); @@ -3229,7 +3238,7 @@ static void VM_CL_GetEntity (prvm_prog_t *prog) VectorAdd(cl.entities[entnum].render.maxs, org, PRVM_G_VECTOR(OFS_RETURN)); break; case 16: // light - VectorMA(cl.entities[entnum].render.modellight_ambient, 0.5, cl.entities[entnum].render.modellight_diffuse, PRVM_G_VECTOR(OFS_RETURN)); + VectorMA(cl.entities[entnum].render.render_modellight_ambient, 0.5, cl.entities[entnum].render.render_modellight_diffuse, PRVM_G_VECTOR(OFS_RETURN)); break; default: PRVM_G_FLOAT(OFS_RETURN) = 0; @@ -3265,6 +3274,7 @@ static void VM_CL_R_RenderScene (prvm_prog_t *prog) // we need to update any RENDER_VIEWMODEL entities at this point because // csqc supplies its own view matrix CL_UpdateViewEntities(); + CL_UpdateEntityShading(); // now draw stuff! R_RenderView(); @@ -3379,7 +3389,6 @@ static void VMPolygons_Store(vmpolygons_t *polys) else { // queue the polygon as 3D for sorted transparent rendering later - int i; if (polys->max_triangles < polys->num_triangles + polys->begin_vertices-2) { while (polys->max_triangles < polys->num_triangles + polys->begin_vertices-2) @@ -3429,7 +3438,7 @@ void VM_CL_AddPolygonsToMeshQueue (prvm_prog_t *prog) for (i = 0;i < polys->num_triangles;i++) { VectorMAMAM(1.0f / 3.0f, polys->data_vertex3f + 3*polys->data_triangles[i].elements[0], 1.0f / 3.0f, polys->data_vertex3f + 3*polys->data_triangles[i].elements[1], 1.0f / 3.0f, polys->data_vertex3f + 3*polys->data_triangles[i].elements[2], center); - R_MeshQueue_AddTransparent(MESHQUEUE_SORT_DISTANCE, center, VM_DrawPolygonCallback, (entity_render_t *)polys, i, NULL); + R_MeshQueue_AddTransparent(TRANSPARENTSORT_DISTANCE, center, VM_DrawPolygonCallback, (entity_render_t *)polys, i, NULL); } /*polys->num_triangles = 0; // now done after rendering the scene, @@ -3536,63 +3545,6 @@ static void VM_CL_R_PolygonEnd (prvm_prog_t *prog) VM_Warning(prog, "VM_CL_R_PolygonEnd: %i vertices isn't a good choice\n", polys->begin_vertices); } -static vmpolygons_t debugPolys; - -void Debug_PolygonBegin(const char *picname, int drawflag) -{ - if(!debugPolys.initialized) - VM_InitPolygons(&debugPolys); - if(debugPolys.begin_active) - { - Con_Printf("Debug_PolygonBegin: called twice without Debug_PolygonEnd after first\n"); - return; - } - debugPolys.begin_texture = picname[0] ? Draw_CachePic_Flags (picname, CACHEPICFLAG_NOTPERSISTENT)->tex : r_texture_white; - debugPolys.begin_drawflag = drawflag; - debugPolys.begin_vertices = 0; - debugPolys.begin_active = true; -} - -void Debug_PolygonVertex(float x, float y, float z, float s, float t, float r, float g, float b, float a) -{ - if(!debugPolys.begin_active) - { - Con_Printf("Debug_PolygonVertex: Debug_PolygonBegin wasn't called\n"); - return; - } - - if(debugPolys.begin_vertices > VMPOLYGONS_MAXPOINTS) - { - Con_Printf("Debug_PolygonVertex: may have %i vertices max\n", VMPOLYGONS_MAXPOINTS); - return; - } - - debugPolys.begin_vertex[debugPolys.begin_vertices][0] = x; - debugPolys.begin_vertex[debugPolys.begin_vertices][1] = y; - debugPolys.begin_vertex[debugPolys.begin_vertices][2] = z; - debugPolys.begin_texcoord[debugPolys.begin_vertices][0] = s; - debugPolys.begin_texcoord[debugPolys.begin_vertices][1] = t; - debugPolys.begin_color[debugPolys.begin_vertices][0] = r; - debugPolys.begin_color[debugPolys.begin_vertices][1] = g; - debugPolys.begin_color[debugPolys.begin_vertices][2] = b; - debugPolys.begin_color[debugPolys.begin_vertices][3] = a; - debugPolys.begin_vertices++; -} - -void Debug_PolygonEnd(void) -{ - if (!debugPolys.begin_active) - { - Con_Printf("Debug_PolygonEnd: Debug_PolygonBegin wasn't called\n"); - return; - } - debugPolys.begin_active = false; - if (debugPolys.begin_vertices >= 3) - VMPolygons_Store(&debugPolys); - else - Con_Printf("Debug_PolygonEnd: %i vertices isn't a good choice\n", debugPolys.begin_vertices); -} - /* ============= CL_CheckBottom @@ -3638,7 +3590,7 @@ realcheck: start[0] = stop[0] = (mins[0] + maxs[0])*0.5; start[1] = stop[1] = (mins[1] + maxs[1])*0.5; stop[2] = start[2] - 2*sv_stepheight.value; - trace = CL_TraceLine(start, stop, MOVE_NOMONSTERS, ent, CL_GenericHitSuperContentsMask(ent), true, false, NULL, true, false); + trace = CL_TraceLine(start, stop, MOVE_NOMONSTERS, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, false, NULL, true, false); if (trace.fraction == 1.0) return false; @@ -3651,7 +3603,7 @@ realcheck: start[0] = stop[0] = x ? maxs[0] : mins[0]; start[1] = stop[1] = y ? maxs[1] : mins[1]; - trace = CL_TraceLine(start, stop, MOVE_NOMONSTERS, ent, CL_GenericHitSuperContentsMask(ent), true, false, NULL, true, false); + trace = CL_TraceLine(start, stop, MOVE_NOMONSTERS, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, false, NULL, true, false); if (trace.fraction != 1.0 && trace.endpos[2] > bottom) bottom = trace.endpos[2]; @@ -3704,7 +3656,7 @@ static qboolean CL_movestep (prvm_edict_t *ent, vec3_t move, qboolean relink, qb neworg[2] += 8; } VectorCopy(PRVM_clientedictvector(ent, origin), start); - trace = CL_TraceBox(start, mins, maxs, neworg, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), true, true, &svent, true); + trace = CL_TraceBox(start, mins, maxs, neworg, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, true, &svent, true); if (settrace) CL_VM_SetTraceGlobals(prog, &trace, svent); @@ -3732,14 +3684,14 @@ static qboolean CL_movestep (prvm_edict_t *ent, vec3_t move, qboolean relink, qb VectorCopy (neworg, end); end[2] -= sv_stepheight.value*2; - trace = CL_TraceBox(neworg, mins, maxs, end, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), true, true, &svent, true); + trace = CL_TraceBox(neworg, mins, maxs, end, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, true, &svent, true); if (settrace) CL_VM_SetTraceGlobals(prog, &trace, svent); if (trace.startsolid) { neworg[2] -= sv_stepheight.value; - trace = CL_TraceBox(neworg, mins, maxs, end, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), true, true, &svent, true); + trace = CL_TraceBox(neworg, mins, maxs, end, MOVE_NORMAL, ent, CL_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, true, true, &svent, true); if (settrace) CL_VM_SetTraceGlobals(prog, &trace, svent); if (trace.startsolid) @@ -3964,13 +3916,12 @@ static void VM_CL_skel_build(prvm_prog_t *prog) int firstbone = PRVM_G_FLOAT(OFS_PARM4) - 1; int lastbone = PRVM_G_FLOAT(OFS_PARM5) - 1; dp_model_t *model = CL_GetModelByIndex(modelindex); - float blendfrac; int numblends; int bonenum; int blendindex; framegroupblend_t framegroupblend[MAX_FRAMEGROUPBLENDS]; frameblend_t frameblend[MAX_FRAMEBLENDS]; - matrix4x4_t blendedmatrix; + matrix4x4_t bonematrix; matrix4x4_t matrix; PRVM_G_FLOAT(OFS_RETURN) = 0; if (skeletonindex < 0 || skeletonindex >= MAX_EDICTS || !(skeleton = prog->skeletons[skeletonindex])) @@ -3980,19 +3931,18 @@ static void VM_CL_skel_build(prvm_prog_t *prog) lastbone = min(lastbone, skeleton->model->num_bones - 1); VM_GenerateFrameGroupBlend(prog, framegroupblend, ed); VM_FrameBlendFromFrameGroupBlend(frameblend, framegroupblend, model, cl.time); - blendfrac = 1.0f - retainfrac; for (numblends = 0;numblends < MAX_FRAMEBLENDS && frameblend[numblends].lerp;numblends++) - frameblend[numblends].lerp *= blendfrac; + ; for (bonenum = firstbone;bonenum <= lastbone;bonenum++) { - memset(&blendedmatrix, 0, sizeof(blendedmatrix)); - Matrix4x4_Accumulate(&blendedmatrix, &skeleton->relativetransforms[bonenum], retainfrac); + memset(&bonematrix, 0, sizeof(bonematrix)); for (blendindex = 0;blendindex < numblends;blendindex++) { Matrix4x4_FromBonePose7s(&matrix, model->num_posescale, model->data_poses7s + 7 * (frameblend[blendindex].subframe * model->num_bones + bonenum)); - Matrix4x4_Accumulate(&blendedmatrix, &matrix, frameblend[blendindex].lerp); + Matrix4x4_Accumulate(&bonematrix, &matrix, frameblend[blendindex].lerp); } - skeleton->relativetransforms[bonenum] = blendedmatrix; + Matrix4x4_Normalize3(&bonematrix, &bonematrix); + Matrix4x4_Interpolate(&skeleton->relativetransforms[bonenum], &bonematrix, &skeleton->relativetransforms[bonenum], retainfrac); } PRVM_G_FLOAT(OFS_RETURN) = skeletonindex + 1; } @@ -4309,7 +4259,7 @@ static void VM_CL_V_CalcRefdef(prvm_prog_t *prog) flags = PRVM_G_FLOAT(OFS_PARM1); // use the CL_GetTagMatrix function on self to ensure consistent behavior (duplicate code would be bad) - CL_GetTagMatrix(prog, &entrendermatrix, ent, 0); + CL_GetTagMatrix(prog, &entrendermatrix, ent, 0, NULL); VectorCopy(cl.csqc_viewangles, clviewangles); teleported = (flags & REFDEFFLAG_TELEPORTED) != 0; @@ -4983,6 +4933,8 @@ VM_CL_RotateMoves, // #638 VM_digest_hex, // #639 VM_CL_V_CalcRefdef, // #640 void(entity e) V_CalcRefdef (DP_CSQC_V_CALCREFDEF) NULL, // #641 +VM_coverage, // #642 +NULL }; const int vm_cl_numbuiltins = sizeof(vm_cl_builtins) / sizeof(prvm_builtin_t);