From 93d680926ed0272b475b5838ba08e3c964ca9aac Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 9 Jan 2020 16:53:30 +0800 Subject: [PATCH] add new MaterialComponent --- inc/hgl/graph/Material.h | 109 +++++---------------------- inc/hgl/graph/MaterialComponent.h | 87 +++++++++++++++++++++ src/SceneGraph/CMakeLists.txt | 30 ++++++-- src/SceneGraph/Material.cpp | 90 +++++++++++----------- src/SceneGraph/MaterialComponent.cpp | 42 +++++++++++ 5 files changed, 213 insertions(+), 145 deletions(-) create mode 100644 inc/hgl/graph/MaterialComponent.h create mode 100644 src/SceneGraph/MaterialComponent.cpp diff --git a/inc/hgl/graph/Material.h b/inc/hgl/graph/Material.h index adb18ada..ca4b83db 100644 --- a/inc/hgl/graph/Material.h +++ b/inc/hgl/graph/Material.h @@ -1,97 +1,26 @@ #ifndef HGL_GRAPH_MATERIAL_INCLUDE #define HGL_GRAPH_MATERIAL_INCLUDE -#include -namespace hgl -{ - namespace graph +#include +BEGIN_MATERIAL_NAMESPACE + enum class BlendMode { - class Material - { - };// + Opaque=0, + Mask, + Alpha, + Additive, + Modulate, + PreMultiAlpha, // 预计算好一半的Alpha - enum class MaterialBlendMode - { - Opaque=0, - Mask, - Alpha, - Additive, - Modulate, - PreMultiAlpha, //预计算好一半的Alpha + BEGIN_RANGE =Opaque, + END_RANGE =PreMultiAlpha, + RANGE_SIZE =END_RANGE-BEGIN_RANGE+1 + };// - BEGIN_RANGE =Opaque, - END_RANGE =PreMultiAlpha, - RANGE_SIZE =END_RANGE-BEGIN_RANGE+1 - };// - - enum class MaterialComponent - { - Color=0, - Normal, - Tangent, - - Metallic, - Roughness, - Emissive, - Specular, - - Anisotropy, - - Opacity, - - SubsurfaceColor, - AmbientOcclusion, - Refraction, - - Rotation, - IOR, - - ShadingModel, - - BEGIN_RANGE =Opaque, - END_RANGE =ShadingModel, - RANGE_SIZE =END_RANGE-BEGIN_RANGE+1, - };// - - enum class MaterialComponentBit - { -#define MC_BIT_DEFINE(name) name=1< + +#define BEGIN_MATERIAL_NAMESPACE namespace hgl{namespace graph{namespace material{ +#define END_MATERIAL_NAMESPACE }}} + +BEGIN_MATERIAL_NAMESPACE + enum class Component + { + ShadingModel=0, + + Color, + Opacity, + Normal, + + Metallic, + Roughness, + + Emissive, + Refraction, + + AO, + SSS, + Height, + + RIM, + ClearCoat, + Anisotropy, + + BEGIN_RANGE =ShadingModel, + END_RANGE =Anisotropy, + RANGE_SIZE =END_RANGE-BEGIN_RANGE+1, + };// + + enum class ComponentBit + { + #define MC_BIT_DEFINE(name) name=1<<(uint)Component::name + MC_BIT_DEFINE(ShadingModel ), + + MC_BIT_DEFINE(Color ), + MC_BIT_DEFINE(Opacity ), + MC_BIT_DEFINE(Normal ), + + MC_BIT_DEFINE(Metallic ), + MC_BIT_DEFINE(Roughness ), + + MC_BIT_DEFINE(Emissive ), + MC_BIT_DEFINE(Refraction ), + + MC_BIT_DEFINE(AO ), + MC_BIT_DEFINE(SSS ), + MC_BIT_DEFINE(Height ), + + MC_BIT_DEFINE(RIM ), + MC_BIT_DEFINE(ClearCoat ), + MC_BIT_DEFINE(Anisotropy ), + #undef MC_BIT_DEFINE + };//enum class ComponentBit + + enum class ComponentDataType + { + Bool=0, + Float, + Int, + Uint, + };// + + using ComponentBitsConfig=uint32; + + constexpr ComponentBitsConfig MCC_PureColor =uint32(ComponentBit::Color); + constexpr ComponentBitsConfig MCC_PureNormal =uint32(ComponentBit::Normal); + constexpr ComponentBitsConfig MCC_ColorNormal =uint32(ComponentBit::Color)|uint32(ComponentBit::Normal); + constexpr ComponentBitsConfig MCC_CNMR =uint32(ComponentBit::Color)|uint32(ComponentBit::Normal)|uint32(ComponentBit::Metallic)|uint32(ComponentBit::Roughness); + + struct ComponentConfig + { + Component comp; ///<成份ID + ComponentDataType type; ///<数据类型 + uint channels; ///<通道数 + bool LinearColorspace; ///<是要求线性颜色空间 + }; + + const ComponentConfig *GetConfig(const enum class Component c); +END_MATERIAL_NAMESPACE +#endif//HGL_GRAPH_MATERIAL_COMPONENT_INCLUDE diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index ca0a4142..617e65d9 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -1,5 +1,18 @@ -SET(SCENE_GRAPH_HEADER ${ROOT_INCLUDE_PATH}/hgl/graph/Coordinate.h - ${ROOT_INCLUDE_PATH}/hgl/graph/AABox.h +SET(SG_MATERIAL_SOURCE ${ROOT_INCLUDE_PATH}/hgl/graph/MaterialComponent.h + ${ROOT_INCLUDE_PATH}/hgl/graph/Material.h + + MaterialComponent.cpp + Material.cpp) + +SOURCE_GROUP("Material" FILES ${SG_MATERIAL_SOURCE}) + +SET(SG_VERTEX_SOURCE ${ROOT_INCLUDE_PATH}/hgl/graph/VertexBufferCreater.h + ${ROOT_INCLUDE_PATH}/hgl/graph/VertexBuffer.h) + +SOURCE_GROUP("VertexBuffer" FILES ${SG_VERTEX_SOURCE}) + +SET(SCENE_GRAPH_HEADER ${ROOT_INCLUDE_PATH}/hgl/graph/Coordinate.h + ${ROOT_INCLUDE_PATH}/hgl/graph/AABox.h ${ROOT_INCLUDE_PATH}/hgl/graph/Camera.h ${ROOT_INCLUDE_PATH}/hgl/graph/Light.h ${ROOT_INCLUDE_PATH}/hgl/graph/SceneDB.h @@ -7,8 +20,6 @@ ${ROOT_INCLUDE_PATH}/hgl/graph/SceneOrient.h ${ROOT_INCLUDE_PATH}/hgl/graph/RenderableInstance.h ${ROOT_INCLUDE_PATH}/hgl/graph/RenderList.h - ${ROOT_INCLUDE_PATH}/hgl/graph/VertexBufferCreater.h - ${ROOT_INCLUDE_PATH}/hgl/graph/VertexBuffer.h ${ROOT_INCLUDE_PATH}/hgl/graph/InlineGeometry.h #${ROOT_INCLUDE_PATH}/hgl/graph/Mesh.h #${ROOT_INCLUDE_PATH}/hgl/graph/Material.h @@ -16,14 +27,14 @@ ) SET(SCENE_GRAPH_SOURCE Coordinate.cpp - AABox.cpp + AABox.cpp Camera.cpp RenderList.cpp SceneDB.cpp - SceneNode.cpp + SceneNode.cpp SceneOrient.cpp InlineGeometry.cpp - #InlinePipeline.cpp + #InlinePipeline.cpp #Material.cpp #Mesh.cpp #SceneFile.cpp @@ -33,4 +44,7 @@ SOURCE_GROUP("Header Files" FILES ${SCENE_GRAPH_HEADER}) SOURCE_GROUP("Source Files" FILES ${SCENE_GRAPH_SOURCE}) add_cm_library(ULRE.SceneGraph "ULRE" ${SCENE_GRAPH_HEADER} - ${SCENE_GRAPH_SOURCE}) \ No newline at end of file + ${SCENE_GRAPH_SOURCE} + + ${SG_MATERIAL_SOURCE} + ${SG_VERTEX_SOURCE}) diff --git a/src/SceneGraph/Material.cpp b/src/SceneGraph/Material.cpp index 12bce4d8..ed175174 100644 --- a/src/SceneGraph/Material.cpp +++ b/src/SceneGraph/Material.cpp @@ -1,68 +1,64 @@ #include #include #include -#include +#include -namespace hgl -{ - namespace graph - { - bool LoadMaterialFile(MaterialData &md,const OSString &filename)//,Texture **tex_list) - { - io::FileInputStream fis; - io::LEDataInputStream dis(&fis); +BEGIN_MATERIAL_NAMESPACE + //bool LoadMaterialFile(MaterialData &md,const OSString &filename)//,Texture **tex_list) + //{ + // io::FileInputStream fis; + // io::LEDataInputStream dis(&fis); - if(!fis.Open(filename)) - RETURN_FALSE; + // if(!fis.Open(filename)) + // RETURN_FALSE; - uint8 flag[9]; + // uint8 flag[9]; - if(dis.ReadFully(flag,9)!=9) - RETURN_FALSE; + // if(dis.ReadFully(flag,9)!=9) + // RETURN_FALSE; - if(memcmp(flag,"Material\x1A",9)) - RETURN_FALSE; + // if(memcmp(flag,"Material\x1A",9)) + // RETURN_FALSE; - uint8 ver; + // uint8 ver; - if(!dis.ReadUint8(ver))RETURN_FALSE; + // if(!dis.ReadUint8(ver))RETURN_FALSE; - if(ver!=1)RETURN_FALSE; + // if(ver!=1)RETURN_FALSE; - if(dis.ReadFloat(md.diffuse,3)!=3)RETURN_FALSE; - if(dis.ReadFloat(md.specular,3)!=3)RETURN_FALSE; - if(dis.ReadFloat(md.ambient,3)!=3)RETURN_FALSE; - if(dis.ReadFloat(md.emission,3)!=3)RETURN_FALSE; + // if(dis.ReadFloat(md.diffuse,3)!=3)RETURN_FALSE; + // if(dis.ReadFloat(md.specular,3)!=3)RETURN_FALSE; + // if(dis.ReadFloat(md.ambient,3)!=3)RETURN_FALSE; + // if(dis.ReadFloat(md.emission,3)!=3)RETURN_FALSE; - if(!dis.ReadFloat(md.shininess))RETURN_FALSE; - if(!dis.ReadBool(md.wireframe))RETURN_FALSE; - if(!dis.ReadBool(md.two_sided))RETURN_FALSE; + // if(!dis.ReadFloat(md.shininess))RETURN_FALSE; + // if(!dis.ReadBool(md.wireframe))RETURN_FALSE; + // if(!dis.ReadBool(md.two_sided))RETURN_FALSE; - if(!dis.ReadUint8(md.tex_count))RETURN_FALSE; + // if(!dis.ReadUint8(md.tex_count))RETURN_FALSE; - md.Init(md.tex_count); + // md.Init(md.tex_count); - for(uint8 i=0;itype=(TextureType)tt; + // uint8 tt; + // if(!dis.ReadUint8(tt))RETURN_FALSE; + // mtd->type=(TextureType)tt; - if(!dis.ReadInt32(mtd->tex_id))RETURN_FALSE; - if(!dis.ReadUint8(mtd->uvindex))RETURN_FALSE; - if(!dis.ReadFloat(mtd->blend))RETURN_FALSE; - if(!dis.ReadUint8(mtd->op))RETURN_FALSE; + // if(!dis.ReadInt32(mtd->tex_id))RETURN_FALSE; + // if(!dis.ReadUint8(mtd->uvindex))RETURN_FALSE; + // if(!dis.ReadFloat(mtd->blend))RETURN_FALSE; + // if(!dis.ReadUint8(mtd->op))RETURN_FALSE; - uint8 wm[2]; - if(!dis.ReadUint8(wm,2))RETURN_FALSE; - hgl_typecpy(mtd->wrap_mode,wm,2); + // uint8 wm[2]; + // if(!dis.ReadUint8(wm,2))RETURN_FALSE; + // hgl_typecpy(mtd->wrap_mode,wm,2); - //mtl.SetTexture(mtd->type,tex_list[mtd->tex_id]); - } + // //mtl.SetTexture(mtd->type,tex_list[mtd->tex_id]); + // } - return(true); - } - }//namespace graph -}//namespace hgl + // return(true); + //} +END_MATERIAL_NAMESPACE diff --git a/src/SceneGraph/MaterialComponent.cpp b/src/SceneGraph/MaterialComponent.cpp new file mode 100644 index 00000000..a11bfcb1 --- /dev/null +++ b/src/SceneGraph/MaterialComponent.cpp @@ -0,0 +1,42 @@ +#include + +BEGIN_MATERIAL_NAMESPACE + namespace + { + constexpr ComponentConfig material_component_config_list[]= + { +#define MCC_DEFINE(name,dt,c,lc) {Component::name,ComponentDataType::dt,c,lc} + + MCC_DEFINE(ShadingModel, Uint, 1, false ), + + MCC_DEFINE(Color, Float, 3, true ), + + MCC_DEFINE(Opacity, Float, 1, false ), + MCC_DEFINE(Normal, Float, 3, false ), + + MCC_DEFINE(Metallic, Float, 1, false ), + MCC_DEFINE(Roughness, Float, 1, false ), + + MCC_DEFINE(Emissive, Float, 3, true ), + MCC_DEFINE(Refraction, Float, 1, false ), + + MCC_DEFINE(AO, Float, 1, false ), + MCC_DEFINE(SSS, Float, 1, false ), + MCC_DEFINE(Height, Float, 1, false ), + + MCC_DEFINE(RIM, Float, 1, false ), + MCC_DEFINE(ClearCoat, Float, 1, false ), + MCC_DEFINE(Anisotropy, Float, 1, false ) + +#undef MCC_DEFINE + }; + };//namespace + + const ComponentConfig *GetConfig(const enum class Component c) + { + if(c<=Component::BEGIN_RANGE + ||c>=Component::END_RANGE)return(nullptr); + + return material_component_config_list+(uint)c; + } +END_MATERIAL_NAMESPACE