X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=clvm_cmds.c;h=b1ed1035dc28a6c08bbc23e57c19b3d916a21c04;hb=e65a67078ad9caa8295f863be1bf465794ad2ed9;hp=7975bf1e9e8c451295c6c81511123b71bb617789;hpb=c47fb5c923c0e3b6c44bb068ceb44f7795834f5c;p=xonotic%2Fdarkplaces.git diff --git a/clvm_cmds.c b/clvm_cmds.c index 7975bf1e..b1ed1035 100644 --- a/clvm_cmds.c +++ b/clvm_cmds.c @@ -1455,12 +1455,15 @@ static void VM_CL_runplayerphysics (prvm_prog_t *prog) cl_clientmovement_state_t s; prvm_edict_t *ent; + memset(&s, 0, sizeof(s)); + VM_SAFEPARMCOUNTRANGE(0, 1, VM_CL_runplayerphysics); ent = (prog->argc == 1 ? PRVM_G_EDICT(OFS_PARM0) : prog->edicts); if(ent == prog->edicts) { // deprecated use + s.self = NULL; VectorCopy(PRVM_clientglobalvector(pmove_org), s.origin); VectorCopy(PRVM_clientglobalvector(pmove_vel), s.velocity); VectorCopy(PRVM_clientglobalvector(pmove_mins), s.mins); @@ -1472,6 +1475,7 @@ static void VM_CL_runplayerphysics (prvm_prog_t *prog) else { // new use + s.self = ent; VectorCopy(PRVM_clientedictvector(ent, origin), s.origin); VectorCopy(PRVM_clientedictvector(ent, velocity), s.velocity); VectorCopy(PRVM_clientedictvector(ent, mins), s.mins); @@ -1490,7 +1494,7 @@ static void VM_CL_runplayerphysics (prvm_prog_t *prog) s.cmd.jump = (s.cmd.buttons & 2) != 0; s.cmd.crouch = (s.cmd.buttons & 16) != 0; - CL_ClientMovement_PlayerMove(&s); + CL_ClientMovement_PlayerMove_Frame(&s); if(ent == prog->edicts) { @@ -2376,7 +2380,7 @@ static int CL_GetEntityLocalTagMatrix(prvm_prog_t *prog, prvm_edict_t *ent, int && model->animscenes) { VM_GenerateFrameGroupBlend(prog, ent->priv.server->framegroupblend, ent); - VM_FrameBlendFromFrameGroupBlend(ent->priv.server->frameblend, ent->priv.server->framegroupblend, model); + VM_FrameBlendFromFrameGroupBlend(ent->priv.server->frameblend, ent->priv.server->framegroupblend, model, cl.time); VM_UpdateEdictSkeleton(prog, ent, model, ent->priv.server->frameblend); return Mod_Alias_GetTagMatrix(model, ent->priv.server->frameblend, &ent->priv.server->skeleton, tagindex, out); } @@ -2528,7 +2532,7 @@ static void VM_CL_gettaginfo (prvm_prog_t *prog) VectorScale(le, -1, PRVM_clientglobalvector(v_right)); model = CL_GetModelFromEdict(e); VM_GenerateFrameGroupBlend(prog, e->priv.server->framegroupblend, e); - VM_FrameBlendFromFrameGroupBlend(e->priv.server->frameblend, e->priv.server->framegroupblend, model); + VM_FrameBlendFromFrameGroupBlend(e->priv.server->frameblend, e->priv.server->framegroupblend, model, cl.time); VM_UpdateEdictSkeleton(prog, e, model, e->priv.server->frameblend); CL_GetExtendedTagInfo(prog, e, tagindex, &parentindex, &tagname, &tag_localmatrix); Matrix4x4_ToVectors(&tag_localmatrix, fo, le, up, trans); @@ -3759,36 +3763,36 @@ static void VM_CL_checkpvs (prvm_prog_t *prog) VectorAdd(PRVM_serveredictvector(viewee, origin), PRVM_serveredictvector(viewee, maxs), ma); #if 1 - if(!sv.worldmodel->brush.GetPVS || !sv.worldmodel->brush.BoxTouchingPVS) + if(!cl.worldmodel || !cl.worldmodel->brush.GetPVS || !cl.worldmodel->brush.BoxTouchingPVS) { // no PVS support on this worldmodel... darn PRVM_G_FLOAT(OFS_RETURN) = 3; return; } - pvs = sv.worldmodel->brush.GetPVS(sv.worldmodel, viewpos); + pvs = cl.worldmodel->brush.GetPVS(cl.worldmodel, viewpos); if(!pvs) { // viewpos isn't in any PVS... darn PRVM_G_FLOAT(OFS_RETURN) = 2; return; } - PRVM_G_FLOAT(OFS_RETURN) = sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, pvs, mi, ma); + PRVM_G_FLOAT(OFS_RETURN) = cl.worldmodel->brush.BoxTouchingPVS(cl.worldmodel, pvs, mi, ma); #else // using fat PVS like FTEQW does (slow) - if(!sv.worldmodel->brush.FatPVS || !sv.worldmodel->brush.BoxTouchingPVS) + if(!cl.worldmodel || !cl.worldmodel->brush.FatPVS || !cl.worldmodel->brush.BoxTouchingPVS) { // no PVS support on this worldmodel... darn PRVM_G_FLOAT(OFS_RETURN) = 3; return; } - fatpvsbytes = sv.worldmodel->brush.FatPVS(sv.worldmodel, viewpos, 8, fatpvs, sizeof(fatpvs), false); + fatpvsbytes = cl.worldmodel->brush.FatPVS(cl.worldmodel, viewpos, 8, fatpvs, sizeof(fatpvs), false); if(!fatpvsbytes) { // viewpos isn't in any PVS... darn PRVM_G_FLOAT(OFS_RETURN) = 2; return; } - PRVM_G_FLOAT(OFS_RETURN) = sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, fatpvs, mi, ma); + PRVM_G_FLOAT(OFS_RETURN) = cl.worldmodel->brush.BoxTouchingPVS(cl.worldmodel, fatpvs, mi, ma); #endif } @@ -3842,7 +3846,7 @@ static void VM_CL_skel_build(prvm_prog_t *prog) lastbone = min(lastbone, model->num_bones - 1); lastbone = min(lastbone, skeleton->model->num_bones - 1); VM_GenerateFrameGroupBlend(prog, framegroupblend, ed); - VM_FrameBlendFromFrameGroupBlend(frameblend, framegroupblend, model); + 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; @@ -3852,7 +3856,7 @@ static void VM_CL_skel_build(prvm_prog_t *prog) Matrix4x4_Accumulate(&blendedmatrix, &skeleton->relativetransforms[bonenum], retainfrac); for (blendindex = 0;blendindex < numblends;blendindex++) { - Matrix4x4_FromBonePose6s(&matrix, model->num_posescale, model->data_poses6s + 6 * (frameblend[blendindex].subframe * model->num_bones + bonenum)); + Matrix4x4_FromBonePose7s(&matrix, model->num_posescale, model->data_poses7s + 7 * (frameblend[blendindex].subframe * model->num_bones + bonenum)); Matrix4x4_Accumulate(&blendedmatrix, &matrix, frameblend[blendindex].lerp); } skeleton->relativetransforms[bonenum] = blendedmatrix; @@ -4150,13 +4154,18 @@ static void VM_CL_loadcubemap(prvm_prog_t *prog) #define REFDEFFLAG_TELEPORTED 1 #define REFDEFFLAG_JUMPING 2 +#define REFDEFFLAG_DEAD 4 +#define REFDEFFLAG_INTERMISSION 8 static void VM_CL_V_CalcRefdef(prvm_prog_t *prog) { matrix4x4_t entrendermatrix; vec3_t clviewangles; + vec3_t clvelocity; qboolean teleported; qboolean clonground; qboolean clcmdjump; + qboolean cldead; + qboolean clintermission; float clstatsviewheight; prvm_edict_t *ent; int flags; @@ -4173,8 +4182,11 @@ static void VM_CL_V_CalcRefdef(prvm_prog_t *prog) clonground = ((int)PRVM_clientedictfloat(ent, pmove_flags) & PMF_ONGROUND) != 0; clcmdjump = (flags & REFDEFFLAG_JUMPING) != 0; clstatsviewheight = PRVM_clientedictvector(ent, view_ofs)[2]; + cldead = (flags & REFDEFFLAG_DEAD) != 0; + clintermission = (flags & REFDEFFLAG_INTERMISSION) != 0; + VectorCopy(PRVM_clientedictvector(ent, velocity), clvelocity); - V_CalcRefdefUsing(&entrendermatrix, clviewangles, teleported, clonground, clcmdjump, clstatsviewheight); + V_CalcRefdefUsing(&entrendermatrix, clviewangles, teleported, clonground, clcmdjump, clstatsviewheight, cldead, clintermission, clvelocity); VectorCopy(cl.csqc_vieworiginfromengine, cl.csqc_vieworigin); VectorCopy(cl.csqc_viewanglesfromengine, cl.csqc_viewangles); @@ -4730,10 +4742,10 @@ VM_CL_setpause, // #531 float(float ispaused) setpause = #531 (DP_CSQC_SETPA VM_log, // #532 VM_getsoundtime, // #533 float(entity e, float channel) getsoundtime = #533; (DP_SND_GETSOUNDTIME) VM_soundlength, // #534 float(string sample) soundlength = #534; (DP_SND_GETSOUNDTIME) -NULL, // #535 -NULL, // #536 -NULL, // #537 -NULL, // #538 +VM_buf_loadfile, // #535 float(string filename, float bufhandle) buf_loadfile (DP_QC_STRINGBUFFERS_EXT_WIP) +VM_buf_writefile, // #536 float(float filehandle, float bufhandle, float startpos, float numstrings) buf_writefile (DP_QC_STRINGBUFFERS_EXT_WIP) +VM_bufstr_find, // #537 float(float bufhandle, string match, float matchrule, float startpos) bufstr_find (DP_QC_STRINGBUFFERS_EXT_WIP) +VM_matchpattern, // #538 float(string s, string pattern, float matchrule) matchpattern (DP_QC_STRINGBUFFERS_EXT_WIP) NULL, // #539 VM_physics_enable, // #540 void(entity e, float physics_enabled) physics_enable = #540; (DP_PHYSICS_ODE) VM_physics_addforce, // #541 void(entity e, vector force, vector relative_ofs) physics_addforce = #541; (DP_PHYSICS_ODE)