*/
void VM_normalize(prvm_prog_t *prog)
{
- float *value1;
+ prvm_vec_t *value1;
vec3_t newvalue;
double f;
*/
void VM_vectoyaw(prvm_prog_t *prog)
{
- float *value1;
- float yaw;
+ prvm_vec_t *value1;
+ prvm_vec_t yaw;
VM_SAFEPARMCOUNT(1,VM_vectoyaw);
*/
void VM_vectoangles(prvm_prog_t *prog)
{
+ vec3_t result, forward, up;
VM_SAFEPARMCOUNTRANGE(1, 2,VM_vectoangles);
- AnglesFromVectors(PRVM_G_VECTOR(OFS_RETURN), PRVM_G_VECTOR(OFS_PARM0), prog->argc >= 2 ? PRVM_G_VECTOR(OFS_PARM1) : NULL, true);
+ VectorCopy(PRVM_G_VECTOR(OFS_PARM0), forward);
+ if (prog->argc >= 2)
+ {
+ VectorCopy(PRVM_G_VECTOR(OFS_PARM1), up);
+ AnglesFromVectors(result, forward, up, true);
+ }
+ else
+ AnglesFromVectors(result, forward, NULL, true);
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
}
/*
void VM_ftos(prvm_prog_t *prog)
{
- float v;
+ prvm_vec_t v;
char s[128];
VM_SAFEPARMCOUNT(1, VM_ftos);
v = PRVM_G_FLOAT(OFS_PARM0);
- if ((float)((int)v) == v)
- dpsnprintf(s, sizeof(s), "%i", (int)v);
+ if ((prvm_vec_t)((prvm_int_t)v) == v)
+ dpsnprintf(s, sizeof(s), "%.0f", v);
else
dpsnprintf(s, sizeof(s), "%f", v);
PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, s);
void VM_fabs(prvm_prog_t *prog)
{
- float v;
+ prvm_vec_t v;
VM_SAFEPARMCOUNT(1,VM_fabs);
========================
VM_itof
-float itof(intt ent)
+float itof(int ent)
========================
*/
void VM_itof(prvm_prog_t *prog)
*/
void VM_ftoe(prvm_prog_t *prog)
{
- int ent;
+ prvm_int_t ent;
VM_SAFEPARMCOUNT(1, VM_ftoe);
- ent = (int)PRVM_G_FLOAT(OFS_PARM0);
+ ent = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM0);
if (ent < 0 || ent >= prog->max_edicts || PRVM_PROG_TO_EDICT(ent)->priv.required->free)
ent = 0; // return world instead of a free or invalid entity
// LordHavoc: search for flags in float fields
void VM_findflags(prvm_prog_t *prog)
{
- int e;
- int f;
- int s;
+ prvm_int_t e;
+ prvm_int_t f;
+ prvm_int_t s;
prvm_edict_t *ed;
VM_SAFEPARMCOUNT(3, VM_findflags);
e = PRVM_G_EDICTNUM(OFS_PARM0);
f = PRVM_G_INT(OFS_PARM1);
- s = (int)PRVM_G_FLOAT(OFS_PARM2);
+ s = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM2);
for (e++ ; e < prog->num_edicts ; e++)
{
continue;
if (!PRVM_E_FLOAT(ed,f))
continue;
- if ((int)PRVM_E_FLOAT(ed,f) & s)
+ if ((prvm_int_t)PRVM_E_FLOAT(ed,f) & s)
{
VM_RETURN_EDICT(ed);
return;
// LordHavoc: chained search for flags in float fields
void VM_findchainflags(prvm_prog_t *prog)
{
- int i;
- int f;
- int s;
+ prvm_int_t i;
+ prvm_int_t f;
+ prvm_int_t s;
prvm_edict_t *ent, *chain;
int chainfield;
chain = (prvm_edict_t *)prog->edicts;
f = PRVM_G_INT(OFS_PARM0);
- s = (int)PRVM_G_FLOAT(OFS_PARM1);
+ s = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM1);
ent = PRVM_NEXT_EDICT(prog->edicts);
for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
continue;
if (!PRVM_E_FLOAT(ent,f))
continue;
- if (!((int)PRVM_E_FLOAT(ent,f) & s))
+ if (!((prvm_int_t)PRVM_E_FLOAT(ent,f) & s))
continue;
PRVM_EDICTFIELDEDICT(ent,chainfield) = PRVM_EDICT_TO_PROG(chain);
*/
void VM_rint(prvm_prog_t *prog)
{
- float f;
+ prvm_vec_t f;
VM_SAFEPARMCOUNT(1,VM_rint);
f = PRVM_G_FLOAT(OFS_PARM0);
{
ddef_t *d;
int i = (int)PRVM_G_FLOAT(OFS_PARM0);
-
+
if (i < 0 || i >= prog->numfielddefs)
{
- VM_Warning(prog, "VM_entityfieldname: %s: field index out of bounds\n", prog->name);
- PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, "");
+ VM_Warning(prog, "VM_entityfieldname: %s: field index out of bounds\n", prog->name);
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, "");
return;
}
-
+
d = &prog->fielddefs[i];
PRVM_G_INT(OFS_RETURN) = d->s_name; // presuming that s_name points to a string already
}
}
d = &prog->fielddefs[i];
- PRVM_G_FLOAT(OFS_RETURN) = (float)d->type;
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t)d->type;
}
// KrimZon - DP_QC_ENTITYDATA
// put the data into a string
ddef_t *d;
int type, j;
- int *v;
+ prvm_eval_t *val;
prvm_edict_t * ent;
int i = (int)PRVM_G_FLOAT(OFS_PARM0);
char valuebuf[MAX_INPUTLINE];
VM_Warning(prog, "VM_entityfielddata: %s: entity %i is free !\n", prog->name, PRVM_NUM_FOR_EDICT(ent));
return;
}
- v = (int *)((char *)ent->fields.vp + d->ofs*4);
+ val = (prvm_eval_t *)(ent->fields.fp + d->ofs);
// if it's 0 or blank, return an empty string
type = d->type & ~DEF_SAVEGLOBAL;
for (j=0 ; j<prvm_type_size[type] ; j++)
- if (v[j])
+ if (val->ivector[j])
break;
if (j == prvm_type_size[type])
{
return;
}
- PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, PRVM_UglyValueString(prog, (etype_t)d->type, (prvm_eval_t *)v, valuebuf, sizeof(valuebuf)));
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, PRVM_UglyValueString(prog, (etype_t)d->type, val, valuebuf, sizeof(valuebuf)));
}
// KrimZon - DP_QC_ENTITYDATA
if(prog->argc == 0)
{
- PRVM_G_FLOAT(OFS_RETURN) = (float) realtime;
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t) realtime;
}
else
{
entchannel = CHAN_USER2ENGINE(entchannel);
if (!IS_CHAN(entchannel))
VM_Warning(prog, "VM_getsoundtime: %s: bad channel %i\n", prog->name, entchannel);
- PRVM_G_FLOAT(OFS_RETURN) = (float)S_GetEntChannelPosition(entnum, entchannel);
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t)S_GetEntChannelPosition(entnum, entchannel);
}
/*
*/
void VM_modulo(prvm_prog_t *prog)
{
- int val, m;
+ prvm_int_t val, m;
VM_SAFEPARMCOUNT(2,VM_module);
- val = (int) PRVM_G_FLOAT(OFS_PARM0);
- m = (int) PRVM_G_FLOAT(OFS_PARM1);
+ val = (prvm_int_t) PRVM_G_FLOAT(OFS_PARM0);
+ m = (prvm_int_t) PRVM_G_FLOAT(OFS_PARM1);
- PRVM_G_FLOAT(OFS_RETURN) = (float) (val % m);
+ PRVM_G_FLOAT(OFS_RETURN) = (prvm_vec_t) (val % m);
}
static void VM_Search_Init(prvm_prog_t *prog)
*/
void VM_drawcharacter(prvm_prog_t *prog)
{
- float *pos,*scale,*rgb;
+ prvm_vec_t *pos,*scale,*rgb;
char character;
int flag;
float sx, sy;
*/
void VM_drawstring(prvm_prog_t *prog)
{
- float *pos,*scale,*rgb;
+ prvm_vec_t *pos,*scale,*rgb;
const char *string;
int flag = 0;
float sx, sy;
*/
void VM_drawcolorcodedstring(prvm_prog_t *prog)
{
- float *pos, *scale;
+ prvm_vec_t *pos, *scale;
const char *string;
int flag;
vec3_t rgb;
void VM_stringwidth(prvm_prog_t *prog)
{
const char *string;
- float *szv;
+ vec2_t szv;
float mult; // sz is intended font size so we can later add freetype support, mult is font size multiplier in pixels per character cell
int colors;
float sx, sy;
getdrawfontscale(prog, &sx, &sy);
if(prog->argc == 3)
{
- szv = PRVM_G_VECTOR(OFS_PARM2);
+ Vector2Copy(PRVM_G_VECTOR(OFS_PARM2), szv);
mult = 1;
}
else
{
// we want the width for 8x8 font size, divided by 8
- static float defsize[] = {8, 8};
- szv = defsize;
+ Vector2Set(szv, 8, 8);
mult = 0.125;
// to make sure snapping is turned off, ALWAYS use a nontrivial scale in this case
if(sx >= 0.9 && sx <= 1.1)
void VM_drawpic(prvm_prog_t *prog)
{
const char *picname;
- float *size, *pos, *rgb;
+ prvm_vec_t *size, *pos, *rgb;
int flag = 0;
VM_SAFEPARMCOUNTRANGE(5,6,VM_drawpic);
void VM_drawrotpic(prvm_prog_t *prog)
{
const char *picname;
- float *size, *pos, *org, *rgb;
+ prvm_vec_t *size, *pos, *org, *rgb;
int flag;
VM_SAFEPARMCOUNT(8,VM_drawrotpic);
void VM_drawsubpic(prvm_prog_t *prog)
{
const char *picname;
- float *size, *pos, *rgb, *srcPos, *srcSize, alpha;
+ prvm_vec_t *size, *pos, *rgb, *srcPos, *srcSize, alpha;
int flag;
VM_SAFEPARMCOUNT(8,VM_drawsubpic);
*/
void VM_drawfill(prvm_prog_t *prog)
{
- float *size, *pos, *rgb;
+ prvm_vec_t *size, *pos, *rgb;
int flag;
VM_SAFEPARMCOUNT(5,VM_drawfill);
*/
void VM_makevectors (prvm_prog_t *prog)
{
+ vec3_t angles, forward, right, up;
VM_SAFEPARMCOUNT(1, VM_makevectors);
- AngleVectors(PRVM_G_VECTOR(OFS_PARM0), PRVM_gameglobalvector(v_forward), PRVM_gameglobalvector(v_right), PRVM_gameglobalvector(v_up));
+ VectorCopy(PRVM_G_VECTOR(OFS_PARM0), angles);
+ AngleVectors(angles, forward, right, up);
+ VectorCopy(forward, PRVM_gameglobalvector(v_forward));
+ VectorCopy(right, PRVM_gameglobalvector(v_right));
+ VectorCopy(up, PRVM_gameglobalvector(v_up));
}
/*
*/
void VM_vectorvectors (prvm_prog_t *prog)
{
+ vec3_t forward, right, up;
VM_SAFEPARMCOUNT(1, VM_vectorvectors);
- VectorNormalize2(PRVM_G_VECTOR(OFS_PARM0), PRVM_gameglobalvector(v_forward));
- VectorVectors(PRVM_gameglobalvector(v_forward), PRVM_gameglobalvector(v_right), PRVM_gameglobalvector(v_up));
+ VectorNormalize2(PRVM_G_VECTOR(OFS_PARM0), forward);
+ VectorVectors(forward, right, up);
+ VectorCopy(forward, PRVM_gameglobalvector(v_forward));
+ VectorCopy(right, PRVM_gameglobalvector(v_right));
+ VectorCopy(up, PRVM_gameglobalvector(v_up));
}
/*
*/
void VM_drawline (prvm_prog_t *prog)
{
- float *c1, *c2, *rgb;
+ prvm_vec_t *c1, *c2, *rgb;
float alpha, width;
unsigned char flags;
// float(float number, float quantity) bitshift (EXT_BITSHIFT)
void VM_bitshift (prvm_prog_t *prog)
{
- int n1, n2;
+ prvm_int_t n1, n2;
VM_SAFEPARMCOUNT(2, VM_bitshift);
- n1 = (int)fabs((float)((int)PRVM_G_FLOAT(OFS_PARM0)));
- n2 = (int)PRVM_G_FLOAT(OFS_PARM1);
+ n1 = (prvm_int_t)fabs((prvm_vec_t)((prvm_int_t)PRVM_G_FLOAT(OFS_PARM0)));
+ n2 = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM1);
if(!n1)
PRVM_G_FLOAT(OFS_RETURN) = n1;
else
}
}
- PRVM_G_FLOAT( OFS_RETURN ) = (float) (count / 2);
+ PRVM_G_FLOAT( OFS_RETURN ) = (prvm_vec_t) (count / 2);
}
/*
if (prog->openfiles[filenum] == NULL)
{
if (developer_extra.integer)
- VM_Warning(prog, "VM_buf_loadfile: failed to open file %s in %s\n", filename, prog->name, filename);
+ VM_Warning(prog, "VM_buf_loadfile: failed to open file %s in %s\n", filename, prog->name);
PRVM_G_FLOAT(OFS_RETURN) = 0;
return;
}
#define MATCH_MIDDLE 4
#define MATCH_PATTERN 5
-const char *detect_match_rule(char *pattern, int *matchrule)
+static const char *detect_match_rule(char *pattern, int *matchrule)
{
char *ppos, *qpos;
int patternlength;
}
// todo: support UTF8
-qboolean match_rule(const char *string, int max_string, const char *pattern, int patternlength, int rule)
+static qboolean match_rule(const char *string, int max_string, const char *pattern, int patternlength, int rule)
{
const char *mid;
double starttime;
float id;
char buffer[MAX_INPUTLINE];
+ char posttype[128];
unsigned char *postdata; // free when uri_to_prog_t is freed
size_t postlen;
char *sigdata; // free when uri_to_prog_t is freed
handle->sigdata[handle->siglen] = 0;
}
out1:
- ret = Curl_Begin_ToMemory_POST(url, handle->sigdata, 0, posttype, handle->postdata, handle->postlen, (unsigned char *) handle->buffer, sizeof(handle->buffer), uri_to_string_callback, handle);
+ strlcpy(handle->posttype, posttype, sizeof(handle->posttype));
+ ret = Curl_Begin_ToMemory_POST(url, handle->sigdata, 0, handle->posttype, handle->postdata, handle->postlen, (unsigned char *) handle->buffer, sizeof(handle->buffer), uri_to_string_callback, handle);
}
else
{
const char *s, *s0;
char outbuf[MAX_INPUTLINE];
char *o = outbuf, *end = outbuf + sizeof(outbuf), *err;
+ const char *p;
int argpos = 1;
int width, precision, thisarg, flags;
char formatbuf[16];
char *f;
int isfloat;
- static int dummyivec[3] = {0, 0, 0};
- static float dummyvec[3] = {0, 0, 0};
+ static prvm_int_t dummyivec[3] = {0, 0, 0};
+ static prvm_vec_t dummyvec[3] = {0, 0, 0};
char vabuf[1024];
#define PRINTF_ALTERNATE 1
#define GETARG_FLOAT(a) (((a)>=1 && (a)<prog->argc) ? (PRVM_G_FLOAT(OFS_PARM0 + 3 * (a))) : 0)
#define GETARG_VECTOR(a) (((a)>=1 && (a)<prog->argc) ? (PRVM_G_VECTOR(OFS_PARM0 + 3 * (a))) : dummyvec)
#define GETARG_INT(a) (((a)>=1 && (a)<prog->argc) ? (PRVM_G_INT(OFS_PARM0 + 3 * (a))) : 0)
-#define GETARG_INTVECTOR(a) (((a)>=1 && (a)<prog->argc) ? ((int*) PRVM_G_VECTOR(OFS_PARM0 + 3 * (a))) : dummyivec)
+#define GETARG_INTVECTOR(a) (((a)>=1 && (a)<prog->argc) ? ((prvm_int_t*) PRVM_G_VECTOR(OFS_PARM0 + 3 * (a))) : dummyivec)
#define GETARG_STRING(a) (((a)>=1 && (a)<prog->argc) ? (PRVM_G_STRING(OFS_PARM0 + 3 * (a))) : "")
for(;;)
*f++ = '.';
*f++ = '*';
}
+ if(*s == 'd' || *s == 'i' || *s == 'o' || *s == 'u' || *s == 'x' || *s == 'X')
+ {
+ // make it use a good integer type
+ for(p = INT_LOSSLESS_FORMAT_SIZE; *p; )
+ *f++ = *p++;
+ }
*f++ = *s;
*f++ = 0;
{
case 'd': case 'i':
if(precision < 0) // not set
- o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? (int) GETARG_FLOAT(thisarg) : (int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_INT(thisarg))));
else
- o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? (int) GETARG_FLOAT(thisarg) : (int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_S(GETARG_INT(thisarg))));
break;
case 'o': case 'u': case 'x': case 'X':
if(precision < 0) // not set
- o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? (unsigned int) GETARG_FLOAT(thisarg) : (unsigned int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_INT(thisarg))));
else
- o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? (unsigned int) GETARG_FLOAT(thisarg) : (unsigned int) GETARG_INT(thisarg)));
+ o += dpsnprintf(o, end - o, formatbuf, width, precision, (isfloat ? INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_FLOAT(thisarg)) : INT_LOSSLESS_FORMAT_CONVERT_U(GETARG_INT(thisarg))));
break;
case 'e': case 'E': case 'f': case 'F': case 'g': case 'G':
if(precision < 0) // not set
dp_model_t *model;
msurface_t *surface;
int pointnum;
+ vec3_t result;
VM_SAFEPARMCOUNT(3, VM_getsurfacepoint);
VectorClear(PRVM_G_VECTOR(OFS_RETURN));
ed = PRVM_G_EDICT(OFS_PARM0);
if (pointnum < 0 || pointnum >= surface->num_vertices)
return;
animatemodel(prog, model, ed);
- applytransform_forward(prog, &(animatemodel_cache.data_vertex3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, PRVM_G_VECTOR(OFS_RETURN));
+ applytransform_forward(prog, &(animatemodel_cache.data_vertex3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, result);
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
}
//PF_getsurfacepointattribute, // #486 vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
// float SPA_POSITION = 0;
msurface_t *surface;
int pointnum;
int attributetype;
+ vec3_t result;
VM_SAFEPARMCOUNT(4, VM_getsurfacepoint);
VectorClear(PRVM_G_VECTOR(OFS_RETURN));
switch( attributetype ) {
// float SPA_POSITION = 0;
case 0:
- applytransform_forward(prog, &(animatemodel_cache.data_vertex3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, PRVM_G_VECTOR(OFS_RETURN));
+ applytransform_forward(prog, &(animatemodel_cache.data_vertex3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, result);
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
break;
// float SPA_S_AXIS = 1;
case 1:
- applytransform_forward_direction(prog, &(animatemodel_cache.data_svector3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, PRVM_G_VECTOR(OFS_RETURN));
+ applytransform_forward_direction(prog, &(animatemodel_cache.data_svector3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, result);
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
break;
// float SPA_T_AXIS = 2;
case 2:
- applytransform_forward_direction(prog, &(animatemodel_cache.data_tvector3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, PRVM_G_VECTOR(OFS_RETURN));
+ applytransform_forward_direction(prog, &(animatemodel_cache.data_tvector3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, result);
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
break;
// float SPA_R_AXIS = 3; // same as SPA_NORMAL
case 3:
- applytransform_forward_direction(prog, &(animatemodel_cache.data_normal3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, PRVM_G_VECTOR(OFS_RETURN));
+ applytransform_forward_direction(prog, &(animatemodel_cache.data_normal3f + 3 * surface->num_firstvertex)[pointnum * 3], ed, result);
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
break;
// float SPA_TEXCOORDS0 = 4;
case 4: {
- float *ret = PRVM_G_VECTOR(OFS_RETURN);
float *texcoord = &(model->surfmesh.data_texcoordtexture2f + 2 * surface->num_firstvertex)[pointnum * 2];
- ret[0] = texcoord[0];
- ret[1] = texcoord[1];
- ret[2] = 0.0f;
+ result[0] = texcoord[0];
+ result[1] = texcoord[1];
+ result[2] = 0.0f;
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
break;
}
// float SPA_LIGHTMAP0_TEXCOORDS = 5;
case 5: {
- float *ret = PRVM_G_VECTOR(OFS_RETURN);
float *texcoord = &(model->surfmesh.data_texcoordlightmap2f + 2 * surface->num_firstvertex)[pointnum * 2];
- ret[0] = texcoord[0];
- ret[1] = texcoord[1];
- ret[2] = 0.0f;
+ result[0] = texcoord[0];
+ result[1] = texcoord[1];
+ result[2] = 0.0f;
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
break;
}
// float SPA_LIGHTMAP0_COLOR = 6;
dp_model_t *model;
msurface_t *surface;
vec3_t normal;
+ vec3_t result;
VM_SAFEPARMCOUNT(2, VM_getsurfacenormal);
VectorClear(PRVM_G_VECTOR(OFS_RETURN));
if (!(model = getmodel(prog, PRVM_G_EDICT(OFS_PARM0))) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
// well for curved surfaces or arbitrary meshes
animatemodel(prog, model, PRVM_G_EDICT(OFS_PARM0));
TriangleNormal((animatemodel_cache.data_vertex3f + 3 * surface->num_firstvertex), (animatemodel_cache.data_vertex3f + 3 * surface->num_firstvertex) + 3, (animatemodel_cache.data_vertex3f + 3 * surface->num_firstvertex) + 6, normal);
- applytransform_forward_normal(prog, normal, PRVM_G_EDICT(OFS_PARM0), PRVM_G_VECTOR(OFS_RETURN));
- VectorNormalize(PRVM_G_VECTOR(OFS_RETURN));
+ applytransform_forward_normal(prog, normal, PRVM_G_EDICT(OFS_PARM0), result);
+ VectorNormalize(result);
+ VectorCopy(result, PRVM_G_VECTOR(OFS_RETURN));
}
//PF_getsurfacetexture, // #437 string(entity e, float s) getsurfacetexture = #437;
void VM_getsurfacetexture(prvm_prog_t *prog)
prvm_edict_t *ed;
dp_model_t *model;
msurface_t *surface;
- vec_t *point;
+ vec3_t point;
VM_SAFEPARMCOUNT(2, VM_getsurfacenearpoint);
PRVM_G_FLOAT(OFS_RETURN) = -1;
ed = PRVM_G_EDICT(OFS_PARM0);
- point = PRVM_G_VECTOR(OFS_PARM1);
+ VectorCopy(PRVM_G_VECTOR(OFS_PARM1), point);
if (!ed || ed->priv.server->free)
return;
prvm_edict_t *ed;
dp_model_t *model;
msurface_t *surface;
- vec3_t p, out;
+ vec3_t p, out, inp;
VM_SAFEPARMCOUNT(3, VM_te_getsurfaceclippedpoint);
VectorClear(PRVM_G_VECTOR(OFS_RETURN));
ed = PRVM_G_EDICT(OFS_PARM0);
if (!(model = getmodel(prog, ed)) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
return;
animatemodel(prog, model, ed);
- applytransform_inverted(prog, PRVM_G_VECTOR(OFS_PARM2), ed, p);
+ VectorCopy(PRVM_G_VECTOR(OFS_PARM2), inp);
+ applytransform_inverted(prog, inp, ed, p);
clippointtosurface(prog, ed, model, surface, p, out);
VectorAdd(out, PRVM_serveredictvector(ed, origin), PRVM_G_VECTOR(OFS_RETURN));
}