From 4a1416a5d2a90703150340890d70827551b5db28 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sun, 14 Jul 2013 12:22:51 +0000 Subject: [PATCH] removed hunk memory (as well as -mem argument). removed cache memory. added fallback normalmap texture. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4421 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/cl_cg.c | 2 +- engine/client/cl_input.c | 26 +- engine/client/cl_main.c | 17 +- engine/client/cl_parse.c | 7 - engine/client/cl_tent.c | 58 +- engine/client/cl_ui.c | 4 +- engine/client/client.h | 2 +- engine/client/clq3_parse.c | 2 - engine/client/console.c | 3 + engine/client/m_options.c | 2 +- engine/client/merged.h | 62 +- engine/client/p_script.c | 14 +- engine/client/pr_csqc.c | 8 +- engine/client/pr_skelobj.c | 46 +- engine/client/quakedef.h | 2 - engine/client/r_2d.c | 9 + engine/client/r_d3.c | 24 +- engine/client/r_surf.c | 14 +- engine/client/render.h | 27 +- engine/client/renderer.c | 75 +- engine/client/screen.h | 1 - engine/client/skin.c | 39 +- engine/client/snd_dma.c | 15 +- engine/client/sys_droid.c | 35 +- engine/client/sys_linux.c | 8 - engine/client/sys_morphos.c | 10 - engine/client/sys_sdl.c | 28 - engine/client/sys_win.c | 45 - engine/client/view.c | 2 +- engine/common/com_mesh.c | 820 ++++++--------- engine/common/com_mesh.h | 91 +- engine/common/common.c | 2 +- engine/common/common.h | 5 +- engine/common/fs.c | 33 +- engine/common/gl_q2bsp.c | 132 ++- engine/common/mathlib.h | 1 + engine/common/plugin.c | 2 +- engine/common/pr_bgcmd.c | 2 + engine/common/q1bsp.c | 2 +- engine/common/tlout.h | 1 - engine/common/translate.c | 1 - engine/common/translate.h | 1 - engine/common/world.h | 4 +- engine/common/zone.c | 1590 +---------------------------- engine/common/zone.h | 29 +- engine/d3d/d3d_backend.c | 2 +- engine/d3d/vid_d3d.c | 27 - engine/d3d/vid_d3d11.c | 26 - engine/dotnet2005/ftequake.sln | 22 +- engine/dotnet2005/ftequake.vcproj | 16 +- engine/gl/gl_alias.c | 29 +- engine/gl/gl_backend.c | 5 +- engine/gl/gl_draw.c | 198 ++-- engine/gl/gl_heightmap.c | 4 +- engine/gl/gl_hlmdl.c | 33 +- engine/gl/gl_model.c | 616 +++++------ engine/gl/gl_model.h | 24 +- engine/gl/gl_rmisc.c | 11 +- engine/gl/gl_shader.c | 2 +- engine/gl/gl_shadow.c | 23 + engine/gl/gl_vidcommon.c | 22 +- engine/gl/gl_vidlinuxglx.c | 17 - engine/server/server.h | 1 - engine/server/sv_ccmds.c | 4 + engine/server/sv_init.c | 31 +- engine/server/sv_main.c | 15 +- engine/server/sv_mvd.c | 8 +- engine/server/sv_send.c | 2 + engine/server/sv_sys_unix.c | 8 - engine/server/sv_sys_win.c | 19 +- engine/server/svmodel.c | 2 + engine/server/svq2_game.c | 6 +- engine/sw/sw.h | 25 +- engine/sw/sw_backend.c | 60 +- engine/sw/sw_image.c | 71 +- engine/sw/sw_rast.c | 272 +++-- engine/sw/sw_vidwin.c | 36 +- plugins/jabber/jabbercl.vcproj | 8 +- plugins/jabber/jabberclient.c | 9 +- plugins/paths.bat | 2 +- 80 files changed, 1519 insertions(+), 3440 deletions(-) diff --git a/engine/client/cl_cg.c b/engine/client/cl_cg.c index 6f38bcda8..eda2ea420 100644 --- a/engine/client/cl_cg.c +++ b/engine/client/cl_cg.c @@ -940,7 +940,7 @@ static qintptr_t CG_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con break; case CG_MEMORY_REMAINING: - VM_LONG(ret) = Hunk_LowMemAvailable(); + VM_LONG(ret) = 1024*1024*8;//Hunk_LowMemAvailable(); break; case CG_MILLISECONDS: diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index e18c0a2ff..b1839624b 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -1837,22 +1837,6 @@ void CL_SendCmd (double frametime, qboolean mainloop) } } -static char *VARGS vahunk(char *format, ...) -{ - va_list argptr; - char string[1024]; - char *ret; - - va_start (argptr, format); - Q_vsnprintfz (string,sizeof(string), format,argptr); - va_end (argptr); - - ret = Hunk_Alloc(strlen(string)+1); - strcpy(ret, string); - - return ret; -} - void CL_SendCvar_f (void) { cvar_t *var; @@ -1876,6 +1860,7 @@ CL_InitInput */ void CL_InitInput (void) { + static char pcmd[MAX_SPLITS][3][5]; int sp; #define inputnetworkcvargroup "client networking options" cl.splitclients = 1; @@ -1903,9 +1888,12 @@ void CL_InitInput (void) for (sp = 0; sp < MAX_SPLITS; sp++) { - Cmd_AddCommand (vahunk("p%i", sp+1), CL_Split_f); - Cmd_AddCommand (vahunk("+p%i", sp+1), CL_Split_f); - Cmd_AddCommand (vahunk("-p%i", sp+1), CL_Split_f); + Q_snprintfz(pcmd[sp][0], sizeof(pcmd[sp][0]), "p%i", sp+1); + Q_snprintfz(pcmd[sp][1], sizeof(pcmd[sp][1]), "+p%i", sp+1); + Q_snprintfz(pcmd[sp][2], sizeof(pcmd[sp][2]), "-p%i", sp+1); + Cmd_AddCommand (pcmd[sp][0], CL_Split_f); + Cmd_AddCommand (pcmd[sp][1], CL_Split_f); + Cmd_AddCommand (pcmd[sp][2], CL_Split_f); /*default mlook to pressed, (on android we split the two sides of the screen)*/ in_mlook.state[sp] = 1; diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 2821d98d3..97380cfb1 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -232,8 +232,6 @@ double realtime; // without any filtering or bounding double oldrealtime; // last frame run int host_framecount; -int host_hunklevel; - qbyte *host_basepal; qbyte *h2playertranslations; @@ -302,6 +300,8 @@ void CL_MakeActive(char *gamename) SCR_EndLoadingPlaque(); + Mod_Flush(false); + TP_ExecTrigger("f_spawn"); } /* @@ -1100,9 +1100,6 @@ void CL_ClearState (void) SV_UnspawnServer(); Mod_ClearAll (); - if (host_hunklevel) // FIXME: check this... - Hunk_FreeToLowMark (host_hunklevel); - Cvar_ApplyLatches(CVAR_LATCH); } @@ -4450,16 +4447,11 @@ void Host_Init (quakeparms_t *parms) if (setjmp (host_abort) ) Sys_Error("Host_Init: An error occured. Try the -condebug commandline parameter\n"); - if (COM_CheckParm ("-minmemory")) - parms->memsize = MINIMUM_MEMORY; host_parms = *parms; - if (parms->memsize < MINIMUM_MEMORY) - Sys_Error ("Only %4.1f megs of memory reported, can't execute game", parms->memsize / (float)0x100000); - Cvar_Init(); - Memory_Init (parms->membase, parms->memsize); + Memory_Init (); /*memory is working, its safe to printf*/ Con_Init (); @@ -4523,9 +4515,6 @@ void Host_Init (quakeparms_t *parms) // Con_Printf ("Exe: "__TIME__" "__DATE__"\n"); //Con_TPrintf (TL_HEAPSIZE, parms->memsize/ (1024*1024.0)); - Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); - host_hunklevel = Hunk_LowMark (); - R_SetRenderer(NULL);//set the renderer stuff to unset... host_initialized = true; diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index d0c9df9de..5f6bd5546 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -1128,7 +1128,6 @@ int CL_LoadModels(int stage, qboolean dontactuallyload) else #endif cl.model_precache[i] = Mod_ForName (cl.model_name[i], false); - Hunk_Check(); S_ExtraUpdate(); @@ -1189,7 +1188,6 @@ int CL_LoadModels(int stage, qboolean dontactuallyload) CSQC_LoadResource(cl.model_csqcname[i], "model"); #endif cl.model_csqcprecache[i] = Mod_ForName (cl.model_csqcname[i], false); - Hunk_Check(); S_ExtraUpdate(); @@ -2999,7 +2997,6 @@ Con_DPrintf ("CL_SignonReply: %i\n", cls.signon); case 3: CL_SendClientCommand(true, "begin"); - Cache_Report (); // print remaining memory #ifdef VM_CG CG_Start(); #endif @@ -3213,8 +3210,6 @@ void CL_ParseSoundlist (qboolean lots) { CL_AllowIndependantSendCmd(false); //stop it now, the indep stuff *could* require model tracing. - Hunk_Check (); // make sure nothing is hurt - cl.sendprespawn = true; } else @@ -3308,8 +3303,6 @@ void CL_ParseModellist (qboolean lots) CL_AllowIndependantSendCmd(false); //stop it now, the indep stuff *could* require model tracing. - Hunk_Check (); // make sure nothing is hurt - //set the flag to load models and send prespawn cl.sendprespawn = true; } diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index d9c67531f..56c30b0bb 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -767,7 +767,7 @@ void CL_AddBeam (int tent, int ent, vec3_t start, vec3_t end) //fixme: use TE_ n if (etype >= 0) { P_RunParticleEffectState (impact, normal, 1, etype, &(b->emitstate)); - if (cl_legacystains.ival) R_AddStain(end, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(end, -10, -10, -10, 20); } } void CL_ParseBeam (int tent) @@ -848,7 +848,7 @@ void CL_ParseStream (int type) b->model = Mod_ForName("models/stice.mdl", true); b->flags |= 2; b->particleeffect = P_FindParticleType("te_stream_icechunks"); - if (cl_legacystains.ival) R_AddStain(end, -10, -10, 0, 20); + if (cl_legacystains.ival) Surf_AddStain(end, -10, -10, 0, 20); break; case TEH2_STREAM_SUNSTAFF1: b->model = Mod_ForName("models/stsunsf1.mdl", true); @@ -867,7 +867,7 @@ void CL_ParseStream (int type) case TEH2_STREAM_SUNSTAFF2: b->model = Mod_ForName("models/stsunsf1.mdl", true); b->particleeffect = P_FindParticleType("te_stream_sunstaff2"); - if (cl_legacystains.ival) R_AddStain(end, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(end, -10, -10, -10, 20); break; case TEH2_STREAM_COLORBEAM: b->model = Mod_ForName("models/stclrbm.mdl", true); @@ -943,7 +943,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, 0, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, 0, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, pt_wizspike)) P_RunParticleEffect (pos, vec3_origin, 20, 30); @@ -956,7 +956,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, pt_knightspike)) P_RunParticleEffect (pos, vec3_origin, 226, 20); @@ -969,7 +969,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, ptdp_spikequad)) if (P_RunParticleEffectType(pos, NULL, 1, pt_spike)) @@ -994,7 +994,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, pt_spike)) if (P_RunParticleEffectType(pos, NULL, 10, pt_gunshot)) @@ -1018,7 +1018,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, ptdp_superspikequad)) if (P_RunParticleEffectType(pos, NULL, 1, pt_superspike)) @@ -1044,7 +1044,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, pt_superspike)) if (P_RunParticleEffectType(pos, NULL, 2, pt_spike)) @@ -1073,7 +1073,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, ptfte_bullet)) if (P_RunParticleEffectType(pos, NULL, 10, pt_gunshot)) @@ -1097,7 +1097,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, ptfte_superbullet)) if (P_RunParticleEffectType(pos, NULL, 2, ptfte_bullet)) @@ -1128,7 +1128,7 @@ void CL_ParseTEnt (void) if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111 - if (cl_legacystains.ival) R_AddStain(pos, -1, -1, -1, 100); + if (cl_legacystains.ival) Surf_AddStain(pos, -1, -1, -1, 100); // light if (r_explosionlight.value) @@ -1168,7 +1168,7 @@ void CL_ParseTEnt (void) if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111 - if (cl_legacystains.ival) R_AddStain(pos, -1, -1, -1, 100); + if (cl_legacystains.ival) Surf_AddStain(pos, -1, -1, -1, 100); // light if (r_explosionlight.value) @@ -1231,7 +1231,7 @@ void CL_ParseTEnt (void) if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111 - if (cl_legacystains.ival) R_AddStain(pos, -1, -1, -1, 100); + if (cl_legacystains.ival) Surf_AddStain(pos, -1, -1, -1, 100); // light @@ -1262,7 +1262,7 @@ void CL_ParseTEnt (void) if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111 - if (cl_legacystains.ival) R_AddStain(pos, -1, -1, -1, 100); + if (cl_legacystains.ival) Surf_AddStain(pos, -1, -1, -1, 100); // light if (r_explosionlight.value) @@ -1321,7 +1321,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, ptdp_gunshotquad)) if (P_RunParticleEffectType(pos, NULL, 1, pt_gunshot)) @@ -1337,7 +1337,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, cnt, pt_gunshot)) P_RunParticleEffect (pos, vec3_origin, 0, 20*cnt); @@ -1350,7 +1350,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, 0, -10, -10, 40); + if (cl_legacystains.ival) Surf_AddStain(pos, 0, -10, -10, 40); if (P_RunParticleEffectType(pos, NULL, cnt, ptqw_blood)) if (P_RunParticleEffectType(pos, NULL, cnt, ptdp_blood)) @@ -1363,7 +1363,7 @@ void CL_ParseTEnt (void) pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); - if (cl_legacystains.ival) R_AddStain(pos, 1, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, 1, -10, -10, 20); if (P_RunParticleEffectType(pos, NULL, 1, ptqw_lightningblood)) P_RunParticleEffect (pos, vec3_origin, 225, 50); @@ -1519,7 +1519,7 @@ void CL_ParseTEnt (void) dl->color[2] = 1.0; // stain (Hopefully this is close to how DP does it) - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 30); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 30); if (P_ParticleTrail(pos, pos2, P_FindParticleType("te_plasmaburn"), 0, NULL)) P_ParticleTrailIndex(pos, pos2, 15, 0, NULL); @@ -1731,7 +1731,7 @@ void CL_SpawnCustomTEnd(custtentinst_t *info) if (t->netstyle & CTE_STAINS) { //added at pos2 - end of trail - R_AddStain(info->pos2, t->stain[0], t->stain[1], t->stain[2], 40); + Surf_AddStain(info->pos2, t->stain[0], t->stain[1], t->stain[2], 40); } if (t->netstyle & CTE_GLOWS) { //added at pos1 firer's end. @@ -2234,7 +2234,7 @@ void CLQ2_ParseTEnt (void) if (P_RunParticleEffectType(pos, dir, 1, ptq2_blood)) if (P_RunParticleEffectType(pos, dir, 1, ptqw_blood)) P_RunParticleEffect(pos, dir, 0xe8, 60); - if (cl_legacystains.ival) R_AddStain(pos, 0, -10, -10, 40); + if (cl_legacystains.ival) Surf_AddStain(pos, 0, -10, -10, 40); break; case Q2TE_GUNSHOT: // bullet hitting wall @@ -2247,7 +2247,7 @@ void CLQ2_ParseTEnt (void) else P_RunParticleEffect (pos, dir, 0xe0, 6); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); if (type != Q2TE_SPARKS) { @@ -2282,7 +2282,7 @@ void CLQ2_ParseTEnt (void) MSG_ReadDir (dir); P_RunParticleEffect (pos, dir, 0, 20); CL_SmokeAndFlash(pos); - if (cl_legacystains.ival) R_AddStain(pos, -10, -10, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -10, -10, 20); break; case Q2TE_SPLASH: // bullet hitting water @@ -2342,7 +2342,7 @@ void CLQ2_ParseTEnt (void) if (P_RunParticleEffectType(pos, dir, 1, ptq2_blasterparticles)) P_RunParticleEffect (pos, dir, 0xe0, 40); - if (cl_legacystains.ival) R_AddStain(pos, 0, -5, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, 0, -5, -10, 20); ex = CL_AllocExplosion (); VectorCopy (pos, ex->origin); @@ -2402,7 +2402,7 @@ void CLQ2_ParseTEnt (void) if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 0xe0, 256); - if (cl_legacystains.ival) R_AddStain(pos, -1, -1, -1, 100); + if (cl_legacystains.ival) Surf_AddStain(pos, -1, -1, -1, 100); // light if (r_explosionlight.value) @@ -2497,7 +2497,7 @@ void CLQ2_ParseTEnt (void) if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 0xe0, 256); - if (cl_legacystains.ival) R_AddStain(pos, -1, -1, -1, 100); + if (cl_legacystains.ival) Surf_AddStain(pos, -1, -1, -1, 100); } // light @@ -2673,7 +2673,7 @@ void CLQ2_ParseTEnt (void) if (P_RunParticleEffectType(pos, dir, 1, ptq2_blasterparticles)) P_RunParticleEffect (pos, dir, 0xd0, 40); - if (cl_legacystains.ival) R_AddStain(pos, -10, 0, -10, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, 0, -10, 20); ex = CL_AllocExplosion (); VectorCopy (pos, ex->origin); @@ -2723,7 +2723,7 @@ void CLQ2_ParseTEnt (void) if (P_RunParticleEffectType(pos, dir, 1, ptq2_blasterparticles)) P_RunParticleEffect (pos, dir, 0x6f, 40); - if (cl_legacystains.ival) R_AddStain(pos, -10, -2, 0, 20); + if (cl_legacystains.ival) Surf_AddStain(pos, -10, -2, 0, 20); ex = CL_AllocExplosion (); VectorCopy (pos, ex->origin); diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index 19d47b9b0..3062b7c5f 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -401,7 +401,7 @@ void VQ3_AddEntity(const q3refEntity_t *q3) ent.rotation = q3->rotation; if (q3->customSkin) - ent.skinnum = Mod_SkinForName(ent.model, VM_FROMSTRCACHE(q3->customSkin)); + ent.skinnum = Mod_SkinNumForName(ent.model, VM_FROMSTRCACHE(q3->customSkin)); ent.shaderRGBAf[0] = q3->shaderRGBA[0]/255.0f; ent.shaderRGBAf[1] = q3->shaderRGBA[1]/255.0f; @@ -1086,7 +1086,7 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con return VMQ3_Cvar_Update(VM_POINTER(arg[0])); case UI_MEMORY_REMAINING: - VM_LONG(ret) = Hunk_LowMemAvailable(); + VM_LONG(ret) = 1024*1024*8;//Hunk_LowMemAvailable(); break; case UI_GET_CDKEY: //get cd key diff --git a/engine/client/client.h b/engine/client/client.h index ae71f4834..bc3604883 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -31,7 +31,7 @@ typedef struct texnums_t textures; qboolean failedload; // the name isn't a valid skin - cache_user_t cache; + void *skindata; } skin_t; // player_state_t is the information needed by a player entity diff --git a/engine/client/clq3_parse.c b/engine/client/clq3_parse.c index 8cfae591a..75b7ec0fd 100644 --- a/engine/client/clq3_parse.c +++ b/engine/client/clq3_parse.c @@ -606,8 +606,6 @@ void CLQ3_ParseGameState(void) SCR_EndLoadingPlaque(); - Hunk_Check (); // make sure nothing is hurt - CL_MakeActive("Quake3Arena"); cl.splitclients = 1; diff --git a/engine/client/console.c b/engine/client/console.c index 4d63c83a4..4ae20d100 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -877,7 +877,10 @@ void VARGS Con_DPrintf (const char *fmt, ...) if (!developer.value) Con_Log(msg); else + { + Sys_Printf ("%s", msg); // also echo to debugging console Con_PrintCon(&con_main, msg); + } } /*description text at the bottom of the console*/ diff --git a/engine/client/m_options.c b/engine/client/m_options.c index faa0b3070..348e0edfb 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -74,7 +74,7 @@ void M_Menu_Options_f (void) menubulk_t bulk[] = { MB_CONSOLECMD("Customize controls", "menu_keys\n", "Modify keyboard and mouse inputs."), MB_CONSOLECMD("Go to console", "toggleconsole\nplay misc/menu2.wav\n", "Open up the engine console."), - MB_CONSOLECMD("Reset to defaults", "exec default.cfg\nplay misc/menu2.wav\n", "Reloads the default configuration."), + MB_CONSOLECMD("Reset to defaults", "cvarreset *\nexec default.cfg\nplay misc/menu2.wav\n", "Reloads the default configuration."), MB_CONSOLECMD("Save all settings", "cfg_save\n", "Writes changed settings out to a config file."), MB_SPACING(4), MB_SLIDER("Mouse Speed", sensitivity, 1, 10, 0.2, NULL), diff --git a/engine/client/merged.h b/engine/client/merged.h index ad5c191e5..66eaf09e6 100644 --- a/engine/client/merged.h +++ b/engine/client/merged.h @@ -50,10 +50,6 @@ typedef struct { #define qrenderer QR_NONE #define FNC(n) (n) //FNC is defined as 'pointer if client build, direct if dedicated server' -#define Mod_SkinForName Mod_SkinNumForName -#define Mod_FrameForName Mod_FrameNumForName -#define Mod_GetFrameDuration Mod_FrameDuration - #else #define FNC(n) (*n) extern r_qrenderer_t qrenderer; @@ -78,8 +74,6 @@ void R2D_ImagePaletteColour(unsigned int i, float a); void R2D_FillBlock(int x, int y, int w, int h); extern void (*Draw_Init) (void); -extern void (*Draw_TinyCharacter) (int x, int y, unsigned int num); -extern qboolean (*Draw_IsCached) (char *picname); //can be null extern void (*R_Init) (void); extern void (*R_DeInit) (void); @@ -88,9 +82,6 @@ extern void (*R_RenderView) (void); // must set r_refdef first extern void (*R_NewMap) (void); extern void (*R_PreNewMap) (void); -extern void (*R_AddStain) (vec3_t org, float red, float green, float blue, float radius); -extern void (*R_LessenStains) (void); - extern qboolean (*VID_Init) (rendererstate_t *info, unsigned char *palette); extern void (*VID_DeInit) (void); extern char *(*VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight); @@ -119,19 +110,20 @@ void R_DrawTextField(int x, int y, int w, int h, char *text, unsigned int defaul #endif -extern void FNC(Mod_Init) (void); -extern void FNC(Mod_ClearAll) (void); -extern struct model_s *FNC(Mod_ForName) (char *name, qboolean crash); -extern struct model_s *FNC(Mod_FindName) (char *name); -extern void *FNC(Mod_Extradata) (struct model_s *mod); // handles caching -extern void FNC(Mod_TouchModel) (char *name); +extern void Mod_Init (void); +extern void Mod_ClearAll (void); +extern void Mod_Flush (qboolean force); +extern struct model_s *Mod_ForName (char *name, qboolean crash); +extern struct model_s *Mod_FindName (char *name); +extern void *Mod_Extradata (struct model_s *mod); // handles caching +extern void Mod_TouchModel (char *name); -extern void FNC(Mod_NowLoadExternal) (void); +extern void Mod_NowLoadExternal (void); -extern void FNC(Mod_Think) (void); -extern int FNC(Mod_SkinForName) (struct model_s *model, char *name); -extern int FNC(Mod_FrameForName) (struct model_s *model, char *name); -extern float FNC(Mod_GetFrameDuration) (struct model_s *model, int framenum); +extern void Mod_Think (void); +extern int Mod_SkinNumForName (struct model_s *model, char *name); +extern int Mod_FrameNumForName (struct model_s *model, char *name); +extern float Mod_GetFrameDuration (struct model_s *model, int framenum); #undef FNC @@ -295,32 +287,12 @@ typedef struct rendererinfo_s { void (*IMG_Upload) (texid_t tex, char *name, uploadfmt_t fmt, void *data, void *palette, int width, int height, unsigned int flags); void (*IMG_DestroyTexture) (texid_t tex); - void (*R_Init) (void); - void (*R_DeInit) (void); - void (*R_RenderView) (void); // must set r_refdef first - - void (*R_NewMap) (void); - void (*R_PreNewMap) (void); - - void (*R_AddStain) (vec3_t org, float red, float green, float blue, float radius); - void (*R_LessenStains) (void); - - void (*Mod_Init) (void); - void (*Mod_Shutdown) (void); - void (*Mod_ClearAll) (void); - struct model_s *(*Mod_ForName) (char *name, qboolean crash); - struct model_s *(*Mod_FindName) (char *name); - void *(*Mod_Extradata) (struct model_s *mod); // handles caching - void (*Mod_TouchModel) (char *name); - - void (*Mod_NowLoadExternal) (void); - void (*Mod_Think) (void); - qboolean (*Mod_GetTag) (struct model_s *model, int tagnum, framestate_t *fstate, float *result); - int (*Mod_TagNumForName) (struct model_s *model, char *name); - int (*Mod_SkinForName) (struct model_s *model, char *name); - int (*Mod_FrameForName) (struct model_s *model, char *name); - float (*Mod_GetFrameDuration) (struct model_s *model, int frame); + void (*R_Init) (void); //FIXME - merge implementations + void (*R_DeInit) (void); //FIXME - merge implementations + void (*R_RenderView) (void); // must set r_refdef first + void (*R_NewMap) (void); //FIXME - merge implementations + void (*R_PreNewMap) (void); //FIXME - merge implementations qboolean (*VID_Init) (rendererstate_t *info, unsigned char *palette); void (*VID_DeInit) (void); diff --git a/engine/client/p_script.c b/engine/client/p_script.c index 4723be73e..1fce2f249 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -2729,7 +2729,9 @@ static void R_Part_SkyTri(float *v1, float *v2, float *v3, msurface_t *surf, int skytris_t *st; - st = Hunk_Alloc(sizeof(skytris_t)); + st = NULL;//Hunk_Alloc(sizeof(skytris_t)); + if (!st) + return; st->next = part_type[ptype].skytris; VectorCopy(v1, st->org); VectorSubtract(v2, st->org, st->x); @@ -3138,7 +3140,7 @@ static void PScript_EffectSpawned(part_type_t *ptype, vec3_t org, vec3_t dir, in S_StartSound(0, 0, S_PrecacheSound(ptype->soundname), org, ptype->soundvol, ptype->soundattn, ptype->sounddelay, ptype->soundpitch); } if (ptype->stain_radius) - R_AddStain(org, ptype->stain_rgb[0], ptype->stain_rgb[1], ptype->stain_rgb[2], ptype->stain_radius); + Surf_AddStain(org, ptype->stain_rgb[0], ptype->stain_rgb[1], ptype->stain_rgb[2], ptype->stain_radius); } int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, vec3_t tangent2, float size, float **out); @@ -5330,7 +5332,7 @@ static void PScript_DrawParticleTypes (void) { if (traces-->0&&tr(oldorg, p->org, stop, normal)) { - R_AddStain(stop, (p->rgba[1]*-10+p->rgba[2]*-10), + Surf_AddStain(stop, (p->rgba[1]*-10+p->rgba[2]*-10), (p->rgba[0]*-10+p->rgba[2]*-10), (p->rgba[0]*-10+p->rgba[1]*-10), 30*p->rgba[3]*type->stainonimpact); @@ -5554,7 +5556,7 @@ static void PScript_DrawParticleTypes (void) if (traces-->0&&tr(oldorg, p->org, stop, normal)) { if (type->stainonimpact && r_bloodstains.ival) - R_AddStain(stop, p->rgba[1]*-10+p->rgba[2]*-10, + Surf_AddStain(stop, p->rgba[1]*-10+p->rgba[2]*-10, p->rgba[0]*-10+p->rgba[2]*-10, p->rgba[0]*-10+p->rgba[1]*-10, 30*p->rgba[3]); @@ -5595,12 +5597,12 @@ static void PScript_DrawParticleTypes (void) if (traces-->0&&tr(oldorg, p->org, stop, normal)) { if (type->stainonimpact < 0) - R_AddStain(stop, (p->rgba[0]*-1), + Surf_AddStain(stop, (p->rgba[0]*-1), (p->rgba[1]*-1), (p->rgba[2]*-1), p->scale*-type->stainonimpact); else - R_AddStain(stop, (p->rgba[1]*-10+p->rgba[2]*-10), + Surf_AddStain(stop, (p->rgba[1]*-10+p->rgba[2]*-10), (p->rgba[0]*-10+p->rgba[2]*-10), (p->rgba[0]*-10+p->rgba[1]*-10), 30*p->rgba[3]*type->stainonimpact); diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index d2fcacd76..6030efe95 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -3071,7 +3071,7 @@ static void QCBUILTIN PF_cl_te_explosion (pubprogfuncs_t *prinst, struct globalv if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111 - R_AddStain(pos, -1, -1, -1, 100); + Surf_AddStain(pos, -1, -1, -1, 100); S_StartSound (-2, 0, cl_sfx_r_exp3, pos, 1, 1, 0, 0); } @@ -3139,7 +3139,7 @@ static void QCBUILTIN PF_cl_te_explosionquad (pubprogfuncs_t *prinst, struct glo if (P_RunParticleEffectType(pos, NULL, 1, pt_explosion)) P_RunParticleEffect(pos, NULL, 107, 1024); // should be 97-111 - R_AddStain(pos, -1, -1, -1, 100); + Surf_AddStain(pos, -1, -1, -1, 100); // light if (r_explosionlight.value) { @@ -3251,7 +3251,7 @@ static void QCBUILTIN PF_cl_te_explosionrgb (pubprogfuncs_t *prinst, struct glob if (P_RunParticleEffectType(org, NULL, 1, pt_explosion)) P_RunParticleEffect(org, NULL, 107, 1024); // should be 97-111 - R_AddStain(org, -1, -1, -1, 100); + Surf_AddStain(org, -1, -1, -1, 100); // light if (r_explosionlight.value) @@ -5647,7 +5647,7 @@ qboolean CSQC_DrawView(void) DropPunchAngle (csqc_playerview); if (cl.worldmodel) - R_LessenStains(); + Surf_LessenStains(); if (!cl.paused) { diff --git a/engine/client/pr_skelobj.c b/engine/client/pr_skelobj.c index 81fcd91e6..9cb94d5f7 100644 --- a/engine/client/pr_skelobj.c +++ b/engine/client/pr_skelobj.c @@ -269,8 +269,8 @@ static void bonematident_toqcvectors(float vx[3], float vy[3], float vz[3], floa static qboolean pendingkill; /*states that there is a skel waiting to be killed*/ #ifdef RAGDOLL -void rag_uninstanciate(skelobject_t *sko); -int rag_finddollbody(doll_t *d, char *bodyname) +static void rag_uninstanciate(skelobject_t *sko); +static int rag_finddollbody(doll_t *d, char *bodyname) { int i; for (i = 0; i < d->numbodies; i++) @@ -280,7 +280,7 @@ int rag_finddollbody(doll_t *d, char *bodyname) } return -1; } -int rag_finddolljoint(doll_t *d, char *name) +static int rag_finddolljoint(doll_t *d, char *name) { int i; for (i = 0; i < d->numjoints; i++) @@ -303,7 +303,7 @@ typedef struct { odebodyinfo_t defbody; odejointinfo_t defjoint; } dollcreatectx_t; -dollcreatectx_t *rag_createdoll(model_t *mod, char *fname, int numbones) +static dollcreatectx_t *rag_createdoll(model_t *mod, char *fname, int numbones) { int i; dollcreatectx_t *ctx; @@ -351,7 +351,7 @@ dollcreatectx_t *rag_createdoll(model_t *mod, char *fname, int numbones) return ctx; } //returns true if the command was recognised. false if the command is for something else. -qboolean rag_dollline(dollcreatectx_t *ctx, int linenum) +static qboolean rag_dollline(dollcreatectx_t *ctx, int linenum) { int i; int argc; @@ -569,7 +569,7 @@ qboolean rag_dollline(dollcreatectx_t *ctx, int linenum) return true; }; -doll_t *rag_finishdoll(dollcreatectx_t *ctx) +static doll_t *rag_finishdoll(dollcreatectx_t *ctx) { doll_t *d = ctx->d; int i; @@ -700,9 +700,9 @@ void rag_flushdolls(qboolean force) } } -void skel_integrate(pubprogfuncs_t *prinst, skelobject_t *sko, skelobject_t *skelobjsrc, float ft, float mmat[12]) -{ #if 0 +static void skel_integrate(pubprogfuncs_t *prinst, skelobject_t *sko, skelobject_t *skelobjsrc, float ft, float mmat[12]) +{ trace_t t; vec3_t npos, opos, wnpos, wopos; vec3_t move; @@ -803,7 +803,6 @@ void skel_integrate(pubprogfuncs_t *prinst, skelobject_t *sko, skelobject_t *ske /*FIXME*/ } } -#endif /*debugging*/ #if 0 /*draw points*/ @@ -818,8 +817,9 @@ void skel_integrate(pubprogfuncs_t *prinst, skelobject_t *sko, skelobject_t *ske #endif } #endif +#endif -void skel_generateragdoll_f_bones(vfsfile_t *f, galiasbone_t *bones, int numbones, int parent, int indent) +static void skel_generateragdoll_f_bones(vfsfile_t *f, galiasbone_t *bones, int numbones, int parent, int indent) { int i, j; for (i = 0; i < numbones; i++) @@ -952,6 +952,7 @@ void skel_info_f(void) Con_Printf(" type: %s\n", (skelobjects[i].type == SKOT_RELATIVE)?"parentspace":"modelspace"); Con_Printf(" model: %s\n", skelobjects[i].model->name); Con_Printf(" bone count: %i\n", skelobjects[i].numbones); +#ifdef RAGDOLL if (skelobjects[i].doll) { Con_Printf(" ragdoll: %s%s\n", skelobjects[i].doll->name, ((skelobjects[i].doll == skelobjects[i].model->dollinfo)?" (model default)":"")); @@ -959,6 +960,7 @@ void skel_info_f(void) } if (skelobjects[i].entity) Con_Printf(" entity: %i (%s)\n", skelobjects[i].entity->entnum, skelobjects[i].world->progs->StringToNative(skelobjects[i].world->progs, skelobjects[i].entity->v->classname)); +#endif } } } @@ -972,7 +974,9 @@ void skel_reset(pubprogfuncs_t *prinst) { if (skelobjects[i].world == prinst->parms->user) { +#ifdef RAGDOLL rag_uninstanciate(&skelobjects[i]); +#endif skelobjects[i].numbones = 0; skelobjects[i].inuse = false; skelobjects[i].bonematrix = NULL; @@ -981,7 +985,9 @@ void skel_reset(pubprogfuncs_t *prinst) while (numskelobjectsused && !skelobjects[numskelobjectsused-1].inuse) numskelobjectsused--; +#ifdef RAGDOLL rag_flushdolls(false); +#endif } /*deletes any skeletons marked for deletion*/ @@ -996,7 +1002,9 @@ void skel_dodelete(pubprogfuncs_t *prinst) { if (skelobjects[skelidx].inuse == 2) { +#ifdef RAGDOLL rag_uninstanciate(&skelobjects[skelidx]); +#endif skelobjects[skelidx].inuse = 0; } } @@ -1005,7 +1013,7 @@ void skel_dodelete(pubprogfuncs_t *prinst) numskelobjectsused--; } -skelobject_t *skel_create(pubprogfuncs_t *prinst, int bonecount) +static skelobject_t *skel_create(pubprogfuncs_t *prinst, int bonecount) { unsigned int skelidx; //invalid if the bonecount is not set... @@ -1043,7 +1051,7 @@ skelobject_t *skel_create(pubprogfuncs_t *prinst, int bonecount) return NULL; } -skelobject_t *skel_get(pubprogfuncs_t *prinst, int skelidx) +static skelobject_t *skel_get(pubprogfuncs_t *prinst, int skelidx) { skelidx--; if ((unsigned int)skelidx >= numskelobjectsused) @@ -1074,8 +1082,9 @@ void QCBUILTIN PF_skel_mmap(pubprogfuncs_t *prinst, struct globalvars_s *pr_glob G_INT(OFS_RETURN) = (char*)sko->bonematrix - prinst->stringtable; } +#ifdef RAGDOLL //may not poke the skeletal object bone data. -void rag_uninstanciate(skelobject_t *sko) +static void rag_uninstanciate(skelobject_t *sko) { int i; if (!sko->doll) @@ -1462,6 +1471,7 @@ void rag_updatedeltaent(entity_t *ent, lerpents_t *le) } #endif #endif +#endif #ifdef SKELETALOBJECTS //update a skeletal object to track its ragdoll/apply a ragdoll to a skeletal object. @@ -2218,8 +2228,8 @@ void QCBUILTIN PF_frameforname (pubprogfuncs_t *prinst, struct globalvars_s *pr_ char *str = PF_VarString(prinst, 1, pr_globals); model_t *mod = w->Get_CModel(w, modelindex); - if (mod && Mod_FrameForName) - G_FLOAT(OFS_RETURN) = Mod_FrameForName(mod, str); + if (mod) + G_FLOAT(OFS_RETURN) = Mod_FrameNumForName(mod, str); else G_FLOAT(OFS_RETURN) = -1; } @@ -2230,7 +2240,7 @@ void QCBUILTIN PF_frameduration (pubprogfuncs_t *prinst, struct globalvars_s *pr unsigned int framenum = G_FLOAT(OFS_PARM1); model_t *mod = w->Get_CModel(w, modelindex); - if (mod && Mod_GetFrameDuration) + if (mod) G_FLOAT(OFS_RETURN) = Mod_GetFrameDuration(mod, framenum); else G_FLOAT(OFS_RETURN) = 0; @@ -2243,8 +2253,8 @@ void QCBUILTIN PF_skinforname (pubprogfuncs_t *prinst, struct globalvars_s *pr_g char *str = PF_VarString(prinst, 1, pr_globals); model_t *mod = w->Get_CModel(w, modelindex); - if (mod && Mod_SkinForName) - G_FLOAT(OFS_RETURN) = Mod_SkinForName(mod, str); + if (mod) + G_FLOAT(OFS_RETURN) = Mod_SkinNumForName(mod, str); else #endif G_FLOAT(OFS_RETURN) = -1; diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index 3fd0aa49f..0486e6ba2 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -229,8 +229,6 @@ typedef struct quakeparms_s char *binarydir; //exe directory int argc; const char **argv; - void *membase; - unsigned int memsize; } quakeparms_t; diff --git a/engine/client/r_2d.c b/engine/client/r_2d.c index a33a7f694..3ae448c1d 100644 --- a/engine/client/r_2d.c +++ b/engine/client/r_2d.c @@ -6,6 +6,7 @@ qboolean r2d_noshadergamma; //says the video code has successfully activated hardware gamma texid_t missing_texture; texid_t missing_texture_gloss; +texid_t missing_texture_normal; texid_t translate_texture; shader_t *translate_shader; @@ -128,9 +129,11 @@ Image loading code must be ready for use at this point. */ void R2D_Init(void) { + unsigned int nonorm[4*4]; unsigned int nogloss[4*4]; int i; unsigned int glossval; + unsigned int normval; extern cvar_t gl_specular_fallback; conback = NULL; @@ -156,10 +159,16 @@ void R2D_Init(void) glossval *= 0x10101; glossval |= 0xff000000; glossval = LittleLong(glossval); + normval = 0xffff8080; + normval = LittleLong(normval); for (i = 0; i < 4*4; i++) + { nogloss[i] = glossval; + nonorm[i] = normval; + } missing_texture = R_LoadTexture8("no_texture", 16, 16, (unsigned char*)r_notexture_mip + r_notexture_mip->offsets[0], IF_NOALPHA|IF_NOGAMMA, 0); missing_texture_gloss = R_LoadTexture("no_texture_gloss", 4, 4, TF_RGBA32, (unsigned char*)nogloss, IF_NOGAMMA); + missing_texture_normal = R_LoadTexture("no_texture_normal", 4, 4, TF_RGBA32, (unsigned char*)nonorm, IF_NOGAMMA); translate_texture = r_nulltex; ch_int_texture = r_nulltex; diff --git a/engine/client/r_d3.c b/engine/client/r_d3.c index 4599ce7b4..2bd406798 100644 --- a/engine/client/r_d3.c +++ b/engine/client/r_d3.c @@ -5,7 +5,7 @@ #include "shader.h" #endif -void RMod_SetParent (mnode_t *node, mnode_t *parent); +void Mod_SetParent (mnode_t *node, mnode_t *parent); int D3_LeafnumForPoint (struct model_s *model, vec3_t point); #ifndef SERVERONLY @@ -61,8 +61,8 @@ qboolean Mod_LoadMap_Proc(model_t *model, char *data) numsurfs = atoi(token); if (numsurfs < 0 || numsurfs > 10000) return false; - b = Hunk_Alloc(sizeof(*b) * numsurfs); - m = Hunk_Alloc(sizeof(*m) * numsurfs); + b = ZG_Malloc(&model->memgroup, sizeof(*b) * numsurfs); + m = ZG_Malloc(&model->memgroup, sizeof(*m) * numsurfs); sub->numsurfaces = numsurfs; sub->batches[0] = b; @@ -104,7 +104,7 @@ qboolean Mod_LoadMap_Proc(model_t *model, char *data) m[surf].numvertexes = numverts; m[surf].numindexes = numindicies; - vdata = Hunk_Alloc(numverts * (sizeof(vecV_t) + sizeof(vec2_t) + sizeof(vec3_t) + sizeof(vec4_t)) + numindicies * sizeof(index_t)); + vdata = ZG_Malloc(&model->memgroup, numverts * (sizeof(vecV_t) + sizeof(vec2_t) + sizeof(vec3_t) + sizeof(vec4_t)) + numindicies * sizeof(index_t)); m[surf].colors4f_array = (vec4_t*)vdata;vdata += sizeof(vec4_t)*numverts; m[surf].xyz_array = (vecV_t*)vdata;vdata += sizeof(vecV_t)*numverts; @@ -239,8 +239,8 @@ qboolean Mod_LoadMap_Proc(model_t *model, char *data) data = COM_ParseOut(data, token, sizeof(token)); numnodes = atoi(token); - model->nodes = Hunk_Alloc(sizeof(*model->nodes)*numnodes); - model->planes = Hunk_Alloc(sizeof(*model->planes)*numnodes); + model->nodes = ZG_Malloc(&model->memgroup, sizeof(*model->nodes)*numnodes); + model->planes = ZG_Malloc(&model->memgroup, sizeof(*model->planes)*numnodes); for (n = 0; n < numnodes; n++) { @@ -273,7 +273,7 @@ qboolean Mod_LoadMap_Proc(model_t *model, char *data) if (strcmp(token, "}")) return false; - RMod_SetParent(model->nodes, NULL); + Mod_SetParent(model->nodes, NULL); } else if (!strcmp(token, "interAreaPortals")) { @@ -290,7 +290,7 @@ qboolean Mod_LoadMap_Proc(model_t *model, char *data) data = COM_ParseOut(data, token, sizeof(token)); model->numportals = atoi(token); - model->portal = p = Hunk_Alloc(sizeof(*p) * model->numportals); + model->portal = p = ZG_Malloc(&model->memgroup, sizeof(*p) * model->numportals); for (pno = 0; pno < model->numportals; pno++, p++) { @@ -301,7 +301,7 @@ qboolean Mod_LoadMap_Proc(model_t *model, char *data) data = COM_ParseOut(data, token, sizeof(token)); p->area[1] = atoi(token); - p->points = Hunk_Alloc(sizeof(*p->points) * p->numpoints); + p->points = ZG_Malloc(&model->memgroup, sizeof(*p->points) * p->numpoints); ClearBounds(p->min, p->max); for (v = 0; v < p->numpoints; v++) @@ -1074,7 +1074,7 @@ qboolean D3_LoadMap_CollisionMap(model_t *mod, char *buf) ensurenewtoken("}"); ensurenewtoken("nodes"); ensurenewtoken("{"); - cmod->cnodes = Hunk_Alloc(sizeof(cm_node_t)); + cmod->cnodes = ZG_Malloc(&mod->memgroup, sizeof(cm_node_t)); for (;;) { buf = COM_ParseOut(buf, token, sizeof(token)); @@ -1110,7 +1110,7 @@ qboolean D3_LoadMap_CollisionMap(model_t *mod, char *buf) break; numpedges = atoi(token); - surf = Hunk_Alloc(sizeof(*surf) + sizeof(vec4_t)*numpedges); + surf = ZG_Malloc(&mod->memgroup, sizeof(*surf) + sizeof(vec4_t)*numpedges); surf->numedges = numpedges; surf->edge = (vec4_t*)(surf+1); @@ -1225,7 +1225,7 @@ qboolean D3_LoadMap_CollisionMap(model_t *mod, char *buf) if (!strcmp(token, "}")) break; j = atoi(token); - brush = Hunk_Alloc(j*sizeof(vec4_t) + sizeof(*brush)); + brush = ZG_Malloc(&mod->memgroup, j*sizeof(vec4_t) + sizeof(*brush)); brush->numplanes = j; brush->plane = (vec4_t*)(brush+1); ensurenewtoken("{"); diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index 9d4078443..38a438a24 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -1937,9 +1937,9 @@ void Surf_SetupFrame(void) r_oldviewcluster = r_viewcluster; r_oldviewcluster2 = r_viewcluster2; if (r_refdef.recurse) - leaf = RMod_PointInLeaf (cl.worldmodel, r_refdef.pvsorigin); + leaf = Mod_PointInLeaf (cl.worldmodel, r_refdef.pvsorigin); else - leaf = RMod_PointInLeaf (cl.worldmodel, r_origin); + leaf = Mod_PointInLeaf (cl.worldmodel, r_origin); r_viewcluster = r_viewcluster2 = leaf->cluster; r_viewcontents = leaf->contents & (FTECONTENTS_LAVA|FTECONTENTS_SLIME|FTECONTENTS_WATER); @@ -1951,7 +1951,7 @@ void Surf_SetupFrame(void) VectorCopy (r_origin, temp); temp[2] -= 16; - leaf = RMod_PointInLeaf (cl.worldmodel, temp); + leaf = Mod_PointInLeaf (cl.worldmodel, temp); if ( !(leaf->contents & Q2CONTENTS_SOLID) && (leaf->cluster != r_viewcluster2) ) r_viewcluster2 = leaf->cluster; @@ -1962,7 +1962,7 @@ void Surf_SetupFrame(void) VectorCopy (r_origin, temp); temp[2] += 16; - leaf = RMod_PointInLeaf (cl.worldmodel, temp); + leaf = Mod_PointInLeaf (cl.worldmodel, temp); if ( !(leaf->contents & Q2CONTENTS_SOLID) && (leaf->cluster != r_viewcluster2) ) r_viewcluster2 = leaf->cluster; @@ -1985,7 +1985,7 @@ void Surf_SetupFrame(void) VectorCopy(r_origin, pvsorg); } - r_viewleaf = RMod_PointInLeaf (cl.worldmodel, pvsorg); + r_viewleaf = Mod_PointInLeaf (cl.worldmodel, pvsorg); if (!r_viewleaf) { @@ -1994,7 +1994,7 @@ void Surf_SetupFrame(void) { //look down a bit VectorCopy (pvsorg, temp); temp[2] -= 16; - leaf = RMod_PointInLeaf (cl.worldmodel, temp); + leaf = Mod_PointInLeaf (cl.worldmodel, temp); if (leaf->contents <= Q1CONTENTS_WATER && leaf->contents >= Q1CONTENTS_LAVA) r_viewleaf2 = leaf; else @@ -2005,7 +2005,7 @@ void Surf_SetupFrame(void) VectorCopy (pvsorg, temp); temp[2] += 16; - leaf = RMod_PointInLeaf (cl.worldmodel, temp); + leaf = Mod_PointInLeaf (cl.worldmodel, temp); if (leaf->contents == Q1CONTENTS_EMPTY) r_viewleaf2 = leaf; else diff --git a/engine/client/render.h b/engine/client/render.h index 342ca9a8a..76763cb58 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -335,30 +335,27 @@ extern texid_t balltexture; extern texid_t beamtexture; extern texid_t ptritexture; -#if defined(GLQUAKE) || defined(D3DQUAKE) - -void RMod_Init (void); -void RMod_Shutdown (void); +void Mod_Init (void); +void Mod_Shutdown (void); int Mod_TagNumForName(struct model_s *model, char *name); int Mod_SkinNumForName(struct model_s *model, char *name); int Mod_FrameNumForName(struct model_s *model, char *name); -float Mod_FrameDuration(struct model_s *model, int frameno); +float Mod_GetFrameDuration(struct model_s *model, int frameno); -void RMod_ResortShaders(void); -void RMod_ClearAll (void); -struct model_s *RMod_ForName (char *name, qboolean crash); -struct model_s *RMod_FindName (char *name); -void *RMod_Extradata (struct model_s *mod); // handles caching -void RMod_TouchModel (char *name); +void Mod_ResortShaders(void); +void Mod_ClearAll (void); +struct model_s *Mod_ForName (char *name, qboolean crash); +struct model_s *Mod_FindName (char *name); +void *Mod_Extradata (struct model_s *mod); // handles caching +void Mod_TouchModel (char *name); void Mod_RebuildLightmaps (void); -struct mleaf_s *RMod_PointInLeaf (struct model_s *model, float *p); +struct mleaf_s *Mod_PointInLeaf (struct model_s *model, float *p); -void RMod_Think (void); -void RMod_NowLoadExternal(void); +void Mod_Think (void); +void Mod_NowLoadExternal(void); void GLR_LoadSkys (void); void R_BloomRegister(void); -#endif #ifdef RUNTIMELIGHTING void LightFace (int surfnum); diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 7f0eb65da..f6b39a08d 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -757,8 +757,6 @@ void Renderer_Start(void) void (*Draw_Init) (void); void (*Draw_Shutdown) (void); -//void (*Draw_TinyCharacter) (int x, int y, unsigned int num); - void (*R_Init) (void); void (*R_DeInit) (void); void (*R_RenderView) (void); // must set r_refdef first @@ -766,25 +764,6 @@ void (*R_RenderView) (void); // must set r_refdef first void (*R_NewMap) (void); void (*R_PreNewMap) (void); -void (*R_AddStain) (vec3_t org, float red, float green, float blue, float radius); -void (*R_LessenStains) (void); - -void (*Mod_Init) (void); -void (*Mod_Shutdown) (void); -void (*Mod_ClearAll) (void); -struct model_s *(*Mod_ForName) (char *name, qboolean crash); -struct model_s *(*Mod_FindName) (char *name); -void *(*Mod_Extradata) (struct model_s *mod); // handles caching -void (*Mod_TouchModel) (char *name); - -void (*Mod_NowLoadExternal) (void); -void (*Mod_Think) (void); -//qboolean (*Mod_GetTag) (struct model_s *model, int tagnum, int frame, int frame2, float f2ness, float f1time, float f2time, float *transforms); -//int (*Mod_TagNumForName) (struct model_s *model, char *name); -int (*Mod_SkinForName) (struct model_s *model, char *name); -int (*Mod_FrameForName) (struct model_s *model, char *name); -float (*Mod_GetFrameDuration) (struct model_s *model, int framenum); - qboolean (*VID_Init) (rendererstate_t *info, unsigned char *palette); void (*VID_DeInit) (void); char *(*VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight); @@ -827,32 +806,6 @@ rendererinfo_t dedicatedrendererinfo = { NULL, //R_NewMap; NULL, //R_PreNewMap - - NULL, //R_AddStain; - NULL, //R_LessenStains; - -#if defined(GLQUAKE) || defined(D3DQUAKE) - RMod_Init, - RMod_Shutdown, - RMod_ClearAll, - RMod_ForName, - RMod_FindName, - RMod_Extradata, - RMod_TouchModel, - - RMod_NowLoadExternal, - RMod_Think, - - NULL, //Mod_GetTag - NULL, //fixme: server will need this one at some point. - NULL, - NULL, - Mod_FrameDuration, - -#else -#error "Need logic here!" -#endif - NULL, //VID_Init, NULL, //VID_DeInit, NULL, //VID_ApplyGammaRamps, @@ -936,31 +889,11 @@ void R_SetRenderer(rendererinfo_t *ri) R_NewMap = ri->R_NewMap; R_PreNewMap = ri->R_PreNewMap; - R_AddStain = ri->R_AddStain; - R_LessenStains = ri->R_LessenStains; - VID_Init = ri->VID_Init; VID_DeInit = ri->VID_DeInit; VID_GetRGBInfo = ri->VID_GetRGBInfo; VID_SetWindowCaption = ri->VID_SetWindowCaption; - Mod_Init = ri->Mod_Init; - Mod_Shutdown = ri->Mod_Shutdown; - Mod_Think = ri->Mod_Think; - Mod_ClearAll = ri->Mod_ClearAll; - Mod_ForName = ri->Mod_ForName; - Mod_FindName = ri->Mod_FindName; - Mod_Extradata = ri->Mod_Extradata; - Mod_TouchModel = ri->Mod_TouchModel; - - Mod_NowLoadExternal = ri->Mod_NowLoadExternal; - -// Mod_GetTag = ri->Mod_GetTag; -// Mod_TagNumForName = ri->Mod_TagNumForName; - Mod_SkinForName = ri->Mod_SkinForName; - Mod_FrameForName = ri->Mod_FrameForName; - Mod_GetFrameDuration = ri->Mod_GetFrameDuration; - SCR_UpdateScreen = ri->SCR_UpdateScreen; } @@ -993,8 +926,7 @@ void R_ShutdownRenderer(void) CL_AllowIndependantSendCmd(false); //FIXME: figure out exactly which parts are going to affect the model loading. P_Shutdown(); - if (Mod_Shutdown) - Mod_Shutdown(); + Mod_Shutdown(); IN_Shutdown(); @@ -1073,12 +1005,9 @@ qboolean R_ApplyRenderer_Load (rendererstate_t *newr) { int i, j; extern model_t *loadmodel; - extern int host_hunklevel; Cache_Flush(); - Hunk_FreeToLowMark(host_hunklevel); //is this a good idea? - TRACE(("dbg: R_ApplyRenderer: old renderer closed\n")); pmove.numphysent = 0; @@ -1702,7 +1631,7 @@ mspriteframe_t *R_GetSpriteFrame (entity_t *currententity) int i, numframes, frame; float *pintervals, fullinterval, targettime, time; - psprite = currententity->model->cache.data; + psprite = currententity->model->meshinfo; frame = currententity->framestate.g[FS_REG].frame[0]; if ((frame >= psprite->numframes) || (frame < 0)) diff --git a/engine/client/screen.h b/engine/client/screen.h index 7e522aeb2..1dae474b1 100644 --- a/engine/client/screen.h +++ b/engine/client/screen.h @@ -56,7 +56,6 @@ void RSpeedShow(void); void SCR_CrosshairPosition(playerview_t *pview, int *x, int *y); void SCR_DrawLoading (void); -void SCR_CalcRefdef (void); void SCR_TileClear (void); void SCR_DrawNotifyString (void); void SCR_CheckDrawCenterString (void); diff --git a/engine/client/skin.c b/engine/client/skin.c index 0cb4f3528..7190f1e9f 100644 --- a/engine/client/skin.c +++ b/engine/client/skin.c @@ -228,7 +228,7 @@ qbyte *Skin_Cache8 (skin_t *skin) TEXASSIGN(skin->textures.loweroverlay, r_nulltex); TEXASSIGN(skin->textures.upperoverlay, r_nulltex); - out = Cache_Check (&skin->cache); + out = skin->skindata; if (out) return out; @@ -257,7 +257,7 @@ qbyte *Skin_Cache8 (skin_t *skin) skin->width = 320; skin->height = 200; - out = Cache_Alloc (&skin->cache, 320*200, skin->name); + skin->skindata = out = BZ_Malloc(320*200); memset (out, bv, 320*200); @@ -368,7 +368,7 @@ qbyte *Skin_Cache8 (skin_t *skin) skin->width = srcw; skin->height = srch; - out = Cache_Alloc (&skin->cache, skin->width*skin->height, skin->name); + skin->skindata = out = BZ_Malloc(skin->width*skin->height); if (!out) Sys_Error ("Skin_Cache: couldn't allocate"); @@ -382,7 +382,8 @@ qbyte *Skin_Cache8 (skin_t *skin) { if (raw - (qbyte*)pcx > com_filesize) { - Cache_Free (&skin->cache); + BZ_Free(skin->skindata); + skin->skindata = NULL; skin->failedload = true; Con_Printf ("Skin %s was malformed. You should delete it.\n", name); return NULL; @@ -394,7 +395,8 @@ qbyte *Skin_Cache8 (skin_t *skin) runLength = dataByte & 0x3F; if (raw - (qbyte*)pcx > com_filesize) { - Cache_Free (&skin->cache); + BZ_Free(skin->skindata); + skin->skindata = NULL; skin->failedload = true; Con_Printf ("Skin %s was malformed. You should delete it.\n", name); return NULL; @@ -406,7 +408,8 @@ qbyte *Skin_Cache8 (skin_t *skin) // skin sanity check if (runLength + x > pcx->xmax + 2) { - Cache_Free (&skin->cache); + BZ_Free(skin->skindata); + skin->skindata = NULL; skin->failedload = true; Con_Printf ("Skin %s was malformed. You should delete it.\n", name); return NULL; @@ -431,7 +434,8 @@ qbyte *Skin_Cache8 (skin_t *skin) if ( raw - (qbyte *)pcx > com_filesize) { - Cache_Free (&skin->cache); + BZ_Free(skin->skindata); + skin->skindata = NULL; skin->failedload = true; Con_Printf ("Skin %s was malformed. You should delete it.\n", name); return NULL; @@ -456,7 +460,7 @@ qbyte *Skin_Cache32 (skin_t *skin) if (skin->failedload) return NULL; - out = Cache_Check (&skin->cache); + out = skin->skindata; if (out) return out; @@ -475,7 +479,7 @@ qbyte *Skin_Cache32 (skin_t *skin) pix = ReadTargaFile(raw, com_filesize, &skin->width, &skin->height, &hasalpha, false); if (pix) { - out = Cache_Alloc(&skin->cache, skin->width*skin->height*4, name); + skin->skindata = out = BZ_Malloc(skin->width*skin->height*4); memcpy(out, pix, skin->width*skin->height*4); BZ_Free(pix); return out; @@ -488,7 +492,7 @@ qbyte *Skin_Cache32 (skin_t *skin) pix = ReadPCXFile(raw, com_filesize, &skin->width, &skin->height); if (pix) { - out = Cache_Alloc(&skin->cache, skin->width*skin->height*4, name); + skin->skindata = out = BZ_Malloc(skin->width*skin->height*4); memcpy(out, pix, skin->width*skin->height*4); BZ_Free(pix); return out; @@ -502,7 +506,7 @@ qbyte *Skin_Cache32 (skin_t *skin) pix = ReadPNGFile(raw, com_filesize, &skin->width, &skin->height, name); if (pix) { - out = Cache_Alloc(&skin->cache, skin->width*skin->height*4, name); + skin->skindata = out = BZ_Malloc(skin->width*skin->height*4); memcpy(out, pix, skin->width*skin->height*4); BZ_Free(pix); return out; @@ -517,7 +521,7 @@ qbyte *Skin_Cache32 (skin_t *skin) pix = ReadJPEGFile(raw, com_filesize, &skin->width, &skin->height); if (pix) { - out = Cache_Alloc(&skin->cache, skin->width*skin->height*4, name); + skin->skindata = out = BZ_Malloc(skin->width*skin->height*4); memcpy(out, pix, skin->width*skin->height*4); BZ_Free(pix); return out; @@ -530,7 +534,7 @@ qbyte *Skin_Cache32 (skin_t *skin) pix = ReadJPEGFile(raw, com_filesize, &skin->width, &skin->height); if (pix) { - out = Cache_Alloc(&skin->cache, skin->width*skin->height*4, name); + skin->skindata = out = BZ_Malloc(skin->width*skin->height*4); memcpy(out, pix, skin->width*skin->height*4); BZ_Free(pix); return out; @@ -629,8 +633,8 @@ void Skin_FlushAll(void) int i; for (i=0 ; iGetStringUTFChars(env, japkpath, NULL); - strcpy(basepack, tmp); + Q_strncpyz(sys_basepak, tmp, sizeof(sys_basedir)); (*env)->ReleaseStringUTFChars(env, japkpath, tmp); - parms.membase += strlen(basepack)+1; - parms.memsize -= strlen(basepack)+1; - parms.basedir = parms.membase; tmp = (*env)->GetStringUTFChars(env, jusrpath, NULL); - strcpy(parms.basedir, tmp); + Q_strncpyz(sys_basedir, tmp, sizeof(sys_basedir)); (*env)->ReleaseStringUTFChars(env, jusrpath, tmp); - parms.membase += strlen(parms.basedir)+1; - parms.memsize -= strlen(parms.basedir)+1; - - align = (int)parms.membase & 15; - if (align) - { - align = 16-align; - parms.membase += align; - parms.memsize -= align; - } - - args[2] = basepack; Sys_Printf("Starting up (apk=%s, usr=%s)\n", args[2], parms.basedir); diff --git a/engine/client/sys_linux.c b/engine/client/sys_linux.c index f35d68316..ce6b4b67c 100644 --- a/engine/client/sys_linux.c +++ b/engine/client/sys_linux.c @@ -697,14 +697,6 @@ int main (int c, const char **v) } #endif - parms.memsize = 64*1024*1024; - - j = COM_CheckParm("-mem"); - if (j && j+1 < com_argc) - parms.memsize = (int) (Q_atof(com_argv[j+1]) * 1024 * 1024); - - parms.membase = malloc (parms.memsize); - parms.basedir = basedir; #ifdef __linux__ //attempt to figure out where the exe is located diff --git a/engine/client/sys_morphos.c b/engine/client/sys_morphos.c index 44ecb5964..adedd9993 100755 --- a/engine/client/sys_morphos.c +++ b/engine/client/sys_morphos.c @@ -345,19 +345,9 @@ int main(int argc, char **argv) COM_InitArgv(argc, argv); TL_InitLanguages(); - i = COM_CheckParm("-mem"); - if (i && i < com_argc) - parms.memsize = atoi(com_argv[i+1])*1024*1024; - else - parms.memsize = 16*1024*1024; - parms.basedir = ""; parms.argc = argc; parms.argv = argv; - parms.membase = malloc(parms.memsize); - - if (parms.membase == 0) - Sys_Error("Can't allocated %d bytes\n", parms.memsize); DynLoadBase = OpenLibrary("dynload.library", 0); diff --git a/engine/client/sys_sdl.c b/engine/client/sys_sdl.c index 6346d48f4..04c9a7e27 100644 --- a/engine/client/sys_sdl.c +++ b/engine/client/sys_sdl.c @@ -475,34 +475,6 @@ int QDECL main(int argc, char **argv) TL_InitLanguages(); - parms.memsize = 0x2000000; - - if (parms.memsize < 0x0800000) - parms.memsize = 0x0800000; - - - if (COM_CheckParm ("-heapsize")) - { - t = COM_CheckParm("-heapsize") + 1; - - if (t < com_argc) - parms.memsize = Q_atoi (com_argv[t]) * 1024; - } - else if (COM_CheckParm ("-mem")) - { - t = COM_CheckParm("-mem") + 1; - - if (t < com_argc) - parms.memsize = Q_atoi (com_argv[t]) * 1024*1024; - } - - -#ifdef _WIN32 - parms.membase = VirtualAlloc (NULL, parms.memsize, MEM_RESERVE, PAGE_NOACCESS); -#else - parms.membase = malloc (parms.memsize); -#endif - Sys_Printf ("Host_Init\n"); Host_Init (&parms); diff --git a/engine/client/sys_win.c b/engine/client/sys_win.c index c09f13d23..0db3280aa 100644 --- a/engine/client/sys_win.c +++ b/engine/client/sys_win.c @@ -780,12 +780,6 @@ void Sys_Init (void) void Sys_Shutdown(void) { - if (host_parms.membase) - { - VirtualFree(host_parms.membase, 0, MEM_RELEASE); - host_parms.membase = 0; - } - if (tevent) CloseHandle (tevent); tevent = NULL; @@ -1415,45 +1409,6 @@ void SleepUntilInput (int time) qboolean Sys_Startup_CheckMem(quakeparms_t *parms) { - int t; - MEMORYSTATUS lpBuffer; - lpBuffer.dwLength = sizeof(MEMORYSTATUS); - GlobalMemoryStatus (&lpBuffer); - -// take the greater of all the available memory or half the total memory, -// but at least 8 Mb and no more than 16 Mb, unless they explicitly -// request otherwise - parms->memsize = lpBuffer.dwAvailPhys; - - if (parms->memsize < MINIMUM_WIN_MEMORY) - parms->memsize = MINIMUM_WIN_MEMORY; - - if (parms->memsize < (lpBuffer.dwTotalPhys >> 1)) - parms->memsize = lpBuffer.dwTotalPhys >> 1; - - if (parms->memsize > MAXIMUM_WIN_MEMORY) - parms->memsize = MAXIMUM_WIN_MEMORY; - - if (COM_CheckParm ("-heapsize")) - { - t = COM_CheckParm("-heapsize") + 1; - - if (t < com_argc) - parms->memsize = Q_atoi (com_argv[t]) * 1024; - } - else if (COM_CheckParm ("-mem")) - { - t = COM_CheckParm("-mem") + 1; - - if (t < com_argc) - parms->memsize = Q_atoi (com_argv[t]) * 1024*1024; - } - - parms->membase = VirtualAlloc (NULL, parms->memsize, MEM_RESERVE, PAGE_NOACCESS); -// parms->membase = malloc (parms.memsize); - - if (!parms->membase) - return false; return true; } diff --git a/engine/client/view.c b/engine/client/view.c index 51cd0e614..455d537fc 100644 --- a/engine/client/view.c +++ b/engine/client/view.c @@ -1646,7 +1646,7 @@ void V_RenderView (void) { int viewnum; - R_LessenStains(); + Surf_LessenStains(); if (cls.state != ca_active) return; diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index 44c731f87..521079c9a 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -547,14 +547,11 @@ static float Alias_CalculateSkeletalNormals(galiasinfo_t *model) while (model) { int numbones = model->numbones; - galisskeletaltransforms_t *v = (galisskeletaltransforms_t*)((char*)model+model->ofsswtransforms); + galisskeletaltransforms_t *v = model->ofsswtransforms; int numweights = model->numswtransforms; int numverts = model->numverts; - if (model->nextsurf) - next = (galiasinfo_t*)((char*)model + model->nextsurf); - else - next = NULL; + next = model->nextsurf; xyz = Z_Malloc(numverts*sizeof(vecV_t)); normals = Z_Malloc(numverts*sizeof(vec3_t)); @@ -564,18 +561,19 @@ static float Alias_CalculateSkeletalNormals(galiasinfo_t *model) if (bcmodnum != model->shares_bones) { galiasgroup_t *g; - galiasbone_t *bones = (galiasbone_t *)((char*)model + model->ofsbones); + galiasbone_t *bones = model->ofsbones; bcmodnum = model->shares_bones; if (model->baseframeofs) - bonepose = (float*)((char*)model + model->baseframeofs); + bonepose = model->baseframeofs; else { + //figure out the pose from frame0pose0 if (!model->groups) return 0; - g = (galiasgroup_t*)((char*)model+model->groupofs); + g = model->groupofs; if (g->numposes < 1) return 0; - bonepose = (float*)((char*)g+g->poseofs); + bonepose = g->boneofs; if (g->isheirachical) { /*needs to be an absolute skeleton*/ @@ -647,7 +645,7 @@ static float Alias_CalculateSkeletalNormals(galiasinfo_t *model) //use that base pose to calculate the normals memset(normals, 0, numverts*sizeof(vec3_t)); vcmodnum = modnum; - idx = (index_t*)((char*)model + model->ofs_indexes); + idx = model->ofs_indexes; //calculate the triangle normal and accumulate them for (i = 0; i < model->numindexes; i+=3, idx+=3) @@ -680,10 +678,7 @@ static float Alias_CalculateSkeletalNormals(galiasinfo_t *model) { modnum++; model = next; - if (model->nextsurf) - next = (galiasinfo_t*)((char*)model + model->nextsurf); - else - next = NULL; + next = model->nextsurf; } else break; @@ -703,7 +698,7 @@ static float Alias_CalculateSkeletalNormals(galiasinfo_t *model) } if (model->ofs_skel_norm) - memcpy((char*)model + model->ofs_skel_norm, normals, numverts*sizeof(vec3_t)); + memcpy(model->ofs_skel_norm, normals, numverts*sizeof(vec3_t)); //FIXME: save off the xyz+normals for this base pose as an optimisation for world objects. Z_Free(inversepose); @@ -749,10 +744,10 @@ static int Alias_BuildLerps(float plerp[4], float *pose[4], int numbones, galias mlerp = 0; plerp[l] = (1-mlerp)*(1-lerpfrac); if (plerp[l]>0) - pose[l++] = (float *)((char *)g1 + g1->poseofs + sizeof(float)*numbones*12*frame1); + pose[l++] = g1->boneofs + numbones*12*frame1; plerp[l] = (mlerp)*(1-lerpfrac); if (plerp[l]>0) - pose[l++] = (float *)((char *)g1 + g1->poseofs + sizeof(float)*numbones*12*frame2); + pose[l++] = g1->boneofs + numbones*12*frame2; if (lerpfrac) { @@ -776,10 +771,10 @@ static int Alias_BuildLerps(float plerp[4], float *pose[4], int numbones, galias mlerp = 0; plerp[l] = (1-mlerp)*(lerpfrac); if (plerp[l]>0) - pose[l++] = (float *)((char *)g2 + g2->poseofs + sizeof(float)*numbones*12*frame1); + pose[l++] = g2->boneofs + numbones*12*frame1; plerp[l] = (mlerp)*(lerpfrac); if (plerp[l]>0) - pose[l++] = (float *)((char *)g2 + g2->poseofs + sizeof(float)*numbones*12*frame2); + pose[l++] = g2->boneofs + numbones*12*frame2; } return l; @@ -858,8 +853,8 @@ int Alias_GetBoneRelations(galiasinfo_t *inf, framestate_t *fstate, float *resul } //the higher level merges old/new anims, but we still need to blend between automated frame-groups. - g1 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*frame1); - g2 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*frame2); + g1 = &inf->groupofs[frame1]; + g2 = &inf->groupofs[frame2]; if (!g1->isheirachical) return 0; @@ -905,7 +900,7 @@ float *Alias_GetBonePositions(galiasinfo_t *inf, framestate_t *fstate, float *bu #ifdef SKELETALMODELS float relationsbuf[MAX_BONES][12]; float *relations = NULL; - galiasbone_t *bones = (galiasbone_t *)((char*)inf+inf->ofsbones); + galiasbone_t *bones = inf->ofsbones; int numbones; if (buffersize < inf->numbones) @@ -988,12 +983,12 @@ float *Alias_GetBonePositions(galiasinfo_t *inf, framestate_t *fstate, float *bu f = fstate->g[FS_REG].frame[0]; if (f < 0 || f >= inf->groups) f = 0; - g1 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*bound(0, f, inf->groups-1)); + g1 = &inf->groupofs[bound(0, f, inf->groups-1)]; f = fstate->g[FS_REG].frame[1]; if (f < 0 || f >= inf->groups) g2 = g1; else - g2 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*bound(0, f, inf->groups-1)); + g2 = &inf->groupofs[bound(0, f, inf->groups-1)]; if (g2->isheirachical) g2 = g1; @@ -1274,17 +1269,17 @@ static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float vec3_t *p1s, *p2s; vec3_t *p1t, *p2t; - p1v = (vecV_t *)((char *)p1 + p1->ofsverts); - p2v = (vecV_t *)((char *)p2 + p2->ofsverts); + p1v = p1->ofsverts; + p2v = p2->ofsverts; - p1n = (vec3_t *)((char *)p1 + p1->ofsnormals); - p2n = (vec3_t *)((char *)p2 + p2->ofsnormals); + p1n = p1->ofsnormals; + p2n = p2->ofsnormals; - p1s = (vec3_t *)((char *)p1 + p1->ofssvector); - p2s = (vec3_t *)((char *)p2 + p2->ofssvector); + p1s = p1->ofssvector; + p2s = p2->ofssvector; - p1t = (vec3_t *)((char *)p1 + p1->ofstvector); - p2t = (vec3_t *)((char *)p2 + p2->ofstvector); + p1t = p1->ofstvector; + p2t = p2->ofstvector; mesh->snormals_array = blerp>0.5?p2s:p1s; //never lerp mesh->tnormals_array = blerp>0.5?p2t:p1t; //never lerp @@ -1338,19 +1333,19 @@ static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float #ifndef SERVERONLY static void Alias_BuildSkeletalMesh(mesh_t *mesh, float *bonepose, galiasinfo_t *inf) { - galisskeletaltransforms_t *weights = (galisskeletaltransforms_t *)((char*)inf+inf->ofsswtransforms); + galisskeletaltransforms_t *weights = inf->ofsswtransforms; int numweights = inf->numswtransforms; if (inf->ofs_skel_idx) { float *fte_restrict xyzout = mesh->xyz_array[0]; float *fte_restrict normout = mesh->normals_array[0]; - qbyte *fte_restrict bidx = (qbyte*)((char*)inf + inf->ofs_skel_idx); - float *fte_restrict xyzin = (float*)((char*)inf + inf->ofs_skel_xyz); - float *fte_restrict normin = (float*)((char*)inf + inf->ofs_skel_norm); -// float *fte_restrict svect = (float*)((char*)inf + inf->ofs_skel_svect); -// float *fte_restrict tvect = (float*)((char*)inf + inf->ofs_skel_tvect); - float *fte_restrict weight = (float*)((char*)inf + inf->ofs_skel_weight); + qbyte *fte_restrict bidx = inf->ofs_skel_idx[0]; + float *fte_restrict xyzin = inf->ofs_skel_xyz[0]; + float *fte_restrict normin = inf->ofs_skel_norm[0]; +// float *fte_restrict svect = inf->ofs_skel_svect[0]; +// float *fte_restrict tvect = inf->ofs_skel_tvect[0]; + float *fte_restrict weight = inf->ofs_skel_weight[0]; Alias_TransformVerticies_VN(bonepose, inf->numverts, bidx, weight, xyzin, xyzout, normin, normout); // Alias_TransformVerticies_3(bonepose, inf->numverts, bidx, weight, svect, mesh->snormals_array[0]); @@ -1491,11 +1486,11 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in } mesh->numvertexes = inf->numverts; - mesh->indexes = (index_t*)((char *)inf + inf->ofs_indexes); + mesh->indexes = inf->ofs_indexes; mesh->numindexes = inf->numindexes; - mesh->st_array = (vec2_t*)((char *)inf + inf->ofs_st_array); - mesh->trneighbors = (int *)((char *)inf + inf->ofs_trineighbours); + mesh->st_array = inf->ofs_st_array; + mesh->trneighbors = inf->ofs_trineighbours; mesh->colors4f_array = meshcache.colours; if (meshcache.surfnum == inf->shares_verts && meshcache.ent == e) @@ -1511,8 +1506,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in #ifdef SKELETALMODELS if (meshcache.usebonepose) { - mesh->bonenums = (byte_vec4_t*)((char*)inf + inf->ofs_skel_idx); - mesh->boneweights = (vec4_t*)((char*)inf + inf->ofs_skel_weight); + mesh->bonenums = inf->ofs_skel_idx; + mesh->boneweights = inf->ofs_skel_weight; mesh->bones = meshcache.usebonepose; mesh->numbones = inf->numbones; } @@ -1524,8 +1519,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in #ifndef SERVERONLY - mesh->st_array = (vec2_t*)((char *)inf + inf->ofs_st_array); - mesh->trneighbors = (int *)((char *)inf + inf->ofs_trineighbours); + mesh->st_array = inf->ofs_st_array; + mesh->trneighbors = inf->ofs_trineighbours; mesh->normals_array = meshcache.norm; mesh->snormals_array = meshcache.norm+meshcache.numnorm; mesh->tnormals_array = meshcache.norm+meshcache.numnorm*2; @@ -1544,11 +1539,11 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in { //if we have skeletal xyz info, but no skeletal weights, then its a partial model that cannot possibly be animated. meshcache.usebonepose = NULL; - mesh->xyz_array = (vecV_t*)((char*)inf + inf->ofs_skel_xyz); + mesh->xyz_array = inf->ofs_skel_xyz; mesh->xyz2_array = NULL; - mesh->normals_array = (vec3_t*)((char*)inf + inf->ofs_skel_norm); - mesh->snormals_array = (vec3_t*)((char*)inf + inf->ofs_skel_svect); - mesh->tnormals_array = (vec3_t*)((char*)inf + inf->ofs_skel_tvect); + mesh->normals_array = inf->ofs_skel_norm; + mesh->snormals_array = inf->ofs_skel_svect; + mesh->tnormals_array = inf->ofs_skel_tvect; if (vbop) { @@ -1594,7 +1589,7 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in #ifdef GLQUAKE if (!inf->numswtransforms && qrenderer == QR_OPENGL) { - Alias_GLDrawSkeletalBones((galiasbone_t*)((char*)inf + inf->ofsbones), (float *)meshcache.usebonepose, inf->numbones); + Alias_GLDrawSkeletalBones(inf->ofsbones, (float *)meshcache.usebonepose, inf->numbones); } #endif meshcache.usebonepose = NULL; @@ -1602,10 +1597,10 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in else { //hardware bone animation - mesh->xyz_array = (vecV_t*)((char*)inf + inf->ofs_skel_xyz); - mesh->normals_array = (vec3_t*)((char*)inf + inf->ofs_skel_norm); - mesh->snormals_array = (vec3_t*)((char*)inf + inf->ofs_skel_svect); - mesh->tnormals_array = (vec3_t*)((char*)inf + inf->ofs_skel_tvect); + mesh->xyz_array = inf->ofs_skel_xyz; + mesh->normals_array = inf->ofs_skel_norm; + mesh->snormals_array = inf->ofs_skel_svect; + mesh->tnormals_array = inf->ofs_skel_tvect; } } else @@ -1643,8 +1638,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in else if (lerp >= 1) frame1 = frame2; - g1 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*frame1); - g2 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*frame2); + g1 = &inf->groupofs[frame1]; + g2 = &inf->groupofs[frame2]; if (g1 == g2) //lerping within group is only done if not changing group { @@ -1678,18 +1673,16 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in mesh->xyz2_array = NULL; mesh->xyz_blendw[0] = 1; mesh->xyz_blendw[1] = 0; - R_LerpFrames(mesh, (galiaspose_t *)((char *)g1 + g1->poseofs + sizeof(galiaspose_t)*frame1), - (galiaspose_t *)((char *)g2 + g2->poseofs + sizeof(galiaspose_t)*frame2), - 1-lerp, e->fatness); + R_LerpFrames(mesh, &g1->poseofs[frame1], &g2->poseofs[frame2], 1-lerp, e->fatness); } else { - galiaspose_t *p1 = (galiaspose_t *)((char *)g1 + g1->poseofs + sizeof(galiaspose_t)*frame1); - galiaspose_t *p2 = (galiaspose_t *)((char *)g2 + g2->poseofs + sizeof(galiaspose_t)*frame2); + galiaspose_t *p1 = &g1->poseofs[frame1]; + galiaspose_t *p2 = &g2->poseofs[frame2]; - mesh->normals_array = (vec3_t *)((char *)p1 + p1->ofsnormals); - mesh->snormals_array = (vec3_t *)((char *)p1 + p1->ofssvector); - mesh->tnormals_array = (vec3_t *)((char *)p1 + p1->ofstvector); + mesh->normals_array = p1->ofsnormals; + mesh->snormals_array = p1->ofssvector; + mesh->tnormals_array = p1->ofstvector; meshcache.vbo.indicies = inf->vboindicies; meshcache.vbo.indexcount = inf->numindexes; @@ -1703,7 +1696,7 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in { meshcache.vbo.coord = p1->vboverts; memset(&meshcache.vbo.coord2, 0, sizeof(meshcache.vbo.coord2)); - mesh->xyz_array = (vecV_t *)((char *)p1 + p1->ofsverts); + mesh->xyz_array = p1->ofsverts; mesh->xyz2_array = NULL; } else @@ -1712,8 +1705,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in meshcache.vbo.coord2 = p2->vboverts; mesh->xyz_blendw[0] = 1-lerp; mesh->xyz_blendw[1] = lerp; - mesh->xyz_array = (vecV_t *)((char *)p1 + p1->ofsverts); - mesh->xyz2_array = (vecV_t *)((char *)p2 + p2->ofsverts); + mesh->xyz_array = p1->ofsverts; + mesh->xyz2_array = p2->ofsverts; } if (vbop && meshcache.vbo.indicies.dummy) @@ -1732,8 +1725,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in #ifdef SKELETALMODELS if (meshcache.usebonepose) { - mesh->bonenums = (byte_vec4_t*)((char*)inf + inf->ofs_skel_idx); - mesh->boneweights = (vec4_t*)((char*)inf + inf->ofs_skel_weight); + mesh->bonenums = inf->ofs_skel_idx; + mesh->boneweights = inf->ofs_skel_weight; mesh->bones = meshcache.usebonepose; mesh->numbones = inf->numbones; } @@ -1782,10 +1775,10 @@ qboolean Mod_Trace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], while(mod) { - indexes = (index_t*)((char*)mod + mod->ofs_indexes); - group = (galiasgroup_t*)((char*)mod + mod->groupofs); - pose = (galiaspose_t*)((char*)&group[0] + group[0].poseofs); - posedata = (vecV_t*)((char*)pose + pose->ofsverts); + indexes = mod->ofs_indexes; + group = mod->groupofs; + pose = group[0].poseofs; + posedata = pose->ofsverts; #ifdef SKELETALMODELS if (mod->numbones && mod->shares_verts != cursurfnum) { @@ -1795,11 +1788,11 @@ qboolean Mod_Trace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], if (group->isheirachical) { if (mod->shares_bones != cursurfnum) - R_LerpBones(&frac, (float**)posedata, 1, (galiasbone_t*)((char*)mod + mod->ofsbones), mod->numbones, bonepose); - Alias_TransformVerticies_SW((float*)bonepose, (galisskeletaltransforms_t*)((char*)mod + mod->ofsswtransforms), mod->numswtransforms, posedata, NULL); + R_LerpBones(&frac, (float**)posedata, 1, mod->ofsbones, mod->numbones, bonepose); + Alias_TransformVerticies_SW((float*)bonepose, mod->ofsswtransforms, mod->numswtransforms, posedata, NULL); } else - Alias_TransformVerticies_SW((float*)posedata, (galisskeletaltransforms_t*)((char*)mod + mod->ofsswtransforms), mod->numswtransforms, posedata, NULL); + Alias_TransformVerticies_SW((float*)posedata, mod->ofsswtransforms, mod->numswtransforms, posedata, NULL); cursurfnum = mod->shares_verts; } @@ -1853,10 +1846,7 @@ qboolean Mod_Trace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], VectorCopy(normal, trace->plane.normal); } - if (mod->nextsurf) - mod = (galiasinfo_t*)((char*)mod + mod->nextsurf); - else - mod = NULL; + mod = mod->nextsurf; surfnum++; } @@ -1959,9 +1949,9 @@ void Mod_CompileTriangleNeighbours(galiasinfo_t *galias) if (r_shadow_realtime_dlight_shadows.ival || r_shadow_realtime_world_shadows.ival) { int *neighbours; - neighbours = Hunk_Alloc(sizeof(int)*galias->numindexes/3*3); - galias->ofs_trineighbours = (qbyte *)neighbours - (qbyte *)galias; - Mod_BuildTriangleNeighbours(neighbours, (index_t*)((char*)galias + galias->ofs_indexes), galias->numindexes/3); + neighbours = ZG_Malloc(&loadmodel->memgroup, sizeof(int)*galias->numindexes/3*3); + galias->ofs_trineighbours = neighbours; + Mod_BuildTriangleNeighbours(neighbours, galias->ofs_indexes, galias->numindexes/3); } #endif } @@ -2027,9 +2017,9 @@ void Mod_BuildTextureVectors(galiasinfo_t *galias) if (!BE_VBO_Begin) return; - idx = (index_t*)((char*)galias + galias->ofs_indexes); - tc = (vec2_t*)((char*)galias + galias->ofs_st_array); - group = (galiasgroup_t*)((char*)galias + galias->groupofs); + idx = galias->ofs_indexes; + tc = galias->ofs_st_array; + group = galias->groupofs; //determine the amount of space we need for our vbos. vbospace += sizeof(*tc) * galias->numverts; @@ -2042,15 +2032,15 @@ void Mod_BuildTextureVectors(galiasinfo_t *galias) for (i = 0; i < galias->groups; i++, group++) { - pose = (galiaspose_t*)((char*)group + group->poseofs); + pose = group->poseofs; for (p = 0; p < group->numposes; p++, pose++) { - vc = (vecV_t *)((char*)pose + pose->ofsverts); - nv = (vec3_t *)((char*)pose + pose->ofsnormals); + vc = pose->ofsverts; + nv = pose->ofsnormals; if (pose->ofssvector != 0 && pose->ofstvector != 0) { - sv = (vec3_t *)((char*)pose + pose->ofssvector); - tv = (vec3_t *)((char*)pose + pose->ofstvector); + sv = pose->ofssvector; + tv = pose->ofstvector; Mod_AccumulateTextureVectors(vc, tc, nv, sv, tv, idx, galias->numindexes); Mod_NormaliseTextureVectors(nv, sv, tv, galias->numverts); @@ -2100,7 +2090,7 @@ typedef struct else if (pos[off] != 255) fdc = pos[off]; \ } -void Mod_FloodFillSkin( qbyte *skin, int skinwidth, int skinheight ) +static void Mod_FloodFillSkin( qbyte *skin, int skinwidth, int skinheight ) { qbyte fillcolor = *skin; // assume this is the pixel to fill floodfill_t fifo[FLOODFILL_FIFO_SIZE]; @@ -2398,7 +2388,7 @@ static void Alias_LoadPose(vecV_t *verts, vec3_t *normals, vec3_t *svec, vec3_t static void *Alias_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremaps, int mdltype) { galiaspose_t *pose; - galiasgroup_t *frame = (galiasgroup_t*)((char *)galias + galias->groupofs); + galiasgroup_t *frame = galias->groupofs; dtrivertx_t *pinframe; daliasframe_t *frameinfo; int i, k; @@ -2424,11 +2414,11 @@ static void *Alias_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap frameinfo = (daliasframe_t*)((char *)(pframetype+1)); // qtest aliasframe is a subset pinframe = (dtrivertx_t*)((char*)frameinfo+aliasframesize); #ifndef SERVERONLY - pose = (galiaspose_t *)Hunk_Alloc(sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts); + pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts); #else pose = (galiaspose_t *)Hunk_Alloc(sizeof(galiaspose_t) + (sizeof(vecV_t))*galias->numverts); #endif - frame->poseofs = (char *)pose - (char *)frame; + frame->poseofs = pose; frame->numposes = 1; galias->groups++; @@ -2438,14 +2428,14 @@ static void *Alias_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap Q_strncpyz(frame->name, frameinfo->name, sizeof(frame->name)); verts = (vecV_t *)(pose+1); - pose->ofsverts = (char *)verts - (char *)pose; + pose->ofsverts = verts; #ifndef SERVERONLY normals = (vec3_t*)&verts[galias->numverts]; svec = &normals[galias->numverts]; tvec = &svec[galias->numverts]; - pose->ofsnormals = (char *)normals - (char *)pose; - pose->ofssvector = (char *)svec - (char *)pose; - pose->ofstvector = (char *)tvec - (char *)pose; + pose->ofsnormals = normals; + pose->ofssvector = svec; + pose->ofstvector = tvec; #endif Alias_LoadPose(verts, normals, svec, tvec, pinframe, seamremaps, mdltype); @@ -2464,14 +2454,14 @@ static void *Alias_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap pose = (galiaspose_t *)Hunk_Alloc(frame->numposes*(sizeof(galiaspose_t) + sizeof(vecV_t)*galias->numverts)); verts = (vecV_t *)(pose+frame->numposes); #else - pose = (galiaspose_t *)Hunk_Alloc(frame->numposes*(sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts)); + pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, frame->numposes*(sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts)); verts = (vecV_t *)(pose+frame->numposes); normals = (vec3_t*)&verts[galias->numverts]; svec = &normals[galias->numverts]; tvec = &svec[galias->numverts]; #endif - frame->poseofs = (char *)pose - (char *)frame; + frame->poseofs = pose; frame->loop = true; galias->groups++; @@ -2484,11 +2474,11 @@ static void *Alias_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap pinframe = (dtrivertx_t *)(intervals+frame->numposes); for (k = 0; k < frame->numposes; k++) { - pose->ofsverts = (char *)verts - (char *)pose; + pose->ofsverts = verts; #ifndef SERVERONLY - pose->ofsnormals = (char *)normals - (char *)pose; - pose->ofssvector = (char *)svec - (char *)pose; - pose->ofstvector = (char *)tvec - (char *)pose; + pose->ofsnormals = normals; + pose->ofssvector = svec; + pose->ofstvector = tvec; #endif frameinfo = (daliasframe_t*)pinframe; @@ -2566,7 +2556,7 @@ static void *Q1_LoadSkins_SV (daliasskintype_t *pskintype, qboolean alpha) static void *Q1_LoadSkins_GL (daliasskintype_t *pskintype, unsigned int skintranstype) { shader_t **shaders; - int *ofstexels; + qbyte **ofstexels; char skinname[MAX_QPATH]; int i; int s, t; @@ -2574,7 +2564,7 @@ static void *Q1_LoadSkins_GL (daliasskintype_t *pskintype, unsigned int skintran daliasskingroup_t *count; daliasskininterval_t *intervals; qbyte *data, *saved; - galiasskin_t *outskin = (galiasskin_t *)((char *)galias + galias->ofsskins); + galiasskin_t *outskin = galias->ofsskins; texid_t texture; texid_t fbtexture; @@ -2627,11 +2617,11 @@ static void *Q1_LoadSkins_GL (daliasskintype_t *pskintype, unsigned int skintran if (!TEXVALID(texture) || (loadmodel->engineflags & MDLF_NOTREPLACEMENTS)) { //we're not using 24bits - shaders = Hunk_Alloc(sizeof(*shaders)+sizeof(*ofstexels)+s); - ofstexels = (int*)(shaders+1); + shaders = ZG_Malloc(&loadmodel->memgroup, sizeof(*shaders)+sizeof(*ofstexels)+s); + ofstexels = (qbyte**)(shaders+1); saved = (qbyte*)(ofstexels+1); - outskin->ofstexels = (qbyte *)ofstexels - (qbyte *)outskin; - ofstexels[0] = (qbyte *)saved - (qbyte *)ofstexels; + outskin->ofstexels = ofstexels; + ofstexels[0] = saved; memcpy(saved, pskintype+1, s); Mod_FloodFillSkin(saved, outskin->skinwidth, outskin->skinheight); @@ -2667,10 +2657,10 @@ static void *Q1_LoadSkins_GL (daliasskintype_t *pskintype, unsigned int skintran } } else - shaders = Hunk_Alloc(sizeof(*shaders)); + shaders = ZG_Malloc(&loadmodel->memgroup, sizeof(*shaders)); outskin->numshaders=1; - outskin->ofsshaders = (char *)shaders - (char *)outskin; + outskin->ofsshaders = shaders; @@ -2735,10 +2725,10 @@ static void *Q1_LoadSkins_GL (daliasskintype_t *pskintype, unsigned int skintran intervals = (daliasskininterval_t *)(count+1); outskin->numshaders = LittleLong(count->numskins); data = (qbyte *)(intervals + outskin->numshaders); - shaders = Hunk_Alloc(sizeof(*shaders)*outskin->numshaders + sizeof(*ofstexels)*outskin->numshaders); - ofstexels = (int*)(shaders+outskin->numshaders); - outskin->ofsshaders = (char *)shaders - (char *)outskin; - outskin->ofstexels = (char *)ofstexels - (char *)outskin; + shaders = ZG_Malloc(&loadmodel->memgroup, sizeof(*shaders)*outskin->numshaders + sizeof(*ofstexels)*outskin->numshaders); + ofstexels = (qbyte**)(shaders+outskin->numshaders); + outskin->ofsshaders = shaders; + outskin->ofstexels = ofstexels; sinter = LittleFloat(intervals[0].interval); if (sinter <= 0) sinter = 0.1; @@ -2775,8 +2765,8 @@ static void *Q1_LoadSkins_GL (daliasskintype_t *pskintype, unsigned int skintran if (!TEXVALID(texture) || (!TEXVALID(fbtexture) && r_fb_models.ival)) { - saved = Hunk_Alloc(s); - ofstexels[t] = (qbyte *)(saved) - (qbyte *)ofstexels; + saved = ZG_Malloc(&loadmodel->memgroup, s); + ofstexels[t] = saved; memcpy(saved, data, s); Mod_FloodFillSkin(saved, outskin->skinwidth, outskin->skinheight); if (!TEXVALID(texture)) @@ -2819,7 +2809,6 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) vec2_t *st_array; int j; #endif - int hunkstart, hunkend, hunktotal; int version; int i, onseams; dstvert_t *pinstverts; @@ -2838,8 +2827,6 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) loadmodel=mod; - hunkstart = Hunk_LowMark (); - pq1inmodel = (dmdl_t *)buffer; hdrsize = sizeof(dmdl_t) - sizeof(int); @@ -2893,10 +2880,10 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) #endif + pq1inmodel->numframes*sizeof(galiasgroup_t); - galias = Hunk_Alloc(size); - galias->groupofs = sizeof(*galias); + galias = ZG_Malloc(&loadmodel->memgroup, size); + galias->groupofs = (galiasgroup_t*)(galias+1); #ifndef SERVERONLY - galias->ofsskins = sizeof(*galias)+pq1inmodel->numframes*sizeof(galiasgroup_t); + galias->ofsskins = (galiasskin_t*)(galias->groupofs+pq1inmodel->numframes); #endif galias->nextsurf = 0; @@ -2937,7 +2924,7 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) galias->numverts = pq1inmodel->numverts; galias->numindexes = pq1inmodel->numtris*3; - indexes = Hunk_Alloc(galias->numindexes*sizeof(*indexes)); + indexes = ZG_Malloc(&memgroup, galias->numindexes*sizeof(*indexes)); galias->ofs_indexes = (char *)indexes - (char *)galias; for (i = 0; i < pq1inmodel->numverts; i++) seamremap[i] = i; @@ -2958,8 +2945,8 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) /*output the indicies as we figure out which verts we want*/ galias->numindexes = pq1inmodel->numtris*3; - indexes = Hunk_Alloc(galias->numindexes*sizeof(*indexes)); - galias->ofs_indexes = (char *)indexes - (char *)galias; + indexes = ZG_Malloc(&loadmodel->memgroup, galias->numindexes*sizeof(*indexes)); + galias->ofs_indexes = indexes; for (i = 0; i < pq1inmodel->numtris; i++) { for (j = 0; j < 3; j++) @@ -2983,8 +2970,8 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) } } - st_array = Hunk_Alloc(sizeof(*st_array)*(galias->numverts)); - galias->ofs_st_array = (char *)st_array - (char *)galias; + st_array = ZG_Malloc(&loadmodel->memgroup, sizeof(*st_array)*(galias->numverts)); + galias->ofs_st_array = st_array; /*generate our st_array now we know which vertexes we want*/ for (k = 0; k < galias->numverts; k++) { @@ -3005,7 +2992,7 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) if (Alias_LoadFrameGroup((daliasframetype_t *)end, seamremap, 2) == NULL) { BZ_Free(seamremap); - Hunk_FreeToLowMark (hunkstart); + ZG_FreeGroup(&loadmodel->memgroup); return false; } @@ -3030,8 +3017,8 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) //st #ifndef SERVERONLY - st_array = Hunk_Alloc(sizeof(*st_array)*(pq1inmodel->numverts+onseams)); - galias->ofs_st_array = (char *)st_array - (char *)galias; + st_array = ZG_Malloc(&loadmodel->memgroup, sizeof(*st_array)*(pq1inmodel->numverts+onseams)); + galias->ofs_st_array = st_array; for (j=pq1inmodel->numverts,i = 0; i < pq1inmodel->numverts; i++) { st_array[i][0] = (LittleLong(pinstverts[i].s)+0.5)/(float)pq1inmodel->skinwidth; @@ -3058,8 +3045,8 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) pinq1triangles = (dtriangle_t *)&pinstverts[pq1inmodel->numverts]; galias->numindexes = pq1inmodel->numtris*3; - indexes = Hunk_Alloc(galias->numindexes*sizeof(*indexes)); - galias->ofs_indexes = (char *)indexes - (char *)galias; + indexes = ZG_Malloc(&loadmodel->memgroup, galias->numindexes*sizeof(*indexes)); + galias->ofs_indexes = indexes; for (i=0 ; inumtris ; i++) { if (!pinq1triangles[i].facesfront) @@ -3081,7 +3068,7 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) if (Alias_LoadFrameGroup((daliasframetype_t *)end, seamremap, qtest ? 1 : 0) == NULL) { BZ_Free(seamremap); - Hunk_FreeToLowMark (hunkstart); + ZG_FreeGroup(&loadmodel->memgroup); return false; } BZ_Free(seamremap); @@ -3096,22 +3083,8 @@ qboolean Mod_LoadQ1Model (model_t *mod, void *buffer) mod->type = mod_alias; Mod_ClampModelSize(mod); -// -// move the complete, relocatable alias model to the cache -// - hunkend = Hunk_LowMark (); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - Cache_Alloc (&mod->cache, hunktotal, loadname); - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, galias, hunktotal); - - Hunk_FreeToLowMark (hunkstart); + mod->meshinfo = galias; mod->funcs.NativeTrace = Mod_Trace; @@ -3169,12 +3142,12 @@ static void Q2_LoadSkins(md2_t *pq2inmodel, char *skins) #ifndef SERVERONLY int i; shader_t **shaders; - galiasskin_t *outskin = (galiasskin_t *)((char *)galias + galias->ofsskins); + galiasskin_t *outskin = galias->ofsskins; for (i = 0; i < LittleLong(pq2inmodel->num_skins); i++, outskin++) { - shaders = Hunk_Alloc(sizeof(*shaders)); - outskin->ofsshaders = (char *)shaders - (char *)outskin; + shaders = ZG_Malloc(&loadmodel->memgroup, sizeof(*shaders)); + outskin->ofsshaders = shaders; outskin->numshaders=1; COM_CleanUpPath(skins); //blooming tanks. @@ -3216,7 +3189,6 @@ qboolean Mod_LoadQ2Model (model_t *mod, void *buffer) #endif md2_t *pq2inmodel; - int hunkstart, hunkend, hunktotal; int version; int i, j; dmd2triangle_t *pintri; @@ -3244,8 +3216,6 @@ qboolean Mod_LoadQ2Model (model_t *mod, void *buffer) loadmodel->engineflags |= MDLF_NEEDOVERBRIGHT; - hunkstart = Hunk_LowMark (); - pq2inmodel = (md2_t *)buffer; version = LittleLong (pq2inmodel->version); @@ -3278,10 +3248,10 @@ qboolean Mod_LoadQ2Model (model_t *mod, void *buffer) #endif + LittleLong(pq2inmodel->num_frames)*sizeof(galiasgroup_t); - galias = Hunk_Alloc(size); - galias->groupofs = sizeof(*galias); + galias = ZG_Malloc(&loadmodel->memgroup, size); + galias->groupofs = (galiasgroup_t*)(galias+1); #ifndef SERVERONLY - galias->ofsskins = sizeof(*galias)+LittleLong(pq2inmodel->num_frames)*sizeof(galiasgroup_t); + galias->ofsskins = (galiasskin_t*)(galias->groupofs + LittleLong(pq2inmodel->num_frames)); #endif galias->nextsurf = 0; @@ -3302,8 +3272,8 @@ qboolean Mod_LoadQ2Model (model_t *mod, void *buffer) } numindexes = galias->numindexes = LittleLong(pq2inmodel->num_tris)*3; - indexes = Hunk_Alloc(galias->numindexes*sizeof(*indexes)); - galias->ofs_indexes = (char *)indexes - (char *)galias; + indexes = ZG_Malloc(&loadmodel->memgroup, galias->numindexes*sizeof(*indexes)); + galias->ofs_indexes = indexes; memset ( indremap, -1, sizeof(indremap) ); numverts=0; @@ -3351,8 +3321,8 @@ qboolean Mod_LoadQ2Model (model_t *mod, void *buffer) // s and t vertices #ifndef SERVERONLY pinstverts = ( dmd2stvert_t * ) ( ( qbyte * )pq2inmodel + LittleLong (pq2inmodel->ofs_st) ); - st_array = Hunk_Alloc(sizeof(*st_array)*(numverts)); - galias->ofs_st_array = (char *)st_array - (char *)galias; + st_array = ZG_Malloc(&loadmodel->memgroup, sizeof(*st_array)*(numverts)); + galias->ofs_st_array = st_array; for (j=0 ; jmins, mod->maxs ); - poutframe = (galiasgroup_t*)((char *)galias + galias->groupofs); + poutframe = galias->groupofs; framesize = LittleLong (pq2inmodel->framesize); for (i=0 ; inum_frames) ; i++) { - pose = (galiaspose_t *)Hunk_Alloc(sizeof(galiaspose_t) + sizeof(vecV_t)*numverts + size = sizeof(galiaspose_t) + sizeof(vecV_t)*numverts; #ifndef SERVERONLY - + 3*sizeof(vec3_t)*numverts + size += 3*sizeof(vec3_t)*numverts; #endif - ); - poutframe->poseofs = (char *)pose - (char *)poutframe; + pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, sizeof(galiaspose_t) + sizeof(vecV_t)*numverts); + poutframe->poseofs = pose; poutframe->numposes = 1; galias->groups++; verts = (vecV_t *)(pose+1); - pose->ofsverts = (char *)verts - (char *)pose; + pose->ofsverts = verts; #ifndef SERVERONLY normals = (vec3_t*)&verts[galias->numverts]; - pose->ofsnormals = (char *)normals - (char *)pose; + pose->ofsnormals = normals; - pose->ofssvector = (char *)&normals[galias->numverts] - (char *)pose; - pose->ofstvector = (char *)&normals[galias->numverts*2] - (char *)pose; + pose->ofssvector = &normals[galias->numverts]; + pose->ofstvector = &normals[galias->numverts*2]; #endif @@ -3434,23 +3404,9 @@ qboolean Mod_LoadQ2Model (model_t *mod, void *buffer) */ Mod_ClampModelSize(mod); -// -// move the complete, relocatable alias model to the cache -// - hunkend = Hunk_LowMark (); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - Cache_Alloc (&mod->cache, hunktotal, loadname); + mod->meshinfo = galias; mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, galias, hunktotal); - - Hunk_FreeToLowMark (hunkstart); mod->funcs.NativeTrace = Mod_Trace; @@ -3515,7 +3471,7 @@ galiasbone_t *Mod_GetBoneInfo(model_t *model, int *numbones) inf = Mod_Extradata(model); - bone = (galiasbone_t*)((char*)inf + inf->ofsbones); + bone = inf->ofsbones; *numbones = inf->numbones; return bone; #else @@ -3540,7 +3496,7 @@ int Mod_GetBoneParent(model_t *model, int bonenum) bonenum--; if ((unsigned int)bonenum >= inf->numbones) return 0; //no parent - bone = (galiasbone_t*)((char*)inf + inf->ofsbones); + bone = inf->ofsbones; return bone[bonenum].parent+1; #endif return 0; @@ -3562,19 +3518,12 @@ char *Mod_GetBoneName(model_t *model, int bonenum) bonenum--; if ((unsigned int)bonenum >= inf->numbones) return 0; //no parent - bone = (galiasbone_t*)((char*)inf + inf->ofsbones); + bone = inf->ofsbones; return bone[bonenum].name; #endif return 0; } - -typedef struct { - char name[64]; - vec3_t org; - float ang[3][3]; -} md3tag_t; - qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *result) { galiasinfo_t *inf; @@ -3611,7 +3560,7 @@ qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *res return false; tagnum--; //tagnum 0 is 'use my angles/org' - bone = (galiasbone_t*)((char*)inf + inf->ofsbones); + bone = inf->ofsbones; if (fstate->bonestate) { @@ -3645,8 +3594,8 @@ qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *res } //the higher level merges old/new anims, but we still need to blend between automated frame-groups. - g1 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*frame1); - g2 = (galiasgroup_t*)((char *)inf + inf->groupofs + sizeof(galiasgroup_t)*frame2); + g1 = &inf->groupofs[frame1]; + g2 = &inf->groupofs[frame2]; if (f2ness != 1) { @@ -3654,12 +3603,12 @@ qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *res frame1 = (int)f1time%g1->numposes; frame2 = ((int)f1time+1)%g1->numposes; f1time = f1time - (int)f1time; - pose[numposes] = (float *)((char *)g1 + g1->poseofs + sizeof(float)*inf->numbones*12*frame1); + pose[numposes] = g1->boneofs + inf->numbones*12*frame1; plerp[numposes] = (1-f1time) * (1-f2ness); numposes++; if (frame1 != frame2) { - pose[numposes] = (float *)((char *)g1 + g1->poseofs + sizeof(float)*inf->numbones*12*frame2); + pose[numposes] = g1->boneofs + inf->numbones*12*frame2; plerp[numposes] = f1time * (1-f2ness); numposes++; } @@ -3670,12 +3619,12 @@ qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *res frame1 = (int)f2time%g2->numposes; frame2 = ((int)f2time+1)%g2->numposes; f2time = f2time - (int)f2time; - pose[numposes] = (float *)((char *)g2 + g2->poseofs + sizeof(float)*inf->numbones*12*frame1); + pose[numposes] = g2->boneofs + inf->numbones*12*frame1; plerp[numposes] = (1-f2time) * f2ness; numposes++; if (frame1 != frame2) { - pose[numposes] = (float *)((char *)g2 + g2->poseofs + sizeof(float)*inf->numbones*12*frame2); + pose[numposes] = g2->boneofs + inf->numbones*12*frame2; plerp[numposes] = f2time * f2ness; numposes++; } @@ -3734,11 +3683,11 @@ qboolean Mod_GetTag(model_t *model, int tagnum, framestate_t *fstate, float *res frame2 = frame1; tagnum--; //tagnum 0 is 'use my angles/org' - t1 = (md3tag_t*)((char*)inf + inf->ofstags); + t1 = inf->ofstags; t1 += tagnum; t1 += inf->numtags*frame1; - t2 = (md3tag_t*)((char*)inf + inf->ofstags); + t2 = inf->ofstags; t2 += tagnum; t2 += inf->numtags*frame2; @@ -3803,7 +3752,7 @@ int Mod_TagNumForName(model_t *model, char *name) if (inf->numbones) { galiasbone_t *b; - b = (galiasbone_t*)((char*)inf + inf->ofsbones); + b = inf->ofsbones; for (i = 0; i < inf->numbones; i++) { if (!strcmp(b[i].name, name)) @@ -3811,7 +3760,7 @@ int Mod_TagNumForName(model_t *model, char *name) } } #endif - t = (md3tag_t*)((char*)inf + inf->ofstags); + t = inf->ofstags; for (i = 0; i < inf->numtags; i++) { if (!strcmp(t[i].name, name)) @@ -3838,7 +3787,7 @@ int Mod_FrameNumForName(model_t *model, char *name) inf = Mod_Extradata(model); - group = (galiasgroup_t*)((char*)inf + inf->groupofs); + group = inf->groupofs; for (i = 0; i < inf->groups; i++, group++) { if (!strcmp(group->name, name)) @@ -3858,7 +3807,7 @@ int Mod_SkinNumForName(model_t *model, char *name) return -1; inf = Mod_Extradata(model); - skin = (galiasskin_t*)((char*)inf+inf->ofsskins); + skin = inf->ofsskins; for (i = 0; i < inf->numskins; i++, skin++) { if (!strcmp(skin->name, name)) @@ -3883,7 +3832,7 @@ const char *Mod_FrameNameForNum(model_t *model, int num) if (num >= inf->groups) return NULL; - group = (galiasgroup_t*)((char*)inf + inf->groupofs); + group = inf->groupofs; return group[num].name; } @@ -3901,7 +3850,7 @@ qboolean Mod_FrameInfoForNum(model_t *model, int num, char **name, int *numframe if (num >= inf->groups) return false; - group = (galiasgroup_t*)((char*)inf + inf->groupofs); + group = inf->groupofs; *name = group[num].name; *numframes = group[num].numposes; @@ -3924,12 +3873,12 @@ const char *Mod_SkinNameForNum(model_t *model, int num) if (num >= inf->numskins) return NULL; - skin = (galiasskin_t*)((char*)inf+inf->ofsskins); + skin = inf->ofsskins; return skin[num].name; #endif } -float Mod_FrameDuration(model_t *model, int frameno) +float Mod_GetFrameDuration(model_t *model, int frameno) { galiasinfo_t *inf; galiasgroup_t *group; @@ -3938,7 +3887,7 @@ float Mod_FrameDuration(model_t *model, int frameno) return 0; inf = Mod_Extradata(model); - group = (galiasgroup_t*)((char*)inf + inf->groupofs); + group = inf->groupofs; if (frameno < 0 || frameno >= inf->groups) return 0; group += frameno; @@ -4035,7 +3984,6 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) vec2_t *st_array; md3Shader_t *inshader; #endif - int hunkstart, hunkend, hunktotal; // int version; int s, i, j, d; @@ -4063,8 +4011,6 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) loadmodel=mod; - hunkstart = Hunk_LowMark (); - header = buffer; // if (header->version != sdfs) @@ -4088,21 +4034,21 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) if (LittleLong(surf->ident) != MD3_IDENT) Con_Printf(CON_WARNING "Warning: md3 sub-surface doesn't match ident\n"); size = sizeof(galiasinfo_t) + sizeof(galiasgroup_t)*LittleLong(header->numFrames); - galias = Hunk_Alloc(size); - galias->groupofs = sizeof(*galias); //frame groups + galias = ZG_Malloc(&loadmodel->memgroup, size); + galias->groupofs = (galiasgroup_t*)(galias+1); //frame groups galias->groups = LittleLong(header->numFrames); galias->numverts = LittleLong(surf->numVerts); galias->numindexes = LittleLong(surf->numTriangles)*3; galias->shares_verts = s; if (parent) - parent->nextsurf = (qbyte *)galias - (qbyte *)parent; + parent->nextsurf = galias; else root = galias; parent = galias; #ifndef SERVERONLY - st_array = Hunk_Alloc(sizeof(vec2_t)*galias->numindexes); - galias->ofs_st_array = (qbyte*)st_array - (qbyte*)galias; + st_array = ZG_Malloc(&loadmodel->memgroup, sizeof(vec2_t)*galias->numindexes); + galias->ofs_st_array = st_array; inst = (md3St_t*)((qbyte*)surf + LittleLong(surf->ofsSt)); for (i = 0; i < galias->numverts; i++) { @@ -4111,8 +4057,8 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) } #endif - indexes = Hunk_Alloc(sizeof(*indexes)*galias->numindexes); - galias->ofs_indexes = (qbyte*)indexes - (qbyte*)galias; + indexes = ZG_Malloc(&loadmodel->memgroup, sizeof(*indexes)*galias->numindexes); + galias->ofs_indexes = indexes; intris = (md3Triangle_t *)((qbyte*)surf + LittleLong(surf->ofsTriangles)); for (i = 0; i < LittleLong(surf->numTriangles); i++) { @@ -4125,21 +4071,21 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) invert = (md3XyzNormal_t *)((qbyte*)surf + LittleLong(surf->ofsXyzNormals)); for (i = 0; i < LittleLong(surf->numFrames); i++) { - pose = (galiaspose_t *)Hunk_Alloc(sizeof(galiaspose_t) + sizeof(vecV_t)*LittleLong(surf->numVerts) + int size = sizeof(galiaspose_t) + sizeof(vecV_t)*LittleLong(surf->numVerts); #ifndef SERVERONLY - + 3*sizeof(vec3_t)*LittleLong(surf->numVerts) + size += 3*sizeof(vec3_t)*LittleLong(surf->numVerts); #endif - ); + pose = (galiaspose_t *)ZG_Malloc(&loadmodel->memgroup, size); verts = (vecV_t*)(pose+1); - pose->ofsverts = (qbyte*)verts - (qbyte*)pose; + pose->ofsverts = verts; #ifndef SERVERONLY normals = (vec3_t*)(verts + LittleLong(surf->numVerts)); - pose->ofsnormals = (qbyte*)normals - (qbyte*)pose; + pose->ofsnormals = normals; svector = normals + LittleLong(surf->numVerts); - pose->ofssvector = (qbyte*)svector - (qbyte*)pose; + pose->ofssvector = svector; tvector = svector + LittleLong(surf->numVerts); - pose->ofstvector = (qbyte*)tvector - (qbyte*)pose; + pose->ofstvector = tvector; #endif for (j = 0; j < LittleLong(surf->numVerts); j++) @@ -4173,7 +4119,7 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) group->numposes = 1; group->rate = 1; - group->poseofs = (qbyte*)pose - (qbyte*)group; + group->poseofs = pose; group++; invert += LittleLong(surf->numVerts); @@ -4186,14 +4132,14 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) { char shadname[1024]; - skin = Hunk_Alloc((LittleLong(surf->numShaders)+externalskins)*((sizeof(galiasskin_t)+sizeof(shader_t*)))); - galias->ofsskins = (qbyte *)skin - (qbyte *)galias; + skin = ZG_Malloc(&loadmodel->memgroup, (LittleLong(surf->numShaders)+externalskins)*((sizeof(galiasskin_t)+sizeof(shader_t*)))); + galias->ofsskins = skin; shaders = (shader_t **)(skin + LittleLong(surf->numShaders)+externalskins); inshader = (md3Shader_t *)((qbyte *)surf + LittleLong(surf->ofsShaders)); for (i = 0; i < externalskins; i++) { skin->numshaders = 1; - skin->ofsshaders = (qbyte *)&shaders[i] - (qbyte *)skin; + skin->ofsshaders = &shaders[i]; skin->ofstexels = 0; skin->skinwidth = 0; skin->skinheight = 0; @@ -4240,18 +4186,18 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) } if (!root) - root = Hunk_Alloc(sizeof(galiasinfo_t)); + root = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasinfo_t)); root->numtagframes = LittleLong(header->numFrames); root->numtags = LittleLong(header->numTags); - root->ofstags = (char*)Hunk_Alloc(LittleLong(header->numTags)*sizeof(md3tag_t)*LittleLong(header->numFrames)) - (char*)root; + root->ofstags = ZG_Malloc(&loadmodel->memgroup, LittleLong(header->numTags)*sizeof(md3tag_t)*LittleLong(header->numFrames)); { md3tag_t *src; md3tag_t *dst; src = (md3tag_t *)((char*)header+LittleLong(header->ofsTags)); - dst = (md3tag_t *)((char*)root+root->ofstags); + dst = root->ofstags; for(i=0;inumTags)*LittleLong(header->numFrames);i++) { memcpy(dst->name, src->name, sizeof(dst->name)); @@ -4273,11 +4219,6 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) } } -// -// move the complete, relocatable alias model to the cache -// - - hunkend = Hunk_LowMark (); #ifndef SERVERONLY if (mod_md3flags.value) mod->flags = LittleLong(header->flags); @@ -4289,19 +4230,7 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer) Mod_ClampModelSize(mod); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - - Cache_Alloc (&mod->cache, hunktotal, loadname); - mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, root, hunktotal); - - Hunk_FreeToLowMark (hunkstart); + mod->meshinfo = root; mod->funcs.NativeTrace = Mod_Trace; @@ -4380,7 +4309,6 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) #endif int i; - int hunkstart, hunkend, hunktotal; zymtype1header_t *header; galiasinfo_t *root; @@ -4410,8 +4338,6 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) loadmodel=mod; - hunkstart = Hunk_LowMark (); - header = buffer; if (memcmp(header->id, "ZYMOTICMODEL", 12)) @@ -4444,11 +4370,11 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) VectorCopy(header->mins, mod->mins); VectorCopy(header->maxs, mod->maxs); - root = Hunk_AllocName(sizeof(galiasinfo_t)*header->numsurfaces, loadname); + root = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasinfo_t)*header->numsurfaces); root->numswtransforms = header->lump_verts.length/sizeof(zymvertex_t); - transforms = Hunk_Alloc(root->numswtransforms*sizeof(*transforms)); - root->ofsswtransforms = (char*)transforms - (char*)root; + transforms = ZG_Malloc(&loadmodel->memgroup, root->numswtransforms*sizeof(*transforms)); + root->ofsswtransforms = transforms; vertbonecounts = (int *)((char*)header + header->lump_vertbonecounts.start); intrans = (zymvertex_t *)((char*)header + header->lump_verts.start); @@ -4463,7 +4389,6 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) if (v == header->numverts) { Con_Printf("Mod_LoadZymoticModel: %s, too many transformations\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } vertbonecounts[v] = BigLong(vertbonecounts[v]); @@ -4480,35 +4405,33 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) if (intrans != (zymvertex_t *)((char*)header + header->lump_verts.start)) { Con_Printf(CON_ERROR "%s, Vertex transforms list appears corrupt.\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } if (vertbonecounts != (int *)((char*)header + header->lump_vertbonecounts.start)) { Con_Printf(CON_ERROR "%s, Vertex bone counts list appears corrupt.\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } root->numverts = v+1; root->numbones = header->numbones; - bone = Hunk_Alloc(root->numswtransforms*sizeof(*transforms)); + bone = ZG_Malloc(&loadmodel->memgroup, root->numswtransforms*sizeof(*transforms)); inbone = (zymbone_t*)((char*)header + header->lump_bones.start); for (i = 0; i < root->numbones; i++) { Q_strncpyz(bone[i].name, inbone[i].name, sizeof(bone[i].name)); bone[i].parent = BigLong(inbone[i].parent); } - root->ofsbones = (char *)bone - (char *)root; + root->ofsbones = bone; renderlist = (int*)((char*)header + header->lump_render.start); for (i = 0;i < header->numsurfaces; i++) { count = BigLong(*renderlist++); count *= 3; - indexes = Hunk_Alloc(count*sizeof(*indexes)); - root[i].ofs_indexes = (char *)indexes - (char*)&root[i]; + indexes = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*indexes)); + root[i].ofs_indexes = indexes; root[i].numindexes = count; while(count) { //invert @@ -4522,19 +4445,18 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) if (renderlist != (int*)((char*)header + header->lump_render.start + header->lump_render.length)) { Con_Printf(CON_ERROR "%s, render list appears corrupt.\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } - grp = Hunk_Alloc(sizeof(*grp)*header->numscenes*header->numsurfaces); - matrix = Hunk_Alloc(header->lump_poses.length); + grp = ZG_Malloc(&loadmodel->memgroup, sizeof(*grp)*header->numscenes*header->numsurfaces); + matrix = ZG_Malloc(&loadmodel->memgroup, header->lump_poses.length); inmatrix = (float*)((char*)header + header->lump_poses.start); for (i = 0; i < header->lump_poses.length/4; i++) matrix[i] = BigFloat(inmatrix[i]); inscene = (zymscene_t*)((char*)header + header->lump_scenes.start); surfname = ((char*)header + header->lump_surfnames.start); - stcoords = Hunk_Alloc(root[0].numverts*sizeof(vec2_t)); + stcoords = ZG_Malloc(&loadmodel->memgroup, root[0].numverts*sizeof(vec2_t)); inst = (vec2_t *)((char *)header + header->lump_texcoords.start); for (i = 0; i < header->lump_texcoords.length/8; i++) { @@ -4551,25 +4473,25 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) for (i = 0; i < header->numsurfaces; i++, surfname+=32) { root[i].groups = header->numscenes; - root[i].groupofs = (char*)grp - (char*)&root[i]; + root[i].groupofs = grp; #ifdef SERVERONLY root[i].numskins = 1; #else - root[i].ofs_st_array = (char*)stcoords - (char*)&root[i]; + root[i].ofs_st_array = stcoords; root[i].numskins = skinfiles; - skin = Hunk_Alloc((sizeof(galiasskin_t)+sizeof(shader_t*))*skinfiles); + skin = ZG_Malloc(&loadmodel->memgroup, (sizeof(galiasskin_t)+sizeof(shader_t*))*skinfiles); shaders = (shader_t**)(skin+skinfiles); for (j = 0; j < skinfiles; j++, shaders++) { skin[j].numshaders = 1; //non-sequenced skins. - skin[j].ofsshaders = (char *)shaders - (char *)&skin[j]; + skin[j].ofsshaders = shaders; Mod_LoadSkinFile(shaders, surfname, j, NULL, 0, 0, NULL); } - root[i].ofsskins = (char *)skin - (char *)&root[i]; + root[i].ofsskins = skin; #endif } @@ -4582,19 +4504,17 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) grp->rate = BigFloat(inscene->framerate); grp->loop = !(BigLong(inscene->flags) & ZYMSCENEFLAG_NOLOOP); grp->numposes = BigLong(inscene->length); - grp->poseofs = (char*)matrix - (char*)grp; - grp->poseofs += BigLong(inscene->start)*12*sizeof(float)*root->numbones; + grp->boneofs = matrix + BigLong(inscene->start)*12*root->numbones; } if (inscene != (zymscene_t*)((char*)header + header->lump_scenes.start+header->lump_scenes.length)) { Con_Printf(CON_ERROR "%s, scene list appears corrupt.\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } for (i = 0; i < header->numsurfaces-1; i++) - root[i].nextsurf = sizeof(galiasinfo_t); + root[i].nextsurf = &root[i+1]; for (i = 1; i < header->numsurfaces; i++) { root[i].shares_verts = 0; @@ -4602,36 +4522,17 @@ qboolean Mod_LoadZymoticModel(model_t *mod, void *buffer) root[i].numverts = root[0].numverts; root[i].ofsbones = root[0].ofsbones; - - root[i-1].nextsurf = sizeof(*root); } Alias_CalculateSkeletalNormals(root); -// -// move the complete, relocatable alias model to the cache -// - - hunkend = Hunk_LowMark (); - mod->flags = Mod_ReadFlagsFromMD1(mod->name, 0); //file replacement - inherit flags from any defunc mdl files. Mod_ClampModelSize(mod); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - Cache_Alloc (&mod->cache, hunktotal, loadname); + mod->meshinfo = root; mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, root, hunktotal); - - Hunk_FreeToLowMark (hunkstart); - mod->funcs.NativeTrace = Mod_Trace; @@ -4757,7 +4658,7 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) galiasinfo_t *gmdl; #ifndef SERVERONLY - float *stcoord; + vec2_t *stcoord; galiasskin_t *skin; shader_t **gshaders; #endif @@ -4781,8 +4682,6 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) pskanimkeys_t *animkeys = NULL; unsigned int num_animinfo=0, num_animkeys=0; - int hunkstart, hunkend, hunktotal; - //#define PSK_GPU #ifndef PSK_GPU unsigned int num_trans; @@ -5028,12 +4927,10 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) return false; } - hunkstart = Hunk_LowMark (); - - gmdl = Hunk_Alloc(sizeof(*gmdl)*num_matt); + gmdl = ZG_Malloc(&loadmodel->memgroup, sizeof(*gmdl)*num_matt); /*bones!*/ - bones = Hunk_Alloc(sizeof(galiasbone_t) * num_boneinfo); + bones = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasbone_t) * num_boneinfo); for (i = 0; i < num_boneinfo; i++) { Q_strncpyz(bones[i].name, boneinfo[i].name, sizeof(bones[i].name)); @@ -5050,7 +4947,7 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) } } - basematrix = Hunk_Alloc(num_boneinfo*sizeof(float)*12); + basematrix = ZG_Malloc(&loadmodel->memgroup, num_boneinfo*sizeof(float)*12); for (i = 0; i < num_boneinfo; i++) { float tmp[12]; @@ -5083,7 +4980,7 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) } } } - trans = Hunk_Alloc(sizeof(*trans)*num_trans); + trans = ZG_Malloc(&loadmodel->memgroup, sizeof(*trans)*num_trans); num_trans = 0; for (i = 0; i < num_vtxw; i++) { @@ -5150,16 +5047,16 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) #ifndef SERVERONLY /*st coords, all share the same list*/ - stcoord = Hunk_Alloc(sizeof(vec2_t)*num_vtxw); + stcoord = ZG_Malloc(&loadmodel->memgroup, sizeof(vec2_t)*num_vtxw); for (i = 0; i < num_vtxw; i++) { - stcoord[i*2+0] = vtxw[i].texcoord[0]; - stcoord[i*2+1] = vtxw[i].texcoord[1]; + stcoord[i][0] = vtxw[i].texcoord[0]; + stcoord[i][1] = vtxw[i].texcoord[1]; } #endif /*allocate faces in a single block, as we at least know an upper bound*/ - indexes = Hunk_Alloc(sizeof(index_t)*num_face*3); + indexes = ZG_Malloc(&loadmodel->memgroup, sizeof(index_t)*num_face*3); if (animinfo && animkeys) { @@ -5168,12 +5065,12 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) if (numgroups) { /*externally supplied listing of frames. ignore all framegroups in the model and use only the pose info*/ - group = Hunk_Alloc(sizeof(galiasgroup_t)*numgroups + num_animkeys*sizeof(float)*12); + group = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t)*numgroups + num_animkeys*sizeof(float)*12); animmatrix = (float*)(group+numgroups); for (j = 0; j < numgroups; j++) { //FIXME: bound check - group[j].poseofs = ((char*)animmatrix - (char*)&group[j]) + sizeof(float)*12*num_boneinfo*frameinfo[j].firstpose; + group[j].boneofs = animmatrix + 12*num_boneinfo*frameinfo[j].firstpose; group[j].numposes = frameinfo[j].posecount; if (*frameinfo[j].name) snprintf(group[j].name, sizeof(group[j].name), "%s", frameinfo[j].name); @@ -5192,14 +5089,14 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) iframe = 0; for (i = 0; i < num_animinfo; i++) iframe += animinfo[i].numframes; - group = Hunk_Alloc(sizeof(galiasgroup_t)*iframe + num_animkeys*sizeof(float)*12); + group = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t)*iframe + num_animkeys*sizeof(float)*12); animmatrix = (float*)(group+iframe); iframe = 0; for (j = 0; j < num_animinfo; j++) { for (i = 0; i < animinfo[j].numframes; i++) { - group[iframe].poseofs = ((char*)animmatrix - (char*)&group[iframe]) + sizeof(float)*12*num_boneinfo*(animinfo[j].firstframe+i); + group[iframe].boneofs = animmatrix + 12*num_boneinfo*(animinfo[j].firstframe+i); group[iframe].numposes = 1; snprintf(group[iframe].name, sizeof(group[iframe].name), "%s_%i", animinfo[j].name, i); group[iframe].loop = true; @@ -5213,11 +5110,11 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) else { /*keep each framegroup as a group*/ - group = Hunk_Alloc(sizeof(galiasgroup_t)*num_animinfo + num_animkeys*sizeof(float)*12); + group = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t)*num_animinfo + num_animkeys*sizeof(float)*12); animmatrix = (float*)(group+num_animinfo); for (i = 0; i < num_animinfo; i++) { - group[i].poseofs = (char*)animmatrix - (char*)&group[i] + sizeof(float)*12*num_boneinfo*animinfo[i].firstframe; + group[i].boneofs = animmatrix + 12*num_boneinfo*animinfo[i].firstframe; group[i].numposes = animinfo[i].numframes; Q_strncpyz(group[i].name, animinfo[i].name, sizeof(group[i].name)); group[i].loop = true; @@ -5242,9 +5139,9 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) { num_animinfo = 1; /*build a base pose*/ - group = Hunk_Alloc(sizeof(galiasgroup_t) + num_boneinfo*sizeof(float)*12); + group = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t) + num_boneinfo*sizeof(float)*12); animmatrix = basematrix; - group->poseofs = (char*)animmatrix - (char*)group; + group->boneofs = animmatrix; group->numposes = 1; strcpy(group->name, "base"); group->loop = true; @@ -5253,11 +5150,11 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) } #ifndef SERVERONLY - skin = Hunk_Alloc(num_matt * (sizeof(galiasskin_t) + sizeof(shader_t*))); + skin = ZG_Malloc(&loadmodel->memgroup, num_matt * (sizeof(galiasskin_t) + sizeof(shader_t*))); gshaders = (shader_t**)(skin + num_matt); for (i = 0; i < num_matt; i++, skin++) { - skin->ofsshaders = (char*)&gshaders[i] - (char*)skin; + skin->ofsshaders = &gshaders[i]; skin->numshaders = 1; skin->skinspeed = 10; Q_strncpyz(skin->name, matt[i].name, sizeof(skin->name)); @@ -5266,19 +5163,19 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) if (gshaders[i]->flags & SHADER_NOIMAGE) Con_Printf("Unable to load texture for shader \"%s\" for model \"%s\"\n", gshaders[i]->name, loadmodel->name); - gmdl[i].ofsskins = (char*)skin - (char*)&gmdl[i]; + gmdl[i].ofsskins = skin; gmdl[i].numskins = 1; - gmdl[i].ofs_st_array = (char*)stcoord - (char*)&gmdl[i]; + gmdl[i].ofs_st_array = stcoord; gmdl[i].numverts = num_vtxw; #else for (i = 0; i < num_matt; i++) { #endif - gmdl[i].groupofs = (char*)group - (char*)&gmdl[i]; + gmdl[i].groupofs = group; gmdl[i].groups = num_animinfo; - gmdl[i].baseframeofs = (char*)basematrix - (char*)&gmdl[i]; + gmdl[i].baseframeofs = basematrix; gmdl[i].numindexes = 0; for (j = 0; j < num_face; j++) @@ -5291,25 +5188,25 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) gmdl[i].numindexes += 3; } } - gmdl[i].ofs_indexes = (char*)indexes - (char*)&gmdl[i]; + gmdl[i].ofs_indexes = indexes; indexes += gmdl[i].numindexes; - gmdl[i].ofsbones = (char*)bones - (char*)&gmdl[i]; + gmdl[i].ofsbones = bones; gmdl[i].numbones = num_boneinfo; #ifndef PSK_GPU - gmdl[i].ofsswtransforms = (char*)trans - (char*)&gmdl[i]; + gmdl[i].ofsswtransforms = trans; gmdl[i].numswtransforms = num_trans; #else - gmdl[i].ofs_skel_idx = (char*)skel_idx - (char*)&gmdl[i]; - gmdl[i].ofs_skel_weight = (char*)skel_weights - (char*)&gmdl[i]; - gmdl[i].ofs_skel_xyz = (char*)skel_xyz - (char*)&gmdl[i]; - gmdl[i].ofs_skel_norm = (char*)skel_norm - (char*)&gmdl[i]; + gmdl[i].ofs_skel_idx = skel_idx; + gmdl[i].ofs_skel_weight = skel_weights; + gmdl[i].ofs_skel_xyz = skel_xyz; + gmdl[i].ofs_skel_norm = skel_norm; #endif gmdl[i].shares_verts = 0; gmdl[i].shares_bones = 0; - gmdl[i].nextsurf = (i != num_matt-1)?sizeof(*gmdl):0; + gmdl[i].nextsurf = (i != num_matt-1)?&gmdl[i+1]:NULL; } if (fail) @@ -5323,30 +5220,14 @@ qboolean Mod_LoadPSKModel(model_t *mod, void *buffer) mod->mins[0] = mod->mins[1] = mod->mins[2] = -vrad; mod->maxs[0] = mod->maxs[1] = mod->maxs[2] = vrad; mod->radius = vrad; -// -// move the complete, relocatable alias model to the cache -// - hunkend = Hunk_LowMark (); mod->flags = Mod_ReadFlagsFromMD1(mod->name, 0); //file replacement - inherit flags from any defunc mdl files. Mod_ClampModelSize(mod); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - Cache_Alloc (&mod->cache, hunktotal, loadname); + mod->meshinfo = gmdl; mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, gmdl, hunktotal); - - Hunk_FreeToLowMark (hunkstart); - - mod->funcs.NativeTrace = Mod_Trace; return true; } @@ -5451,7 +5332,6 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) #endif int i, j, k; - int hunkstart, hunkend, hunktotal; dpmheader_t *header; galiasinfo_t *root, *m; @@ -5477,8 +5357,6 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) loadmodel=mod; - hunkstart = Hunk_LowMark (); - header = buffer; if (memcmp(header->id, "DARKPLACESMODEL\0", 16)) @@ -5516,7 +5394,7 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) VectorCopy(header->mins, mod->mins); VectorCopy(header->maxs, mod->maxs); - root = Hunk_AllocName(sizeof(galiasinfo_t)*header->num_meshs, loadname); + root = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasinfo_t)*header->num_meshs); mesh = (dpmmesh_t*)((char*)buffer + header->ofs_meshs); for (i = 0; i < header->num_meshs; i++, mesh++) @@ -5545,10 +5423,10 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) m = &root[i]; #ifdef SERVERONLY - transforms = Hunk_AllocName(numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t), loadname); + transforms = ZG_Malloc(&loadmodel->memgroup, numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t)); #else - outst = Hunk_AllocName(numverts*sizeof(vec2_t) + numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t), loadname); - m->ofs_st_array = (char*)outst - (char*)m; + outst = ZG_Malloc(&loadmodel->memgroup, numverts*sizeof(vec2_t) + numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t)); + m->ofs_st_array = (vec2_t*)outst; m->numverts = mesh->num_verts; inst = (float*)((char*)buffer + mesh->ofs_texcoords); for (j = 0; j < numverts; j++, outst+=2, inst+=2) @@ -5561,7 +5439,7 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) #endif //build the transform list. - m->ofsswtransforms = (char*)transforms - (char*)m; + m->ofsswtransforms = transforms; m->numswtransforms = numtransforms; vert = (dpmvertex_t*)((char *)buffer+mesh->ofs_verts); for (j = 0; j < mesh->num_verts; j++) @@ -5582,7 +5460,7 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) index = (unsigned int*)((char*)buffer + mesh->ofs_indices); outdex = (index_t *)transforms; - m->ofs_indexes = (char*)outdex - (char*)m; + m->ofs_indexes = outdex; m->numindexes = mesh->num_tris*3; for (j = 0; j < m->numindexes; j++) { @@ -5590,7 +5468,7 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) } } - outbone = Hunk_Alloc(sizeof(galiasbone_t)*header->num_bones); + outbone = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasbone_t)*header->num_bones); inbone = (dpmbone_t*)((char*)buffer + header->ofs_bones); for (i = 0; i < header->num_bones; i++) { @@ -5598,7 +5476,6 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) if (outbone[i].parent >= i || outbone[i].parent < -1) { Con_Printf(CON_ERROR "Mod_LoadDarkPlacesModel: bad bone index in %s\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } @@ -5606,7 +5483,7 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) //throw away the flags. } - outgroups = Hunk_Alloc(sizeof(galiasgroup_t)*header->num_frames + sizeof(float)*header->num_frames*header->num_bones*12); + outgroups = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t)*header->num_frames + sizeof(float)*header->num_frames*header->num_bones*12); outposedata = (float*)(outgroups+header->num_frames); inframes = (dpmframe_t*)((char*)buffer + header->ofs_frames); @@ -5627,7 +5504,7 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) outgroups[i].rate = 10; outgroups[i].numposes = 1; outgroups[i].isheirachical = true; - outgroups[i].poseofs = (char*)outposedata - (char*)&outgroups[i]; + outgroups[i].boneofs = outposedata; inposedata = (float*)((char*)buffer + inframes[i].ofs_bonepositions); for (j = 0; j < header->num_bones*12; j++) @@ -5645,14 +5522,14 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) { m = &root[i]; if (i < header->num_meshs-1) - m->nextsurf = sizeof(galiasinfo_t); + m->nextsurf = &root[i+1]; m->shares_bones = 0; - m->ofsbones = (char*)outbone-(char*)m; + m->ofsbones = outbone; m->numbones = header->num_bones; m->groups = header->num_frames; - m->groupofs = (char*)outgroups - (char*)m; + m->groupofs = outgroups; @@ -5661,47 +5538,29 @@ qboolean Mod_LoadDarkPlacesModel(model_t *mod, void *buffer) #else m->numskins = skinfiles; - skin = Hunk_Alloc((sizeof(galiasskin_t)+sizeof(shader_t*))*skinfiles); + skin = ZG_Malloc(&loadmodel->memgroup, (sizeof(galiasskin_t)+sizeof(shader_t*))*skinfiles); shaders = (shader_t**)(skin+skinfiles); for (j = 0; j < skinfiles; j++, shaders++) { skin[j].numshaders = 1; //non-sequenced skins. - skin[j].ofsshaders = (char *)shaders - (char *)&skin[j]; + skin[j].ofsshaders = shaders; Mod_LoadSkinFile(shaders, mesh->shadername, j, NULL, 0, 0, NULL); } - m->ofsskins = (char *)skin - (char *)m; + m->ofsskins = skin; #endif } Alias_CalculateSkeletalNormals(root); -// -// move the complete, relocatable alias model to the cache -// - hunkend = Hunk_LowMark (); - mod->flags = Mod_ReadFlagsFromMD1(mod->name, 0); //file replacement - inherit flags from any defunc mdl files. Mod_ClampModelSize(mod); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - - Cache_Alloc (&mod->cache, hunktotal, loadname); + mod->meshinfo = root; mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, root, hunktotal); - - Hunk_FreeToLowMark (hunkstart); - - mod->funcs.NativeTrace = Mod_Trace; return true; @@ -5988,10 +5847,10 @@ galiasinfo_t *Mod_ParseIQMMeshModel(model_t *mod, char *buffer) mesh = (struct iqmmesh*)(buffer + h->ofs_meshes); /*allocate a nice big block of memory and figure out where stuff is*/ - gai = Hunk_Alloc(sizeof(*gai)*h->num_meshes + -#ifndef SERVERONLY + gai = ZG_Malloc(&loadmodel->memgroup, sizeof(*gai)*h->num_meshes + +//#ifndef SERVERONLY sizeof(*skin)*h->num_meshes + sizeof(*shaders)*h->num_meshes + -#endif +//#endif sizeof(*fgroup)*numgroups + sizeof(float)*12*(h->num_joints + (h->num_poses*h->num_frames)) + sizeof(*bones)*h->num_joints + (sizeof(*opos) + sizeof(*onorm1) + sizeof(*onorm2) + sizeof(*onorm3) + sizeof(*otcoords) + (noweights?0:(sizeof(*oindex)+sizeof(*oweight)))) * h->num_vertexes); bones = (galiasbone_t*)(gai + h->num_meshes); @@ -6122,13 +5981,13 @@ galiasinfo_t *Mod_ParseIQMMeshModel(model_t *mod, char *buffer) { //invalid/basepose fgroup[i].isheirachical = false; - fgroup[i].poseofs = (char*)oposebase - (char*)&fgroup[i]; + fgroup[i].boneofs = oposebase; fgroup[i].numposes = 1; } else { fgroup[i].isheirachical = true; - fgroup[i].poseofs = (char*)(opose + framegroups[i].firstpose*12*h->num_poses) - (char*)&fgroup[i]; + fgroup[i].boneofs = opose + framegroups[i].firstpose*12*h->num_poses; fgroup[i].numposes = framegroups[i].posecount; } fgroup[i].loop = framegroups[i].loop; @@ -6142,41 +6001,41 @@ galiasinfo_t *Mod_ParseIQMMeshModel(model_t *mod, char *buffer) for (i = 0; i < h->num_meshes; i++) { - gai[i].nextsurf = (i == (h->num_meshes-1))?0:sizeof(*gai); + gai[i].nextsurf = (i == (h->num_meshes-1))?NULL:&gai[i+1]; /*animation info*/ gai[i].shares_bones = 0; gai[i].numbones = h->num_joints; - gai[i].ofsbones = (char*)bones - (char*)&gai[i]; + gai[i].ofsbones = bones; gai[i].groups = numgroups; - gai[i].groupofs = (char*)fgroup - (char*)&gai[i]; + gai[i].groupofs = fgroup; offset = LittleLong(mesh[i].first_vertex); #ifndef SERVERONLY /*skins*/ gai[i].numskins = 1; - gai[i].ofsskins = (char*)&skin[i] - (char*)&gai[i]; + gai[i].ofsskins = &skin[i]; Q_strncpyz(skin[i].name, strings+mesh[i].material, sizeof(skin[i].name)); skin[i].skinwidth = 1; skin[i].skinheight = 1; skin[i].ofstexels = 0; /*doesn't support 8bit colourmapping*/ skin[i].skinspeed = 10; /*something to avoid div by 0*/ skin[i].numshaders = 1; - skin[i].ofsshaders = (char*)&shaders[i] - (char*)&skin[i]; + skin[i].ofsshaders = &shaders[i]; shaders[i] = R_RegisterSkin(skin[i].name, mod->name); R_BuildDefaultTexnums(NULL, shaders[i]); if (shaders[i]->flags & SHADER_NOIMAGE) Con_Printf("Unable to load texture for shader \"%s\" for model \"%s\"\n", shaders[i]->name, loadmodel->name); - gai[i].ofs_st_array = (char*)(otcoords+offset) - (char*)&gai[i]; + gai[i].ofs_st_array = (otcoords+offset); #endif nt = LittleLong(mesh[i].num_triangles); tris = (struct iqmtriangle*)(buffer + LittleLong(h->ofs_triangles)); tris += LittleLong(mesh[i].first_triangle); gai[i].numindexes = nt*3; - idx = Hunk_Alloc(sizeof(*idx)*gai[i].numindexes); - gai[i].ofs_indexes = (char*)idx - (char*)&gai[i]; + idx = ZG_Malloc(&loadmodel->memgroup, sizeof(*idx)*gai[i].numindexes); + gai[i].ofs_indexes = idx; for (t = 0; t < nt; t++) { *idx++ = LittleShort(tris[t].vertex[0]) - offset; @@ -6187,12 +6046,12 @@ galiasinfo_t *Mod_ParseIQMMeshModel(model_t *mod, char *buffer) /*verts*/ gai[i].shares_verts = i; gai[i].numverts = LittleLong(mesh[i].num_vertexes); - gai[i].ofs_skel_xyz = (char*)(opos+offset) - (char*)&gai[i]; - gai[i].ofs_skel_norm = vnorm?(char*)(onorm1+offset) - (char*)&gai[i]:0; - gai[i].ofs_skel_svect = (vnorm&&vtang)?(char*)(onorm2+offset) - (char*)&gai[i]:0; - gai[i].ofs_skel_tvect = (vnorm&&vtang)?(char*)(onorm3+offset) - (char*)&gai[i]:0; - gai[i].ofs_skel_idx = oindex?(char*)(oindex+offset) - (char*)&gai[i]:0; - gai[i].ofs_skel_weight = oweight?(char*)(oweight+offset) - (char*)&gai[i]:0; + gai[i].ofs_skel_xyz = (opos+offset); + gai[i].ofs_skel_norm = vnorm?(onorm1+offset):NULL; + gai[i].ofs_skel_svect = (vnorm&&vtang)?(onorm2+offset):NULL; + gai[i].ofs_skel_tvect = (vnorm&&vtang)?(onorm3+offset):NULL; + gai[i].ofs_skel_idx = oindex?(oindex+offset):NULL; + gai[i].ofs_skel_weight = oweight?(oweight+offset):NULL; } if (!noweights) { @@ -6236,40 +6095,26 @@ qboolean Mod_ParseIQMAnim(char *buffer, galiasinfo_t *prototype, void**poseofs, qboolean Mod_LoadInterQuakeModel(model_t *mod, void *buffer) { int i; - unsigned int hunkstart, hunkend, hunktotal; galiasinfo_t *root; struct iqmheader *h = (struct iqmheader *)buffer; - hunkstart = Hunk_LowMark(); root = Mod_ParseIQMMeshModel(mod, buffer); if (!root) { - Hunk_FreeToLowMark (hunkstart); return false; } - hunkend = Hunk_LowMark(); mod->flags = h->flags; ClearBounds(mod->mins, mod->maxs); for (i = 0; i < root->numverts; i++) - AddPointToBounds((float*)((char*)root + root->ofs_skel_xyz + i*sizeof(vecV_t)), mod->mins, mod->maxs); + AddPointToBounds(root->ofs_skel_xyz[i], mod->mins, mod->maxs); Mod_ClampModelSize(mod); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - - Cache_Alloc (&mod->cache, hunktotal, loadname); + mod->meshinfo = root; mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, root, hunktotal); - Hunk_FreeToLowMark (hunkstart); return true; } #endif @@ -6334,18 +6179,18 @@ qboolean Mod_ParseMD5Anim(char *buffer, galiasinfo_t *prototype, void**poseofs, boneflags = BZ_Malloc(sizeof(unsigned char)*numjoints); baseframe = BZ_Malloc(sizeof(float)*12*numjoints); - *poseofs = posedata = Hunk_Alloc(sizeof(float)*12*numjoints*numframes); + *poseofs = posedata = ZG_Malloc(&loadmodel->memgroup, sizeof(float)*12*numjoints*numframes); if (prototype->numbones) { if (prototype->numbones != numjoints) MD5ERROR0PARAM("MD5ANIM: number of bones doesn't match"); - bonelist = (galiasbone_t *)((char*)prototype + prototype->ofsbones); + bonelist = prototype->ofsbones; } else { - bonelist = Hunk_Alloc(sizeof(galiasbone_t)*numjoints); - prototype->ofsbones = (char*)bonelist - (char*)prototype; + bonelist = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasbone_t)*numjoints); + prototype->ofsbones = bonelist; } EXPECT("hierarchy"); @@ -6521,7 +6366,7 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) MD5ERROR0PARAM("MD5 model with unsupported MD5Version"); - root = Hunk_Alloc(sizeof(galiasinfo_t)); + root = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasinfo_t)); lastsurf = NULL; for(;;) @@ -6533,11 +6378,11 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) if (!strcmp(com_token, "numFrames")) { void *poseofs; - galiasgroup_t *grp = Hunk_Alloc(sizeof(galiasgroup_t)); + galiasgroup_t *grp = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t)); Mod_ParseMD5Anim(filestart, root, &poseofs, grp); - root->groupofs = (char*)grp - (char*)root; + root->groupofs = grp; root->groups = 1; - grp->poseofs = (char*)poseofs - (char*)grp; + grp->poseofs = poseofs; return root; } else if (!strcmp(com_token, "commandline")) @@ -6572,13 +6417,13 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) if (!numjoints) MD5ERROR0PARAM("MD5MESH: joints section before (or without) numjoints"); - bones = Hunk_Alloc(sizeof(*bones) * numjoints); - pose = Hunk_Alloc(sizeof(galiasgroup_t)); - posedata = Hunk_Alloc(sizeof(float)*12 * numjoints); + bones = ZG_Malloc(&loadmodel->memgroup, sizeof(*bones) * numjoints); + pose = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t)); + posedata = ZG_Malloc(&loadmodel->memgroup, sizeof(float)*12 * numjoints); pose->isheirachical = false; pose->rate = 1; pose->numposes = 1; - pose->poseofs = (char*)posedata - (char*)pose; + pose->boneofs = posedata; Q_strncpyz(pose->name, "base", sizeof(pose->name)); @@ -6634,7 +6479,7 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) #ifndef SERVERONLY float *stcoord = NULL; #endif - int *indexes = NULL; + index_t *indexes = NULL; float w; vec4_t *rawweight = NULL; @@ -6653,25 +6498,25 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) } else { - inf = Hunk_Alloc(sizeof(*inf)); - lastsurf->nextsurf = (char*)inf - (char*)lastsurf; + inf = ZG_Malloc(&loadmodel->memgroup, sizeof(*inf)); + lastsurf->nextsurf = inf; lastsurf = inf; } - inf->ofsbones = (char*)bones - (char*)inf; + inf->ofsbones = bones; inf->numbones = numjoints; inf->groups = 1; - inf->groupofs = (char*)pose - (char*)inf; - inf->baseframeofs = inf->groupofs + pose->poseofs; + inf->groupofs = pose; + inf->baseframeofs = pose->boneofs; #ifndef SERVERONLY - skin = Hunk_Alloc(sizeof(*skin)); - shaders = Hunk_Alloc(sizeof(*shaders)); + skin = ZG_Malloc(&loadmodel->memgroup, sizeof(*skin)); + shaders = ZG_Malloc(&loadmodel->memgroup, sizeof(*shaders)); inf->numskins = 1; - inf->ofsskins = (char*)skin - (char*)inf; + inf->ofsskins = skin; skin->numshaders = 1; skin->skinspeed = 1; - skin->ofsshaders = (char*)shaders - (char*)skin; + skin->ofsshaders = shaders; #endif EXPECT("{"); for(;;) @@ -6703,8 +6548,8 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) firstweightlist = Z_Malloc(sizeof(*firstweightlist) * numverts); numweightslist = Z_Malloc(sizeof(*numweightslist) * numverts); #ifndef SERVERONLY - stcoord = Hunk_Alloc(sizeof(float)*2*numverts); - inf->ofs_st_array = (char*)stcoord - (char*)inf; + stcoord = ZG_Malloc(&loadmodel->memgroup, sizeof(float)*2*numverts); + inf->ofs_st_array = (vec2_t*)stcoord; inf->numverts = numverts; #endif } @@ -6744,8 +6589,8 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) if (numtris < 0) MD5ERROR0PARAM("MD5MESH: numverts cannot be negative"); - indexes = Hunk_Alloc(sizeof(int)*3*numtris); - inf->ofs_indexes = (char*)indexes - (char*)inf; + indexes = ZG_Malloc(&loadmodel->memgroup, sizeof(int)*3*numtris); + inf->ofs_indexes = indexes; inf->numindexes = numtris*3; } else if (!strcmp(com_token, "tri")) @@ -6804,8 +6649,8 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) } - trans = Hunk_Alloc(sizeof(*trans)*numusableweights); - inf->ofsswtransforms = (char*)trans - (char*)inf; + trans = ZG_Malloc(&loadmodel->memgroup, sizeof(*trans)*numusableweights); + inf->ofsswtransforms = trans; for (num = 0, vnum = 0; num < numverts; num++) { @@ -6853,41 +6698,24 @@ galiasinfo_t *Mod_ParseMD5MeshModel(char *buffer, char *modname) qboolean Mod_LoadMD5MeshModel(model_t *mod, void *buffer) { galiasinfo_t *root; - int hunkstart, hunkend, hunktotal; loadmodel=mod; - hunkstart = Hunk_LowMark (); - root = Mod_ParseMD5MeshModel(buffer, mod->name); if (root == NULL) { - Hunk_FreeToLowMark(hunkstart); return false; } - hunkend = Hunk_LowMark (); - mod->flags = Mod_ReadFlagsFromMD1(mod->name, 0); //file replacement - inherit flags from any defunc mdl files. Mod_ClampModelSize(mod); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - Cache_Alloc (&mod->cache, hunktotal, loadname); mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, root, hunktotal); - - Hunk_FreeToLowMark (hunkstart); - + mod->meshinfo = root; mod->funcs.NativeTrace = Mod_Trace; return true; @@ -6914,15 +6742,12 @@ qboolean Mod_LoadCompositeAnim(model_t *mod, void *buffer) int numgroups = 0; galiasgroup_t *grouplist = NULL; galiasgroup_t *newgroup = NULL; - void **poseofs; - int hunkstart, hunkend, hunktotal; + float **poseofs; char com_token[8192]; loadmodel=mod; - hunkstart = Hunk_LowMark (); - @@ -6942,17 +6767,15 @@ qboolean Mod_LoadCompositeAnim(model_t *mod, void *buffer) if (!file) //FIXME: make non fatal somehow.. { Con_Printf(CON_ERROR "Couldn't open %s (from %s)\n", com_token, mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } root = Mod_ParseMD5MeshModel(file, mod->name); if (root == NULL) { - Hunk_FreeToLowMark(hunkstart); return false; } - newgroup = (galiasgroup_t*)((char*)root + root->groupofs); + newgroup = root->groupofs; grouplist = BZ_Malloc(sizeof(galiasgroup_t)*(numgroups+root->groups)); memcpy(grouplist, newgroup, sizeof(galiasgroup_t)*(numgroups+root->groups)); @@ -6960,7 +6783,7 @@ qboolean Mod_LoadCompositeAnim(model_t *mod, void *buffer) for (i = 0; i < root->groups; i++) { grouplist[numgroups] = newgroup[i]; - poseofs[numgroups] = (char*)&newgroup[i] + newgroup[i].poseofs; + poseofs[numgroups] = newgroup[i].boneofs; numgroups++; } } @@ -6988,7 +6811,6 @@ qboolean Mod_LoadCompositeAnim(model_t *mod, void *buffer) Q_strncpyz(namebkup, com_token, sizeof(namebkup)); if (!Mod_ParseMD5Anim(file, root, &poseofs[numgroups], &grouplist[numgroups])) { - Hunk_FreeToLowMark(hunkstart); return false; } Q_strncpyz(grouplist[numgroups].name, namebkup, sizeof(grouplist[numgroups].name)); @@ -7007,7 +6829,6 @@ qboolean Mod_LoadCompositeAnim(model_t *mod, void *buffer) Q_strncpyz(namebkup, com_token, sizeof(namebkup)); if (!Mod_ParseMD5Anim(file, root, &poseofs[numgroups], &grouplist[numgroups])) { - Hunk_FreeToLowMark(hunkstart); return false; } Q_strncpyz(grouplist[numgroups].name, namebkup, sizeof(grouplist[numgroups].name)); @@ -7028,7 +6849,6 @@ qboolean Mod_LoadCompositeAnim(model_t *mod, void *buffer) Q_strncpyz(namebkup, com_token, sizeof(namebkup)); if (!Mod_ParseMD5Anim(file, root, &np, &ng)) { - Hunk_FreeToLowMark(hunkstart); return false; } @@ -7053,48 +6873,32 @@ qboolean Mod_LoadCompositeAnim(model_t *mod, void *buffer) else { Con_Printf(CON_ERROR "EXTERNALANIM: unrecognised token (%s)\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } } newgroup = grouplist; - grouplist = Hunk_Alloc(sizeof(galiasgroup_t)*numgroups); + grouplist = ZG_Malloc(&loadmodel->memgroup, sizeof(galiasgroup_t)*numgroups); for(surf = root;;) { - surf->groupofs = (char*)grouplist - (char*)surf; + surf->groupofs = grouplist; surf->groups = numgroups; if (!surf->nextsurf) break; - surf = (galiasinfo_t*)((char*)surf + surf->nextsurf); + surf = surf->nextsurf; } for (i = 0; i < numgroups; i++) { grouplist[i] = newgroup[i]; - grouplist[i].poseofs = (char*)poseofs[i] - (char*)&grouplist[i]; + grouplist[i].boneofs = poseofs[i]; } - - hunkend = Hunk_LowMark (); - mod->flags = Mod_ReadFlagsFromMD1(mod->name, 0); //file replacement - inherit flags from any defunc mdl files. Mod_ClampModelSize(mod); - Hunk_Alloc(0); - hunktotal = hunkend - hunkstart; - - Cache_Alloc (&mod->cache, hunktotal, loadname); mod->type = mod_alias; - if (!mod->cache.data) - { - Hunk_FreeToLowMark (hunkstart); - return false; - } - memcpy (mod->cache.data, root, hunktotal); - - Hunk_FreeToLowMark (hunkstart); - + mod->meshinfo = root; mod->funcs.NativeTrace = Mod_Trace; return true; diff --git a/engine/common/com_mesh.h b/engine/common/com_mesh.h index a2db7b5c4..e0b7d199b 100644 --- a/engine/common/com_mesh.h +++ b/engine/common/com_mesh.h @@ -9,27 +9,14 @@ int HLMod_BoneForName(model_t *mod, char *name); int HLMod_FrameForName(model_t *mod, char *name); -//frame is an index into this +//a single pose within an animation (note: always refered to via a framegroup, even if there's only one frame in that group). typedef struct { -#ifdef SKELETALMODELS - qboolean isheirachical; //for models with transforms, states that bones need to be transformed from their parent. - //this is actually bad, and can result in bones shortening as they interpolate. -#endif - qboolean loop; - int numposes; - float rate; - int poseofs; - char name[64]; -} galiasgroup_t; - -typedef struct -{ - int ofsverts; + vecV_t *ofsverts; #ifndef SERVERONLY - int ofsnormals; - int ofstvector; - int ofssvector; + vec3_t *ofsnormals; + vec3_t *ofstvector; + vec3_t *ofssvector; vboarray_t vboverts; vboarray_t vbonormals; @@ -41,6 +28,21 @@ typedef struct vec3_t scale_origin; } galiaspose_t; +//a frame group (aka: animation) +typedef struct +{ +#ifdef SKELETALMODELS + qboolean isheirachical; //for models with transforms, states that bones need to be transformed from their parent. + //this is actually bad, and can result in bones shortening as they interpolate. +#endif + qboolean loop; + int numposes; + float rate; + galiaspose_t *poseofs; + float *boneofs; //numposes*12*numbones + char name[64]; +} galiasgroup_t; + typedef struct galiasbone_s galiasbone_t; #ifdef SKELETALMODELS struct galiasbone_s @@ -65,17 +67,19 @@ typedef struct //we can't be bothered with animating skins. //We'll load up to four of them but after that you're on your own #ifndef SERVERONLY -typedef struct { +typedef struct +{ int skinwidth; int skinheight; - int ofstexels; //this is 8bit for frame 0 only. only valid in q1 models without replacement textures, used for colourising player skins. + qbyte **ofstexels; //this is 8bit for frame 0 only. only valid in q1 models without replacement textures, used for colourising player skins. float skinspeed; int numshaders; - int ofsshaders; - char name [MAX_QPATH]; + shader_t **ofsshaders; + char name[MAX_QPATH]; } galiasskin_t; -typedef struct { +typedef struct +{ char name[MAX_QPATH]; texnums_t texnum; unsigned int tcolour; @@ -87,16 +91,23 @@ typedef struct { } galiascolourmapped_t; #endif +typedef struct +{ + char name[64]; + vec3_t org; + float ang[3][3]; +} md3tag_t; -typedef struct { - int ofs_indexes; +typedef struct galiasinfo_s +{ + index_t *ofs_indexes; int numindexes; - int ofs_trineighbours; + int *ofs_trineighbours; int numskins; #ifndef SERVERONLY - int ofsskins; + galiasskin_t *ofsskins; #endif int shares_verts; //used with models with two shaders using the same vertex. set to the surface number to inherit from (or itself). @@ -105,27 +116,27 @@ typedef struct { int numverts; #ifndef SERVERONLY - int ofs_st_array; + vec2_t *ofs_st_array; #endif int groups; - int groupofs; - int baseframeofs; /*non-heirachical*/ + galiasgroup_t *groupofs; - int nextsurf; + struct galiasinfo_s *nextsurf; #ifdef SKELETALMODELS + float *baseframeofs; /*non-heirachical*/ int numbones; - int ofsbones; + galiasbone_t *ofsbones; int numswtransforms; - int ofsswtransforms; + galisskeletaltransforms_t *ofsswtransforms; - int ofs_skel_xyz; - int ofs_skel_norm; - int ofs_skel_svect; - int ofs_skel_tvect; - int ofs_skel_idx; - int ofs_skel_weight; + vecV_t *ofs_skel_xyz; + vec3_t *ofs_skel_norm; + vec3_t *ofs_skel_svect; + vec3_t *ofs_skel_tvect; + byte_vec4_t *ofs_skel_idx; + vec4_t *ofs_skel_weight; vboarray_t vbo_skel_verts; vboarray_t vbo_skel_normals; @@ -140,7 +151,7 @@ typedef struct { //these exist only in the root mesh. int numtagframes; int numtags; - int ofstags; + md3tag_t *ofstags; } galiasinfo_t; float *Alias_GetBonePositions(galiasinfo_t *inf, framestate_t *fstate, float *buffer, int buffersize, qboolean renderable); diff --git a/engine/common/common.c b/engine/common/common.c index 96ce14773..3ffbf2f69 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -1513,7 +1513,7 @@ void MSG_ReadDir (vec3_t dir) VectorCopy (bytedirs[b], dir); } #endif -#ifdef Q2SERVER +#if 1//def Q2SERVER void MSG_WriteDir (sizebuf_t *sb, vec3_t dir) { int i, best; diff --git a/engine/common/common.h b/engine/common/common.h index 48bf95277..76ebd005a 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -433,9 +433,8 @@ void FS_PureMode(int mode, char *packagelist, char *crclist, int seed); //implie qbyte *QDECL COM_LoadStackFile (const char *path, void *buffer, int bufsize); qbyte *COM_LoadTempFile (const char *path); qbyte *COM_LoadTempMoreFile (const char *path); //allocates a little bit more without freeing old temp -qbyte *COM_LoadHunkFile (const char *path); +//qbyte *COM_LoadHunkFile (const char *path); qbyte *COM_LoadMallocFile (const char *path); -void COM_LoadCacheFile (const char *path, struct cache_user_s *cu); searchpathfuncs_t *COM_IteratePaths (void **iterator, char *buffer, int buffersize); void COM_FlushFSCache(void); //a file was written using fopen @@ -472,6 +471,8 @@ void COM_Gamedir (const char *dir); char *FS_GetGamedir(void); char *FS_GetBasedir(void); +struct zonegroup_s; +void *FS_LoadMallocGroupFile(struct zonegroup_s *ctx, char *path); qbyte *FS_LoadMallocFile (const char *path); int FS_LoadFile(char *name, void **file); void FS_FreeFile(void *file); diff --git a/engine/common/fs.c b/engine/common/fs.c index 591d7c064..92c6d6025 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -1387,8 +1387,6 @@ qboolean FS_Copy(const char *source, const char *dest, enum fs_relative relative return result; } - -static cache_user_t *loadcache; static qbyte *loadbuf; static int loadsize; @@ -1423,12 +1421,8 @@ qbyte *COM_LoadFile (const char *path, int usehunk) if (usehunk == 0) buf = (qbyte*)Z_Malloc (len+1); - else if (usehunk == 1) - buf = (qbyte*)Hunk_AllocName (len+1, base); else if (usehunk == 2) buf = (qbyte*)Hunk_TempAlloc (len+1); - else if (usehunk == 3) - buf = (qbyte*)Cache_Alloc (loadcache, len+1, base); else if (usehunk == 4) { if (len+1 > loadsize) @@ -1462,9 +1456,26 @@ qbyte *FS_LoadMallocFile (const char *path) return COM_LoadFile (path, 5); } -qbyte *COM_LoadHunkFile (const char *path) +void *FS_LoadMallocGroupFile(zonegroup_t *ctx, char *path) { - return COM_LoadFile (path, 1); + char *mem = NULL; + vfsfile_t *f = FS_OpenVFS(path, "rb", FS_GAME); + if (f) + { + int len = VFS_GETLEN(f); + mem = ZG_Malloc(ctx, len+1); + if (mem) + { + mem[len] = 0; + if (VFS_READ(f, mem, len) == len) + com_filesize = len; + else + mem = NULL; + } + + VFS_CLOSE(f); + } + return mem; } qbyte *COM_LoadTempFile (const char *path) @@ -1476,12 +1487,6 @@ qbyte *COM_LoadTempMoreFile (const char *path) return COM_LoadFile (path, 6); } -void COM_LoadCacheFile (const char *path, struct cache_user_s *cu) -{ - loadcache = cu; - COM_LoadFile (path, 3); -} - // uses temp hunk if larger than bufsize qbyte *QDECL COM_LoadStackFile (const char *path, void *buffer, int bufsize) { diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index 550f90f3a..589125dc8 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -31,11 +31,11 @@ extern cvar_t r_shadow_bumpscale_basetexture; //these are in model.c (or gl_model.c) -qboolean RMod_LoadVertexes (lump_t *l); -qboolean RMod_LoadEdges (lump_t *l, qboolean lm); -qboolean RMod_LoadMarksurfaces (lump_t *l, qboolean lm); -qboolean RMod_LoadSurfedges (lump_t *l); -void RMod_LoadLighting (lump_t *l); +qboolean Mod_LoadVertexes (lump_t *l); +qboolean Mod_LoadEdges (lump_t *l, qboolean lm); +qboolean Mod_LoadMarksurfaces (lump_t *l, qboolean lm); +qboolean Mod_LoadSurfedges (lump_t *l); +void Mod_LoadLighting (lump_t *l); qboolean CM_Trace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, trace_t *trace); @@ -47,7 +47,7 @@ unsigned int Q2BSP_PointContents(model_t *mod, vec3_t axis[3], vec3_t p); extern char loadname[32]; extern model_t *loadmodel; -void RMod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *mod, msurface_t *surf, void *cookie), void *buildcookie); +void Mod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *mod, msurface_t *surf, void *cookie), void *buildcookie); float RadiusFromBounds (vec3_t mins, vec3_t maxs) { int i; @@ -873,7 +873,7 @@ static void CM_CreatePatch( q3cpatch_t *patch, q2mapsurface_t *shaderref, const { qbyte *data; - data = Hunk_AllocName( patch->numfacets * sizeof( q2cbrush_t ) + totalsides * ( sizeof( q2cbrushside_t ) + sizeof( mplane_t ) ), "patch"); + data = ZG_Malloc(&loadmodel->memgroup, patch->numfacets * sizeof( q2cbrush_t ) + totalsides * ( sizeof( q2cbrushside_t ) + sizeof( mplane_t ) )); patch->facets = ( q2cbrush_t * )data; data += patch->numfacets * sizeof( q2cbrush_t ); memcpy( patch->facets, facets, patch->numfacets * sizeof( q2cbrush_t ) ); @@ -1102,7 +1102,7 @@ qboolean CMod_LoadSurfaces (lump_t *l) // Host_Error ("Map has too many surfaces"); numtexinfo = count; - out = map_surfaces = Hunk_AllocName(count * sizeof(*map_surfaces), "surfaces"); + out = map_surfaces = ZG_Malloc(&loadmodel->memgroup, count * sizeof(*map_surfaces)); for ( i=0 ; icontents = LittleLong(wal->contents); wal->value = LittleLong(wal->value); - tex = Hunk_AllocName(sizeof(texture_t), ln); + tex = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t)); tex->offsets[0] = wal->offsets[0]; tex->width = wal->width; @@ -1210,9 +1210,9 @@ qboolean CMod_LoadTexInfo (lump_t *l) //yes I know these load from the same plac return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); - loadmodel->textures = Hunk_AllocName(sizeof(texture_t *)*count, loadname); + loadmodel->textures = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t *)*count); texcount = 0; loadmodel->texinfo = out; @@ -1266,7 +1266,7 @@ qboolean CMod_LoadTexInfo (lump_t *l) //yes I know these load from the same plac out->texture = Mod_LoadWall (name, sname); if (!out->texture || !out->texture->width || !out->texture->height) { - out->texture = Hunk_AllocName(sizeof(texture_t) + 16*16+8*8+4*4+2*2, in->texture); + out->texture = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t) + 16*16+8*8+4*4+2*2); Con_Printf (CON_WARNING "Couldn't load %s\n", name); memcpy(out->texture, r_notexture_mip, sizeof(texture_t) + 16*16+8*8+4*4+2*2); @@ -1354,7 +1354,7 @@ qboolean CMod_LoadFaces (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( (count+6)*sizeof(*out), loadname); //spare for skybox + out = ZG_Malloc(&loadmodel->memgroup, (count+6)*sizeof(*out)); //spare for skybox loadmodel->surfaces = out; loadmodel->numsurfaces = count; @@ -1462,7 +1462,7 @@ qboolean CMod_LoadNodes (lump_t *l) return false; } - out = Hunk_AllocName(sizeof(mnode_t)*count, "nodes"); + out = ZG_Malloc(&loadmodel->memgroup, sizeof(mnode_t)*count); loadmodel->nodes = out; loadmodel->numnodes = count; @@ -1525,7 +1525,7 @@ qboolean CMod_LoadBrushes (lump_t *l) return false; } - map_brushes = Hunk_AllocName(sizeof(*out) * (count+1), "brushes"); + map_brushes = ZG_Malloc(&loadmodel->memgroup, sizeof(*out) * (count+1)); out = map_brushes; @@ -1871,7 +1871,7 @@ qboolean CMod_LoadVisibility (lump_t *l) // return false; // } - map_q2vis = Hunk_AllocName(l->filelen, "vis"); + map_q2vis = ZG_Malloc(&loadmodel->memgroup, l->filelen); memcpy (map_q2vis, cmod_base + l->fileofs, l->filelen); loadmodel->vis = map_q2vis; @@ -1897,7 +1897,7 @@ void CMod_LoadEntityString (lump_t *l) // if (l->filelen > MAX_Q2MAP_ENTSTRING) // Host_Error ("Map has too large entity lump"); - map_entitystring = Hunk_AllocName(l->filelen+1, "ents"); + map_entitystring = ZG_Malloc(&loadmodel->memgroup, l->filelen+1); memcpy (map_entitystring, cmod_base + l->fileofs, l->filelen); loadmodel->entities = map_entitystring; @@ -1919,7 +1919,7 @@ qboolean CModQ3_LoadMarksurfaces (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->marksurfaces = out; loadmodel->nummarksurfaces = count; @@ -2036,15 +2036,15 @@ qboolean CModQ3_LoadShaders (lump_t *l) // Host_Error ("Map has too many shaders"); numtexinfo = count; - out = map_surfaces = Hunk_AllocName(count*sizeof(*out), "tsurfaces"); + out = map_surfaces = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); - loadmodel->texinfo = Hunk_AllocName(sizeof(mtexinfo_t)*count, "texinfo"); + loadmodel->texinfo = ZG_Malloc(&loadmodel->memgroup, sizeof(mtexinfo_t)*count); loadmodel->numtextures = count; - loadmodel->textures = Hunk_AllocName(sizeof(texture_t*)*count, "textures"); + loadmodel->textures = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t*)*count); for ( i=0 ; itexinfo[i].texture = Hunk_AllocName(sizeof(texture_t), in->shadername); + loadmodel->texinfo[i].texture = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t)); Q_strncpyz(loadmodel->texinfo[i].texture->name, in->shadername, sizeof(loadmodel->texinfo[i].texture->name)); loadmodel->textures[i] = loadmodel->texinfo[i].texture; @@ -2078,13 +2078,13 @@ qboolean CModQ3_LoadVertexes (lump_t *l) return false; } - out = Hunk_AllocName ( count*sizeof(*out), "vert_v"); - stout = Hunk_AllocName ( count*sizeof(*stout), "vert_st"); - lmout = Hunk_AllocName ( count*sizeof(*lmout), "vert_lm1"); - cout = Hunk_AllocName ( count*sizeof(*cout), "vert_c"); - nout = Hunk_AllocName ( count*sizeof(*nout), "vert_n"); - sout = Hunk_AllocName ( count*sizeof(*nout), "vert_s"); - tout = Hunk_AllocName ( count*sizeof(*nout), "vert_t"); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); + stout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*stout)); + lmout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*lmout)); + cout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*cout)); + nout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*nout)); + sout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*nout)); + tout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*nout)); map_verts = out; map_vertstmexcoords = stout; map_vertlstmexcoords[0] = lmout; @@ -2142,13 +2142,13 @@ qboolean CModRBSP_LoadVertexes (lump_t *l) return false; } - out = Hunk_AllocName ( count*sizeof(*out), "vert_v"); - stout = Hunk_AllocName ( count*sizeof(*stout), "vert_st"); - lmout = Hunk_AllocName ( MAXLIGHTMAPS*count*sizeof(*lmout), "vert_lm4"); - cout = Hunk_AllocName ( count*sizeof(*cout), "vert_c"); - nout = Hunk_AllocName ( count*sizeof(*nout), "vert_n"); - sout = Hunk_AllocName ( count*sizeof(*sout), "vert_s"); - tout = Hunk_AllocName ( count*sizeof(*tout), "vert_t"); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); + stout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*stout)); + lmout = ZG_Malloc(&loadmodel->memgroup, MAXLIGHTMAPS*count*sizeof(*lmout)); + cout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*cout)); + nout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*nout)); + sout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*sout)); + tout = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*tout)); map_verts = out; map_vertstmexcoords = stout; for (sty = 0; sty < MAXLIGHTMAPS; sty++) @@ -2191,7 +2191,7 @@ qboolean CModQ3_LoadIndexes (lump_t *l) in = (void *)(mod_base + l->fileofs); if (l->filelen % sizeof(*in)) { - Con_Printf (CON_ERROR "MOD_LoadBmodel: funny lump size in %s\n",loadmodel->name); + Con_Printf (CON_ERROR "MOD_LoadBmodel: funny lump size in %s\n", loadmodel->name); return false; } count = l->filelen / sizeof(*in); @@ -2202,7 +2202,7 @@ qboolean CModQ3_LoadIndexes (lump_t *l) return false; } - out = Hunk_AllocName ( count*sizeof(*out), loadmodel->name ); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); map_surfindexes = out; map_numsurfindexes = count; @@ -2321,7 +2321,7 @@ qboolean CModQ3_LoadFogs (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), "fogs"); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); map_fogs = out; map_numfogs = count; @@ -2341,7 +2341,7 @@ qboolean CModQ3_LoadFogs (lump_t *l) out->shader = R_RegisterShader_Lightmap ( in->shader ); R_BuildDefaultTexnums(&out->shader->defaulttextures, out->shader); out->numplanes = brush->numsides; - out->planes = Hunk_AllocName ( out->numplanes*sizeof(cplane_t *), "fogplane"); + out->planes = ZG_Malloc(&loadmodel->memgroup, out->numplanes*sizeof(cplane_t *)); for ( j = 0; j < out->numplanes; j++ ) { @@ -2686,9 +2686,9 @@ qboolean CModQ3_LoadRFaces (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadmodel->name ); - pl = Hunk_AllocName (count*sizeof(*pl), loadmodel->name);//create a new array of planes for speed. - mesh = Hunk_AllocName (count*sizeof(*mesh), loadmodel->name); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); + pl = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*pl));//create a new array of planes for speed. + mesh = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*mesh)); loadmodel->surfaces = out; loadmodel->numsurfaces = count; @@ -2802,9 +2802,9 @@ qboolean CModRBSP_LoadRFaces (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadmodel->name ); - pl = Hunk_AllocName (count*sizeof(*pl), loadmodel->name);//create a new array of planes for speed. - mesh = Hunk_AllocName (count*sizeof(*mesh), loadmodel->name); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); + pl = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*pl));//create a new array of planes for speed. + mesh = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*mesh)); loadmodel->surfaces = out; loadmodel->numsurfaces = count; @@ -2950,7 +2950,7 @@ qboolean CModQ3_LoadNodes (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); if (count > SANITY_MAX_MAP_NODES) { @@ -3018,7 +3018,7 @@ qboolean CModQ3_LoadBrushes (lump_t *l) return false; } - map_brushes = Hunk_AllocName(sizeof(*out) * (count+1), "brushes"); + map_brushes = ZG_Malloc(&loadmodel->memgroup, sizeof(*out) * (count+1)); out = map_brushes; @@ -3307,7 +3307,7 @@ qboolean CModQ3_LoadVisibility (lump_t *l) numclusters++; - map_q3pvs = Hunk_AllocName(sizeof(*map_q3pvs) + (numclusters+7)/8 * numclusters, "pvs"); + map_q3pvs = ZG_Malloc(&loadmodel->memgroup, sizeof(*map_q3pvs) + (numclusters+7)/8 * numclusters); memset (map_q3pvs, 0xff, sizeof(*map_q3pvs) + (numclusters+7)/8 * numclusters); map_q3pvs->numclusters = numclusters; numvisibility = 0; @@ -3317,7 +3317,7 @@ qboolean CModQ3_LoadVisibility (lump_t *l) { numvisibility = l->filelen; - map_q3pvs = Hunk_AllocName(l->filelen, "pvs"); + map_q3pvs = ZG_Malloc(&loadmodel->memgroup, l->filelen); loadmodel->vis = (q2dvis_t *)map_q3pvs; memcpy (map_q3pvs, cmod_base + l->fileofs, l->filelen); @@ -3352,7 +3352,7 @@ void CModQ3_LoadLighting (lump_t *l) BuildLightMapGammaTable(1, (1<<(2-gl_overbright.ival))); loadmodel->engineflags |= MDLF_RGBLIGHTING; - loadmodel->lightdata = out = Hunk_AllocName(samples, "lit data"); + loadmodel->lightdata = out = ZG_Malloc(&loadmodel->memgroup, samples); //be careful here, q3bsp deluxemapping is done using interleaving. we want to unoverbright ONLY lightmaps and not deluxemaps. for (m = 0; m < maps; m++) @@ -3395,7 +3395,7 @@ qboolean CModQ3_LoadLightgrid (lump_t *l) return false; } count = l->filelen / sizeof(*in); - grid = Hunk_AllocName (sizeof(q3lightgridinfo_t) + count*sizeof(*out), loadmodel->name ); + grid = ZG_Malloc(&loadmodel->memgroup, sizeof(q3lightgridinfo_t) + count*sizeof(*out)); grid->lightgrid = (dq3gridlight_t*)(grid+1); out = grid->lightgrid; @@ -3429,7 +3429,7 @@ qboolean CModRBSP_LoadLightgrid (lump_t *elements, lump_t *indexes) icount = indexes->filelen / sizeof(*iin); ecount = elements->filelen / sizeof(*ein); - grid = Hunk_AllocName (sizeof(q3lightgridinfo_t) + ecount*sizeof(*eout) + icount*sizeof(*iout), loadmodel->name ); + grid = ZG_Malloc(&loadmodel->memgroup, sizeof(q3lightgridinfo_t) + ecount*sizeof(*eout) + icount*sizeof(*iout)); grid->rbspelements = (rbspgridlight_t*)((char *)grid + sizeof(q3lightgridinfo_t)); grid->rbspindexes = (unsigned short*)((char *)grid + sizeof(q3lightgridinfo_t) + ecount*sizeof(*eout)); eout = grid->rbspelements; @@ -3559,7 +3559,7 @@ void CMQ3_CalcPHS (void) Con_DPrintf ("Building PHS...\n"); - map_q3phs = Hunk_AllocName(sizeof(*map_q3phs) + map_q3pvs->rowsize * map_q3pvs->numclusters, "phs"); + map_q3phs = ZG_Malloc(&loadmodel->memgroup, sizeof(*map_q3phs) + map_q3pvs->rowsize * map_q3pvs->numclusters); rowwords = map_q3pvs->rowsize / sizeof(int); rowbytes = map_q3pvs->rowsize; @@ -3752,7 +3752,6 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c int length; static unsigned last_checksum; qboolean noerrors = true; - int start; model_t *im = loadmodel; void (*buildmeshes)(model_t *mod, msurface_t *surf, void *cookie) = NULL; @@ -3796,7 +3795,6 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c header.version = LittleLong(header.version); cmod_base = mod_base = (qbyte *)buf; - start = Hunk_LowMark(); if (header.ident == (('F'<<0)+('B'<<8)+('S'<<16)+('P'<<24))) { @@ -3962,8 +3960,6 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c BZ_Free(map_faces); if (map_leaffaces) BZ_Free(map_leaffaces); - - Hunk_FreeToLowMark(start); return NULL; } @@ -4012,7 +4008,6 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c { BZ_Free(map_faces); BZ_Free(map_leaffaces); - Hunk_FreeToLowMark(start); return NULL; } #ifndef CLIENTONLY @@ -4077,11 +4072,11 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c case QR_OPENGL: // load into heap #ifndef SERVERONLY - noerrors = noerrors && RMod_LoadVertexes (&header.lumps[Q2LUMP_VERTEXES]); - noerrors = noerrors && RMod_LoadEdges (&header.lumps[Q2LUMP_EDGES], false); - noerrors = noerrors && RMod_LoadSurfedges (&header.lumps[Q2LUMP_SURFEDGES]); + noerrors = noerrors && Mod_LoadVertexes (&header.lumps[Q2LUMP_VERTEXES]); + noerrors = noerrors && Mod_LoadEdges (&header.lumps[Q2LUMP_EDGES], false); + noerrors = noerrors && Mod_LoadSurfedges (&header.lumps[Q2LUMP_SURFEDGES]); if (noerrors) - RMod_LoadLighting (&header.lumps[Q2LUMP_LIGHTING]); + Mod_LoadLighting (&header.lumps[Q2LUMP_LIGHTING]); #endif noerrors = noerrors && CMod_LoadSurfaces (&header.lumps[Q2LUMP_TEXINFO]); noerrors = noerrors && CMod_LoadLeafBrushes (&header.lumps[Q2LUMP_LEAFBRUSHES]); @@ -4089,7 +4084,7 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c #ifndef SERVERONLY noerrors = noerrors && CMod_LoadTexInfo (&header.lumps[Q2LUMP_TEXINFO]); noerrors = noerrors && CMod_LoadFaces (&header.lumps[Q2LUMP_FACES]); - noerrors = noerrors && RMod_LoadMarksurfaces (&header.lumps[Q2LUMP_LEAFFACES], false); + noerrors = noerrors && Mod_LoadMarksurfaces (&header.lumps[Q2LUMP_LEAFFACES], false); #endif noerrors = noerrors && CMod_LoadVisibility (&header.lumps[Q2LUMP_VISIBILITY]); noerrors = noerrors && CMod_LoadBrushes (&header.lumps[Q2LUMP_BRUSHES]); @@ -4104,7 +4099,6 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c if (!noerrors) { - Hunk_FreeToLowMark(start); return NULL; } #ifndef CLIENTONLY @@ -4123,7 +4117,6 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c break; #endif default: - Hunk_FreeToLowMark(start); return NULL; Sys_Error("Bad internal renderer on q2 map load\n"); } @@ -4148,7 +4141,7 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c loadmodel->vbos = NULL; #ifndef SERVERONLY if (qrenderer != QR_NONE) - RMod_Batches_Build(NULL, loadmodel, buildmeshes, buildcookie); + Mod_Batches_Build(NULL, loadmodel, buildmeshes, buildcookie); #endif loadmodel->numsubmodels = CM_NumInlineModels(loadmodel); @@ -4177,6 +4170,7 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c *loadmodel = *mod; strcpy (loadmodel->name, name); mod = loadmodel; + memset(&mod->memgroup, 0, sizeof(mod->memgroup)); bm = CM_InlineModel (name); @@ -4196,7 +4190,7 @@ cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned *c mod->vbos = NULL; #ifndef SERVERONLY if (qrenderer != QR_NONE) - RMod_Batches_Build(NULL, mod, buildmeshes, buildcookie); + Mod_Batches_Build(NULL, mod, buildmeshes, buildcookie); #endif VectorCopy (bm->maxs, mod->maxs); @@ -4321,7 +4315,7 @@ void CM_InitBoxHull (void) box_model.hulls[0].available = true; - box_model.nodes = Hunk_Alloc(sizeof(mnode_t)*6); + box_model.nodes = ZG_Malloc(&loadmodel->memgroup, sizeof(mnode_t)*6); box_planes = &map_planes[numplanes]; if (numbrushes+1 > SANITY_MAX_MAP_BRUSHES || numleafbrushes+1 > MAX_Q2MAP_LEAFBRUSHES diff --git a/engine/common/mathlib.h b/engine/common/mathlib.h index 76307c9db..5f6fb9e39 100644 --- a/engine/common/mathlib.h +++ b/engine/common/mathlib.h @@ -95,6 +95,7 @@ extern vec3_t vec3_origin; #define Vector4Scale(in,scale,out) ((out)[0]=(in)[0]*scale,(out)[1]=(in)[1]*scale,(out)[2]=(in)[2]*scale,(out)[3]=(in)[3]*scale) #define Vector4Add(a,b,c) ((c)[0]=(((a[0])+(b[0]))),(c)[1]=(((a[1])+(b[1]))),(c)[2]=(((a[2])+(b[2]))),(c)[3]=(((a[3])+(b[3])))) #define Vector4Set(r,x,y,z,w) {(r)[0] = x; (r)[1] = y;(r)[2] = z;(r)[3]=w;} +#define Vector4Interpolate(a, bness, b, c) FloatInterpolate((a)[0], bness, (b)[0], (c)[0]),FloatInterpolate((a)[1], bness, (b)[1], (c)[1]),FloatInterpolate((a)[2], bness, (b)[2], (c)[2]),FloatInterpolate((a)[3], bness, (b)[3], (c)[3]) typedef float matrix3x4[3][4]; typedef float matrix3x3[3][3]; diff --git a/engine/common/plugin.c b/engine/common/plugin.c index b1c1aa9a8..db632e220 100644 --- a/engine/common/plugin.c +++ b/engine/common/plugin.c @@ -1216,7 +1216,7 @@ void Plug_Load_f(void) } if (!Plug_Load(plugin, PLUG_EITHER)) { - if (!Plug_Load(va("plugins/%s", plugin), PLUG_EITHER)) + if (!Plug_Load(va("plugins/%s", plugin), PLUG_QVM)) Con_Printf("Couldn't load plugin %s\n", Cmd_Argv(1)); } } diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index 2c4e7f183..3dce75e01 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -27,8 +27,10 @@ void PF_Common_RegisterCvars(void) Cvar_Register (&pr_tempstringsize, cvargroup_progs); Cvar_Register (&pr_enable_uriget, cvargroup_progs); +#ifdef RAGDOLL Cmd_AddCommand("skel_info", skel_info_f); Cmd_AddCommand("skel_generateragdoll", skel_generateragdoll_f); +#endif WPhys_Init(); } diff --git a/engine/common/q1bsp.c b/engine/common/q1bsp.c index 6a1c068f0..f06da6521 100644 --- a/engine/common/q1bsp.c +++ b/engine/common/q1bsp.c @@ -809,7 +809,7 @@ void Q1BSP_LoadBrushes(model_t *model) if (permodel->modelnum) rootnode += model->submodels[permodel->modelnum-1].headnode[0]; - brush = Hunk_Alloc((sizeof(*brush) - sizeof(brush->planes[0]))*permodel->numbrushes + sizeof(brush->planes[0])*(permodel->numbrushes*6+permodel->numplanes)); + brush = ZG_Malloc(&model->memgroup, (sizeof(*brush) - sizeof(brush->planes[0]))*permodel->numbrushes + sizeof(brush->planes[0])*(permodel->numbrushes*6+permodel->numplanes)); remainingplanes = permodel->numplanes; perbrush = (void*)(permodel+1); for (br = 0; br < permodel->numbrushes; br++) diff --git a/engine/common/tlout.h b/engine/common/tlout.h index fcb50b11e..45a3e5859 100644 --- a/engine/common/tlout.h +++ b/engine/common/tlout.h @@ -134,7 +134,6 @@ "TL_NETBINDINTERFACE \"Binding to IP Interface Address of %s\\n\"\n" "TL_IPADDRESSIS \"IP address %s\\n\"\n" "TL_UDPINITED \"UDP Initialized\\n\"\n" -"TL_SERVERPORTINITED \"Server port Initialized\\n\"\n" "TL_CLIENTPORTINITED \"Client port Initialized\\n\"\n" "TL_OUTMESSAGEOVERFLOW \"%s:Outgoing message overflow\\n\"\n" "TL_OUTOFORDERPACKET \"%s:Out of order packet %i at %i\\n\"\n" diff --git a/engine/common/translate.c b/engine/common/translate.c index fb38a3b34..af164380b 100644 --- a/engine/common/translate.c +++ b/engine/common/translate.c @@ -138,7 +138,6 @@ static char *defaultlanguagetext = "TL_NETSENDERROR \"NET_SendPacket ERROR: %i\\n\"\n" "TL_NETBINDINTERFACE \"Binding to IP Interface Address of %s\\n\"\n" "TL_IPADDRESSIS \"IP address %s\\n\"\n" -"TL_SERVERPORTINITED \"Server port Initialized\\n\"\n" "TL_CLIENTPORTINITED \"Client port Initialized\\n\"\n" "TL_OUTMESSAGEOVERFLOW \"%s:Outgoing message overflow\\n\"\n" "TL_OUTOFORDERPACKET \"%s:Out of order packet %i at %i\\n\"\n" diff --git a/engine/common/translate.h b/engine/common/translate.h index 11992a3e5..d897628d6 100644 --- a/engine/common/translate.h +++ b/engine/common/translate.h @@ -170,7 +170,6 @@ NAME(TL_NETSENDERROR) NAME(TL_NETBINDINTERFACE) NAME(TL_IPADDRESSIS) - NAME(TL_SERVERPORTINITED) NAME(TL_CLIENTPORTINITED) NAME(TL_OUTMESSAGEOVERFLOW) diff --git a/engine/common/world.h b/engine/common/world.h index 66ff1f3a5..6f10c11e9 100644 --- a/engine/common/world.h +++ b/engine/common/world.h @@ -269,11 +269,11 @@ void VARGS WorldQ2_UnlinkEdict(world_t *w, q2edict_t *ent); int VARGS WorldQ2_AreaEdicts (world_t *w, vec3_t mins, vec3_t maxs, q2edict_t **list, int maxcount, int areatype); trace_t WorldQ2_Move (world_t *w, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int hitcontentsmask, q2edict_t *passedict); - +#endif +#ifdef Q2BSPS unsigned int Q2BSP_FatPVS (model_t *mod, vec3_t org, qbyte *buffer, unsigned int buffersize, qboolean add); qboolean Q2BSP_EdictInFatPVS(model_t *mod, struct pvscache_s *ent, qbyte *pvs); void Q2BSP_FindTouchedLeafs(model_t *mod, struct pvscache_s *ent, float *mins, float *maxs); - #endif diff --git a/engine/common/zone.c b/engine/common/zone.c index 1bf1d8059..95200ce3c 100644 --- a/engine/common/zone.c +++ b/engine/common/zone.c @@ -28,10 +28,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #undef free #define NOZONE -#define NOCACHE - -void Cache_FreeLow (int new_low_hunk); -void Cache_FreeHigh (int new_high_hunk); #ifdef _DEBUG //#define MEMDEBUG 8192 //Debugging adds sentinels (the number is the size - I have the ram) @@ -41,7 +37,6 @@ void Cache_FreeHigh (int new_high_hunk); #define TEMPDEBUG 4 #define ZONEDEBUG 4 #define HUNKDEBUG 4 -#define CACHEDEBUG 4 //these need to be defined because it makes some bits of code simpler #ifndef HUNKDEBUG @@ -53,11 +48,8 @@ void Cache_FreeHigh (int new_high_hunk); #ifndef TEMPDEBUG #define TEMPDEBUG 0 #endif -#ifndef CACHEDEBUG -#define CACHEDEBUG 0 -#endif -#if ZONEDEBUG>0 || HUNKDEBUG>0 || TEMPDEBUG>0||CACHEDEBUG>0 +#if ZONEDEBUG>0 || HUNKDEBUG>0 || TEMPDEBUG>0 qbyte sentinalkey; #endif @@ -443,1061 +435,43 @@ void BZ_Free(void *data) } -#if 0 //NOZONE //zone memory is for small dynamic things. -/* -void *Z_TagMalloc(int size, int tag) +typedef struct zonegroupblock_s { - return malloc(size); -} + struct zonegroupblock_s *next; +} zonegroupblock_t; -void *Z_Malloc(int size) -{ - qbyte *buf; - buf = Z_TagMalloc(size, 1); - if (!buf) - Sys_Error("Z_Malloc: Failed on allocation of %i bytes", size); - Q_memset(buf, 0, size); - return buf; -} - -void Z_Free (void *buf) -{ - free(buf); -} - -void Z_FreeTags (void *buf) -{ - free(buf); -} - -*/ - - - - - - - - - - - - - - - - - - -#define ZONEID 0x1d4a11 - -#define ZONESENTINAL 0xdeadbeaf - -typedef struct zone_s { -// int sentinal1; - - struct zone_s *next; - struct zone_s *prev; - int size; - int tag; - -// int sentinal2; -} zone_t; -zone_t *zone_head; -/* -void Z_CheckSentinals(void) -{ - zone_t *zone; - for(zone = zone_head; zone; zone=zone->next) - { - if (zone->sentinal1 != ZONESENTINAL || zone->sentinal2 != ZONESENTINAL) - Sys_Error("Memory sentinal destroyed\n"); - } -}*/ - - -void VARGS Z_Free (void *c) -{ - zone_t *nz; - nz = ((zone_t *)((char*)c-ZONEDEBUG))-1; - -// Z_CheckSentinals(); - -#if ZONEDEBUG>0 - { - int i; - qbyte *buf; - buf = (qbyte *)(nz+1); - for (i = 0; i < ZONEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("corrupt memory block (%i? bytes)\n", nz->size); - } - buf+=ZONEDEBUG; - //app data - buf += nz->size; - for (i = 0; i < ZONEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("corrupt memory block (%i? bytes)\n", nz->size); - } - } -#endif - -// if (nz->sentinal1 != ZONESENTINAL || nz->sentinal2 != ZONESENTINAL) -// Sys_Error("zone was not z_malloced\n"); - - if (nz->next) - nz->next->prev = nz->prev; - if (nz->prev) - nz->prev->next = nz->next; - - if (nz == zone_head) - zone_head = nz->next; - -// Con_Printf("Free of %i bytes\n", nz->size); - - free(nz); -} - -void BZ_CheckSentinals(void *c) -{ -#if ZONEDEBUG>0 - zone_t *nz; - nz = ((zone_t *)((char*)c-ZONEDEBUG))-1; - -// Z_CheckSentinals(); - { - int i; - qbyte *buf; - buf = (qbyte *)(nz+1); - for (i = 0; i < ZONEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("corrupt memory block (%i? bytes)\n", nz->size); - } - buf+=ZONEDEBUG; - //app data - buf += nz->size; - for (i = 0; i < ZONEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("corrupt memory block (%i? bytes)\n", nz->size); - } - } -#endif - -} - //revive this function each time you get memory corruption and need to trace it. -void BZ_CheckAllSentinals(void) -{ - zone_t *zone; - for(zone = zone_head; zone; zone=zone->next) - { - int i; - qbyte *buf; - buf = (qbyte *)(zone+1); - for (i = 0; i < ZONEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("corrupt memory block (%i? bytes)\n", zone->size); - } - buf+=ZONEDEBUG; - //app data - buf += zone->size; - for (i = 0; i < ZONEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("corrupt memory block (%i? bytes)\n", zone->size); - } - } -} - - -void VARGS Z_FreeTags(int tag) -{ - zone_t *zone, *next; - for(zone = zone_head; zone; zone=next) - { - next = zone->next; - if (zone->tag == tag) - Z_Free((char*)(zone+1)+ZONEDEBUG); - } -} - -#ifdef NAMEDMALLOCS -void *Z_BaseTagMalloc (int size, int tag, qboolean clear, char *descrip, ...) +#ifdef USE_MSVCRT_DEBUG +void *ZG_MallocNamed(zonegroup_t *ctx, int size, char *file, int line) #else -void *Z_BaseTagMalloc (int size, int tag, qboolean clear) +void *ZG_Malloc(zonegroup_t *ctx, int size) #endif { -#ifdef NAMEDMALLOCS - va_list argptr; - char buffer[512]; -#endif - void *buf; - zone_t *nt; - -// Z_CheckSentinals(); -//Con_Printf("Malloc of %i bytes\n", size); -//if (size>20) -//Con_Printf("Big malloc\n"); - if (size <= 0) - Sys_Error ("Z_Malloc: size %i", size); - -#ifdef NAMEDMALLOCS - - va_start (argptr, descrip); - vsprintf (buffer, descrip,argptr); - va_end (argptr); - - nt = (zone_t*)malloc(size + sizeof(zone_t)+strlen(buffer)+1 + ZONEDEBUG*2); + zonegroupblock_t *newm; + size += sizeof(zonegroupblock_t); //well, at least the memory will be pointer aligned... +#ifdef USE_MSVCRT_DEBUG + newm = Z_MallocNamed(size, file, line); #else - nt = (zone_t*)malloc(size + sizeof(zone_t)+ ZONEDEBUG*2); + newm = Z_Malloc(size); #endif - if (!nt) - Sys_Error("Z_BaseTagMalloc: failed on allocation of %i bytes", size); - nt->next = zone_head; - nt->prev = NULL; - nt->size = size; - nt->tag = tag; -// nt->sentinal1 = ZONESENTINAL; -// nt->sentinal2 = ZONESENTINAL; - if (zone_head) - zone_head->prev = nt; - zone_head = nt; - buf = (void *)(nt+1); - -#if ZONEDEBUG > 0 - memset(buf, sentinalkey, ZONEDEBUG); - buf = (char*)buf+ZONEDEBUG; - memset((char*)buf+size, sentinalkey, ZONEDEBUG); -#endif - - if (clear) - Q_memset(buf, 0, size); - -#ifdef NAMEDMALLOCS - strcpy((char *)(nt+1) + nt->size + ZONEDEBUG*2, buffer); -#endif - return buf; + newm->next = ctx->first; + ctx->first = newm; + ctx->bytes += size; + return(void*)(newm+1); } -void *VARGS Z_TagMalloc (int size, int tag) +void ZG_FreeGroup(zonegroup_t *ctx) { -#ifdef NAMEDMALLOCS - return Z_BaseTagMalloc(size, tag, true, ""); -#else - return Z_BaseTagMalloc(size, tag, true); -#endif -} - -#ifdef NAMEDMALLOCS -void *Z_MallocNamed (int size, char *file, int lineno) -{ - qbyte *buf; - buf = Z_BaseTagMalloc(size, 1, true, "%s: %i", file, lineno); - if (!buf) - Sys_Error("Z_Malloc: Failed on allocation of %i bytes", size); - return buf; -} -#else -void *Z_Malloc(int size) -{ - qbyte *buf; - buf = (qbyte*)Z_TagMalloc(size, 1); - if (!buf) - Sys_Error("Z_Malloc: Failed on allocation of %i bytes", size); - return buf; -} - - - -void *BZ_Malloc(int size) //Doesn't clear. The expectation is a large file, rather than sensative data structures. -{ - void *data = Z_BaseTagMalloc(size, 1, true); - if (!data) - Sys_Error("BZ_Malloc failed on %i bytes", size); - - return data; -} -#endif -void *BZF_Malloc(int size) //BZ_Malloc but allowed to fail - like straight malloc. -{ -#ifdef NAMEDMALLOCS - return Z_BaseTagMalloc(size, 1, false, ""); -#else - return Z_BaseTagMalloc(size, 1, false); -#endif -} - - -#ifdef NAMEDMALLOCS -void *BZ_NamedRealloc(void *data, int newsize, char *file, int lineno) -#else -void *BZ_Realloc(void *data, int newsize) -#endif -{ - zone_t *oldzone; - void *newdata; -#ifdef NAMEDMALLOCS - if (!data) - return Z_MallocNamed(newsize, file, lineno); - oldzone = ((zone_t *)((char *)data-ZONEDEBUG))-1; - if (oldzone->size == newsize) - return data; - newdata = Z_MallocNamed(newsize, file, lineno); -#else - if (!data) - return Z_Malloc(newsize); - oldzone = ((zone_t *)((char *)data-ZONEDEBUG))-1; - if (oldzone->size == newsize) - return data; - newdata = BZ_Malloc(newsize); -#endif - if (oldzone->size < newsize) + zonegroupblock_t *old; + while(ctx->first) { - memcpy(newdata, data, oldzone->size); - memset((char *)newdata + oldzone->size, 0, newsize - oldzone->size); + old = ctx->first; + ctx->first = old->next; + BZ_Free(old); } - else - memcpy(newdata, data, newsize); - BZ_Free(data); - - return newdata; + ctx->bytes = 0; } -void BZ_Free(void *data) -{ - Z_Free(data); -} - -#ifdef NAMEDMALLOCS - -// Zone_Groups_f: prints out zones sorting into groups -// and tracking number of allocs and total group size as -// well as a group delta against the last Zone_Group_f call -#define ZONEGROUPS 64 -void Zone_Groups_f(void) -{ - zone_t *zone; - char *zonename[ZONEGROUPS]; - int zonesize[ZONEGROUPS]; - int zoneallocs[ZONEGROUPS]; - static int zonelast[ZONEGROUPS]; - int groups, i; - int allocated = 0; - - // initialization - for (groups = 0; groups < ZONEGROUPS; groups++) - zonename[groups] = NULL; - - groups = 0; - i = 0; - - for (zone = zone_head; zone; zone=zone->next) - { - char *czg = (char *)(zone+1) + zone->size+ZONEDEBUG*2; - // check against existing tracked groups - for (i = 0; i < groups; i++) - { - if (!strcmp(czg, zonename[i])) - { - // update stats for tracked group - zonesize[i] += zone->size; - zoneallocs[i]++; - break; - } - } - - if (groups == i) // no existing group found - { - // track new zone group - zonename[groups] = czg; - zonesize[groups] = zone->size; - zoneallocs[groups] = 1; - groups++; - - // max groups bounds check - if (groups >= ZONEGROUPS) - { - groups = ZONEGROUPS; - break; - } - } - } - - // print group statistics - for (i = 0; i < groups; i++) - { - allocated += zonesize[i]; - Con_Printf("%s, size: %i, allocs: %i, delta: %i\n", zonename[i], zonesize[i], zoneallocs[i], zonesize[i] - zonelast[i]); - zonelast[i] = zonesize[i]; // update delta tracking for next call - } - - Con_Printf("Total: %i bytes\n", allocated); -} -#endif - -void Zone_Print_f(void) -{ - int overhead=0; - int allocated = 0; - int blocks = 0; - int futurehide = false; - int minsize = 0; - zone_t *zone; -#if ZONEDEBUG > 0 -#ifdef NAMEDMALLOCS - int i; - qbyte *sent; -#endif - qboolean testsent = false; - if (*Cmd_Argv(1) == 't') - { - Con_Printf("Testing Zone sentinels\n"); - testsent = true; - } - else -#endif - if (*Cmd_Argv(1) == 'h') - futurehide = true; - else if (*Cmd_Argv(1)) - minsize = atoi(Cmd_Argv(1)); - for(zone = zone_head; zone; zone=zone->next) - { - blocks++; - allocated+= zone->size; - -#ifdef NAMEDMALLOCS - if (*((char *)(zone+1)+zone->size+ZONEDEBUG*2)!='#') - { -#if ZONEDEBUG > 0 - if (testsent) - { - sent = (qbyte *)(zone+1); - for (i = 0; i < ZONEDEBUG; i++) - { - if (sent[i] != sentinalkey) - { - Con_Printf(CON_ERROR "%i %i-%s\n", zone->size, i, (char *)(zone+1) + zone->size+ZONEDEBUG*2); - break; - } - } - sent += zone->size+ZONEDEBUG; - for (i = 0; i < ZONEDEBUG; i++) - { - if (sent[i] != sentinalkey) - { - Con_Printf(CON_ERROR "%i %i-%s\n", zone->size, i, (char *)(zone+1) + zone->size+ZONEDEBUG*2); - break; - } - } - } - else if (zone->size >= minsize) -#endif - Con_Printf("%i-%s\n", zone->size, (char *)(zone+1) + zone->size+ZONEDEBUG*2); - if (futurehide) - *((char *)(zone+1)+zone->size+ZONEDEBUG*2) = '#'; - -// Sleep(10); - } - overhead += sizeof(zone_t)+ZONEDEBUG*2 + strlen((char *)(zone+1) + zone->size+ZONEDEBUG*2) +1; -#else - Con_Printf("%i-%i ", zone->size, zone->tag); - overhead += sizeof(zone_t)+ZONEDEBUG*2; -#endif - } - Con_Printf(CON_NOTICE "Zone:%i bytes in %i blocks\n", allocated, blocks); - Con_Printf(CON_NOTICE "Overhead %i bytes\n", overhead); -} - -#elif 0//#else - - - - - - - -//dmw was 0x50000 19/12/02 - playing with dynamic sound system. -//was 0x80000 15/01/03 - playing with genuine pk3 files -#define DYNAMIC_SIZE 0x100000 - -#define ZONEID 0x1d4a11 -#define MINFRAGMENT 64 - -typedef struct memblock_s -{ - int size; // including the header and possibly tiny fragments - int tag; // a tag of 0 is a free block - int id; // should be ZONEID - struct memblock_s *next, *prev; - int pad; // pad to 64 bit boundary -} memblock_t; - -typedef struct -{ - int size; // total bytes malloced, including header - memblock_t blocklist; // start / end cap for linked list - memblock_t *rover; -} memzone_t; - -/* -============================================================================== - - ZONE MEMORY ALLOCATION - -There is never any space between memblocks, and there will never be two -contiguous free memblocks. - -The rover can be left pointing at a non-empty block - -The zone calls are pretty much only used for small strings and structures, -all big things are allocated on the hunk. -============================================================================== -*/ - -memzone_t *mainzone; - -void Z_ClearZone (memzone_t *zone, int size); - - -/* -======================== -Z_ClearZone -======================== -*/ -void Z_ClearZone (memzone_t *zone, int size) -{ - memblock_t *block; - -// set the entire zone to one free block - - zone->blocklist.next = zone->blocklist.prev = block = - (memblock_t *)( (qbyte *)zone + sizeof(memzone_t) ); - zone->blocklist.tag = 1; // in use block - zone->blocklist.id = 0; - zone->blocklist.size = 0; - zone->rover = block; - - block->prev = block->next = &zone->blocklist; - block->tag = 0; // free block - block->id = ZONEID; - block->size = size - sizeof(memzone_t); -} - - -/* -======================== -Z_Free -======================== -*/ -void Z_Free (void *ptr) -{ - memblock_t *block, *other; - - if (!ptr) - Sys_Error ("Z_Free: NULL pointer"); - - block = (memblock_t *) ( (qbyte *)ptr - sizeof(memblock_t)); - if (block->id != ZONEID) - Sys_Error ("Z_Free: freed a pointer without ZONEID"); - if (block->tag == 0) - Sys_Error ("Z_Free: freed a freed pointer"); - - block->tag = 0; // mark as free - - other = block->prev; - if (!other->tag) - { // merge with previous free block - other->size += block->size; - other->next = block->next; - other->next->prev = other; - if (block == mainzone->rover) - mainzone->rover = other; - block = other; - } - - other = block->next; - if (!other->tag) - { // merge the next free block onto the end - block->size += other->size; - block->next = other->next; - block->next->prev = block; - if (other == mainzone->rover) - mainzone->rover = block; - } -} - - -/* -======================== -Z_Malloc -======================== -*/ -#undef Z_Malloc -void *Z_Malloc (int size) -{ - void *buf; - -Z_CheckHeap (); // DEBUG - buf = Z_TagMalloc (size, 1); - if (!buf) - Sys_Error ("Z_Malloc: failed on allocation of %i bytes",size); - Q_memset (buf, 0, size); - - return buf; -} - -void *Z_MallocNamed (int size, char *name) -{ - void *buf; - -Z_CheckHeap (); // DEBUG - buf = Z_TagMalloc (size, 1); - if (!buf) - Sys_Error ("Z_Malloc: %s failed on allocation of %i bytes", name, size); -// Sys_DebugLog("zmalloc.log", "%s allocates %i bytes\n", name, size); - Q_memset (buf, 0, size); - - return buf; -} - -void *Z_MallocNamed2 (int size, char *name, int line) -{ - void *buf; - -Z_CheckHeap (); // DEBUG - buf = Z_TagMalloc (size, 1); - if (!buf) - Sys_Error ("Z_Malloc: %s %i failed on allocation of %i bytes", name, line, size); -// Sys_DebugLog("zmalloc.log", "%s %i allocates %i bytes\n", name, line, size); - Q_memset (buf, 0, size); - - return buf; -} - -void *Z_TagMalloc (int size, int tag) -{ - int extra; - memblock_t *start, *rover, *newz, *base; - - if (!tag) - Sys_Error ("Z_TagMalloc: tried to use a 0 tag"); - -// -// scan through the block list looking for the first free block -// of sufficient size -// - size += sizeof(memblock_t); // account for size of block header - size += 4; // space for memory trash tester - size = (size + 7) & ~7; // align to 8-qbyte boundary - - base = rover = mainzone->rover; - start = base->prev; - - do - { - if (rover == start) // scaned all the way around the list - return NULL; - if (rover->tag) - base = rover = rover->next; - else - rover = rover->next; - } while (base->tag || base->size < size); - -// -// found a block big enough -// - extra = base->size - size; - if (extra > MINFRAGMENT) - { // there will be a free fragment after the allocated block - newz = (memblock_t *) ((qbyte *)base + size ); - newz->size = extra; - newz->tag = 0; // free block - newz->prev = base; - newz->id = ZONEID; - newz->next = base->next; - newz->next->prev = newz; - base->next = newz; - base->size = size; - } - - base->tag = tag; // no longer a free block - - mainzone->rover = base->next; // next allocation will start looking here - - base->id = ZONEID; - -// marker for memory trash testing - *(int *)((qbyte *)base + base->size - 4) = ZONEID; - - return (void *) ((qbyte *)base + sizeof(memblock_t)); -} - - -/* -======================== -Z_Print -======================== -*/ -void Z_Print (memzone_t *zone) -{ - memblock_t *block; - - Con_Printf ("zone size: %i location: %p\n",mainzone->size,mainzone); - - for (block = zone->blocklist.next ; ; block = block->next) - { - Con_Printf ("block:%p size:%7i tag:%3i\n", - block, block->size, block->tag); - - if (block->next == &zone->blocklist) - break; // all blocks have been hit - if ( (qbyte *)block + block->size != (qbyte *)block->next) - Con_Printf ("ERROR: block size does not touch the next block\n"); - if ( block->next->prev != block) - Con_Printf ("ERROR: next block doesn't have proper back link\n"); - if (!block->tag && !block->next->tag) - Con_Printf ("ERROR: two consecutive free blocks\n"); - } -} - - - - - - -void *BZ_Malloc(int size) -{ - void *data; - data = malloc(size); - memset(data, 0, size); - return data; -} - -void BZ_Free(void *data) -{ - free(data); -} - - - -#endif - - - - - - - //============================================================================ -#define HUNK_SENTINAL 0x1df001ed - -typedef struct -{ - int sentinal; - int size; // including sizeof(hunk_t), -1 = not allocated - char name[8]; -} hunk_t; -typedef struct hunkoverflow_s -{ - struct hunkoverflow_s *prev; - struct hunkoverflow_s *next; - hunk_t hunk[0]; -} hunkoverflow_t; - -static hunkoverflow_t *hunkoverflow_first; -static hunkoverflow_t *hunkoverflow_top; - -static qbyte *hunk_base; -static int hunk_size; - -static int hunk_low_used; -static int hunk_high_used; - -void R_FreeTextures (void); - -/* -============== -Hunk_Check - -Run consistancy and sentinal trahing checks -============== -*/ -void Hunk_Check (void) -{ - hunk_t *h; - - for (h = (hunk_t *)hunk_base ; (qbyte *)h != hunk_base + hunk_low_used ; ) - { - if (h->sentinal != HUNK_SENTINAL) - Sys_Error ("Hunk_Check: trashed sentinal"); - if (h->size < 16+HUNKDEBUG*2 || h->size + (qbyte *)h - hunk_base > hunk_size) - Sys_Error ("Hunk_Check: bad size"); -#if HUNKDEBUG > 0 - { - qbyte *present; - qbyte *postsent; - int i; - present = (qbyte *)(h+1); - postsent = (qbyte *)h + h->size-HUNKDEBUG; - for (i = 0; i < HUNKDEBUG; i++) - { - if (present[i] != sentinalkey) - Sys_Error ("Hunk_Check: trashed pre-sentinal on \"%s\"", h->name); - if (postsent[i] != sentinalkey) - Sys_Error ("Hunk_Check: trashed post-sentinal on \"%s\"", h->name); - } - } -#endif - h = (hunk_t *)((qbyte *)h+h->size); - } -} - -/* -============== -Hunk_Print - -If "all" is specified, every single allocation is printed. -Otherwise, allocations with the same name will be totaled up before printing. -============== -*/ -void Hunk_Print (qboolean all) -{ - hunk_t *h, *next, *endlow, *starthigh, *endhigh; - int count, sum; - int totalblocks; - char name[9]; - - name[8] = 0; - count = 0; - sum = 0; - totalblocks = 0; - - h = (hunk_t *)hunk_base; - endlow = (hunk_t *)(hunk_base + hunk_low_used); - starthigh = (hunk_t *)(hunk_base + hunk_size - hunk_high_used); - endhigh = (hunk_t *)(hunk_base + hunk_size); - - Con_Printf (" :%12i total hunk size\n", hunk_size); - Con_Printf ("-------------------------\n"); - - while (1) - { - // - // skip to the high hunk if done with low hunk - // - if ( h == endlow ) - { - Con_Printf ("-------------------------\n"); - Con_Printf (" : %12i REMAINING\n", hunk_size - hunk_low_used - hunk_high_used); - Con_Printf (" : %12i USED\n", hunk_low_used + hunk_high_used); - Con_Printf ("-------------------------\n"); - h = starthigh; - } - - // - // if totally done, break - // - if ( h == endhigh ) - break; - - // - // run consistancy checks - // - if (h->sentinal != HUNK_SENTINAL) - Sys_Error ("Hunk_Check: trahsed sentinal"); - if (h->size < 16 || h->size + (qbyte *)h - hunk_base > hunk_size) - Sys_Error ("Hunk_Check: bad size"); -#if HUNKDEBUG > 0 - { - qbyte *present; - qbyte *postsent; - int i; - present = (qbyte *)(h+1); - postsent = (qbyte *)h + h->size-HUNKDEBUG; - for (i = 0; i < HUNKDEBUG; i++) - { - if (present[i] != sentinalkey) - Sys_Error ("Hunk_Check: corrupt sentinal"); - if (postsent[i] != sentinalkey) - Sys_Error ("Hunk_Check: corrupt sentinal"); - } - } -#endif - next = (hunk_t *)((qbyte *)h+h->size); - count++; - totalblocks++; - sum += h->size; - - // - // print the single block - // - memcpy (name, h->name, 8); - if (all) - Con_Printf ("%8p :%12i %8s\n",h, h->size, name); - - // - // print the total - // - if (next == endlow || next == endhigh || - strncmp (h->name, next->name, 8) ) - { - if (!all) - Con_Printf (" :%12i %8s (TOTAL)\n",sum, name); - count = 0; - sum = 0; - } - - h = next; - } - - Con_Printf ("-------------------------\n"); - Con_Printf ("%8i total blocks\n", totalblocks); - -} - -/* -=================== -Hunk_AllocName -=================== -*/ -void *Hunk_AllocName (int size, char *name) -{ - int roundup; - int roundupold; - hunk_t *h; - -#ifdef PARANOID - Hunk_Check (); -#endif - - if (size < 0) - Sys_Error ("Hunk_Alloc: bad size: %i", size); - - size = sizeof(hunk_t) + HUNKDEBUG*2 + size; - size = (size + 15) & ~15; - - if (hunk_size - hunk_low_used - hunk_high_used < size) - { - Sys_Error ("Not enough RAM allocated. Try starting using \"-mem %u\" on the " FULLENGINENAME " command line.", (hunk_size + 8*1024*1024) / 1024*1024); - } - - h = (hunk_t *)(hunk_base + hunk_low_used); - - roundupold = hunk_low_used; - roundupold += 1024*128; - roundupold &= ~(1024*128 - 1); - - roundup = hunk_low_used+size; - roundup += 1024*128; - roundup &= ~(1024*128 - 1); - - if (hunkoverflow_top || roundup > hunk_size) - { - hunkoverflow_t *newtop; - newtop = BZ_Malloc(sizeof(*newtop)+size); - newtop->next = NULL; - if (!hunkoverflow_top) - { - hunkoverflow_top = hunkoverflow_first = newtop; - newtop->prev = NULL; - } - else - { - hunkoverflow_top->next = newtop; - newtop->prev = hunkoverflow_top; - hunkoverflow_top = newtop; - } - h = newtop->hunk; - } -#ifdef _WIN32 - else - { - if (!hunk_low_used || roundup != roundupold) - if (!VirtualAlloc (hunk_base, roundup, MEM_COMMIT, PAGE_READWRITE)) - { - char *buf; - Hunk_Print(true); - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buf, 0, NULL); - Sys_Error ("VirtualCommit failed\nNot enough RAM allocated on allocation of \"%s\". Try starting using \"-heapsize %i\" on the " FULLENGINENAME " command line.", name, roundupold/512); - } - } -#endif - - hunk_low_used += size; - - Cache_FreeLow (hunk_low_used); - - memset (h, 0, size-HUNKDEBUG); - -#if HUNKDEBUG>0 - memset ((h+1), sentinalkey, HUNKDEBUG); - memset ((qbyte *)h+size-HUNKDEBUG, sentinalkey, HUNKDEBUG); -#endif - - h->size = size; - h->sentinal = HUNK_SENTINAL; - Q_strncpyz (h->name, COM_SkipPath(name), sizeof(h->name)); - - return (void *)((char *)(h+1)+HUNKDEBUG); -} - -/* -=================== -Hunk_Alloc -=================== -*/ -void *Hunk_Alloc (int size) -{ - return Hunk_AllocName (size, "unknown"); -} - -int Hunk_LowMark (void) -{ - return hunk_low_used; -} - -int Hunk_LowMemAvailable(void) -{ - return hunk_size - hunk_low_used - hunk_high_used; -} - -void Hunk_FreeToLowMark (int mark) -{ - if (mark < 0 || mark > hunk_low_used) - Sys_Error ("Hunk_FreeToLowMark: bad mark %i", mark); - - while(hunkoverflow_top) - { - if (mark > hunk_size) - { - hunkoverflow_t *top = hunkoverflow_top; - mark -= top->hunk[0].size; - hunk_low_used -= top->hunk[0].size; - hunkoverflow_top = top->prev; - hunkoverflow_top->next = NULL; - BZ_Free(top); - } - else - return; - } - - memset (hunk_base + mark, 0, hunk_low_used - mark); - hunk_low_used = mark; - -#ifdef _WIN32 - if (!VirtualAlloc (hunk_base, hunk_low_used+sizeof(hunk_t), MEM_COMMIT, PAGE_READWRITE)) - { - char *buf; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buf, 0, NULL); - Sys_Error ("VirtualAlloc commit failed.\n%s", buf); - } -#endif -} - /* ================= Hunk_TempAlloc @@ -1594,73 +568,6 @@ CACHE MEMORY =============================================================================== */ -#ifdef NOCACHE - - -typedef struct cache_system_s { - cache_user_t *user; - struct cache_system_s *next; - struct cache_system_s *prev; - int size; - char name[16]; -} cache_system_t; -cache_system_t *cache_head; - -void Cache_Free (cache_user_t *c) -{ - cache_system_t *cs; - if (c->data == NULL) - { - cache_head = NULL; //this is evil and should never happen - Sys_Error("Cache was already free\n"); - return; - } - cs = ((cache_system_t *)c->data)-1; - cs = (cache_system_t*)((char*)cs - CACHEDEBUG); - - cs->user->data = NULL; - -#if CACHEDEBUG>0 - { - int i; - qbyte *buf; - buf = (qbyte *)(cs+1); - for (i = 0; i < CACHEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("Cache memory corrupted (%i? bytes)", cs->size); - } - buf+=CACHEDEBUG; - //app data - buf += cs->size; - for (i = 0; i < CACHEDEBUG; i++) - { - if (buf[i] != sentinalkey) - Sys_Error("Cache memory corrupted (%i? bytes)", cs->size); - } - } -#endif - - - if (cs->next) - cs->next->prev = cs->prev; - if (cs->prev) - cs->prev->next = cs->next; - - if (cs == cache_head) - cache_head = cs->next; - - BZ_Free(cs); -} - -void *Cache_Check(cache_user_t *c) -{ - if (!c->data) - return NULL; - - return c->data; -} - void Cache_Flush(void) { //this generically named function is hyjacked to flush models and sounds, as well as ragdolls etc @@ -1670,97 +577,10 @@ void Cache_Flush(void) #ifndef SERVERONLY S_Purge(false); #endif - while(cache_head) - { - Cache_Free(cache_head->user); - } } -void *Cache_Alloc (cache_user_t *c, int size, char *name) +static void Hunk_Print_f (void) { - void *buf; - cache_system_t *nt; - qboolean resize = false; - - if (size <= 0) - Sys_Error ("Cache_Alloc: size %i", size); - - if (c->data) - { - Sys_Error ("Cache_Alloc: %s already allocated", name); -/* - //resize instead - nt = c->data; - nt--; - nt = (cache_system_t*)BZ_Realloc(nt, size + sizeof(cache_system_t) + CACHEDEBUG*2); - - resize = true;*/ - } - else - { -// size = (size + 15) & ~15; - nt = (cache_system_t*)BZ_Malloc(size + sizeof(cache_system_t) + CACHEDEBUG*2); - } - - if (!nt) - Sys_Error("Cache_Alloc: failed on allocation of %i bytes", size); - - if (resize) - { - if (nt->next) - nt->next->prev = nt; - if (nt->prev) - nt->prev->next = nt; - else - cache_head = nt; - } - else - { - nt->next = cache_head; - nt->prev = NULL; - if (cache_head) - cache_head->prev = nt; - cache_head = nt; - } - nt->user = c; - nt->size = size; - Q_strncpyz(nt->name, name, sizeof(nt->name)); - nt->user->fake = false; - buf = (void *)(nt+1); - memset(buf, sentinalkey, CACHEDEBUG); - buf = (char*)buf+CACHEDEBUG; - if (!resize) - memset(buf, 0, size); - memset((char *)buf+size, sentinalkey, CACHEDEBUG); - c->data = buf; - return c->data; -} - -void Cache_FreeLow(int newlow) -{ -} - -void Cache_FreeHigh(int newhigh) -{ -} - -void Cache_Report (void) -{ -} - -void Hunk_Print_f (void) -{ - cache_system_t *cs; - int cacheused; - Hunk_Print(true); - - cacheused = 0; - for (cs = cache_head; cs; cs = cs->next) - { - cacheused += cs->size; - } - Con_Printf("Cache: %iKB\n", cacheused/1024); - Con_Printf("Z Delta: %iKB\n", zmemdelta/1024); zmemdelta = 0; Con_Printf("Z Total: %iKB\n", zmemtotal/1024); //note: Zone memory isn't tracked reliably. we don't track the mem that is freed, so it'll just climb and climb @@ -1804,361 +624,6 @@ void Cache_Init(void) #endif } -#else -typedef struct cache_system_s -{ - int size; // including this header - cache_user_t *user; - char name[16]; - struct cache_system_s *prev, *next; - struct cache_system_s *lru_prev, *lru_next; // for LRU flushing -} cache_system_t; - -cache_system_t *Cache_TryAlloc (int size, qboolean nobottom); - -cache_system_t cache_head; - -/* -=========== -Cache_Move -=========== -*/ -void Cache_Move ( cache_system_t *c) -{ - cache_system_t *newc; - -// we are clearing up space at the bottom, so only allocate it late - newc = Cache_TryAlloc (c->size, true); - if (newc) - { -// Con_Printf ("cache_move ok\n"); - - Q_memcpy ( newc+1, c+1, c->size - sizeof(cache_system_t) ); - newc->user = c->user; - Q_memcpy (newc->name, c->name, sizeof(newc->name)); - Cache_Free (c->user); - newc->user->data = (void *)(newc+1); - } - else - { -// Con_Printf ("cache_move failed\n"); - - Cache_Free (c->user); // tough luck... - } -} - -/* -============ -Cache_FreeLow - -Throw things out until the hunk can be expanded to the given point -============ -*/ -void Cache_FreeLow (int new_low_hunk) -{ - cache_system_t *c; - - while (1) - { - c = cache_head.next; - if (c == &cache_head) - return; // nothing in cache at all - if ((qbyte *)c >= hunk_base + new_low_hunk) - return; // there is space to grow the hunk - Cache_Move ( c ); // reclaim the space - } -} - -/* -============ -Cache_FreeHigh - -Throw things out until the hunk can be expanded to the given point -============ -*/ -void Cache_FreeHigh (int new_high_hunk) -{ - cache_system_t *c, *prev; - - prev = NULL; - while (1) - { - c = cache_head.prev; - if (c == &cache_head) - return; // nothing in cache at all - if ( (qbyte *)c + c->size <= hunk_base + hunk_size - new_high_hunk) - return; // there is space to grow the hunk - if (c == prev) - Cache_Free (c->user); // didn't move out of the way - else - { - Cache_Move (c); // try to move it - prev = c; - } - } -} - -void Cache_UnlinkLRU (cache_system_t *cs) -{ - if (!cs->lru_next || !cs->lru_prev) - Sys_Error ("Cache_UnlinkLRU: NULL link"); - - cs->lru_next->lru_prev = cs->lru_prev; - cs->lru_prev->lru_next = cs->lru_next; - - cs->lru_prev = cs->lru_next = NULL; -} - -void Cache_MakeLRU (cache_system_t *cs) -{ - if (cs->lru_next || cs->lru_prev) - Sys_Error ("Cache_MakeLRU: active link"); - - cache_head.lru_next->lru_prev = cs; - cs->lru_next = cache_head.lru_next; - cs->lru_prev = &cache_head; - cache_head.lru_next = cs; -} - -/* -============ -Cache_TryAlloc - -Looks for a free block of memory between the high and low hunk marks -Size should already include the header and padding -============ -*/ -cache_system_t *Cache_TryAlloc (int size, qboolean nobottom) -{ - cache_system_t *cs, *newc; - -// is the cache completely empty? - - if (!nobottom && cache_head.prev == &cache_head) - { - if (hunk_size - hunk_high_used - hunk_low_used < size) - Sys_Error ("Cache_TryAlloc: %i is greater then free hunk", size); - - newc = (cache_system_t *) (hunk_base + hunk_low_used); - memset (newc, 0, sizeof(*newc)); - newc->size = size; - - cache_head.prev = cache_head.next = newc; - newc->prev = newc->next = &cache_head; - - Cache_MakeLRU (newc); - return newc; - } - -// search from the bottom up for space - - newc = (cache_system_t *) (hunk_base + hunk_low_used); - cs = cache_head.next; - - do - { - if (!nobottom || cs != cache_head.next) - { - if ( (qbyte *)cs - (qbyte *)newc >= size) - { // found space - memset (newc, 0, sizeof(*newc)); - newc->size = size; - - newc->next = cs; - newc->prev = cs->prev; - cs->prev->next = newc; - cs->prev = newc; - - Cache_MakeLRU (newc); - - return newc; - } - } - - // continue looking - newc = (cache_system_t *)((qbyte *)cs + cs->size); - cs = cs->next; - - } while (cs != &cache_head); - -// try to allocate one at the very end - if ( hunk_base + hunk_size - hunk_high_used - (qbyte *)newc >= size) - { - memset (newc, 0, sizeof(*newc)); - newc->size = size; - - newc->next = &cache_head; - newc->prev = cache_head.prev; - cache_head.prev->next = newc; - cache_head.prev = newc; - - Cache_MakeLRU (newc); - - return newc; - } - - return NULL; // couldn't allocate -} - -/* -============ -Cache_Flush - -Throw everything out, so new data will be demand cached -============ -*/ -void Cache_Flush (void) -{ - while (cache_head.next != &cache_head) - Cache_Free ( cache_head.next->user ); // reclaim the space -} - - -/* -============ -Cache_Print - -============ -*/ -void Cache_Print (void) -{ - cache_system_t *cd; - - for (cd = cache_head.next ; cd != &cache_head ; cd = cd->next) - { - Con_Printf ("%8i : %s\n", cd->size, cd->name); - } -} - -/* -============ -Cache_Report - -============ -*/ -void Cache_Report (void) -{ - Con_DPrintf ("%4.1f megabyte data cache\n", (hunk_size - hunk_high_used - hunk_low_used) / (float)(1024*1024) ); -} - -/* -============ -Cache_Compact - -============ -*/ -void Cache_Compact (void) -{ -} - -/* -============ -Cache_Init - -============ -*/ -void Hunk_Print_f (void) {Hunk_Print(true);} -void Cache_Init (void) -{ - cache_head.next = cache_head.prev = &cache_head; - cache_head.lru_next = cache_head.lru_prev = &cache_head; - - Cmd_AddCommand ("flush", Cache_Flush); - - Cmd_AddCommand ("hp", Hunk_Print_f); -} - -/* -============== -Cache_Free - -Frees the memory and removes it from the LRU list -============== -*/ -void Cache_Free (cache_user_t *c) -{ - cache_system_t *cs; - - if (!c->data) - Sys_Error ("Cache_Free: not allocated"); - - cs = ((cache_system_t *)c->data) - 1; - - cs->prev->next = cs->next; - cs->next->prev = cs->prev; - cs->next = cs->prev = NULL; - - c->data = NULL; - - Cache_UnlinkLRU (cs); -} - - - -/* -============== -Cache_Check -============== -*/ -void *Cache_Check (cache_user_t *c) -{ - cache_system_t *cs; - - if (!c->data) - return NULL; - - if (c->fake) //malloc or somesuch. - return c->data; - - cs = ((cache_system_t *)c->data) - 1; - -// move to head of LRU - Cache_UnlinkLRU (cs); - Cache_MakeLRU (cs); - - return c->data; -} - - -/* -============== -Cache_Alloc -============== -*/ -void *Cache_Alloc (cache_user_t *c, int size, char *name) -{ - cache_system_t *cs; - - if (c->data) - Sys_Error ("Cache_Alloc: already allocated"); - - if (size <= 0) - Sys_Error ("Cache_Alloc: size %i", size); - - size = (size + sizeof(cache_system_t) + 15) & ~15; - -// find memory for it - while (1) - { - cs = Cache_TryAlloc (size, false); - if (cs) - { - strncpy (cs->name, name, sizeof(cs->name)-1); - c->data = (void *)(cs+1); - cs->user = c; - break; - } - - // free the least recently used cahedat - if (cache_head.lru_prev == &cache_head) - Sys_Error ("Cache_Alloc: out of memory"); - // not enough memory at all - Cache_Free ( cache_head.lru_prev->user ); - } - - return Cache_Check (c); -} -#endif //============================================================================ /* @@ -2166,18 +631,13 @@ void *Cache_Alloc (cache_user_t *c, int size, char *name) Memory_Init ======================== */ -void Memory_Init (void *buf, int size) +void Memory_Init (void) { #if 0 //ndef NOZONE int p; int zonesize = DYNAMIC_SIZE; #endif - hunk_base = (qbyte*)buf; - hunk_size = size; - hunk_low_used = 0; - hunk_high_used = 0; - #if ZONEDEBUG>0 || HUNKDEBUG>0 || TEMPDEBUG>0||CACHEDEBUG>0 srand(time(0)); sentinalkey = rand() & 0xff; diff --git a/engine/common/zone.h b/engine/common/zone.h index bf0bd6450..682d5fc92 100644 --- a/engine/common/zone.h +++ b/engine/common/zone.h @@ -83,7 +83,7 @@ Zone block */ -void Memory_Init (void *buf, int size); +void Memory_Init (void); void Memory_DeInit(void); void VARGS Z_Free (void *ptr); @@ -109,6 +109,16 @@ void *BZF_Realloc(void *data, int newsize); void *BZF_ReallocNamed(void *data, int newsize, char *file, int line); void BZ_Free(void *ptr); +//ctx should start off as void*ctx=NULL +typedef struct zonegroup_s +{ + void *first; + int bytes; +} zonegroup_t; +void *ZG_Malloc(zonegroup_t *ctx, int size); +void *ZG_MallocNamed(zonegroup_t *ctx, int size, char *file, int line); +void ZG_FreeGroup(zonegroup_t *ctx); + #ifdef USE_MSVCRT_DEBUG #define BZ_Malloc(size) BZ_MallocNamed(size, __FILE__, __LINE__) #define Z_Malloc(size) Z_MallocNamed(size, __FILE__, __LINE__) @@ -116,30 +126,27 @@ void BZ_Free(void *ptr); #define BZF_Malloc(size) BZF_MallocNamed(size, __FILE__, __LINE__) #define ZF_Malloc(size) ZF_MallocNamed(size, __FILE__, __LINE__) #define BZF_Realloc(ptr, size) BZF_ReallocNamed(ptr, size, __FILE__, __LINE__) +#define ZG_Malloc(ctx, size) ZG_MallocNamed(ctx, size, __FILE__, __LINE__) #endif - #define Z_StrDup(s) strcpy(Z_Malloc(strlen(s)+1), s) +/* void *Hunk_Alloc (int size); // returns 0 filled memory void *Hunk_AllocName (int size, char *name); - -int Hunk_LowMark (void); -void Hunk_FreeToLowMark (int mark); -int Hunk_LowMemAvailable(void); +*/ void *Hunk_TempAlloc (int size); void *Hunk_TempAllocMore (int size); //Don't clear old temp -void Hunk_Check (void); - +/* typedef struct cache_user_s { void *data; qboolean fake; } cache_user_t; - +*/ void Cache_Flush (void); - +/* void *Cache_Check (cache_user_t *c); // returns the cached data, and moves to the head of the LRU list // if present, otherwise returns NULL @@ -151,4 +158,4 @@ void *Cache_Alloc (cache_user_t *c, int size, char *name); // wasn't enough room. void Cache_Report (void); - +*/ diff --git a/engine/d3d/d3d_backend.c b/engine/d3d/d3d_backend.c index 498a4a8e1..76cf61fa0 100644 --- a/engine/d3d/d3d_backend.c +++ b/engine/d3d/d3d_backend.c @@ -2654,7 +2654,7 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod) VectorScale((m+8), mod->clampscale, (m+8)); } - if (e->flags & Q2RF_WEAPONMODEL && r_refdef.currentplayernum>=0) + if (e->flags & Q2RF_WEAPONMODEL) { /*FIXME: no bob*/ float iv[16]; diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index 7748d65b4..2c0184d4e 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -708,7 +708,6 @@ static qboolean D3D9_VID_Init(rendererstate_t *info, unsigned char *palette) // pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, &width, &height); vid.pixelwidth = width; vid.pixelheight = height; - vid.recalc_refdef = true; vid.width = width; vid.height = height; @@ -1026,12 +1025,6 @@ static void (D3D9_SCR_UpdateScreen) (void) return; } - // - // determine size of refresh window - // - if (vid.recalc_refdef) - SCR_CalcRefdef (); - // // do 3D refresh drawing, and then update the screen // @@ -1259,26 +1252,6 @@ rendererinfo_t d3d9rendererinfo = D3D9_R_NewMap, D3D9_R_PreNewMap, - Surf_AddStain, - Surf_LessenStains, - - RMod_Init, - RMod_Shutdown, - RMod_ClearAll, - RMod_ForName, - RMod_FindName, - RMod_Extradata, - RMod_TouchModel, - - RMod_NowLoadExternal, - RMod_Think, - Mod_GetTag, - Mod_TagNumForName, - Mod_SkinNumForName, - Mod_FrameNumForName, - Mod_FrameDuration, - - D3D9_VID_Init, D3D9_VID_DeInit, D3D9_VID_ApplyGammaRamps, diff --git a/engine/d3d/vid_d3d11.c b/engine/d3d/vid_d3d11.c index 86accd11b..f927cff89 100644 --- a/engine/d3d/vid_d3d11.c +++ b/engine/d3d/vid_d3d11.c @@ -1085,12 +1085,6 @@ static void (D3D11_SCR_UpdateScreen) (void) return; } - // - // determine size of refresh window - // - if (vid.recalc_refdef) - SCR_CalcRefdef (); - // // do 3D refresh drawing, and then update the screen // @@ -1329,26 +1323,6 @@ rendererinfo_t d3d11rendererinfo = D3D11_R_NewMap, D3D11_R_PreNewMap, - Surf_AddStain, - Surf_LessenStains, - - RMod_Init, - RMod_Shutdown, - RMod_ClearAll, - RMod_ForName, - RMod_FindName, - RMod_Extradata, - RMod_TouchModel, - - RMod_NowLoadExternal, - RMod_Think, - Mod_GetTag, - Mod_TagNumForName, - Mod_SkinNumForName, - Mod_FrameNumForName, - Mod_FrameDuration, - - D3D11_VID_Init, D3D11_VID_DeInit, D3D11_VID_ApplyGammaRamps, diff --git a/engine/dotnet2005/ftequake.sln b/engine/dotnet2005/ftequake.sln index 5d3434265..e3aea23ea 100644 --- a/engine/dotnet2005/ftequake.sln +++ b/engine/dotnet2005/ftequake.sln @@ -2,7 +2,6 @@ Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftequake", "ftequake.vcproj", "{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1364}" ProjectSection(ProjectDependencies) = postProject - {9767E236-8454-44E9-8999-CD5BDAFBE9BA} = {9767E236-8454-44E9-8999-CD5BDAFBE9BA} {0018E098-B12A-4E4D-9B22-6772DA287080} = {0018E098-B12A-4E4D-9B22-6772DA287080} EndProjectSection EndProject @@ -159,7 +158,7 @@ Global {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLRelease|Win32.ActiveCfg = GLRelease|Win32 {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLRelease|x64.ActiveCfg = GLRelease|Win32 {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.MDebug|Win32.ActiveCfg = GLDebug|Win32 - {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.MDebug|x64.ActiveCfg = GLDebug|Win32 + {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.MDebug|x64.ActiveCfg = GLRelease|Win32 {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.MinGLDebug|Win32.ActiveCfg = GLDebug|Win32 {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.MinGLDebug|x64.ActiveCfg = GLDebug|Win32 {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.MinGLRelease|Win32.ActiveCfg = GLRelease|Win32 @@ -189,7 +188,8 @@ Global {E0EE8B50-3A75-42A9-B80A-787675979B0C}.GLRelease|Win32.ActiveCfg = Release {E0EE8B50-3A75-42A9-B80A-787675979B0C}.GLRelease|x64.ActiveCfg = Release {E0EE8B50-3A75-42A9-B80A-787675979B0C}.MDebug|Win32.ActiveCfg = Debug - {E0EE8B50-3A75-42A9-B80A-787675979B0C}.MDebug|x64.ActiveCfg = Debug + {E0EE8B50-3A75-42A9-B80A-787675979B0C}.MDebug|x64.ActiveCfg = Release + {E0EE8B50-3A75-42A9-B80A-787675979B0C}.MDebug|x64.Build.0 = Release {E0EE8B50-3A75-42A9-B80A-787675979B0C}.MinGLDebug|Win32.ActiveCfg = Debug {E0EE8B50-3A75-42A9-B80A-787675979B0C}.MinGLDebug|x64.ActiveCfg = Debug {E0EE8B50-3A75-42A9-B80A-787675979B0C}.MinGLRelease|Win32.ActiveCfg = Release @@ -220,7 +220,7 @@ Global {0018E098-B12A-4E4D-9B22-6772DA287080}.GLRelease|x64.ActiveCfg = Release|Win32 {0018E098-B12A-4E4D-9B22-6772DA287080}.MDebug|Win32.ActiveCfg = Debug|Win32 {0018E098-B12A-4E4D-9B22-6772DA287080}.MDebug|Win32.Build.0 = Debug|Win32 - {0018E098-B12A-4E4D-9B22-6772DA287080}.MDebug|x64.ActiveCfg = Debug|Win32 + {0018E098-B12A-4E4D-9B22-6772DA287080}.MDebug|x64.ActiveCfg = Release|Win32 {0018E098-B12A-4E4D-9B22-6772DA287080}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {0018E098-B12A-4E4D-9B22-6772DA287080}.MinGLDebug|x64.ActiveCfg = Debug|Win32 {0018E098-B12A-4E4D-9B22-6772DA287080}.MinGLRelease|Win32.ActiveCfg = Release|Win32 @@ -251,7 +251,7 @@ Global {2866F783-6B44-4655-A38D-D53874037454}.GLRelease|x64.ActiveCfg = Release|Win32 {2866F783-6B44-4655-A38D-D53874037454}.MDebug|Win32.ActiveCfg = Debug|Win32 {2866F783-6B44-4655-A38D-D53874037454}.MDebug|Win32.Build.0 = Debug|Win32 - {2866F783-6B44-4655-A38D-D53874037454}.MDebug|x64.ActiveCfg = Debug|Win32 + {2866F783-6B44-4655-A38D-D53874037454}.MDebug|x64.ActiveCfg = Release|Win32 {2866F783-6B44-4655-A38D-D53874037454}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {2866F783-6B44-4655-A38D-D53874037454}.MinGLDebug|Win32.Build.0 = Debug|Win32 {2866F783-6B44-4655-A38D-D53874037454}.MinGLDebug|x64.ActiveCfg = Debug|Win32 @@ -282,7 +282,7 @@ Global {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.GLRelease|Win32.ActiveCfg = Release|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.GLRelease|x64.ActiveCfg = Release|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.MDebug|Win32.ActiveCfg = Debug|Win32 - {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.MDebug|x64.ActiveCfg = Debug|Win32 + {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.MDebug|x64.ActiveCfg = Release|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.MinGLDebug|x64.ActiveCfg = Debug|Win32 {62669E6C-7E18-4E4D-BA54-DFBE29E7D24E}.MinGLRelease|Win32.ActiveCfg = Release|Win32 @@ -310,7 +310,7 @@ Global {4735677B-6D5A-4BE6-A945-CB32A7282F56}.GLRelease|Win32.ActiveCfg = Release|Win32 {4735677B-6D5A-4BE6-A945-CB32A7282F56}.GLRelease|x64.ActiveCfg = Release|Win32 {4735677B-6D5A-4BE6-A945-CB32A7282F56}.MDebug|Win32.ActiveCfg = Debug|Win32 - {4735677B-6D5A-4BE6-A945-CB32A7282F56}.MDebug|x64.ActiveCfg = Debug|Win32 + {4735677B-6D5A-4BE6-A945-CB32A7282F56}.MDebug|x64.ActiveCfg = Release|Win32 {4735677B-6D5A-4BE6-A945-CB32A7282F56}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {4735677B-6D5A-4BE6-A945-CB32A7282F56}.MinGLDebug|x64.ActiveCfg = Debug|Win32 {4735677B-6D5A-4BE6-A945-CB32A7282F56}.MinGLRelease|Win32.ActiveCfg = Release|Win32 @@ -335,7 +335,7 @@ Global {873CCE24-3549-49D4-A4B4-653F91B1532A}.GLRelease|Win32.ActiveCfg = Release|Win32 {873CCE24-3549-49D4-A4B4-653F91B1532A}.GLRelease|x64.ActiveCfg = Release|Win32 {873CCE24-3549-49D4-A4B4-653F91B1532A}.MDebug|Win32.ActiveCfg = Debug|Win32 - {873CCE24-3549-49D4-A4B4-653F91B1532A}.MDebug|x64.ActiveCfg = Debug|Win32 + {873CCE24-3549-49D4-A4B4-653F91B1532A}.MDebug|x64.ActiveCfg = Release|Win32 {873CCE24-3549-49D4-A4B4-653F91B1532A}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {873CCE24-3549-49D4-A4B4-653F91B1532A}.MinGLDebug|x64.ActiveCfg = Debug|Win32 {873CCE24-3549-49D4-A4B4-653F91B1532A}.MinGLRelease|Win32.ActiveCfg = Release|Win32 @@ -366,7 +366,7 @@ Global {4877586B-E85B-4DF8-BCCE-59D31514D240}.GLRelease|Win32.ActiveCfg = Release|Win32 {4877586B-E85B-4DF8-BCCE-59D31514D240}.GLRelease|x64.ActiveCfg = Release|Win32 {4877586B-E85B-4DF8-BCCE-59D31514D240}.MDebug|Win32.ActiveCfg = Debug|Win32 - {4877586B-E85B-4DF8-BCCE-59D31514D240}.MDebug|x64.ActiveCfg = Debug|Win32 + {4877586B-E85B-4DF8-BCCE-59D31514D240}.MDebug|x64.ActiveCfg = Release|Win32 {4877586B-E85B-4DF8-BCCE-59D31514D240}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {4877586B-E85B-4DF8-BCCE-59D31514D240}.MinGLDebug|x64.ActiveCfg = Debug|Win32 {4877586B-E85B-4DF8-BCCE-59D31514D240}.MinGLRelease|Win32.ActiveCfg = Release|Win32 @@ -398,7 +398,7 @@ Global {32B12987-DF8C-4E40-B07C-B18586A4CA65}.GLRelease|Win32.Build.0 = Release|Win32 {32B12987-DF8C-4E40-B07C-B18586A4CA65}.GLRelease|x64.ActiveCfg = Release|Win32 {32B12987-DF8C-4E40-B07C-B18586A4CA65}.MDebug|Win32.ActiveCfg = Debug|Win32 - {32B12987-DF8C-4E40-B07C-B18586A4CA65}.MDebug|x64.ActiveCfg = Debug|Win32 + {32B12987-DF8C-4E40-B07C-B18586A4CA65}.MDebug|x64.ActiveCfg = Release|Win32 {32B12987-DF8C-4E40-B07C-B18586A4CA65}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {32B12987-DF8C-4E40-B07C-B18586A4CA65}.MinGLDebug|x64.ActiveCfg = Debug|Win32 {32B12987-DF8C-4E40-B07C-B18586A4CA65}.MinGLRelease|Win32.ActiveCfg = Release|Win32 @@ -428,7 +428,7 @@ Global {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.GLRelease|Win32.ActiveCfg = Release|Win32 {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.GLRelease|x64.ActiveCfg = Release|Win32 {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.MDebug|Win32.ActiveCfg = Debug|Win32 - {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.MDebug|x64.ActiveCfg = Debug|Win32 + {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.MDebug|x64.ActiveCfg = Release|Win32 {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.MinGLDebug|Win32.ActiveCfg = Debug|Win32 {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.MinGLDebug|x64.ActiveCfg = Debug|Win32 {4735677B-6D5A-4BE6-A945-CB32DEADBEEF}.MinGLRelease|Win32.ActiveCfg = Release|Win32 diff --git a/engine/dotnet2005/ftequake.vcproj b/engine/dotnet2005/ftequake.vcproj index 29cfb4613..eba3a3c99 100644 --- a/engine/dotnet2005/ftequake.vcproj +++ b/engine/dotnet2005/ftequake.vcproj @@ -347,7 +347,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include,../d3d,../d3d9,../libs/dxsdk9/include" - PreprocessorDefinitions="_DEBUG;D3DQUAKE;WIN32;_WINDOWS" + PreprocessorDefinitions="_DEBUG;D3DQUAKE;WIN32;_WINDOWS;MULTITHREAD" RuntimeLibrary="1" EnableFunctionLevelLinking="true" FloatingPointModel="2" @@ -766,7 +766,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include,../d3d,../d3d9,../libs/dxsdk9/include" - PreprocessorDefinitions="_DEBUG;GLQUAKE;WIN32;_WINDOWS;MULTITHREAD" + PreprocessorDefinitions="_DEBUG;GLQUAKE;WIN32;_WINDOWS;MULTITHREAD;USE_MSVCRT_DEBUG" BasicRuntimeChecks="3" RuntimeLibrary="1" EnableFunctionLevelLinking="true" @@ -1174,7 +1174,7 @@ Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include,../d3d,../d3d9,../libs/dxsdk9/include" - PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;GLQUAKE;D3DQUAKE" + PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;GLQUAKE;D3DQUAKE;MULTITHREAD" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" @@ -1373,7 +1373,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include,../d3d,../d3d9,../libs/dxsdk9/include" - PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;SERVERONLY" + PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;SERVERONLY;MULTITHREAD" MinimalRebuild="true" RuntimeLibrary="0" FloatingPointModel="2" @@ -1576,7 +1576,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include,../d3d,../d3d9,../libs/dxsdk9/include" - PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;GLQUAKE;D3DQUAKE" + PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;GLQUAKE;D3DQUAKE;SWQUAKE;MULTITHREAD" RuntimeLibrary="1" FloatingPointModel="2" UsePrecompiledHeader="2" @@ -1585,7 +1585,7 @@ AssemblerListingLocation=".\MDebug/" ObjectFile=".\MDebug/" ProgramDataBaseFileName=".\MDebug/" - BrowseInformation="2" + BrowseInformation="1" BrowseInformationFile=".\MDebug/" WarningLevel="3" SuppressStartupBanner="true" @@ -1794,7 +1794,7 @@ OmitFramePointers="true" WholeProgramOptimization="true" AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include,../d3d,../d3d9,../libs/dxsdk9/include" - PreprocessorDefinitions="NDEBUG;GLQUAKE;WIN32;_WINDOWS" + PreprocessorDefinitions="NDEBUG;GLQUAKE;WIN32;_WINDOWS;MULTITHREAD" StringPooling="true" RuntimeLibrary="0" BufferSecurityCheck="false" @@ -2010,7 +2010,7 @@ OmitFramePointers="true" WholeProgramOptimization="true" AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include,../d3d,../d3d9,../libs/dxsdk9/include" - PreprocessorDefinitions="_DEBUG;D3D9QUAKE;D3D11QUAKE;WIN32;_WINDOWS" + PreprocessorDefinitions="_DEBUG;D3D9QUAKE;D3D11QUAKE;WIN32;_WINDOWS;MULTITHREAD" RuntimeLibrary="1" EnableFunctionLevelLinking="true" FloatingPointModel="2" diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index c56849588..a4e8e886c 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -292,7 +292,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e } else { - skins = (galiasskin_t*)((char *)inf + inf->ofsskins); + skins = inf->ofsskins; if (e->skinnum >= 0 && e->skinnum < inf->numskins) skins += e->skinnum; @@ -308,7 +308,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e subframe = cl.time*skins->skinspeed; subframe = subframe%skins->numshaders; - shader = *(shader_t**)((char *)skins + skins->ofsshaders + subframe*sizeof(shader_t*)); + shader = skins->ofsshaders[subframe]; } } @@ -413,9 +413,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e { if (skins->ofstexels) { - int *offsets; - offsets = (int*)((qbyte *)skins + skins->ofstexels); - original = (qbyte*)offsets + offsets[subframe]; + original = skins->ofstexels[subframe]; inwidth = skins->skinwidth; inheight = skins->skinheight; } @@ -601,7 +599,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e if (!inf->numskins) return NULL; - skins = (galiasskin_t*)((char *)inf + inf->ofsskins); + skins = inf->ofsskins; if (e->skinnum >= 0 && e->skinnum < inf->numskins) skins += e->skinnum; else @@ -616,7 +614,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e frame = cl.time*skins->skinspeed; frame = frame%skins->numshaders; - return *(shader_t**)((char *)skins + skins->ofsshaders + frame*sizeof(shader_t*)); + return skins->ofsshaders[frame]; } #if defined(RTLIGHTS) @@ -960,11 +958,11 @@ void R_GAlias_DrawBatch(batch_t *batch) currententity = e; /*nolightdir =*/ R_CalcModelLighting(e, clmodel); - inf = RMod_Extradata (clmodel); + inf = Mod_Extradata (clmodel); if (inf) { memset(&mesh, 0, sizeof(mesh)); - for(surfnum=0; inf; ((inf->nextsurf)?(inf = (galiasinfo_t*)((char *)inf + inf->nextsurf)):(inf=NULL)), surfnum++) + for(surfnum=0; inf; inf=inf->nextsurf, surfnum++) { if (batch->surf_first == surfnum) { @@ -1027,9 +1025,9 @@ void R_GAlias_GenerateBatches(entity_t *e, batch_t **batches) return; } - inf = RMod_Extradata (clmodel); + inf = Mod_Extradata (clmodel); - for(surfnum=0; inf; ((inf->nextsurf)?(inf = (galiasinfo_t*)((char *)inf + inf->nextsurf)):(inf=NULL)), surfnum++) + for(surfnum=0; inf; inf=inf->nextsurf, surfnum++) { regshader = GL_ChooseSkin(inf, clmodel, surfnum, e, &skin); if (!regshader) @@ -1382,7 +1380,7 @@ void R_DrawGAliasShadowVolume(entity_t *e, vec3_t lightpos, float radius) BE_SelectEntity(e); - inf = RMod_Extradata (clmodel); + inf = Mod_Extradata (clmodel); while(inf) { if (inf->ofs_trineighbours) @@ -1393,10 +1391,7 @@ void R_DrawGAliasShadowVolume(entity_t *e, vec3_t lightpos, float radius) R_DrawShadowVolume(&mesh); } - if (inf->nextsurf) - inf = (galiasinfo_t*)((char *)inf + inf->nextsurf); - else - inf = NULL; + inf = inf->nextsurf; surfnum++; } @@ -1736,7 +1731,7 @@ static void R_DB_Sprite(batch_t *batch) // don't even bother culling, because it's just a single // polygon without a surface cache frame = R_GetSpriteFrame (e); - psprite = e->model->cache.data; + psprite = e->model->meshinfo; sprtype = psprite->type; } if (!frame->shader) diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index af5c33a1d..7e41ddc86 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -1006,6 +1006,7 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass) { extern texid_t missing_texture; extern texid_t missing_texture_gloss; + extern texid_t missing_texture_normal; extern texid_t scenepp_postproc_cube; extern texid_t r_whiteimage; @@ -1029,7 +1030,7 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass) { int lmi = shaderstate.curbatch->lightmap[0]; if (lmi < 0 || !lightmap[lmi]->hasdeluxe) - t = r_nulltex; //fixme + t = missing_texture_normal; else t = lightmap[lmi+1]->lightmap_texture; } @@ -1041,7 +1042,7 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass) t = missing_texture; break; case T_GEN_NORMALMAP: - t = shaderstate.curtexnums?shaderstate.curtexnums->bump:r_nulltex; /*FIXME: nulltex is not correct*/ + t = (shaderstate.curtexnums && TEXVALID(shaderstate.curtexnums->bump))?shaderstate.curtexnums->bump:missing_texture_normal; break; case T_GEN_SPECULAR: if (TEXVALID(shaderstate.curtexnums->specular)) diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index c1b62592f..c8472887a 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -460,23 +460,9 @@ void GLDraw_Init (void) maxtexsize = gl_max_size.value; - if (gl_config.gles) - { - if (maxtexsize < 512) //this needs to be able to hold the image in unscaled form. - sizeofuploadmemorybufferintermediate = 512*512*4; //make sure we can load 512*512 images whatever happens. - else - sizeofuploadmemorybufferintermediate = maxtexsize*maxtexsize*4; //gl supports huge images, so so shall we. - } - else - { - if (maxtexsize < 2048) //this needs to be able to hold the image in unscaled form. - sizeofuploadmemorybufferintermediate = 2048*2048*4; //make sure we can load 2048*2048 images whatever happens. - else - sizeofuploadmemorybufferintermediate = maxtexsize*maxtexsize*4; //gl supports huge images, so so shall we. - } - //required to hold the image after scaling has occured - sizeofuploadmemorybuffer = maxtexsize*maxtexsize*4; + sizeofuploadmemorybuffer = 1; + sizeofuploadmemorybufferintermediate = 1; TRACE(("dbg: GLDraw_ReInit: Allocating upload buffers\n")); uploadmemorybuffer = BZ_Realloc(uploadmemorybuffer, sizeofuploadmemorybuffer); uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); @@ -1132,7 +1118,7 @@ void GL_Upload32_Int (char *name, unsigned *data, int width, int height, unsigne { int miplevel=0; int samples; - unsigned *scaled = (unsigned *)uploadmemorybuffer; + unsigned *scaled; int scaled_width, scaled_height; int type; int targ, targface; @@ -1173,8 +1159,12 @@ void GL_Upload32_Int (char *name, unsigned *data, int width, int height, unsigne TRACE(("dbg: GL_Upload32: %i %i\n", scaled_width, scaled_height)); - if (scaled_width * scaled_height > sizeofuploadmemorybuffer/4) - Sys_Error ("GL_LoadTexture: too big"); + if (scaled_width * scaled_height*4 > sizeofuploadmemorybuffer) + { + sizeofuploadmemorybuffer = scaled_width * scaled_height * 4; + uploadmemorybuffer = BZ_Realloc(uploadmemorybuffer, sizeofuploadmemorybuffer); + } + scaled = (unsigned *)uploadmemorybuffer; if (gl_config.gles) { @@ -1386,15 +1376,18 @@ void GL_Upload24BGR (char *name, qbyte *framedata, int inwidth, int inheight, un int v; unsigned int f, fstep; qbyte *src, *dest; - dest = uploadmemorybufferintermediate; //change from bgr bottomup to rgba topdown outwidth = inwidth; outheight = inheight; GL_RoundDimensions(&outwidth, &outheight, !(flags&IF_NOMIPMAP)); - if (outwidth*outheight > sizeofuploadmemorybufferintermediate/4) - Sys_Error("GL_Upload24BGR: image too big (%i*%i)", inwidth, inheight); + if (outwidth*outheight*4 > sizeofuploadmemorybufferintermediate) + { + sizeofuploadmemorybufferintermediate = outwidth*outheight*4; + uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); + } + dest = uploadmemorybufferintermediate; for (y=0 ; y sizeofuploadmemorybufferintermediate/4) - Sys_Error("GL_Upload24BGR_Flip: image too big (%i*%i)", inwidth, inheight); + if (outwidth*outheight*4 > sizeofuploadmemorybufferintermediate) + { + sizeofuploadmemorybufferintermediate = outwidth*outheight*4; + uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); + } + dest = uploadmemorybufferintermediate; for (y=1 ; y<=outheight ; y++) { @@ -1517,15 +1513,19 @@ void GL_Upload24BGR_Flip (char *name, qbyte *framedata, int inwidth, int inheigh void GL_Upload8Grey (unsigned char*data, int width, int height, unsigned int flags) { int samples; - unsigned char *scaled = uploadmemorybuffer; + unsigned char *scaled; int scaled_width, scaled_height; scaled_width = width; scaled_height = height; GL_RoundDimensions(&scaled_width, &scaled_height, !(flags&IF_NOMIPMAP)); - if (scaled_width * scaled_height > sizeofuploadmemorybuffer/4) - Sys_Error ("GL_LoadTexture: too big"); + if (scaled_width * scaled_height*4 > sizeofuploadmemorybuffer) + { + sizeofuploadmemorybuffer = scaled_width * scaled_height * 4; + uploadmemorybuffer = BZ_Realloc(uploadmemorybuffer, sizeofuploadmemorybuffer); + } + scaled = uploadmemorybuffer; samples = 1;//alpha ? gl_alpha_format : gl_solid_format; @@ -1639,57 +1639,66 @@ void GL_MipMapNormal (qbyte *in, int width, int height) //PENTA //sizeofuploadmemorybufferintermediate is guarenteed to be bigger or equal to the normal uploadbuffer size -unsigned int * genNormalMap(qbyte *pixels, int w, int h, float scale) +static unsigned int * genNormalMap(qbyte *pixels, int w, int h, float scale) { - int i, j, wr, hr; - unsigned char r, g, b; - unsigned *nmap = (unsigned *)uploadmemorybufferintermediate; - float sqlen, reciplen, nx, ny, nz; + int i, j, wr, hr; + unsigned char r, g, b; + unsigned *nmap; + float sqlen, reciplen, nx, ny, nz; - const float oneOver255 = 1.0f/255.0f; + const float oneOver255 = 1.0f/255.0f; - float c, cx, cy, dcx, dcy; + float c, cx, cy, dcx, dcy; - wr = w; - hr = h; + if (w*h*4 > sizeofuploadmemorybufferintermediate) + { + sizeofuploadmemorybufferintermediate = w*h*4; + uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); + } + nmap = (unsigned *)uploadmemorybufferintermediate; - for (i=0; i Added support for big endian. - } - } + /* Repack the normalized vector into an RGB unsigned qbyte + vector in the normal map image. */ + r = (qbyte) (128 + 127*nx); + g = (qbyte) (128 + 127*ny); + b = (qbyte) (128 + 127*nz); - return &nmap[0]; + /* The highest resolution mipmap level always has a + unit length magnitude. */ + nmap[i*w+j] = LittleLong ((pixels[i*wr + j] << 24)|(b << 16)|(g << 8)|(r)); // Added support for big endian. + } + } + + return &nmap[0]; } //PENTA void GL_UploadBump(qbyte *data, int width, int height, unsigned int mipmap, float bumpscale) { - unsigned char *scaled = uploadmemorybuffer; + unsigned char *scaled; int scaled_width, scaled_height; qbyte *nmap; @@ -1699,8 +1708,12 @@ void GL_UploadBump(qbyte *data, int width, int height, unsigned int mipmap, floa scaled_height = height; GL_RoundDimensions(&scaled_width, &scaled_height, mipmap); - if (scaled_width * scaled_height > sizeofuploadmemorybuffer/4) - Sys_Error ("GL_LoadTexture: too big"); + if (scaled_width*scaled_height*4 > sizeofuploadmemorybuffer) + { + sizeofuploadmemorybuffer = scaled_width*scaled_height*4; + uploadmemorybuffer = BZ_Realloc(uploadmemorybuffer, sizeofuploadmemorybuffer); + } + scaled = uploadmemorybuffer; //To resize or not to resize if (scaled_width == width && scaled_height == height) @@ -1779,7 +1792,7 @@ void GL_Upload8_EXT (qbyte *data, int width, int height, qboolean mipmap, qbool int i, s; qboolean noalpha; int samples; - unsigned char *scaled = uploadmemorybuffer; + unsigned char *scaled; int scaled_width, scaled_height; GLDraw_Init15to8(); @@ -1804,8 +1817,12 @@ void GL_Upload8_EXT (qbyte *data, int width, int height, qboolean mipmap, qbool scaled_height = height; GL_RoundDimensions(&scaled_width, &scaled_height, mipmap); - if (scaled_width * scaled_height > sizeofuploadmemorybufferintermediate/4) - Sys_Error ("GL_LoadTexture: too big"); + if (scaled_width*scaled_height*4 > sizeofuploadmemorybuffer) + { + sizeofuploadmemorybuffer = scaled_width*scaled_height*4; + uploadmemorybuffer = BZ_Realloc(uploadmemorybuffer, sizeofuploadmemorybuffer); + } + scaled = uploadmemorybuffer; samples = 1; // alpha ? gl_alpha_format : gl_solid_format; @@ -1879,13 +1896,17 @@ unsigned ColorPercent[16] = void GL_Upload8 (char *name, qbyte *data, int width, int height, unsigned int flags, unsigned int alpha) { - unsigned *trans = (unsigned *)uploadmemorybufferintermediate; + unsigned *trans; int i, s; qboolean noalpha; int p; - if (width*height > sizeofuploadmemorybufferintermediate/4) - Sys_Error("GL_Upload8: image too big (%i*%i)", width, height); + if (width*height*4 > sizeofuploadmemorybufferintermediate) + { + sizeofuploadmemorybufferintermediate = width*height*4; + uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); + } + trans = (unsigned *)uploadmemorybufferintermediate; s = width*height; // if there are no transparent pixels, make it a 3 component @@ -1981,13 +2002,18 @@ void GL_Upload8 (char *name, qbyte *data, int width, int height, unsigned int fl void GL_Upload8FB (qbyte *data, int width, int height, unsigned flags) { - unsigned *trans = (unsigned *)uploadmemorybufferintermediate; + unsigned *trans; int i, s; int p; s = width*height; - if (s > sizeofuploadmemorybufferintermediate/4) - Sys_Error("GL_Upload8FB: image too big (%i*%i)", width, height); + if (s*4 > sizeofuploadmemorybufferintermediate) + { + sizeofuploadmemorybufferintermediate = s*4; + uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); + } + trans = (unsigned *)uploadmemorybufferintermediate; + // if there are no transparent pixels, make it a 3 component // texture even if it was specified as otherwise for (i=0 ; i sizeofuploadmemorybufferintermediate/4) - Sys_Error("GL_Upload8Pal24: image too big (%i*%i)", width, height); + if (s*4 > sizeofuploadmemorybufferintermediate) + { + sizeofuploadmemorybufferintermediate = s*4; + uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); + } + trans = uploadmemorybufferintermediate; // if there are no transparent pixels, make it a 3 component // texture even if it was specified as otherwise @@ -2086,13 +2116,17 @@ void GL_Upload8Pal24 (qbyte *data, qbyte *pal, int width, int height, unsigned i } static void GL_Upload8Pal32 (qbyte *data, qbyte *pal, int width, int height, unsigned int flags) { - qbyte *trans = uploadmemorybufferintermediate; + qbyte *trans; int i, s; extern qbyte gammatable[256]; s = width*height; - if (s > sizeofuploadmemorybufferintermediate/4) - Sys_Error("GL_Upload8Pal32: image too big (%i*%i)", width, height); + if (s*4 > sizeofuploadmemorybufferintermediate) + { + sizeofuploadmemorybufferintermediate = s*4; + uploadmemorybufferintermediate = BZ_Realloc(uploadmemorybufferintermediate, sizeofuploadmemorybufferintermediate); + } + trans = uploadmemorybufferintermediate; if (s&3) Sys_Error ("GL_Upload8: s&3"); diff --git a/engine/gl/gl_heightmap.c b/engine/gl/gl_heightmap.c index a77c4ee59..aab19a9a1 100644 --- a/engine/gl/gl_heightmap.c +++ b/engine/gl/gl_heightmap.c @@ -3314,12 +3314,12 @@ qboolean Terr_LoadTerrainModel (model_t *mod, void *buffer) mod->type = mod_heightmap; - hm = Hunk_Alloc(sizeof(*hm)); + hm = ZG_Malloc(&mod->memgroup, sizeof(*hm)); memset(hm, 0, sizeof(*hm)); ClearLink(&hm->recycle); COM_FileBase(mod->name, hm->path, sizeof(hm->path)); - mod->entities = Hunk_AllocName(strlen(buffer)+1, mod->name); + mod->entities = ZG_Malloc(&mod->memgroup, strlen(buffer)+1); strcpy(mod->entities, buffer); hm->sectionsize = sectsize; diff --git a/engine/gl/gl_hlmdl.c b/engine/gl/gl_hlmdl.c index c0fa54707..c7245827b 100644 --- a/engine/gl/gl_hlmdl.c +++ b/engine/gl/gl_hlmdl.c @@ -84,8 +84,7 @@ qboolean Mod_LoadHLModel (model_t *mod, void *buffer) hlmdl_bone_t *bones; hlmdl_bonecontroller_t *bonectls; shader_t **shaders; - - int start, end, total; + void *texmem = NULL; /*~~*/ @@ -115,13 +114,10 @@ qboolean Mod_LoadHLModel (model_t *mod, void *buffer) } } - start = Hunk_LowMark (); - - //load the model into hunk - model = Hunk_Alloc(sizeof(hlmodelcache_t)); + model = ZG_Malloc(&mod->memgroup, sizeof(hlmodelcache_t)); - header = Hunk_Alloc(com_filesize); + header = ZG_Malloc(&mod->memgroup, com_filesize); memcpy(header, buffer, com_filesize); #if defined(HLSERVER) && (defined(__powerpc__) || defined(__ppc__)) @@ -136,20 +132,17 @@ qboolean Mod_LoadHLModel (model_t *mod, void *buffer) if (header->version != 10) { Con_Printf(CON_ERROR "Cannot load model %s - unknown version %i\n", mod->name, header->version); - Hunk_FreeToLowMark(start); return false; } if (header->numcontrollers > MAX_BONE_CONTROLLERS) { Con_Printf(CON_ERROR "Cannot load model %s - too many controllers %i\n", mod->name, header->numcontrollers); - Hunk_FreeToLowMark(start); return false; } if (header->numbones > MAX_BONES) { Con_Printf(CON_ERROR "Cannot load model %s - too many bones %i\n", mod->name, header->numbones); - Hunk_FreeToLowMark(start); return false; } @@ -159,7 +152,7 @@ qboolean Mod_LoadHLModel (model_t *mod, void *buffer) char texmodelname[MAX_QPATH]; COM_StripExtension(mod->name, texmodelname, sizeof(texmodelname)); //no textures? eesh. They must be stored externally. - texheader = (hlmdl_header_t*)COM_LoadHunkFile(va("%st.mdl", texmodelname)); + texheader = texmem = (hlmdl_header_t*)FS_LoadMallocFile(va("%st.mdl", texmodelname)); if (texheader) { if (texheader->version != 10) @@ -198,7 +191,7 @@ qboolean Mod_LoadHLModel (model_t *mod, void *buffer) model->bones = (char *)bones - (char *)model; model->bonectls = (char *)bonectls - (char *)model; - shaders = Hunk_Alloc(texheader->numtextures*sizeof(shader_t)); + shaders = ZG_Malloc(&mod->memgroup, texheader->numtextures*sizeof(shader_t)); model->shaders = (char *)shaders - (char *)model; for(i = 0; i < texheader->numtextures; i++) { @@ -206,21 +199,11 @@ qboolean Mod_LoadHLModel (model_t *mod, void *buffer) shaders[i]->defaulttextures.base = R_LoadTexture8Pal24("", tex[i].w, tex[i].h, (qbyte *) texheader + tex[i].offset, (qbyte *) texheader + tex[i].w * tex[i].h + tex[i].offset, IF_NOALPHA|IF_NOGAMMA); } - -// -// move the complete, relocatable alias model to the cache -// - end = Hunk_LowMark (); - total = end - start; + if (texmem) + Z_Free(texmem); mod->type = mod_halflife; - - Cache_Alloc (&mod->cache, total, mod->name); - if (!mod->cache.data) - return false; - memcpy (mod->cache.data, model, total); - - Hunk_FreeToLowMark (start); + mod->meshinfo = model; return true; } diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 382bbcb2a..0ffde7256 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -39,23 +39,23 @@ char loadname[32]; // for hunk tags void CM_Init(void); -qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer); -qboolean RMod_LoadSprite2Model (model_t *mod, void *buffer); -qboolean RMod_LoadBrushModel (model_t *mod, void *buffer); +qboolean Mod_LoadSpriteModel (model_t *mod, void *buffer); +qboolean Mod_LoadSprite2Model (model_t *mod, void *buffer); +qboolean Mod_LoadBrushModel (model_t *mod, void *buffer); #ifdef Q2BSPS qboolean Mod_LoadQ2BrushModel (model_t *mod, void *buffer); #endif #ifdef HALFLIFEMODELS qboolean Mod_LoadHLModel (model_t *mod, void *buffer); #endif -model_t *RMod_LoadModel (model_t *mod, qboolean crash); +model_t *Mod_LoadModel (model_t *mod, qboolean crash); #ifdef MAP_DOOM qboolean Mod_LoadDoomLevel(model_t *mod); #endif #ifdef DOOMWADS -void RMod_LoadDoomSprite (model_t *mod); +void Mod_LoadDoomSprite (model_t *mod); #endif #define MAX_MOD_KNOWN 2048 @@ -76,7 +76,7 @@ int numlightdata; qboolean writelitfile; long relitsurface; -void RMod_UpdateLightmap(int snum) +void Mod_UpdateLightmap(int snum) { msurface_t *s; if (lightmodel) @@ -97,7 +97,21 @@ void RMod_UpdateLightmap(int snum) #endif -void RMod_BatchList_f(void) +void Mod_MemList_f(void) +{ + int m; + model_t *mod; + int total = 0; + for (m=0 , mod=mod_known ; mmemgroup.bytes) + Con_Printf("%s: %i bytes\n", mod->name, mod->memgroup.bytes); + total += mod->memgroup.bytes; + } + Con_Printf("Total: %i bytes\n", total); +} + +void Mod_BatchList_f(void) { int m, i; model_t *mod; @@ -131,7 +145,7 @@ void RMod_BatchList_f(void) } } -void RMod_TextureList_f(void) +void Mod_TextureList_f(void) { int m, i; texture_t *tx; @@ -174,7 +188,7 @@ void RMod_TextureList_f(void) Con_Printf("%u\n", count); } -void RMod_BlockTextureColour_f (void) +void Mod_BlockTextureColour_f (void) { char texname[64]; model_t *mod; @@ -247,7 +261,7 @@ int RelightThread(void *arg) } #endif -void RMod_Think (void) +void Mod_Think (void) { #ifdef RUNTIMELIGHTING if (lightmodel) @@ -286,7 +300,7 @@ void RMod_Think (void) } #else LightFace(relitsurface); - RMod_UpdateLightmap(relitsurface); + Mod_UpdateLightmap(relitsurface); relitsurface++; #endif @@ -365,7 +379,7 @@ void Mod_RebuildLightmaps (void) } } -void RMod_ResortShaders(void) +void Mod_ResortShaders(void) { //called when some shader changed its sort key. //this means we have to hunt down all models and update their batches. @@ -398,14 +412,15 @@ void RMod_ResortShaders(void) =================== Mod_ClearAll =================== -*/ -void RMod_ClearAll (void) -{ - int i; - model_t *mod; +called before new content is loaded. +*/ +static int mod_datasequence; +void Mod_ClearAll (void) +{ #ifdef RUNTIMELIGHTING #ifdef MULTITHREAD + int i; wantrelight = false; for (i = 0; i < relightthreads; i++) { @@ -417,28 +432,44 @@ void RMod_ClearAll (void) lightmodel = NULL; #endif - //when the hunk is reset, all bsp models need to be reloaded + mod_datasequence++; +} + +//called after all new content has been precached +void Mod_Flush(qboolean force) +{ + int i; + model_t *mod; + for (i=0 , mod=mod_known ; ineedload) continue; - if (mod->type == mod_brush) + //this model isn't active any more. + if (mod->datasequence != mod_datasequence || force) { - Surf_Clear(mod); - } + Con_DPrintf("model \"%s\" no longer needed\n", mod->name); + //purge any vbos + if (mod->type == mod_brush) + { + Surf_Clear(mod); + } + #ifdef TERRAIN - if (mod->terrain) - { - Terr_PurgeTerrainModel(mod, false, false); - mod->terrain = NULL; - } + //nuke terrain buffers + if (mod->terrain) + { + Terr_PurgeTerrainModel(mod, false, false); + mod->terrain = NULL; + } #endif - if (mod->type != mod_alias - && mod->type != mod_halflife - ) + //and obliterate anything else remaining in memory. + ZG_FreeGroup(&mod->memgroup); + mod->meshinfo = NULL; mod->needload = true; + } } } @@ -447,20 +478,23 @@ void RMod_ClearAll (void) Mod_Init =============== */ -void RMod_Init (void) +void Mod_Init (void) { - RMod_ClearAll(); + Mod_ClearAll(); //shouldn't be needed + Mod_Flush(true);//shouldn't be needed mod_numknown = 0; Q1BSP_Init(); - Cmd_AddCommand("mod_batchlist", RMod_BatchList_f); - Cmd_AddCommand("mod_texturelist", RMod_TextureList_f); - Cmd_AddCommand("mod_usetexture", RMod_BlockTextureColour_f); + Cmd_AddCommand("mod_memlist", Mod_MemList_f); + Cmd_AddCommand("mod_batchlist", Mod_BatchList_f); + Cmd_AddCommand("mod_texturelist", Mod_TextureList_f); + Cmd_AddCommand("mod_usetexture", Mod_BlockTextureColour_f); } -void RMod_Shutdown (void) +void Mod_Shutdown (void) { - RMod_ClearAll(); + Mod_ClearAll(); + Mod_Flush(true); mod_numknown = 0; Cmd_RemoveCommand("mod_batchlist"); @@ -475,19 +509,19 @@ Mod_Init Caches the data if needed =============== */ -void *RMod_Extradata (model_t *mod) +void *Mod_Extradata (model_t *mod) { void *r; - r = Cache_Check (&mod->cache); + r = mod->meshinfo; if (r) return r; - RMod_LoadModel (mod, true); + Mod_LoadModel (mod, true); - if (!mod->cache.data) + if (!mod->meshinfo) Sys_Error ("Mod_Extradata: caching failed"); - return mod->cache.data; + return mod->meshinfo; } /* @@ -495,7 +529,7 @@ void *RMod_Extradata (model_t *mod) Mod_PointInLeaf =============== */ -mleaf_t *RMod_PointInLeaf (model_t *model, vec3_t p) +mleaf_t *Mod_PointInLeaf (model_t *model, vec3_t p) { mnode_t *node; float d; @@ -540,7 +574,7 @@ Mod_FindName ================== */ -model_t *RMod_FindName (char *name) +model_t *Mod_FindName (char *name) { int i; model_t *mod; @@ -567,6 +601,8 @@ model_t *RMod_FindName (char *name) mod->particletrail = -1; } + //mark it as active, so it doesn't get flushed prematurely + mod->datasequence = mod_datasequence; return mod; } @@ -576,18 +612,18 @@ Mod_TouchModel ================== */ -void RMod_TouchModel (char *name) +void Mod_TouchModel (char *name) { model_t *mod; - mod = RMod_FindName (name); + mod = Mod_FindName (name); if (!mod->needload) { - if (mod->type == mod_alias - || mod->type == mod_halflife - ) - Cache_Check (&mod->cache); +// if (mod->type == mod_alias +// || mod->type == mod_halflife +// ) +// Cache_Check (&mod->cache); } } @@ -598,9 +634,8 @@ Mod_LoadModel Loads a model into the cache ================== */ -model_t *RMod_LoadModel (model_t *mod, qboolean crash) +model_t *Mod_LoadModel (model_t *mod, qboolean crash) { - void *d; unsigned *buf = NULL; qbyte stackbuf[1024]; // avoid dirtying the cache heap char mdlbase[MAX_QPATH]; @@ -615,8 +650,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) || mod->type == mod_halflife ) { - d = Cache_Check (&mod->cache); - if (d) + if (mod->meshinfo) return mod; } else @@ -712,12 +746,12 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) if (replstr) { - TRACE(("RMod_LoadModel: Trying to load (replacement) model \"%s.%s\"\n", mdlbase, com_token)); + TRACE(("Mod_LoadModel: Trying to load (replacement) model \"%s.%s\"\n", mdlbase, com_token)); buf = (unsigned *)COM_LoadStackFile (va("%s.%s", mdlbase, com_token), stackbuf, sizeof(stackbuf)); } else { - TRACE(("RMod_LoadModel: Trying to load model \"%s\"\n", mod->name)); + TRACE(("Mod_LoadModel: Trying to load model \"%s\"\n", mod->name)); buf = (unsigned *)COM_LoadStackFile (mod->name, stackbuf, sizeof(stackbuf)); if (!buf) { @@ -725,8 +759,8 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) if (doomsprite) // special case needed for doom sprites { mod->needload = false; - TRACE(("RMod_LoadModel: doomsprite: \"%s\"\n", mod->name)); - RMod_LoadDoomSprite(mod); + TRACE(("Mod_LoadModel: doomsprite: \"%s\"\n", mod->name)); + Mod_LoadDoomSprite(mod); return mod; } #endif @@ -751,14 +785,14 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) //The binary 3d mesh model formats case RAPOLYHEADER: case IDPOLYHEADER: - TRACE(("RMod_LoadModel: Q1 mdl\n")); + TRACE(("Mod_LoadModel: Q1 mdl\n")); if (!Mod_LoadQ1Model(mod, buf)) continue; break; #ifdef MD2MODELS case MD2IDALIASHEADER: - TRACE(("RMod_LoadModel: md2\n")); + TRACE(("Mod_LoadModel: md2\n")); if (!Mod_LoadQ2Model(mod, buf)) continue; break; @@ -766,7 +800,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef MD3MODELS case MD3_IDENT: - TRACE(("RMod_LoadModel: md3\n")); + TRACE(("Mod_LoadModel: md3\n")); if (!Mod_LoadQ3Model (mod, buf)) continue; Surf_BuildModelLightmaps(mod); @@ -775,7 +809,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef HALFLIFEMODELS case (('T'<<24)+('S'<<16)+('D'<<8)+'I'): - TRACE(("RMod_LoadModel: HL mdl\n")); + TRACE(("Mod_LoadModel: HL mdl\n")); if (!Mod_LoadHLModel (mod, buf)) continue; break; @@ -784,14 +818,14 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) //Binary skeletal model formats #ifdef ZYMOTICMODELS case (('O'<<24)+('M'<<16)+('Y'<<8)+'Z'): - TRACE(("RMod_LoadModel: zym\n")); + TRACE(("Mod_LoadModel: zym\n")); if (!Mod_LoadZymoticModel(mod, buf)) continue; break; #endif #ifdef DPMMODELS case (('K'<<24)+('R'<<16)+('A'<<8)+'D'): - TRACE(("RMod_LoadModel: dpm\n")); + TRACE(("Mod_LoadModel: dpm\n")); if (!Mod_LoadDarkPlacesModel(mod, buf)) continue; break; @@ -799,7 +833,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef PSKMODELS case ('A'<<0)+('C'<<8)+('T'<<16)+('R'<<24): - TRACE(("RMod_LoadModel: psk\n")); + TRACE(("Mod_LoadModel: psk\n")); if (!Mod_LoadPSKModel (mod, buf)) continue; break; @@ -807,7 +841,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef INTERQUAKEMODELS case ('I'<<0)+('N'<<8)+('T'<<16)+('E'<<24): - TRACE(("RMod_LoadModel: IQM\n")); + TRACE(("Mod_LoadModel: IQM\n")); if (!Mod_LoadInterQuakeModel (mod, buf)) continue; break; @@ -816,15 +850,15 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) //Binary Sprites #ifdef SP2MODELS case IDSPRITE2HEADER: - TRACE(("RMod_LoadModel: q2 sp2\n")); - if (!RMod_LoadSprite2Model (mod, buf)) + TRACE(("Mod_LoadModel: q2 sp2\n")); + if (!Mod_LoadSprite2Model (mod, buf)) continue; break; #endif case IDSPRITEHEADER: - TRACE(("RMod_LoadModel: q1 spr\n")); - if (!RMod_LoadSpriteModel (mod, buf)) + TRACE(("Mod_LoadModel: q1 spr\n")); + if (!Mod_LoadSpriteModel (mod, buf)) continue; break; @@ -834,7 +868,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) case ('F'<<0)+('B'<<8)+('S'<<16)+('P'<<24): case ('R'<<0)+('B'<<8)+('S'<<16)+('P'<<24): case IDBSPHEADER: //looks like id switched to have proper ids - TRACE(("RMod_LoadModel: q2/q3/raven/fusion bsp\n")); + TRACE(("Mod_LoadModel: q2/q3/raven/fusion bsp\n")); if (!Mod_LoadQ2BrushModel (mod, buf)) continue; Surf_BuildModelLightmaps(mod); @@ -843,7 +877,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef MAP_DOOM case (('D'<<24)+('A'<<16)+('W'<<8)+'I'): //the id is hacked by the FS .wad loader (main wad). case (('D'<<24)+('A'<<16)+('W'<<8)+'P'): //the id is hacked by the FS .wad loader (patch wad). - TRACE(("RMod_LoadModel: doom iwad/pwad map\n")); + TRACE(("Mod_LoadModel: doom iwad/pwad map\n")); if (!Mod_LoadDoomLevel (mod)) continue; break; @@ -854,8 +888,8 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) case 28: //prerel case BSPVERSION_LONG1: case BSPVERSION_LONG2: - TRACE(("RMod_LoadModel: hl/q1 bsp\n")); - if (!RMod_LoadBrushModel (mod, buf)) + TRACE(("Mod_LoadModel: hl/q1 bsp\n")); + if (!Mod_LoadBrushModel (mod, buf)) continue; Surf_BuildModelLightmaps(mod); break; @@ -867,14 +901,14 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef MD5MODELS if (!strcmp(com_token, "MD5Version")) //doom3 format, text based, skeletal { - TRACE(("RMod_LoadModel: md5mesh/md5anim\n")); + TRACE(("Mod_LoadModel: md5mesh/md5anim\n")); if (!Mod_LoadMD5MeshModel (mod, buf)) continue; break; } if (!strcmp(com_token, "EXTERNALANIM")) //custom format, text based, specifies skeletal models to load and which md5anim files to use. { - TRACE(("RMod_LoadModel: blurgh\n")); + TRACE(("Mod_LoadModel: blurgh\n")); if (!Mod_LoadCompositeAnim (mod, buf)) continue; break; @@ -883,7 +917,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef MAP_PROC if (!strcmp(com_token, "CM")) //doom3 map. { - TRACE(("RMod_LoadModel: doom3 CM\n")); + TRACE(("Mod_LoadModel: doom3 CM\n")); if (!D3_LoadMap_CollisionMap (mod, (char*)buf)) continue; break; @@ -892,7 +926,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) #ifdef TERRAIN if (!strcmp(com_token, "terrain")) //custom format, text based. { - TRACE(("RMod_LoadModel: terrain\n")); + TRACE(("Mod_LoadModel: terrain\n")); if (!Terr_LoadTerrainModel(mod, buf)) continue; break; @@ -906,7 +940,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) P_LoadedModel(mod); Validation_IncludeFile(mod->name, (char *)buf, com_filesize); - TRACE(("RMod_LoadModel: Loaded\n")); + TRACE(("Mod_LoadModel: Loaded\n")); #ifdef RAGDOLL { @@ -949,13 +983,13 @@ Mod_ForName Loads in a model for the given name ================== */ -model_t *RMod_ForName (char *name, qboolean crash) +model_t *Mod_ForName (char *name, qboolean crash) { model_t *mod; - mod = RMod_FindName (name); + mod = Mod_FindName (name); - return RMod_LoadModel (mod, crash); + return Mod_LoadModel (mod, crash); } @@ -974,20 +1008,20 @@ char *advtexturedesc; char *mapsection; char *defaultsection; -static char *RMod_TD_LeaveSection(char *file) +static char *Mod_TD_LeaveSection(char *file) { //recursive routine to find the next } while(file) { file = COM_Parse(file); if (*com_token == '{') - file = RMod_TD_LeaveSection(file); + file = Mod_TD_LeaveSection(file); else if (*com_token == '}') return file; } return NULL; } -static char *RMod_TD_Section(char *file, const char *sectionname) +static char *Mod_TD_Section(char *file, const char *sectionname) { //position within the open brace. while(file) { @@ -1007,11 +1041,11 @@ static char *RMod_TD_Section(char *file, const char *sectionname) } if (*com_token == '{') - file = RMod_TD_LeaveSection(file); + file = Mod_TD_LeaveSection(file); } return NULL; } -void RMod_InitTextureDescs(char *mapname) +void Mod_InitTextureDescs(char *mapname) { if (advtexturedesc) FS_FreeFile(advtexturedesc); @@ -1026,11 +1060,11 @@ void RMod_InitTextureDescs(char *mapname) else { FS_LoadFile(va("map.shaders", mapname), (void**)&advtexturedesc); - mapsection = RMod_TD_Section(advtexturedesc, mapname); - defaultsection = RMod_TD_Section(advtexturedesc, "default"); + mapsection = Mod_TD_Section(advtexturedesc, mapname); + defaultsection = Mod_TD_Section(advtexturedesc, "default"); } } -void RMod_LoadAdvancedTextureSection(char *section, char *name, int *base, int *norm, int *luma, int *gloss, int *alphamode, qboolean *cull) //fixme: add gloss +void Mod_LoadAdvancedTextureSection(char *section, char *name, int *base, int *norm, int *luma, int *gloss, int *alphamode, qboolean *cull) //fixme: add gloss { char stdname[MAX_QPATH] = ""; char flatname[MAX_QPATH] = ""; @@ -1039,7 +1073,7 @@ void RMod_LoadAdvancedTextureSection(char *section, char *name, int *base, int * char lumaname[MAX_QPATH] = ""; char glossname[MAX_QPATH] = ""; - section = RMod_TD_Section(section, name); + section = Mod_TD_Section(section, name); while(section) { @@ -1108,7 +1142,7 @@ void RMod_LoadAdvancedTextureSection(char *section, char *name, int *base, int * if (!*stdname && !*flatname) return; -TRACE(("dbg: RMod_LoadAdvancedTextureSection: %s\n", name)); +TRACE(("dbg: Mod_LoadAdvancedTextureSection: %s\n", name)); if (norm && gl_bumpmappingpossible && cls.allow_bump) { @@ -1139,19 +1173,19 @@ TRACE(("dbg: RMod_LoadAdvancedTextureSection: %s\n", name)); *gloss = Mod_LoadHiResTexture(glossname, NULL, 0); } -void RMod_LoadAdvancedTexture(char *name, int *base, int *norm, int *luma, int *gloss, int *alphamode, qboolean *cull) //fixme: add gloss +void Mod_LoadAdvancedTexture(char *name, int *base, int *norm, int *luma, int *gloss, int *alphamode, qboolean *cull) //fixme: add gloss { if (!gl_load24bit.value) return; if (mapsection) { - RMod_LoadAdvancedTextureSection(mapsection, name,base,norm,luma,gloss,alphamode,cull); + Mod_LoadAdvancedTextureSection(mapsection, name,base,norm,luma,gloss,alphamode,cull); if (*base) return; } if (defaultsection) - RMod_LoadAdvancedTextureSection(defaultsection, name,base,norm,luma,gloss,alphamode,cull); + Mod_LoadAdvancedTextureSection(defaultsection, name,base,norm,luma,gloss,alphamode,cull); } #endif @@ -1184,7 +1218,7 @@ void Mod_FinishTexture(texture_t *tx, texnums_t tn) #define LMT_FULLBRIGHT 2 #define LMT_BUMP 4 #define LMT_SPEC 8 -void RMod_LoadMiptex(texture_t *tx, miptex_t *mt, texnums_t *tn, int maps) +void Mod_LoadMiptex(texture_t *tx, miptex_t *mt, texnums_t *tn, int maps) { char altname[256]; qbyte *base; @@ -1200,7 +1234,7 @@ void RMod_LoadMiptex(texture_t *tx, miptex_t *mt, texnums_t *tn, int maps) else { /* - RMod_LoadAdvancedTexture(tx->name, &tn.base, &tn.bump, &tn.fullbright, &tn.specular, NULL, NULL); + Mod_LoadAdvancedTexture(tx->name, &tn.base, &tn.bump, &tn.fullbright, &tn.specular, NULL, NULL); if (tn.base) continue; */ @@ -1287,7 +1321,7 @@ void RMod_LoadMiptex(texture_t *tx, miptex_t *mt, texnums_t *tn, int maps) snprintf(altname, sizeof(altname)-1, "%s_bump", mt->name); } - if (!TEXVALID(tn->bump) && loadmodel->fromgame != fg_halflife && r_loadbumpmapping)// && gl_bump_fallbacks.ival) + if (!TEXVALID(tn->bump) && loadmodel->fromgame != fg_halflife) { //no mip levels here, would be absurd. base = (qbyte *)(mt+1); //convert to greyscale. @@ -1298,7 +1332,7 @@ void RMod_LoadMiptex(texture_t *tx, miptex_t *mt, texnums_t *tn, int maps) } //don't do any complex quake 8bit -> glossmap. It would likly look a little ugly... - if (gl_specular.value && gl_load24bit.value) + if (maps & LMT_SPEC && gl_load24bit.value) { snprintf(altname, sizeof(altname)-1, "%s_gloss", mt->name); tn->specular = R_LoadHiResTexture(altname, loadname, IF_NOGAMMA|IF_SUBDIRONLY|IF_MIPCAP); @@ -1314,7 +1348,7 @@ void RMod_LoadMiptex(texture_t *tx, miptex_t *mt, texnums_t *tn, int maps) Mod_LoadTextures ================= */ -qboolean RMod_LoadTextures (lump_t *l) +qboolean Mod_LoadTextures (lump_t *l) { int i, j, num, max, altmax; miptex_t *mt; @@ -1325,19 +1359,19 @@ qboolean RMod_LoadTextures (lump_t *l) texnums_t tn; int maps; -TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n")); +TRACE(("dbg: Mod_LoadTextures: inittexturedescs\n")); -// RMod_InitTextureDescs(loadname); +// Mod_InitTextureDescs(loadname); if (!l->filelen) { Con_Printf(CON_WARNING "warning: %s contains no texture data\n", loadmodel->name); loadmodel->numtextures = 1; - loadmodel->textures = Hunk_AllocName (1 * sizeof(*loadmodel->textures), loadname); + loadmodel->textures = ZG_Malloc(&loadmodel->memgroup, 1 * sizeof(*loadmodel->textures)); i = 0; - tx = Hunk_AllocName (sizeof(texture_t), loadname ); + tx = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t)); memcpy(tx, r_notexture_mip, sizeof(texture_t)); sprintf(tx->name, "unnamed%i", i); loadmodel->textures[i] = tx; @@ -1349,14 +1383,14 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n")); m->nummiptex = LittleLong (m->nummiptex); loadmodel->numtextures = m->nummiptex; - loadmodel->textures = Hunk_AllocName (m->nummiptex * sizeof(*loadmodel->textures) , loadname); + loadmodel->textures = ZG_Malloc(&loadmodel->memgroup, m->nummiptex * sizeof(*loadmodel->textures)); for (i=0 ; inummiptex ; i++) { m->dataofs[i] = LittleLong(m->dataofs[i]); if (m->dataofs[i] == -1) //e1m2, this happens { - tx = Hunk_AllocName (sizeof(texture_t), loadname ); + tx = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t)); memcpy(tx, r_notexture_mip, sizeof(texture_t)); sprintf(tx->name, "unnamed%i", i); loadmodel->textures[i] = tx; @@ -1364,7 +1398,7 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n")); } mt = (miptex_t *)((qbyte *)m + m->dataofs[i]); - TRACE(("dbg: RMod_LoadTextures: texture %s\n", loadname)); + TRACE(("dbg: Mod_LoadTextures: texture %s\n", loadname)); if (!*mt->name) //I HATE MAPPERS! { @@ -1381,7 +1415,7 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n")); Con_Printf (CON_WARNING "Warning: Texture %s is not 16 aligned", mt->name); if (mt->width < 1 || mt->height < 1) Con_Printf (CON_WARNING "Warning: Texture %s has no size", mt->name); - tx = Hunk_AllocName (sizeof(texture_t), loadname ); + tx = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t)); loadmodel->textures[i] = tx; memcpy (tx->name, mt->name, sizeof(tx->name)); @@ -1400,13 +1434,15 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n")); maps |= LMT_FULLBRIGHT; if (r_loadbumpmapping) maps |= LMT_BUMP; + if (gl_specular.ival) + maps |= LMT_SPEC; - RMod_LoadMiptex(tx, mt, &tn, maps); + Mod_LoadMiptex(tx, mt, &tn, maps); Mod_FinishTexture(tx, tn); if ((tx->shader->flags & SHADER_HASNORMALMAP) && !(maps & LMT_BUMP)) - RMod_LoadMiptex(tx, mt, &tx->shader->defaulttextures, LMT_BUMP); + Mod_LoadMiptex(tx, mt, &tx->shader->defaulttextures, LMT_BUMP); } // // sequence the animations @@ -1516,7 +1552,7 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n")); return true; } -void RMod_NowLoadExternal(void) +void Mod_NowLoadExternal(void) { int i, width, height; qboolean alphaed; @@ -1612,13 +1648,12 @@ void BuildLightMapGammaTable (float g, float c) } } - /* ================= Mod_LoadLighting ================= */ -void RMod_LoadLighting (lump_t *l) +void Mod_LoadLighting (lump_t *l) { qboolean luxtmp = true; qboolean littmp = true; @@ -1668,7 +1703,7 @@ void RMod_LoadLighting (lump_t *l) strcpy(luxname, loadmodel->name); COM_StripExtension(loadmodel->name, luxname, sizeof(luxname)); COM_DefaultExtension(luxname, ".lux", sizeof(luxname)); - luxdata = COM_LoadHunkFile(luxname); + luxdata = FS_LoadMallocGroupFile(&loadmodel->memgroup, luxname); luxtmp = false; } if (!luxdata) @@ -1677,14 +1712,14 @@ void RMod_LoadLighting (lump_t *l) COM_StripExtension(COM_SkipPath(loadmodel->name), luxname+5, sizeof(luxname)-5); strcat(luxname, ".lux"); - luxdata = COM_LoadHunkFile(luxname); + luxdata = FS_LoadMallocGroupFile(&loadmodel->memgroup, luxname); luxtmp = false; } if (!luxdata) //dp... { COM_StripExtension(loadmodel->name, luxname, sizeof(luxname)); COM_DefaultExtension(luxname, ".dlit", sizeof(luxname)); - luxdata = COM_LoadHunkFile(luxname); + luxdata = FS_LoadMallocGroupFile(&loadmodel->memgroup, luxname); luxtmp = false; } if (!luxdata) @@ -1751,7 +1786,7 @@ void RMod_LoadLighting (lump_t *l) litname = litnamelits; } - litdata = COM_LoadHunkFile(litname); + litdata = FS_LoadMallocGroupFile(&loadmodel->memgroup, litname); littmp = false; if (!litdata) { @@ -1834,7 +1869,7 @@ void RMod_LoadLighting (lump_t *l) if (lightmodel == loadmodel && !litdata) { int i; - litdata = Hunk_AllocName(samples*3, "lit data"); + litdata = ZG_Malloc(&loadmodel->memgroup, samples*3); littmp = false; if (lumdata) { @@ -1851,7 +1886,7 @@ void RMod_LoadLighting (lump_t *l) if (lightmodel == loadmodel && r_deluxemapping.ival && !luxdata) { int i; - luxdata = Hunk_AllocName(samples*3, "lux data"); + luxdata = ZG_Malloc(&loadmodel->memgroup, samples*3); for (i = 0; i < samples; i++) { luxdata[i*3+0] = 0.5f*255; @@ -1864,7 +1899,7 @@ void RMod_LoadLighting (lump_t *l) if (luxdata && luxtmp) { loadmodel->engineflags |= MDLF_RGBLIGHTING; - loadmodel->deluxdata = Hunk_AllocName(samples*3, "lit data"); + loadmodel->deluxdata = ZG_Malloc(&loadmodel->memgroup, samples*3); memcpy(loadmodel->deluxdata, luxdata, samples*3); } else if (luxdata) @@ -1875,7 +1910,7 @@ void RMod_LoadLighting (lump_t *l) if (litdata && littmp) { loadmodel->engineflags |= MDLF_RGBLIGHTING; - loadmodel->lightdata = Hunk_AllocName(samples*3, "lit data"); + loadmodel->lightdata = ZG_Malloc(&loadmodel->memgroup, samples*3); /*the memcpy is below*/ samples*=3; } @@ -1888,7 +1923,7 @@ void RMod_LoadLighting (lump_t *l) else if (lumdata) { loadmodel->engineflags &= ~MDLF_RGBLIGHTING; - loadmodel->lightdata = Hunk_AllocName(samples, "lit data"); + loadmodel->lightdata = ZG_Malloc(&loadmodel->memgroup, samples); litdata = lumdata; } @@ -1908,14 +1943,14 @@ void RMod_LoadLighting (lump_t *l) Mod_LoadVisibility ================= */ -void RMod_LoadVisibility (lump_t *l) +void Mod_LoadVisibility (lump_t *l) { if (!l->filelen) { loadmodel->visdata = NULL; return; } - loadmodel->visdata = Hunk_AllocName ( l->filelen, loadname); + loadmodel->visdata = ZG_Malloc(&loadmodel->memgroup, l->filelen); memcpy (loadmodel->visdata, mod_base + l->fileofs, l->filelen); } @@ -1925,14 +1960,14 @@ void RMod_LoadVisibility (lump_t *l) Mod_LoadEntities ================= */ -void RMod_LoadEntities (lump_t *l) +void Mod_LoadEntities (lump_t *l) { if (!l->filelen) { loadmodel->entities = NULL; return; } - loadmodel->entities = Hunk_AllocName ( l->filelen + 1, loadname); + loadmodel->entities = ZG_Malloc(&loadmodel->memgroup, l->filelen + 1); memcpy (loadmodel->entities, mod_base + l->fileofs, l->filelen); loadmodel->entities[l->filelen] = 0; } @@ -1943,7 +1978,7 @@ void RMod_LoadEntities (lump_t *l) Mod_LoadVertexes ================= */ -qboolean RMod_LoadVertexes (lump_t *l) +qboolean Mod_LoadVertexes (lump_t *l) { dvertex_t *in; mvertex_t *out; @@ -1956,7 +1991,7 @@ qboolean RMod_LoadVertexes (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->vertexes = out; loadmodel->numvertexes = count; @@ -1977,7 +2012,7 @@ Mod_LoadSubmodels ================= */ static qboolean hexen2map; -qboolean RMod_LoadSubmodels (lump_t *l) +qboolean Mod_LoadSubmodels (lump_t *l) { dq1model_t *inq; dh2model_t *inh; @@ -1997,7 +2032,7 @@ qboolean RMod_LoadSubmodels (lump_t *l) return false; } count = l->filelen / sizeof(*inh); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->submodels = out; loadmodel->numsubmodels = count; @@ -2035,7 +2070,7 @@ qboolean RMod_LoadSubmodels (lump_t *l) return false; } count = l->filelen / sizeof(*inq); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->submodels = out; loadmodel->numsubmodels = count; @@ -2072,7 +2107,7 @@ qboolean RMod_LoadSubmodels (lump_t *l) Mod_LoadEdges ================= */ -qboolean RMod_LoadEdges (lump_t *l, qboolean lm) +qboolean Mod_LoadEdges (lump_t *l, qboolean lm) { medge_t *out; int i, count; @@ -2086,7 +2121,7 @@ qboolean RMod_LoadEdges (lump_t *l, qboolean lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( (count + 1) * sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, (count + 1) * sizeof(*out)); loadmodel->edges = out; loadmodel->numedges = count; @@ -2106,7 +2141,7 @@ qboolean RMod_LoadEdges (lump_t *l, qboolean lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( (count + 1) * sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, (count + 1) * sizeof(*out)); loadmodel->edges = out; loadmodel->numedges = count; @@ -2126,7 +2161,7 @@ qboolean RMod_LoadEdges (lump_t *l, qboolean lm) Mod_LoadTexinfo ================= */ -qboolean RMod_LoadTexinfo (lump_t *l) +qboolean Mod_LoadTexinfo (lump_t *l) { texinfo_t *in; mtexinfo_t *out; @@ -2141,7 +2176,7 @@ qboolean RMod_LoadTexinfo (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->texinfo = out; loadmodel->numtexinfo = count; @@ -2250,7 +2285,7 @@ void CalcSurfaceExtents (msurface_t *s); Mod_LoadFaces ================= */ -qboolean RMod_LoadFaces (lump_t *l, qboolean lm, mesh_t **meshlist) +qboolean Mod_LoadFaces (lump_t *l, qboolean lm, mesh_t **meshlist) { dsface_t *ins; dlface_t *inl; @@ -2281,9 +2316,9 @@ qboolean RMod_LoadFaces (lump_t *l, qboolean lm, mesh_t **meshlist) } count = l->filelen / sizeof(*ins); } - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); - *meshlist = Hunk_AllocName(count*sizeof(**meshlist), loadname); + *meshlist = ZG_Malloc(&loadmodel->memgroup, count*sizeof(**meshlist)); loadmodel->surfaces = out; loadmodel->numsurfaces = count; for ( surfnum=0 ; surfnummesh; @@ -2445,7 +2480,7 @@ void RModQ1_Batches_BuildQ1Q2Poly(model_t *mod, msurface_t *surf, void *cookie) } } -static void RMod_Batches_BuildModelMeshes(model_t *mod, int maxverts, int maxindicies, void (*build)(model_t *mod, msurface_t *surf, void *cookie), void *buildcookie) +static void Mod_Batches_BuildModelMeshes(model_t *mod, int maxverts, int maxindicies, void (*build)(model_t *mod, msurface_t *surf, void *cookie), void *buildcookie) { batch_t *batch; msurface_t *surf; @@ -2458,8 +2493,8 @@ static void RMod_Batches_BuildModelMeshes(model_t *mod, int maxverts, int maxind vbo_t vbo; int styles = mod->lightmaps.surfstyles; - vbo.indicies.dummy = Hunk_AllocName(sizeof(index_t) * maxindicies, "indexdata"); - vbo.coord.dummy = Hunk_AllocName((sizeof(vecV_t)+sizeof(vec2_t)*(1+styles)+sizeof(vec3_t)*3+sizeof(vec4_t))* maxverts, "vertdata"); + vbo.indicies.dummy = ZG_Malloc(&loadmodel->memgroup, sizeof(index_t) * maxindicies); + vbo.coord.dummy = ZG_Malloc(&loadmodel->memgroup, (sizeof(vecV_t)+sizeof(vec2_t)*(1+styles)+sizeof(vec3_t)*3+sizeof(vec4_t))* maxverts); vbo.texcoord.dummy = (vecV_t*)vbo.coord.dummy + maxverts; sty = 0; if (styles) @@ -2525,7 +2560,7 @@ static void RMod_Batches_BuildModelMeshes(model_t *mod, int maxverts, int maxind /* batch->firstmesh is set only in and for this function, its cleared out elsewhere */ -static void RMod_Batches_Generate(model_t *mod) +static void Mod_Batches_Generate(model_t *mod) { int i; msurface_t *surf; @@ -2600,7 +2635,7 @@ static void RMod_Batches_Generate(model_t *mod) } if (!batch) { - batch = Hunk_AllocName(sizeof(*batch), "batch"); + batch = ZG_Malloc(&loadmodel->memgroup, sizeof(*batch)); batch->lightmap[0] = surf->lightmaptexturenums[0]; batch->lightmap[1] = surf->lightmaptexturenums[1]; batch->lightmap[2] = surf->lightmaptexturenums[2]; @@ -2628,12 +2663,12 @@ typedef struct int lmnum; qboolean deluxe; } lmalloc_t; -static void RMod_LightmapAllocInit(lmalloc_t *lmallocator, qboolean hasdeluxe) +static void Mod_LightmapAllocInit(lmalloc_t *lmallocator, qboolean hasdeluxe) { memset(lmallocator, 0, sizeof(*lmallocator)); lmallocator->deluxe = hasdeluxe; } -static void RMod_LightmapAllocDone(lmalloc_t *lmallocator, model_t *mod) +static void Mod_LightmapAllocDone(lmalloc_t *lmallocator, model_t *mod) { mod->lightmaps.first = 1; mod->lightmaps.count = lmallocator->lmnum; @@ -2646,7 +2681,7 @@ static void RMod_LightmapAllocDone(lmalloc_t *lmallocator, model_t *mod) else mod->lightmaps.deluxemapping = false; } -static void RMod_LightmapAllocBlock(lmalloc_t *lmallocator, int w, int h, unsigned short *x, unsigned short *y, int *tnum) +static void Mod_LightmapAllocBlock(lmalloc_t *lmallocator, int w, int h, unsigned short *x, unsigned short *y, int *tnum) { int best, best2; int i, j; @@ -2694,7 +2729,7 @@ static void RMod_LightmapAllocBlock(lmalloc_t *lmallocator, int w, int h, unsign } } -static void RMod_LightmapAllocSurf(lmalloc_t *lmallocator, msurface_t *surf, int surfstyle) +static void Mod_LightmapAllocSurf(lmalloc_t *lmallocator, msurface_t *surf, int surfstyle) { int smax, tmax; smax = (surf->extents[0]>>4)+1; @@ -2711,10 +2746,10 @@ static void RMod_LightmapAllocSurf(lmalloc_t *lmallocator, msurface_t *surf, int return; } - RMod_LightmapAllocBlock (lmallocator, smax, tmax, &surf->light_s[surfstyle], &surf->light_t[surfstyle], &surf->lightmaptexturenums[surfstyle]); + Mod_LightmapAllocBlock (lmallocator, smax, tmax, &surf->light_s[surfstyle], &surf->light_t[surfstyle], &surf->lightmaptexturenums[surfstyle]); } -static void RMod_Batches_SplitLightmaps(model_t *mod) +static void Mod_Batches_SplitLightmaps(model_t *mod) { batch_t *batch; batch_t *nb; @@ -2746,7 +2781,7 @@ static void RMod_Batches_SplitLightmaps(model_t *mod) surf->styles[2] != batch->lightstyle[2] || surf->styles[3] != batch->lightstyle[3] ) { - nb = Hunk_AllocName(sizeof(*batch), "batch"); + nb = ZG_Malloc(&loadmodel->memgroup, sizeof(*batch)); *nb = *batch; batch->next = nb; @@ -2777,7 +2812,7 @@ static void RMod_Batches_SplitLightmaps(model_t *mod) /* allocates lightmaps and splits batches upon lightmap boundaries */ -static void RMod_Batches_AllocLightmaps(model_t *mod) +static void Mod_Batches_AllocLightmaps(model_t *mod) { batch_t *batch; batch_t *nb; @@ -2786,13 +2821,13 @@ static void RMod_Batches_AllocLightmaps(model_t *mod) msurface_t *surf; int sty; - RMod_LightmapAllocInit(&lmallocator, mod->deluxdata != NULL); + Mod_LightmapAllocInit(&lmallocator, mod->deluxdata != NULL); for (sortid = 0; sortid < SHADER_SORT_COUNT; sortid++) for (batch = mod->batches[sortid]; batch != NULL; batch = batch->next) { surf = (msurface_t*)batch->mesh[0]; - RMod_LightmapAllocSurf (&lmallocator, surf, 0); + Mod_LightmapAllocSurf (&lmallocator, surf, 0); for (sty = 1; sty < MAXLIGHTMAPS; sty++) surf->lightmaptexturenums[sty] = -1; for (sty = 0; sty < MAXLIGHTMAPS; sty++) @@ -2804,12 +2839,12 @@ static void RMod_Batches_AllocLightmaps(model_t *mod) for (j = 1; j < batch->maxmeshes; j++) { surf = (msurface_t*)batch->mesh[j]; - RMod_LightmapAllocSurf (&lmallocator, surf, 0); + Mod_LightmapAllocSurf (&lmallocator, surf, 0); for (sty = 1; sty < MAXLIGHTMAPS; sty++) surf->lightmaptexturenums[sty] = -1; if (surf->lightmaptexturenums[0] != batch->lightmap[0]) { - nb = Hunk_AllocName(sizeof(*batch), "batch"); + nb = ZG_Malloc(&loadmodel->memgroup, sizeof(*batch)); *nb = *batch; batch->next = nb; @@ -2833,12 +2868,12 @@ static void RMod_Batches_AllocLightmaps(model_t *mod) } } - RMod_LightmapAllocDone(&lmallocator, mod); + Mod_LightmapAllocDone(&lmallocator, mod); } extern void Surf_CreateSurfaceLightmap (msurface_t *surf, int shift); //if build is NULL, uses q1/q2 surf generation, and allocates lightmaps -void RMod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *mod, msurface_t *surf, void *cookie), void *buildcookie) +void Mod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *mod, msurface_t *surf, void *cookie), void *buildcookie) { int i; int numverts = 0, numindicies=0; @@ -2856,7 +2891,7 @@ void RMod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *m if (meshlist) meshlist += mod->firstmodelsurface; else if (!build) - meshlist = Hunk_Alloc(sizeof(mesh_t) * mod->nummodelsurfaces); + meshlist = ZG_Malloc(&loadmodel->memgroup, sizeof(mesh_t) * mod->nummodelsurfaces); for (i=0; inummodelsurfaces; i++) { @@ -2876,9 +2911,9 @@ void RMod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *m } /*assign each mesh to a batch, generating as needed*/ - RMod_Batches_Generate(mod); + Mod_Batches_Generate(mod); - bmeshes = Hunk_AllocName(sizeof(*bmeshes)*mod->nummodelsurfaces*2, "batchmeshes"); + bmeshes = ZG_Malloc(&loadmodel->memgroup, sizeof(*bmeshes)*mod->nummodelsurfaces*2); //we now know which batch each surface is in, and how many meshes there are in each batch. //allocate the mesh-pointer-lists for each batch. *2 for recursion. @@ -2895,16 +2930,16 @@ void RMod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *m surf->sbatch->mesh[surf->sbatch->meshes++] = (mesh_t*)surf; } if (build) - RMod_Batches_SplitLightmaps(mod); + Mod_Batches_SplitLightmaps(mod); else - RMod_Batches_AllocLightmaps(mod); + Mod_Batches_AllocLightmaps(mod); if (!build) { - build = RModQ1_Batches_BuildQ1Q2Poly; + build = ModQ1_Batches_BuildQ1Q2Poly; mod->lightmaps.surfstyles = 1; } - RMod_Batches_BuildModelMeshes(mod, numverts, numindicies, build, buildcookie); + Mod_Batches_BuildModelMeshes(mod, numverts, numindicies, build, buildcookie); if (BE_GenBrushModelVBO) BE_GenBrushModelVBO(mod); @@ -2916,15 +2951,15 @@ void RMod_Batches_Build(mesh_t *meshlist, model_t *mod, void (*build)(model_t *m Mod_SetParent ================= */ -void RMod_SetParent (mnode_t *node, mnode_t *parent) +void Mod_SetParent (mnode_t *node, mnode_t *parent) { if (!node) return; node->parent = parent; if (node->contents < 0) return; - RMod_SetParent (node->children[0], node); - RMod_SetParent (node->children[1], node); + Mod_SetParent (node->children[0], node); + Mod_SetParent (node->children[1], node); } /* @@ -2932,7 +2967,7 @@ void RMod_SetParent (mnode_t *node, mnode_t *parent) Mod_LoadNodes ================= */ -qboolean RMod_LoadNodes (lump_t *l, int lm) +qboolean Mod_LoadNodes (lump_t *l, int lm) { int i, j, count, p; mnode_t *out; @@ -2947,7 +2982,7 @@ qboolean RMod_LoadNodes (lump_t *l, int lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->nodes = out; loadmodel->numnodes = count; @@ -2986,7 +3021,7 @@ qboolean RMod_LoadNodes (lump_t *l, int lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->nodes = out; loadmodel->numnodes = count; @@ -3025,7 +3060,7 @@ qboolean RMod_LoadNodes (lump_t *l, int lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->nodes = out; loadmodel->numnodes = count; @@ -3055,7 +3090,7 @@ qboolean RMod_LoadNodes (lump_t *l, int lm) } } - RMod_SetParent (loadmodel->nodes, NULL); // sets nodes and leafs + Mod_SetParent (loadmodel->nodes, NULL); // sets nodes and leafs return true; } @@ -3064,7 +3099,7 @@ qboolean RMod_LoadNodes (lump_t *l, int lm) Mod_LoadLeafs ================= */ -qboolean RMod_LoadLeafs (lump_t *l, int lm) +qboolean Mod_LoadLeafs (lump_t *l, int lm) { mleaf_t *out; int i, j, count, p; @@ -3079,7 +3114,7 @@ qboolean RMod_LoadLeafs (lump_t *l, int lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->leafs = out; loadmodel->numleafs = count; @@ -3136,7 +3171,7 @@ qboolean RMod_LoadLeafs (lump_t *l, int lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->leafs = out; loadmodel->numleafs = count; @@ -3193,7 +3228,7 @@ qboolean RMod_LoadLeafs (lump_t *l, int lm) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->leafs = out; loadmodel->numleafs = count; @@ -3254,7 +3289,7 @@ void *suplementryclipnodes; void *suplementryplanes; void *crouchhullfile; -void RMod_LoadCrouchHull(void) +void Mod_LoadCrouchHull(void) { int i, h; int numsm; @@ -3325,7 +3360,7 @@ void RMod_LoadCrouchHull(void) Mod_LoadClipnodes ================= */ -qboolean RMod_LoadClipnodes (lump_t *l, qboolean lm) +qboolean Mod_LoadClipnodes (lump_t *l, qboolean lm) { dsclipnode_t *ins; dlclipnode_t *inl; @@ -3355,7 +3390,7 @@ qboolean RMod_LoadClipnodes (lump_t *l, qboolean lm) } count = l->filelen / sizeof(*ins); } - out = Hunk_AllocName ( (count+numsuplementryclipnodes)*sizeof(*out), loadname);//space for both + out = ZG_Malloc(&loadmodel->memgroup, (count+numsuplementryclipnodes)*sizeof(*out));//space for both loadmodel->clipnodes = out; loadmodel->numclipnodes = count+numsuplementryclipnodes; @@ -3574,7 +3609,7 @@ Mod_MakeHull0 Deplicate the drawing hull structure as a clipping hull ================= */ -void RMod_MakeHull0 (void) +void Mod_MakeHull0 (void) { mnode_t *in, *child; mclipnode_t *out; @@ -3585,7 +3620,7 @@ void RMod_MakeHull0 (void) in = loadmodel->nodes; count = loadmodel->numnodes; - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); hull->clipnodes = out; hull->firstclipnode = 0; @@ -3611,7 +3646,7 @@ void RMod_MakeHull0 (void) Mod_LoadMarksurfaces ================= */ -qboolean RMod_LoadMarksurfaces (lump_t *l, qboolean lm) +qboolean Mod_LoadMarksurfaces (lump_t *l, qboolean lm) { int i, j, count; msurface_t **out; @@ -3626,7 +3661,7 @@ qboolean RMod_LoadMarksurfaces (lump_t *l, qboolean lm) return false; } count = l->filelen / sizeof(*inl); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->marksurfaces = out; loadmodel->nummarksurfaces = count; @@ -3652,7 +3687,7 @@ qboolean RMod_LoadMarksurfaces (lump_t *l, qboolean lm) return false; } count = l->filelen / sizeof(*ins); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->marksurfaces = out; loadmodel->nummarksurfaces = count; @@ -3677,7 +3712,7 @@ qboolean RMod_LoadMarksurfaces (lump_t *l, qboolean lm) Mod_LoadSurfedges ================= */ -qboolean RMod_LoadSurfedges (lump_t *l) +qboolean Mod_LoadSurfedges (lump_t *l) { int i, count; int *in, *out; @@ -3689,7 +3724,7 @@ qboolean RMod_LoadSurfedges (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( count*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, count*sizeof(*out)); loadmodel->surfedges = out; loadmodel->numsurfedges = count; @@ -3706,7 +3741,7 @@ qboolean RMod_LoadSurfedges (lump_t *l) Mod_LoadPlanes ================= */ -qboolean RMod_LoadPlanes (lump_t *l) +qboolean Mod_LoadPlanes (lump_t *l) { int i, j; mplane_t *out; @@ -3721,7 +3756,7 @@ qboolean RMod_LoadPlanes (lump_t *l) return false; } count = l->filelen / sizeof(*in); - out = Hunk_AllocName ( (count+numsuplementryplanes)*2*sizeof(*out), loadname); + out = ZG_Malloc(&loadmodel->memgroup, (count+numsuplementryplanes)*2*sizeof(*out)); loadmodel->planes = out; loadmodel->numplanes = count+numsuplementryplanes; @@ -3823,15 +3858,15 @@ static void Q1BSP_StainNode (mnode_t *node, float *parms) Q1BSP_StainNode (node->children[1], parms); } -void RMod_FixupNodeMinsMaxs (mnode_t *node, mnode_t *parent) +void Mod_FixupNodeMinsMaxs (mnode_t *node, mnode_t *parent) { if (!node) return; if (node->contents >= 0) { - RMod_FixupNodeMinsMaxs (node->children[0], node); - RMod_FixupNodeMinsMaxs (node->children[1], node); + Mod_FixupNodeMinsMaxs (node->children[0], node); + Mod_FixupNodeMinsMaxs (node->children[1], node); } if (parent) @@ -3852,7 +3887,7 @@ void RMod_FixupNodeMinsMaxs (mnode_t *node, mnode_t *parent) } } -void RMod_FixupMinsMaxs(void) +void Mod_FixupMinsMaxs(void) { //q1 bsps are capped to +/- 32767 by the nodes/leafs //verts arn't though @@ -3935,7 +3970,7 @@ void RMod_FixupMinsMaxs(void) } while (--c); } } - RMod_FixupNodeMinsMaxs (loadmodel->nodes, NULL); // sets nodes and leafs + Mod_FixupNodeMinsMaxs (loadmodel->nodes, NULL); // sets nodes and leafs } /* @@ -3943,14 +3978,13 @@ void RMod_FixupMinsMaxs(void) Mod_LoadBrushModel ================= */ -qboolean RMod_LoadBrushModel (model_t *mod, void *buffer) +qboolean Mod_LoadBrushModel (model_t *mod, void *buffer) { int i, j; dheader_t *header; mmodel_t *bm; model_t *lm=mod; unsigned int chksum; - int start; qboolean noerrors; int longm = false; mesh_t *meshlist = NULL; @@ -3959,8 +3993,6 @@ qboolean RMod_LoadBrushModel (model_t *mod, void *buffer) #else #define ode true #endif - - start = Hunk_LowMark(); loadmodel->type = mod_brush; @@ -4066,57 +4098,57 @@ qboolean RMod_LoadBrushModel (model_t *mod, void *buffer) if (!isDedicated || ode) { TRACE(("Loading verts\n")); - noerrors = noerrors && RMod_LoadVertexes (&header->lumps[LUMP_VERTEXES]); + noerrors = noerrors && Mod_LoadVertexes (&header->lumps[LUMP_VERTEXES]); TRACE(("Loading edges\n")); - noerrors = noerrors && RMod_LoadEdges (&header->lumps[LUMP_EDGES], longm); + noerrors = noerrors && Mod_LoadEdges (&header->lumps[LUMP_EDGES], longm); TRACE(("Loading Surfedges\n")); - noerrors = noerrors && RMod_LoadSurfedges (&header->lumps[LUMP_SURFEDGES]); + noerrors = noerrors && Mod_LoadSurfedges (&header->lumps[LUMP_SURFEDGES]); } if (!isDedicated) { TRACE(("Loading Textures\n")); - noerrors = noerrors && RMod_LoadTextures (&header->lumps[LUMP_TEXTURES]); + noerrors = noerrors && Mod_LoadTextures (&header->lumps[LUMP_TEXTURES]); TRACE(("Loading Lighting\n")); if (noerrors) - RMod_LoadLighting (&header->lumps[LUMP_LIGHTING]); + Mod_LoadLighting (&header->lumps[LUMP_LIGHTING]); } TRACE(("Loading Submodels\n")); - noerrors = noerrors && RMod_LoadSubmodels (&header->lumps[LUMP_MODELS]); + noerrors = noerrors && Mod_LoadSubmodels (&header->lumps[LUMP_MODELS]); if (noerrors) { TRACE(("Loading CH\n")); - RMod_LoadCrouchHull(); + Mod_LoadCrouchHull(); } TRACE(("Loading Planes\n")); - noerrors = noerrors && RMod_LoadPlanes (&header->lumps[LUMP_PLANES]); + noerrors = noerrors && Mod_LoadPlanes (&header->lumps[LUMP_PLANES]); if (!isDedicated || ode) { TRACE(("Loading Texinfo\n")); - noerrors = noerrors && RMod_LoadTexinfo (&header->lumps[LUMP_TEXINFO]); + noerrors = noerrors && Mod_LoadTexinfo (&header->lumps[LUMP_TEXINFO]); TRACE(("Loading Faces\n")); - noerrors = noerrors && RMod_LoadFaces (&header->lumps[LUMP_FACES], longm, &meshlist); + noerrors = noerrors && Mod_LoadFaces (&header->lumps[LUMP_FACES], longm, &meshlist); } if (!isDedicated) { TRACE(("Loading MarkSurfaces\n")); - noerrors = noerrors && RMod_LoadMarksurfaces (&header->lumps[LUMP_MARKSURFACES], longm); + noerrors = noerrors && Mod_LoadMarksurfaces (&header->lumps[LUMP_MARKSURFACES], longm); } if (noerrors) { TRACE(("Loading Vis\n")); - RMod_LoadVisibility (&header->lumps[LUMP_VISIBILITY]); + Mod_LoadVisibility (&header->lumps[LUMP_VISIBILITY]); } - noerrors = noerrors && RMod_LoadLeafs (&header->lumps[LUMP_LEAFS], longm); + noerrors = noerrors && Mod_LoadLeafs (&header->lumps[LUMP_LEAFS], longm); TRACE(("Loading Nodes\n")); - noerrors = noerrors && RMod_LoadNodes (&header->lumps[LUMP_NODES], longm); + noerrors = noerrors && Mod_LoadNodes (&header->lumps[LUMP_NODES], longm); TRACE(("Loading Clipnodes\n")); - noerrors = noerrors && RMod_LoadClipnodes (&header->lumps[LUMP_CLIPNODES], longm); + noerrors = noerrors && Mod_LoadClipnodes (&header->lumps[LUMP_CLIPNODES], longm); if (noerrors) { TRACE(("Loading Entities\n")); - RMod_LoadEntities (&header->lumps[LUMP_ENTITIES]); + Mod_LoadEntities (&header->lumps[LUMP_ENTITIES]); TRACE(("Loading hull 0\n")); - RMod_MakeHull0 (); + Mod_MakeHull0 (); } TRACE(("sorting shaders\n")); @@ -4131,7 +4163,6 @@ qboolean RMod_LoadBrushModel (model_t *mod, void *buffer) if (!noerrors) { - Hunk_FreeToLowMark(start); return false; } @@ -4187,7 +4218,7 @@ TRACE(("LoadBrushModel %i\n", __LINE__)); TRACE(("LoadBrushModel %i\n", __LINE__)); if (meshlist) { - RMod_Batches_Build(meshlist, mod, NULL, NULL); + Mod_Batches_Build(meshlist, mod, NULL, NULL); } TRACE(("LoadBrushModel %i\n", __LINE__)); @@ -4200,6 +4231,7 @@ TRACE(("LoadBrushModel %i\n", __LINE__)); *loadmodel = *mod; strcpy (loadmodel->name, name); mod = loadmodel; + memset(&mod->memgroup, 0, sizeof(mod->memgroup)); } TRACE(("LoadBrushModel %i\n", __LINE__)); } @@ -4210,7 +4242,7 @@ TRACE(("LoadBrushModel %i\n", __LINE__)); #endif TRACE(("LoadBrushModel %i\n", __LINE__)); if (1) - RMod_FixupMinsMaxs(); + Mod_FixupMinsMaxs(); TRACE(("LoadBrushModel %i\n", __LINE__)); #ifdef TERRAIN @@ -4227,103 +4259,14 @@ ALIAS MODELS ============================================================================== */ -//aliashdr_t *pheader; - -//mstvert_t stverts[MAXALIASVERTS*2]; -//mtriangle_t triangles[MAXALIASTRIS]; - -// a pose is a single set of vertexes. a frame may be -// an animating sequence of poses -//dtrivertx_t *poseverts[MAXALIASFRAMES]; -//int posenum; - -qbyte *player_8bit_texels/*[320*200]*/; - - //========================================================= -/* -================= -Mod_FloodFillSkin - -Fill background pixels so mipmapping doesn't have haloes - Ed -================= -*/ - -typedef struct -{ - short x, y; -} floodfill_t; - -// must be a power of 2 -#define FLOODFILL_FIFO_SIZE 0x1000 -#define FLOODFILL_FIFO_MASK (FLOODFILL_FIFO_SIZE - 1) - -#define FLOODFILL_STEP( off, dx, dy ) \ -{ \ - if (pos[off] == fillcolor) \ - { \ - pos[off] = 255; \ - fifo[inpt].x = x + (dx), fifo[inpt].y = y + (dy); \ - inpt = (inpt + 1) & FLOODFILL_FIFO_MASK; \ - } \ - else if (pos[off] != 255) fdc = pos[off]; \ -} - -void RMod_FloodFillSkin( qbyte *skin, int skinwidth, int skinheight ) -{ - qbyte fillcolor = *skin; // assume this is the pixel to fill - floodfill_t fifo[FLOODFILL_FIFO_SIZE]; - int inpt = 0, outpt = 0; - int filledcolor = -1; - int i; - - if (filledcolor == -1) - { - filledcolor = 0; - // attempt to find opaque black - for (i = 0; i < 256; ++i) - if (d_8to24rgbtable[i] == (255 << 0)) // rgb 0.0, alpha 1.0 - { - filledcolor = i; - break; - } - } - - // can't fill to filled color or to transparent color (used as visited marker) - if ((fillcolor == filledcolor) || (fillcolor == 255)) - { - //printf( "not filling skin from %d to %d\n", fillcolor, filledcolor ); - return; - } - - fifo[inpt].x = 0, fifo[inpt].y = 0; - inpt = (inpt + 1) & FLOODFILL_FIFO_MASK; - - while (outpt != inpt) - { - int x = fifo[outpt].x, y = fifo[outpt].y; - int fdc = filledcolor; - qbyte *pos = &skin[x + skinwidth * y]; - - outpt = (outpt + 1) & FLOODFILL_FIFO_MASK; - - if (x > 0) FLOODFILL_STEP( -1, -1, 0 ); - if (x < skinwidth - 1) FLOODFILL_STEP( 1, 1, 0 ); - if (y > 0) FLOODFILL_STEP( -skinwidth, 0, -1 ); - if (y < skinheight - 1) FLOODFILL_STEP( skinwidth, 0, 1 ); - skin[x + skinwidth * y] = fdc; - } -} - -//============================================================================= - /* ================= Mod_LoadSpriteFrame ================= */ -void * RMod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum, int version, unsigned char *palette) +static void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum, int version, unsigned char *palette) { dspriteframe_t *pinframe; mspriteframe_t *pspriteframe; @@ -4337,7 +4280,7 @@ void * RMod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum, height = LittleLong (pinframe->height); size = width * height; - pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t),loadname); + pspriteframe = ZG_Malloc(&loadmodel->memgroup, sizeof (mspriteframe_t)); Q_memset (pspriteframe, 0, sizeof (mspriteframe_t)); @@ -4420,7 +4363,7 @@ void * RMod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum, Mod_LoadSpriteGroup ================= */ -void * RMod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, int version, unsigned char *palette) +static void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, int version, unsigned char *palette) { dspritegroup_t *pingroup; mspritegroup_t *pspritegroup; @@ -4433,8 +4376,7 @@ void * RMod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, numframes = LittleLong (pingroup->numframes); - pspritegroup = Hunk_AllocName (sizeof (mspritegroup_t) + - (numframes - 1) * sizeof (pspritegroup->frames[0]), loadname); + pspritegroup = ZG_Malloc(&loadmodel->memgroup, sizeof (mspritegroup_t) + (numframes - 1) * sizeof (pspritegroup->frames[0])); pspritegroup->numframes = numframes; @@ -4442,7 +4384,7 @@ void * RMod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, pin_intervals = (dspriteinterval_t *)(pingroup + 1); - poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname); + poutintervals = ZG_Malloc(&loadmodel->memgroup, numframes * sizeof (float)); pspritegroup->intervals = poutintervals; @@ -4463,7 +4405,7 @@ void * RMod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, for (i=0 ; iframes[i], framenum * 100 + i, version, palette); + ptemp = Mod_LoadSpriteFrame (ptemp, &pspritegroup->frames[i], framenum * 100 + i, version, palette); } return ptemp; @@ -4474,7 +4416,7 @@ void * RMod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, Mod_LoadSpriteModel ================= */ -qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer) +qboolean Mod_LoadSpriteModel (model_t *mod, void *buffer) { int i; int version; @@ -4486,9 +4428,7 @@ qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer) // int rendertype=0; unsigned char pal[256*4]; int sptype; - int hunkstart; - hunkstart = Hunk_LowMark(); pin = (dsprite_t *)buffer; version = LittleLong (pin->version); @@ -4513,9 +4453,9 @@ qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer) size = sizeof (msprite_t) + (numframes - 1) * sizeof (psprite->frames); - psprite = Hunk_AllocName (size, loadname); + psprite = ZG_Malloc(&loadmodel->memgroup, size); - mod->cache.data = psprite; + mod->meshinfo = psprite; psprite->type = sptype; psprite->maxwidth = LittleLong (pin->width); @@ -4542,7 +4482,6 @@ qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer) if (LittleShort(*numi) != 256) { Con_Printf(CON_ERROR "%s has wrong number of palette indexes (we only support 256)\n", mod->name); - Hunk_FreeToLowMark(hunkstart); return false; } @@ -4565,7 +4504,6 @@ qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer) if (numframes < 1) { Con_Printf (CON_ERROR "Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes); - Hunk_FreeToLowMark(hunkstart); return false; } @@ -4581,18 +4519,17 @@ qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer) if (frametype == SPR_SINGLE) { pframetype = (dspriteframetype_t *) - RMod_LoadSpriteFrame (pframetype + 1, + Mod_LoadSpriteFrame (pframetype + 1, &psprite->frames[i].frameptr, i, version, pal); } else { pframetype = (dspriteframetype_t *) - RMod_LoadSpriteGroup (pframetype + 1, + Mod_LoadSpriteGroup (pframetype + 1, &psprite->frames[i].frameptr, i, version, pal); } if (pframetype == NULL) { - Hunk_FreeToLowMark(hunkstart); return false; } } @@ -4602,7 +4539,8 @@ qboolean RMod_LoadSpriteModel (model_t *mod, void *buffer) return true; } -qboolean RMod_LoadSprite2Model (model_t *mod, void *buffer) +#ifdef SP2MODELS +qboolean Mod_LoadSprite2Model (model_t *mod, void *buffer) { int i; int version; @@ -4614,9 +4552,6 @@ qboolean RMod_LoadSprite2Model (model_t *mod, void *buffer) mspriteframe_t *frame; int w, h; float origin[2]; - int hunkstart; - - hunkstart = Hunk_LowMark(); pin = (dmd2sprite_t *)buffer; @@ -4632,9 +4567,9 @@ qboolean RMod_LoadSprite2Model (model_t *mod, void *buffer) size = sizeof (msprite_t) + (numframes - 1) * sizeof (psprite->frames); - psprite = Hunk_AllocName (size, loadname); + psprite = ZG_Malloc(&loadmodel->memgroup, size); - mod->cache.data = psprite; + mod->meshinfo = psprite; psprite->type = SPR_VP_PARALLEL; psprite->maxwidth = 1; @@ -4654,7 +4589,6 @@ qboolean RMod_LoadSprite2Model (model_t *mod, void *buffer) if (numframes < 1) { Con_Printf (CON_ERROR "Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes); - Hunk_FreeToLowMark(hunkstart); return false; } @@ -4669,7 +4603,7 @@ qboolean RMod_LoadSprite2Model (model_t *mod, void *buffer) frametype = SPR_SINGLE; psprite->frames[i].type = frametype; - frame = psprite->frames[i].frameptr = Hunk_AllocName(sizeof(mspriteframe_t), loadname); + frame = psprite->frames[i].frameptr = ZG_Malloc(&loadmodel->memgroup, sizeof(mspriteframe_t)); frame->shader = R_RegisterPic(pframetype->name); @@ -4690,7 +4624,7 @@ qboolean RMod_LoadSprite2Model (model_t *mod, void *buffer) return true; } - +#endif #ifdef DOOMWADS @@ -4729,7 +4663,7 @@ static void LoadDoomSpriteFrame(char *imagename, mspriteframedesc_t *pdesc, int if (!anglenum) { pdesc->type = SPR_SINGLE; - pdesc->frameptr = pframe = Hunk_AllocName(sizeof(*pframe), loadname); + pdesc->frameptr = pframe = ZG_Malloc(&loadmodel->memgroup, sizeof(*pframe)); } else { @@ -4738,14 +4672,14 @@ static void LoadDoomSpriteFrame(char *imagename, mspriteframedesc_t *pdesc, int if (!pdesc->frameptr || pdesc->type != SPR_ANGLED) { pdesc->type = SPR_ANGLED; - group = Hunk_AllocName(sizeof(*group)+sizeof(mspriteframe_t *)*(8-1), loadname); + group = ZG_Malloc(&loadmodel->memgroup, sizeof(*group)+sizeof(mspriteframe_t *)*(8-1)); pdesc->frameptr = (mspriteframe_t *)group; group->numframes = 8; } else group = (mspritegroup_t *)pdesc->frameptr; - pframe = Hunk_AllocName(sizeof(*pframe), loadname); + pframe = ZG_Malloc(&loadmodel->memgroup, sizeof(*pframe)); group->frames[anglenum-1] = pframe; } @@ -4811,7 +4745,7 @@ static void LoadDoomSpriteFrame(char *imagename, mspriteframedesc_t *pdesc, int Doom Sprites ================= */ -void RMod_LoadDoomSprite (model_t *mod) +void Mod_LoadDoomSprite (model_t *mod) { char files[16384]; char basename[MAX_QPATH]; @@ -4871,7 +4805,7 @@ void RMod_LoadDoomSprite (model_t *mod) Host_Error("Doom sprite componant has no frames"); size = sizeof (msprite_t) + (elements - 1) * sizeof (psprite->frames); - psprite = Hunk_AllocName (size, loadname); + psprite = ZG_Malloc(&loadmodel->memgroup, size); psprite->numframes = numframes; @@ -4897,7 +4831,7 @@ void RMod_LoadDoomSprite (model_t *mod) psprite->type = SPR_FACING_UPRIGHT; mod->type = mod_sprite; - mod->cache.data = psprite; + mod->meshinfo = psprite; } #endif @@ -4908,7 +4842,7 @@ void RMod_LoadDoomSprite (model_t *mod) Mod_Print ================ */ -void RMod_Print (void) +void Mod_Print (void) { int i; model_t *mod; @@ -4916,7 +4850,7 @@ void RMod_Print (void) Con_Printf ("Cached models:\n"); for (i=0, mod=mod_known ; i < mod_numknown ; i++, mod++) { - Con_Printf ("%8p : %s\n",mod->cache.data, mod->name); + Con_Printf ("%8p : %s\n", mod->meshinfo, mod->name); } } diff --git a/engine/gl/gl_model.h b/engine/gl/gl_model.h index 563b6c5b0..3e0b2e181 100644 --- a/engine/gl/gl_model.h +++ b/engine/gl/gl_model.h @@ -434,7 +434,7 @@ typedef struct mnode_s // node specific mplane_t *plane; struct mnode_s *children[2]; -#ifdef Q2BSPS +#if defined(Q2BSPS) || defined(MAP_PROC) int childnum[2]; #endif @@ -851,6 +851,7 @@ typedef struct typedef struct model_s { char name[MAX_QPATH]; + int datasequence; qboolean needload; // bmodels and sprites don't cache normally qboolean tainted; qboolean pushdepth; // bsp submodels have this flag set so you don't get z fighting on co-planar surfaces. @@ -961,8 +962,8 @@ typedef struct model_s // // additional model data // - cache_user_t cache; // only access through Mod_Extradata - + void *meshinfo; //data allocated within the memgroup allocations, will be nulled out when the model is flushed + zonegroup_t memgroup; } model_t; #define MDLF_ENGULPHS 0x001 // particle effect engulphs model (don't draw) @@ -1056,20 +1057,3 @@ void CMQ3_SetAreaPortalState (int area1, int area2, qboolean open); #endif //Q2BSPS - - - - -typedef struct -{ - aliasskintype_t type; - void *pcachespot; - int skin; -} maliasskindesc_t; - -typedef struct -{ - int numskins; - int intervals; - maliasskindesc_t skindescs[1]; -} maliasskingroup_t; diff --git a/engine/gl/gl_rmisc.c b/engine/gl/gl_rmisc.c index fd0483d7f..b0917753c 100644 --- a/engine/gl/gl_rmisc.c +++ b/engine/gl/gl_rmisc.c @@ -507,6 +507,7 @@ void GLR_NewMap (void) Surf_DeInit(); r_viewleaf = NULL; + r_oldviewleaf = NULL; r_viewcluster = -1; r_oldviewcluster = 0; r_viewcluster2 = -1; @@ -536,12 +537,6 @@ TRACE(("dbg: GLR_NewMap: tp\n")); #endif #ifdef RTLIGHTS - if (r_shadow_realtime_dlight.ival || r_shadow_realtime_world.ival) - { - R_LoadRTLights(); - if (rtlights_first == rtlights_max) - R_ImportRTLights(cl.worldmodel->entities); - } Sh_PreGenerateLights(); #endif } @@ -549,6 +544,10 @@ TRACE(("dbg: GLR_NewMap: tp\n")); void GLR_PreNewMap(void) { r_loadbumpmapping = r_deluxemapping.ival || r_shadow_realtime_world.ival || r_shadow_realtime_dlight.ival || r_glsl_offsetmapping.ival; + r_viewleaf = NULL; + r_oldviewleaf = NULL; + r_viewleaf2 = NULL; + r_oldviewleaf2 = NULL; } diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index ea81493d7..1d87a3082 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -5062,7 +5062,7 @@ void Shader_DoReload(void) if (resort) { - RMod_ResortShaders(); + Mod_ResortShaders(); } } diff --git a/engine/gl/gl_shadow.c b/engine/gl/gl_shadow.c index 5d026831c..2a021b383 100644 --- a/engine/gl/gl_shadow.c +++ b/engine/gl/gl_shadow.c @@ -2955,6 +2955,13 @@ void Sh_PreGenerateLights(void) qbyte lvisb[MAX_MAP_LEAFS/8]; int i; + if (r_shadow_realtime_dlight.ival || r_shadow_realtime_world.ival) + { + R_LoadRTLights(); + if (rtlights_first == rtlights_max) + R_ImportRTLights(cl.worldmodel->entities); + } + ignoreflags = (r_shadow_realtime_world.value?LFLAG_REALTIMEMODE:LFLAG_NORMALMODE); for (dl = cl_dlights+rtlights_first, i=rtlights_first; i= 0x100000 || (!deathmatch.ival && !coop.ival)))) { - sv.pvs = Hunk_AllocName (rowbytes*num, "pvs vis"); + sv.pvs = ZG_Malloc(&sv.world.worldmodel->memgroup, rowbytes*num); scan = sv.pvs; for (i=0 ; imemgroup, rowbytes*num); scan = sv.pvs; vcount = 0; for (i=0 ; imemgroup, rowbytes*num); + /*this routine takes an exponential amount of time, so cache it if its too big*/ if (rowbytes*num >= 0x100000) { - sv.phs = COM_LoadHunkFile(va("maps/%s.phs", sv.name)); - if (sv.phs && com_filesize == rowbytes*num + 8 && ((unsigned*)sv.phs)[0] == *(unsigned*)"QPHS" && ((unsigned*)sv.phs)[1] == *(unsigned*)"\1\0\0\0") + char hdr[8]; + vfsfile_t *f = FS_OpenVFS(va("maps/%s.phs", sv.name), "rb", FS_GAME); + if (f) { - sv.phs += 8; - Con_DPrintf("Loaded cached PHS\n"); - return; + VFS_READ(f, hdr, sizeof(hdr)); + if (memcmp(hdr, "QPHS\1\0\0\0", 8) || VFS_GETLEN(f) != rowbytes*num + 8) + { + VFS_READ(f, sv.phs, rowbytes*num); + VFS_CLOSE(f); + Con_DPrintf("Loaded cached PHS\n"); + return; + } + else + Con_DPrintf("Stale cached PHS\n"); + VFS_CLOSE(f); } - else - Con_DPrintf("Stale cached PHS\n"); } - sv.phs = Hunk_AllocName (rowbytes*num, "phs hear"); count = 0; scan = sv.pvs; dest = (unsigned *)sv.phs; @@ -683,7 +691,6 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us #endif Mod_ClearAll (); - Hunk_FreeToLowMark (host_hunklevel); PR_Deinit(); @@ -790,6 +797,7 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us sv.state = ss_loading; +#if defined(Q2BSPS) if (usecinematic) { qboolean Mod_LoadQ2BrushModel (model_t *mod, void *buffer); @@ -802,6 +810,7 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us loadmodel->needload = !Mod_LoadQ2BrushModel (sv.world.worldmodel, NULL); } else +#endif { char *exts[] = {"maps/%s.bsp", "maps/%s.cm", "maps/%s.hmp", NULL}; strcpy (sv.name, server); diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index c52eb4c1c..42bc1e34c 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -825,8 +825,10 @@ int SV_CalcPing (client_t *cl, qboolean forcecalc) switch (cl->protocol) { + default: case SCP_BAD: break; +#ifdef Q2SERVER case SCP_QUAKE2: { q2client_frame_t *frame; @@ -846,6 +848,7 @@ int SV_CalcPing (client_t *cl, qboolean forcecalc) } return ping; +#endif case SCP_QUAKE3: break; case SCP_DARKPLACES6: @@ -4928,17 +4931,12 @@ void SV_Init (quakeparms_t *parms) { COM_InitArgv (parms->argc, parms->argv); - if (COM_CheckParm ("-minmemory")) - parms->memsize = MINIMUM_MEMORY; host_parms = *parms; -// if (parms->memsize < MINIMUM_MEMORY) -// SV_Error ("Only %4.1f megs of memory reported, can't execute game", parms->memsize / (float)0x100000); - Cvar_Init(); - Memory_Init (parms->membase, parms->memsize); + Memory_Init(); Sys_Init(); @@ -5001,21 +4999,16 @@ void SV_Init (quakeparms_t *parms) Plug_Initialise(true); #endif - Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); - host_hunklevel = Hunk_LowMark (); - host_initialized = true; FS_ChangeGame(NULL, true); - Cmd_StuffCmds(); Cbuf_Execute (); Con_TPrintf (TL_EXEDATETIME, __DATE__, __TIME__); - Con_TPrintf (TL_HEAPSIZE,parms->memsize/ (1024*1024.0)); Con_Printf ("%s\n", version_string()); diff --git a/engine/server/sv_mvd.c b/engine/server/sv_mvd.c index d3b801538..1b45458d2 100644 --- a/engine/server/sv_mvd.c +++ b/engine/server/sv_mvd.c @@ -1609,7 +1609,13 @@ static qboolean SV_MVD_Record (mvddest_t *dest) } //pointless extensions that are redundant with mvds - demo.recorder.fteprotocolextensions &= ~PEXT_ACCURATETIMINGS | PEXT_HLBSP|PEXT_Q2BSP|PEXT_Q3BSP; + demo.recorder.fteprotocolextensions &= ~PEXT_ACCURATETIMINGS | PEXT_HLBSP; +#ifdef PEXT_Q2BSP + demo.recorder.fteprotocolextensions &= ~PEXT_Q2BSP; +#endif +#ifdef PEXT_Q3BSP + demo.recorder.fteprotocolextensions &= ~PEXT_Q3BSP; +#endif } // else // SV_WriteRecordMVDMessage(&buf, dem_read); diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c index ec5e017e6..c2e8ff3ae 100644 --- a/engine/server/sv_send.c +++ b/engine/server/sv_send.c @@ -1880,6 +1880,7 @@ qboolean SV_SendClientDatagram (client_t *client) if (sv.world.worldmodel && !client->controller) { +#ifdef Q2SERVER if (ISQ2CLIENT(client)) { SVQ2_BuildClientFrame (client); @@ -1889,6 +1890,7 @@ qboolean SV_SendClientDatagram (client_t *client) SVQ2_WriteFrameToClient (client, &msg); } else +#endif { // add the client specific data to the datagram SV_WriteClientdataToMessage (client, &msg); diff --git a/engine/server/sv_sys_unix.c b/engine/server/sv_sys_unix.c index 70b9923e7..ae058e652 100644 --- a/engine/server/sv_sys_unix.c +++ b/engine/server/sv_sys_unix.c @@ -711,14 +711,6 @@ int main(int argc, char *argv[]) } #endif - parms.memsize = 64*1024*1024; - - j = COM_CheckParm("-mem"); - if (j) - parms.memsize = (int) (Q_atof(com_argv[j+1]) * 1024 * 1024); - if ((parms.membase = malloc (parms.memsize)) == NULL) - Sys_Error("Can't allocate %u\n", parms.memsize); - parms.basedir = "."; SV_Init (&parms); diff --git a/engine/server/sv_sys_win.c b/engine/server/sv_sys_win.c index d89a74d74..cdd2236c0 100644 --- a/engine/server/sv_sys_win.c +++ b/engine/server/sv_sys_win.c @@ -408,8 +408,7 @@ void Sys_Error (const char *error, ...) #ifndef MINGW fcloseall(); //make sure all files are written. #endif - VirtualFree (host_parms.membase, 0, MEM_RELEASE); -// free(host_parms.membase); //get rid of the mem. We don't need it now. + // system("dqwsv.exe"); //spawn a new server to take over. This way, if debugging, then any key will quit, otherwise the server will just spawn a new one. memset(&startupinfo, 0, sizeof(startupinfo)); @@ -927,22 +926,6 @@ void StartQuakeServer(void) parms.argc = com_argc; parms.argv = com_argv; - parms.memsize = 32*1024*1024; - - if ((t = COM_CheckParm ("-heapsize")) != 0 && - t + 1 < com_argc) - parms.memsize = Q_atoi (com_argv[t + 1]) * 1024; - - if ((t = COM_CheckParm ("-mem")) != 0 && - t + 1 < com_argc) - parms.memsize = Q_atoi (com_argv[t + 1]) * 1024 * 1024; - - parms.membase = VirtualAlloc(NULL, parms.memsize, MEM_RESERVE, PAGE_NOACCESS); -// parms.membase = malloc (parms.memsize); - - if (!parms.membase) - Sys_Error("Insufficient memory.\n"); - GetModuleFileName(NULL, bindir, sizeof(bindir)-1); *COM_SkipPath(bindir) = 0; parms.binarydir = bindir; diff --git a/engine/server/svmodel.c b/engine/server/svmodel.c index ccc922186..237ec5d47 100644 --- a/engine/server/svmodel.c +++ b/engine/server/svmodel.c @@ -364,6 +364,8 @@ model_t *Mod_FindName (char *name) mod_numknown++; } + //mark it as active, so it doesn't get flushed prematurely + mod->datasequence = mod_datasequence; return mod; } diff --git a/engine/server/svq2_game.c b/engine/server/svq2_game.c index 20c338759..6ef226184 100644 --- a/engine/server/svq2_game.c +++ b/engine/server/svq2_game.c @@ -45,7 +45,11 @@ void *SVQ2_GetGameAPI (void *parms) void *ret; - Con_DPrintf("Searching for %s\n", "game" ARCH_CPU_POSTFIX ARCH_DL_POSTFIX); +#ifdef _DEBUG + Con_DPrintf("Searching for %s\n", gamename[1]); +#else + Con_DPrintf("Searching for %s\n", gamename[0]); +#endif iterator = NULL; while(COM_IteratePaths(&iterator, searchpath, sizeof(searchpath))) diff --git a/engine/sw/sw.h b/engine/sw/sw.h index 237e4e4b6..449258f8a 100644 --- a/engine/sw/sw.h +++ b/engine/sw/sw.h @@ -4,12 +4,20 @@ typedef struct texcom_t com; char name[64]; - int width; - int height; + int pwidth; + int pheight; + int pwidthmask; + int pheightmask; int pitch; unsigned int data[1]; } swimage_t; +typedef struct +{ + float matrix[16]; + vec4_t viewplane; +} swuniforms_t; + typedef struct { volatile unsigned int readpoint; //the command queue point its reading from @@ -27,6 +35,7 @@ typedef struct unsigned int *vpcbuf; unsigned int vpwidth; unsigned int vpheight; + swuniforms_t u; qintptr_t vpcstride; struct workqueue_s *wq; } swthread_t; @@ -64,7 +73,8 @@ enum wqcmd_e WTC_VIEWPORT, WTC_TRIFAN, WTC_TRISOUP, - WTC_SPANS + WTC_SPANS, + WTC_UNIFORMS }; enum @@ -73,7 +83,8 @@ enum CLIP_RIGHT_FLAG = 2, CLIP_TOP_FLAG = 4, CLIP_BOTTOM_FLAG = 8, - CLIP_NEAR_FLAG = 16 + CLIP_NEAR_FLAG = 16, + CLIP_FAR_FLAG = 32 }; typedef union @@ -105,6 +116,7 @@ typedef union struct { struct wqcom_s com; + unsigned int *cbuf; unsigned int *dbuf; unsigned int width; @@ -117,6 +129,11 @@ typedef union qboolean clearcolour; } viewport; struct + { + struct wqcom_s com; + swuniforms_t u; + } uniforms; + struct { int foo; } spans; diff --git a/engine/sw/sw_backend.c b/engine/sw/sw_backend.c index 3f2c01047..806a4472f 100644 --- a/engine/sw/sw_backend.c +++ b/engine/sw/sw_backend.c @@ -14,6 +14,7 @@ static struct backendmode_t mode; float m_mvp[16]; + vec4_t viewplane; entity_t *curentity; shader_t *curshader; @@ -410,31 +411,7 @@ void SWBE_TransformVerticies(swvert_t *v, mesh_t *mesh) for (i = 0; i < mesh->numvertexes; i++, v++) { - Matrix4x4_CM_Transform34(shaderstate.m_mvp, xyz[i], v->vcoord); - - if (v->vcoord[3] != 1) - { - v->vcoord[0] /= v->vcoord[3]; - v->vcoord[1] /= v->vcoord[3]; - v->vcoord[2] /= v->vcoord[3]; - } - v->vcoord[0] = (v->vcoord[0]+1)/2 * vid.pixelwidth; - if (v->vcoord[0] < 0) - v->clipflags = CLIP_LEFT_FLAG; - else - v->clipflags = 0; - if (v->vcoord[0] > vid.pixelwidth-1) - v->clipflags |= CLIP_RIGHT_FLAG; - v->vcoord[1] = (v->vcoord[1]+1)/2 * vid.pixelheight; - if (v->vcoord[1] < temp1.value) - v->clipflags |= CLIP_TOP_FLAG; - if (v->vcoord[1] > vid.pixelheight-1) - v->clipflags |= CLIP_BOTTOM_FLAG; - v->vcoord[2] = (v->vcoord[2]+1)/2; - if (v->vcoord[3] < 0) - v->clipflags |= CLIP_NEAR_FLAG; - if (v->vcoord[2] >= 1) - v->vcoord[2] = 1; + VectorCopy(xyz[i], v->vcoord); Vector2Copy(mesh->st_array[i], v->tccoord); @@ -561,6 +538,17 @@ void SWBE_SubmitMeshes (qboolean drawworld, batch_t **blist, int start, int stop SWBE_SubmitMeshesSortList(blist[i]); } } + +static void SWBE_UpdateUniforms(void) +{ + wqcom_t *com; + com = SWRast_BeginCommand(&commandqueue, WTC_UNIFORMS, sizeof(com->uniforms)); + + memcpy(com->uniforms.u.matrix, shaderstate.m_mvp, sizeof(com->uniforms.u.matrix)); + Vector4Copy(shaderstate.viewplane, com->uniforms.u.viewplane); + + SWRast_EndCommand(&commandqueue, com); +} void SWBE_Set2D(void) { extern cvar_t gl_screenangle; @@ -592,6 +580,15 @@ void SWBE_Set2D(void) } memcpy(shaderstate.m_mvp, r_refdef.m_projection, sizeof(shaderstate.m_mvp)); + + shaderstate.viewplane[0] = -r_refdef.m_view[0*4+2]; + shaderstate.viewplane[1] = -r_refdef.m_view[1*4+2]; + shaderstate.viewplane[2] = -r_refdef.m_view[2*4+2]; + VectorNormalize(shaderstate.viewplane); + VectorScale(shaderstate.viewplane, 1.0/99999, shaderstate.viewplane); + shaderstate.viewplane[3] = DotProduct(vec3_origin, shaderstate.viewplane);// - 0.5; + + SWBE_UpdateUniforms(); } void SWBE_DrawWorld(qboolean drawworld, qbyte *vis) { @@ -636,6 +633,7 @@ void SWBE_SelectEntity(struct entity_s *ent) { float modelmatrix[16]; float modelviewmatrix[16]; + vec3_t vieworg; if (shaderstate.curentity == ent) return; @@ -643,6 +641,18 @@ void SWBE_SelectEntity(struct entity_s *ent) R_RotateForEntity(modelmatrix, modelviewmatrix, shaderstate.curentity, shaderstate.curentity->model); Matrix4_Multiply(r_refdef.m_projection, modelviewmatrix, shaderstate.m_mvp); + shaderstate.viewplane[0] = vpn[0];//-modelviewmatrix[0];//0*4+2]; + shaderstate.viewplane[1] = vpn[1];//-modelviewmatrix[1];//1*4+2]; + shaderstate.viewplane[2] = vpn[2];//-modelviewmatrix[2];//2*4+2]; + VectorNormalize(shaderstate.viewplane); + VectorScale(shaderstate.viewplane, 1.0/8192, shaderstate.viewplane); + vieworg[0] = modelviewmatrix[3*4+0]; + vieworg[1] = modelviewmatrix[3*4+1]; + vieworg[2] = modelviewmatrix[3*4+2]; + VectorMA(r_refdef.vieworg, 256, shaderstate.viewplane, vieworg); + shaderstate.viewplane[3] = DotProduct(vieworg, shaderstate.viewplane); + + SWBE_UpdateUniforms(); } void SWBE_SelectDLight(struct dlight_s *dl, vec3_t colour) { diff --git a/engine/sw/sw_image.c b/engine/sw/sw_image.c index b0530b5f4..167086ae0 100644 --- a/engine/sw/sw_image.c +++ b/engine/sw/sw_image.c @@ -2,20 +2,44 @@ #ifdef SWQUAKE #include "sw.h" +void SW_RoundDimensions(int width, int height, int *scaled_width, int *scaled_height, qboolean mipmap) +{ + for (*scaled_width = 1 ; *scaled_width < width ; *scaled_width<<=1) + ; + for (*scaled_height = 1 ; *scaled_height < height ; *scaled_height<<=1) + ; + if (*scaled_width != width) + *scaled_width >>= 1; + if (*scaled_height != height) + *scaled_height >>= 1; + + if (*scaled_width > 256) + *scaled_width = 256; + if (*scaled_height > 256) + *scaled_height = 256; +} texid_tf SW_AllocNewTexture(char *identifier, int w, int h, unsigned int flags) { + int nw, nh; texid_t n; swimage_t *img; if (w & 3) return r_nulltex; - img = BZ_Malloc(sizeof(*img) - sizeof(img->data) + (w * h * 4)); + + SW_RoundDimensions(w, h, &nw, &nh, false); + img = BZ_Malloc(sizeof(*img) - sizeof(img->data) + (nw * nh * 4)); Q_strncpy(img->name, identifier, sizeof(img->name)); - img->width = w; - img->height = h; - img->pitch = w; + img->com.width = w; + img->com.height = h; + img->pwidth = nw; + img->pheight = nh; + img->pitch = nw; + + img->pwidthmask = nw-1; + img->pheightmask = nh-1; n.ptr = img; n.ref = &img->com; @@ -30,41 +54,60 @@ void SW_RGBToBGR(swimage_t *img) { int x, y; unsigned int *d = img->data; - for (y = 0; y < img->height; y++) + for (y = 0; y < img->pheight; y++) { - for (x = 0; x < img->width; x++) + for (x = 0; x < img->pwidth; x++) { d[x] = (d[x]&0xff00ff00) | ((d[x]&0xff)<<16) | ((d[x]&0xff0000)>>16); } d += img->pitch; } } -void SW_Upload32(swimage_t *img, int w, int h, unsigned int *data) +void SW_Upload32(swimage_t *img, int iw, int ih, unsigned int *data) { + //rescale the input to the output. + //just use nearest-sample, cos we're lazy. int x, y; unsigned int *out = img->data; - for (y = 0; y < h; y++) + unsigned int *in; + int sx, sy, stx, sty; + int ow = img->pwidth, oh = img->pheight; + stx = (iw<<16) / ow; + sty = (ih<<16) / oh; + + for (y = 0, sy = 0; y < oh; y++, sy += sty) { - for (x = 0; x < w; x++) + in = data + iw*(sy>>16); + for (x = 0, sx = 0; x < ow; x++, sx += stx) { - out[x] = *data++; + out[x] = in[sx>>16]; } out += img->pitch; } SW_RGBToBGR(img); } -void SW_Upload8(swimage_t *img, int w, int h, unsigned char *data) +void SW_Upload8(swimage_t *img, int iw, int ih, unsigned char *data) { + //rescale the input to the output. + //just use nearest-sample, cos we're lazy. int x, y; unsigned int *out = img->data; - for (y = 0; y < h; y++) + unsigned char *in; + int sx, sy, stx, sty; + int ow = img->pwidth, oh = img->pheight; + stx = (iw<<16) / ow; + sty = (ih<<16) / oh; + + for (y = 0, sy = 0; y < oh; y++, sy += sty) { - for (x = 0; x < w; x++) + in = data + iw*(sy>>16); + for (x = 0, sx = 0; x < ow; x++, sx += stx) { - out[x] = d_8to24rgbtable[*data++]; + out[x] = d_8to24rgbtable[in[sx>>16]]; } out += img->pitch; } + SW_RGBToBGR(img); } diff --git a/engine/sw/sw_rast.c b/engine/sw/sw_rast.c index 051457e5b..c31cef23f 100644 --- a/engine/sw/sw_rast.c +++ b/engine/sw/sw_rast.c @@ -48,8 +48,8 @@ static void WT_Triangle(swthread_t *th, swimage_t *img, swvert_t *v1, swvert_t * { \ *zb = z; \ tpix = img->data[ \ - ((unsigned)(s*img->width)%img->width) \ - + (((unsigned)(t*img->height)%img->height) * img->width) \ + ((unsigned)(s>>16)&img->pwidthmask) \ + + (((unsigned)(t>>16)&img->pheightmask) * img->pitch) \ ]; \ if (tpix&0xff000000) \ o = tpix; \ @@ -76,11 +76,11 @@ SPAN_ST - interpolates S+T across the span. access with 'sc' and 'tc' int secondhalf; int xl,xld, xr,xrd; #ifdef SPAN_ST - float sl,sld, sd; - float tl,tld, td; + int sl,sld, sd; + int tl,tld, td; #endif #ifdef SPAN_Z - unsigned int zl,zld, zd; + int zl,zld, zd; #endif unsigned int *restrict outbuf; unsigned int *restrict ti; @@ -136,8 +136,8 @@ SPAN_ST - interpolates S+T across the span. access with 'sc' and 'tc' return; if (v[i]->vcoord[1] < 0 || v[i]->vcoord[1] >= th->vpheight) return; - if (v[i]->vcoord[2] < 0) - return; +// if (v[i]->vcoord[3] < 0) +// return; } for (i = 0; i < 2; i++) @@ -168,19 +168,19 @@ SPAN_ST - interpolates S+T across the span. access with 'sc' and 'tc' fdy2 *= fz; #ifdef SPAN_ST //affine - d1 = v2->tccoord[0] - v1->tccoord[0]; - d2 = v3->tccoord[0] - v1->tccoord[0]; + d1 = (v2->tccoord[0] - v1->tccoord[0])*(img->pwidth<<16); + d2 = (v3->tccoord[0] - v1->tccoord[0])*(img->pwidth<<16); sld = fdx1*d2 - fdx2*d1; sd = fdy2*d1 - fdy1*d2; - d1 = v2->tccoord[1] - v1->tccoord[1]; - d2 = v3->tccoord[1] - v1->tccoord[1]; + d1 = (v2->tccoord[1] - v1->tccoord[1])*(img->pheight<<16); + d2 = (v3->tccoord[1] - v1->tccoord[1])*(img->pheight<<16); tld = fdx1*d2 - fdx2*d1; td = fdy2*d1 - fdy1*d2; #endif #ifdef SPAN_Z - d1 = (v2->vcoord[2] - v1->vcoord[2])*UINT_MAX; - d2 = (v3->vcoord[2] - v1->vcoord[2])*UINT_MAX; + d1 = (v2->vcoord[3] - v1->vcoord[3])*(1<<16); + d2 = (v3->vcoord[3] - v1->vcoord[3])*(1<<16); zld = fdx1*d2 - fdx2*d1; zd = fdy2*d1 - fdy1*d2; #endif @@ -223,11 +223,11 @@ SPAN_ST - interpolates S+T across the span. access with 'sc' and 'tc' recalcside = 1; #ifdef SPAN_ST - sld -= sd*xld/(float)(1<<16); - tld -= td*xld/(float)(1<<16); + sld -= (((long long)sd*xld)>>16); + tld -= (((long long)td*xld)>>16); #endif #ifdef SPAN_Z - zld -= zd*xld/(float)(1<<16); + zld -= (((long long)zd*xld)>>16); #endif } else @@ -275,14 +275,14 @@ SPAN_ST - interpolates S+T across the span. access with 'sc' and 'tc' xl = (int)vlt->vcoord[0]<<16; #ifdef SPAN_ST - sl = vlt->tccoord[0]; - sld = sld + sd*xld/(float)(1<<16); - tl = vlt->tccoord[1]; - tld = tld + td*xld/(float)(1<<16); + sl = vlt->tccoord[0] * (img->pwidth<<16); + sld = sld + (((long long)sd*xld)>>16); + tl = vlt->tccoord[1] * (img->pheight<<16); + tld = tld + (((long long)td*xld)>>16); #endif #ifdef SPAN_Z - zl = vlt->vcoord[2]*UINT_MAX; - zld = zld + zd*xld/(float)(1<<16); + zl = vlt->vcoord[3] * (1<<16); + zld = zld + (((long long)zd*xld)>>16); #endif } @@ -351,8 +351,8 @@ SPAN_ST - interpolates S+T across the span. access with 'sc' and 'tc' ) { #ifdef SPAN_ST - float s = sl; - float t = tl; + unsigned int s = sl; + unsigned int t = tl; #endif #ifdef SPAN_Z unsigned int z = zl; @@ -386,54 +386,65 @@ SPAN_ST - interpolates S+T across the span. access with 'sc' and 'tc' } -static void WT_Clip_Top(swvert_t *out, swvert_t *in, swvert_t *result) +static void WT_Clip_Top(swthread_t *th, swvert_t *out, swvert_t *in, swvert_t *result) { float frac; - frac = (0 - in->vcoord[1]) / + frac = (1 - in->vcoord[1]) / (out->vcoord[1] - in->vcoord[1]); - VectorInterpolate(in->vcoord, frac, out->vcoord, result->vcoord); - result->vcoord[1] = 0; + Vector4Interpolate(in->vcoord, frac, out->vcoord, result->vcoord); +// result->vcoord[1] = 0; Vector2Interpolate(in->tccoord, frac, out->tccoord, result->tccoord); } -static void WT_Clip_Bottom(swvert_t *out, swvert_t *in, swvert_t *result) +static void WT_Clip_Bottom(swthread_t *th, swvert_t *out, swvert_t *in, swvert_t *result) { float frac; - frac = (vid.pixelheight-1 - in->vcoord[1]) / + frac = ((th->vpheight-2) - in->vcoord[1]) / (out->vcoord[1] - in->vcoord[1]); - VectorInterpolate(in->vcoord, frac, out->vcoord, result->vcoord); - result->vcoord[1] = vid.pixelheight-1; + Vector4Interpolate(in->vcoord, frac, out->vcoord, result->vcoord); +// result->vcoord[1] = vid.pixelheight-1; Vector2Interpolate(in->tccoord, frac, out->tccoord, result->tccoord); } -static void WT_Clip_Left(swvert_t *out, swvert_t *in, swvert_t *result) +static void WT_Clip_Left(swthread_t *th, swvert_t *out, swvert_t *in, swvert_t *result) { float frac; - frac = (0 - in->vcoord[0]) / + frac = (1 - in->vcoord[0]) / (out->vcoord[0] - in->vcoord[0]); - VectorInterpolate(in->vcoord, frac, out->vcoord, result->vcoord); - result->vcoord[0] = 0; + Vector4Interpolate(in->vcoord, frac, out->vcoord, result->vcoord); +// result->vcoord[0] = 0; Vector2Interpolate(in->tccoord, frac, out->tccoord, result->tccoord); } -static void WT_Clip_Right(swvert_t *out, swvert_t *in, swvert_t *result) +static void WT_Clip_Right(swthread_t *th, swvert_t *out, swvert_t *in, swvert_t *result) { float frac; - frac = (vid.pixelwidth-1 - in->vcoord[0]) / + frac = ((th->vpwidth-2) - in->vcoord[0]) / (out->vcoord[0] - in->vcoord[0]); - VectorInterpolate(in->vcoord, frac, out->vcoord, result->vcoord); - result->vcoord[0] = vid.pixelwidth-1; + Vector4Interpolate(in->vcoord, frac, out->vcoord, result->vcoord); +// result->vcoord[0] = vid.pixelwidth-1; Vector2Interpolate(in->tccoord, frac, out->tccoord, result->tccoord); } -static void WT_Clip_Near(swvert_t *out, swvert_t *in, swvert_t *result) +static void WT_Clip_Near(swthread_t *th, swvert_t *out, swvert_t *in, swvert_t *result) { - extern cvar_t temp1; + float nearclip = 0; double frac; - frac = (temp1.value - in->vcoord[2]) / - (out->vcoord[2] - in->vcoord[2]); + frac = (nearclip - in->vcoord[3]) / + (out->vcoord[3] - in->vcoord[3]); VectorInterpolate(in->vcoord, frac, out->vcoord, result->vcoord); - result->vcoord[2] = temp1.value; + result->vcoord[3] = nearclip; Vector2Interpolate(in->tccoord, frac, out->tccoord, result->tccoord); } -static int WT_ClipPoly(int incount, swvert_t *inv, swvert_t *outv, int flag, void (*clip)(swvert_t *out, swvert_t *in, swvert_t *result)) +static void WT_Clip_Far(swthread_t *th, swvert_t *out, swvert_t *in, swvert_t *result) +{ + float farclip = 1; + double frac; + frac = (farclip - in->vcoord[3]) / + (out->vcoord[3] - in->vcoord[3]); + VectorInterpolate(in->vcoord, frac, out->vcoord, result->vcoord); + result->vcoord[3] = farclip; + Vector2Interpolate(in->tccoord, frac, out->tccoord, result->tccoord); +} + +static int WT_ClipPoly(swthread_t *th, int incount, swvert_t *inv, swvert_t *outv, int flag, void (*clip)(swthread_t *th, swvert_t *out, swvert_t *in, swvert_t *result)) { int p, c; int result = 0; @@ -452,20 +463,25 @@ static int WT_ClipPoly(int incount, swvert_t *inv, swvert_t *outv, int flag, voi { //crossed... emit a new vertex on the boundary if (cf) //new is offscreen - clip(&inv[c], &inv[p], &outv[result]); + clip(th, &inv[c], &inv[p], &outv[result]); else - clip(&inv[p], &inv[c], &outv[result]); + clip(th, &inv[p], &inv[c], &outv[result]); outv[result].clipflags = 0; if (outv[result].vcoord[0] < 0) - outv[result].clipflags = CLIP_LEFT_FLAG; - if (outv[result].vcoord[0] > vid.pixelwidth-1) + outv[result].clipflags |= CLIP_LEFT_FLAG; + if (outv[result].vcoord[0] >= th->vpwidth) outv[result].clipflags |= CLIP_RIGHT_FLAG; if (outv[result].vcoord[1] < 0) outv[result].clipflags |= CLIP_TOP_FLAG; - if (outv[result].vcoord[1] > vid.pixelheight-1) + if (outv[result].vcoord[1] >= th->vpheight) outv[result].clipflags |= CLIP_BOTTOM_FLAG; + if (outv[result].vcoord[3] < 0) + outv[result].clipflags |= CLIP_NEAR_FLAG; + if (outv[result].vcoord[3] > 1) + outv[result].clipflags |= CLIP_FAR_FLAG; + result++; } if (!cf) @@ -477,6 +493,35 @@ static int WT_ClipPoly(int incount, swvert_t *inv, swvert_t *outv, int flag, voi return result; } +//transform the vertex and calculate its final position. +static int WT_TransformVertXY(swthread_t *th, swvert_t *v) +{ + int result = 0; + vec4_t tr; + Matrix4x4_CM_Transform34(th->u.matrix, v->vcoord, tr); + if (tr[3] != 1) + { + tr[0] /= tr[3]; + tr[1] /= tr[3]; + tr[2] /= tr[3]; + } + + v->vcoord[0] = (tr[0]+1)/2 * th->vpwidth; + if (v->vcoord[0] < 0) + result |= CLIP_LEFT_FLAG; + if (v->vcoord[0] >= th->vpwidth) + result |= CLIP_RIGHT_FLAG; + + v->vcoord[1] = (tr[1]+1)/2 * th->vpheight; + if (v->vcoord[1] < 0) + result |= CLIP_TOP_FLAG; + if (v->vcoord[1] >= th->vpheight) + result |= CLIP_BOTTOM_FLAG; + v->clipflags = result; + + return result; +} + static void WT_ClipTriangle(swthread_t *th, swimage_t *img, swvert_t *v1, swvert_t *v2, swvert_t *v3) { unsigned int cflags; @@ -485,49 +530,74 @@ static void WT_ClipTriangle(swthread_t *th, swimage_t *img, swvert_t *v1, swvert int i; int count; + //check the near/far planes. + v1->vcoord[3] = DotProduct(v1->vcoord, th->u.viewplane) - th->u.viewplane[3]; + if (v1->vcoord[3] < 0) v1->clipflags = CLIP_NEAR_FLAG; else if (v1->vcoord[3] > 1) v1->clipflags = CLIP_FAR_FLAG; else v1->clipflags = 0; + v2->vcoord[3] = DotProduct(v2->vcoord, th->u.viewplane) - th->u.viewplane[3]; + if (v2->vcoord[3] < 0) v2->clipflags = CLIP_NEAR_FLAG; else if (v2->vcoord[3] > 1) v2->clipflags = CLIP_FAR_FLAG; else v2->clipflags = 0; + v3->vcoord[3] = DotProduct(v3->vcoord, th->u.viewplane) - th->u.viewplane[3]; + if (v3->vcoord[3] < 0) v3->clipflags = CLIP_NEAR_FLAG; else if (v3->vcoord[3] > 1) v3->clipflags = CLIP_FAR_FLAG; else v3->clipflags = 0; + if (v1->clipflags & v2->clipflags & v3->clipflags) - return; //all verticies are off at least one single side - + return; //all verticies are off at least one plane cflags = v1->clipflags | v2->clipflags | v3->clipflags; - if (!cflags) + if (0)//!cflags) { - //no clipping to be done - WT_Triangle(th, img, v1, v2, v3); - return; + //figure out the final 2d positions + cflags = 0; + for (i = 0; i < count; i++) + cflags |= WT_TransformVertXY(th, &final[list][i]); + + } + else + { + final[list][0] = *v1; + final[list][1] = *v2; + final[list][2] = *v3; + count = 3; + + //clip to the screen + if (cflags & CLIP_NEAR_FLAG) + { + count = WT_ClipPoly(th, count, final[list], final[list^1], CLIP_NEAR_FLAG, WT_Clip_Near); + list ^= 1; + } + if (cflags & CLIP_FAR_FLAG) + { + count = WT_ClipPoly(th, count, final[list], final[list^1], CLIP_FAR_FLAG, WT_Clip_Far); + list ^= 1; + } + + //figure out the final 2d positions + cflags = 0; + for (i = 0; i < count; i++) + cflags |= WT_TransformVertXY(th, &final[list][i]); } - final[list][0] = *v1; - final[list][1] = *v2; - final[list][2] = *v3; - count = 3; - - if (cflags & CLIP_NEAR_FLAG) - { - count = WT_ClipPoly(count, final[list], final[list^1], CLIP_NEAR_FLAG, WT_Clip_Near); - list ^= 1; - } + //and clip those by the screen (instead of by plane, to try to prevent crashes) if (cflags & CLIP_TOP_FLAG) { - count = WT_ClipPoly(count, final[list], final[list^1], CLIP_TOP_FLAG, WT_Clip_Top); + count = WT_ClipPoly(th, count, final[list], final[list^1], CLIP_TOP_FLAG, WT_Clip_Top); list ^= 1; } if (cflags & CLIP_BOTTOM_FLAG) { - count = WT_ClipPoly(count, final[list], final[list^1], CLIP_BOTTOM_FLAG, WT_Clip_Bottom); + count = WT_ClipPoly(th, count, final[list], final[list^1], CLIP_BOTTOM_FLAG, WT_Clip_Bottom); list ^= 1; } if (cflags & CLIP_LEFT_FLAG) { - count = WT_ClipPoly(count, final[list], final[list^1], CLIP_LEFT_FLAG, WT_Clip_Left); + count = WT_ClipPoly(th, count, final[list], final[list^1], CLIP_LEFT_FLAG, WT_Clip_Left); list ^= 1; } if (cflags & CLIP_RIGHT_FLAG) { - count = WT_ClipPoly(count, final[list], final[list^1], CLIP_RIGHT_FLAG, WT_Clip_Right); + count = WT_ClipPoly(th, count, final[list], final[list^1], CLIP_RIGHT_FLAG, WT_Clip_Right); list ^= 1; } + //draw the damn thing. FIXME: generate spans and push to a fragment thread. for (i = 2; i < count; i++) { WT_Triangle(th, img, &final[list][0], &final[list][i-1], &final[list][i]); @@ -580,6 +650,9 @@ qboolean WT_HandleCommand(swthread_t *t, wqcom_t *com) break; case WTC_NEWFRAME: break; + case WTC_UNIFORMS: + memcpy(&t->u, &com->uniforms.u, sizeof(t->u)); + break; case WTC_VIEWPORT: t->vpcbuf = com->viewport.cbuf; t->vpdbuf = com->viewport.dbuf; @@ -858,17 +931,15 @@ void SW_R_NewMap(void) #endif #ifdef RTLIGHTS - if (r_shadow_realtime_dlight.ival || r_shadow_realtime_world.ival) - { - R_LoadRTLights(); - if (rtlights_first == rtlights_max) - R_ImportRTLights(cl.worldmodel->entities); - } Sh_PreGenerateLights(); #endif } void SW_R_PreNewMap(void) { + r_viewleaf = NULL; + r_oldviewleaf = NULL; + r_viewleaf2 = NULL; + r_oldviewleaf2 = NULL; } void SW_SCR_UpdateScreen(void) { @@ -907,8 +978,6 @@ void SW_SCR_UpdateScreen(void) Shader_DoReload(); //FIXME: playfilm/editor+q3ui - if (vid.recalc_refdef) - SCR_CalcRefdef (); SCR_SetUpToDrawConsole (); if (cls.state == ca_active) @@ -925,6 +994,22 @@ void SW_SCR_UpdateScreen(void) V_UpdatePalette (false); } +void SW_VBO_Begin(vbobctx_t *ctx, unsigned int maxsize) +{ +} +void SW_VBO_Data(vbobctx_t *ctx, void *data, unsigned int size, vboarray_t *varray) +{ +} +void SW_VBO_Finish(vbobctx_t *ctx, void *edata, unsigned int esize, vboarray_t *earray) +{ +} +void SW_VBO_Destroy(vboarray_t *vearray) +{ +} +void SWBE_Scissor(srect_t *rect) +{ +} + rendererinfo_t swrendererinfo = { "Software Renderer", @@ -954,26 +1039,6 @@ rendererinfo_t swrendererinfo = SW_R_NewMap, SW_R_PreNewMap, - Surf_AddStain, - Surf_LessenStains, - - RMod_Init, - RMod_Shutdown, - RMod_ClearAll, - RMod_ForName, - RMod_FindName, - RMod_Extradata, - RMod_TouchModel, - - RMod_NowLoadExternal, - RMod_Think, - Mod_GetTag, - Mod_TagNumForName, - Mod_SkinNumForName, - Mod_FrameNumForName, - Mod_FrameDuration, - - SW_VID_Init, SW_VID_DeInit, SW_VID_ApplyGammaRamps, @@ -994,12 +1059,13 @@ rendererinfo_t swrendererinfo = SWBE_UploadAllLightmaps, SWBE_SelectEntity, SWBE_SelectDLight, + SWBE_Scissor, SWBE_LightCullModel, - NULL,//void (*BE_VBO_Begin)(vbobctx_t *ctx, unsigned int maxsize); - NULL,//void (*BE_VBO_Data)(vbobctx_t *ctx, void *data, unsigned int size, vboarray_t *varray); - NULL,//void (*BE_VBO_Finish)(vbobctx_t *ctx, void *edata, unsigned int esize, vboarray_t *earray); - NULL,//void (*BE_VBO_Destroy)(vboarray_t *vearray); + SW_VBO_Begin, + SW_VBO_Data, + SW_VBO_Finish, + SW_VBO_Destroy, "no more" }; diff --git a/engine/sw/sw_vidwin.c b/engine/sw/sw_vidwin.c index 194e8d2f2..bc8497f7e 100644 --- a/engine/sw/sw_vidwin.c +++ b/engine/sw/sw_vidwin.c @@ -697,12 +697,6 @@ void SW_VID_UpdateViewport(wqcom_t *com) com->viewport.height = vid.pixelheight; com->viewport.stride = screenpitch; com->viewport.framenum = framenumber; - -/* com->viewport.buf = pDIBBase; - com->viewport.width = vid.pixelwidth; - com->viewport.height = vid.pixelheight; - com->viewport.stride = vid.pixelwidth; - com->viewport.framenum = framenumber;*/ } void SW_VID_SwapBuffers(void) @@ -733,7 +727,33 @@ qboolean SW_VID_Init(rendererstate_t *info, unsigned char *palette) vid.pixelwidth = info->width; vid.pixelheight = info->height; - VID_CreateWindow(vid.pixelwidth, vid.pixelheight, false); + if (info->fullscreen) //don't do this with d3d - d3d should set it's own video mode. + { //make windows change res. + DEVMODE gdevmode; + gdevmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + if (info->bpp) + gdevmode.dmFields |= DM_BITSPERPEL; + if (info->rate) + gdevmode.dmFields |= DM_DISPLAYFREQUENCY; + gdevmode.dmBitsPerPel = info->bpp; + if (info->bpp && (gdevmode.dmBitsPerPel < 15)) + { + Con_Printf("Forcing at least 16bpp\n"); + gdevmode.dmBitsPerPel = 16; + } + gdevmode.dmDisplayFrequency = info->rate; + gdevmode.dmPelsWidth = info->width; + gdevmode.dmPelsHeight = info->height; + gdevmode.dmSize = sizeof (gdevmode); + + if (ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + { + Con_SafePrintf((gdevmode.dmFields&DM_DISPLAYFREQUENCY)?"Windows rejected mode %i*%i*%i*%i\n":"Windows rejected mode %i*%i*%i\n", (int)gdevmode.dmPelsWidth, (int)gdevmode.dmPelsHeight, (int)gdevmode.dmBitsPerPel, (int)gdevmode.dmDisplayFrequency); + return false; + } + } + + VID_CreateWindow(vid.pixelwidth, vid.pixelheight, info->fullscreen); if (!DIB_Init()) return false; @@ -744,6 +764,8 @@ void SW_VID_DeInit(void) { DIB_Shutdown(); DestroyWindow(mainwindow); + + ChangeDisplaySettings (NULL, 0); } qboolean SW_VID_ApplyGammaRamps (unsigned short *ramps) { diff --git a/plugins/jabber/jabbercl.vcproj b/plugins/jabber/jabbercl.vcproj index 7175be5ef..9277d1e32 100644 --- a/plugins/jabber/jabbercl.vcproj +++ b/plugins/jabber/jabbercl.vcproj @@ -90,7 +90,8 @@ Name="Release|Win32" OutputDirectory="$(SolutionDir)$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" + ConfigurationType="2" + WholeProgramOptimization="1" > domain); return false; } } @@ -2554,7 +2554,7 @@ jclient_t *JCL_Connect(int accnum, char *server, int forcetls, char *account, ch x = XML_CreateNode(NULL, "account", "", ""); XML_AddParameteri(x, "id", accnum); - XML_CreateNode(x, "server", "", server); + XML_CreateNode(x, "serveraddr", "", server); XML_CreateNode(x, "username", "", account); XML_CreateNode(x, "domain", "", domain); XML_CreateNode(x, "resource", "", res); @@ -4239,7 +4239,7 @@ void JCL_LoadConfig(void) char buf[8192]; qboolean oldtls; len = pFS_Open("**plugconfig", &config, 1); - if (config >= 0) + if (len >= 0) { if (len >= sizeof(buf)) len = sizeof(buf)-1; @@ -4247,7 +4247,7 @@ void JCL_LoadConfig(void) pFS_Read(config, buf, len); pFS_Close(config); - if (*buf != '<') + if (len && *buf != '<') {//legacy code, to be removed char *line = buf; char tls[256]; @@ -4261,6 +4261,7 @@ void JCL_LoadConfig(void) oldtls = atoi(tls); + Con_Printf("Legacy config: %s (%i)\n", buf, len); jclients[0] = JCL_Connect(0, server, oldtls, account, password); } else diff --git a/plugins/paths.bat b/plugins/paths.bat index 824ceed8f..b19b58b2a 100644 --- a/plugins/paths.bat +++ b/plugins/paths.bat @@ -5,7 +5,7 @@ REM I guess we should include our own copy of them. set QuakeDir=h:\quake set Q3SrcDir=h:\quakestuff\quake3 -set Path=%Q3SrcDir%\quake3-1.32b\lcc\bin;%Q3SrcDir%\quake3-1.32b\q3asm\debug;..\..\..\lcc;..\..\..\q3asm2 +set Path=%Q3SrcDir%\quake3-1.32b\lcc\bin;%Q3SrcDir%\quake3-1.32b\q3asm\debug;..\..\..\lcc;..\..\..\q3asm2;..\.. set PluginsDir=%QuakeDir%\fte\plugins