tge/engine/interior/interiorMap.h
2017-04-17 06:17:10 -06:00

197 lines
6.1 KiB
C++
Executable File

#ifndef _INTERIORMAP_H_
#define _INTERIORMAP_H_
#include "platform/platform.h"
#include "sim/sceneObject.h"
#include "collision/convex.h"
#include "dgl/gTexManager.h"
#include "core/tokenizer.h"
#include "collision/convexBrush.h"
#include "collision/abstractPolyList.h"
#include "interior/interiorMapRes.h"
// Pre-define the InteriorMap class so that we can reference it in InteriorMapConvex
class InteriorMap;
// This is the convex collision implementation for InteriorMap
// Once something has collided against a InteriorMap then it creates one of
// these for the actual collisions to occur against
class InteriorMapConvex : public Convex
{
typedef Convex Parent;
friend class InteriorMap; // So the "owner" object can set some properties when it creates this
public:
// This is where you set the convex type
// Needs to be defined in convex.h in the ConvexType enum
InteriorMapConvex() { mType = InteriorMapConvexType; };
~InteriorMapConvex() {};
protected:
Box3F box; // The bounding box of the convex (in object space)
InteriorMap* pOwner; // A pointer back to the "owner" object so we can reference the vertices
U32 nodeIndex;
S32 brushIndex;
public:
// Return the bounding box transformed into world space
Box3F getBoundingBox() const;
// Return the bounding box transformed and scaled by the input values
Box3F getBoundingBox(const MatrixF& mat, const Point3F& scale) const;
// This returns a list of convex faces to collide against
void getPolyList(AbstractPolyList* list);
// Returns the vertices, faces, and edges of our convex
void getFeatures(const MatrixF& mat,const VectorF& n, ConvexFeature* cf);
// This returns the furthest point from the input vector
Point3F support(const VectorF& v) const;
// A helper function that checks the edgelist for duplicates
void addEdge(U32 zero, U32 one, U32 base, ConvexFeature* cf);
};
class InteriorMap : public SceneObject
{
friend class InteriorMapConvex; // So the "child" convex(es) can reference the vertices
public:
typedef SceneObject Parent;
// Declare Console Object.
DECLARE_CONOBJECT(InteriorMap);
protected:
// Create and use these to specify custom events.
//
// NOTE:- Using these allows you to group the changes into related
// events. No need to change everything if something minor
// changes. Only really important if you have *lots* of these
// objects at start-up or you send alot of changes whilst the
// game is in progress.
//
// Use "setMaskBits(InteriorMapMask)" to signal.
// - Melv May
enum
{
MoveMask = (1 << 0),
RenderModeMask = (1 << 1)
};
bool mLoaded; // Make sure we don't load this twice
public:
enum
{
TexShaded = 0,
SolidShaded,
TexWireframe,
SolidWireframe,
Edges,
BrushColors,
FaceColors,
BspPolys,
CollisionHulls,
Lighting,
TexLighting
};
TextureHandle* mTexHandles;
TextureHandle* mWhite;
StringTableEntry mFileName; // The name of the level
StringTableEntry mFilePath; // The path of the level
StringTableEntry mTexPath; // The path to the textures
U32 mRenderMode;
bool mEnableLights;
Resource<InteriorMapResource> mInteriorRes;
InteriorMapResource::Entity* getEntity(char* classname)
{
for (U32 i = 0; i < mInteriorRes->mEntities.size(); i++)
{
if (dStricmp(classname, mInteriorRes->mEntities[i]->classname) == 0)
return mInteriorRes->mEntities[i];
}
return NULL;
}
void getEntities(char* classname, VectorPtr<InteriorMapResource::Entity*> ents)
{
for (U32 i = 0; i < mInteriorRes->mEntities.size(); i++)
{
if (dStricmp(classname, mInteriorRes->mEntities[i]->classname) == 0)
{
ents.increment();
ents.last() = mInteriorRes->mEntities[i];
}
}
}
protected:
Convex* mConvexList;
// I split the render and load functions out of renderObject() and onAdd() for clarity
bool render(void);
public:
// Creation and destruction
InteriorMap(void);
virtual ~InteriorMap(void);
// Utility
bool setPath(const char* filename);
bool loadTextures();
bool calcTexgenDiv();
// SceneObject
// renderObject() is the function that gets called for evey SceneObject
void renderObject(SceneState*, SceneRenderImage*);
// This function gets called to let you define a few proprties like translucency
virtual bool prepRenderImage(SceneState*, const U32 stateKey, const U32 startZone,
const bool modifyBaseZoneState = false);
// SimObject
bool onAdd();
void onRemove();
void onEditorEnable();
void onEditorDisable();
void inspectPostApply();
// NetObject
U32 packUpdate(NetConnection *, U32, BitStream *);
void unpackUpdate(NetConnection *, BitStream *);
// ConObject.
static void initPersistFields();
// Collision
// castRay() returns the percentage along the line from a starting and an ending point
// to where something collides with the object
bool castRay(const Point3F&, const Point3F&, RayInfo*);
// Called whenever something overlaps our bounding box
// This is where the SceneObject can submit convexes to the working list of an object interested in collision data
void buildConvex(const Box3F& box, Convex* convex);
// Script access functions
void removeBrush(S32 brushIndex); // Removes brush from mBrushes and deletes it from memory
S32 getTextureCount(); // Returns the number of textures used in the map
const char* getTextureName(S32 index); // Returns the name of the texture given the texture's index
const char* getTexturePathway(); // Returns the texture for the map
Point2I getTextureSize(S32 index); // Returns the requested texture's dimensions
S32 getBrushIndex(U32 brushID);
};
#endif