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;
float volume;
float attenuation;
float pitchchange;
+ float startposition;
int flags;
vec3_t org;
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);
+ }
+
+ // 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);
}
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, volume, attenuation, startposition, flags, pitchchange > 0.0f ? pitchchange * 0.01f : 1.0f);
}
// #483 void(vector origin, string sample, float volume, float attenuation) pointsound
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; i<prog->num_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)
{
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 ?
{
vec3_t origin;
Matrix4x4_OriginFromMatrix(&e->render.matrix, origin);
- dpsnprintf(t, sizeof(t), "%.9g %.9g %.9g", origin[0], origin[1], origin[2]);
+ dpsnprintf(t, sizeof(t), VECTOR_LOSSLESS_FORMAT, origin[0], origin[1], origin[2]);
}
}
if(!t[0])
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
// #404 void(vector org, string modelname, float startframe, float endframe, float framerate) effect (DP_SV_EFFECT)
static void VM_CL_effect (prvm_prog_t *prog)
{
+#if 1
+ Con_Printf("WARNING: VM_CL_effect not implemented\n"); // FIXME: this needs to take modelname not modelindex, the csqc defs has it as string and so it shall be
+#else
vec3_t org;
VM_SAFEPARMCOUNT(5, VM_CL_effect);
VectorCopy(PRVM_G_VECTOR(OFS_PARM0), org);
CL_Effect(org, (int)PRVM_G_FLOAT(OFS_PARM1), (int)PRVM_G_FLOAT(OFS_PARM2), (int)PRVM_G_FLOAT(OFS_PARM3), PRVM_G_FLOAT(OFS_PARM4));
+#endif
}
// #405 void(vector org, vector velocity, float howmany) te_blood (DP_TE_BLOOD)
// VorteX: int only can store 0-255, not 0-256 which means 0 - 0,99609375...
VectorSet(PRVM_clientglobalvector(particle_color1), (theme->color1 >> 16) & 0xFF, (theme->color1 >> 8) & 0xFF, (theme->color1 >> 0) & 0xFF);
VectorSet(PRVM_clientglobalvector(particle_color2), (theme->color2 >> 16) & 0xFF, (theme->color2 >> 8) & 0xFF, (theme->color2 >> 0) & 0xFF);
- PRVM_clientglobalfloat(particle_tex) = (float)theme->tex;
+ PRVM_clientglobalfloat(particle_tex) = (prvm_vec_t)theme->tex;
PRVM_clientglobalfloat(particle_size) = theme->size;
PRVM_clientglobalfloat(particle_sizeincrease) = theme->sizeincrease;
PRVM_clientglobalfloat(particle_alpha) = theme->alpha/256;
PRVM_clientglobalfloat(particle_stretch) = theme->stretch;
VectorSet(PRVM_clientglobalvector(particle_staincolor1), ((int)theme->staincolor1 >> 16) & 0xFF, ((int)theme->staincolor1 >> 8) & 0xFF, ((int)theme->staincolor1 >> 0) & 0xFF);
VectorSet(PRVM_clientglobalvector(particle_staincolor2), ((int)theme->staincolor2 >> 16) & 0xFF, ((int)theme->staincolor2 >> 8) & 0xFF, ((int)theme->staincolor2 >> 0) & 0xFF);
- PRVM_clientglobalfloat(particle_staintex) = (float)theme->staintex;
- PRVM_clientglobalfloat(particle_stainalpha) = (float)theme->stainalpha/256;
- PRVM_clientglobalfloat(particle_stainsize) = (float)theme->stainsize;
+ PRVM_clientglobalfloat(particle_staintex) = (prvm_vec_t)theme->staintex;
+ PRVM_clientglobalfloat(particle_stainalpha) = (prvm_vec_t)theme->stainalpha/256;
+ PRVM_clientglobalfloat(particle_stainsize) = (prvm_vec_t)theme->stainsize;
PRVM_clientglobalfloat(particle_delayspawn) = theme->delayspawn;
PRVM_clientglobalfloat(particle_delaycollision) = theme->delaycollision;
PRVM_clientglobalfloat(particle_angle) = theme->angle;
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,
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]))
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;
}