#include "BsMaterialParam.h" #include "BsVector2I.h" #include "BsVectorNI.h" #include "BsMaterialParams.h" namespace BansheeEngine { template TMaterialDataParam::TMaterialDataParam(const String& name, const SPtr& params, const SPtr>>& gpuParams) :mParamIndex(0), mArraySize(0), mMaterialParams(nullptr), mGPUParams(gpuParams) { if(params != nullptr) { const MaterialParams::ParamData* data = nullptr; auto result = params->getParamData(name, MaterialParams::ParamType::Data, (GpuParamDataType)TGpuDataParamInfo::TypeId, 0, &data); if (result == MaterialParams::GetParamResult::Success) { mMaterialParams = params; mParamIndex = data->index; mArraySize = data->arraySize; } else params->reportGetParamError(result, name, 0); } } template void TMaterialDataParam::set(const T& value, UINT32 arrayIdx) { if (mMaterialParams == nullptr) return; if(arrayIdx >= mArraySize) { LOGWRN("Array index out of range. Provided index was " + toString(arrayIdx) + " but array length is " + toString(mArraySize)); return; } mMaterialParams->setDataParam(mParamIndex, arrayIdx, value); if (mGPUParams != nullptr) { for (auto& param : *mGPUParams) param.set(value, arrayIdx); } } template T TMaterialDataParam::get(UINT32 arrayIdx) { T output = T(); if (mMaterialParams == nullptr || arrayIdx >= mArraySize) return output; mMaterialParams->getDataParam(mParamIndex, arrayIdx, output); return output; } template TMaterialDataParam::TMaterialDataParam(const SPtr>>& params) :mParams(params) { } template void TMaterialDataParam::set(const T& value, UINT32 arrayIdx) { if (mParams == nullptr) return; for (auto& param : *mParams) param.set(value, arrayIdx); } template T TMaterialDataParam::get(UINT32 arrayIdx) { if (mParams == nullptr || mParams->size() == 0) return T(); return (*mParams)[0].get(arrayIdx); // They should all have the same value } TMaterialParamStruct::TMaterialParamStruct(const String& name, const SPtr& params, const SPtr>>& gpuParams) :mParamIndex(0), mArraySize(0), mMaterialParams(nullptr), mGPUParams(gpuParams) { if (params != nullptr) { const MaterialParams::ParamData* data = nullptr; auto result = params->getParamData(name, MaterialParams::ParamType::Data, GPDT_STRUCT, 0, &data); if (result == MaterialParams::GetParamResult::Success) { mMaterialParams = params; mParamIndex = data->index; mArraySize = data->arraySize; } else params->reportGetParamError(result, name, 0); } } void TMaterialParamStruct::set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx) { if (mMaterialParams == nullptr) return; if (arrayIdx >= mArraySize) { LOGWRN("Array index out of range. Provided index was " + toString(arrayIdx) + " but array length is " + toString(mArraySize)); return; } mMaterialParams->setStructData(mParamIndex + arrayIdx, value, sizeBytes); if (mGPUParams != nullptr) { for (auto& param : *mGPUParams) param.set(value, sizeBytes, arrayIdx); } } void TMaterialParamStruct::get(void* value, UINT32 sizeBytes, UINT32 arrayIdx) { if (mMaterialParams == nullptr || arrayIdx >= mArraySize) return; mMaterialParams->getStructData(mParamIndex + arrayIdx, value, sizeBytes); } UINT32 TMaterialParamStruct::getElementSize() const { return mMaterialParams->getStructSize(mParamIndex); } TMaterialParamStruct::TMaterialParamStruct(const SPtr>>& params) :mParams(params) { } void TMaterialParamStruct::set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx) { if (mParams == nullptr) return; for (auto& param : *mParams) param.set(value, sizeBytes, arrayIdx); } void TMaterialParamStruct::get(void* value, UINT32 sizeBytes, UINT32 arrayIdx) { if (mParams == nullptr || mParams->size() == 0) { value = nullptr; return; } return (*mParams)[0].get(value, sizeBytes, arrayIdx); // They should all have the same value } UINT32 TMaterialParamStruct::getElementSize() const { if (mParams == nullptr || mParams->size() == 0) return 0; return (*mParams)[0].getElementSize(); } TMaterialParamTexture::TMaterialParamTexture(const String& name, const SPtr& params, const SPtr>>& gpuParams) :mParamIndex(0), mMaterialParams(nullptr), mGPUParams(gpuParams) { if (params != nullptr) { const MaterialParams::ParamData* data = nullptr; auto result = params->getParamData(name, MaterialParams::ParamType::Texture, GPDT_UNKNOWN, 0, &data); if (result == MaterialParams::GetParamResult::Success) { mMaterialParams = params; mParamIndex = data->index; } else params->reportGetParamError(result, name, 0); } } void TMaterialParamTexture::set(const HTexture& texture) { if (mMaterialParams == nullptr) return; mMaterialParams->setTexture(mParamIndex, texture); if (mGPUParams != nullptr) { for (auto& param : *mGPUParams) param.set(texture); } } HTexture TMaterialParamTexture::get() { HTexture texture; if (mMaterialParams == nullptr) return texture; mMaterialParams->getTexture(mParamIndex, texture); return texture; } TMaterialParamTexture::TMaterialParamTexture(const SPtr>>& params) :mParams(params) { } void TMaterialParamTexture::set(const SPtr& texture) { if (mParams == nullptr) return; for (auto& param : *mParams) param.set(texture); } SPtr TMaterialParamTexture::get() { if (mParams == nullptr || mParams->size() == 0) return SPtr(); return (*mParams)[0].get(); // They should all have the same value } TMaterialParamLoadStoreTexture::TMaterialParamLoadStoreTexture(const String& name, const SPtr& params, const SPtr>>& gpuParams) :mParamIndex(0), mMaterialParams(nullptr), mGPUParams(gpuParams) { if (params != nullptr) { const MaterialParams::ParamData* data = nullptr; auto result = params->getParamData(name, MaterialParams::ParamType::Texture, GPDT_UNKNOWN, 0, &data); if (result == MaterialParams::GetParamResult::Success) { mMaterialParams = params; mParamIndex = data->index; } else params->reportGetParamError(result, name, 0); } } void TMaterialParamLoadStoreTexture::set(const HTexture& texture, const TextureSurface& surface) { if (mMaterialParams == nullptr) return; mMaterialParams->setLoadStoreTexture(mParamIndex, texture, surface); if (mGPUParams != nullptr) { for (auto& param : *mGPUParams) param.set(texture, surface); } } HTexture TMaterialParamLoadStoreTexture::get() { HTexture texture; if (mMaterialParams == nullptr) return texture; TextureSurface surface; mMaterialParams->getLoadStoreTexture(mParamIndex, texture, surface); return texture; } TMaterialParamLoadStoreTexture::TMaterialParamLoadStoreTexture(const SPtr>>& params) :mParams(params) { } void TMaterialParamLoadStoreTexture::set(const SPtr& texture, const TextureSurface& surface) { if (mParams == nullptr) return; for (auto& param : *mParams) param.set(texture, surface); } SPtr TMaterialParamLoadStoreTexture::get() { if (mParams == nullptr || mParams->size() == 0) return SPtr(); return (*mParams)[0].get(); // They should all have the same value } TMaterialParamSampState::TMaterialParamSampState(const String& name, const SPtr& params, const SPtr>>& gpuParams) :mParamIndex(0), mMaterialParams(nullptr), mGPUParams(gpuParams) { if (params != nullptr) { const MaterialParams::ParamData* data = nullptr; auto result = params->getParamData(name, MaterialParams::ParamType::Sampler, GPDT_UNKNOWN, 0, &data); if (result == MaterialParams::GetParamResult::Success) { mMaterialParams = params; mParamIndex = data->index; } else params->reportGetParamError(result, name, 0); } } void TMaterialParamSampState::set(const SPtr& sampState) { if (mMaterialParams == nullptr) return; mMaterialParams->setSamplerState(mParamIndex, sampState); if (mGPUParams != nullptr) { for (auto& param : *mGPUParams) param.set(sampState); } } SPtr TMaterialParamSampState::get() { SPtr samplerState; if (mMaterialParams == nullptr) return samplerState; mMaterialParams->getSamplerState(mParamIndex, samplerState); return samplerState; } TMaterialParamSampState::TMaterialParamSampState(const SPtr>>& params) :mParams(params) { } void TMaterialParamSampState::set(const SPtr& sampState) { if (mParams == nullptr) return; for (auto& param : *mParams) param.set(sampState); } SPtr TMaterialParamSampState::get() { if (mParams == nullptr || mParams->size() == 0) return SPtr(); return (*mParams)[0].get(); // They should all have the same value } 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 TMaterialParamSampState; template class TMaterialParamSampState; }