1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
|
/* 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 <http://www.gnu.org/licenses/>.
*
*/
/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of HPL1 Engine.
*/
#ifndef HPL_MESH_ENTITY_H
#define HPL_MESH_ENTITY_H
#include "hpl1/engine/graphics/GraphicsTypes.h"
#include "hpl1/engine/graphics/Renderable.h"
#include "hpl1/engine/math/MathTypes.h"
#include "hpl1/engine/math/MeshTypes.h"
#include "hpl1/engine/scene/Entity3D.h"
#include "hpl1/engine/system/SystemTypes.h"
#include "hpl1/engine/scene/SubMeshEntity.h"
#include "common/array.h"
#include "hpl1/engine/scene/AnimationState.h"
#include "common/stablemap.h"
namespace hpl {
class cMaterialManager;
class cMeshManager;
class cAnimationManager;
class cMesh;
class cSubMesh;
class cMeshEntity;
class cAnimation;
class cAnimationState;
class cNodeState;
class cBone;
class cNode3D;
class iCollideShape;
class iPhysicsBody;
class iPhysicsWorld;
class cWorld3D;
//-----------------------------------------------------------------------
class cMeshEntityRootNodeUpdate : public iEntityCallback {
public:
void OnTransformUpdate(iEntity3D *apEntity);
};
//------------------------------------------
class cMeshEntityCallback {
public:
virtual ~cMeshEntityCallback() = default;
virtual void AfterAnimationUpdate(cMeshEntity *apMeshEntity, float afTimeStep) = 0;
};
//------------------------------------------
kSaveData_ChildClass(iRenderable, cMeshEntity) {
kSaveData_ClassInit(cMeshEntity) public : tString msMeshName;
bool mbCastShadows;
int mlBodyId;
cContainerVec<cSaveData_cSubMeshEntity> mvSubEntities;
cContainerVec<cSaveData_cAnimationState> mvAnimStates;
virtual iSaveObject *CreateSaveObject(cSaveObjectHandler * apSaveObjectHandler, cGame * apGame);
virtual int GetSaveCreatePrio();
};
//------------------------------------------
class cMeshEntity : public iRenderable {
typedef iRenderable super;
friend class cSubMeshEntity;
friend class cMeshEntityRootNodeUpdate;
friend class cMesh;
public:
cMeshEntity(const tString asName, cMesh *apMesh, cMaterialManager *apMaterialManager,
cMeshManager *apMeshManager, cAnimationManager *apAnimationManager);
~cMeshEntity();
void SetWorld(cWorld3D *apWorld) { mpWorld = apWorld; }
cWorld3D *GetWorld() { return mpWorld; }
void SetCastsShadows(bool abX);
cNode3D *GetRootNode() { return mpRootNode; }
void SetCallback(cMeshEntityCallback *apCallback) { mpCallback = apCallback; }
// Sub mesh entities
cSubMeshEntity *GetSubMeshEntity(unsigned int alIdx);
cSubMeshEntity *GetSubMeshEntityName(const tString &asName);
int GetSubMeshEntityNum();
// Animation states
cAnimationState *AddAnimation(cAnimation *apAnimation, const tString &asName, float afBaseSpeed);
void ClearAnimations();
cAnimationState *GetAnimationState(int alIndex);
int GetAnimationStateIndex(const tString &asName);
cAnimationState *GetAnimationStateFromName(const tString &asName);
int GetAnimationStateNum();
// Animation controller
void Play(int alIndex, bool abLoop, bool bStopPrev);
void PlayName(const tString &asName, bool abLoop, bool bStopPrev);
void Stop();
// Bone states
cBoneState *GetBoneState(int alIndex);
int GetBoneStateIndex(const tString &asName);
cBoneState *GetBoneStateFromName(const tString &asName);
int GetBoneStateNum();
void SetSkeletonPhysicsActive(bool abX);
bool GetSkeletonPhysicsActive();
void SetSkeletonPhysicsCanSleep(bool abX) { mbSkeletonPhysicsCanSleep = abX; }
bool GetSkeletonPhysicsCanSleep() { return mbSkeletonPhysicsCanSleep; }
float GetSkeletonPhysicsWeight();
void SetSkeletonPhysicsWeight(float afX);
void FadeSkeletonPhysicsWeight(float afTime);
void SetSkeletonCollidersActive(bool abX);
bool GetSkeletonCollidersActive();
void AlignBodiesToSkeleton(bool abCalculateSpeed);
cMesh *GetMesh() { return mpMesh; }
/**
* Calculates the transform (and angles and position if wanted) of a mesh based on the position of the root bone.
* This is useful when going from rag doll to mesh.
* \param *apPostion Can be NULL, the position
* \param *apAngles Can be NULL, the angles.
*/
cMatrixf CalculateTransformFromSkeleton(cVector3f *apPostion, cVector3f *apAngles);
/**
* Checks collision with the skeletons collider boides
* \param *apWorld Physics world
* \param *apShape The shape
* \param &a_mtxShape The shapes matrix
* \param *apPosList A list of positions that all contact points are stored in. can be NULL.
* \param *apNumList A list of ints of number of the bone state body hit. can be NULL.
*/
bool CheckColliderShapeCollision(iPhysicsWorld *apWorld,
iCollideShape *apShape, const cMatrixf &a_mtxShape,
tVector3fList *apPosList, tIntList *apNumList);
void ResetGraphicsUpdated();
// Node states
cNode3D *GetNodeState(int alIndex);
int GetNodeStateIndex(const tString &asName);
cNode3D *GetNodeStateFromName(const tString &asName);
int GetNodeStateNum();
bool HasNodes() { return mbHasNodes; }
bool AttachEntityToParent(iEntity3D *apEntity, const tString &asParent);
// Entity implementation
tString GetEntityType() { return "Mesh"; }
bool IsVisible() { return IsRendered(); }
void SetVisible(bool abVisible) { SetRendered(abVisible); }
void UpdateLogic(float afTimeStep);
// Renderable implementation.
void UpdateGraphics(cCamera3D *apCamera, float afFrameTime, cRenderList *apRenderList);
void SetRendered(bool abX);
iMaterial *GetMaterial();
iVertexBuffer *GetVertexBuffer();
bool IsShadowCaster();
cBoundingVolume *GetBoundingVolume();
cMatrixf *GetModelMatrix(cCamera3D *apCamera);
int GetMatrixUpdateCount();
eRenderableType GetRenderType();
void SetBody(iPhysicsBody *apBody) { mpBody = apBody; }
iPhysicsBody *GetBody() { return mpBody; }
// SaveObject implementation
virtual iSaveData *CreateSaveData();
virtual void SaveToSaveData(iSaveData *apSaveData);
virtual void LoadFromSaveData(iSaveData *apSaveData);
virtual void SaveDataSetup(cSaveObjectHandler *apSaveObjectHandler, cGame *apGame);
private:
void UpdateNodeMatrixRec(const cMatrixf &a_mtxParentWorld, cNode3D *apNode);
void HandleAnimationEvent(cAnimationEvent *apEvent);
void SetBoneMatrixFromBodyRec(const cMatrixf &a_mtxParentWorld, cBoneState *apBoneState);
void UpdateBVFromSubs();
void BuildBoneStatesRec(cBone *apBone, cNode3D *apParent);
cMaterialManager *mpMaterialManager;
cMeshManager *mpMeshManager;
cAnimationManager *mpAnimationManager;
cWorld3D *mpWorld;
tSubMeshEntityVec mvSubMeshes;
tSubMeshEntityMap m_mapSubMeshes;
tAnimationStateVec mvAnimationStates;
tAnimationStateIndexMap m_mapAnimationStateIndices;
tNodeStateVec mvBoneStates;
tNodeStateIndexMap m_mapBoneStateIndices;
tNodeStateVec mvTempBoneStates;
Common::Array<cMatrixf> mvBoneMatrices;
bool mbSkeletonPhysics;
bool mbSkeletonPhysicsFading;
float mfSkeletonPhysicsFadeSpeed;
float mfSkeletonPhysicsWeight;
bool mbSkeletonPhysicsSleeping;
bool mbSkeletonPhysicsCanSleep;
bool mbSkeletonColliders;
bool mbUpdatedBones;
bool mbHasNodes;
tNodeStateVec mvNodeStates;
tNodeStateIndexMap m_mapNodeStateIndices;
int mlStartSleepCount;
int mlUpdateCount;
float mfTimeStepAccum;
cMesh *mpMesh;
cNode3D *mpRootNode;
cMeshEntityRootNodeUpdate *mpRootCallback;
cMeshEntityCallback *mpCallback;
tEntity3DList mlstAttachedEntities;
cMatrixf mtxTemp;
iPhysicsBody *mpBody;
// Properies:
bool mbCastShadows;
};
//-----------------------------------------------------------------------
} // namespace hpl
#endif // HPL_MESH_ENTITY_H
|