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);
56void GatherSubSceneOverrides(Node* node, Node* sceneRoot, std::vector<SubSceneOverride>& overs);
57void ApplySubSceneOverride(Node* sceneRoot, const SubSceneOverride& over);
58
59void RemoveSpacesFromString(std::string& str);
60
61void AddDebugDraw(const DebugDraw& draw);
62void AddDebugDraw(
63 StaticMesh* mesh,
64 glm::vec3 position,
65 glm::quat rotation,
66 glm::vec3 scale,
67 glm::vec4 color = { 0.25f, 0.25f, 1.0f, 1.0f },
68 float life = 0.0f,
69 Material* material = nullptr);
70void AddDebugDraw(
71 StaticMesh* mesh,
72 glm::vec3 position,
73 glm::vec3 rotation,
74 glm::vec3 scale,
75 glm::vec4 color = { 0.25f, 0.25f, 1.0f, 1.0f },
76 float life = 0.0f,
77 Material* material = nullptr);
78
79#if LUA_ENABLED
80void CreateTableLua(lua_State* L, const Datum& datum);
81void CreateTableCpp(lua_State* L, int tableIdx, Datum& datum);
82void LuaPushDatum(lua_State* L, const Datum& arg);
83Datum LuaObjectToDatum(lua_State* L, int idx);
84void LuaObjectToDatum(lua_State* L, int idx, Datum& datum);
85#endif
86
87glm::vec3 EnforceEulerRange(const glm::vec3& eulerAngles);
88
89inline glm::vec3 BulletToGlm(const btVector3& vector3)
90{
91 return glm::vec3(vector3.x(), vector3.y(), vector3.z());
92}
93
94inline glm::quat BulletToGlm(const btQuaternion& quat)
95{
96 return glm::quat(quat.w(), quat.x(), quat.y(), quat.z());
97}
98
99inline btVector3 GlmToBullet(const glm::vec3& vector3)
100{
101 return btVector3(vector3.x, vector3.y, vector3.z);
102}
103
104inline btQuaternion GlmToBullet(const glm::quat& quat)
105{
106 return btQuaternion(quat.x, quat.y, quat.z, quat.w);
107}
108
109inline uint32_t ColorFloat4ToUint32(glm::vec4 color)
110{
111 uint8_t colors[4] =
112 {
113 uint8_t(glm::clamp(color.r * 255.0f, 0.0f, 255.0f)),
114 uint8_t(glm::clamp(color.g * 255.0f, 0.0f, 255.0f)),
115 uint8_t(glm::clamp(color.b * 255.0f, 0.0f, 255.0f)),
116 uint8_t(glm::clamp(color.a * 255.0f, 0.0f, 255.0f))
117 };
118
119 uint32_t color32 =
120 (colors[0]) |
121 (colors[1] << 8) |
122 (colors[2] << 16) |
123 (colors[3] << 24);
124
125 return color32;
126}
127
128inline glm::vec4 ColorUint32ToFloat4(uint32_t color)
129{
130 float r = float(color & 0x000000ff) / 255.0f;
131 float g = float((color & 0x0000ff00) >> 8) / 255.0f;
132 float b = float((color & 0x00ff0000) >> 16) / 255.0f;
133 float a = float((color & 0xff000000) >> 24) / 255.0f;
134
135 return glm::vec4(r, g, b, a);
136}
137
138inline void ReverseColorUint32(uint32_t& color)
139{
140 uint8_t* charArray = reinterpret_cast<uint8_t*>(&color);
141 uint8_t c0 = charArray[0];
142 uint8_t c1 = charArray[1];
143 uint8_t c2 = charArray[2];
144 uint8_t c3 = charArray[3];
145
146 charArray[0] = c3;
147 charArray[1] = c2;
148 charArray[2] = c1;
149 charArray[3] = c0;
150}
151
152template<typename T>
153Bounds ComputeBounds(const std::vector<T>& vertices)
154{
155 Bounds retBounds;
156
157 if (vertices.size() > 0)
158 {
159 glm::vec3 boxMin = { FLT_MAX, FLT_MAX, FLT_MAX };
160 glm::vec3 boxMax = { -FLT_MAX, -FLT_MAX, -FLT_MAX };
161
162 for (uint32_t i = 0; i < vertices.size(); ++i)
163 {
164 glm::vec3 pos = vertices[i].mPosition;
165
166 boxMin = glm::min(boxMin, pos);
167 boxMax = glm::max(boxMax, pos);
168 }
169
170 retBounds.mCenter = (boxMin + boxMax) / 2.0f;
171
172 float maxDist = 0.0f;
173
174 for (uint32_t i = 0; i < vertices.size(); ++i)
175 {
176 glm::vec3 pos = vertices[i].mPosition;
177
178 float dist = glm::distance(pos, retBounds.mCenter);
179 maxDist = glm::max(maxDist, dist);
180 }
181
182 retBounds.mRadius = maxDist;
183 }
184
185 return retBounds;
186}
187
188template<typename T>
189void ShuffleVector(std::vector<T>& vect)
190{
191 uint32_t vectSize = (uint32_t)vect.size();
192
193 if (vectSize > 1)
194 {
195 for (uint32_t i = 0; i < vectSize; ++i)
196 {
197 uint32_t p = Maths::RandRange<uint32_t>(0u, vectSize - 1);
198 T temp = vect[p];
199 vect[p] = vect[i];
200 vect[i] = temp;
201 }
202 }
203}
204
205inline bool EndsWith(const std::string& str, const std::string& suffix)
206{
207 if (suffix.size() > str.size()) return false;
208 return std::equal(suffix.rbegin(), suffix.rend(), str.rbegin());
209}
Platform
Definition EngineTypes.h:31
void GatherNonDefaultProperties(Node *node, std::vector< Property > &props, NodePtr refNode=nullptr)
Definition Utilities.cpp:563
void RemoveDir(const char *dirPath)
Definition Utilities.cpp:112
const char * GetPlatformString(Platform platform)
Definition Utilities.cpp:473
void AddDebugDraw(const DebugDraw &draw)
Definition Utilities.cpp:856
void SetWorkingDirectory(const std::string &dirPath)
Definition Utilities.cpp:87
void DestroyCollisionShape(btCollisionShape *shape)
Definition Utilities.cpp:234
void CopyPropertyValues(std::vector< Property > &dstProps, const std::vector< Property > &srcProps)
Definition Utilities.cpp:427
uint8_t ConvertKeyCodeToChar(uint8_t keyCode, bool shiftDown)
Definition Utilities.cpp:491
std::string StringToUpper(const std::string &str)
Definition Utilities.cpp:71
void CreateSymLink(const std::string &original, const std::string &link)
Definition Utilities.cpp:132
void RemoveSpacesFromString(std::string &str)
Definition Utilities.cpp:845
btTransform MakeBulletTransform(glm::vec3 translation, glm::vec3 rotationDegrees)
Definition Utilities.cpp:549
uint32_t GetStringSerializationSize(const std::string &str)
Definition Utilities.cpp:468
Datum LuaObjectToDatum(lua_State *L, int idx)
Definition Utilities.cpp:1071
bool IsPlatformConsole(Platform platform)
Definition Utilities.cpp:53
glm::mat4 MakeTransform(glm::vec3 translation, glm::vec3 rotation, glm::vec3 scale)
Definition Utilities.cpp:536
std::string GetDirShortName(const std::string &dirName)
Definition Utilities.cpp:117
uint32_t OctHashString(const char *key)
Definition Utilities.cpp:377
std::string GetCurrentDirectoryPath()
Definition Utilities.cpp:82
void ApplySubSceneOverride(Node *sceneRoot, const SubSceneOverride &over)
Definition Utilities.cpp:756
uint32_t ColorFloat4ToUint32(glm::vec4 color)
Definition Utilities.h:109
void CreateTableLua(lua_State *L, const Datum &datum)
Definition Utilities.cpp:904
btVector3 GlmToBullet(const glm::vec3 &vector3)
Definition Utilities.h:99
bool DoesDirExist(const char *dirPath)
Definition Utilities.cpp:92
void GatherSubSceneOverrides(Node *node, Node *sceneRoot, std::vector< SubSceneOverride > &overs)
Definition Utilities.cpp:668
Bounds ComputeBounds(const std::vector< T > &vertices)
Definition Utilities.h:153
void ShuffleVector(std::vector< T > &vect)
Definition Utilities.h:189
void GatherAllNodeNames(std::vector< std::string > &outNames)
Definition Utilities.cpp:400
std::string StringToLower(const std::string &str)
Definition Utilities.cpp:60
btCollisionShape * CloneCollisionShape(const btCollisionShape *srcShape)
Definition Utilities.cpp:143
glm::vec4 ColorUint32ToFloat4(uint32_t color)
Definition Utilities.h:128
void CreateTableCpp(lua_State *L, int tableIdx, Datum &datum)
Definition Utilities.cpp:941
void ReverseColorUint32(uint32_t &color)
Definition Utilities.h:138
Platform GetPlatform()
Definition Utilities.cpp:34
void LuaPushDatum(lua_State *L, const Datum &arg)
Definition Utilities.cpp:993
void DebugDrawCollisionShape(btCollisionShape *collisionShape, Node3D *node, const glm::mat4 &parentTransform, std::vector< DebugDraw > *inoutDraws=nullptr)
Definition Utilities.cpp:255
Property * FindProperty(std::vector< Property > &props, const std::string &name)
Definition Utilities.cpp:411
glm::vec3 BulletToGlm(const btVector3 &vector3)
Definition Utilities.h:89
void CreateDir(const char *dirPath)
Definition Utilities.cpp:107
glm::vec3 EnforceEulerRange(const glm::vec3 &eulerAngles)
Definition Utilities.cpp:1140
bool EndsWith(const std::string &str, const std::string &suffix)
Definition Utilities.h:205
Definition Datum.h:164
Definition Material.h:48
Definition Node3d.h:14
Definition Node.h:67
Definition Property.h:14
Definition StaticMesh.h:18
Definition EngineTypes.h:193
glm::vec3 mCenter
Definition EngineTypes.h:194
float mRadius
Definition EngineTypes.h:195
Definition EngineTypes.h:224
Definition Scene.h:13