/* ================== Mod_FindName ================== */ model_t *Mod_FindName (const char *name) { int i; model_t *mod; if (!name[0]) SV_Error ("%s: NULL name", __thisfunc__); // // search the currently loaded models // for (i = 0, mod = mod_known; i < mod_numknown; i++, mod++) { if (!strcmp (mod->name, name) ) break; } if (i == mod_numknown) { if (mod_numknown == MAX_MOD_KNOWN) SV_Error ("mod_numknown == MAX_MOD_KNOWN"); q_strlcpy (mod->name, name, MAX_QPATH); mod->needload = NL_NEEDS_LOADED; mod_numknown++; } return mod; }
/* ============= ED_ParseGlobals ============= */ void ED_ParseGlobals (char *data) { char keyname[64]; ddef_t *key; while (1) { // parse key data = COM_Parse (data); if (com_token[0] == '}') break; if (!data) SV_Error ("ED_ParseEntity: EOF without closing brace"); strlcpy (keyname, com_token, sizeof(keyname)); // parse value data = COM_Parse (data); if (!data) SV_Error ("ED_ParseEntity: EOF without closing brace"); if (com_token[0] == '}') SV_Error ("ED_ParseEntity: closing brace without data"); key = ED_FindGlobal (keyname); if (!key) { Con_Printf ("%s is not a global\n", keyname); continue; } if (!ED_ParseEpair ((void *)pr_globals, key, com_token)) SV_Error ("ED_ParseGlobals: parse error"); } }
/* ================== Mod_FindName ================== */ model_t *Mod_FindName (char *name) { int i; model_t *mod; if (!name[0]) SV_Error ("Mod_ForName: NULL name"); // // search the currently loaded models // for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++) if (!strcmp (mod->name, name) ) break; if (i == mod_numknown) { if (mod_numknown == MAX_MOD_KNOWN) SV_Error ("mod_numknown == MAX_MOD_KNOWN"); strcpy (mod->name, name); mod->needload = true; mod_numknown++; } return mod; }
/* ================= Mod_LoadTexinfo ================= */ static void Mod_LoadTexinfo (lump_t *l) { texinfo_t *in; mtexinfo_t *out; int i, j, count; int miptex; float len1, len2; in = (texinfo_t *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("%s: funny lump size in %s", __thisfunc__, loadmodel->name); count = l->filelen / sizeof(*in); out = (mtexinfo_t *) Hunk_AllocName (count * sizeof(*out), "texture"); loadmodel->texinfo = out; loadmodel->numtexinfo = count; for (i = 0; i < count; i++, in++, out++) { for (j = 0; j < 8; j++) out->vecs[0][j] = LittleFloat (in->vecs[0][j]); len1 = VectorLength (in->vecs[0]); len2 = VectorLength (in->vecs[1]); if (len1 + len2 < 0.001) out->mipadjust = 1; else out->mipadjust = 1 / floor( (len1+len2)/2 ); miptex = LittleLong (in->miptex); out->flags = LittleLong (in->flags); if (!loadmodel->textures) { out->texture = &r_notexture_mip; // checkerboard texture out->flags = 0; } else { if (miptex >= loadmodel->numtextures) SV_Error ("miptex >= loadmodel->numtextures"); out->texture = loadmodel->textures[miptex]; if (!out->texture) { out->texture = &r_notexture_mip; // texture not found out->flags = 0; } } } }
void * Mod_LoadSkin (byte * skin, int skinsize, int *pskinindex, int snum, int gnum) { byte *pskin; unsigned short *pusskin; int i; pskin = Hunk_AllocName (skinsize * r_pixbytes, loadname); *pskinindex = (byte *) pskin - (byte *) pheader; switch (r_pixbytes) { case 1: memcpy (pskin, skin, skinsize); break; case 2: pusskin = (unsigned short *) skin; for (i = 0; i < skinsize; i++) pusskin[i] = d_8to16table[skin[i]]; break; default: SV_Error ("Mod_LoadAliasSkin: driver set invalid r_pixbytes: %d\n", r_pixbytes); break; } return skin + skinsize; }
static unsigned SV_CheckModel(char *mdl) { unsigned char *buf; unsigned short crc; int filesize; int mark; mark = Hunk_LowMark (); buf = (byte *) FS_LoadHunkFile (mdl, &filesize); if (!buf) { if (!strcmp (mdl, "progs/player.mdl")) return 33168; else if (!strcmp (mdl, "progs/newplayer.mdl")) return 62211; else if (!strcmp (mdl, "progs/eyes.mdl")) return 6967; else SV_Error ("SV_CheckModel: could not load %s\n", mdl); } crc = CRC_Block (buf, filesize); Hunk_FreeToLowMark (mark); return crc; }
/* ================= Mod_LoadSubmodels ================= */ void Mod_LoadSubmodels (lump_t *l) { dmodel_t *in; dmodel_t *out; int i, j, count; in = (void *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("MOD_LoadBmodel: funny lump size in %s",loadmodel->name); count = l->filelen / sizeof(*in); out = Hunk_AllocName ( count*sizeof(*out), loadname); loadmodel->submodels = out; loadmodel->numsubmodels = count; for ( i=0 ; i<count ; i++, in++, out++) { for (j=0 ; j<3 ; j++) { // spread the mins / maxs by a pixel out->mins[j] = LittleFloat (in->mins[j]) - 1; out->maxs[j] = LittleFloat (in->maxs[j]) + 1; out->origin[j] = LittleFloat (in->origin[j]); } for (j=0 ; j<MAX_MAP_HULLS ; j++) out->headnode[j] = LittleLong (in->headnode[j]); out->visleafs = LittleLong (in->visleafs); out->firstface = LittleLong (in->firstface); out->numfaces = LittleLong (in->numfaces); } }
qbool VM_LoadNative( vm_t * vm ) { char name[MAX_OSPATH]; char *gpath = NULL; void ( *dllEntry ) ( void * ); while ( ( gpath = FS_NextPath( gpath ) ) ) { snprintf(name, sizeof(name), "%s/%s." DLEXT, gpath, vm->name); vm->hInst = Sys_DLOpen( name ); if ( vm->hInst ) { Con_DPrintf( "LoadLibrary (%s)\n", name ); break; } } if ( !vm->hInst ) return false; dllEntry = (void (EXPORT_FN *)(void *)) Sys_DLProc( (DL_t) vm->hInst, "dllEntry" ); vm->vmMain = (intptr_t (EXPORT_FN *)(int,int,int,int,int,int,int,int,int,int,int,int,int)) Sys_DLProc( (DL_t) vm->hInst, "vmMain" ); if ( !dllEntry || !vm->vmMain ) { VM_Unload( vm ); SV_Error( "VM_LoadNative: couldn't initialize module %s", name ); } dllEntry( (void *) vm->syscall ); Info_SetValueForStarKey( svs.info, "*progs", DLEXT, MAX_SERVERINFO_STRING ); vm->type = VM_NATIVE; return true; }
/* ================= Mod_LoadPlanes ================= */ void Mod_LoadPlanes (lump_t *l) { int i, j; mplane_t *out; dplane_t *in; int count; int bits; in = (void *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("MOD_LoadBmodel: funny lump size in %s",loadmodel->name); count = l->filelen / sizeof(*in); out = Hunk_AllocName ( count*2*sizeof(*out), loadname); loadmodel->planes = out; loadmodel->numplanes = count; for ( i=0 ; i<count ; i++, in++, out++) { bits = 0; for (j=0 ; j<3 ; j++) { out->normal[j] = LittleFloat (in->normal[j]); if (out->normal[j] < 0) bits |= 1<<j; } out->dist = LittleFloat (in->dist); out->type = LittleLong (in->type); out->signbits = bits; } }
/* ================ SV_RunEntity ================ */ void SV_RunEntity (edict_t *ent) { if (ent->v.lastruntime == (float)realtime) return; ent->v.lastruntime = (float)realtime; switch ( (int)ent->v.movetype) { case MOVETYPE_PUSH: SV_Physics_Pusher (ent); break; case MOVETYPE_NONE: SV_Physics_None (ent); break; case MOVETYPE_NOCLIP: SV_Physics_Noclip (ent); break; case MOVETYPE_STEP: SV_Physics_Step (ent); break; case MOVETYPE_TOSS: case MOVETYPE_BOUNCE: case MOVETYPE_FLY: case MOVETYPE_FLYMISSILE: SV_Physics_Toss (ent); break; default: SV_Error ("SV_Physics: bad movetype %i", (int)ent->v.movetype); } }
int NUM_FOR_EDICT(edict_t *e) { int b; b = (byte *)e - (byte *)sv.edicts; b /= pr_edict_size; if (b < 0 || b >= sv.num_edicts) SV_Error ("NUM_FOR_EDICT: bad pointer"); return b; }
/* ================ SV_FlushSignon Moves to the next signon buffer if needed ================ */ void SV_FlushSignon (void) { if (sv.signon.cursize < sv.signon.maxsize - 512) return; if (sv.num_signon_buffers == MAX_SIGNON_BUFFERS-1) SV_Error ("sv.num_signon_buffers == MAX_SIGNON_BUFFERS-1"); sv.signon_buffer_size[sv.num_signon_buffers-1] = sv.signon.cursize; sv.signon.data = sv.signon_buffers[sv.num_signon_buffers]; sv.num_signon_buffers++; sv.signon.cursize = 0; }
/* Mod_LoadAliasGroup */ void * Mod_LoadAliasGroup (void *pin, maliasframedesc_t *frame) { daliasgroup_t *pingroup; maliasgroup_t *paliasgroup; int i, numframes; daliasinterval_t *pin_intervals; float *poutintervals; void *ptemp; pingroup = (daliasgroup_t *) pin; numframes = LittleLong (pingroup->numframes); paliasgroup = Hunk_AllocName (sizeof (maliasgroup_t) + (numframes - 1) * sizeof (paliasgroup->frames[0]), loadname); paliasgroup->numframes = numframes; for (i = 0; i < 3; i++) { // these are byte values, so we don't have to worry about endianness frame->bboxmin.v[i] = pingroup->bboxmin.v[i]; frame->bboxmax.v[i] = pingroup->bboxmax.v[i]; } frame->frame = (byte *) paliasgroup - (byte *) pheader; pin_intervals = (daliasinterval_t *) (pingroup + 1); poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname); paliasgroup->intervals = (byte *) poutintervals - (byte *) pheader; for (i = 0; i < numframes; i++) { *poutintervals = LittleFloat (pin_intervals->interval); if (*poutintervals <= 0.0) SV_Error ("Mod_LoadAliasGroup: interval<=0"); poutintervals++; pin_intervals++; } ptemp = (void *) pin_intervals; for (i = 0; i < numframes; i++) { maliasframedesc_t temp_frame; ptemp = Mod_LoadAliasFrame (ptemp, &temp_frame); memcpy (&paliasgroup->frames[i], &temp_frame, sizeof(paliasgroup->frames[i])); } return ptemp; }
/* ================= Mod_LoadMarksurfaces ================= */ static void Mod_LoadMarksurfaces (lump_t *l) { int i, j, count; short *in; msurface_t **out; in = (short *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("%s: funny lump size in %s", __thisfunc__, loadmodel->name); count = l->filelen / sizeof(*in); out = (msurface_t **) Hunk_AllocName (count * sizeof(*out), "marksurfaces"); loadmodel->marksurfaces = out; loadmodel->nummarksurfaces = count; for (i = 0; i < count; i++) { j = LittleShort(in[i]); if (j >= loadmodel->numsurfaces) SV_Error ("%s: bad surface number", __thisfunc__); out[i] = loadmodel->surfaces + j; } }
/* ================ SV_ModelIndex ================ */ int SV_ModelIndex (char *name) { int i; if (!name || !name[0]) return 0; for (i=0 ; i<MAX_MODELS && sv.model_precache[i] ; i++) if (!strcmp(sv.model_precache[i], name)) return i; if (i==MAX_MODELS || !sv.model_precache[i]) SV_Error ("SV_ModelIndex: model %s not precached", name); return i; }
/* Mod_LoadSpriteFrame */ void * Mod_LoadSpriteFrame (void *pin, mspriteframe_t **ppframe, int framenum) { dspriteframe_t *pinframe; mspriteframe_t *pspriteframe; int i, width, height, size, origin[2]; unsigned short *ppixout; byte *ppixin; pinframe = (dspriteframe_t *) pin; width = LittleLong (pinframe->width); height = LittleLong (pinframe->height); size = width * height; pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t) + size * r_pixbytes, loadname); memset (pspriteframe, 0, sizeof (mspriteframe_t) + size); *ppframe = pspriteframe; pspriteframe->width = width; pspriteframe->height = height; origin[0] = LittleLong (pinframe->origin[0]); origin[1] = LittleLong (pinframe->origin[1]); pspriteframe->up = origin[1]; pspriteframe->down = origin[1] - height; pspriteframe->left = origin[0]; pspriteframe->right = width + origin[0]; if (r_pixbytes == 1) { memcpy (&pspriteframe->pixels[0], (byte *) (pinframe + 1), size); } else if (r_pixbytes == 2) { ppixin = (byte *) (pinframe + 1); ppixout = (unsigned short *) &pspriteframe->pixels[0]; for (i = 0; i < size; i++) ppixout[i] = d_8to16table[ppixin[i]]; } else { SV_Error ("Mod_LoadSpriteFrame: driver set invalid r_pixbytes: %d\n", r_pixbytes); } return (void *) ((byte *) pinframe + sizeof (dspriteframe_t) + size); }
/* ================== Mod_LoadModel Loads a model into the cache ================== */ model_t *Mod_LoadModel (model_t *mod, qboolean crash) { // void *d; unsigned *buf; byte stackbuf[1024]; // avoid dirtying the cache heap if (!mod->needload) { if (mod->type == mod_alias) { // d = Cache_Check (&mod->cache); // if (d) // return mod; ; } else return mod; // not cached at all } // // load the file // buf = (unsigned *)COM_LoadStackFile (mod->name, stackbuf, sizeof(stackbuf)); if (!buf) { if (crash) SV_Error ("Mod_NumForName: %s not found", mod->name); return NULL; } // // allocate a new model // COM_FileBase (mod->name, loadname); loadmodel = mod; // // fill it in // // call the apropriate loader mod->needload = false; Mod_LoadBrushModel (mod, buf); return mod; }
/* ================= Mod_LoadSurfedges ================= */ static void Mod_LoadSurfedges (lump_t *l) { int i, count; int *in, *out; in = (int *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("%s: funny lump size in %s", __thisfunc__, loadmodel->name); count = l->filelen / sizeof(*in); out = (int *) Hunk_AllocName (count * sizeof(*out), "surfedges"); loadmodel->surfedges = out; loadmodel->numsurfedges = count; for (i = 0; i < count; i++) out[i] = LittleLong (in[i]); }
void QVM_RunError( qvm_t * qvm, char *error, ... ) { va_list argptr; char string[1024]; va_start( argptr, error ); vsnprintf( string, sizeof(string), error, argptr ); va_end( argptr ); sv_error = true; QVM_StackTrace( qvm ); Con_Printf( "%s\n", string ); SV_Error( "QVM Program error" ); }
/* ================= Mod_LoadClipnodes ================= */ void Mod_LoadClipnodes (lump_t *l) { dclipnode_t *in, *out; int i, count; hull_t *hull; in = (void *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("MOD_LoadBmodel: funny lump size in %s",loadmodel->name); count = l->filelen / sizeof(*in); out = Hunk_AllocName ( count*sizeof(*out), loadname); loadmodel->clipnodes = out; loadmodel->numclipnodes = count; hull = &loadmodel->hulls[1]; hull->clipnodes = out; hull->firstclipnode = 0; hull->lastclipnode = count-1; hull->planes = loadmodel->planes; hull->clip_mins[0] = -16; hull->clip_mins[1] = -16; hull->clip_mins[2] = -24; hull->clip_maxs[0] = 16; hull->clip_maxs[1] = 16; hull->clip_maxs[2] = 32; hull = &loadmodel->hulls[2]; hull->clipnodes = out; hull->firstclipnode = 0; hull->lastclipnode = count-1; hull->planes = loadmodel->planes; hull->clip_mins[0] = -32; hull->clip_mins[1] = -32; hull->clip_mins[2] = -24; hull->clip_maxs[0] = 32; hull->clip_maxs[1] = 32; hull->clip_maxs[2] = 64; for (i=0 ; i<count ; i++, out++, in++) { out->planenum = LittleLong(in->planenum); out->children[0] = LittleShort(in->children[0]); out->children[1] = LittleShort(in->children[1]); } }
/* ================ CalcSurfaceExtents Fills in s->texturemins[] and s->extents[] ================ */ static void CalcSurfaceExtents (msurface_t *s) { float mins_local[2], maxs_local[2], val; int i, j, e; mvertex_t *v; mtexinfo_t *tex; int bmins[2], bmaxs[2]; mins_local[0] = mins_local[1] = 999999; maxs_local[0] = maxs_local[1] = -99999; tex = s->texinfo; for (i = 0; i < s->numedges; i++) { e = loadmodel->surfedges[s->firstedge+i]; if (e >= 0) v = &loadmodel->vertexes[loadmodel->edges[e].v[0]]; else v = &loadmodel->vertexes[loadmodel->edges[-e].v[1]]; for (j = 0; j < 2; j++) { val = v->position[0] * tex->vecs[j][0] + v->position[1] * tex->vecs[j][1] + v->position[2] * tex->vecs[j][2] + tex->vecs[j][3]; if (val < mins_local[j]) mins_local[j] = val; if (val > maxs_local[j]) maxs_local[j] = val; } } for (i = 0; i < 2; i++) { bmins[i] = (int) floor(mins_local[i]/16); bmaxs[i] = (int) ceil(maxs_local[i]/16); s->texturemins[i] = bmins[i] * 16; s->extents[i] = (bmaxs[i] - bmins[i]) * 16; if ( !(tex->flags & TEX_SPECIAL) && s->extents[i] > 256) SV_Error ("Bad surface extents"); } }
/* PR_RunError Aborts the currently executing function */ void PR_RunError (progs_t *pr, char *error, ...) { va_list argptr; char string[1024]; va_start (argptr, error); vsnprintf (string, sizeof (string), error, argptr); va_end (argptr); PR_PrintStatement (pr, pr->pr_statements + pr->pr_xstatement); PR_StackTrace (pr); Con_Printf ("%s\n", string); pr->pr_depth = 0; // dump the stack so SV_Error can // shutdown functions SV_Error ("Program error"); }
/* ==================== SV_Init ==================== */ void SV_Init (void) { Sys_Printf ("Host_Init\n"); Memory_Init (host_parms->membase, host_parms->memsize); Cbuf_Init (); Cmd_Init (); COM_Init (); FS_Init (); PR_Init (); Mod_Init (); SV_InitNet (); SV_InitLocal (); Pmove_Init (); Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); host_hunklevel = Hunk_LowMark (); Cbuf_InsertText ("exec server.cfg\n"); Cbuf_Execute (); // unlock the early-set cvars after init Cvar_UnlockAll (); host_initialized = true; Con_Printf ("Exe: "__TIME__" "__DATE__"\n"); Con_Printf ("%4.1f megabyte heap\n", host_parms->memsize/(1024*1024.0)); Con_Printf ("======== HexenWorld Initialized ========\n"); // process command line arguments Cmd_StuffCmds_f (); Cbuf_Execute (); // if a map wasn't specified on the command line, spawn demo1.map if (sv.state == ss_dead) Cmd_ExecuteString ("map demo1", src_command); if (sv.state == ss_dead) SV_Error ("Couldn't spawn a server"); }
/* ================= Mod_LoadNodes ================= */ static void Mod_LoadNodes (lump_t *l) { int i, j, count, p; dnode_t *in; mnode_t *out; in = (dnode_t *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("%s: funny lump size in %s", __thisfunc__, loadmodel->name); count = l->filelen / sizeof(*in); out = (mnode_t *) Hunk_AllocName (count * sizeof(*out), "nodes"); loadmodel->nodes = out; loadmodel->numnodes = count; for (i = 0; i < count; i++, in++, out++) { for (j = 0; j < 3; j++) { out->minmaxs[j] = LittleShort (in->mins[j]); out->minmaxs[3+j] = LittleShort (in->maxs[j]); } p = LittleLong(in->planenum); out->plane = loadmodel->planes + p; out->firstsurface = LittleShort (in->firstface); out->numsurfaces = LittleShort (in->numfaces); for (j = 0; j < 2; j++) { p = LittleShort (in->children[j]); if (p >= 0) out->children[j] = loadmodel->nodes + p; else out->children[j] = (mnode_t *)(loadmodel->leafs + (-1 - p)); } } Mod_SetParent (loadmodel->nodes, NULL); // sets nodes and leafs }
/* ================= Mod_LoadEdges ================= */ static void Mod_LoadEdges (lump_t *l) { dedge_t *in; medge_t *out; int i, count; in = (dedge_t *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("%s: funny lump size in %s", __thisfunc__, loadmodel->name); count = l->filelen / sizeof(*in); out = (medge_t *) Hunk_AllocName ((count + 1) * sizeof(*out), "edges"); loadmodel->edges = out; loadmodel->numedges = count; for (i = 0; i < count; i++, in++, out++) { out->v[0] = (unsigned short)LittleShort(in->v[0]); out->v[1] = (unsigned short)LittleShort(in->v[1]); } }
/* ==================== PR_LeaveFunction ==================== */ int PR_LeaveFunction (void) { int i, c; if (pr_depth <= 0) SV_Error ("prog stack underflow"); // restore locals from the stack c = pr_xfunction->locals; localstack_used -= c; if (localstack_used < 0) PR_RunError ("PR_ExecuteProgram: locals stack underflow\n"); for (i=0 ; i < c ; i++) ((int *)pr_globals)[pr_xfunction->parm_start + i] = localstack[localstack_used+i]; // up stack pr_depth--; pr_xfunction = pr_stack[pr_depth].f; return pr_stack[pr_depth].s; }
/* ================= Mod_LoadLeafs ================= */ static void Mod_LoadLeafs (lump_t *l) { dleaf_t *in; mleaf_t *out; int i, j, count, p; in = (dleaf_t *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("%s: funny lump size in %s", __thisfunc__, loadmodel->name); count = l->filelen / sizeof(*in); out = (mleaf_t *) Hunk_AllocName (count * sizeof(*out), "leafs"); loadmodel->leafs = out; loadmodel->numleafs = count; for (i = 0; i < count; i++, in++, out++) { for (j = 0; j < 3; j++) { out->minmaxs[j] = LittleShort (in->mins[j]); out->minmaxs[3+j] = LittleShort (in->maxs[j]); } p = LittleLong(in->contents); out->contents = p; out->firstmarksurface = loadmodel->marksurfaces + LittleShort(in->firstmarksurface); out->nummarksurfaces = LittleShort(in->nummarksurfaces); p = LittleLong(in->visofs); if (p == -1) out->compressed_vis = NULL; else out->compressed_vis = loadmodel->visdata + p; out->efrags = NULL; for (j = 0; j < 4; j++) out->ambient_sound_level[j] = in->ambient_level[j]; } }
void VM_Unload( vm_t * vm ) { if ( !vm ) return; Con_DPrintf( "VM_Unload \"%s\"\n", vm->name ); switch ( vm->type ) { case VM_NATIVE: if ( vm->hInst ) if ( !Sys_DLClose( (DL_t) vm->hInst ) ) SV_Error( "VM_Unload: couldn't unload module %s\n", vm->name ); vm->hInst = NULL; break; case VM_BYTECODE: VM_UnloadQVM( (qvm_t*) vm->hInst ); break; case VM_NONE: return; } Q_free( vm ); }
/* ================= Mod_LoadVertexes ================= */ static void Mod_LoadVertexes (lump_t *l) { dvertex_t *in; mvertex_t *out; int i, count; in = (dvertex_t *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) SV_Error ("%s: funny lump size in %s", __thisfunc__, loadmodel->name); count = l->filelen / sizeof(*in); out = (mvertex_t *) Hunk_AllocName (count * sizeof(*out), "vertexes"); loadmodel->vertexes = out; loadmodel->numvertexes = count; for (i = 0; i < count; i++, in++, out++) { out->position[0] = LittleFloat (in->point[0]); out->position[1] = LittleFloat (in->point[1]); out->position[2] = LittleFloat (in->point[2]); } }
/* =============== Mod_PointInLeaf =============== */ mleaf_t *Mod_PointInLeaf (vec3_t p, model_t *model) { mnode_t *node; float d; mplane_t *plane; if (!model || !model->nodes) SV_Error ("Mod_PointInLeaf: bad model"); node = model->nodes; while (1) { if (node->contents < 0) return (mleaf_t *)node; plane = node->plane; d = DotProduct (p,plane->normal) - plane->dist; if (d > 0) node = node->children[0]; else node = node->children[1]; } return NULL; // never reached }