20#define GLM_ENABLE_EXPERIMENTAL
21#include <glm/gtx/quaternion.hpp>
24#define SDL_MAIN_HANDLED
26#include <SDL3/SDL_main.h>
46#define MAX_BONE_INFLUENCE 4
143#define K_EVENT_QUIT 256
144#define K_EVENT_KEYDOWN 768
145#define K_EVENT_KEYUP 769
146#define K_EVENT_MOUSEMOTION 1024
147#define K_EVENT_MOUSEBUTTONDOWN 1025
148#define K_EVENT_MOUSEBUTTONUP 1026
149#define K_EVENT_MOUSEWHEEL 1027
154#define K_MOUSEBUTTON_LEFT 1
155#define K_MOUSEBUTTON_MIDDLE 2
156#define K_MOUSEBUTTON_RIGHT 3
160#define K_KEY_UNKNOWN 0
161#define K_KEY_BACKSPACE 8
163#define K_KEY_RETURN 13
164#define K_KEY_ESCAPE 27
165#define K_KEY_SPACE 32
166#define K_KEY_EXCLAIM 33
167#define K_KEY_QUOTEDBL 34
169#define K_KEY_DOLLAR 36
170#define K_KEY_PERCENT 37
171#define K_KEY_AMPERSAND 38
172#define K_KEY_QUOTE 39
173#define K_KEY_LEFTPAREN 40
174#define K_KEY_RIGHTPAREN 41
175#define K_KEY_ASTERISK 42
177#define K_KEY_COMMA 44
178#define K_KEY_MINUS 45
179#define K_KEY_PERIOD 46
180#define K_KEY_SLASH 47
219#define K_KEY_F1 1073741882
220#define K_KEY_F2 1073741883
221#define K_KEY_F3 1073741884
222#define K_KEY_F4 1073741885
223#define K_KEY_F5 1073741886
224#define K_KEY_F6 1073741887
225#define K_KEY_F7 1073741888
226#define K_KEY_F8 1073741889
227#define K_KEY_F9 1073741890
228#define K_KEY_F10 1073741891
229#define K_KEY_F11 1073741892
230#define K_KEY_F12 1073741893
233#define K_KEY_CAPSLOCK 1073741881
234#define K_KEY_LSHIFT 1073742049
235#define K_KEY_RSHIFT 1073742053
236#define K_KEY_LCTRL 1073742048
237#define K_KEY_RCTRL 1073742052
238#define K_KEY_LALT 1073742050
239#define K_KEY_RALT 1073742054
240#define K_KEY_LGUI 1073742051
241#define K_KEY_RGUI 1073742055
244#define K_KEY_INSERT 1073741897
245#define K_KEY_DELETE 127
246#define K_KEY_HOME 1073741898
247#define K_KEY_END 1073741901
248#define K_KEY_PAGEUP 1073741899
249#define K_KEY_PAGEDOWN 1073741902
252#define K_KEY_RIGHT 1073741903
253#define K_KEY_LEFT 1073741904
254#define K_KEY_DOWN 1073741905
255#define K_KEY_UP 1073741906
258#define K_KEY_NUMLOCKCLEAR 1073741907
259#define K_KEY_KP_DIVIDE 1073741908
260#define K_KEY_KP_MULTIPLY 1073741909
261#define K_KEY_KP_MINUS 1073741910
262#define K_KEY_KP_PLUS 1073741911
263#define K_KEY_KP_ENTER 1073741912
264#define K_KEY_KP_1 1073741913
265#define K_KEY_KP_2 1073741914
266#define K_KEY_KP_3 1073741915
267#define K_KEY_KP_4 1073741916
268#define K_KEY_KP_5 1073741917
269#define K_KEY_KP_6 1073741918
270#define K_KEY_KP_7 1073741919
271#define K_KEY_KP_8 1073741920
272#define K_KEY_KP_9 1073741921
273#define K_KEY_KP_0 1073741922
274#define K_KEY_KP_PERIOD 1073741923
277#define K_KEY_PRINTSCREEN 1073741894
278#define K_KEY_SCROLLLOCK 1073741895
279#define K_KEY_PAUSE 1073741896
282#define K_SCANCODE_UNKNOWN 0
283#define K_SCANCODE_A 4
284#define K_SCANCODE_B 5
285#define K_SCANCODE_C 6
286#define K_SCANCODE_D 7
287#define K_SCANCODE_E 8
288#define K_SCANCODE_F 9
289#define K_SCANCODE_G 10
290#define K_SCANCODE_H 11
291#define K_SCANCODE_I 12
292#define K_SCANCODE_J 13
293#define K_SCANCODE_K 14
294#define K_SCANCODE_L 15
295#define K_SCANCODE_M 16
296#define K_SCANCODE_N 17
297#define K_SCANCODE_O 18
298#define K_SCANCODE_P 19
299#define K_SCANCODE_Q 20
300#define K_SCANCODE_R 21
301#define K_SCANCODE_S 22
302#define K_SCANCODE_T 23
303#define K_SCANCODE_U 24
304#define K_SCANCODE_V 25
305#define K_SCANCODE_W 26
306#define K_SCANCODE_X 27
307#define K_SCANCODE_Y 28
308#define K_SCANCODE_Z 29
309#define K_SCANCODE_1 30
310#define K_SCANCODE_2 31
311#define K_SCANCODE_3 32
312#define K_SCANCODE_4 33
313#define K_SCANCODE_5 34
314#define K_SCANCODE_6 35
315#define K_SCANCODE_7 36
316#define K_SCANCODE_8 37
317#define K_SCANCODE_9 38
318#define K_SCANCODE_0 39
319#define K_SCANCODE_RETURN 40
320#define K_SCANCODE_ESCAPE 41
321#define K_SCANCODE_BACKSPACE 42
322#define K_SCANCODE_TAB 43
323#define K_SCANCODE_SPACE 44
324#define K_SCANCODE_MINUS 45
325#define K_SCANCODE_EQUALS 46
326#define K_SCANCODE_LEFTBRACKET 47
327#define K_SCANCODE_RIGHTBRACKET 48
328#define K_SCANCODE_BACKSLASH 49
329#define K_SCANCODE_NONUSHASH 50
330#define K_SCANCODE_SEMICOLON 51
331#define K_SCANCODE_APOSTROPHE 52
332#define K_SCANCODE_GRAVE 53
333#define K_SCANCODE_COMMA 54
334#define K_SCANCODE_PERIOD 55
335#define K_SCANCODE_SLASH 56
336#define K_SCANCODE_CAPSLOCK 57
337#define K_SCANCODE_F1 58
338#define K_SCANCODE_F2 59
339#define K_SCANCODE_F3 60
340#define K_SCANCODE_F4 61
341#define K_SCANCODE_F5 62
342#define K_SCANCODE_F6 63
343#define K_SCANCODE_F7 64
344#define K_SCANCODE_F8 65
345#define K_SCANCODE_F9 66
346#define K_SCANCODE_F10 67
347#define K_SCANCODE_F11 68
348#define K_SCANCODE_F12 69
349#define K_SCANCODE_PRINTSCREEN 70
350#define K_SCANCODE_SCROLLLOCK 71
351#define K_SCANCODE_PAUSE 72
352#define K_SCANCODE_INSERT 73
353#define K_SCANCODE_HOME 74
354#define K_SCANCODE_PAGEUP 75
355#define K_SCANCODE_DELETE 76
356#define K_SCANCODE_END 77
357#define K_SCANCODE_PAGEDOWN 78
358#define K_SCANCODE_RIGHT 79
359#define K_SCANCODE_LEFT 80
360#define K_SCANCODE_DOWN 81
361#define K_SCANCODE_UP 82
362#define K_SCANCODE_NUMLOCKCLEAR 83
363#define K_SCANCODE_KP_DIVIDE 84
364#define K_SCANCODE_KP_MULTIPLY 85
365#define K_SCANCODE_KP_MINUS 86
366#define K_SCANCODE_KP_PLUS 87
367#define K_SCANCODE_KP_ENTER 88
368#define K_SCANCODE_KP_1 89
369#define K_SCANCODE_KP_2 90
370#define K_SCANCODE_KP_3 91
371#define K_SCANCODE_KP_4 92
372#define K_SCANCODE_KP_5 93
373#define K_SCANCODE_KP_6 94
374#define K_SCANCODE_KP_7 95
375#define K_SCANCODE_KP_8 96
376#define K_SCANCODE_KP_9 97
377#define K_SCANCODE_KP_0 98
378#define K_SCANCODE_KP_PERIOD 99
379#define K_SCANCODE_NONUSBACKSLASH 100
380#define K_SCANCODE_APPLICATION 101
381#define K_SCANCODE_KP_EQUALS 103
382#define K_SCANCODE_F13 104
383#define K_SCANCODE_F14 105
384#define K_SCANCODE_F15 106
385#define K_SCANCODE_F16 107
386#define K_SCANCODE_F17 108
387#define K_SCANCODE_F18 109
388#define K_SCANCODE_F19 110
389#define K_SCANCODE_F20 111
390#define K_SCANCODE_F21 112
391#define K_SCANCODE_F22 113
392#define K_SCANCODE_F23 114
393#define K_SCANCODE_F24 115
394#define K_SCANCODE_EXECUTE 116
395#define K_SCANCODE_HELP 117
396#define K_SCANCODE_MENU 118
397#define K_SCANCODE_SELECT 119
398#define K_SCANCODE_STOP 120
399#define K_SCANCODE_AGAIN 121
400#define K_SCANCODE_UNDO 122
401#define K_SCANCODE_CUT 123
402#define K_SCANCODE_COPY 124
403#define K_SCANCODE_PASTE 125
404#define K_SCANCODE_FIND 126
405#define K_SCANCODE_MUTE 127
406#define K_SCANCODE_VOLUMEUP 128
407#define K_SCANCODE_VOLUMEDOWN 129
408#define K_SCANCODE_KP_COMMA 133
409#define K_SCANCODE_KP_EQUALSAS400 134
410#define K_SCANCODE_LCTRL 224
411#define K_SCANCODE_LSHIFT 225
412#define K_SCANCODE_LALT 226
413#define K_SCANCODE_LGUI 227
414#define K_SCANCODE_RCTRL 228
415#define K_SCANCODE_RSHIFT 229
416#define K_SCANCODE_RALT 230
417#define K_SCANCODE_RGUI 231
429 std::vector<unsigned int>
keys;
443 if (SDL_PollEvent(&
event))
464 for (
size_t i = 0; i <
keys.size(); ++i)
466 if (
keys.at(i) == key)
485 for (
size_t i =
keys.size(); i-- > 0;)
502 return event.button.button;
508 return event.button.x;
514 return event.button.y;
520 return event.motion.x;
526 return event.motion.y;
532 return event.key.key;
544 for (
size_t i = 0; i <
keys.size(); ++i)
558 return event.wheel.x;
564 return event.wheel.y;
600 min = glm::min(
min, point);
601 max = glm::max(
max, point);
726 std::ifstream file(fileName, std::ios::binary);
730 const size_t bufferSize = 8192;
731 std::vector<uint8_t> buffer(bufferSize);
737 file.read(
reinterpret_cast<char *
>(buffer.data()), bufferSize);
738 std::streamsize bytesRead = file.gcount();
741 md5.
update(buffer.data(),
static_cast<size_t>(bytesRead));
755 const kString possibleCharacters(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
758 randomString.reserve(stringLength);
760 std::random_device rd;
761 std::mt19937 gen(rd());
762 std::uniform_int_distribution<> dist(0, (
int)possibleCharacters.length() - 1);
764 for (
int i = 0; i < stringLength; ++i)
766 char nextChar = possibleCharacters.at(dist(gen));
767 randomString.push_back(nextChar);
780 static std::random_device rd;
781 static std::mt19937_64 gen(rd());
782 static std::uniform_int_distribution<uint64_t> dist;
785 uint64_t high = dist(gen);
786 uint64_t low = dist(gen);
789 high &= 0xFFFFFFFFFFFF0FFFULL;
790 high |= 0x0000000000004000ULL;
793 low &= 0x3FFFFFFFFFFFFFFFULL;
794 low |= 0x8000000000000000ULL;
796 std::stringstream ss;
797 ss << std::hex << std::setfill(
'0');
799 ss << std::setw(8) << (uint32_t)(high >> 32);
801 ss << std::setw(4) << (uint16_t)(high >> 16);
803 ss << std::setw(4) << (uint16_t)(high);
805 ss << std::setw(4) << (uint16_t)(low >> 48);
807 ss << std::setw(12) << (low & 0x0000FFFFFFFFFFFFULL);
Streaming MD5 message-digest implementation.
Definition kmd5.h:26
void update(const uint8_t *input, size_t length)
Feeds a block of raw bytes into the running digest.
Definition kmd5.h:226
std::string final()
Finalises the digest and returns it as a lowercase hex string.
Definition kmd5.h:248
#define K_EVENT_KEYDOWN
Definition kdatatype.h:144
#define MAX_BONE_INFLUENCE
Maximum number of bones a single vertex can be influenced by.
Definition kdatatype.h:46
#define K_EVENT_KEYUP
Definition kdatatype.h:145
Top-level Kemena3D engine namespace.
Definition kanimation.h:23
kCameraType
Camera behaviour mode.
Definition kdatatype.h:97
@ CAMERA_TYPE_LOCKED
Orbit; always looks at a fixed target point.
Definition kdatatype.h:99
@ CAMERA_TYPE_FREE
Free-fly; position and orientation are set independently.
Definition kdatatype.h:98
kString generateRandomString(int stringLength)
Generates a cryptographically random alphanumeric kString.
Definition kdatatype.h:753
kLightType
Light source variety.
Definition kdatatype.h:115
@ LIGHT_TYPE_POINT
Omnidirectional point light.
Definition kdatatype.h:117
@ LIGHT_TYPE_SPOT
Cone-shaped spotlight.
Definition kdatatype.h:118
@ LIGHT_TYPE_SUN
Directional (infinite-distance) light.
Definition kdatatype.h:116
glm::ivec2 kIvec2
2-component integer vector.
Definition kdatatype.h:35
std::string kString
Standard string alias.
Definition kdatatype.h:42
glm::mat3 kMat3
3x3 float matrix.
Definition kdatatype.h:38
kString generateFileChecksum(const kString &fileName)
Computes an MD5 checksum of the given file.
Definition kdatatype.h:724
glm::quat kQuat
Unit quaternion.
Definition kdatatype.h:40
kString generateUuid()
Generates a random UUID v4 kString.
Definition kdatatype.h:777
kWindowType
Window creation mode.
Definition kdatatype.h:76
@ WINDOW_DEFAULT
Normal windowed mode.
Definition kdatatype.h:77
@ WINDOW_FULLSCREEN
Exclusive fullscreen.
Definition kdatatype.h:78
@ WINDOW_BORDERLESS
Borderless/windowed fullscreen.
Definition kdatatype.h:79
glm::ivec3 kIvec3
3-component integer vector.
Definition kdatatype.h:36
kRenderMode
Selects the debug visualization mode for the scene viewport.
Definition kdatatype.h:62
@ RENDER_MODE_NORMALS
World normals visualized as RGB.
Definition kdatatype.h:65
@ RENDER_MODE_FULL
Normal fully-lit render.
Definition kdatatype.h:63
@ RENDER_MODE_ALBEDO
Albedo / diffuse texture only, no lighting.
Definition kdatatype.h:64
@ RENDER_MODE_FULL_WIREFRAME
Full lit render with wireframe overlay.
Definition kdatatype.h:69
@ RENDER_MODE_DEPTH
Linearized depth as greyscale.
Definition kdatatype.h:67
@ RENDER_MODE_OBJECT_IDS
Color-coded object ID picking buffer.
Definition kdatatype.h:68
@ RENDER_MODE_WIREFRAME
Flat-color wireframe only.
Definition kdatatype.h:66
kRendererType
Identifies the graphics backend used by kRenderer.
Definition kdatatype.h:54
@ RENDERER_GL
OpenGL renderer.
Definition kdatatype.h:55
glm::vec2 kVec2
2-component float vector.
Definition kdatatype.h:32
kNodeType
Scene-graph node type tag.
Definition kdatatype.h:86
@ NODE_TYPE_LIGHT
Light source.
Definition kdatatype.h:90
@ NODE_TYPE_MESH
Renderable mesh.
Definition kdatatype.h:88
@ NODE_TYPE_CAMERA
Camera.
Definition kdatatype.h:89
@ NODE_TYPE_OBJECT
Generic empty object.
Definition kdatatype.h:87
glm::vec4 kVec4
4-component float vector.
Definition kdatatype.h:34
kTextureType
Distinguishes 2D from cube-map textures.
Definition kdatatype.h:136
@ TEX_TYPE_2D
Standard 2-dimensional texture.
Definition kdatatype.h:137
@ TEX_TYPE_CUBE
Cube-map texture (six faces).
Definition kdatatype.h:138
glm::vec3 kVec3
3-component float vector.
Definition kdatatype.h:33
kTextureFormat
Texture upload format (internal precision / colour-space).
Definition kdatatype.h:125
@ TEX_FORMAT_SRGB
8-bit RGB, sRGB colour-space (gamma-corrected).
Definition kdatatype.h:128
@ TEX_FORMAT_SRGBA
8-bit RGBA, sRGB colour-space.
Definition kdatatype.h:129
@ TEX_FORMAT_RGB
8-bit RGB, linear colour-space.
Definition kdatatype.h:126
@ TEX_FORMAT_RGBA
8-bit RGBA, linear colour-space.
Definition kdatatype.h:127
kTransparentType
Transparency/blending mode for a material.
Definition kdatatype.h:106
@ TRANSP_TYPE_BLEND
Alpha blending (src-alpha / one-minus-src-alpha).
Definition kdatatype.h:108
@ TRANSP_TYPE_NONE
Opaque — no blending.
Definition kdatatype.h:107
glm::ivec4 kIvec4
4-component integer vector.
Definition kdatatype.h:37
glm::mat4 kMat4
4x4 float matrix.
Definition kdatatype.h:39
kAABB expanded(float amount) const
Returns a copy of the box uniformly expanded outward by the given amount on every side.
Definition kdatatype.h:618
void merge(const kAABB &other)
Grows the box so that it encloses another box.
Definition kdatatype.h:608
kVec3 min
Minimum corner; initialised to +inf so the box starts empty/invalid.
Definition kdatatype.h:573
bool overlaps(const kAABB &other) const
Tests whether this box intersects another box.
Definition kdatatype.h:638
void expandBy(const kVec3 &point)
Grows the box so that it encloses the given point.
Definition kdatatype.h:599
bool isValid() const
Returns true if min is component-wise less than or equal to max (i.e. the box is non-degenerate).
Definition kdatatype.h:593
kVec3 center() const
Returns the geometric centre of the box.
Definition kdatatype.h:587
kVec3 halfExtents() const
Returns half the size of the box along each axis.
Definition kdatatype.h:590
kVec3 max
Maximum corner; initialised to -inf so the box starts empty/invalid.
Definition kdatatype.h:574
kAABB()=default
Constructs an empty (invalid) bounding box.
bool contains(const kAABB &other) const
Tests whether this box fully contains another box.
Definition kdatatype.h:627
kAABB(kVec3 min, kVec3 max)
Constructs a bounding box from explicit corners.
Definition kdatatype.h:584
Stores the per-bone offset matrix and its index in the palette.
Definition kdatatype.h:664
int id
Index into the final bone-matrix palette.
Definition kdatatype.h:665
kMat4 offset
Transforms from model space to bone-local space.
Definition kdatatype.h:666
Glyph metrics for a single character in a bitmap font atlas.
Definition kdatatype.h:711
int w
Definition kdatatype.h:715
float ax
Horizontal advance (pen advance after drawing the glyph).
Definition kdatatype.h:712
int h
Width and height of the glyph in pixels.
Definition kdatatype.h:715
float tx
Definition kdatatype.h:714
int yoff
Pixel offset from the glyph origin.
Definition kdatatype.h:716
int xoff
Definition kdatatype.h:716
float ty
UV coordinates of the glyph within the atlas texture.
Definition kdatatype.h:714
float lsb
Left side bearing.
Definition kdatatype.h:713
A single position keyframe for skeletal animation.
Definition kdatatype.h:671
float timeStamp
Time (in ticks) at which this keyframe occurs.
Definition kdatatype.h:673
kVec3 position
World-space position at this keyframe.
Definition kdatatype.h:672
A single rotation keyframe for skeletal animation.
Definition kdatatype.h:678
kQuat orientation
Rotation quaternion at this keyframe.
Definition kdatatype.h:679
float timeStamp
Time (in ticks) at which this keyframe occurs.
Definition kdatatype.h:680
A single scale keyframe for skeletal animation.
Definition kdatatype.h:685
kVec3 scale
Non-uniform scale at this keyframe.
Definition kdatatype.h:686
float timeStamp
Time (in ticks) at which this keyframe occurs.
Definition kdatatype.h:687
Node in a skeletal-animation hierarchy (one per scene-graph joint).
Definition kdatatype.h:700
kMat4 transformation
Local-space transform for this node.
Definition kdatatype.h:701
kString name
Node name (used to look up bones by name).
Definition kdatatype.h:702
std::vector< kNodeData > children
Child nodes.
Definition kdatatype.h:704
int childrenCount
Number of child nodes.
Definition kdatatype.h:703
Wraps an SDL_Event and provides helper accessors for input polling.
Definition kdatatype.h:427
SDL_Event event
Underlying SDL event.
Definition kdatatype.h:428
bool hasEvent()
Polls one event from the SDL queue.
Definition kdatatype.h:441
bool getKeyDown(unsigned int key)
Returns true if the given key is currently held down.
Definition kdatatype.h:539
float getMouseMoveX()
Returns the absolute X position from the last motion event.
Definition kdatatype.h:518
float getMouseX()
Returns the X position from the last mouse-button event.
Definition kdatatype.h:506
float getMouseWheelY()
Returns vertical scroll delta from the last wheel event.
Definition kdatatype.h:562
float getMouseMoveY()
Returns the absolute Y position from the last motion event.
Definition kdatatype.h:524
std::vector< unsigned int > keys
Currently-held key codes.
Definition kdatatype.h:429
unsigned int getType()
Returns the event type and maintains the held-key list.
Definition kdatatype.h:454
unsigned int getMouseButton()
Returns the mouse button index from the last button event.
Definition kdatatype.h:500
float getMouseY()
Returns the Y position from the last mouse-button event.
Definition kdatatype.h:512
SDL_Event * getSdlEvent()
Returns a pointer to the internal SDL_Event.
Definition kdatatype.h:432
unsigned int getKeyButton()
Returns the key code from the last key event.
Definition kdatatype.h:530
float getMouseWheelX()
Returns horizontal scroll delta from the last wheel event.
Definition kdatatype.h:556
Full per-vertex data layout used internally by the asset manager.
Definition kdatatype.h:649
kVec3 tangent
Tangent vector (for normal mapping).
Definition kdatatype.h:653
kVec3 position
Vertex position in model space.
Definition kdatatype.h:650
kVec3 normal
Vertex normal.
Definition kdatatype.h:651
int boneIDs[MAX_BONE_INFLUENCE]
Indices of influencing bones.
Definition kdatatype.h:656
float weights[MAX_BONE_INFLUENCE]
Blend weights for each bone.
Definition kdatatype.h:657
kVec2 texCoords
UV texture coordinates.
Definition kdatatype.h:652
kVec3 bitangent
Bitangent vector (for normal mapping).
Definition kdatatype.h:654