245 lines
4.1 KiB
C
245 lines
4.1 KiB
C
#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;
|
|
|
|
|
|
|
|
}
|