Vulkan Schnee 0.0.1
High-performance rendering engine
Loading...
Searching...
No Matches
EcsData.h
Go to the documentation of this file.
1#pragma once
2#include "Engine/Core/Asset.h"
10#include "entt/entt.hpp"
11#include "meshoptimizer.h"
12#include "tiny_gltf.h"
13
14#include <filesystem>
15#include <future>
16#include <glm/glm.hpp>
17#include <glm/gtc/quaternion.hpp>
18#include <memory>
19#include <optional>
20#include <string>
21#include <vector>
22
23class btCollisionShape;
24class btRigidBody;
25
26namespace Engine::Components
27{
28 class Mesh;
29} // namespace Engine::Components
30
31namespace Engine::Entities
32{
33 class SceneNode;
34} // namespace Engine::Entities
35
36namespace Engine::Core
37{
38 struct MaterialData;
39} // namespace Engine::Core
40
41namespace Engine::Rendering
42{
43 enum PipelineNames : int;
44} // namespace Engine::Rendering
45
46namespace Engine::Assets
47{
48 class Animation;
49 class Skin;
50 class Mesh;
51} // namespace Engine::Assets
52
57namespace Engine::Ecs {
58
60 std::filesystem::path path;
61 std::future<tinygltf::Image> future;
62 };
63
67 struct Parent
68 {
69 entt::entity parent;
70 };
71
77 {
78 };
79
87
89 {
90 std::vector<StaticMeshData> meshData;
91 };
92
97
99 std::filesystem::path path;
100 std::future<Engine::Assets::Textures::ExrHeader> future;
101 };
102
104 std::filesystem::path path;
105 std::future<Engine::Assets::Textures::Ktx2TextureData> future;
106 };
107
109 std::filesystem::path path;
110 std::future<tinygltf::Model> future;
111 };
112
118
119 struct ImageData {
120 tinygltf::Image image;
121 };
122
123 struct Model {
124 tinygltf::Model model;
125 };
126
131 {
132 btRigidBody* rigidBody = nullptr;
133 btCollisionShape* collisionShape = nullptr;
134
135 bool isKinematic = false;
136 bool isStatic = false;
137 };
138
143 {
144 };
145
152 {
153 };
154
165 {
166 static void push(entt::entity entity)
167 {
168 entities.push_back(entity);
169 }
170
171 static std::vector<entt::entity>& get()
172 {
173 return entities;
174 }
175
176 static void clear()
177 {
178 entities.clear();
179 }
180
185 static void reserveAdditional(size_t additionalEntities)
186 {
187 entities.reserve(entities.size() + additionalEntities);
188 }
189
190 static bool empty()
191 {
192 return entities.empty();
193 }
194
195 private:
196 inline static std::vector<entt::entity> entities;
197 };
198
204 std::weak_ptr<Engine::Entities::SceneNode> node;
205 };
206
214
218 struct Tick
219 {
221 int32_t priority = 0;
222 };
223
228 {
229 uint32_t index;
230 };
231 struct Mesh
232 {
233 tinygltf::Mesh mesh;
234 };
235
237 {
238 tinygltf::Node node;
239 };
240
242 {
243 std::vector<Vertex> vertices;
244 std::vector<uint32_t> indices;
245 std::vector<BoneVertexData> boneVertexData;
246 };
247
251 using Meshlet = meshopt_Meshlet;
252
253 struct MeshletData {
254 std::vector<meshopt_Meshlet> meshlets;
255 std::vector<uint32_t> meshletVertices;
256 std::vector<uint8_t> meshletTriangles;
257 };
258
261 std::vector<PrimitiveData> data;
262 std::vector<Asset::Path> materialPaths;
263 std::shared_ptr<Engine::Assets::Skin> skin;
264 };
265
270 glm::vec3 center = { 0.0f, 0.0f, 0.0f };
271 float radius = 0.0f;
272 };
273
281 uint32_t packed;
282
284 static PackedTriangle pack(uint8_t i0, uint8_t i1, uint8_t i2) {
285 return { static_cast<uint32_t>(i0) |
286 (static_cast<uint32_t>(i1) << 8) |
287 (static_cast<uint32_t>(i2) << 16) };
288 }
289 };
290
291 // Backwards compatibility alias
293
299 std::vector<Vertex> vertices;
300 std::vector<PackedTriangle> triangles;
301 };
302
309 std::vector<Engine::Rendering::ClusterLodData> clusters;
310 std::vector<Engine::Rendering::ClusterGroupData> groups;
311
314
317
319 size_t lodLevelCount = 0;
320 };
321
333
341 entt::entity meshEntity;
342 std::vector<PrimitiveMeshletResult> primitiveResults;
344 std::shared_ptr<Engine::Assets::Skin> skin;
345 };
346
348 std::optional<PrimitiveData> data = std::nullopt;
349 std::optional<MeshletData> meshletData = std::nullopt;
350 std::optional<UnpackedMeshletData> unpackedData = std::nullopt;
351 std::optional<LodHierarchyResult> lodHierarchy = std::nullopt;
354 };
355
357 {
358 std::vector<Ecs::MeshPrimitive> primitives;
360 };
361
363 {
364 glm::vec4 color;
365 };
366
368 {
370 };
371
372 struct ModelFuture {
373 std::future<tinygltf::Model> future;
374 };
375
376 struct Transform {
377 glm::mat4 matrix = glm::mat4(1.0f);
378
379 [[nodiscard]] glm::vec3 getPosition() const;
380 [[nodiscard]] glm::quat getRotation() const;
381 [[nodiscard]] glm::vec3 getRotationEuler() const;
382 [[nodiscard]] glm::vec3 getScale() const;
383
384 void setPosition(const glm::vec3& newPosition);
385 void setRotation(const glm::vec3& newRotation);
386 void setRotation(const glm::quat& newQuaternion);
387 void setScale(const glm::vec3& newScale);
388 };
389
391 glm::mat4 matrix = glm::mat4(1.0f);
392 };
393
395 uint32_t depth;
396 };
397
401 struct ActiveCamera { };
402
407 float fov = 60.0f;
408 float nearPlane = 0.01f;
409 float farPlane = 1000.0f;
410 float aspectRatio = 16.0f / 9.0f;
411 };
412
416 struct LightData {};
417
423 {
424 glm::vec3 color{1.0f};
425 float intensity = 1.0f;
427 uint32_t enabled = 1u;
428 uint32_t castsShadows = 1u;
429 uint32_t hasDirectionOverride = 0u;
430 glm::vec3 direction{0.0f, -1.0f, 0.0f};
431 entt::entity sceneNodeEntity = entt::null;
432 };
433
439 {
440 glm::vec3 color{1.0f};
441 float intensity = 1.0f;
442 float radius = 10.0f;
443 float cullDistance = 100.0f;
444 uint32_t enabled = 1u;
445 entt::entity sceneNodeEntity = entt::null;
446 };
447
448
449 // ============================================================================
450 // Asset Loading Pipeline Components
451 // ============================================================================
452
457 uint32_t uvCount = 0;
459 };
460
465 struct RawMeshData {
466 std::vector<Vertex> vertices;
467 std::vector<uint32_t> indices;
468 };
469
483
491
492 // Forward declaration for pipeline
493 namespace AssetPipeline {
494 struct RawGeometryData;
495 }
496
502 // Store as void* to avoid forward declaration issues
503 // Will be cast to AssetPipeline::RawGeometryData* when used
504 void* rawGeometryData = nullptr;
505 };
506
507 // ============================================================================
508 // Skeletal Mesh Components
509 // ============================================================================
510
519
525 float playbackTime = 0.0f;
526 float playbackSpeed = 1.0f;
527 bool isLooping = true;
528 bool isPlaying = false;
529 };
530
536
544 std::vector<glm::mat4> boneMatrices;
545 uint32_t gpuBoneMatrixOffset = 0;
546 };
547
553 struct DevicePose {
554 glm::vec3 position = glm::vec3(0.0f);
555 glm::quat orientation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
556 };
560 double timestamp = 0.0;
561 };
562}
Animation clip loaded from glTF animation data.
The mesh asset stores geometry data and.
Definition MeshAsset.h:20
Skeleton definition loaded from glTF skin data.
Definition SkinAsset.h:27
A component which can be attached as many times to an actor as one wants. It makes it possible to ren...
This is the interface which is used to call a tick function on an object. Everything which should be ...
Definition Tick.h:24
Represents a node in the scene graph, containing information about its position, rotation,...
Definition SceneGraph.h:18
Asset::Ref< Asset::Path, Mesh > MeshAssetRef
Core audio subsystem owning the miniaudio engine and managing playback.
Definition AudioConfig.h:9
PackedTriangle UnpackedTriangle
Definition EcsData.h:292
meshopt_Meshlet Meshlet
information about the vertex and index data of a single meshlet
Definition EcsData.h:251
AssetLoadingStage
Tracks the current stage of asset loading in the pipeline.
Definition EcsData.h:473
Wrapper for EXR file header information with owned data.
Definition ExrLoader.h:28
Unified material data structure containing all possible material properties.
Tag for the active camera in the scene.
Definition EcsData.h:401
Animation playback state for an entity with a skeletal mesh.
Definition EcsData.h:523
Engine::Assets::Animation * currentAnimation
Definition EcsData.h:524
std::filesystem::path path
Definition EcsData.h:60
std::future< tinygltf::Image > future
Definition EcsData.h:61
Status information for asset loading pipeline.
Definition EcsData.h:487
AssetLoadingStage stage
Definition EcsData.h:488
Is a tag for asset loading. When an asset has been requested for loading but isn't yet created this t...
Definition EcsData.h:77
Tag component indicating bone transforms need GPU upload. Analogous to TransformDirty for world trans...
Definition EcsData.h:535
A bounding sphere for an entity. Used for frustum culling.
Definition EcsData.h:269
Camera properties for projection matrix calculation.
Definition EcsData.h:406
float fov
Vertical field of view in degrees.
Definition EcsData.h:407
Complete result of meshlet generation for all primitives of a mesh. This is returned from the backgro...
Definition EcsData.h:339
std::vector< PrimitiveMeshletResult > primitiveResults
Definition EcsData.h:342
std::shared_ptr< Engine::Assets::Skin > skin
Non-null for skinned meshes.
Definition EcsData.h:344
Stores computed bone matrices for GPU upload.
Definition EcsData.h:543
std::vector< glm::mat4 > boneMatrices
Final skinning matrices (globalTransform * inverseBindMatrix)
Definition EcsData.h:544
uint32_t gpuBoneMatrixOffset
Offset in GPU bone matrix buffer.
Definition EcsData.h:545
Runtime directional light data mirrored from Components::DirectionalLight. sceneNodeEntity points to ...
Definition EcsData.h:423
Engine::Assets::Textures::ExrHeader header
Definition EcsData.h:95
std::filesystem::path path
Definition EcsData.h:99
std::future< Engine::Assets::Textures::ExrHeader > future
Definition EcsData.h:100
std::filesystem::path path
Definition EcsData.h:109
std::future< tinygltf::Model > future
Definition EcsData.h:110
tinygltf::Image image
Definition EcsData.h:120
std::filesystem::path path
Definition EcsData.h:104
std::future< Engine::Assets::Textures::Ktx2TextureData > future
Definition EcsData.h:105
Tag for ECS entities that provide renderer light data.
Definition EcsData.h:416
Result of LOD hierarchy generation for a mesh primitive. Contains per-cluster and per-group data for ...
Definition EcsData.h:307
UnpackedMeshletData unpackedData
Unpacked GPU data for LOD meshlets.
Definition EcsData.h:316
MeshletData meshletData
Meshlet data for all clusters (extends base meshlet data)
Definition EcsData.h:313
size_t lodLevelCount
Number of LOD levels generated.
Definition EcsData.h:319
std::vector< Engine::Rendering::ClusterLodData > clusters
Per-cluster data (all LOD levels combined)
Definition EcsData.h:309
std::vector< Engine::Rendering::ClusterGroupData > groups
Definition EcsData.h:310
size_t baseLevelClusterCount
Clusters at LOD 0 (finest level)
Definition EcsData.h:318
Engine::Rendering::PipelineNames type
Definition EcsData.h:115
Engine::Core::MaterialData * data
Definition EcsData.h:116
Reference to a MeshComponent for ECS-based iteration. Allows efficient querying of all mesh component...
Definition EcsData.h:211
Engine::Components::Mesh * component
Definition EcsData.h:212
The index of the mesh inside the scene. Used to query the mesh index of a scene.
Definition EcsData.h:228
std::vector< Ecs::MeshPrimitive > primitives
Definition EcsData.h:358
Ecs::BoundingSphere boundingSphere
Definition EcsData.h:359
std::optional< PrimitiveData > data
Definition EcsData.h:348
std::optional< MeshletData > meshletData
Definition EcsData.h:349
Ecs::BoundingSphere boundingSphere
Definition EcsData.h:352
Asset::Path materialPath
Reference to MaterialAsset for pipeline lookup.
Definition EcsData.h:353
std::optional< LodHierarchyResult > lodHierarchy
LOD hierarchy (if generated)
Definition EcsData.h:351
std::optional< UnpackedMeshletData > unpackedData
Pre-unpacked GPU-ready data.
Definition EcsData.h:350
tinygltf::Mesh mesh
Definition EcsData.h:233
std::vector< meshopt_Meshlet > meshlets
Definition EcsData.h:254
std::vector< uint32_t > meshletVertices
Definition EcsData.h:255
std::vector< uint8_t > meshletTriangles
Definition EcsData.h:256
std::future< tinygltf::Model > future
Definition EcsData.h:373
tinygltf::Node node
Definition EcsData.h:238
tinygltf::Model model
Definition EcsData.h:124
GPU-ready packed triangle data (matches shader layout). Stores 3 x 8-bit local indices packed into a ...
Definition EcsData.h:280
uint32_t packed
3 x 8-bit indices: (i2 << 16) | (i1 << 8) | i0
Definition EcsData.h:281
static PackedTriangle pack(uint8_t i0, uint8_t i1, uint8_t i2)
Pack 3 local indices into a single uint32_t.
Definition EcsData.h:284
Stores parent relationships.
Definition EcsData.h:68
entt::entity parent
Definition EcsData.h:69
Temporary holder for raw geometry data during pipeline execution This is used to pass data between pi...
Definition EcsData.h:501
Runtime point light data mirrored from Components::PointLight. sceneNodeEntity points to the transfor...
Definition EcsData.h:439
entt::entity sceneNodeEntity
Definition EcsData.h:445
std::vector< PrimitiveData > data
Definition EcsData.h:261
std::shared_ptr< Engine::Assets::Skin > skin
Non-null for skinned meshes.
Definition EcsData.h:263
std::vector< Asset::Path > materialPaths
Resolved material paths per primitive.
Definition EcsData.h:262
std::vector< uint32_t > indices
Definition EcsData.h:244
std::vector< BoneVertexData > boneVertexData
Empty for static meshes.
Definition EcsData.h:245
std::vector< Vertex > vertices
Definition EcsData.h:243
Result of meshlet generation for a single primitive. Used to transfer data from background thread to ...
Definition EcsData.h:326
UnpackedMeshletData unpackedData
GPU-ready unpacked vertex/triangle data.
Definition EcsData.h:330
std::optional< LodHierarchyResult > lodHierarchy
LOD hierarchy (if generated)
Definition EcsData.h:331
PrimitiveData optimizedData
Optimized vertices and indices.
Definition EcsData.h:328
Metadata about a primitive being loaded from gltf file.
Definition EcsData.h:456
Raw mesh geometry data extracted from gltf file Contains unprocessed vertices and indices.
Definition EcsData.h:465
std::vector< uint32_t > indices
Definition EcsData.h:467
std::vector< Vertex > vertices
Definition EcsData.h:466
Global dirty entity collector for renderer transform uploads.
Definition EcsData.h:165
static std::vector< entt::entity > & get()
Definition EcsData.h:171
static void push(entt::entity entity)
Definition EcsData.h:166
static void reserveAdditional(size_t additionalEntities)
Reserve memory for entities when batch spawning to avoid reallocation.
Definition EcsData.h:185
static std::vector< entt::entity > entities
Definition EcsData.h:196
A struct which allows the engine to find out which SceneNode needs to propagate a dirty flag down the...
Definition EcsData.h:203
std::weak_ptr< Engine::Entities::SceneNode > node
Definition EcsData.h:204
Tag for EnTT which tags entities which should simulate physics.
Definition EcsData.h:131
btCollisionShape * collisionShape
Definition EcsData.h:133
Skeletal mesh data component. Similar to StaticMeshData but references skin/animation.
Definition EcsData.h:514
Engine::Assets::Skin * skin
Definition EcsData.h:517
Engine::Assets::Mesh * assetData
Definition EcsData.h:516
Engine::Components::Mesh * owner
Definition EcsData.h:84
Engine::Assets::MeshAssetRef assetRef
Definition EcsData.h:83
std::vector< StaticMeshData > meshData
Definition EcsData.h:90
Tag for everything which wants to receive tick events.
Definition EcsData.h:219
Engine::Core::ITickable * tickable
Definition EcsData.h:220
int32_t priority
Definition EcsData.h:221
Tag for transforms that need GPU upload.
Definition EcsData.h:152
Tag for dirty transforms (used by scene graph synchronization)
Definition EcsData.h:143
glm::quat getRotation() const
void setPosition(const glm::vec3 &newPosition)
void setScale(const glm::vec3 &newScale)
void setRotation(const glm::vec3 &newRotation)
void setRotation(const glm::quat &newQuaternion)
glm::vec3 getRotationEuler() const
glm::vec3 getPosition() const
glm::vec3 getScale() const
Pre-packed GPU-ready data for a primitive's meshlets. Generated on background thread during meshlet g...
Definition EcsData.h:298
std::vector< PackedTriangle > triangles
Packed triangle indices (4 bytes each)
Definition EcsData.h:300
std::vector< Vertex > vertices
Unpacked vertex data per meshlet.
Definition EcsData.h:299
VR tracking input populated from OpenXR each frame. Used by the IK system to drive skeletal animation...
Definition EcsData.h:552