]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
added support for GL_ARB_texture_env_combine, currently only used on wall rendering...
[xonotic/darkplaces.git] / model_shared.c
index ecfe872a74720ee91fa995af4c15ab7cd32f5b02..6209ace388328f1c5d0ef7b8ea6b2d2158906a88 100644 (file)
@@ -27,20 +27,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 model_t        *loadmodel;
 char   loadname[32];   // for hunk tags
 
-void Mod_LoadSpriteModel (model_t *mod, void *buffer);
-void Mod_LoadBrushModel (model_t *mod, void *buffer);
-void Mod_LoadAliasModel (model_t *mod, void *buffer);
-void Mod_LoadQ2AliasModel (model_t *mod, void *buffer);
-model_t *Mod_LoadModel (model_t *mod, qboolean crash);
-
-#define        MAX_MOD_KNOWN   512
+// LordHavoc: increased from 512 to 2048
+#define        MAX_MOD_KNOWN   2048
 model_t        mod_known[MAX_MOD_KNOWN];
 int            mod_numknown;
 
-extern void Mod_BrushInit();
-extern void Mod_AliasInit();
-extern void Mod_SpriteInit();
-
 /*
 ===============
 Mod_Init
@@ -63,13 +54,13 @@ Caches the data if needed
 void *Mod_Extradata (model_t *mod)
 {
        void    *r;
-       
+
        r = Cache_Check (&mod->cache);
        if (r)
                return r;
 
        Mod_LoadModel (mod, true);
-       
+
        if (!mod->cache.data)
                Host_Error ("Mod_Extradata: caching failed");
        return mod->cache.data;
@@ -84,9 +75,9 @@ void Mod_ClearAll (void)
 {
        int             i;
        model_t *mod;
-       
+
        for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
-               if (mod->type != mod_alias)
+               if (!mod->cachesize)
                        mod->needload = true;
 }
 
@@ -100,17 +91,17 @@ model_t *Mod_FindName (char *name)
 {
        int             i;
        model_t *mod;
-       
+
        if (!name[0])
                Host_Error ("Mod_ForName: NULL name");
-               
+
 //
 // search the currently loaded models
 //
        for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
                if (!strcmp (mod->name, name) )
                        break;
-                       
+
        if (i == mod_numknown)
        {
                if (mod_numknown == MAX_MOD_KNOWN)
@@ -132,14 +123,12 @@ Mod_TouchModel
 void Mod_TouchModel (char *name)
 {
        model_t *mod;
-       
+
        mod = Mod_FindName (name);
-       
+
        if (!mod->needload)
-       {
-               if (mod->type == mod_alias)
+               if (mod->cachesize)
                        Cache_Check (&mod->cache);
-       }
 }
 
 /*
@@ -153,11 +142,10 @@ model_t *Mod_LoadModel (model_t *mod, qboolean crash)
 {
        void    *d;
        unsigned *buf;
-//     byte    stackbuf[1024];         // avoid dirtying the cache heap
 
        if (!mod->needload)
        {
-               if (mod->type == mod_alias)
+               if (mod->cachesize)
                {
                        d = Cache_Check (&mod->cache);
                        if (d)
@@ -167,24 +155,30 @@ model_t *Mod_LoadModel (model_t *mod, qboolean crash)
                        return mod;             // not cached at all
        }
 
+       Con_DPrintf("loading model %s\n", mod->name);
+
 // load the file
        buf = (unsigned *)COM_LoadMallocFile (mod->name, false);
-//     buf = (unsigned *)COM_LoadStackFile (mod->name, stackbuf, sizeof(stackbuf), false);
        if (!buf)
        {
                if (crash)
                        Host_Error ("Mod_NumForName: %s not found", mod->name); // LordHavoc: Sys_Error was *ANNOYING*
                return NULL;
        }
-       
+
 // allocate a new model
-       COM_FileBase (mod->name, loadname);
-       
+//     COM_FileBase (mod->name, loadname);
+       strcpy(loadname, mod->name);
+
        loadmodel = mod;
 
 // call the apropriate loader
        mod->needload = false;
-       
+
+       // LordHavoc: clear some important stuff in the model_t structure
+       mod->flags = 0;
+       mod->flags2 = 0;
+
        switch (LittleLong(*(unsigned *)buf))
        {
        case IDPOLYHEADER:
@@ -194,7 +188,11 @@ model_t *Mod_LoadModel (model_t *mod, qboolean crash)
        case MD2IDALIASHEADER: // LordHavoc: added Quake2 model support
                Mod_LoadQ2AliasModel (mod, buf);
                break;
-               
+
+       case (('O'<<24)+('M'<<16)+('Y'<<8)+'Z'):
+               Mod_LoadZymoticModel(mod, buf);
+               break;
+
        case IDSPRITEHEADER:
                Mod_LoadSpriteModel (mod, buf);
                break;
@@ -203,7 +201,7 @@ model_t *Mod_LoadModel (model_t *mod, qboolean crash)
                Mod_LoadBrushModel (mod, buf);
                break;
        }
-       free(buf);
+       qfree(buf);
 
        return mod;
 }
@@ -257,7 +255,7 @@ void Mod_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 ("%4iK : %8p : %s\n", (mod->cachesize + 1023) / 1024, mod->cache.data, mod->name);
        }
 }