ULRE/inc/hgl/graph/VKMaterial.h

109 lines
3.3 KiB
C
Raw Normal View History

2019-04-25 10:09:56 +08:00
#ifndef HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
#define HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
#include<hgl/graph/VK.h>
#include<hgl/type/Map.h>
2020-09-05 17:54:21 +08:00
#include<hgl/type/String.h>
#include<hgl/graph/VKShaderModuleMap.h>
#include<hgl/graph/VKDescriptorSetType.h>
2019-04-25 10:09:56 +08:00
VK_NAMESPACE_BEGIN
using ShaderStageCreateInfoList=List<VkPipelineShaderStageCreateInfo>;
2023-03-20 13:35:04 +08:00
using MaterialParameterArray=MaterialParameters *[DESCRIPTOR_SET_TYPE_COUNT];
2023-02-22 21:50:18 +08:00
2021-09-14 20:31:15 +08:00
struct MaterialData
2019-04-25 10:09:56 +08:00
{
2021-09-14 20:31:15 +08:00
UTF8String name;
VertexInput *vertex_input;
ShaderModuleMap *shader_maps;
2021-09-13 20:39:25 +08:00
2023-03-21 21:46:16 +08:00
MaterialDescriptorManager *desc_manager;
2021-09-14 20:31:15 +08:00
ShaderStageCreateInfoList shader_stage_list;
2021-09-14 20:31:15 +08:00
PipelineLayoutData *pipeline_layout_data;
2023-02-22 21:50:18 +08:00
MaterialParameterArray mp_array;
2023-05-09 22:03:02 +08:00
uint8 *mi_data; ///<材质实例数据区
uint32_t mi_size; ///<单个材质实例数据长度
2021-09-14 20:31:15 +08:00
private:
friend class Material;
~MaterialData();
};//struct MaterialData
/**
* <br>
* shaderDescriptorSetLayoutCreater
*/
class Material
{
MaterialData *data;
2023-05-09 22:03:02 +08:00
uint32_t mi_count; ///<材质数量
2021-09-14 20:31:15 +08:00
private:
friend GPUDevice;
MaterialData *GetMaterialData(){return data;}
2019-04-25 10:09:56 +08:00
public:
2023-05-09 22:03:02 +08:00
Material(MaterialData *);
virtual ~Material();
2019-04-25 10:09:56 +08:00
2021-09-14 20:31:15 +08:00
const UTF8String & GetName ()const{return data->name;}
const VertexInput * GetVertexInput ()const{return data->vertex_input;}
const ShaderStageCreateInfoList & GetStageList ()const{return data->shader_stage_list;}
2023-03-21 21:46:16 +08:00
const MaterialDescriptorManager * GetDescriptorSets ()const{return data->desc_manager;}
const VkPipelineLayout GetPipelineLayout ()const;
2021-09-14 20:31:15 +08:00
const PipelineLayoutData * GetPipelineLayoutData ()const{return data->pipeline_layout_data;}
2023-05-09 22:03:02 +08:00
public:
const uint32_t GetMICount ()const{return mi_count;}
const uint32_t GetMISize ()const{return mi_size;}
const void * GetMIData ()const{return data->mi_data;}
template<typename T>
T * GetMIData (const uint32_t index)const{return data->mi_data?(T *)(data->mi_data+index*mi_size):nullptr;}
template<typename T>
bool WriteMIData (const uint32_t index,const T *data)
{
if(!data->mi_data)return(false);
if(index>=mi_count)return(false);
memcpy(mi_data+index*mi_size,data,mi_size);
return(true);
}
public:
MaterialParameters * GetMP (const DescriptorSetType &type)
{
2023-02-22 21:50:18 +08:00
RANGE_CHECK_RETURN_NULLPTR(type)
return data->mp_array[size_t(type)];
}
2023-02-22 21:50:18 +08:00
const bool hasSet (const DescriptorSetType &type)const;
VIL * CreateVIL(const VILConfig *format_map=nullptr);
bool Release(VIL *);
const uint GetVILCount();
};//class Material
2023-03-24 22:14:43 +08:00
using MaterialSets=SortedSets<Material *>;
2019-04-25 10:09:56 +08:00
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE