summaryrefslogtreecommitdiff
path: root/3dc/MAP.C
diff options
context:
space:
mode:
Diffstat (limited to '3dc/MAP.C')
-rw-r--r--3dc/MAP.C246
1 files changed, 246 insertions, 0 deletions
diff --git a/3dc/MAP.C b/3dc/MAP.C
new file mode 100644
index 0000000..c926cbd
--- /dev/null
+++ b/3dc/MAP.C
@@ -0,0 +1,246 @@
+#include "3dc.h"
+
+#include "inline.h"
+#include "module.h"
+#include "stratdef.h"
+
+#define UseLocalAssert Yes
+#include "ourasert.h"
+
+
+/*
+ externs for commonly used global variables and arrays
+*/
+
+
+extern VIEWDESCRIPTORBLOCK *Global_VDB_Ptr;
+
+/*
+ Global Variables
+*/
+
+DISPLAYBLOCK *dptr_last;
+DISPLAYBLOCK *Player;
+
+
+/*
+ Map Reading Functions
+ Read the map data passed and create the objects on the map
+ The map header contains an array of pointers to the different map data
+ structures
+*/
+
+
+DISPLAYBLOCK* ReadMap(MAPHEADER *mapheader)
+{
+ MAPBLOCK8 *mapblock8ptr;
+ DISPLAYBLOCK *dblockptr = 0;
+
+
+ /* Set up pointers to the map arrays */
+ mapblock8ptr = mapheader->MapType8Objects;
+
+
+ /* Map Type #8 Structure */
+ if(mapblock8ptr) {
+
+ while(mapblock8ptr->MapType != MapType_Term) {
+
+ dblockptr = CreateActiveObject();
+
+ if(dblockptr)
+ {
+ dblockptr->ObShape = mapblock8ptr->MapShape;
+
+ CopyLocation(&mapblock8ptr->MapWorld, &dblockptr->ObWorld);
+ CopyEuler(&mapblock8ptr->MapEuler, &dblockptr->ObEuler);
+
+ dblockptr->ObFlags = mapblock8ptr->MapFlags;
+ dblockptr->ObFlags2 = mapblock8ptr->MapFlags2;
+ dblockptr->ObFlags3 = mapblock8ptr->MapFlags3;
+
+ if (mapblock8ptr->MapType == MapType_Player)
+ {
+ Player = dblockptr;
+ }
+ else
+ {
+ dblockptr->ObLightType = LightType_PerVertex;
+ dblockptr->ObFlags |= ObFlag_MultLSrc;
+ }
+
+/* KJL 16:55:57 06/05/97 - removing camera stuff */
+ if(mapblock8ptr->MapVDBData)
+ MapSetVDB(dblockptr, mapblock8ptr->MapVDBData);
+
+ dblockptr->ObLightType = mapblock8ptr->MapLightType;
+
+/* KJL 15:23:52 06/07/97 - removed */
+// CopyVector(&mapblock8ptr->MapOrigin, &dblockptr->ObOrigin);
+// dblockptr->ObSimShapes = mapblock8ptr->MapSimShapes;
+// dblockptr->ObViewType = mapblock8ptr->MapViewType;
+
+ MapBlockInit(dblockptr);
+
+ CreateEulerMatrix(&dblockptr->ObEuler,&dblockptr->ObMat);
+ TransposeMatrixCH(&dblockptr->ObMat);
+
+ MapPostProcessing(dblockptr);
+ }
+
+ dptr_last = dblockptr;
+
+ mapblock8ptr++;
+
+ }
+
+ }
+ return dblockptr;
+}
+
+
+
+/*
+
+ Some objects might require a certain amount of general processing after
+ all the other map functions have been called
+
+*/
+
+void MapPostProcessing(DISPLAYBLOCK *dptr)
+{
+ if(dptr)
+ {
+ /*
+
+ Make sure that objects requesting multiple light sources are at
+ least set to "LightType_PerObject"
+
+ */
+ if(dptr->ObFlags & ObFlag_MultLSrc)
+ {
+ if(dptr->ObLightType == LightType_Infinite)
+ dptr->ObLightType = LightType_PerObject;
+ }
+ }
+}
+
+
+void MapSetVDB(DISPLAYBLOCK *dptr, MAPSETVDB *mapvdbdata)
+{
+
+ VIEWDESCRIPTORBLOCK *vdb;
+
+ /* TEST */
+ /*LIGHTBLOCK *lptr;*/
+
+
+
+ /* Allocate a VDB */
+
+ vdb = CreateActiveVDB();
+
+ if(vdb) {
+
+ dptr->ObVDBPtr = vdb; /* Object Block ptr to VDB */
+
+ vdb->VDB_ViewObject = dptr; /* VDB ptr to Object Block */
+
+
+ /* VDB Setup */
+
+ SetVDB(
+
+ vdb,
+
+ mapvdbdata->SVDB_Flags,
+ mapvdbdata->SVDB_ViewType,
+
+ mapvdbdata->SVDB_Depth,
+
+ mapvdbdata->SVDB_CentreX,
+ mapvdbdata->SVDB_CentreY,
+
+ mapvdbdata->SVDB_ProjX,
+ mapvdbdata->SVDB_ProjY,
+ mapvdbdata->SVDB_MaxProj,
+
+ mapvdbdata->SVDB_ClipLeft,
+ mapvdbdata->SVDB_ClipRight,
+ mapvdbdata->SVDB_ClipUp,
+ mapvdbdata->SVDB_ClipDown,
+
+ mapvdbdata->SVDB_H1,
+ mapvdbdata->SVDB_H2,
+ mapvdbdata->SVDB_HColour,
+
+ mapvdbdata->SVDB_Ambience
+
+ );
+
+ PlatformSpecificVDBInit(vdb);
+
+ #if ProjectSpecificVDBs
+ ProjectSpecificVDBInit(vdb);
+ #endif
+
+
+ }
+
+}
+
+
+
+
+
+
+
+/*
+
+ Standard Initialisation for Map Objects
+
+*/
+
+void MapBlockInit(DISPLAYBLOCK *dptr)
+{
+ SHAPEHEADER *sptr;
+
+ /* Get the shape header ptr */
+
+ sptr = GetShapeData(dptr->ObShape);
+
+
+ /* Augmented Z */
+
+ if(sptr->shapeflags & ShapeFlag_AugZ) dptr->ObFlags2 |= ObFlag2_AugZ;
+
+
+ /* Pass address of the shape data header back to the block for others */
+
+ dptr->ObShapeData = sptr;
+
+
+ /* Does this shape use a BSP tree or a Z Sort ? */
+
+ dptr->ObFlags |= ObFlag_TypeZ;
+
+
+ /* Copy shape radius to ODB */
+
+ dptr->ObRadius = sptr->shaperadius;
+
+ /* Copy shape xyz extents to ODB */
+
+ dptr->ObMaxX = sptr->shapemaxx;
+ dptr->ObMinX = sptr->shapeminx;
+
+ dptr->ObMaxY = sptr->shapemaxy;
+ dptr->ObMinY = sptr->shapeminy;
+
+ dptr->ObMaxZ = sptr->shapemaxz;
+ dptr->ObMinZ = sptr->shapeminz;
+
+
+
+}
+