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
9#include "Engine/Core/Tick.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
53namespace glm
54{
55 typedef vec3 eulr;
56}
57
62namespace Engine::Ecs {
63
71 std::filesystem::path path;
72
76 std::future<tinygltf::Image> future;
77 };
78
82 struct Parent
83 {
84 entt::entity parent;
85 };
86
92 {
93 };
94
104
109 {
110 std::vector<StaticMeshData> meshData;
111 };
112
120
128 std::filesystem::path path;
129
133 std::future<Engine::Assets::Textures::ExrHeader> future;
134 };
135
143 std::filesystem::path path;
144
148 std::future<Engine::Assets::Textures::Ktx2TextureData> future;
149 };
150
158 std::filesystem::path path;
159
163 std::future<tinygltf::Model> future;
164 };
165
185
189 struct ImageData {
190 tinygltf::Image image;
191 };
192
196 struct Model {
197 tinygltf::Model model;
198 };
199
204 {
205 btRigidBody* rigidBody = nullptr;
206 btCollisionShape* collisionShape = nullptr;
207
208 bool isKinematic = false;
209 bool isStatic = false;
210 };
211
216 {
217 };
218
225 {
226 };
227
238 {
239 static void push(entt::entity entity)
240 {
241 entities.push_back(entity);
242 }
243
244 static std::vector<entt::entity>& get()
245 {
246 return entities;
247 }
248
249 static void clear()
250 {
251 entities.clear();
252 }
253
258 static void reserveAdditional(size_t additionalEntities)
259 {
260 entities.reserve(entities.size() + additionalEntities);
261 }
262
263 static bool empty()
264 {
265 return entities.empty();
266 }
267
268 private:
269 inline static std::vector<entt::entity> entities;
270 };
271
277 std::weak_ptr<Engine::Entities::SceneNode> node;
278 };
279
285 std::vector<Engine::Components::Mesh*> components;
286 };
287
291 struct Tick
292 {
294 int32_t priority = 0;
295 };
296
301 {
302 uint32_t index;
303 };
304 struct Mesh
305 {
306 tinygltf::Mesh mesh;
307 };
308
310 {
311 tinygltf::Node node;
312 };
313
315 {
316 std::vector<Vertex> vertices;
317 std::vector<uint32_t> indices;
318 std::vector<BoneVertexData> boneVertexData;
319 };
320
324 using Meshlet = meshopt_Meshlet;
325
326 struct MeshletData {
327 std::vector<meshopt_Meshlet> meshlets;
328 std::vector<uint32_t> meshletVertices;
329 std::vector<uint8_t> meshletTriangles;
330 };
331
334 std::vector<PrimitiveData> data;
335 std::vector<Asset::MeshPath> materialPaths;
337 };
338
343 glm::vec3 center = { 0.0f, 0.0f, 0.0f };
344 float radius = 0.0f;
345 };
346
354 uint32_t packed;
355
357 static PackedTriangle pack(uint8_t i0, uint8_t i1, uint8_t i2) {
358 return { static_cast<uint32_t>(i0) |
359 (static_cast<uint32_t>(i1) << 8) |
360 (static_cast<uint32_t>(i2) << 16) };
361 }
362 };
363
364 // Backwards compatibility alias
366
372 std::vector<Vertex> vertices;
373 std::vector<PackedTriangle> triangles;
374 };
375
382 std::vector<Engine::Rendering::ClusterLodData> clusters;
383 std::vector<Engine::Rendering::ClusterGroupData> groups;
384
387
390
392 size_t lodLevelCount = 0;
393 };
394
406
419
421 std::optional<PrimitiveData> data = std::nullopt;
422 std::optional<MeshletData> meshletData = std::nullopt;
423 std::optional<UnpackedMeshletData> unpackedData = std::nullopt;
424 std::optional<LodHierarchyResult> lodHierarchy = std::nullopt;
428 };
429
431 {
432 std::vector<Ecs::MeshPrimitive> primitives;
434 };
435
437 {
438 glm::vec4 color;
439 };
440
442 {
444 };
445
446 struct ModelFuture {
447 std::future<tinygltf::Model> future;
448 };
449
450 struct Transform {
451 Transform() = default;
452 explicit Transform(glm::mat4 matrix);
453 explicit Transform(glm::vec3 position);
454 explicit Transform(glm::quat rotation);
455 explicit Transform(glm::vec3 position, glm::quat rotation);
456 explicit Transform(glm::vec3 position, glm::eulr rotation, glm::vec3 scale);
457 glm::mat4 matrix = glm::mat4(1.0f);
458
459 [[nodiscard]] glm::vec3 getPosition() const;
460 [[nodiscard]] glm::quat getRotation() const;
461 [[nodiscard]] glm::vec3 getRotationEuler() const;
462 [[nodiscard]] glm::vec3 getScale() const;
463
464 void setPosition(const glm::vec3& newPosition);
465 void setRotation(const glm::vec3& newRotation);
466 void setRotation(const glm::quat& newQuaternion);
467 void setScale(const glm::vec3& newScale);
468 void setFacing(const glm::vec3& newFacing);
469 };
470
472 glm::mat4 matrix = glm::mat4(1.0f);
473 };
474
476 uint32_t depth;
477 };
478
482 struct ActiveCamera { };
483
488 float fov = 60.0f;
489 float nearPlane = 0.01f;
490 float farPlane = 1000.0f;
491 float aspectRatio = 16.0f / 9.0f;
492 };
493
497 struct LightData {};
498
504 {
505 glm::vec3 color{1.0f};
506 float intensity = 1.0f;
508 uint32_t enabled = 1u;
509 uint32_t castsShadows = 1u;
510 uint32_t hasDirectionOverride = 0u;
511 glm::vec3 direction{0.0f, -1.0f, 0.0f};
512 entt::entity sceneNodeEntity = entt::null;
513 };
514
520 {
521 glm::vec3 color{1.0f};
522 float intensity = 1.0f;
523 float radius = 10.0f;
524 float cullDistance = 100.0f;
525 uint32_t enabled = 1u;
526 entt::entity sceneNodeEntity = entt::null;
527 };
528
529
530 // ============================================================================
531 // Asset Loading Pipeline Components
532 // ============================================================================
533
538 uint32_t uvCount = 0;
540 };
541
546 struct RawMeshData {
547 std::vector<Vertex> vertices;
548 std::vector<uint32_t> indices;
549 };
550
564
572
573 // Forward declaration for pipeline
574 namespace AssetPipeline {
575 struct RawGeometryData;
576 }
577
583 // Store as void* to avoid forward declaration issues
584 // Will be cast to AssetPipeline::RawGeometryData* when used
585 void* rawGeometryData = nullptr;
586 };
587
588 // ============================================================================
589 // Skeletal Mesh Components
590 // ============================================================================
591
600
606 float playbackTime = 0.0f;
607 float playbackSpeed = 1.0f;
608 bool isLooping = true;
609 bool isPlaying = false;
610 };
611
617
625 std::vector<glm::mat4> boneMatrices;
626 uint32_t gpuBoneMatrixOffset = 0;
627 };
628
637 struct DevicePose {
641 glm::vec3 position = glm::vec3(0.0f);
642
646 glm::quat orientation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
647 };
651 double timestamp = 0.0;
652 };
653}
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:30
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::MeshPath, Mesh > MeshAssetRef
AssetHandle< GeometryMeshHandleTag > GeometryMeshHandle
AssetHandle< MaterialHandleTag > MaterialHandle
Manages IBL (Image-Based Lighting) resources for specular reflections.
PackedTriangle UnpackedTriangle
Definition EcsData.h:365
meshopt_Meshlet Meshlet
information about the vertex and index data of a single meshlet
Definition EcsData.h:324
AssetLoadingStage
Tracks the current stage of asset loading in the pipeline.
Definition EcsData.h:554
PipelineNames
Named graphics pipelines used by material selection and shader lookup.
Definition EcsData.h:54
vec3 eulr
Definition EcsData.h:55
Identifies a named mesh-like asset inside an asset file.
Definition AssetPath.h:40
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:482
Animation playback state for an entity with a skeletal mesh.
Definition EcsData.h:604
Engine::Assets::Animation * currentAnimation
Definition EcsData.h:605
Async glTF image load request tracked by the ECS asset pipeline.
Definition EcsData.h:67
std::filesystem::path path
Source image path.
Definition EcsData.h:71
std::future< tinygltf::Image > future
Future that resolves to decoded tinygltf image data.
Definition EcsData.h:76
Status information for asset loading pipeline.
Definition EcsData.h:568
AssetLoadingStage stage
Definition EcsData.h:569
Is a tag for asset loading. When an asset has been requested for loading but isn't yet created this t...
Definition EcsData.h:92
Tag component indicating bone transforms need GPU upload. Analogous to TransformDirty for world trans...
Definition EcsData.h:616
A bounding sphere for an entity. Used for frustum culling.
Definition EcsData.h:342
Camera properties for projection matrix calculation.
Definition EcsData.h:487
float fov
Vertical field of view in degrees.
Definition EcsData.h:488
Complete result of meshlet generation for all primitives of a mesh. This is returned from the backgro...
Definition EcsData.h:412
std::vector< PrimitiveMeshletResult > primitiveResults
Definition EcsData.h:415
Engine::Assets::Skin * skin
Non-null for skinned meshes.
Definition EcsData.h:417
Stores computed bone matrices for GPU upload.
Definition EcsData.h:624
std::vector< glm::mat4 > boneMatrices
Final skinning matrices (globalTransform * inverseBindMatrix)
Definition EcsData.h:625
uint32_t gpuBoneMatrixOffset
Offset in GPU bone matrix buffer.
Definition EcsData.h:626
Runtime directional light data mirrored from Components::DirectionalLight. sceneNodeEntity points to ...
Definition EcsData.h:504
Loaded EXR header data used before full texture payload loading.
Definition EcsData.h:117
Engine::Assets::Textures::ExrHeader header
Definition EcsData.h:118
Async EXR header load request tracked by the ECS asset pipeline.
Definition EcsData.h:124
std::filesystem::path path
Source EXR path.
Definition EcsData.h:128
std::future< Engine::Assets::Textures::ExrHeader > future
Future that resolves to parsed EXR header metadata.
Definition EcsData.h:133
Async glTF model load request tracked by the ECS asset pipeline.
Definition EcsData.h:154
std::filesystem::path path
Source glTF path.
Definition EcsData.h:158
std::future< tinygltf::Model > future
Future that resolves to a parsed tinygltf model.
Definition EcsData.h:163
ECS wrapper for loaded tinygltf image data.
Definition EcsData.h:189
tinygltf::Image image
Definition EcsData.h:190
Async KTX2 texture load request tracked by the ECS asset pipeline.
Definition EcsData.h:139
std::filesystem::path path
Source KTX2 path.
Definition EcsData.h:143
std::future< Engine::Assets::Textures::Ktx2TextureData > future
Future that resolves to loaded KTX2 texture data.
Definition EcsData.h:148
Tag for ECS entities that provide renderer light data.
Definition EcsData.h:497
Result of LOD hierarchy generation for a mesh primitive. Contains per-cluster and per-group data for ...
Definition EcsData.h:380
UnpackedMeshletData unpackedData
Unpacked GPU data for LOD meshlets.
Definition EcsData.h:389
MeshletData meshletData
Meshlet data for all clusters (extends base meshlet data)
Definition EcsData.h:386
size_t lodLevelCount
Number of LOD levels generated.
Definition EcsData.h:392
std::vector< Engine::Rendering::ClusterLodData > clusters
Per-cluster data (all LOD levels combined)
Definition EcsData.h:382
std::vector< Engine::Rendering::ClusterGroupData > groups
Definition EcsData.h:383
size_t baseLevelClusterCount
Clusters at LOD 0 (finest level)
Definition EcsData.h:391
Material payload waiting to be registered as a material asset.
Definition EcsData.h:169
Engine::Rendering::PipelineNames type
Rendering pipeline selected for the material.
Definition EcsData.h:178
Asset::MeshPath path
Asset key for the material inside its source file.
Definition EcsData.h:173
Engine::Core::MaterialData * data
Material data produced by the loader.
Definition EcsData.h:183
References to MeshComponents for ECS-based iteration. Multiple mesh components can share one SceneNod...
Definition EcsData.h:284
std::vector< Engine::Components::Mesh * > components
Definition EcsData.h:285
The index of the mesh inside the scene. Used to query the mesh index of a scene.
Definition EcsData.h:301
std::vector< Ecs::MeshPrimitive > primitives
Definition EcsData.h:432
Ecs::BoundingSphere boundingSphere
Definition EcsData.h:433
Asset::MeshPath materialPath
Reference to MaterialAsset for pipeline lookup.
Definition EcsData.h:427
std::optional< PrimitiveData > data
Definition EcsData.h:421
std::optional< MeshletData > meshletData
Definition EcsData.h:422
Ecs::BoundingSphere boundingSphere
Definition EcsData.h:425
std::optional< LodHierarchyResult > lodHierarchy
LOD hierarchy (if generated)
Definition EcsData.h:424
Engine::Assets::MaterialHandle material
Definition EcsData.h:426
std::optional< UnpackedMeshletData > unpackedData
Pre-unpacked GPU-ready data.
Definition EcsData.h:423
tinygltf::Mesh mesh
Definition EcsData.h:306
std::vector< meshopt_Meshlet > meshlets
Definition EcsData.h:327
std::vector< uint32_t > meshletVertices
Definition EcsData.h:328
std::vector< uint8_t > meshletTriangles
Definition EcsData.h:329
std::future< tinygltf::Model > future
Definition EcsData.h:447
tinygltf::Node node
Definition EcsData.h:311
ECS wrapper for a loaded tinygltf model.
Definition EcsData.h:196
tinygltf::Model model
Definition EcsData.h:197
GPU-ready packed triangle data (matches shader layout). Stores 3 x 8-bit local indices packed into a ...
Definition EcsData.h:353
uint32_t packed
3 x 8-bit indices: (i2 << 16) | (i1 << 8) | i0
Definition EcsData.h:354
static PackedTriangle pack(uint8_t i0, uint8_t i1, uint8_t i2)
Pack 3 local indices into a single uint32_t.
Definition EcsData.h:357
Stores parent relationships.
Definition EcsData.h:83
entt::entity parent
Definition EcsData.h:84
Temporary holder for raw geometry data during pipeline execution This is used to pass data between pi...
Definition EcsData.h:582
Runtime point light data mirrored from Components::PointLight. sceneNodeEntity points to the transfor...
Definition EcsData.h:520
entt::entity sceneNodeEntity
Definition EcsData.h:526
std::vector< Asset::MeshPath > materialPaths
Resolved material paths per primitive.
Definition EcsData.h:335
std::vector< PrimitiveData > data
Definition EcsData.h:334
Engine::Assets::Skin * skin
Non-null for skinned meshes.
Definition EcsData.h:336
std::vector< uint32_t > indices
Definition EcsData.h:317
std::vector< BoneVertexData > boneVertexData
Empty for static meshes.
Definition EcsData.h:318
std::vector< Vertex > vertices
Definition EcsData.h:316
Result of meshlet generation for a single primitive. Used to transfer data from background thread to ...
Definition EcsData.h:399
UnpackedMeshletData unpackedData
GPU-ready unpacked vertex/triangle data.
Definition EcsData.h:403
std::optional< LodHierarchyResult > lodHierarchy
LOD hierarchy (if generated)
Definition EcsData.h:404
PrimitiveData optimizedData
Optimized vertices and indices.
Definition EcsData.h:401
Metadata about a primitive being loaded from gltf file.
Definition EcsData.h:537
Raw mesh geometry data extracted from gltf file Contains unprocessed vertices and indices.
Definition EcsData.h:546
std::vector< uint32_t > indices
Definition EcsData.h:548
std::vector< Vertex > vertices
Definition EcsData.h:547
Global dirty entity collector for renderer transform uploads.
Definition EcsData.h:238
static std::vector< entt::entity > & get()
Definition EcsData.h:244
static void push(entt::entity entity)
Definition EcsData.h:239
static void reserveAdditional(size_t additionalEntities)
Reserve memory for entities when batch spawning to avoid reallocation.
Definition EcsData.h:258
static std::vector< entt::entity > entities
Definition EcsData.h:269
A struct which allows the engine to find out which SceneNode needs to propagate a dirty flag down the...
Definition EcsData.h:276
std::weak_ptr< Engine::Entities::SceneNode > node
Definition EcsData.h:277
Tag for EnTT which tags entities which should simulate physics.
Definition EcsData.h:204
btCollisionShape * collisionShape
Definition EcsData.h:206
Skeletal mesh data component. Similar to StaticMeshData but references skin/animation.
Definition EcsData.h:595
Engine::Assets::Skin * skin
Definition EcsData.h:598
Engine::Assets::Mesh * assetData
Definition EcsData.h:597
Asset::MeshPath asset
Definition EcsData.h:99
Engine::Components::Mesh * owner
Definition EcsData.h:101
std::optional< Engine::Assets::GltfRenderableHandle > renderable
Definition EcsData.h:97
Engine::Assets::GeometryMeshHandle mesh
Definition EcsData.h:98
Engine::Assets::MeshAssetRef assetRef
Definition EcsData.h:100
Collection of static mesh references attached to one entity.
Definition EcsData.h:109
std::vector< StaticMeshData > meshData
Definition EcsData.h:110
Tag for everything which wants to receive tick events.
Definition EcsData.h:292
Engine::Core::ITickable * tickable
Definition EcsData.h:293
int32_t priority
Definition EcsData.h:294
Tag for transforms that need GPU upload.
Definition EcsData.h:225
Tag for dirty transforms (used by scene graph synchronization)
Definition EcsData.h:216
glm::quat getRotation() const
Transform(glm::vec3 position)
void setPosition(const glm::vec3 &newPosition)
void setScale(const glm::vec3 &newScale)
void setRotation(const glm::vec3 &newRotation)
Transform(glm::mat4 matrix)
void setRotation(const glm::quat &newQuaternion)
void setFacing(const glm::vec3 &newFacing)
glm::vec3 getRotationEuler() const
Transform(glm::vec3 position, glm::quat rotation)
Transform(glm::vec3 position, glm::eulr rotation, glm::vec3 scale)
glm::vec3 getPosition() const
glm::vec3 getScale() const
Transform(glm::quat rotation)
Pre-packed GPU-ready data for a primitive's meshlets. Generated on background thread during meshlet g...
Definition EcsData.h:371
std::vector< PackedTriangle > triangles
Packed triangle indices (4 bytes each)
Definition EcsData.h:373
std::vector< Vertex > vertices
Unpacked vertex data per meshlet.
Definition EcsData.h:372
World-space pose for a tracked XR device.
Definition EcsData.h:637
glm::vec3 position
Device position in world space.
Definition EcsData.h:641
glm::quat orientation
Device orientation in world space.
Definition EcsData.h:646
VR tracking input populated from OpenXR each frame. Used by the IK system to drive skeletal animation...
Definition EcsData.h:633