Nebula
Loading...
Searching...
No Matches
material.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
11//------------------------------------------------------------------------------
12#include "ids/id.h"
13#include "ids/idallocator.h"
16#include "coregraphics/buffer.h"
17#include "materialvariant.h"
18
19
21{
22struct Entry;
23enum class BatchGroup;
24};
25
27{
28struct Entry;
29enum class BatchGroup;
30};
31
32namespace Materials
33{
34
35struct ShaderConfigBatchTexture;
37ID_32_24_8_NAMED_TYPE(MaterialInstanceId, instance, materialId, materialGeneration, material); // 32 bits instance, 24 bits material, 8 bits type
38
40
42{
43 Graphics = 0x1, // Bindless material buffers needs a graphics queue update
44 Compute = 0x2, // Bindless material buffers needs a compute queue update
46};
47
48#ifdef WITH_NEBULA_EDITOR
49struct MaterialBindlessBufferBinding
50{
51 char* buffer = nullptr;
52 bool* dirtyFlag = nullptr;
53};
54#endif
55
57MaterialId CreateMaterial(const MaterialTemplatesGPULang::Entry* entry, const Util::StringAtom& name);
59void DestroyMaterial(const MaterialId id);
60
62void MaterialSetTexture(const MaterialId mat, const ShaderConfigBatchTexture* bind, const Resources::ResourceId tex);
64void MaterialSetTexture(const MaterialId mat, uint name, const Resources::ResourceId tex);
66void MaterialSetTextureBindless(const MaterialId mat, uint name, const uint handle, const uint offset, const Resources::ResourceId tex);
68void MaterialSetConstants(const MaterialId mat, const void* data, const uint size);
70void MaterialSetConstant(const MaterialId mat, const void* data, const uint size, const uint offset);
72void MaterialSetData(const MaterialId mat, const void* data, const uint size);
73
75void MaterialSetBufferBinding(const MaterialId id, IndexT index);
78
80const Util::StringAtom& MaterialGetName(const MaterialId id);
81
83void MaterialAddLODTexture(const MaterialId mat, const Resources::ResourceId tex);
85void MaterialSetLowestLod(const MaterialId mat, float lod);
86
88void MaterialApply(const MaterialId id, const CoreGraphics::CmdBufferId buf, IndexT index);
89
91const MaterialTemplatesGPULang::Entry* MaterialGetTemplate(const MaterialId mat);
93const Materials::BatchIndex MaterialGetBatchIndex(const MaterialId mat, const MaterialTemplatesGPULang::BatchGroup batch);
95uint64_t MaterialGetSortCode(const MaterialId mat);
96
97#ifdef WITH_NEBULA_EDITOR
99void MaterialBindlessForEditor(const MaterialId mat, char* buf, bool* dirtyFlag);
101const MaterialBindlessBufferBinding& MaterialGetBindlessForEditor(const MaterialId mat);
103ubyte* MaterialGetConstants(const MaterialId mat);
105const Resources::ResourceId MaterialGetTexture(const MaterialId mat, const IndexT i);
107void MaterialInvalidate(const MaterialId mat);
109void MaterialSetTemplate(const MaterialId mat, const MaterialTemplatesGPULang::Entry* temp);
110#endif
111
125
131
132enum
133{
145#ifdef WITH_NEBULA_EDITOR
146 , Material_TextureValues
147 , Material_BufferPointer
148#endif
149};
150
151
152typedef Ids::IdAllocator<
154 float,
156 Util::FixedArray<CoreGraphics::ResourceTableId>, // surface level resource table, mapped batch -> table
157 CoreGraphics::BufferId, // Material buffer
158 Util::FixedArray<Util::FixedArray<CoreGraphics::ResourceTableId>>, // instance level resource table, mapped batch -> table
159 Util::FixedArray<Util::Tuple<IndexT, SizeT>>, // instance level instance buffer, mapped batch -> memory + size
162 IndexT, // global material buffer binding (based on ShaderConfig::PrototypeHash)
163 const MaterialTemplatesGPULang::Entry* // template
164#ifdef WITH_NEBULA_EDITOR
166 , MaterialBindlessBufferBinding
167#endif
170
174void DestroyMaterialInstance(const MaterialInstanceId materialInstance);
175
179void MaterialInstanceApply(const MaterialInstanceId id, const CoreGraphics::CmdBufferId buf, IndexT index, IndexT bufferIndex);
180
181
184
189typedef Ids::IdAllocator<
190 uint
193
194} // namespace Materials
An ID allocator associates an id with a slice in an N number of arrays.
Definition idallocator.h:39
Nebula's dynamic array class.
Definition array.h:61
Implements a fixed size one-dimensional array.
Definition fixedarray.h:20
A StringAtom.
Definition stringatom.h:22
#define ID_32_24_8_NAMED_TYPE(x, id32_name, id24_name, id8_name, combined_name)
Definition id.h:46
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
Implements the shader server used by Vulkan.
Definition cameramanager.h:22
Definition material.h:27
Materials represent a set of settings and a correlated shader configuration, which tells the engine w...
Definition material.h:21
Material special version of variant.
Definition graphicsserver.h:40
void DestroyMaterial(const MaterialId id)
Destroy material.
Definition material.cc:163
const Materials::BatchIndex MaterialGetBatchIndex(const MaterialId mat, const MaterialTemplatesGPULang::BatchGroup batch)
Get batch index from code.
Definition material.cc:345
void DestroyMaterialInstance(const MaterialInstanceId materialInstance)
Destroy material instance.
Definition material.cc:445
void MaterialApply(const MaterialId id, const CoreGraphics::CmdBufferId buf, IndexT index)
Apply material.
Definition material.cc:421
const MaterialTemplatesGPULang::Entry * MaterialGetTemplate(const MaterialId mat)
Get material shader config.
Definition material.cc:336
void MaterialSetConstant(const MaterialId mat, const void *data, const uint size, const uint offset)
Set a material constant.
Definition material.cc:255
void MaterialInstanceApply(const MaterialInstanceId id, const CoreGraphics::CmdBufferId buf, IndexT index, IndexT bufferIndex)
Apply material instance.
Definition material.cc:468
Ids::IdAllocator< uint > MaterialInstanceAllocator
Definition material.h:191
MaterialInstanceMembers
Definition material.h:186
@ MaterialInstance_Offsets
Definition material.h:187
IndexT MaterialGetBufferBinding(const MaterialId id)
Get material GPU buffer binding.
Definition material.cc:286
uint64_t MaterialGetSortCode(const MaterialId mat)
Get sort code.
Definition material.cc:354
void MaterialSetTextureBindless(const MaterialId mat, uint name, const uint handle, const uint offset, const Resources::ResourceId tex)
Set bindless texture.
Definition material.cc:218
MaterialId CreateMaterial(const MaterialTemplatesGPULang::Entry *entry, const Util::StringAtom &name)
Create material.
Definition material.cc:22
void MaterialAddLODTexture(const MaterialId mat, const Resources::ResourceId tex)
Add texture to LOD update.
Definition material.cc:304
SizeT MaterialInstanceBufferSize(const MaterialInstanceId mat, const BatchIndex batch)
Get material instance buffer size for batch.
Definition material.cc:487
@ Material_InstanceTables
Definition material.h:139
@ Material_Name
Definition material.h:134
@ Material_Textures
Definition material.h:141
@ Material_MinLOD
Definition material.h:135
@ Material_Buffer
Definition material.h:138
@ Material_BufferOffset
Definition material.h:143
@ Material_Constants
Definition material.h:142
@ Material_LODTextures
Definition material.h:136
@ Material_Template
Definition material.h:144
@ Material_Table
Definition material.h:137
@ Material_InstanceBuffers
Definition material.h:140
MaterialAllocator materialAllocator
Definition material.cc:14
void MaterialSetBufferBinding(const MaterialId id, IndexT index)
Set material GPU buffer binding.
Definition material.cc:277
MaterialInstanceAllocator materialInstanceAllocator
Definition material.cc:15
void MaterialSetLowestLod(const MaterialId mat, float lod)
Update LOD for material.
Definition material.cc:317
IndexT BatchIndex
Definition material.h:39
CoreGraphics::ConstantBufferOffset MaterialInstanceAllocate(const MaterialInstanceId mat, const BatchIndex batch)
Allocate instance constants, call per frame when instance constants are needed.
Definition material.cc:454
BindlessBufferDirtyBits
Definition material.h:42
@ Compute
Definition material.h:44
@ All
Definition material.h:45
const Util::StringAtom & MaterialGetName(const MaterialId id)
Get name of material.
Definition material.cc:295
void MaterialSetTexture(const MaterialId mat, const ShaderConfigBatchTexture *bind, const Resources::ResourceId tex)
Set texture.
Definition material.cc:172
material
Definition material.h:37
MaterialInstanceId CreateMaterialInstance(const MaterialId material)
Create material instance.
Definition material.cc:430
Ids::IdAllocator< Util::StringAtom, float, Util::Array< Resources::ResourceId >, Util::FixedArray< CoreGraphics::ResourceTableId >, CoreGraphics::BufferId, Util::FixedArray< Util::FixedArray< CoreGraphics::ResourceTableId > >, Util::FixedArray< Util::Tuple< IndexT, SizeT > >, Util::FixedArray< Util::Array< MaterialTexture > >, Util::FixedArray< Util::Array< MaterialConstant > >, IndexT, const MaterialTemplatesGPULang::Entry * > MaterialAllocator
Definition material.h:168
void MaterialSetConstants(const MaterialId mat, const void *data, const uint size)
Set all material constants.
Definition material.cc:236
void MaterialSetData(const MaterialId mat, const void *data, const uint size)
Set the entire material buffer.
Definition material.cc:266
#define RESOURCE_ID_TYPE(type)
Definition resourceid.h:41
Definition buffer.h:23
Definition commandbuffer.h:176
texture type
Definition texture.h:25
Definition materialtemplatetypes.h:67
Definition materialtemplatetypes.h:153
IndexT binding
Definition material.h:117
MaterialVariant defaultValue
Definition material.h:114
CoreGraphics::BufferId buffer
Definition material.h:118
MaterialConstant()
Definition material.h:120
bool instanceConstant
Definition material.h:116
IndexT bufferIndex
Definition material.h:115
Definition material.h:36
Definition material.h:37
Definition material.h:127
CoreGraphics::TextureId defaultValue
Definition material.h:128
IndexT slot
Definition material.h:129
Definition materialvariant.h:15
Definition shaderconfig.h:34
unsigned char ubyte
Definition types.h:36
int SizeT
Definition types.h:42
unsigned int uint
Definition types.h:33
int IndexT
Definition types.h:41