Polyphase Game Engine
Loading...
Searching...
No Matches
Utilities.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <string>
5
6#include <Bullet/btBulletDynamicsCommon.h>
7
8#include "Property.h"
9#include "EngineTypes.h"
10#include "Maths.h"
11
12class Node;
13struct SubSceneOverride;
14
15#define OCT_ARRAY_SIZE(array) (int(sizeof(array) / sizeof(array[0])))
16
17#define OCT_UNUSED(var) (void)var
18
19#define FORCE_LINK_DEF(x) int gForceLink_##x = 0;
20#define FORCE_LINK_CALL(x) { extern int gForceLink_##x; gForceLink_##x = 1; }
21
23bool IsPlatformConsole(Platform platform);
24
25std::string StringToLower(const std::string& str);
26std::string StringToUpper(const std::string& str);
27
28std::string GetCurrentDirectoryPath();
29void SetWorkingDirectory(const std::string& dirPath);
30bool DoesDirExist(const char* dirPath);
31void CreateDir(const char* dirPath);
32void RemoveDir(const char* dirPath);
33std::string GetDirShortName(const std::string& dirName);
34void CreateSymLink(const std::string& original, const std::string& link);
35
36btCollisionShape* CloneCollisionShape(const btCollisionShape* srcShape);
37void DestroyCollisionShape(btCollisionShape* shape);
38void DebugDrawCollisionShape(btCollisionShape* collisionShape, Node3D* node, const glm::mat4& parentTransform, std::vector<DebugDraw>* inoutDraws = nullptr);
39
40uint32_t OctHashString(const char* key);
41void GatherAllNodeNames(std::vector<std::string>& outNames);
42
43Property* FindProperty(std::vector<Property>& props, const std::string& name);
44void CopyPropertyValues(std::vector<Property>& dstProps, const std::vector<Property>& srcProps);
45
46uint32_t GetStringSerializationSize(const std::string& str);
47
48const char* GetPlatformString(Platform platform);
49
50uint8_t ConvertKeyCodeToChar(uint8_t keyCode, bool shiftDown);
51
52glm::mat4 MakeTransform(glm::vec3 translation, glm::vec3 rotation, glm::vec3 scale);
53btTransform MakeBulletTransform(glm::vec3 translation, glm::vec3 rotationDegrees);
54
55void GatherNonDefaultProperties(Node* node, std::vector<Property>& props, NodePtr refNode = nullptr);
56// defaultSceneRoot: a freshly instantiated copy of sceneRoot's linked Scene to
57// compare against. Pass one instance for the whole sub-tree (see Scene::AddNodeDef);
58// when null the function instantiates the scene itself, once, for this call and
59// its recursion.
60void GatherSubSceneOverrides(Node* node, Node* sceneRoot, std::vector<SubSceneOverride>& overs,
61 Node* defaultSceneRoot = nullptr);
62void ApplySubSceneOverride(Node* sceneRoot, const SubSceneOverride& over);
63
64void RemoveSpacesFromString(std::string& str);
65
66void AddDebugDraw(const DebugDraw& draw);
67void AddDebugDraw(
68 StaticMesh* mesh,
69 glm::vec3 position,
70 glm::quat rotation,
71 glm::vec3 scale,
72 glm::vec4 color = { 0.25f, 0.25f, 1.0f, 1.0f },
73 float life = 0.0f,
74 Material* material = nullptr);
75void AddDebugDraw(
76 StaticMesh* mesh,
77 glm::vec3 position,
78 glm::vec3 rotation,
79 glm::vec3 scale,
80 glm::vec4 color = { 0.25f, 0.25f, 1.0f, 1.0f },
81 float life = 0.0f,
82 Material* material = nullptr);
83
84#if LUA_ENABLED
85void CreateTableLua(lua_State* L, const Datum& datum);
86void CreateTableCpp(lua_State* L, int tableIdx, Datum& datum);
87void LuaPushDatum(lua_State* L, const Datum& arg);
88Datum LuaObjectToDatum(lua_State* L, int idx);
89void LuaObjectToDatum(lua_State* L, int idx, Datum& datum);
90#endif
91
92glm::vec3 EnforceEulerRange(const glm::vec3& eulerAngles);
93
94inline glm::vec3 BulletToGlm(const btVector3& vector3)
95{
96 return glm::vec3(vector3.x(), vector3.y(), vector3.z());
97}
98
99inline glm::quat BulletToGlm(const btQuaternion& quat)
100{
101 return glm::quat(quat.w(), quat.x(), quat.y(), quat.z());
102}
103
104inline btVector3 GlmToBullet(const glm::vec3& vector3)
105{
106 return btVector3(vector3.x, vector3.y, vector3.z);
107}
108
109inline btQuaternion GlmToBullet(const glm::quat& quat)
110{
111 return btQuaternion(quat.x, quat.y, quat.z, quat.w);
112}
113
114inline uint32_t ColorFloat4ToUint32(glm::vec4 color)
115{
116 uint8_t colors[4] =
117 {
118 uint8_t(glm::clamp(color.r * 255.0f, 0.0f, 255.0f)),
119 uint8_t(glm::clamp(color.g * 255.0f, 0.0f, 255.0f)),
120 uint8_t(glm::clamp(color.b * 255.0f, 0.0f, 255.0f)),
121 uint8_t(glm::clamp(color.a * 255.0f, 0.0f, 255.0f))
122 };
123
124 uint32_t color32 =
125 (colors[0]) |
126 (colors[1] << 8) |
127 (colors[2] << 16) |
128 (colors[3] << 24);
129
130 return color32;
131}
132
133inline glm::vec4 ColorUint32ToFloat4(uint32_t color)
134{
135 float r = float(color & 0x000000ff) / 255.0f;
136 float g = float((color & 0x0000ff00) >> 8) / 255.0f;
137 float b = float((color & 0x00ff0000) >> 16) / 255.0f;
138 float a = float((color & 0xff000000) >> 24) / 255.0f;
139
140 return glm::vec4(r, g, b, a);
141}
142
143inline void ReverseColorUint32(uint32_t& color)
144{
145 uint8_t* charArray = reinterpret_cast<uint8_t*>(&color);
146 uint8_t c0 = charArray[0];
147 uint8_t c1 = charArray[1];
148 uint8_t c2 = charArray[2];
149 uint8_t c3 = charArray[3];
150
151 charArray[0] = c3;
152 charArray[1] = c2;
153 charArray[2] = c1;
154 charArray[3] = c0;
155}
156
157template<typename T>
158Bounds ComputeBounds(const std::vector<T>& vertices)
159{
160 Bounds retBounds;
161
162 if (vertices.size() > 0)
163 {
164 glm::vec3 boxMin = { FLT_MAX, FLT_MAX, FLT_MAX };
165 glm::vec3 boxMax = { -FLT_MAX, -FLT_MAX, -FLT_MAX };
166
167 for (uint32_t i = 0; i < vertices.size(); ++i)
168 {
169 glm::vec3 pos = vertices[i].mPosition;
170
171 boxMin = glm::min(boxMin, pos);
172 boxMax = glm::max(boxMax, pos);
173 }
174
175 retBounds.mCenter = (boxMin + boxMax) / 2.0f;
176
177 float maxDist = 0.0f;
178
179 for (uint32_t i = 0; i < vertices.size(); ++i)
180 {
181 glm::vec3 pos = vertices[i].mPosition;
182
183 float dist = glm::distance(pos, retBounds.mCenter);
184 maxDist = glm::max(maxDist, dist);
185 }
186
187 retBounds.mRadius = maxDist;
188 }
189
190 return retBounds;
191}
192
193template<typename T>
194void ShuffleVector(std::vector<T>& vect)
195{
196 uint32_t vectSize = (uint32_t)vect.size();
197
198 if (vectSize > 1)
199 {
200 for (uint32_t i = 0; i < vectSize; ++i)
201 {
202 uint32_t p = Maths::RandRange<uint32_t>(0u, vectSize - 1);
203 T temp = vect[p];
204 vect[p] = vect[i];
205 vect[i] = temp;
206 }
207 }
208}
209
210inline bool EndsWith(const std::string& str, const std::string& suffix)
211{
212 if (suffix.size() > str.size()) return false;
213 return std::equal(suffix.rbegin(), suffix.rend(), str.rbegin());
214}
Platform
Definition EngineTypes.h:32
void GatherNonDefaultProperties(Node *node, std::vector< Property > &props, NodePtr refNode=nullptr)
Definition Utilities.cpp:572
void RemoveDir(const char *dirPath)
Definition Utilities.cpp:116
const char * GetPlatformString(Platform platform)
Definition Utilities.cpp:480
void AddDebugDraw(const DebugDraw &draw)
Definition Utilities.cpp:924
void SetWorkingDirectory(const std::string &dirPath)
Definition Utilities.cpp:91
void DestroyCollisionShape(btCollisionShape *shape)
Definition Utilities.cpp:238
void CopyPropertyValues(std::vector< Property > &dstProps, const std::vector< Property > &srcProps)
Definition Utilities.cpp:431
uint8_t ConvertKeyCodeToChar(uint8_t keyCode, bool shiftDown)
Definition Utilities.cpp:500
std::string StringToUpper(const std::string &str)
Definition Utilities.cpp:75
void CreateSymLink(const std::string &original, const std::string &link)
Definition Utilities.cpp:136
void RemoveSpacesFromString(std::string &str)
Definition Utilities.cpp:913
btTransform MakeBulletTransform(glm::vec3 translation, glm::vec3 rotationDegrees)
Definition Utilities.cpp:558
uint32_t GetStringSerializationSize(const std::string &str)
Definition Utilities.cpp:475
Datum LuaObjectToDatum(lua_State *L, int idx)
Definition Utilities.cpp:1139
bool IsPlatformConsole(Platform platform)
Definition Utilities.cpp:57
glm::mat4 MakeTransform(glm::vec3 translation, glm::vec3 rotation, glm::vec3 scale)
Definition Utilities.cpp:545
std::string GetDirShortName(const std::string &dirName)
Definition Utilities.cpp:121
uint32_t OctHashString(const char *key)
Definition Utilities.cpp:381
std::string GetCurrentDirectoryPath()
Definition Utilities.cpp:86
void ApplySubSceneOverride(Node *sceneRoot, const SubSceneOverride &over)
Definition Utilities.cpp:818
void GatherSubSceneOverrides(Node *node, Node *sceneRoot, std::vector< SubSceneOverride > &overs, Node *defaultSceneRoot=nullptr)
Definition Utilities.cpp:699
uint32_t ColorFloat4ToUint32(glm::vec4 color)
Definition Utilities.h:114
void CreateTableLua(lua_State *L, const Datum &datum)
Definition Utilities.cpp:972
btVector3 GlmToBullet(const glm::vec3 &vector3)
Definition Utilities.h:104
bool DoesDirExist(const char *dirPath)
Definition Utilities.cpp:96
Bounds ComputeBounds(const std::vector< T > &vertices)
Definition Utilities.h:158
void ShuffleVector(std::vector< T > &vect)
Definition Utilities.h:194
void GatherAllNodeNames(std::vector< std::string > &outNames)
Definition Utilities.cpp:404
std::string StringToLower(const std::string &str)
Definition Utilities.cpp:64
btCollisionShape * CloneCollisionShape(const btCollisionShape *srcShape)
Definition Utilities.cpp:147
glm::vec4 ColorUint32ToFloat4(uint32_t color)
Definition Utilities.h:133
void CreateTableCpp(lua_State *L, int tableIdx, Datum &datum)
Definition Utilities.cpp:1009
void ReverseColorUint32(uint32_t &color)
Definition Utilities.h:143
Platform GetPlatform()
Definition Utilities.cpp:36
void LuaPushDatum(lua_State *L, const Datum &arg)
Definition Utilities.cpp:1061
void DebugDrawCollisionShape(btCollisionShape *collisionShape, Node3D *node, const glm::mat4 &parentTransform, std::vector< DebugDraw > *inoutDraws=nullptr)
Definition Utilities.cpp:259
Property * FindProperty(std::vector< Property > &props, const std::string &name)
Definition Utilities.cpp:415
glm::vec3 BulletToGlm(const btVector3 &vector3)
Definition Utilities.h:94
void CreateDir(const char *dirPath)
Definition Utilities.cpp:111
glm::vec3 EnforceEulerRange(const glm::vec3 &eulerAngles)
Definition Utilities.cpp:1208
bool EndsWith(const std::string &str, const std::string &suffix)
Definition Utilities.h:210
Definition Datum.h:169
Definition Material.h:48
Definition Node3d.h:14
Definition Node.h:67
Definition Property.h:14
Definition StaticMesh.h:18
Definition EngineTypes.h:204
glm::vec3 mCenter
Definition EngineTypes.h:205
float mRadius
Definition EngineTypes.h:206
Definition EngineTypes.h:365
Definition Scene.h:14