bool BooleanValue::convert(Value& Val) const { if (Val.getType() == Value::DOUBLE) { Val = DoubleValue(m_Value); return true; } else if (Val.getType() == Value::INTEGER) { Val = IntegerValue(m_Value); return true; } else if (Val.getType() == Value::VECTOR) { Val = VectorValue(1,m_Value); return true; } else if (Val.getType() == Value::MATRIX) { Val = MatrixValue(1,1,m_Value); return true; } return false; }
// static create from t_vpi_vecval array static VectorValue create( t_vpi_vecval* vpi_vecval_array, int width ) { vecvals_container_p vecvals_p(new vecvals_container()); for(unsigned int i=0; i< num_of_vecvals(width); i++) { vecvals_p->push_back( vpi_vecval_array[i] ); } return VectorValue(vecvals_p, width); }
bool DoubleValue::convert(Value& Val) const { if (Val.getType() == Value::VECTOR) { Val = VectorValue(1,m_Value); return true; } else if (Val.getType() == Value::MATRIX) { Val = MatrixValue(1,1,m_Value); return true; } return false; }
FUniformBufferRHIRef FUniformExpressionSet::CreateUniformBuffer(const FMaterialRenderContext& MaterialRenderContext, FRHICommandList* CommandListIfLocalMode, struct FLocalUniformBuffer* OutLocalUniformBuffer) const { check(UniformBufferStruct); check(IsInParallelRenderingThread()); FUniformBufferRHIRef UniformBuffer; if (UniformBufferStruct->GetSize() > 0) { FMemMark Mark(FMemStack::Get()); void* const TempBuffer = FMemStack::Get().PushBytes(UniformBufferStruct->GetSize(),UNIFORM_BUFFER_STRUCT_ALIGNMENT); FLinearColor* TempVectorBuffer = (FLinearColor*)TempBuffer; for(int32 VectorIndex = 0;VectorIndex < UniformVectorExpressions.Num();++VectorIndex) { TempVectorBuffer[VectorIndex] = FLinearColor(0,0,0,0); UniformVectorExpressions[VectorIndex]->GetNumberValue(MaterialRenderContext,TempVectorBuffer[VectorIndex]); } float* TempScalarBuffer = (float*)(TempVectorBuffer + UniformVectorExpressions.Num()); for(int32 ScalarIndex = 0;ScalarIndex < UniformScalarExpressions.Num();++ScalarIndex) { FLinearColor VectorValue(0,0,0,0); UniformScalarExpressions[ScalarIndex]->GetNumberValue(MaterialRenderContext,VectorValue); TempScalarBuffer[ScalarIndex] = VectorValue.R; } void** ResourceTable = (void**)((uint8*)TempBuffer + UniformBufferStruct->GetLayout().ResourceOffset); check(((UPTRINT)ResourceTable & 0x7) == 0); check(UniformBufferStruct->GetLayout().Resources.Num() == Uniform2DTextureExpressions.Num() * 2 + UniformCubeTextureExpressions.Num() * 2 + 2); // Cache 2D texture uniform expressions. for(int32 ExpressionIndex = 0;ExpressionIndex < Uniform2DTextureExpressions.Num();ExpressionIndex++) { const UTexture* Value; ESamplerSourceMode SourceMode; Uniform2DTextureExpressions[ExpressionIndex]->GetTextureValue(MaterialRenderContext,MaterialRenderContext.Material,Value,SourceMode); if (Value && Value->Resource) { //@todo-rco: Help track down a invalid values checkf(Value->IsA(UTexture::StaticClass()), TEXT("Expecting a UTexture! Value='%s' class='%s'"), *Value->GetName(), *Value->GetClass()->GetName()); // UMaterial / UMaterialInstance should have caused all dependent textures to be PostLoaded, which initializes their rendering resource checkf(Value->TextureReference.TextureReferenceRHI, TEXT("Texture %s of class %s had invalid texture reference"), *Value->GetName(), *Value->GetClass()->GetName()); *ResourceTable++ = Value->TextureReference.TextureReferenceRHI; FSamplerStateRHIRef* SamplerSource = &Value->Resource->SamplerStateRHI; if (SourceMode == SSM_Wrap_WorldGroupSettings) { SamplerSource = &Wrap_WorldGroupSettings->SamplerStateRHI; } else if (SourceMode == SSM_Clamp_WorldGroupSettings) { SamplerSource = &Clamp_WorldGroupSettings->SamplerStateRHI; } *ResourceTable++ = *SamplerSource; } else { *ResourceTable++ = GWhiteTexture->TextureRHI; *ResourceTable++ = GWhiteTexture->SamplerStateRHI; } } // Cache cube texture uniform expressions. for(int32 ExpressionIndex = 0;ExpressionIndex < UniformCubeTextureExpressions.Num();ExpressionIndex++) { const UTexture* Value; ESamplerSourceMode SourceMode; UniformCubeTextureExpressions[ExpressionIndex]->GetTextureValue(MaterialRenderContext,MaterialRenderContext.Material,Value,SourceMode); if(Value && Value->Resource) { check(Value->TextureReference.TextureReferenceRHI); *ResourceTable++ = Value->TextureReference.TextureReferenceRHI; FSamplerStateRHIRef* SamplerSource = &Value->Resource->SamplerStateRHI; if (SourceMode == SSM_Wrap_WorldGroupSettings) { SamplerSource = &Wrap_WorldGroupSettings->SamplerStateRHI; } else if (SourceMode == SSM_Clamp_WorldGroupSettings) { SamplerSource = &Clamp_WorldGroupSettings->SamplerStateRHI; } *ResourceTable++ = *SamplerSource; } else { *ResourceTable++ = GWhiteTexture->TextureRHI; *ResourceTable++ = GWhiteTexture->SamplerStateRHI; } } *ResourceTable++ = Wrap_WorldGroupSettings->SamplerStateRHI; *ResourceTable++ = Clamp_WorldGroupSettings->SamplerStateRHI; if (CommandListIfLocalMode) { check(OutLocalUniformBuffer); *OutLocalUniformBuffer = CommandListIfLocalMode->BuildLocalUniformBuffer(TempBuffer, UniformBufferStruct->GetSize(), UniformBufferStruct->GetLayout()); check(OutLocalUniformBuffer->IsValid()); } else { UniformBuffer = RHICreateUniformBuffer(TempBuffer, UniformBufferStruct->GetLayout(), UniformBuffer_MultiFrame); check(!OutLocalUniformBuffer->IsValid()); } } return UniformBuffer; }
FUniformBufferRHIRef FUniformExpressionSet::CreateUniformBuffer(const FMaterialRenderContext& MaterialRenderContext, FRHICommandList* CommandListIfLocalMode, struct FLocalUniformBuffer* OutLocalUniformBuffer) const { check(UniformBufferStruct); check(IsInParallelRenderingThread()); FUniformBufferRHIRef UniformBuffer; if (UniformBufferStruct->GetSize() > 0) { FMemMark Mark(FMemStack::Get()); void* const TempBuffer = FMemStack::Get().PushBytes(UniformBufferStruct->GetSize(),UNIFORM_BUFFER_STRUCT_ALIGNMENT); FLinearColor* TempVectorBuffer = (FLinearColor*)TempBuffer; for(int32 VectorIndex = 0;VectorIndex < UniformVectorExpressions.Num();++VectorIndex) { TempVectorBuffer[VectorIndex] = FLinearColor(0,0,0,0); UniformVectorExpressions[VectorIndex]->GetNumberValue(MaterialRenderContext,TempVectorBuffer[VectorIndex]); } float* TempScalarBuffer = (float*)(TempVectorBuffer + UniformVectorExpressions.Num()); for(int32 ScalarIndex = 0;ScalarIndex < UniformScalarExpressions.Num();++ScalarIndex) { FLinearColor VectorValue(0,0,0,0); UniformScalarExpressions[ScalarIndex]->GetNumberValue(MaterialRenderContext,VectorValue); TempScalarBuffer[ScalarIndex] = VectorValue.R; } void** ResourceTable = (void**)((uint8*)TempBuffer + UniformBufferStruct->GetLayout().ResourceOffset); check(((UPTRINT)ResourceTable & 0x7) == 0); // Cache 2D texture uniform expressions. for(int32 ExpressionIndex = 0;ExpressionIndex < Uniform2DTextureExpressions.Num();ExpressionIndex++) { const UTexture* Value; Uniform2DTextureExpressions[ExpressionIndex]->GetTextureValue(MaterialRenderContext,MaterialRenderContext.Material,Value); if(Value && Value->Resource) { *ResourceTable++ = Value->TextureReference.TextureReferenceRHI; *ResourceTable++ = Value->Resource->SamplerStateRHI; } else { *ResourceTable++ = GWhiteTexture->TextureRHI; *ResourceTable++ = GWhiteTexture->SamplerStateRHI; } } // Cache cube texture uniform expressions. for(int32 ExpressionIndex = 0;ExpressionIndex < UniformCubeTextureExpressions.Num();ExpressionIndex++) { const UTexture* Value; UniformCubeTextureExpressions[ExpressionIndex]->GetTextureValue(MaterialRenderContext,MaterialRenderContext.Material,Value); if(Value && Value->Resource) { *ResourceTable++ = Value->TextureReference.TextureReferenceRHI; *ResourceTable++ = Value->Resource->SamplerStateRHI; } else { *ResourceTable++ = GWhiteTexture->TextureRHI; *ResourceTable++ = GWhiteTexture->SamplerStateRHI; } } if (CommandListIfLocalMode) { check(OutLocalUniformBuffer); *OutLocalUniformBuffer = CommandListIfLocalMode->BuildLocalUniformBuffer(TempBuffer, UniformBufferStruct->GetSize(), UniformBufferStruct->GetLayout()); check(OutLocalUniformBuffer->IsValid()); } else { UniformBuffer = RHICreateUniformBuffer(TempBuffer, UniformBufferStruct->GetLayout(), UniformBuffer_MultiFrame); check(!OutLocalUniformBuffer->IsValid()); } } return UniformBuffer; }