File: MeshEntity.h

package info (click to toggle)
scummvm 2.9.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 450,268 kB
  • sloc: cpp: 4,297,604; asm: 28,322; python: 12,901; sh: 11,219; java: 8,477; xml: 7,843; perl: 2,633; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (287 lines) | stat: -rw-r--r-- 8,340 bytes parent folder | download | duplicates (2)
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