cvar_t sv_aim = {CVAR_SAVE, "sv_aim", "2"}; //"0.93"}; // LordHavoc: disabled autoaim by default
cvar_t pr_zone_min_strings = {0, "pr_zone_min_strings", "64"};
-mempool_t *pr_strings_mempool;
-
// LordHavoc: added this to semi-fix the problem of using many ftos calls in a print
#define STRINGTEMP_BUFFERS 16
#define STRINGTEMP_LENGTH 4096
"DP_GFX_SKYBOX "
"DP_HALFLIFE_MAP "
"DP_HALFLIFE_MAP_CVAR "
+"DP_HALFLIFE_SPRITE "
"DP_INPUTBUTTONS "
"DP_LITSPRITES "
"DP_LITSUPPORT "
"DP_QC_TRACE_MOVETYPE_WORLDONLY "
"DP_QC_VECTORVECTORS "
"DP_QUAKE2_MODEL "
+"DP_QUAKE2_SPRITE "
"DP_QUAKE3_MODEL "
"DP_REGISTERCVAR "
"DP_SND_DIRECTIONLESSATTNNONE "
// radius
MSG_WriteByte(&sv.datagram, bound(0, G_FLOAT(OFS_PARM1) / 8 - 1, 255));
// lifetime
- MSG_WriteByte(&sv.datagram, bound(0, G_FLOAT(OFS_PARM2) / 256 - 1, 255));
+ MSG_WriteByte(&sv.datagram, bound(0, G_FLOAT(OFS_PARM2) * 256 - 1, 255));
// color
MSG_WriteByte(&sv.datagram, bound(0, G_VECTOR(OFS_PARM3)[0] * 255, 255));
MSG_WriteByte(&sv.datagram, bound(0, G_VECTOR(OFS_PARM3)[1] * 255, 255));
{
int i, j, k;
float *v[3], facenormal[3], edgenormal[3], sidenormal[3], temp[3], offsetdist, dist, bestdist;
+ const int *e;
bestdist = 1000000000;
VectorCopy(p, out);
- for (i = 0;i < surface->mesh.num_triangles;i++)
+ for (i = 0, e = (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle);i < surface->num_triangles;i++, e += 3)
{
// clip original point to each triangle of the surface and find the
// triangle that is closest
- v[0] = surface->mesh.data_vertex3f + surface->mesh.data_element3i[i * 3 + 0] * 3;
- v[1] = surface->mesh.data_vertex3f + surface->mesh.data_element3i[i * 3 + 1] * 3;
- v[2] = surface->mesh.data_vertex3f + surface->mesh.data_element3i[i * 3 + 2] * 3;
+ v[0] = surface->groupmesh->data_vertex3f + e[0] * 3;
+ v[1] = surface->groupmesh->data_vertex3f + e[1] * 3;
+ v[2] = surface->groupmesh->data_vertex3f + e[2] * 3;
TriangleNormal(v[0], v[1], v[2], facenormal);
VectorNormalize(facenormal);
offsetdist = DotProduct(v[0], facenormal) - DotProduct(p, facenormal);
}
// note: this (incorrectly) assumes it is a simple polygon
- G_FLOAT(OFS_RETURN) = surface->mesh.num_vertices;
+ G_FLOAT(OFS_RETURN) = surface->num_vertices;
}
//PF_getsurfacepoint, // #435 vector(entity e, float s, float n) getsurfacepoint = #435;
void PF_getsurfacepoint(void)
return;
// note: this (incorrectly) assumes it is a simple polygon
pointnum = G_FLOAT(OFS_PARM2);
- if (pointnum < 0 || pointnum >= surface->mesh.num_vertices)
+ if (pointnum < 0 || pointnum >= surface->num_vertices)
return;
// FIXME: implement rotation/scaling
- VectorAdd(&surface->mesh.data_vertex3f[pointnum * 3], ed->v->origin, G_VECTOR(OFS_RETURN));
+ VectorAdd(&(surface->groupmesh->data_vertex3f + 3 * surface->num_firstvertex)[pointnum * 3], ed->v->origin, G_VECTOR(OFS_RETURN));
}
//PF_getsurfacenormal, // #436 vector(entity e, float s) getsurfacenormal = #436;
void PF_getsurfacenormal(void)
// note: this (incorrectly) assumes it is a simple polygon
// note: this only returns the first triangle, so it doesn't work very
// well for curved surfaces or arbitrary meshes
- TriangleNormal(surface->mesh.data_vertex3f, surface->mesh.data_vertex3f + 3, surface->mesh.data_vertex3f + 6, normal);
+ TriangleNormal((surface->groupmesh->data_vertex3f + 3 * surface->num_firstvertex), (surface->groupmesh->data_vertex3f + 3 * surface->num_firstvertex) + 3, (surface->groupmesh->data_vertex3f + 3 * surface->num_firstvertex) + 6, normal);
VectorNormalize(normal);
VectorCopy(normal, G_VECTOR(OFS_RETURN));
}
}
filename = G_STRING(OFS_PARM0);
// -4 failure (dangerous/non-portable filename) removed, FS_Open checks
- pr_files[filenum] = FS_Open(va("data/%s", filename), modestring, false);
+ pr_files[filenum] = FS_Open(va("data/%s", filename), modestring, false, false);
if (pr_files[filenum] == NULL && modestring == "rb")
- pr_files[filenum] = FS_Open(filename, modestring, false);
+ pr_files[filenum] = FS_Open(filename, modestring, false, false);
if (pr_files[filenum] == NULL)
G_FLOAT(OFS_RETURN) = -1;
{
char *in, *out;
in = G_STRING(OFS_PARM0);
- out = Mem_Alloc(pr_strings_mempool, strlen(in) + 1);
+ out = PR_Alloc(strlen(in) + 1);
strcpy(out, in);
G_INT(OFS_RETURN) = PR_SetString(out);
}
//void(string s) strunzone = #119; // removes a copy of a string from the string zone (you can not use that string again or it may crash!!!)
void PF_strunzone(void)
{
- Mem_Free(G_STRING(OFS_PARM0));
+ PR_Free(G_STRING(OFS_PARM0));
}
//void(entity e, string s) clientcommand = #440; // executes a command string as if it came from the specified client
edict_t *tagentity = G_EDICT(OFS_PARM1);
char *tagname = G_STRING(OFS_PARM2);
eval_t *v;
- int i, modelindex;
+ int modelindex;
model_t *model;
if (e == sv.edicts)
modelindex = (int)tagentity->v->modelindex;
if (modelindex >= 0 && modelindex < MAX_MODELS && (model = sv.models[modelindex]))
{
- if (model->data_overridetagnamesforskin && (unsigned int)tagentity->v->skin < (unsigned int)model->numskins && model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].num_overridetagnames)
- for (i = 0;i < model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].num_overridetagnames;i++)
- if (!strcmp(tagname, model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].data_overridetagnames[i].name))
- v->_float = i + 1;
- // FIXME: use a model function to get tag info (need to handle skeletal)
- if (v->_float == 0 && model->alias.aliasnum_tags)
- for (i = 0;i < model->alias.aliasnum_tags;i++)
- if (!strcmp(tagname, model->alias.aliasdata_tags[i].name))
- v->_float = i + 1;
+ v->_float = Mod_Alias_GetTagIndexForName(model, tagentity->v->skin, tagname);
if (v->_float == 0)
Con_DPrintf("setattachment(edict %i, edict %i, string \"%s\"): tried to find tag named \"%s\" on entity %i (model \"%s\") but could not find it\n", NUM_FOR_EDICT(e), NUM_FOR_EDICT(tagentity), tagname, tagname, NUM_FOR_EDICT(tagentity), model->name);
}
int SV_GetTagIndex (edict_t *e, char *tagname)
{
- int tagindex, i;
+ int i;
model_t *model;
i = e->v->modelindex;
return -1;
model = sv.models[i];
- tagindex = -1;
- if (model->data_overridetagnamesforskin && (unsigned int)e->v->skin < (unsigned int)model->numskins && model->data_overridetagnamesforskin[(unsigned int)e->v->skin].num_overridetagnames)
- {
- for (i = 0; i < model->data_overridetagnamesforskin[(unsigned int)e->v->skin].num_overridetagnames; i++)
- {
- if (!strcmp(tagname, model->data_overridetagnamesforskin[(unsigned int)e->v->skin].data_overridetagnames[i].name))
- {
- tagindex = i;
- break;
- }
- }
- }
- if (tagindex == -1)
- {
- for (i = 0;i < model->alias.aliasnum_tags; i++)
- {
- if (!(strcmp(tagname, model->alias.aliasdata_tags[i].name)))
- {
- tagindex = i;
- break;
- }
- }
- }
- return tagindex + 1;
+ return Mod_Alias_GetTagIndexForName(model, e->v->skin, tagname);
};
// Warnings/errors code:
int SV_GetTagMatrix (matrix4x4_t *out, edict_t *ent, int tagindex)
{
eval_t *val;
- int modelindex, reqtag, reqframe, attachloop;
+ int modelindex, reqframe, attachloop;
matrix4x4_t entitymatrix, tagmatrix, attachmatrix;
edict_t *attachent;
model_t *model;
return 3;
model = sv.models[modelindex];
- reqtag = model->alias.aliasnum_tags;
-
- if (tagindex <= 0 || tagindex > reqtag)
- {
- if (reqtag && tagindex) // Only appear if model has no tags or not-null tag requested
- return 4;
- return 0;
- }
- if (ent->v->frame < 0 || ent->v->frame > model->alias.aliasnum_tagframes)
- reqframe = model->numframes - 1; // if model has wrong frame, engine automatically switches to model last frame
+ if (ent->v->frame >= 0 && ent->v->frame < model->numframes && model->animscenes)
+ reqframe = model->animscenes[(int)ent->v->frame].firstframe;
else
- reqframe = ent->v->frame;
+ reqframe = 0; // if model has wrong frame, engine automatically switches to model first frame
// get initial tag matrix
if (tagindex)
{
- reqtag = (tagindex - 1) + ent->v->frame*model->alias.aliasnum_tags;
- Matrix4x4_Copy(&tagmatrix, &model->alias.aliasdata_tags[reqtag].matrix);
+ int ret = Mod_Alias_GetTagMatrix(model, reqframe, tagindex - 1, &tagmatrix);
+ if (ret)
+ return ret;
}
else
Matrix4x4_CreateIdentity(&tagmatrix);
{
attachent = EDICT_NUM(val->edict); // to this it entity our entity is attached
val = GETEDICTFIELDVALUE(ent, eval_tag_index);
- Matrix4x4_CreateIdentity(&attachmatrix);
- if (val->_float >= 1 && attachent->v->modelindex >= 1 && attachent->v->modelindex < MAX_MODELS)
- {
- model = sv.models[(int)attachent->v->modelindex];
- if (val->_float < model->alias.aliasnum_tags)
- {
- // got tagname on parent entity attachment tag via tag_index (and got it's matrix)
- model = sv.models[(int)attachent->v->modelindex];
- reqtag = (val->_float - 1) + attachent->v->frame*model->alias.aliasnum_tags;
- Matrix4x4_Copy(&attachmatrix, &model->alias.aliasdata_tags[reqtag].matrix);
- }
- }
+ if (val->_float >= 1 && attachent->v->modelindex >= 1 && attachent->v->modelindex < MAX_MODELS && (model = sv.models[(int)attachent->v->modelindex]) && model->animscenes && attachent->v->frame >= 0 && attachent->v->frame < model->numframes)
+ Mod_Alias_GetTagMatrix(model, model->animscenes[(int)attachent->v->frame].firstframe, val->_float - 1, &attachmatrix);
+ else
+ Matrix4x4_CreateIdentity(&attachmatrix);
// apply transformation by child entity matrix
val = GETEDICTFIELDVALUE(ent, eval_scale);
void PR_Cmd_Init(void)
{
- pr_strings_mempool = Mem_AllocPool("pr_stringszone", 0, NULL);
PR_Files_Init();
PR_Search_Init();
}
void PR_Cmd_Shutdown(void)
{
- Mem_FreePool (&pr_strings_mempool);
}
void PR_Cmd_Reset(void)
{
- Mem_EmptyPool(pr_strings_mempool);
PR_Search_Reset();
PR_Files_CloseAll();
}