diff options
author | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
commit | 15740faf9fe9fe4be08965098bbf2947e096aeeb (patch) | |
tree | a730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Shaders/MaterialProperties.cpp |
Diffstat (limited to 'Runtime/Shaders/MaterialProperties.cpp')
-rw-r--r-- | Runtime/Shaders/MaterialProperties.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/Runtime/Shaders/MaterialProperties.cpp b/Runtime/Shaders/MaterialProperties.cpp new file mode 100644 index 0000000..357a73f --- /dev/null +++ b/Runtime/Shaders/MaterialProperties.cpp @@ -0,0 +1,195 @@ +#include "UnityPrefix.h" +#include "MaterialProperties.h" +#include "Material.h" +#include "External/shaderlab/Library/properties.h" +#include "Runtime/Math/Matrix4x4.h" + +inline size_t CalculateSizeFromProperty (const MaterialPropertyBlock::Property& prop) +{ + return prop.rows * prop.cols * prop.arraySize; +} + +MaterialPropertyBlock::MaterialPropertyBlock(Property* props, size_t propCount, float* buffer, size_t bufSize) +{ + m_Properties.assign_external(props, props + propCount); + m_Buffer.assign_external(buffer, buffer + bufSize); +} + +void MaterialPropertyBlock::AddProperty(const ShaderLab::FastPropertyName& name, const float* data, UInt8 rows, UInt8 cols, size_t arraySize) +{ + size_t offset = m_Buffer.size(); + Property prop = { name.index, rows, cols, kTexDimNone, arraySize, offset }; + m_Properties.push_back(prop); + size_t size = rows * cols * arraySize; + m_Buffer.resize_uninitialized(offset + size); + memcpy(&m_Buffer[offset], data, size * sizeof(float)); +} + +void MaterialPropertyBlock::AddPropertyTexture(const ShaderLab::FastPropertyName& name, TextureDimension dim, TextureID tid) +{ + AddProperty (name, reinterpret_cast<float*> (&tid.m_ID), 1, 1, 1); + m_Properties.back().texDim = dim; +} + +void MaterialPropertyBlock::AddPropertyFloat(const ShaderLab::FastPropertyName& name, float val) +{ + AddProperty(name, &val, 1, 1, 1); +} + +void MaterialPropertyBlock::AddPropertyVector(const ShaderLab::FastPropertyName& name, const Vector4f& vec) +{ + AddProperty(name, vec.GetPtr(), 1, 4, 1); +} + +void MaterialPropertyBlock::AddPropertyColor(const ShaderLab::FastPropertyName& name, const ColorRGBAf& col) +{ + ColorRGBAf converted = GammaToActiveColorSpace (col); + AddProperty(name, converted.GetPtr(), 1, 4, 1); +} + +void MaterialPropertyBlock::AddPropertyMatrix(const ShaderLab::FastPropertyName& name, const Matrix4x4f& mat) +{ + AddProperty(name, mat.GetPtr(), 4, 4, 1); +} + +void MaterialPropertyBlock::ReplacePropertyTexture(const ShaderLab::FastPropertyName& name, TextureDimension dim, TextureID tid) +{ + int index = GetPropertyIndex(name); + if (index == -1) + AddPropertyTexture(name, dim, tid); + else + { + Property& prop = m_Properties[index]; + if (prop.rows == 1 && prop.cols == 1 && prop.arraySize == 1) + { + TextureID* buf = reinterpret_cast<TextureID*> (&m_Buffer[prop.offset]); + *buf = tid; + prop.texDim = dim; + } + else + { + ErrorString("The material property is different from already stored property."); + } + } +} + +void MaterialPropertyBlock::ReplacePropertyColor(const ShaderLab::FastPropertyName& name, const ColorRGBAf& col) +{ + ColorRGBAf activeColor = GammaToActiveColorSpace (col); + ReplacePropertyVector (name, *reinterpret_cast<const Vector4f*> (&activeColor)); +} + +void MaterialPropertyBlock::ReplacePropertyVector(const ShaderLab::FastPropertyName& name, const Vector4f& vec) +{ + int index = GetPropertyIndex(name); + if (index == -1) + AddPropertyVector(name, vec); + else + { + const Property& prop = m_Properties[index]; + if (prop.rows == 1 && prop.cols == 4 && prop.arraySize == 1) + { + Vector4f* buf = reinterpret_cast<Vector4f*> (&m_Buffer[prop.offset]); + *buf = vec; + } + else + { + ErrorString("The material property is different from already stored property."); + } + } +} + +void MaterialPropertyBlock::ReplacePropertyFloat(const ShaderLab::FastPropertyName& name, float data) +{ + ReplacePartialFloatProperty(name, data, 1, 0); +} + +void MaterialPropertyBlock::ReplacePartialFloatColorProperty(const ShaderLab::FastPropertyName& name, float data, UInt8 cols, UInt8 colIndex) +{ + ReplacePartialFloatProperty(name, GammaToActiveColorSpace(data), cols, colIndex); +} + +void MaterialPropertyBlock::ReplacePartialFloatProperty(const ShaderLab::FastPropertyName& name, float data, UInt8 cols, UInt8 colIndex) +{ + int index = GetPropertyIndex(name); + if (index == -1) + { + float prop[4] = { 0.0F, 0.0F, 0.0F, 0.0F }; + prop[colIndex] = data; + + AddProperty(name, prop, 1, cols, 1); + } + else + { + const Property& prop = m_Properties[index]; + if (prop.rows == 1 && prop.cols == cols && prop.arraySize == 1) + { + float* buffer = reinterpret_cast<float*> (&m_Buffer[prop.offset]); + buffer[colIndex] = data; + } + else + { + ErrorString("The material property is different from already stored property."); + } + } +} + +int MaterialPropertyBlock::GetPropertyIndex (const ShaderLab::FastPropertyName& name) const +{ + for (int i=0;i<m_Properties.size();i++) + { + if (m_Properties[i].nameIndex == name.index) + return i; + } + return -1; +} + +const void* MaterialPropertyBlock::Find(const ShaderLab::FastPropertyName& name, UInt8 rows, UInt8 cols, size_t arraySize) const +{ + for (size_t i = 0, n = m_Properties.size(); i != n; ++i) + { + const Property& prop = m_Properties[i]; + if (name.index == prop.nameIndex && prop.cols == cols && prop.rows == rows) + return &m_Buffer[prop.offset]; + } + return NULL; +} + + +const float* MaterialPropertyBlock::FindFloat(const ShaderLab::FastPropertyName& name) const +{ + return static_cast<const float*> (Find(name, 1, 1, 1)); +} + +const Vector4f* MaterialPropertyBlock::FindVector(const ShaderLab::FastPropertyName& name) const +{ + return static_cast<const Vector4f*> (Find(name, 1, 4, 1)); +} + +const Matrix4x4f* MaterialPropertyBlock::FindMatrix(const ShaderLab::FastPropertyName& name) const +{ + return static_cast<const Matrix4x4f*> (Find(name, 4, 4, 1)); +} + +bool MaterialPropertyBlock::GetColor(const ShaderLab::FastPropertyName& name, ColorRGBAf& outColor) const +{ + const ColorRGBAf* color = static_cast<const ColorRGBAf*> (Find(name, 1, 4, 1)); + if (color != NULL) + { + outColor = ActiveToGammaColorSpace(*color); + return true; + } + else + return false; +} + +const TextureID MaterialPropertyBlock::FindTexture(const ShaderLab::FastPropertyName& name) const +{ + for (size_t i = 0, n = m_Properties.size(); i != n; ++i) + { + const Property& prop = m_Properties[i]; + if (name.index == prop.nameIndex && prop.texDim != kTexDimNone) + return TextureID(*(const int*)&m_Buffer[prop.offset]); + } + return TextureID(); +} |