Nebula
Loading...
Searching...
No Matches
modelcontext.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
9//------------------------------------------------------------------------------
12#include "core/singleton.h"
16#include "model.h"
17#include "nodes/modelnode.h"
18namespace Jobs
19{
20 struct JobFuncContext;
21 struct JobSyncId;
22};
23
24namespace Materials
25{
26 struct MaterialId;
27};
28
29namespace CoreGraphics
30{
31 struct MeshId;
32};
33
34namespace Visibility
35{
36 class VisibilityContext;
37};
38
39namespace Raytracing
40{
42};
43
44namespace Models
45{
46
48{
49 NodeInstance_Active = N_BIT(1) // If set, node is active to render
50 , NodeInstance_LodActive = N_BIT(2) // If set, the node's LOD is active
51 , NodeInstance_AlwaysVisible = N_BIT(3) // Should always resolve to being visible by visibility
52 , NodeInstance_Visible = N_BIT(4) // Set to true if any observer sees it
54};
56
58{
60public:
62
66 virtual ~ModelContext();
67
69 static void Create();
70
72 static void Setup(
74 , const Resources::ResourceName& name
75 , const Util::StringAtom& tag
76 , std::function<void()> finishedCallback
77 , const Graphics::StageMask stage = Graphics::PRIMARY_STAGE_MASK | Graphics::SHADOW_STAGE_MASK
78 );
79
81 static void Setup(
83 , const IO::Path& urn
84 , const Util::StringAtom& tag
85 , std::function<void()> finishedCallback
86 , const Graphics::StageMask stage = Graphics::PRIMARY_STAGE_MASK | Graphics::SHADOW_STAGE_MASK
87 );
89 static void Setup(
91 , const Math::mat4 transform
92 , const Materials::MaterialId material
93 , const CoreGraphics::MeshId mesh
94 , const IndexT primitiveGroup
95 , const Graphics::StageMask stageMask = Graphics::PRIMARY_STAGE_MASK | Graphics::SHADOW_STAGE_MASK
97 , const Util::String debugName = ""
98#endif
99 );
101 static void Setup(
103 , const Util::Array<Math::mat4>& transforms
105 , const Util::Array<Materials::MaterialId>& materials
106 , const Util::Array<IndexT>& primitiveGroups
107 , const Graphics::StageMask stageMask = Graphics::PRIMARY_STAGE_MASK | Graphics::SHADOW_STAGE_MASK
109 , const Util::String debugName = ""
110#endif
111 );
112
114 static void ChangeModel(const Graphics::GraphicsEntityId id, const Resources::ResourceName& name, const Util::StringAtom& tag, std::function<void()> finishedCallback);
116 static void ChangeMaterial(const Graphics::GraphicsEntityId id, const Materials::MaterialId material);
118 static void ChangeMaterial(const Graphics::GraphicsEntityId id, IndexT node, const Materials::MaterialId material);
119
120#if WITH_NEBULA_EDITOR
121 static void ChangeMaterialOnModels(const Models::ModelId mdlId, IndexT node, const Materials::MaterialId material);
122#endif
123
126
128 static void SetTransform(const Graphics::GraphicsEntityId id, const Math::mat4& transform);
133
135 static void SetStageMask(const Graphics::GraphicsEntityId id, const Graphics::StageMask stageMask);
136
139
143 static MaterialInstanceContext& SetupMaterialInstanceContext(const Graphics::GraphicsEntityId id, const IndexT nodeIndex, const MaterialTemplatesGPULang::BatchGroup batch);
145 static MaterialInstanceContext& SetupMaterialInstanceContext(const Graphics::GraphicsEntityId id, const MaterialTemplatesGPULang::BatchGroup batch);
150
152 static void SetAlwaysVisible(const Graphics::GraphicsEntityId id);
153
155 static void UpdateTransforms(const Graphics::FrameContext& ctx);
157 static void WaitForWork(const Graphics::FrameContext& ctx);
158#ifndef PUBLIC_DEBUG
160 static void OnRenderDebug(uint32_t flags);
161#endif
162
165
176
178 {
186
212
213 };
214
220
238 static bool IsLoaded(const Graphics::GraphicsEntityId id);
239
242
243private:
246
247 static void SetupModel(
249 const Util::StringAtom& tag,
250 const std::function<void()>& finishedCallback,
251 const Graphics::StageMask stageMask,
252 Resources::ResourceId mid
253 );
254
257
258 enum
259 {
270 };
271 typedef Ids::IdAllocator<
273 Resources::ResourceId,
278 Math::mat4, // pending transforms
279 Graphics::StageMask, // stage
280 bool, // transform is dirty
281 std::function<void()> // load finished callback
284
286
287 static Threading::Event completionEvent;
288
292 static void Dealloc(Graphics::ContextEntityId id);
293};
294
295//------------------------------------------------------------------------------
303
304//------------------------------------------------------------------------------
307inline void
309{
310 // clean up old stuff, but don't deallocate entity
311 Resources::ResourceId rid = modelContextAllocator.Get<Model_Id>(id.id);
312
313 if (rid != Resources::InvalidResourceId) // decrement model resource
315 rid = Resources::InvalidResourceId;
316
319
320 // Deallocate material instances
321 const auto renderableRange = modelContextAllocator.Get<Model_NodeInstanceStates>(id.id).allocation;
322 for (size_t i = renderableRange.offset; i < renderableRange.offset + renderableRange.size; i++)
323 {
325 }
328
330}
331
332} // namespace Models
Definition graphicscontext.h:175
A path is an abstraction around file paths.
Definition path.h:26
An ID allocator associates an id with a slice in an N number of arrays.
Definition idallocator.h:39
Ids::Id32 Alloc()
Allocate an object.
Definition idallocator.h:46
void Dealloc(Ids::Id32 index)
Deallocate an object. Just places it in freeids array for recycling.
Definition idallocator.h:64
Nebula's bounding box class.
Definition bbox.h:24
Simple transform using position, quaternion, and scale.
Definition transform.h:18
Allocates memory ranges using the TLSF method, with extended handling of padding to better suit GPUs.
Definition rangeallocator.h:46
void Dealloc(const RangeAllocation &allocation)
Deallocate range.
Definition rangeallocator.h:323
static ModelInstance NodeInstances
Definition modelcontext.h:255
static const Util::Array< NodeInstanceFlags > & GetModelRenderableFlags()
Get array to all model node instance flags.
Definition modelcontext.cc:907
static Memory::RangeAllocator TransformInstanceAllocator
Definition modelcontext.h:256
static Util::Dictionary< Models::ModelNode *, MaterialInstanceContext > materialInstanceContexts
Definition modelcontext.h:285
static Math::bbox ComputeBoundingBox(const Graphics::GraphicsEntityId id)
Compute the bounding box for a model.
Definition modelcontext.cc:720
static CoreGraphics::ConstantBufferOffset AllocateInstanceConstants(const Graphics::GraphicsEntityId id, const IndexT nodeIndex, const Materials::BatchIndex batch)
Allocate constant memory for instance constants in this frame.
Definition modelcontext.cc:824
static void SetupModel(Graphics::GraphicsEntityId gfxId, const Util::StringAtom &tag, const std::function< void()> &finishedCallback, const Graphics::StageMask stageMask, Resources::ResourceId mid)
Definition modelcontext.cc:132
static void UpdateTransforms(const Graphics::FrameContext &ctx)
runs before frame is updated
Definition modelcontext.cc:944
static const ModelInstance::Renderable & GetModelRenderables()
Get node renderable context.
Definition modelcontext.cc:916
static void Setup(const Graphics::GraphicsEntityId id, const Util::Array< Math::mat4 > &transforms, const Util::Array< CoreGraphics::MeshId > &meshes, const Util::Array< Materials::MaterialId > &materials, const Util::Array< IndexT > &primitiveGroups, const Graphics::StageMask stageMask=Graphics::PRIMARY_STAGE_MASK|Graphics::SHADOW_STAGE_MASK)
Setup with a list of meshes, materials, bounding boxes and transforms.
static void ChangeMaterial(const Graphics::GraphicsEntityId id, const Materials::MaterialId material)
Changes the material for the first node in the model.
Definition modelcontext.cc:610
static void SetTransform(const Graphics::GraphicsEntityId id, const Math::mat4 &transform)
set the transform for a model
Definition modelcontext.cc:704
static void Setup(const Graphics::GraphicsEntityId id, const Resources::ResourceName &name, const Util::StringAtom &tag, std::function< void()> finishedCallback, const Graphics::StageMask stage=Graphics::PRIMARY_STAGE_MASK|Graphics::SHADOW_STAGE_MASK)
Setup from a model resource.
Definition modelcontext.cc:298
static const Graphics::StageMask GetModelStageMask(const Graphics::GraphicsEntityId id)
Get stage for model.
Definition modelcontext.cc:869
static Memory::RangeAllocator RenderInstanceAllocator
Definition modelcontext.h:256
static void Dealloc(Graphics::ContextEntityId id)
deallocate a slice
Definition modelcontext.h:308
static void ChangeModel(const Graphics::GraphicsEntityId id, const Resources::ResourceName &name, const Util::StringAtom &tag, std::function< void()> finishedCallback)
change model for existing entity
Definition modelcontext.cc:580
Ids::IdAllocator< Graphics::GraphicsEntityId, Resources::ResourceId, Util::Array< uint32_t >, NodeInstanceRange, NodeInstanceRange, Util::Dictionary< Util::StringAtom, IndexT >, Math::mat4, Graphics::StageMask, bool, std::function< void()> > ModelContextAllocator
Definition modelcontext.h:282
static const NodeInstanceRange & GetModelRenderableRange(const Graphics::GraphicsEntityId id)
Get model node instance states.
Definition modelcontext.cc:859
@ Model_FinishedCallback
Definition modelcontext.h:269
@ Model_NodeInstanceRoots
Definition modelcontext.h:262
@ Model_Dirty
Definition modelcontext.h:268
@ Model_Id
Definition modelcontext.h:261
@ Model_GraphicsEntity
Definition modelcontext.h:260
@ Model_NodeLookup
Definition modelcontext.h:265
@ Model_Transform
Definition modelcontext.h:266
@ Model_NodeInstanceTransform
Definition modelcontext.h:263
@ Model_NodeInstanceStates
Definition modelcontext.h:264
@ Model_StageMask
Definition modelcontext.h:267
static void SetStageMask(const Graphics::GraphicsEntityId id, const Graphics::StageMask stageMask)
Set the stage where this model can be seen.
Definition modelcontext.cc:762
static const ModelInstance::Transformable & GetModelTransformables()
Get node transformable context.
Definition modelcontext.cc:925
static const NodeInstanceRange & GetModelTransformableRange(const Graphics::GraphicsEntityId id)
Get model node instance transformables.
Definition modelcontext.cc:879
static const Util::Array< Math::bbox > & GetModelRenderableBoundingBoxes()
Get array to all model node instace bounding boxes.
Definition modelcontext.cc:898
ModelContext()
constructor
Definition modelcontext.cc:52
static Math::mat4 GetTransform(const Graphics::GraphicsEntityId id)
get the transform for a model
Definition modelcontext.cc:743
static MaterialInstanceContext & SetupMaterialInstanceContext(const Graphics::GraphicsEntityId id, const IndexT nodeIndex, const MaterialTemplatesGPULang::BatchGroup batch)
Setup material instance context.
Definition modelcontext.cc:785
static const Models::ModelId GetModel(const Graphics::GraphicsEntityId id)
Get model.
Definition modelcontext.cc:685
static Threading::Event completionEvent
Definition modelcontext.h:287
static void OnRenderDebug(uint32_t flags)
debug rendering
Definition modelcontext.cc:1196
static Threading::Interlocked::AtomicCounter TransformsUpdateCounter
Definition modelcontext.h:241
static void Create()
create context
Definition modelcontext.cc:69
static bool IsLoaded(const Graphics::GraphicsEntityId id)
Get if model is loaded.
Definition modelcontext.cc:934
static ModelContextAllocator modelContextAllocator
Definition modelcontext.h:283
static void SetAlwaysVisible(const Graphics::GraphicsEntityId id)
Set all nodes in the model to always be visible.
Definition modelcontext.cc:845
static const Util::Array< NodeInstanceState > & GetModelRenderableStates()
Get array to all model node states.
Definition modelcontext.cc:889
static void WaitForWork(const Graphics::FrameContext &ctx)
Wait for thread work to finish.
Definition modelcontext.cc:1186
static IndexT GetNodeIndex(const Graphics::GraphicsEntityId id, const Util::StringAtom &name)
Get node index based on name.
Definition modelcontext.cc:772
static Threading::Interlocked::AtomicCounter ConstantsUpdateCounter
Definition modelcontext.h:240
static Graphics::ContextEntityId Alloc()
allocate a new slice for this context
Definition modelcontext.h:299
friend class Visibility::VisibilityContext
Definition modelcontext.h:244
Definition raytracingcontext.h:51
tuple_array_t< MEMBER, TYPES... > & Get(const uint32_t index)
get single item from resource
Definition arrayallocator.h:260
Nebula's dynamic array class.
Definition array.h:61
A collection of key/value pairs with quick value retrieval by key at roughly O(log n).
Definition dictionary.h:35
Implements a fixed size one-dimensional array.
Definition fixedarray.h:20
Definition pinnedarray.h:17
A StringAtom.
Definition stringatom.h:22
Nebula's universal string class.
Definition string.h:50
Acceleration structures are used to enable ray tracing on the GPU by dividing the scene into a BVH.
Definition accelerationstructure.h:24
uint64_t ConstantBufferOffset
Definition config.h:21
uint16_t StageMask
Definition view.h:23
Job system allows for scheduling and execution of a parallel task.
Definition jobs.cc:11
Material special version of variant.
Definition graphicsserver.h:40
void DestroyMaterialInstance(const MaterialInstanceId materialInstance)
Destroy material instance.
Definition material.cc:445
IndexT BatchIndex
Definition material.h:39
A model resource consists of nodes, each of which inhibit some information read from an ....
Definition graphicsserver.h:35
NodeInstanceFlags
Definition modelcontext.h:48
@ NodeInstance_AlwaysVisible
Definition modelcontext.h:51
@ NodeInstance_Moved
Definition modelcontext.h:53
@ NodeInstance_LodActive
Definition modelcontext.h:50
@ NodeInstance_Visible
Definition modelcontext.h:52
@ NodeInstance_Active
Definition modelcontext.h:49
Context dealing with scene management for ray tracing.
Definition modelcontext.h:40
void DiscardResource(const Resources::ResourceId id)
Definition resourceserver.h:526
Util::StringAtom ResourceName
Definition resourceid.h:33
__ImplementEnumBitOperators(System::Cpu::CoreId)
Implements a resource loader for models.
Definition modelcontext.h:35
#define NEBULA_GRAPHICS_DEBUG
Definition config.h:397
A resource table declares a list of resources (ResourceTable in DX12, DescriptorSet in Vulkan).
Definition mesh.h:29
Definition graphicscontext.h:143
Definition graphicsserver.h:63
The graphics entity is only an Id, to which we can attach GraphicsContexts.
Definition graphicsentity.h:16
This class describes the size of a workload for a single thread (can be multiple items).
Definition jobs.h:51
Definition jobs.h:164
Definition material.h:36
Definition material.h:37
A 4x4 single point precision float matrix.
Definition mat4.h:49
Materials::BatchIndex batch
Definition modelcontext.h:217
SizeT constantBufferSize
Definition modelcontext.h:218
The bounding boxes are used by visibility and the states by rendering.
Definition modelcontext.h:189
Util::PinnedArray< 0xFFFF, const MaterialTemplatesGPULang::Entry * > nodeMaterialTemplates
Definition modelcontext.h:198
Util::PinnedArray< 0xFFFF, IndexT > nodePrimitiveGroupIndex
Definition modelcontext.h:204
Util::PinnedArray< 0xFFFF, Util::Tuple< float, float > > nodeLodDistances
Definition modelcontext.h:191
Util::PinnedArray< 0xFFFF, Models::NodeType > nodeTypes
Definition modelcontext.h:200
Util::PinnedArray< 0xFFFF, CoreGraphics::MeshId > nodeMeshes
Definition modelcontext.h:202
Util::PinnedArray< 0xFFFF, Math::bbox > nodeBoundingBoxes
Definition modelcontext.h:190
Util::PinnedArray< 0xFFFF, Util::Tuple< uint32_t, uint32_t > > nodeDrawModifiers
Definition modelcontext.h:205
Util::PinnedArray< 0xFFFF, uint32_t > nodeTransformIndex
Definition modelcontext.h:194
Util::PinnedArray< 0xFFFF, void * > nodeSpecialData
Definition modelcontext.h:207
Util::PinnedArray< 0xFFFF, Models::ModelNode * > nodes
Definition modelcontext.h:201
Util::PinnedArray< 0xFFFF, Materials::MaterialId > nodeMaterials
Definition modelcontext.h:197
Util::PinnedArray< 0xFFFF, uint64_t > nodeSortId
Definition modelcontext.h:195
Util::PinnedArray< 0xFFFF, NodeInstanceState > nodeStates
Definition modelcontext.h:199
Util::PinnedArray< 0xFFFF, float > textureLods
Definition modelcontext.h:193
Util::PinnedArray< 0xFFFF, float > nodeLods
Definition modelcontext.h:192
Util::PinnedArray< 0xFFFF, CoreGraphics::PrimitiveGroup > nodePrimitiveGroup
Definition modelcontext.h:203
Util::PinnedArray< 0xFFFF, NodeInstanceFlags > nodeFlags
Definition modelcontext.h:196
Transforms are only used by the model context to traverse and propagate the transform hierarchy.
Definition modelcontext.h:181
Util::PinnedArray< 0xFFFF, Math::mat4 > origTransforms
Definition modelcontext.h:182
Util::PinnedArray< 0xFFFF, Math::mat4 > nodeTransforms
Definition modelcontext.h:183
Util::PinnedArray< 0xFFFF, uint32_t > nodeParents
Definition modelcontext.h:184
Definition modelcontext.h:178
struct Models::ModelContext::ModelInstance::Renderable renderable
struct Models::ModelContext::ModelInstance::Transformable transformable
Definition modelcontext.h:167
IndexT instancingConstantsIndex
Definition modelcontext.h:172
Util::FixedArray< uint32_t > resourceTableOffsets
Definition modelcontext.h:170
Materials::MaterialInstanceId materialInstance
Definition modelcontext.h:169
IndexT skinningConstantsIndex
Definition modelcontext.h:173
IndexT objectConstantsIndex
Definition modelcontext.h:171
Util::FixedArray< CoreGraphics::ResourceTableId > resourceTables
Definition modelcontext.h:168
IndexT particleConstantsIndex
Definition modelcontext.h:174
Definition model.h:24
Definition model.h:62
Atomic value only used to decrement, increment and read a 32 bit value.
Definition interlocked.h:214
#define N_BIT(x)
Definition types.h:52
int SizeT
Definition types.h:42
unsigned int uint
Definition types.h:33
int IndexT
Definition types.h:41