//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #include "Material/BsMaterialParam.h" #include "Math/BsVector2I.h" #include "Math/BsVectorNI.h" #include "Material/BsMaterialParams.h" #include "Material/BsMaterial.h" namespace bs { template TMaterialDataParam::TMaterialDataParam(const String& name, const MaterialPtrType& material) :mParamIndex(0), mArraySize(0), mMaterial(nullptr) { if(material != nullptr) { SPtr params = material->_getInternalParams(); UINT32 paramIndex; auto result = params->getParamIndex(name, MaterialParams::ParamType::Data, (GpuParamDataType)TGpuDataParamInfo::TypeId, 0, paramIndex); if (result == MaterialParams::GetParamResult::Success) { const MaterialParams::ParamData* data = params->getParamData(paramIndex); mMaterial = material; mParamIndex = paramIndex; mArraySize = data->arraySize; } else params->reportGetParamError(result, name, 0); } } template void TMaterialDataParam::set(const T& value, UINT32 arrayIdx) const { if (mMaterial == nullptr) return; if(arrayIdx >= mArraySize) { LOGWRN("Array index out of range. Provided index was " + toString(arrayIdx) + " but array length is " + toString(mArraySize)); return; } SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->setDataParam(*data, arrayIdx, value); mMaterial->_markCoreDirty(); } template T TMaterialDataParam::get(UINT32 arrayIdx) const { T output = T(); if (mMaterial == nullptr || arrayIdx >= mArraySize) return output; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->getDataParam(*data, arrayIdx, output); return output; } template TMaterialParamStruct::TMaterialParamStruct(const String& name, const MaterialPtrType& material) :mParamIndex(0), mArraySize(0), mMaterial(nullptr) { if (material != nullptr) { SPtr params = material->_getInternalParams(); UINT32 paramIndex; auto result = params->getParamIndex(name, MaterialParams::ParamType::Data, GPDT_STRUCT, 0, paramIndex); if (result == MaterialParams::GetParamResult::Success) { const MaterialParams::ParamData* data = params->getParamData(paramIndex); mMaterial = material; mParamIndex = paramIndex; mArraySize = data->arraySize; } else params->reportGetParamError(result, name, 0); } } template void TMaterialParamStruct::set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx) const { if (mMaterial == nullptr) return; if (arrayIdx >= mArraySize) { LOGWRN("Array index out of range. Provided index was " + toString(arrayIdx) + " but array length is " + toString(mArraySize)); return; } SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->setStructData(*data, value, sizeBytes, arrayIdx); mMaterial->_markCoreDirty(); } template void TMaterialParamStruct::get(void* value, UINT32 sizeBytes, UINT32 arrayIdx) const { if (mMaterial == nullptr || arrayIdx >= mArraySize) return; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->getStructData(*data, value, sizeBytes, arrayIdx); } template UINT32 TMaterialParamStruct::getElementSize() const { if (mMaterial == nullptr) return 0; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); return params->getStructSize(*data); } template TMaterialParamTexture::TMaterialParamTexture(const String& name, const MaterialPtrType& material) :mParamIndex(0), mMaterial(nullptr) { if (material != nullptr) { SPtr params = material->_getInternalParams(); UINT32 paramIndex; auto result = params->getParamIndex(name, MaterialParams::ParamType::Texture, GPDT_UNKNOWN, 0, paramIndex); if (result == MaterialParams::GetParamResult::Success) { mMaterial = material; mParamIndex = paramIndex; } else params->reportGetParamError(result, name, 0); } } template void TMaterialParamTexture::set(const TextureType& texture, const TextureSurface& surface) const { if (mMaterial == nullptr) return; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); // If there is a default value, assign that instead of null TextureType newValue = texture; if (newValue == nullptr) params->getDefaultTexture(*data, newValue); params->setTexture(*data, newValue, surface); mMaterial->_markCoreDirty(); mMaterial->_markDependenciesDirty(); mMaterial->_markResourcesDirty(); } template typename TMaterialParamTexture::TextureType TMaterialParamTexture::get() const { TextureType texture; if (mMaterial == nullptr) return texture; TextureSurface surface; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->getTexture(*data, texture, surface); return texture; } template TMaterialParamLoadStoreTexture::TMaterialParamLoadStoreTexture(const String& name, const MaterialPtrType& material) :mParamIndex(0), mMaterial(nullptr) { if (material != nullptr) { SPtr params = material->_getInternalParams(); UINT32 paramIndex; auto result = params->getParamIndex(name, MaterialParams::ParamType::Texture, GPDT_UNKNOWN, 0, paramIndex); if (result == MaterialParams::GetParamResult::Success) { mMaterial = material; mParamIndex = paramIndex; } else params->reportGetParamError(result, name, 0); } } template void TMaterialParamLoadStoreTexture::set(const TextureType& texture, const TextureSurface& surface) const { if (mMaterial == nullptr) return; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->setLoadStoreTexture(*data, texture, surface); mMaterial->_markCoreDirty(); mMaterial->_markDependenciesDirty(); mMaterial->_markResourcesDirty(); } template typename TMaterialParamLoadStoreTexture::TextureType TMaterialParamLoadStoreTexture::get() const { TextureType texture; if (mMaterial == nullptr) return texture; TextureSurface surface; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->getLoadStoreTexture(*data, texture, surface); return texture; } template TMaterialParamBuffer::TMaterialParamBuffer(const String& name, const MaterialPtrType& material) :mParamIndex(0), mMaterial(nullptr) { if (material != nullptr) { SPtr params = material->_getInternalParams(); UINT32 paramIndex; auto result = params->getParamIndex(name, MaterialParams::ParamType::Buffer, GPDT_UNKNOWN, 0, paramIndex); if (result == MaterialParams::GetParamResult::Success) { mMaterial = material; mParamIndex = paramIndex; } else params->reportGetParamError(result, name, 0); } } template void TMaterialParamBuffer::set(const BufferType& buffer) const { if (mMaterial == nullptr) return; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->setBuffer(*data, buffer); mMaterial->_markCoreDirty(); mMaterial->_markDependenciesDirty(); } template typename TMaterialParamBuffer::BufferType TMaterialParamBuffer::get() const { BufferType buffer; if (mMaterial == nullptr) return buffer; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->getBuffer(*data, buffer); return buffer; } template TMaterialParamSampState::TMaterialParamSampState(const String& name, const MaterialPtrType& material) :mParamIndex(0), mMaterial(nullptr) { if (material != nullptr) { SPtr params = material->_getInternalParams(); UINT32 paramIndex; auto result = params->getParamIndex(name, MaterialParams::ParamType::Sampler, GPDT_UNKNOWN, 0, paramIndex); if (result == MaterialParams::GetParamResult::Success) { mMaterial = material; mParamIndex = paramIndex; } else params->reportGetParamError(result, name, 0); } } template void TMaterialParamSampState::set(const SamplerStateType& sampState) const { if (mMaterial == nullptr) return; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); // If there is a default value, assign that instead of null SamplerStateType newValue = sampState; if (newValue == nullptr) params->getDefaultSamplerState(*data, newValue); params->setSamplerState(*data, newValue); mMaterial->_markCoreDirty(); mMaterial->_markDependenciesDirty(); } template typename TMaterialParamSampState::SamplerStateType TMaterialParamSampState::get() const { SamplerStateType samplerState; if (mMaterial == nullptr) return samplerState; SPtr params = mMaterial->_getInternalParams(); const MaterialParams::ParamData* data = params->getParamData(mParamIndex); params->getSamplerState(*data, samplerState); return samplerState; } template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialDataParam; template class TMaterialParamStruct; template class TMaterialParamStruct; template class TMaterialParamTexture; template class TMaterialParamTexture; template class TMaterialParamLoadStoreTexture; template class TMaterialParamLoadStoreTexture; template class TMaterialParamBuffer; template class TMaterialParamBuffer; template class TMaterialParamSampState; template class TMaterialParamSampState; }