summaryrefslogtreecommitdiff
path: root/3dc/MSLHAND.C
diff options
context:
space:
mode:
authorRebellion Developments <rebellion@nomail>2000-03-16 11:25:00 +0100
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-19 05:45:17 +0200
commit218ca90543758a20ac326e444ca0643174ca7384 (patch)
tree16bfe3e5307f9f515489000f28728224291a0e3b /3dc/MSLHAND.C
Import Aliens vs Predator - Gold (Build 116)
Source code release, imported from: https://www.gamefront.com/games/aliens-vs-predator-3/file/avp-gold-complete-source-code All text files were converted to Unix format.
Diffstat (limited to '3dc/MSLHAND.C')
-rw-r--r--3dc/MSLHAND.C187
1 files changed, 187 insertions, 0 deletions
diff --git a/3dc/MSLHAND.C b/3dc/MSLHAND.C
new file mode 100644
index 0000000..fe1e8ca
--- /dev/null
+++ b/3dc/MSLHAND.C
@@ -0,0 +1,187 @@
+#include "3dc.h"
+
+#include "mslhand.h"
+
+#if PSX
+#include "psx_inc.h"
+#endif
+
+#define UseLocalAssert 1
+#include "ourasert.h"
+
+extern SHAPEHEADER * mainshapelist[];
+
+static int begins[ MSLS_MAXSECTIONS ];
+static int ends[ MSLS_MAXSECTIONS ];
+
+static int autodelete[ maxobjects ];
+
+#define MSS_FREE (-1)
+
+static void EnsureInitialized(void)
+{
+ static int initialized = 0;
+
+ if (!initialized)
+ {
+ int i;
+
+ initialized = 1;
+
+ for (i=0; i<MSLS_MAXSECTIONS; ++i)
+ {
+ begins[i]=MSS_FREE;
+ ends[i]=MSS_FREE;
+ }
+ }
+}
+
+int GetNextMSLEntry(MSL_SECTION sect, unsigned int num_shapes, int auto_delete)
+{
+ int i, blockstart, maxend = maxobjects;
+ /* I assume that the size of the global array 'mainshapelist' will be 'maxobjects' */
+
+ EnsureInitialized();
+
+ for (i=sect+1; i<MSLS_MAXSECTIONS; ++i)
+ {
+ if (MSS_FREE != begins[i])
+ {
+ maxend = begins[i];
+ break;
+ }
+ }
+
+ for (i=sect-1; MSS_FREE == begins[sect]; --i)
+ {
+ ends[sect] = begins[sect] = i>=0 ? ends[i] : 0;
+ }
+
+ blockstart = ends[sect];
+ /* can use a local assert here to fail on a mainshapelist overflow, otherwise return error code */
+ LOCALASSERT(ends[sect] + num_shapes <= maxend);
+ if (ends[sect] + num_shapes > maxend ) return MSL_OVERFLOW;
+ ends[sect] += num_shapes;
+
+ for (i=blockstart; i<ends[sect]; ++i)
+ {
+ mainshapelist[i] = 0;
+ autodelete[i] = auto_delete;
+ }
+
+ return blockstart;
+}
+
+void FlushMSLSection(MSL_SECTION sect)
+{
+
+#if StandardShapeLanguage
+
+ int i;
+
+ EnsureInitialized();
+
+ if (MSS_FREE == begins[sect] || MSS_FREE == ends[sect]) return;
+
+ for (i=begins[sect]; i<ends[sect]; ++i)
+ {
+ if (autodelete[i] && mainshapelist[i])
+ {
+ SHAPEHEADER * shp = mainshapelist[i];
+
+ int max_num_texs = 0;
+ int i;
+
+ if (shp->points)
+ {
+ if (*shp->points) free(*shp->points);
+ free(shp->points);
+ }
+ if (shp->sh_normals)
+ {
+ if (*shp->sh_normals) free(*shp->sh_normals);
+ free(shp->sh_normals);
+ }
+ if (shp->sh_vnormals)
+ {
+ if (*shp->sh_vnormals) free(*shp->sh_vnormals);
+ free(shp->sh_vnormals);
+ }
+ if (shp->sh_extraitemdata)
+ free(shp->sh_extraitemdata);
+ /* the items are allocated in one big bunch
+ // 9 int's per item (to make bsp simple)
+ // this should be changed if it is to be done
+ // a different way
+ */
+ if (shp->items)
+ {
+ for (i=0; i<shp->numitems; i++)
+ {
+ if (shp->items[i][0] == 5 || shp->items[i][0] == 6)
+ {
+ int UVIndex = (shp->items[i][3] &0xffff0000) >> 16;
+ max_num_texs = max (max_num_texs, shp->items[i][3] &0x7fff);
+ if(shp->items[i][2]& iflag_txanim)
+ {
+ int j;
+ TXANIMHEADER** thlist=(TXANIMHEADER**)shp->sh_textures[UVIndex];
+ for(j=1;thlist[j]!=0;j++)
+ {
+ int k;
+ TXANIMHEADER* th=thlist[j];
+ for(k=0;k<th->txa_numframes;k++)
+ {
+ free(th->txa_framedata[k].txf_uvdata);
+ }
+ free (th->txa_framedata);
+ free (th);
+ }
+ free (thlist);
+ shp->sh_textures[UVIndex]=0;
+ }
+ else
+ {
+ free(shp->sh_textures[UVIndex]);
+ }
+ }
+ }
+
+ free (*shp->items);
+ free (shp->items);
+ }
+
+ if (shp->sh_textures)
+ {
+ free (shp->sh_textures);
+ }
+
+ if (shp->sh_localtextures)
+ {
+ for (i=0; i<(max_num_texs+1); i++)
+ {
+ free (shp->sh_localtextures[i]);
+ }
+ free (shp->sh_localtextures);
+ }
+
+ if (shp->sh_instruction)
+ free(shp->sh_instruction);
+
+ free(shp);
+ }
+ mainshapelist[i]=0;
+ autodelete[i]=0;
+ }
+
+ begins[sect]=MSS_FREE;
+ ends[sect]=MSS_FREE;
+
+#else
+
+printf("\nDo NOT call this function!\n");
+//GLOBALASSERT(1==0);
+
+#endif
+
+}