Tiberian Technologies Scripts Reference Revision: 9000
Loading...
Searching...
No Matches
AnimCollisionManagerClass.h
1/* Renegade Scripts.dll
2 Copyright 2013 Tiberian Technologies
3
4 This file is part of the Renegade scripts.dll
5 The Renegade scripts.dll is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version. See the file COPYING for more details.
9 In addition, an exemption is given to allow Run Time Dynamic Linking of this code with any closed source module that does not contain code covered by this licence.
10 Only the source code to the module(s) containing the licenced code has to be released.
11*/
12#ifndef TT_INCLUDE__ANIMCOLLISIONMANAGERCLASS_H
13#define TT_INCLUDE__ANIMCOLLISIONMANAGERCLASS_H
14
15class PushRecordClass;
16class PhysClass;
17class AnimCollisionManagerDefClass;
18class HAnimClass;
19class ChunkSaveClass;
20class ChunkLoadClass;
21#include "RenderObjClass.h"
22#include "Matrix3d.h"
23#include "engine_vector.h"
24#ifdef PARAM_EDITING_ON
25#define ANIMCOLLISIONMANAGERDEF_EDITABLE_PARAMS( class_name, member_name ) \
26 PARAM_SEPARATOR( class_name, "Animation Settings"); \
27 EnumParameterClass *collision_param = new EnumParameterClass(& member_name ## .CollisionMode); \
28 collision_param->Set_Name ("CollisionMode"); \
29 collision_param->Add_Value("NONE",AnimCollisionManagerClass::COLLIDE_NONE); \
30 collision_param->Add_Value("STOP",AnimCollisionManagerClass::COLLIDE_STOP); \
31 collision_param->Add_Value("PUSH",AnimCollisionManagerClass::COLLIDE_PUSH); \
32 collision_param->Add_Value("KILL",AnimCollisionManagerClass::COLLIDE_KILL); \
33 GENERIC_EDITABLE_PARAM( class_name , collision_param); \
34 EnumParameterClass *anim_param = new EnumParameterClass(& member_name ## .AnimationMode); \
35 anim_param->Set_Name ("AnimationMode"); \
36 anim_param->Add_Value("LOOP",AnimCollisionManagerClass::ANIMATE_LOOP); \
37 anim_param->Add_Value("TARGET",AnimCollisionManagerClass::ANIMATE_TARGET); \
38 anim_param->Add_Value("MANUAL",AnimCollisionManagerClass::ANIMATE_MANUAL); \
39 GENERIC_EDITABLE_PARAM( class_name , anim_param); \
40 NAMED_EDITABLE_PARAM( class_name, ParameterClass::TYPE_STRING, member_name ## .AnimationName,"AnimationName");
41#else
42#define ANIMCOLLISIONMANAGERDEF_EDITABLE_PARAMS( class_name, member_name )
43#endif
44class AnimCollisionManagerDefClass
45{
46public:
47 AnimCollisionManagerDefClass(void);
48 ~AnimCollisionManagerDefClass(void);
49 void Validate_Parameters(void);
50 bool Save(ChunkSaveClass &csave);
51 bool Load(ChunkLoadClass &cload);
52public:
53 int CollisionMode;
54 int AnimationMode;
55 StringClass AnimationName;
56};
57
58class RiderManagerClass
59{
60public:
61 RiderManagerClass(void);
62 ~RiderManagerClass(void);
63 void Link_Rider(PhysClass * obj);
64 void Unlink_Rider(PhysClass * obj);
65 bool Contains(PhysClass * obj);
66 void Move_Riders(const Matrix3D & delta,RenderObjClass * carrier_sub_obj = NULL);
67 MultiListClass<PhysClass> * Get_Rider_List(void) { return &RiderList; }
68protected:
69 MultiListClass<PhysClass> RiderList;
70};
71class AnimCollisionManagerClass
72{
73public:
74 AnimCollisionManagerClass(PhysClass & parent);
75 ~AnimCollisionManagerClass(void);
76 void Init(const AnimCollisionManagerDefClass & def);
77 void Update_Cached_Model_Parameters(void);
78 bool Timestep(float dt);
79 enum AnimModeType
80 {
81 ANIMATE_LOOP = 0,
82 ANIMATE_TARGET,
83 ANIMATE_MANUAL,
84 };
85 void Set_Animation_Mode(AnimModeType mode);
86 AnimModeType Get_Animation_Mode(void);
87 void Set_Animation(const char * anim_name);
88 HAnimClass * Peek_Animation(void);
89 void Set_Target_Frame(float frame);
90 void Set_Target_Frame_End(void);
91 float Get_Target_Frame(void);
92 bool Is_At_Target(void);
93 void Set_Current_Frame(float frame);
94 float Get_Current_Frame(void);
95 void Set_Loop_Start(float frame0);
96 void Set_Loop_End(float frame1);
97 float Get_Loop_Start(void);
98 float Get_Loop_End(void);
99 enum CollisionModeType
100 {
101 COLLIDE_NONE = 0,
102 COLLIDE_STOP,
103 COLLIDE_PUSH,
104 COLLIDE_KILL,
105 };
106 void Set_Collision_Mode(CollisionModeType mode);
107 CollisionModeType Get_Collision_Mode(void);
108 bool Link_Rider(PhysClass * rider) { RiderManager.Link_Rider(rider); return true; }
109 bool Unlink_Rider(PhysClass * rider) { RiderManager.Unlink_Rider(rider); return true; }
110 bool Save(ChunkSaveClass &csave);
111 bool Load(ChunkLoadClass &cload);
112protected:
113 class CollideableObjClass
114 {
115 public:
116 CollideableObjClass(void);
117 CollideableObjClass(RenderObjClass * collisionmesh);
118 CollideableObjClass(const CollideableObjClass & that);
119 ~CollideableObjClass(void)
120 {
121 REF_PTR_RELEASE(CollisionMesh);
122 }
123 CollideableObjClass & operator = (const CollideableObjClass & that);
124 bool operator == (const CollideableObjClass & that) const { return false; }
125 bool operator != (const CollideableObjClass & that) const { return true; }
126 void Set_Collision_Object(RenderObjClass * mesh);
127 RenderObjClass * Peek_Collision_Object(void) { return CollisionMesh; }
128 void Cache_Start_Transform(void) { StartTransform = CollisionMesh->Get_Transform(); }
129 void Cache_End_Transform(void) { EndTransform = CollisionMesh->Get_Transform(); }
130 Matrix3D & Get_Start_Transform(void) { return StartTransform; }
131 Matrix3D & Get_End_Transform(void) { return EndTransform; }
132 void Install_Start_Transform(void) { CollisionMesh->Set_Transform(StartTransform); }
133 void Install_End_Transform(void) { CollisionMesh->Set_Transform(EndTransform); }
134 void Intersect_Scene(int colgroup,MultiListClass<PhysClass> * list);
135 int Clear_Collision_Bits(void);
136 void Restore_Collision_Bits(int oldbits);
137 protected:
138 RenderObjClass * CollisionMesh;
139 Matrix3D StartTransform;
140 Matrix3D EndTransform;
141 };
142 bool Is_Collision_Model(RenderObjClass * model);
143 int Recursive_Count_Collision_Models(RenderObjClass * model);
144 void Recursive_Collect_Collision_Models(RenderObjClass * model);
145 void Revert_Animation_State(void);
146 bool Check_Collision(CollideableObjClass & collisionobj);
147 bool Is_Intersecting(void);
148 bool Push_Collided_Object(PhysClass * obj,const Matrix3D & delta_transform);
149 void Internal_Set_Animation(const char * anim_name);
150 PhysClass & Parent;
151 AnimModeType AnimationMode; // current animation mode and parameters.
152 float TargetFrame;
153 float LoopStart;
154 float LoopEnd;
155 HAnimClass * CurAnimation; // current animation state.
156 float CurFrame;
157 HAnimClass * PrevAnimation; // temporary variable used in timestep
158 float PrevFrame; // temporary variable used in timestep
159 RiderManagerClass RiderManager;
160 CollisionModeType CollisionMode;
161 DynamicVectorClass<CollideableObjClass> CollisionMeshes;
162 PushRecordClass * PushList;
163};
164#endif