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

140 lines
4.0 KiB
C++
Executable File

//--------------------------------------------------------------------------
// PathedInterior.h:
//
//
//--------------------------------------------------------------------------
#ifndef _H_PATHEDINTERIOR
#define _H_PATHEDINTERIOR
#include "interior/interior.h"
#include "game/gameBase.h"
#include "core/resManager.h"
#include "interior/interiorRes.h"
#ifndef _INTERIORLMMANAGER_H_
#include "interior/interiorLMManager.h"
#endif
#include "audio/audioDataBlock.h"
class InteriorInstance;
class EditGeometry;
class EditInteriorResource;
struct PathedInteriorData : public GameBaseData {
typedef GameBaseData Parent;
public:
enum Sounds {
StartSound,
SustainSound,
StopSound,
MaxSounds
};
AudioProfile *sound[MaxSounds];
static void initPersistFields();
virtual void packData(BitStream* stream);
virtual void unpackData(BitStream* stream);
bool preload(bool server, char errorBuffer[256]);
PathedInteriorData();
DECLARE_CONOBJECT(PathedInteriorData);
};
class PathedInterior : public GameBase
{
typedef GameBase Parent;
friend class InteriorInstance;
friend class EditGeometry;
friend class EditInteriorResource;
PathedInteriorData *mDataBlock;
public:
enum UpdateMasks {
NewTargetMask = Parent::NextFreeMask,
NewPositionMask = Parent::NextFreeMask << 1,
NextFreeMask = Parent::NextFreeMask << 2,
};
private:
U32 getPathKey(); // only used on the server
// Persist fields
protected:
StringTableEntry mName;
S32 mPathIndex;
Vector<StringTableEntry> mTriggers;
Point3F mOffset;
Box3F mExtrudedBox;
bool mStopped;
// Loaded resources and fields
protected:
static PathedInterior *mClientPathedInteriors;
AUDIOHANDLE mSustainHandle;
StringTableEntry mInteriorResName;
S32 mInteriorResIndex;
Resource<InteriorResource> mInteriorRes;
Interior* mInterior;
Vector<ColorI> mVertexColorsNormal;
Vector<ColorI> mVertexColorsAlarm;
LM_HANDLE mLMHandle;
MatrixF mBaseTransform;
Point3F mBaseScale;
U32 mPathKey; // only used on the client
F64 mCurrentPosition;
S32 mTargetPosition;
Point3F mCurrentVelocity;
PathedInterior *mNextClientPI;
// Rendering
protected:
bool prepRenderImage(SceneState *state, const U32 stateKey, const U32 startZone, const bool modifyBaseZoneState);
void renderObject(SceneState *state, SceneRenderImage *image);
void renderShadowVolumes(SceneState *state);
protected:
bool onAdd();
void onRemove();
bool onSceneAdd(SceneGraph *graph);
void onSceneRemove();
public:
PathedInterior();
~PathedInterior();
PathedInterior *getNext() { return mNextClientPI; }
static PathedInterior *getClientPathedInteriors() { return mClientPathedInteriors; }
void processTick(const Move* move);
void setStopped() { mStopped = true; }
void resolvePathKey();
bool onNewDataBlock(GameBaseData* dptr);
bool buildPolyList(AbstractPolyList* polyList, const Box3F &box, const SphereF &sphere);
bool readPI(Stream&);
bool writePI(Stream&) const;
PathedInterior* clone() const;
DECLARE_CONOBJECT(PathedInterior);
static void initPersistFields();
void setPathPosition(S32 newPosition);
void setTargetPosition(S32 targetPosition);
void computeNextPathStep(U32 timeDelta);
Box3F getExtrudedBox() { return mExtrudedBox; }
Point3F getVelocity();
void advance(F64 timeDelta);
U32 packUpdate(NetConnection *conn, U32 mask, BitStream* stream);
void unpackUpdate(NetConnection *conn, BitStream* stream);
};
#endif // _H_PATHEDINTERIOR