From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/GfxDevice/ChannelAssigns.cpp | 225 +++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 Runtime/GfxDevice/ChannelAssigns.cpp (limited to 'Runtime/GfxDevice/ChannelAssigns.cpp') diff --git a/Runtime/GfxDevice/ChannelAssigns.cpp b/Runtime/GfxDevice/ChannelAssigns.cpp new file mode 100644 index 0000000..59ec758 --- /dev/null +++ b/Runtime/GfxDevice/ChannelAssigns.cpp @@ -0,0 +1,225 @@ +#include "UnityPrefix.h" +#include "ChannelAssigns.h" +//#include "ShaderLabErrors.h" + +// Channel names (strings for reading from ShaderLab) +static const char * const kShaderChannelName[kShaderChannelCount] = { + "VERTEX", + "NORMAL", + "COLOR", + "TEXCOORD", + "TEXCOORD1", + "TANGENT", +}; + + +ShaderChannel GetShaderChannelFromName( const std::string& name ) +{ + std::string nameUpper = ToUpper(name); + for( int i = 0; i < kShaderChannelCount; ++i ) + if( kShaderChannelName[i] == nameUpper ) + return (ShaderChannel)i; + + return kShaderChannelNone; +} + + + +ChannelAssigns::ChannelAssigns() +: m_TargetMap(0) +, m_SourceMap(0) +, m_DirectlyWired(true) +{ + for( int i = 0; i < kVertexCompCount; ++i ) + m_Channels[i] = kShaderChannelNone; +} + +void ChannelAssigns::MergeWith( const ChannelAssigns& additional ) +{ + for( int i = 0; i < kVertexCompCount; ++i ) + { + ShaderChannel source = additional.GetSourceForTarget(VertexComponent(i)); + if( source != kShaderChannelNone ) + Bind( source, (VertexComponent)i ); + } +} + +static bool IsChannelDirectlyWired (ShaderChannel source, VertexComponent target) +{ + switch (source) + { + case kShaderChannelVertex: + return (target == kVertexCompVertex); + case kShaderChannelNormal: + return (target == kVertexCompNormal); + case kShaderChannelColor: + return (target == kVertexCompColor); + case kShaderChannelTexCoord0: + return (target == kVertexCompTexCoord0); + case kShaderChannelTexCoord1: + return (target == kVertexCompTexCoord1); + case kShaderChannelTangent: + return (target == kVertexCompTexCoord2); + default: + break; + } + return false; +} + +void ChannelAssigns::Bind (ShaderChannel source, VertexComponent target) +{ + AssertIf( source == kShaderChannelNone ); + // TODO: skip kShaderChannelTexCoord ones here? + // TODO: filter duplicates somehow? + m_Channels[target] = source; + m_TargetMap |= (1<