diff --git a/modules/naprender/src/bufferbinding.cpp b/modules/naprender/src/bufferbinding.cpp index 701a4eaa18..f04497322e 100644 --- a/modules/naprender/src/bufferbinding.cpp +++ b/modules/naprender/src/bufferbinding.cpp @@ -39,6 +39,14 @@ RTTI_BEGIN_CLASS(nap::BufferBindingVec4) RTTI_PROPERTY("Buffer", &nap::BufferBindingVec4::mBuffer, nap::rtti::EPropertyMetaData::Required) RTTI_END_CLASS +RTTI_BEGIN_CLASS(nap::BufferBindingIVec4) + RTTI_PROPERTY("Buffer", &nap::BufferBindingIVec4::mBuffer, nap::rtti::EPropertyMetaData::Required) +RTTI_END_CLASS + +RTTI_BEGIN_CLASS(nap::BufferBindingUVec4) + RTTI_PROPERTY("Buffer", &nap::BufferBindingUVec4::mBuffer, nap::rtti::EPropertyMetaData::Required) +RTTI_END_CLASS + RTTI_BEGIN_CLASS(nap::BufferBindingMat4) RTTI_PROPERTY("Buffer", &nap::BufferBindingMat4::mBuffer, nap::rtti::EPropertyMetaData::Required) RTTI_END_CLASS diff --git a/modules/naprender/src/bufferbinding.h b/modules/naprender/src/bufferbinding.h index e817cfe679..ee17d82980 100644 --- a/modules/naprender/src/bufferbinding.h +++ b/modules/naprender/src/bufferbinding.h @@ -177,6 +177,8 @@ namespace nap using BufferBindingVec2 = TypedBufferBindingNumeric; using BufferBindingVec3 = TypedBufferBindingNumeric; using BufferBindingVec4 = TypedBufferBindingNumeric; + using BufferBindingIVec4 = TypedBufferBindingNumeric; + using BufferBindingUVec4 = TypedBufferBindingNumeric; using BufferBindingMat4 = TypedBufferBindingNumeric; diff --git a/modules/naprender/src/bufferbindinginstance.cpp b/modules/naprender/src/bufferbindinginstance.cpp index 8eca52ef72..a12db8ab33 100644 --- a/modules/naprender/src/bufferbindinginstance.cpp +++ b/modules/naprender/src/bufferbindinginstance.cpp @@ -35,6 +35,14 @@ RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingVec4Instance) RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&) RTTI_END_CLASS +RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingIVec4Instance) + RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&) +RTTI_END_CLASS + +RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingUVec4Instance) + RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&) +RTTI_END_CLASS + RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingMat4Instance) RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&) RTTI_END_CLASS @@ -159,6 +167,16 @@ namespace nap return createBufferBindingInstance( binding_name, binding, *value_array_declaration, bufferChangedCallback, errorState); } + else if (value_array_declaration->mElementType == EShaderVariableValueType::IVec4) + { + return createBufferBindingInstance( + binding_name, binding, *value_array_declaration, bufferChangedCallback, errorState); + } + else if (value_array_declaration->mElementType == EShaderVariableValueType::UVec4) + { + return createBufferBindingInstance( + binding_name, binding, *value_array_declaration, bufferChangedCallback, errorState); + } else if (value_array_declaration->mElementType == EShaderVariableValueType::Mat4) { return createBufferBindingInstance( diff --git a/modules/naprender/src/bufferbindinginstance.h b/modules/naprender/src/bufferbindinginstance.h index e2e3ed8b39..a2b4acf279 100644 --- a/modules/naprender/src/bufferbindinginstance.h +++ b/modules/naprender/src/bufferbindinginstance.h @@ -316,6 +316,8 @@ namespace nap using BufferBindingVec2Instance = TypedBufferBindingNumericInstance; using BufferBindingVec3Instance = TypedBufferBindingNumericInstance; using BufferBindingVec4Instance = TypedBufferBindingNumericInstance; + using BufferBindingIVec4Instance = TypedBufferBindingNumericInstance; + using BufferBindingUVec4Instance = TypedBufferBindingNumericInstance; using BufferBindingMat4Instance = TypedBufferBindingNumericInstance; diff --git a/modules/naprender/src/materialinstance.cpp b/modules/naprender/src/materialinstance.cpp index 18c9db8e0d..d23e62bd72 100644 --- a/modules/naprender/src/materialinstance.cpp +++ b/modules/naprender/src/materialinstance.cpp @@ -328,6 +328,16 @@ namespace nap auto* instance = static_cast(&bindingInstance); buffer_info.buffer = instance->getBuffer().getBuffer(); } + else if (bindingInstance.get_type() == RTTI_OF(BufferBindingIVec4Instance)) + { + auto* instance = static_cast(&bindingInstance); + buffer_info.buffer = instance->getBuffer().getBuffer(); + } + else if (bindingInstance.get_type() == RTTI_OF(BufferBindingUVec4Instance)) + { + auto* instance = static_cast(&bindingInstance); + buffer_info.buffer = instance->getBuffer().getBuffer(); + } else if (bindingInstance.get_type() == RTTI_OF(BufferBindingMat4Instance)) { auto* instance = static_cast(&bindingInstance); diff --git a/modules/naprender/src/shader.cpp b/modules/naprender/src/shader.cpp index 238026c304..c93dd942f2 100644 --- a/modules/naprender/src/shader.cpp +++ b/modules/naprender/src/shader.cpp @@ -397,9 +397,19 @@ static nap::EShaderVariableValueType getShaderVariableValueType(spirv_cross::SPI switch (type.basetype) { case spirv_cross::SPIRType::Int: - return nap::EShaderVariableValueType::Int; + if (type.vecsize == 1 && type.columns == 1) + return nap::EShaderVariableValueType::Int; + else if (type.vecsize == 4 && type.columns == 1) + return nap::EShaderVariableValueType::IVec4; + else + return nap::EShaderVariableValueType::Unknown; case spirv_cross::SPIRType::UInt: - return nap::EShaderVariableValueType::UInt; + if (type.vecsize == 1 && type.columns == 1) + return nap::EShaderVariableValueType::UInt; + else if (type.vecsize == 4 && type.columns == 1) + return nap::EShaderVariableValueType::UVec4; + else + return nap::EShaderVariableValueType::Unknown; case spirv_cross::SPIRType::Float: if (type.vecsize == 1 && type.columns == 1) return nap::EShaderVariableValueType::Float; @@ -428,9 +438,19 @@ static VkFormat getFormatFromType(spirv_cross::SPIRType type) switch (type.basetype) { case spirv_cross::SPIRType::Int: - return VK_FORMAT_R32_SINT; + if (type.vecsize == 1 && type.columns == 1) + return VK_FORMAT_R32_SINT; + else if (type.vecsize == 4 && type.columns == 1) + return VK_FORMAT_R32G32B32A32_SINT; + else + return VK_FORMAT_UNDEFINED; case spirv_cross::SPIRType::UInt: - return VK_FORMAT_R32_UINT; + if (type.vecsize == 1 && type.columns == 1) + return VK_FORMAT_R32_UINT; + else if (type.vecsize == 4 && type.columns == 1) + return VK_FORMAT_R32G32B32A32_UINT; + else + return VK_FORMAT_UNDEFINED; case spirv_cross::SPIRType::Float: if (type.vecsize == 1 && type.columns == 1) return VK_FORMAT_R32_SFLOAT; diff --git a/modules/naprender/src/shadervariabledeclarations.h b/modules/naprender/src/shadervariabledeclarations.h index 30fec2f70b..4de1aee841 100644 --- a/modules/naprender/src/shadervariabledeclarations.h +++ b/modules/naprender/src/shadervariabledeclarations.h @@ -44,6 +44,8 @@ namespace nap Vec2, ///< 2 float vector Vec3, ///< 3 float vector Vec4, ///< 4 float vector + IVec4, ///< 4 int vector + UVec4, ///< 4 uint vector Mat2, ///< 2x2 float matrix Mat3, ///< 3x3 float matrix Mat4 ///< 4x4 float matrix diff --git a/modules/naprender/src/uniform.cpp b/modules/naprender/src/uniform.cpp index 6252dfc15d..7ef9ef37c4 100644 --- a/modules/naprender/src/uniform.cpp +++ b/modules/naprender/src/uniform.cpp @@ -26,6 +26,14 @@ RTTI_BEGIN_CLASS(nap::UniformUInt) RTTI_PROPERTY("Value", &nap::UniformUInt::mValue, nap::rtti::EPropertyMetaData::Required) RTTI_END_CLASS +RTTI_BEGIN_CLASS(nap::UniformIVec4) + RTTI_PROPERTY("Value", &nap::UniformIVec4::mValue, nap::rtti::EPropertyMetaData::Required) +RTTI_END_CLASS + +RTTI_BEGIN_CLASS(nap::UniformUVec4) + RTTI_PROPERTY("Value", &nap::UniformUVec4::mValue, nap::rtti::EPropertyMetaData::Required) +RTTI_END_CLASS + RTTI_BEGIN_CLASS(nap::UniformInt) RTTI_PROPERTY("Value", &nap::UniformInt::mValue, nap::rtti::EPropertyMetaData::Required) RTTI_END_CLASS @@ -74,6 +82,14 @@ RTTI_BEGIN_CLASS(nap::UniformVec4Array) RTTI_PROPERTY("Values", &nap::UniformVec4Array::mValues, nap::rtti::EPropertyMetaData::Required) RTTI_END_CLASS +RTTI_BEGIN_CLASS(nap::UniformIVec4Array) + RTTI_PROPERTY("Values", &nap::UniformIVec4Array::mValues, nap::rtti::EPropertyMetaData::Required) +RTTI_END_CLASS + +RTTI_BEGIN_CLASS(nap::UniformUVec4Array) + RTTI_PROPERTY("Values", &nap::UniformUVec4Array::mValues, nap::rtti::EPropertyMetaData::Required) +RTTI_END_CLASS + RTTI_BEGIN_CLASS(nap::UniformMat4Array) RTTI_PROPERTY("Values", &nap::UniformMat4Array::mValues, nap::rtti::EPropertyMetaData::Required) RTTI_END_CLASS diff --git a/modules/naprender/src/uniform.h b/modules/naprender/src/uniform.h index c021d70b3c..aa99c72880 100644 --- a/modules/naprender/src/uniform.h +++ b/modules/naprender/src/uniform.h @@ -208,6 +208,8 @@ namespace nap using UniformVec2 = TypedUniformValue; using UniformVec3 = TypedUniformValue; using UniformVec4 = TypedUniformValue; + using UniformIVec4 = TypedUniformValue; + using UniformUVec4 = TypedUniformValue; using UniformMat4 = TypedUniformValue; @@ -221,5 +223,7 @@ namespace nap using UniformVec2Array = TypedUniformValueArray; using UniformVec3Array = TypedUniformValueArray; using UniformVec4Array = TypedUniformValueArray; + using UniformIVec4Array = TypedUniformValueArray; + using UniformUVec4Array = TypedUniformValueArray; using UniformMat4Array = TypedUniformValueArray; } diff --git a/modules/naprender/src/uniforminstance.cpp b/modules/naprender/src/uniforminstance.cpp index ced895d070..982c8596e7 100644 --- a/modules/naprender/src/uniforminstance.cpp +++ b/modules/naprender/src/uniforminstance.cpp @@ -49,6 +49,16 @@ RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformVec4Instance) RTTI_FUNCTION("setValue", &nap::UniformVec4Instance::setValue) RTTI_END_CLASS +RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformIVec4Instance) + RTTI_CONSTRUCTOR(const nap::ShaderVariableValueDeclaration&) + RTTI_FUNCTION("setValue", &nap::UniformIVec4Instance::setValue) +RTTI_END_CLASS + +RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformUVec4Instance) + RTTI_CONSTRUCTOR(const nap::ShaderVariableValueDeclaration&) + RTTI_FUNCTION("setValue", &nap::UniformUVec4Instance::setValue) +RTTI_END_CLASS + RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformMat4Instance) RTTI_CONSTRUCTOR(const nap::ShaderVariableValueDeclaration&) RTTI_FUNCTION("setValue", &nap::UniformMat4Instance::setValue) @@ -90,6 +100,18 @@ RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformVec4ArrayInstance) RTTI_FUNCTION("getNumElements", &nap::UniformVec4ArrayInstance::getNumElements) RTTI_END_CLASS +RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformIVec4ArrayInstance) + RTTI_CONSTRUCTOR(const nap::ShaderVariableValueArrayDeclaration&) + RTTI_FUNCTION("setValue", &nap::UniformIVec4ArrayInstance::setValue) + RTTI_FUNCTION("getNumElements", &nap::UniformIVec4ArrayInstance::getNumElements) +RTTI_END_CLASS + +RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformUVec4ArrayInstance) + RTTI_CONSTRUCTOR(const nap::ShaderVariableValueArrayDeclaration&) + RTTI_FUNCTION("setValue", &nap::UniformUVec4ArrayInstance::setValue) + RTTI_FUNCTION("getNumElements", &nap::UniformUVec4ArrayInstance::getNumElements) +RTTI_END_CLASS + RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformMat4ArrayInstance) RTTI_CONSTRUCTOR(const nap::ShaderVariableValueArrayDeclaration&) RTTI_FUNCTION("setValue", &nap::UniformMat4ArrayInstance::setValue) @@ -140,43 +162,55 @@ namespace nap if (value_array_declaration->mElementType == EShaderVariableValueType::UInt) { - std::unique_ptr array_instance = std::make_unique(*value_array_declaration); + auto array_instance = std::make_unique(*value_array_declaration); array_instance->getValues().resize(value_array_declaration->mNumElements); return std::move(array_instance); } else if (value_array_declaration->mElementType == EShaderVariableValueType::Int) { - std::unique_ptr array_instance = std::make_unique(*value_array_declaration); + auto array_instance = std::make_unique(*value_array_declaration); array_instance->getValues().resize(value_array_declaration->mNumElements); return std::move(array_instance); } else if (value_array_declaration->mElementType == EShaderVariableValueType::Float) { - std::unique_ptr array_instance = std::make_unique(*value_array_declaration); + auto array_instance = std::make_unique(*value_array_declaration); array_instance->getValues().resize(value_array_declaration->mNumElements); return std::move(array_instance); } else if (value_array_declaration->mElementType == EShaderVariableValueType::Vec2) { - std::unique_ptr array_instance = std::make_unique(*value_array_declaration); + auto array_instance = std::make_unique(*value_array_declaration); array_instance->getValues().resize(value_array_declaration->mNumElements); return std::move(array_instance); } else if (value_array_declaration->mElementType == EShaderVariableValueType::Vec3) { - std::unique_ptr array_instance = std::make_unique(*value_array_declaration); + auto array_instance = std::make_unique(*value_array_declaration); array_instance->getValues().resize(value_array_declaration->mNumElements); return std::move(array_instance); } else if (value_array_declaration->mElementType == EShaderVariableValueType::Vec4) { - std::unique_ptr array_instance = std::make_unique(*value_array_declaration); + auto array_instance = std::make_unique(*value_array_declaration); + array_instance->getValues().resize(value_array_declaration->mNumElements); + return std::move(array_instance); + } + else if (value_array_declaration->mElementType == EShaderVariableValueType::IVec4) + { + auto array_instance = std::make_unique(*value_array_declaration); + array_instance->getValues().resize(value_array_declaration->mNumElements); + return std::move(array_instance); + } + else if (value_array_declaration->mElementType == EShaderVariableValueType::UVec4) + { + auto array_instance = std::make_unique(*value_array_declaration); array_instance->getValues().resize(value_array_declaration->mNumElements); return std::move(array_instance); } else if (value_array_declaration->mElementType == EShaderVariableValueType::Mat4) { - std::unique_ptr array_instance = std::make_unique(*value_array_declaration); + auto array_instance = std::make_unique(*value_array_declaration); array_instance->getValues().resize(value_array_declaration->mNumElements); return std::move(array_instance); } @@ -214,6 +248,14 @@ namespace nap { return std::make_unique(*value_declaration); } + else if (value_declaration->mType == EShaderVariableValueType::IVec4) + { + return std::make_unique(*value_declaration); + } + else if (value_declaration->mType == EShaderVariableValueType::UVec4) + { + return std::make_unique(*value_declaration); + } else if (value_declaration->mType == EShaderVariableValueType::Mat4) { return std::make_unique(*value_declaration); @@ -309,6 +351,14 @@ namespace nap { instance_value_array = createUniformValueInstance(resource, *value_declaration, errorState); } + else if (value_declaration->mElementType == EShaderVariableValueType::IVec4) + { + instance_value_array = createUniformValueInstance(resource, *value_declaration, errorState); + } + else if (value_declaration->mElementType == EShaderVariableValueType::UVec4) + { + instance_value_array = createUniformValueInstance(resource, *value_declaration, errorState); + } else if (value_declaration->mElementType == EShaderVariableValueType::Mat4) { instance_value_array = createUniformValueInstance(resource, *value_declaration, errorState); @@ -371,6 +421,14 @@ namespace nap { value_instance = createUniformValueInstance(resource, *value_declaration, errorState); } + else if (value_declaration->mType == EShaderVariableValueType::IVec4) + { + value_instance = createUniformValueInstance(resource, *value_declaration, errorState); + } + else if (value_declaration->mType == EShaderVariableValueType::UVec4) + { + value_instance = createUniformValueInstance(resource, *value_declaration, errorState); + } else if (value_declaration->mType == EShaderVariableValueType::Mat4) { value_instance = createUniformValueInstance(resource, *value_declaration, errorState); diff --git a/modules/naprender/src/uniforminstance.h b/modules/naprender/src/uniforminstance.h index 454ff046e1..254284ad6d 100644 --- a/modules/naprender/src/uniforminstance.h +++ b/modules/naprender/src/uniforminstance.h @@ -377,6 +377,8 @@ namespace nap using UniformVec2Instance = TypedUniformValueInstance; using UniformVec3Instance = TypedUniformValueInstance; using UniformVec4Instance = TypedUniformValueInstance; + using UniformIVec4Instance = TypedUniformValueInstance; + using UniformUVec4Instance = TypedUniformValueInstance; using UniformMat4Instance = TypedUniformValueInstance; @@ -390,6 +392,8 @@ namespace nap using UniformVec2ArrayInstance = TypedUniformValueArrayInstance; using UniformVec3ArrayInstance = TypedUniformValueArrayInstance; using UniformVec4ArrayInstance = TypedUniformValueArrayInstance; + using UniformIVec4ArrayInstance = TypedUniformValueArrayInstance; + using UniformUVec4ArrayInstance = TypedUniformValueArrayInstance; using UniformMat4ArrayInstance = TypedUniformValueArrayInstance;