/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of HPL1 Engine.
*/
#ifndef HPL_ENTITY3D_H
#define HPL_ENTITY3D_H
#include "hpl1/engine/math/MathTypes.h"
#include "hpl1/engine/scene/Entity.h"
#include "hpl1/engine/system/Container.h"
#include "hpl1/engine/system/SystemTypes.h"
#include "common/list.h"
#include "hpl1/engine/math/BoundingVolume.h"
namespace hpl {
class iEntity3D;
class cSector;
class iEntityCallback {
public:
virtual ~iEntityCallback() = default;
virtual void OnTransformUpdate(iEntity3D *apEntity) = 0;
};
typedef Common::List tEntityCallbackList;
typedef tEntityCallbackList::iterator tEntityCallbackListIt;
//------------------------------------
// Used for the render container to add specific data to
// the object.
class iRenderContainerData {
};
typedef Common::List tRenderContainerDataList;
typedef tRenderContainerDataList::iterator tRenderContainerDataListIt;
//------------------------------------
kSaveData_ChildClass(iEntity, iEntity3D) {
kSaveData_ClassInit(iEntity3D) public : cMatrixf m_mtxLocalTransform;
cBoundingVolume mBoundingVolume;
tString msSourceFile;
int mlParentId;
cContainerList mlstChildren;
};
//-----------------------------------------
class iEntity3D;
typedef Common::List tEntity3DList;
typedef tEntity3DList::iterator tEntity3DListIt;
class iEntity3D : public iEntity {
typedef iEntity super;
public:
iEntity3D(tString asName);
virtual ~iEntity3D();
cVector3f GetLocalPosition();
cMatrixf &GetLocalMatrix();
cVector3f GetWorldPosition();
cMatrixf &GetWorldMatrix();
void SetPosition(const cVector3f &avPos);
void SetMatrix(const cMatrixf &a_mtxTransform);
void SetWorldPosition(const cVector3f &avWorldPos);
void SetWorldMatrix(const cMatrixf &a_mtxWorldTransform);
void SetTransformUpdated(bool abUpdateCallbacks = true);
bool GetTransformUpdated();
int GetTransformUpdateCount();
void AddCallback(iEntityCallback *apCallback);
void RemoveCallback(iEntityCallback *apCallback);
void SetSourceFile(const tString &asFile) { msSourceFile = asFile; }
const tString &GetSourceFile() { return msSourceFile; }
virtual cBoundingVolume *GetBoundingVolume() { return &mBoundingVolume; }
/**
* The child hierarchy will only work if the child has no node parent.
**/
void AddChild(iEntity3D *apEntity);
void RemoveChild(iEntity3D *apEntity);
bool IsChild(iEntity3D *apEntity);
iEntity3D *GetEntityParent();
virtual tRenderContainerDataList *GetRenderContainerDataList() { return &mlstRenderContainerData; }
inline int GetIteratorCount() { return mlIteratorCount; }
inline void SetIteratorCount(const int alX) { mlIteratorCount = alX; }
inline void SetCurrentSector(cSector *apSetor) { mpCurrentSector = apSetor; }
virtual cSector *GetCurrentSector() const { return mpCurrentSector; }
bool IsInSector(cSector *apSector);
inline int GetGlobalRenderCount() { return mlGlobalRenderCount; }
inline void SetGlobalRenderCount(int alX) { mlGlobalRenderCount = alX; }
// SaveObject implementation
virtual iSaveData *CreateSaveData();
virtual void SaveToSaveData(iSaveData *apSaveData);
virtual void LoadFromSaveData(iSaveData *apSaveData);
virtual void SaveDataSetup(cSaveObjectHandler *apSaveObjectHandler, cGame *apGame);
protected:
cMatrixf m_mtxLocalTransform;
cMatrixf m_mtxWorldTransform;
cBoundingVolume mBoundingVolume;
bool mbUpdateBoundingVolume;
bool mbApplyTransformToBV; // Only temp!!
bool mbTransformUpdated;
int mlGlobalRenderCount;
int mlCount;
tString msSourceFile;
tEntityCallbackList mlstCallbacks;
tRenderContainerDataList mlstRenderContainerData;
tEntity3DList mlstChildren;
iEntity3D *mpParent;
cSector *mpCurrentSector;
int mlIteratorCount;
private:
void UpdateWorldTransform();
};
} // namespace hpl
#endif // HPL_ENTITY3D_H