2
0
Эх сурвалжийг харах

Material serialization (untested)
Added /bigopt options to the compiler as it was complaining

Marko Pintera 13 жил өмнө
parent
commit
19e874a87d

+ 34 - 34
CamelotClient/CamelotClient.cpp

@@ -27,8 +27,8 @@ using namespace CamelotEngine;
 int _tmain(int argc, _TCHAR* argv[])
 int _tmain(int argc, _TCHAR* argv[])
 {
 {
 	//gApplication().startUp("CamelotGLRenderSystem", "CamelotForwardRenderer");
 	//gApplication().startUp("CamelotGLRenderSystem", "CamelotForwardRenderer");
-	gApplication().startUp("CamelotD3D9RenderSystem", "CamelotForwardRenderer");
-	//gApplication().startUp("CamelotD3D11RenderSystem", "CamelotForwardRenderer");
+	//gApplication().startUp("CamelotD3D9RenderSystem", "CamelotForwardRenderer");
+	gApplication().startUp("CamelotD3D11RenderSystem", "CamelotForwardRenderer");
 
 
 	RenderSystem* renderSystem = RenderSystem::instancePtr();
 	RenderSystem* renderSystem = RenderSystem::instancePtr();
 	RenderWindowPtr renderWindow = gApplication().getPrimaryRenderWindow();
 	RenderWindowPtr renderWindow = gApplication().getPrimaryRenderWindow();
@@ -51,51 +51,51 @@ int _tmain(int argc, _TCHAR* argv[])
 	HighLevelGpuProgramPtr vertProg;
 	HighLevelGpuProgramPtr vertProg;
 
 
 	/////////////////// HLSL 9 SHADERS //////////////////////////
 	/////////////////// HLSL 9 SHADERS //////////////////////////
-	String fragShaderCode = "sampler2D tex;			\
-							float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
-							{														\
-							float4 color = tex2D(tex, uv);				\
-							return color;										\
-							}";
-
-	fragProg =  HighLevelGpuProgram::create(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
-
-	String vertShaderCode = "float4x4 matViewProjection;	\
-							void vs_main(										\
-							float4 inPos : POSITION,							\
-							float2 uv : TEXCOORD0,								\
-							out float4 oPosition : POSITION,					\
-							out float2 oUv : TEXCOORD0)							\
-							{														\
-							oPosition = mul(matViewProjection, inPos);			\
-							oUv = uv;											\
-							}";
-
-	vertProg =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
-
-	/////////////////// HLSL 11 SHADERS //////////////////////////
-	//String fragShaderCode = "SamplerState samp : register(s0);			\
-	//						Texture2D tex : register(t0); \
-	//						float4 ps_main(in float4 inPos : SV_Position, float2 uv : TEXCOORD0) : SV_Target		\
+	//String fragShaderCode = "sampler2D tex;			\
+	//						float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
 	//						{														\
 	//						{														\
-	//						float4 color = tex.Sample(samp, uv);				\
+	//						float4 color = tex2D(tex, uv);				\
 	//						return color;										\
 	//						return color;										\
 	//						}";
 	//						}";
 
 
-	//fragProg =  HighLevelGpuProgram::create(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
+	//fragProg =  HighLevelGpuProgram::create(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
 
 
 	//String vertShaderCode = "float4x4 matViewProjection;	\
 	//String vertShaderCode = "float4x4 matViewProjection;	\
 	//						void vs_main(										\
 	//						void vs_main(										\
-	//						in float4 inPos : POSITION,							\
-	//						in float2 uv : TEXCOORD0,								\
-	//						out float4 oPosition : SV_Position,					\
+	//						float4 inPos : POSITION,							\
+	//						float2 uv : TEXCOORD0,								\
+	//						out float4 oPosition : POSITION,					\
 	//						out float2 oUv : TEXCOORD0)							\
 	//						out float2 oUv : TEXCOORD0)							\
 	//						{														\
 	//						{														\
 	//						oPosition = mul(matViewProjection, inPos);			\
 	//						oPosition = mul(matViewProjection, inPos);			\
 	//						oUv = uv;											\
 	//						oUv = uv;											\
 	//						}";
 	//						}";
 
 
-	//vertProg =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
+	//vertProg =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+
+	/////////////////// HLSL 11 SHADERS //////////////////////////
+	String fragShaderCode = "SamplerState samp : register(s0);			\
+							Texture2D tex : register(t0); \
+							float4 ps_main(in float4 inPos : SV_Position, float2 uv : TEXCOORD0) : SV_Target		\
+							{														\
+							float4 color = tex.Sample(samp, uv);				\
+							return color;										\
+							}";
+
+	fragProg =  HighLevelGpuProgram::create(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_4_0);
+
+	String vertShaderCode = "float4x4 matViewProjection;	\
+							void vs_main(										\
+							in float4 inPos : POSITION,							\
+							in float2 uv : TEXCOORD0,								\
+							out float4 oPosition : SV_Position,					\
+							out float2 oUv : TEXCOORD0)							\
+							{														\
+							oPosition = mul(matViewProjection, inPos);			\
+							oUv = uv;											\
+							}";
+
+	vertProg =  HighLevelGpuProgram::create(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_4_0);
 
 
 	/////////////////// CG SHADERS //////////////////////////
 	/////////////////// CG SHADERS //////////////////////////
 	//String fragShaderCode = "sampler2D tex;					\
 	//String fragShaderCode = "sampler2D tex;					\

+ 4 - 0
CamelotClient/CamelotClient.vcxproj

@@ -94,6 +94,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>
@@ -110,6 +111,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>
@@ -128,6 +130,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>
@@ -148,6 +151,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>..\CamelotRenderer\Include;..\CamelotD3D9Renderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>Console</SubSystem>
       <SubSystem>Console</SubSystem>

+ 4 - 0
CamelotD3D11RenderSystem/CamelotD3D11RenderSystem.vcxproj

@@ -87,6 +87,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -101,6 +102,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -117,6 +119,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -135,6 +138,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D11_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 2 - 2
CamelotD3D11RenderSystem/Source/CmD3D11RenderSystem.cpp

@@ -440,12 +440,12 @@ namespace CamelotEngine
 
 
 		for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
 		for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
 		{
 		{
-			SamplerStatePtr samplerState = params->getSamplerState(iter->second.slot);
+			SamplerStateHandle& samplerState = params->getSamplerState(iter->second.slot);
 
 
 			if(samplerState == nullptr)
 			if(samplerState == nullptr)
 				setSamplerState(gptype, iter->second.slot, SamplerState::getDefault());
 				setSamplerState(gptype, iter->second.slot, SamplerState::getDefault());
 			else
 			else
-				setSamplerState(gptype, iter->second.slot, samplerState);
+				setSamplerState(gptype, iter->second.slot, samplerState.getInternalPtr());
 		}
 		}
 
 
 		for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
 		for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)

+ 4 - 0
CamelotD3D9Renderer/CamelotD3D9Renderer.vcxproj

@@ -88,6 +88,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -102,6 +103,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -118,6 +120,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -136,6 +139,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;.\Include;..\CamelotRenderer\Include;..\CamelotUtility\Include;..\Dependencies\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_RSD3D9_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 2 - 2
CamelotD3D9Renderer/Source/CmD3D9RenderSystem.cpp

@@ -333,12 +333,12 @@ namespace CamelotEngine
 
 
 		for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
 		for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
 		{
 		{
-			SamplerStatePtr samplerState = params->getSamplerState(iter->second.slot);
+			SamplerStateHandle& samplerState = params->getSamplerState(iter->second.slot);
 
 
 			if(samplerState == nullptr)
 			if(samplerState == nullptr)
 				setSamplerState(gptype, iter->second.slot, SamplerState::getDefault());
 				setSamplerState(gptype, iter->second.slot, SamplerState::getDefault());
 			else
 			else
-				setSamplerState(gptype, iter->second.slot, samplerState);
+				setSamplerState(gptype, iter->second.slot, samplerState.getInternalPtr());
 		}
 		}
 
 
 		for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
 		for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)

+ 4 - 0
CamelotFBXImporter/CamelotFBXImporter.vcxproj

@@ -87,6 +87,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -101,6 +102,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -117,6 +119,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -135,6 +138,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FBX_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 4 - 0
CamelotForwardRenderer/CamelotForwardRenderer.vcxproj

@@ -87,6 +87,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -101,6 +102,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -117,6 +119,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -135,6 +138,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FWDRND_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 4 - 0
CamelotFreeImgImporter/CamelotFreeImgImporter.vcxproj

@@ -97,6 +97,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -111,6 +112,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -127,6 +129,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -145,6 +148,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_FREEIMG_EXPORTS;_MBCS;FREEIMAGE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;./Dependencies/Include;../Dependencies/Include</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 4 - 0
CamelotGLRenderer/CamelotGLRenderer.vcxproj

@@ -88,6 +88,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -102,6 +103,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -118,6 +120,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -136,6 +139,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Source/win32;./Source/GLSL/include;./Source/atifs/include;../CamelotUtility/Include;../CamelotRenderer/Include;./Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>_WINDLL;CM_RSGL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 2 - 2
CamelotGLRenderer/Source/CmGLRenderSystem.cpp

@@ -323,12 +323,12 @@ namespace CamelotEngine
 		UINT32 texUnit = 0;
 		UINT32 texUnit = 0;
 		for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
 		for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
 		{
 		{
-			SamplerStatePtr samplerState = params->getSamplerState(iter->second.slot);
+			SamplerStateHandle& samplerState = params->getSamplerState(iter->second.slot);
 
 
 			if(samplerState == nullptr)
 			if(samplerState == nullptr)
 				setSamplerState(gptype, iter->second.slot, SamplerState::getDefault());
 				setSamplerState(gptype, iter->second.slot, SamplerState::getDefault());
 			else
 			else
-				setSamplerState(gptype, iter->second.slot, samplerState);
+				setSamplerState(gptype, iter->second.slot, samplerState.getInternalPtr());
 
 
 			glProgramUniform1i(glProgram, iter->second.slot, getGLTextureUnit(gptype, texUnit));
 			glProgramUniform1i(glProgram, iter->second.slot, getGLTextureUnit(gptype, texUnit));
 
 

+ 4 - 0
CamelotOISInput/CamelotOISInput.vcxproj

@@ -87,6 +87,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -101,6 +102,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -117,6 +119,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -135,6 +138,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>../CamelotRenderer/Include;../CamelotUtility/Include;./Include;../Dependencies/Include;./Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_OIS_EXPORTS;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 4 - 0
CamelotRenderer/CamelotRenderer.vcxproj

@@ -102,6 +102,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>NotSet</SubSystem>
       <SubSystem>NotSet</SubSystem>
@@ -119,6 +120,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>NotSet</SubSystem>
       <SubSystem>NotSet</SubSystem>
@@ -138,6 +140,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>NotSet</SubSystem>
       <SubSystem>NotSet</SubSystem>
@@ -159,6 +162,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;CM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../CamelotUtility/Include;../Dependencies/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <SubSystem>NotSet</SubSystem>
       <SubSystem>NotSet</SubSystem>

+ 6 - 0
CamelotRenderer/Include/CmCommonEnums.h

@@ -262,6 +262,12 @@ namespace CamelotEngine {
 		GPBU_DYNAMIC
 		GPBU_DYNAMIC
 	};
 	};
 
 
+	enum GpuParamType
+	{
+		GPT_DATA,
+		GPT_OBJECT
+	};
+
 	enum GpuParamDataType
 	enum GpuParamDataType
 	{
 	{
 		GPDT_FLOAT1 = 1,
 		GPDT_FLOAT1 = 1,

+ 4 - 4
CamelotRenderer/Include/CmGpuParams.h

@@ -43,11 +43,11 @@ namespace CamelotEngine
 		 */
 		 */
 		void setParam(const String& name, const void* value, UINT32 sizeBytes, UINT32 arrayIndex = 0);
 		void setParam(const String& name, const void* value, UINT32 sizeBytes, UINT32 arrayIndex = 0);
 
 
-		void setTexture(const String& name, TextureHandle val);
+		void setTexture(const String& name, TextureHandle& val);
 		TextureHandle getTexture(UINT32 slot);
 		TextureHandle getTexture(UINT32 slot);
 
 
-		void setSamplerState(const String& name, SamplerStatePtr val);
-		SamplerStatePtr getSamplerState(UINT32 slot);
+		void setSamplerState(const String& name, SamplerStateHandle& val);
+		SamplerStateHandle getSamplerState(UINT32 slot);
 
 
 		void setTransposeMatrices(bool transpose) { mTransposeMatrices = transpose; }
 		void setTransposeMatrices(bool transpose) { mTransposeMatrices = transpose; }
 
 
@@ -62,6 +62,6 @@ namespace CamelotEngine
 
 
 		vector<GpuParamBlockPtr>::type mParamBlocks;
 		vector<GpuParamBlockPtr>::type mParamBlocks;
 		vector<TextureHandle>::type mTextures;
 		vector<TextureHandle>::type mTextures;
-		vector<SamplerStatePtr>::type mSamplerStates;
+		vector<SamplerStateHandle>::type mSamplerStates;
 	};
 	};
 }
 }

+ 32 - 10
CamelotRenderer/Include/CmMaterial.h

@@ -51,14 +51,14 @@ namespace CamelotEngine
 		ShaderPtr getShader() const { return mShader; }
 		ShaderPtr getShader() const { return mShader; }
 
 
 		void setTexture(const String& name, TextureHandle& value);
 		void setTexture(const String& name, TextureHandle& value);
-		void setSamplerState(const String& name, SamplerStatePtr samplerState);
-		void setFloat(const String& name, float value);
-		void setColor(const String& name, const Color& value);
-		void setVec2(const String& name, const Vector2& value);
-		void setVec3(const String& name, const Vector3& value);
-		void setVec4(const String& name, const Vector4& value);
-		void setMat3(const String& name, const Matrix3& value);
-		void setMat4(const String& name, const Matrix4& value);
+		void setSamplerState(const String& name, SamplerStateHandle& samplerState);
+		void setFloat(const String& name, float value, UINT32 arrayIdx = 0);
+		void setColor(const String& name, const Color& value, UINT32 arrayIdx = 0);
+		void setVec2(const String& name, const Vector2& value, UINT32 arrayIdx = 0);
+		void setVec3(const String& name, const Vector3& value, UINT32 arrayIdx = 0);
+		void setVec4(const String& name, const Vector4& value, UINT32 arrayIdx = 0);
+		void setMat3(const String& name, const Matrix3& value, UINT32 arrayIdx = 0);
+		void setMat4(const String& name, const Matrix4& value, UINT32 arrayIdx = 0);
 
 
 		void setParamBlock(const String& name, GpuParamBlockPtr paramBlock);
 		void setParamBlock(const String& name, GpuParamBlockPtr paramBlock);
 
 
@@ -77,10 +77,21 @@ namespace CamelotEngine
 
 
 		vector<PassParametersPtr>::type mParametersPerPass;
 		vector<PassParametersPtr>::type mParametersPerPass;
 
 
+		// These maps aren't necessary as we can read these values from the GpuParams directly
+		// but they make many things (especially serializing and getting values) so much easier
+		map<String, vector<float>::type>::type mFloatValues;
+		map<String, vector<Vector2>::type>::type mVec2Values;
+		map<String, vector<Vector3>::type>::type mVec3Values;
+		map<String, vector<Vector4>::type>::type mVec4Values;
+		map<String, vector<Matrix3>::type>::type mMat3Values;
+		map<String, vector<Matrix4>::type>::type mMat4Values;
+		map<String, TextureHandle>::type mTextureValues;
+		map<String, SamplerStateHandle>::type mSamplerValues;
+
 		void throwIfNotInitialized() const;
 		void throwIfNotInitialized() const;
 
 
 		template <typename T>
 		template <typename T>
-		void setParam(const String& name, T& value)
+		void setParam(const String& name, T& value, UINT32 arrayIdx)
 		{
 		{
 			for(auto iter = mParametersPerPass.begin(); iter != mParametersPerPass.end(); ++iter)
 			for(auto iter = mParametersPerPass.begin(); iter != mParametersPerPass.end(); ++iter)
 			{
 			{
@@ -92,12 +103,23 @@ namespace CamelotEngine
 					if(paramPtr)
 					if(paramPtr)
 					{
 					{
 						if(paramPtr->hasParam(name))
 						if(paramPtr->hasParam(name))
-							paramPtr->setParam(name, value);
+							paramPtr->setParam(name, value, arrayIdx);
 					}
 					}
 				}
 				}
 			}
 			}
 		}
 		}
 
 
+		const set<String>::type& getValidParamNames() const { return mValidParams; }
+
+		TextureHandle getTexture(const String& name) const;
+		SamplerStateHandle getSamplerState(const String& name) const;
+		float getFloat(const String& name, UINT32 arrayIdx = 0) const;
+		Vector2 getVec2(const String& name, UINT32 arrayIdx = 0) const;
+		Vector3 getVec3(const String& name, UINT32 arrayIdx = 0) const;
+		Vector4 getVec4(const String& name, UINT32 arrayIdx = 0) const;
+		Matrix3 getMat3(const String& name, UINT32 arrayIdx = 0) const;
+		Matrix4 getMat4(const String& name, UINT32 arrayIdx = 0) const;
+
 		void initBestTechnique();
 		void initBestTechnique();
 
 
 		set<String>::type determineValidParameters(const vector<const GpuParamDesc*>::type& paramDescs) const;
 		set<String>::type determineValidParameters(const vector<const GpuParamDesc*>::type& paramDescs) const;

+ 412 - 329
CamelotRenderer/Include/CmMaterialRTTI.h

@@ -17,352 +17,435 @@
 
 
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {
-	class CM_EXPORT MaterialRTTI : public RTTIType<Material, Resource, MaterialRTTI>
+	/************************************************************************/
+	/* 					HELPER STRUCTS TO HELP SERIALIZING                  */
+	/************************************************************************/
+
+	class CM_EXPORT MaterialFloatParam : public IReflectable
 	{
 	{
-	private:
-		struct FloatParam
+	public:
+		String name;
+		float value;
+		UINT32 arrayIdx;
+
+		friend class MaterialFloatParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialVec2Param : public IReflectable
+	{
+	public:
+		String name;
+		Vector2 value;
+		UINT32 arrayIdx;
+
+		friend class MaterialVec2ParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialVec3Param : public IReflectable
+	{
+	public:
+		String name;
+		Vector3 value;
+		UINT32 arrayIdx;
+
+		friend class MaterialVec3ParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialVec4Param : public IReflectable
+	{
+	public:
+		String name;
+		Vector4 value;
+		UINT32 arrayIdx;
+
+		friend class MaterialVec4ParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialMat3Param : public IReflectable
+	{
+	public:
+		String name;
+		Matrix3 value;
+		UINT32 arrayIdx;
+
+		friend class MaterialMat3ParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialMat4Param : public IReflectable
+	{
+	public:
+		String name;
+		Matrix4 value;
+		UINT32 arrayIdx;
+
+		friend class MaterialMat4ParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialTextureParam : public IReflectable
+	{
+	public:
+		String name;
+		TextureHandle value;
+
+		friend class MaterialTextureParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialSamplerStateParam : public IReflectable
+	{
+	public:
+		String name;
+		SamplerStateHandle value;
+
+		friend class MaterialSamplerStateParamRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	class CM_EXPORT MaterialParams : public IReflectable
+	{
+	public:
+		vector<MaterialFloatParam>::type floatParams;
+		vector<MaterialVec2Param>::type vec2Params;
+		vector<MaterialVec3Param>::type vec3Params;
+		vector<MaterialVec4Param>::type vec4Params;
+		vector<MaterialMat3Param>::type mat3Params;
+		vector<MaterialMat4Param>::type mat4Params;
+		vector<MaterialTextureParam>::type textureParams;
+		vector<MaterialSamplerStateParam>::type samplerStateParams;
+
+		friend class MaterialParamsRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const;	
+	};
+
+	/************************************************************************/
+	/* 				RTTI FOR HELPER STRUCTS TO HELP SERIALIZING             */
+	/************************************************************************/
+
+	class CM_EXPORT MaterialFloatParamRTTI : public RTTIType<MaterialFloatParam, IReflectable, MaterialFloatParamRTTI>
+	{
+	public:
+		String& getName(MaterialFloatParam* obj) { return obj->name; }
+		void setName(MaterialFloatParam* obj, String& name) { obj->name = name; }
+
+		float& getValue(MaterialFloatParam* obj) { return obj->value; }
+		void setValue(MaterialFloatParam* obj, float& value) { obj->value = value; }
+
+		UINT32& getArrayIdx(MaterialFloatParam* obj) { return obj->arrayIdx; }
+		void setArrayIdx(MaterialFloatParam* obj, UINT32& value) { obj->arrayIdx = value; }
+
+		MaterialFloatParamRTTI()
+		{
+			addPlainField("name", 0, &MaterialFloatParamRTTI::getName, &MaterialFloatParamRTTI::setName);
+			addPlainField("value", 1, &MaterialFloatParamRTTI::getValue, &MaterialFloatParamRTTI::setValue);
+			addPlainField("arrayIdx", 2, &MaterialFloatParamRTTI::getArrayIdx, &MaterialFloatParamRTTI::setArrayIdx);
+		}
+
+		virtual const String& getRTTIName()
+		{
+			static String name = "MaterialFloatParam";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() { return TID_MaterialParamFloat; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialFloatParam()); }
+	};
+
+	class CM_EXPORT MaterialVec2ParamRTTI : public RTTIType<MaterialVec2Param, IReflectable, MaterialVec2ParamRTTI>
+	{
+	public:
+		String& getName(MaterialVec2Param* obj) { return obj->name; }
+		void setName(MaterialVec2Param* obj, String& name) { obj->name = name; }
+
+		Vector2& getValue(MaterialVec2Param* obj) { return obj->value; }
+		void setValue(MaterialVec2Param* obj, Vector2& value) { obj->value = value; }
+
+		UINT32& getArrayIdx(MaterialVec2Param* obj) { return obj->arrayIdx; }
+		void setArrayIdx(MaterialVec2Param* obj, UINT32& value) { obj->arrayIdx = value; }
+
+		MaterialVec2ParamRTTI()
+		{
+			addPlainField("name", 0, &MaterialVec2ParamRTTI::getName, &MaterialVec2ParamRTTI::setName);
+			addPlainField("value", 1, &MaterialVec2ParamRTTI::getValue, &MaterialVec2ParamRTTI::setValue);
+			addPlainField("arrayIdx", 2, &MaterialVec2ParamRTTI::getArrayIdx, &MaterialVec2ParamRTTI::setArrayIdx);
+		}
+
+		virtual const String& getRTTIName()
+		{
+			static String name = "MaterialVec2Param";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() { return TID_MaterialParamVec2; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialVec2Param()); }
+	};
+
+	class CM_EXPORT MaterialVec3ParamRTTI : public RTTIType<MaterialVec3Param, IReflectable, MaterialVec3ParamRTTI>
+	{
+	public:
+		String& getName(MaterialVec3Param* obj) { return obj->name; }
+		void setName(MaterialVec3Param* obj, String& name) { obj->name = name; }
+
+		Vector3& getValue(MaterialVec3Param* obj) { return obj->value; }
+		void setValue(MaterialVec3Param* obj, Vector3& value) { obj->value = value; }
+
+		UINT32& getArrayIdx(MaterialVec3Param* obj) { return obj->arrayIdx; }
+		void setArrayIdx(MaterialVec3Param* obj, UINT32& value) { obj->arrayIdx = value; }
+
+		MaterialVec3ParamRTTI()
+		{
+			addPlainField("name", 0, &MaterialVec3ParamRTTI::getName, &MaterialVec3ParamRTTI::setName);
+			addPlainField("value", 1, &MaterialVec3ParamRTTI::getValue, &MaterialVec3ParamRTTI::setValue);
+			addPlainField("arrayIdx", 2, &MaterialVec3ParamRTTI::getArrayIdx, &MaterialVec3ParamRTTI::setArrayIdx);
+		}
+
+		virtual const String& getRTTIName()
 		{
 		{
-			FloatParam() {}
+			static String name = "MaterialVec3Param";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() { return TID_MaterialParamVec3; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialVec3Param()); }
+	};
+
+	class CM_EXPORT MaterialVec4ParamRTTI : public RTTIType<MaterialVec4Param, IReflectable, MaterialVec4ParamRTTI>
+	{
+	public:
+		String& getName(MaterialVec4Param* obj) { return obj->name; }
+		void setName(MaterialVec4Param* obj, String& name) { obj->name = name; }
+
+		Vector4& getValue(MaterialVec4Param* obj) { return obj->value; }
+		void setValue(MaterialVec4Param* obj, Vector4& value) { obj->value = value; }
+
+		UINT32& getArrayIdx(MaterialVec4Param* obj) { return obj->arrayIdx; }
+		void setArrayIdx(MaterialVec4Param* obj, UINT32& value) { obj->arrayIdx = value; }
+
+		MaterialVec4ParamRTTI()
+		{
+			addPlainField("name", 0, &MaterialVec4ParamRTTI::getName, &MaterialVec4ParamRTTI::setName);
+			addPlainField("value", 1, &MaterialVec4ParamRTTI::getValue, &MaterialVec4ParamRTTI::setValue);
+			addPlainField("arrayIdx", 2, &MaterialVec4ParamRTTI::getArrayIdx, &MaterialVec4ParamRTTI::setArrayIdx);
+		}
+
+		virtual const String& getRTTIName()
+		{
+			static String name = "MaterialVec4Param";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() { return TID_MaterialParamVec4; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialVec4Param()); }
+	};
+
+	class CM_EXPORT MaterialMat3ParamRTTI : public RTTIType<MaterialMat3Param, IReflectable, MaterialMat3ParamRTTI>
+	{
+	public:
+		String& getName(MaterialMat3Param* obj) { return obj->name; }
+		void setName(MaterialMat3Param* obj, String& name) { obj->name = name; }
+
+		Matrix3& getValue(MaterialMat3Param* obj) { return obj->value; }
+		void setValue(MaterialMat3Param* obj, Matrix3& value) { obj->value = value; }
+
+		UINT32& getArrayIdx(MaterialMat3Param* obj) { return obj->arrayIdx; }
+		void setArrayIdx(MaterialMat3Param* obj, UINT32& value) { obj->arrayIdx = value; }
+
+		MaterialMat3ParamRTTI()
+		{
+			addPlainField("name", 0, &MaterialMat3ParamRTTI::getName, &MaterialMat3ParamRTTI::setName);
+			addPlainField("value", 1, &MaterialMat3ParamRTTI::getValue, &MaterialMat3ParamRTTI::setValue);
+			addPlainField("arrayIdx", 2, &MaterialMat3ParamRTTI::getArrayIdx, &MaterialMat3ParamRTTI::setArrayIdx);
+		}
+
+		virtual const String& getRTTIName()
+		{
+			static String name = "MaterialMat3Param";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() { return TID_MaterialParamMat3; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialMat3Param()); }
+	};
+
+	class CM_EXPORT MaterialMat4ParamRTTI : public RTTIType<MaterialMat4Param, IReflectable, MaterialMat4ParamRTTI>
+	{
+	public:
+		String& getName(MaterialMat4Param* obj) { return obj->name; }
+		void setName(MaterialMat4Param* obj, String& name) { obj->name = name; }
+
+		Matrix4& getValue(MaterialMat4Param* obj) { return obj->value; }
+		void setValue(MaterialMat4Param* obj, Matrix4& value) { obj->value = value; }
+
+		UINT32& getArrayIdx(MaterialMat4Param* obj) { return obj->arrayIdx; }
+		void setArrayIdx(MaterialMat4Param* obj, UINT32& value) { obj->arrayIdx = value; }
+
+		MaterialMat4ParamRTTI()
+		{
+			addPlainField("name", 0, &MaterialMat4ParamRTTI::getName, &MaterialMat4ParamRTTI::setName);
+			addPlainField("value", 1, &MaterialMat4ParamRTTI::getValue, &MaterialMat4ParamRTTI::setValue);
+			addPlainField("arrayIdx", 2, &MaterialMat4ParamRTTI::getArrayIdx, &MaterialMat4ParamRTTI::setArrayIdx);
+		}
+
+		virtual const String& getRTTIName()
+		{
+			static String name = "MaterialMat4Param";
+			return name;
+		}
 
 
-			FloatParam(UINT32 bufferIdx, GpuConstantType type, UINT32 count)
-				:mBufferIdx(bufferIdx), mType(type), mCount(count)
-			{ }
+		virtual UINT32 getRTTIId() { return TID_MaterialParamMat4; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialMat4Param()); }
+	};
 
 
-			UINT32 mBufferIdx;
-			UINT32 mCount;
-			GpuConstantType mType;
-		};
+	class CM_EXPORT MaterialTextureParamRTTI : public RTTIType<MaterialTextureParam, IReflectable, MaterialTextureParamRTTI>
+	{
+	public:
+		String& getName(MaterialTextureParam* obj) { return obj->name; }
+		void setName(MaterialTextureParam* obj, String& name) { obj->name = name; }
 
 
-		class FloatParamKVPRTTI;
-		typedef KeyValuePair<String, FloatParam, FloatParamKVPRTTI> FloatParamKVP;
+		TextureHandle& getValue(MaterialTextureParam* obj) { return obj->value; }
+		void setValue(MaterialTextureParam* obj, TextureHandle& value) { obj->value = value; }
 
 
-		class FloatParamKVPRTTI : public RTTIType<FloatParamKVP, IReflectable, FloatParamKVPRTTI>
+		MaterialTextureParamRTTI()
 		{
 		{
-		private:
-			String& getKey(FloatParamKVP* obj) { return obj->mKey; }
-			void setKey(FloatParamKVP* obj,  String& val) { obj->mKey = val; }
-
-			FloatParam& getValue(FloatParamKVP* obj) { return obj->mValue; }
-			void setValue(FloatParamKVP* obj,  FloatParam& val) { obj->mValue = val; }
-
-		public:
-			FloatParamKVPRTTI()
-			{
-				addPlainField("mKey", 0, &FloatParamKVPRTTI::getKey, &FloatParamKVPRTTI::setKey);
-				addPlainField("mValue", 1, &FloatParamKVPRTTI::getValue, &FloatParamKVPRTTI::setValue);
-			}
-
-		public:
-			virtual const String& getRTTIName()
-			{
-				static String name = "FloatParamKVP";
-				return name;
-			}
-
-			virtual UINT32 getRTTIId()
-			{
-				return TID_FloatParamKVP;
-			}
-
-			virtual std::shared_ptr<IReflectable> newRTTIObject()
-			{
-				return std::shared_ptr<FloatParamKVP>(new FloatParamKVP());
-			}
-		};
-
-		class TexParamKVPRTTI;
-		typedef KeyValuePair<String, TextureHandle, TexParamKVPRTTI> TexParamKVP;
-
-		class TexParamKVPRTTI : public RTTIType<TexParamKVP, IReflectable, TexParamKVPRTTI>
+			addPlainField("name", 0, &MaterialTextureParamRTTI::getName, &MaterialTextureParamRTTI::setName);
+			addReflectableField("value", 1, &MaterialTextureParamRTTI::getValue, &MaterialTextureParamRTTI::setValue);
+		}
+
+		virtual const String& getRTTIName()
 		{
 		{
-		private:
-			String& getKey(TexParamKVP* obj) { return obj->mKey; }
-			void setKey(TexParamKVP* obj,  String& val) { obj->mKey = val; }
-
-			TextureHandle& getValue(TexParamKVP* obj) { return obj->mValue; }
-			void setValue(TexParamKVP* obj,  TextureHandle& val) { obj->mValue = val; }
-
-		public:
-			TexParamKVPRTTI()
-			{
-				addPlainField("mKey", 0, &TexParamKVPRTTI::getKey, &TexParamKVPRTTI::setKey);
-				addReflectableField("mValue", 1, &TexParamKVPRTTI::getValue, &TexParamKVPRTTI::setValue);
-			}
-
-		public:
-			virtual const String& getRTTIName()
-			{
-				static String name = "TexParamKVP";
-				return name;
-			}
-
-			virtual UINT32 getRTTIId()
-			{
-				return TID_MaterialTexParamKVP;
-			}
-
-			virtual std::shared_ptr<IReflectable> newRTTIObject()
-			{
-				return std::shared_ptr<TexParamKVP>(new TexParamKVP());
-			}
-		};
-
-		class SamplerStateParamKVPRTTI;
-		typedef KeyValuePair<String, SamplerStatePtr, SamplerStateParamKVPRTTI> SamplerStateKVP;
-
-		class SamplerStateParamKVPRTTI : public RTTIType<SamplerStateKVP, IReflectable, SamplerStateParamKVPRTTI>
+			static String name = "MaterialTextureParam";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() { return TID_MaterialParamTexture; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialTextureParam()); }
+	};
+
+	class CM_EXPORT MaterialSamplerStateParamRTTI : public RTTIType<MaterialSamplerStateParam, IReflectable, MaterialSamplerStateParamRTTI>
+	{
+	public:
+		String& getName(MaterialSamplerStateParam* obj) { return obj->name; }
+		void setName(MaterialSamplerStateParam* obj, String& name) { obj->name = name; }
+
+		SamplerStateHandle& getValue(MaterialSamplerStateParam* obj) { return obj->value; }
+		void setValue(MaterialSamplerStateParam* obj, SamplerStateHandle& value) { obj->value = value; }
+
+		MaterialSamplerStateParamRTTI()
 		{
 		{
-		private:
-			String& getKey(SamplerStateKVP* obj) { return obj->mKey; }
-			void setKey(SamplerStateKVP* obj,  String& val) { obj->mKey = val; }
-
-			SamplerStatePtr getValue(SamplerStateKVP* obj) { return obj->mValue; }
-			void setValue(SamplerStateKVP* obj,  SamplerStatePtr val) { obj->mValue = val; }
-
-		public:
-			SamplerStateParamKVPRTTI()
-			{
-				addPlainField("mKey", 0, &SamplerStateParamKVPRTTI::getKey, &SamplerStateParamKVPRTTI::setKey);
-				addReflectablePtrField("mValue", 1, &SamplerStateParamKVPRTTI::getValue, &SamplerStateParamKVPRTTI::setValue);
-			}
-
-		public:
-			virtual const String& getRTTIName()
-			{
-				static String name = "SamplerStateKVP";
-				return name;
-			}
-
-			virtual UINT32 getRTTIId()
-			{
-				return TID_SamplerStateParamKVP;
-			}
-
-			virtual std::shared_ptr<IReflectable> newRTTIObject()
-			{
-				return std::shared_ptr<SamplerStateKVP>(new SamplerStateKVP());
-			}
-		};
-
-		class MaterialParamsRTTI;
-
-		struct MaterialParams : public IReflectable
+			addPlainField("name", 0, &MaterialSamplerStateParamRTTI::getName, &MaterialSamplerStateParamRTTI::setName);
+			addReflectableField("value", 1, &MaterialSamplerStateParamRTTI::getValue, &MaterialSamplerStateParamRTTI::setValue);
+		}
+
+		virtual const String& getRTTIName()
 		{
 		{
-			map<String, FloatParam>::type mFloatParams;
-			map<String, TextureHandle>::type mTextureParams;
-			map<String, SamplerStatePtr>::type mSamplerStateParams;
+			static String name = "MaterialSamplerStateParam";
+			return name;
+		}
 
 
-			vector<float>::type mFloatBuffer;
+		virtual UINT32 getRTTIId() { return TID_MaterialParamSamplerState; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialSamplerStateParam()); }
+	};
 
 
-			/************************************************************************/
-			/* 								RTTI		                     		*/
-			/************************************************************************/
+	class CM_EXPORT MaterialParamsRTTI : public RTTIType<MaterialParams, IReflectable, MaterialParamsRTTI>
+	{
+	public:
+		MaterialFloatParam& getFloatParam(MaterialParams* obj, UINT32 idx) { return obj->floatParams[idx]; }
+		void setFloatParam(MaterialParams* obj, UINT32 idx, MaterialFloatParam& param) { obj->floatParams[idx] = param; }
+		UINT32 getFloatArraySize(MaterialParams* obj) { return (UINT32)obj->floatParams.size(); }
+		void setFloatArraySize(MaterialParams* obj, UINT32 size) { obj->floatParams.resize(size); }
+
+		MaterialVec2Param& getVec2Param(MaterialParams* obj, UINT32 idx) { return obj->vec2Params[idx]; }
+		void setVec2Param(MaterialParams* obj, UINT32 idx, MaterialVec2Param& param) { obj->vec2Params[idx] = param; }
+		UINT32 getVec2ArraySize(MaterialParams* obj) { return (UINT32)obj->vec2Params.size(); }
+		void setVec2ArraySize(MaterialParams* obj, UINT32 size) { obj->vec2Params.resize(size); }
+
+		MaterialVec3Param& getVec3Param(MaterialParams* obj, UINT32 idx) { return obj->vec3Params[idx]; }
+		void setVec3Param(MaterialParams* obj, UINT32 idx, MaterialVec3Param& param) { obj->vec3Params[idx] = param; }
+		UINT32 getVec3ArraySize(MaterialParams* obj) { return (UINT32)obj->vec3Params.size(); }
+		void setVec3ArraySize(MaterialParams* obj, UINT32 size) { obj->vec3Params.resize(size); }
+
+		MaterialVec4Param& getVec4Param(MaterialParams* obj, UINT32 idx) { return obj->vec4Params[idx]; }
+		void setVec4Param(MaterialParams* obj, UINT32 idx, MaterialVec4Param& param) { obj->vec4Params[idx] = param; }
+		UINT32 getVec4ArraySize(MaterialParams* obj) { return (UINT32)obj->vec4Params.size(); }
+		void setVec4ArraySize(MaterialParams* obj, UINT32 size) { obj->vec4Params.resize(size); }
+
+		MaterialMat3Param& getMat3Param(MaterialParams* obj, UINT32 idx) { return obj->mat3Params[idx]; }
+		void setMat3Param(MaterialParams* obj, UINT32 idx, MaterialMat3Param& param) { obj->mat3Params[idx] = param; }
+		UINT32 getMat3ArraySize(MaterialParams* obj) { return (UINT32)obj->mat3Params.size(); }
+		void setMat3ArraySize(MaterialParams* obj, UINT32 size) { obj->mat3Params.resize(size); }
+
+		MaterialMat4Param& getMat4Param(MaterialParams* obj, UINT32 idx) { return obj->mat4Params[idx]; }
+		void setMat4Param(MaterialParams* obj, UINT32 idx, MaterialMat4Param& param) { obj->mat4Params[idx] = param; }
+		UINT32 getMat4ArraySize(MaterialParams* obj) { return (UINT32)obj->mat4Params.size(); }
+		void setMat4ArraySize(MaterialParams* obj, UINT32 size) { obj->mat4Params.resize(size); }
+
+		MaterialTextureParam& getTextureParam(MaterialParams* obj, UINT32 idx) { return obj->textureParams[idx]; }
+		void setTextureParam(MaterialParams* obj, UINT32 idx, MaterialTextureParam& param) { obj->textureParams[idx] = param; }
+		UINT32 getTextureArraySize(MaterialParams* obj) { return (UINT32)obj->textureParams.size(); }
+		void setTextureArraySize(MaterialParams* obj, UINT32 size) { obj->textureParams.resize(size); }
+
+		MaterialSamplerStateParam& getSamplerStateParam(MaterialParams* obj, UINT32 idx) { return obj->samplerStateParams[idx]; }
+		void setSamplerStateParam(MaterialParams* obj, UINT32 idx, MaterialSamplerStateParam& param) { obj->samplerStateParams[idx] = param; }
+		UINT32 getSamplerStateArraySize(MaterialParams* obj) { return (UINT32)obj->samplerStateParams.size(); }
+		void setSamplerStateArraySize(MaterialParams* obj, UINT32 size) { obj->samplerStateParams.resize(size); }
+
+		MaterialParamsRTTI()
+		{
+			addReflectableArrayField("floatParams", 0, &MaterialParamsRTTI::getFloatParam, 
+				&MaterialParamsRTTI::getFloatArraySize, &MaterialParamsRTTI::setFloatParam, &MaterialParamsRTTI::setFloatArraySize);
 
 
-		public:
-			friend class MaterialRTTI::MaterialParamsRTTI;
+			addReflectableArrayField("vec2Params", 1, &MaterialParamsRTTI::getVec2Param, 
+				&MaterialParamsRTTI::getVec2ArraySize, &MaterialParamsRTTI::setVec2Param, &MaterialParamsRTTI::setVec2ArraySize);
 
 
-			static RTTITypeBase* getRTTIStatic();
-			RTTITypeBase* getRTTI() const;
-		};
+			addReflectableArrayField("vec3Params", 2, &MaterialParamsRTTI::getVec3Param, 
+				&MaterialParamsRTTI::getVec3ArraySize, &MaterialParamsRTTI::setVec3Param, &MaterialParamsRTTI::setVec3ArraySize);
 
 
-		class MaterialParamsRTTI : public RTTIType<MaterialParams, IReflectable, MaterialParamsRTTI>
+			addReflectableArrayField("vec4Params", 3, &MaterialParamsRTTI::getVec4Param, 
+				&MaterialParamsRTTI::getVec4ArraySize, &MaterialParamsRTTI::setVec4Param, &MaterialParamsRTTI::setVec4ArraySize);
+
+			addReflectableArrayField("mat3Params", 4, &MaterialParamsRTTI::getMat3Param, 
+				&MaterialParamsRTTI::getMat3ArraySize, &MaterialParamsRTTI::setMat3Param, &MaterialParamsRTTI::setMat3ArraySize);
+
+			addReflectableArrayField("mat4Params", 5, &MaterialParamsRTTI::getMat4Param, 
+				&MaterialParamsRTTI::getMat4ArraySize, &MaterialParamsRTTI::setMat4Param, &MaterialParamsRTTI::setMat4ArraySize);
+
+			addReflectableArrayField("textureParams", 6, &MaterialParamsRTTI::getTextureParam, 
+				&MaterialParamsRTTI::getTextureArraySize, &MaterialParamsRTTI::setTextureParam, &MaterialParamsRTTI::setTextureArraySize);
+
+			addReflectableArrayField("samplerStateParams", 7, &MaterialParamsRTTI::getSamplerStateParam, 
+				&MaterialParamsRTTI::getSamplerStateArraySize, &MaterialParamsRTTI::setSamplerStateParam, &MaterialParamsRTTI::setSamplerStateArraySize);
+		}
+
+		virtual const String& getRTTIName()
 		{
 		{
-		private:
-			struct TempParams
-			{
-				vector<std::shared_ptr<FloatParamKVP>>::type mFloatParams;
-				vector<std::shared_ptr<TexParamKVP>>::type mTexParams;
-				vector<std::shared_ptr<SamplerStateKVP>>::type mSamplerStateParams;
-			};
-
-			std::shared_ptr<FloatParamKVP> getFloatParam(MaterialParams* obj, UINT32 idx)
-			{
-				UINT32 curIdx = 0;
-				for(auto iter = obj->mFloatParams.begin(); iter != obj->mFloatParams.end(); ++iter)
-				{
-					if(curIdx == idx)
-					{
-						return std::shared_ptr<FloatParamKVP>(new FloatParamKVP(iter->first, iter->second));
-					}
-
-					curIdx++;
-				}
-
-				CM_EXCEPT(InternalErrorException, "Invalid index.");
-			}
-
-			void setFloatParam(MaterialParams* obj, UINT32 idx, std::shared_ptr<FloatParamKVP> value)
-			{
-				TempParams* tempParams = boost::any_cast<TempParams*>(obj->mRTTIData);
-				tempParams->mFloatParams.push_back(value);
-			}
-
-			void setNumFloatParams(MaterialParams* obj, UINT32 size)
-			{
-				// Do nothing. Map is expanded automatically as entries are added
-			}
-
-			UINT32 getNumFloatParams(MaterialParams* obj)
-			{
-				return (UINT32)obj->mFloatParams.size();
-			}
-
-			std::shared_ptr<TexParamKVP> getTexParam(MaterialParams* obj, UINT32 idx)
-			{
-				UINT32 curIdx = 0;
-				for(auto iter = obj->mTextureParams.begin(); iter != obj->mTextureParams.end(); ++iter)
-				{
-					if(curIdx == idx)
-					{
-						return std::shared_ptr<TexParamKVP>(new TexParamKVP(iter->first, iter->second));
-					}
-
-					curIdx++;
-				}
-
-				CM_EXCEPT(InternalErrorException, "Invalid index.");
-			}
-
-			void setTexParam(MaterialParams* obj, UINT32 idx, std::shared_ptr<TexParamKVP> value)
-			{
-				TempParams* tempParams = boost::any_cast<TempParams*>(obj->mRTTIData);
-				tempParams->mTexParams.push_back(value);
-			}
-
-			void setNumTexParams(MaterialParams* obj, UINT32 size)
-			{
-				// Do nothing. Map is expanded automatically as entries are added
-			}
-
-			UINT32 getNumTexParams(MaterialParams* obj)
-			{
-				return (UINT32)obj->mTextureParams.size();
-			}
-
-			std::shared_ptr<SamplerStateKVP> getSamplerStateParam(MaterialParams* obj, UINT32 idx)
-			{
-				UINT32 curIdx = 0;
-				for(auto iter = obj->mSamplerStateParams.begin(); iter != obj->mSamplerStateParams.end(); ++iter)
-				{
-					if(curIdx == idx)
-					{
-						return std::shared_ptr<SamplerStateKVP>(new SamplerStateKVP(iter->first, iter->second));
-					}
-
-					curIdx++;
-				}
-
-				CM_EXCEPT(InternalErrorException, "Invalid index.");
-			}
-
-			void setSamplerStateParam(MaterialParams* obj, UINT32 idx, std::shared_ptr<SamplerStateKVP> value)
-			{
-				TempParams* tempParams = boost::any_cast<TempParams*>(obj->mRTTIData);
-				tempParams->mSamplerStateParams.push_back(value);
-			}
-
-			void setNumSamplerStateParams(MaterialParams* obj, UINT32 size)
-			{
-				// Do nothing. Map is expanded automatically as entries are added
-			}
-
-			UINT32 getNumSamplerStateParams(MaterialParams* obj)
-			{
-				return (UINT32)obj->mSamplerStateParams.size();
-			}
-
-			ManagedDataBlock getFloatBuffer(MaterialParams* obj)
-			{
-				UINT32 bufferSize = (UINT32)obj->mFloatBuffer.size();
-				float* buffer = new float[bufferSize];
-
-				for(UINT32 i = 0; i < bufferSize; i++)
-					buffer[i] = obj->mFloatBuffer[i];
-
-				return ManagedDataBlock((UINT8*)buffer, bufferSize, true);
-			}
-
-			void setFloatBuffer(MaterialParams* obj, ManagedDataBlock data)
-			{
-				obj->mFloatBuffer.clear();
-
-				float* buffer = (float*)data.getData();
-				for(UINT32 i = 0; i < data.getSize(); i++)
-					obj->mFloatBuffer.push_back(buffer[i]);
-
-				data.destroy();
-			}
-
-		public:
-			MaterialParamsRTTI()
-			{
-				addReflectablePtrArrayField("mFloatParams", 0, &MaterialParamsRTTI::getFloatParam, &MaterialParamsRTTI::getNumFloatParams, 
-					&MaterialParamsRTTI::setFloatParam, &MaterialParamsRTTI::setNumFloatParams);
-				addReflectablePtrArrayField("mTexParams", 1, &MaterialParamsRTTI::getTexParam, &MaterialParamsRTTI::getNumTexParams, 
-					&MaterialParamsRTTI::setTexParam, &MaterialParamsRTTI::setNumTexParams);
-				addReflectablePtrArrayField("mSamplerStateParams", 2, &MaterialParamsRTTI::getSamplerStateParam, &MaterialParamsRTTI::getNumSamplerStateParams, 
-					&MaterialParamsRTTI::setSamplerStateParam, &MaterialParamsRTTI::setNumSamplerStateParams);
-				addDataBlockField("mFloatBuffer", 3, &MaterialParamsRTTI::getFloatBuffer, &MaterialParamsRTTI::setFloatBuffer);
-			}
-
-			virtual void onDeserializationStarted(IReflectable* obj)
-			{
-				MaterialParams* materialParams = static_cast<MaterialParams*>(obj);
-				materialParams->mRTTIData = new TempParams();
-			}
-
-			virtual void onDeserializationEnded(IReflectable* obj)
-			{
-				// TODO Low priority:
-				// Due to the way serialization is done I cannot guarantee "value"s key/value fields
-				// have been set, so I need to delay accessing them until the end of serialization.
-				// I'd really like to avoid this as its not intuitive to think in this way.
-
-				MaterialParams* materialParams = static_cast<MaterialParams*>(obj);
-
-				if(materialParams->mRTTIData.empty())
-					return;
-
-				TempParams* tempParams = boost::any_cast<TempParams*>(materialParams->mRTTIData);
-
-				for(auto iter = tempParams->mFloatParams.begin(); iter != tempParams->mFloatParams.end(); ++iter)
-				{
-					std::shared_ptr<FloatParamKVP> floatParam = *iter;
-					materialParams->mFloatParams[floatParam->mKey] = floatParam->mValue;
-				}
-
-				for(auto iter = tempParams->mTexParams.begin(); iter != tempParams->mTexParams.end(); ++iter)
-				{
-					std::shared_ptr<TexParamKVP> texParam = *iter;
-					materialParams->mTextureParams[texParam->mKey] = texParam->mValue;
-				}
-
-				for(auto iter = tempParams->mSamplerStateParams.begin(); iter != tempParams->mSamplerStateParams.end(); ++iter)
-				{
-					std::shared_ptr<SamplerStateKVP> samplerStateParam = *iter;
-					materialParams->mSamplerStateParams[samplerStateParam->mKey] = samplerStateParam->mValue;
-				}
-
-				materialParams->mRTTIData = nullptr;
-			}
-
-			virtual const String& getRTTIName()
-			{
-				static String name = "MaterialParams";
-				return name;
-			}
-
-			virtual UINT32 getRTTIId()
-			{
-				return TID_MaterialParams;
-			}
-
-			virtual std::shared_ptr<IReflectable> newRTTIObject()
-			{
-				return std::shared_ptr<MaterialParams>(new MaterialParams());
-			}
-		};
+			static String name = "MaterialParams";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() { return TID_MaterialParams; }
+		virtual std::shared_ptr<IReflectable> newRTTIObject() { return std::shared_ptr<IReflectable>(new MaterialParams()); }
+	};
+
+	// TODO - Add MaterialParamsRTTI
+	// - Add a way to fill and read from MaterialParams
 
 
+	class CM_EXPORT MaterialRTTI : public RTTIType<Material, Resource, MaterialRTTI>
+	{
+	private:
 		ShaderPtr getShader(Material* obj)
 		ShaderPtr getShader(Material* obj)
 		{
 		{
 			return obj->mShader;
 			return obj->mShader;

+ 10 - 1
CamelotRenderer/Include/CmPrerequisites.h

@@ -232,7 +232,15 @@ namespace CamelotEngine
 		TID_SamplerStateParamKVP = 1022,
 		TID_SamplerStateParamKVP = 1022,
 		TID_BlendState = 1023,
 		TID_BlendState = 1023,
 		TID_RasterizerState = 1024,
 		TID_RasterizerState = 1024,
-		TID_DepthStencilState = 1025
+		TID_DepthStencilState = 1025,
+		TID_MaterialParamFloat = 1026,
+		TID_MaterialParamVec2 = 1027,
+		TID_MaterialParamVec3 = 1028,
+		TID_MaterialParamVec4 = 1029,
+		TID_MaterialParamMat3 = 1030,
+		TID_MaterialParamMat4 = 1031,
+		TID_MaterialParamTexture = 1032,
+		TID_MaterialParamSamplerState = 1033
 	};
 	};
 }
 }
 
 
@@ -250,6 +258,7 @@ namespace CamelotEngine
 	typedef ResourceHandle<GpuProgram> GpuProgramHandle;
 	typedef ResourceHandle<GpuProgram> GpuProgramHandle;
 	typedef ResourceHandle<HighLevelGpuProgram> HighLevelGpuProgramHandle;
 	typedef ResourceHandle<HighLevelGpuProgram> HighLevelGpuProgramHandle;
 	typedef ResourceHandle<Material> MaterialHandle;
 	typedef ResourceHandle<Material> MaterialHandle;
+	typedef ResourceHandle<SamplerState> SamplerStateHandle;
 	typedef ResourceHandle<RasterizerState> RasterizerStateHandle;
 	typedef ResourceHandle<RasterizerState> RasterizerStateHandle;
 	typedef ResourceHandle<DepthStencilState> DepthStencilStateHandle;
 	typedef ResourceHandle<DepthStencilState> DepthStencilStateHandle;
 	typedef ResourceHandle<BlendState> BlendStateHandle;
 	typedef ResourceHandle<BlendState> BlendStateHandle;

+ 10 - 0
CamelotRenderer/Include/CmShader.h

@@ -67,10 +67,20 @@ namespace CamelotEngine
 		void removeParameter(const String& name);
 		void removeParameter(const String& name);
 		void setParamBlockAttribs(const String& name, bool shared, GpuParamBlockUsage usage);
 		void setParamBlockAttribs(const String& name, bool shared, GpuParamBlockUsage usage);
 
 
+		GpuParamType getParamType(const String& name) const;
+		const SHADER_DATA_PARAM_DESC& getDataParamDesc(const String& name) const;
+		const SHADER_OBJECT_PARAM_DESC& getObjectParamDesc(const String& name) const;
+
+		bool hasDataParam(const String& name) const;
+		bool hasObjectParam(const String& name) const;
+
 		const map<String, SHADER_DATA_PARAM_DESC>::type& getDataParams() const { return mDataParams; }
 		const map<String, SHADER_DATA_PARAM_DESC>::type& getDataParams() const { return mDataParams; }
 		const map<String, SHADER_OBJECT_PARAM_DESC>::type& getObjectParams() const { return mObjectParams; }
 		const map<String, SHADER_OBJECT_PARAM_DESC>::type& getObjectParams() const { return mObjectParams; }
 		const map<String, SHADER_PARAM_BLOCK_DESC>::type& getParamBlocks() const { return mParamBlocks; }
 		const map<String, SHADER_PARAM_BLOCK_DESC>::type& getParamBlocks() const { return mParamBlocks; }
 
 
+		static bool isSampler(GpuParamObjectType type);
+		static bool isTexture(GpuParamObjectType type);
+		static bool isBuffer(GpuParamObjectType type);
 	private:
 	private:
 		String mName;
 		String mName;
 		vector<TechniquePtr>::type mTechniques;
 		vector<TechniquePtr>::type mTechniques;

+ 3 - 3
CamelotRenderer/Source/CmGpuParams.cpp

@@ -220,7 +220,7 @@ namespace CamelotEngine
 		}
 		}
 	}
 	}
 
 
-	void GpuParams::setTexture(const String& name, TextureHandle val)
+	void GpuParams::setTexture(const String& name, TextureHandle& val)
 	{
 	{
 		auto paramIter = mParamDesc.textures.find(name);
 		auto paramIter = mParamDesc.textures.find(name);
 		if(paramIter == mParamDesc.textures.end())
 		if(paramIter == mParamDesc.textures.end())
@@ -243,7 +243,7 @@ namespace CamelotEngine
 		return mTextures[slot];
 		return mTextures[slot];
 	}
 	}
 
 
-	void GpuParams::setSamplerState(const String& name, SamplerStatePtr val)
+	void GpuParams::setSamplerState(const String& name, SamplerStateHandle& val)
 	{
 	{
 		auto paramIter = mParamDesc.samplers.find(name);
 		auto paramIter = mParamDesc.samplers.find(name);
 		if(paramIter == mParamDesc.samplers.end())
 		if(paramIter == mParamDesc.samplers.end())
@@ -255,7 +255,7 @@ namespace CamelotEngine
 		mSamplerStates[paramIter->second.slot] = val;
 		mSamplerStates[paramIter->second.slot] = val;
 	}
 	}
 
 
-	SamplerStatePtr GpuParams::getSamplerState(UINT32 slot)
+	SamplerStateHandle GpuParams::getSamplerState(UINT32 slot)
 	{
 	{
 		if(slot < 0 || slot >= (UINT32)mSamplerStates.size())
 		if(slot < 0 || slot >= (UINT32)mSamplerStates.size())
 		{
 		{

+ 169 - 16
CamelotRenderer/Source/CmMaterial.cpp

@@ -35,6 +35,14 @@ namespace CamelotEngine
 	{
 	{
 		mBestTechnique = nullptr;
 		mBestTechnique = nullptr;
 		mParametersPerPass.clear();
 		mParametersPerPass.clear();
+		mFloatValues.clear();
+		mVec2Values.clear();
+		mVec3Values.clear();
+		mVec4Values.clear();
+		mMat3Values.clear();
+		mMat4Values.clear();
+		mTextureValues.clear();
+		mSamplerValues.clear();
 
 
 		if(mShader)
 		if(mShader)
 		{
 		{
@@ -153,6 +161,30 @@ namespace CamelotEngine
 
 
 				String& paramBlockName = findBlockIter->second;
 				String& paramBlockName = findBlockIter->second;
 				mValidParams.insert(iter->first);
 				mValidParams.insert(iter->first);
+
+				switch(iter->second.type)
+				{
+				case GPDT_FLOAT1:
+					mFloatValues[iter->first].resize(iter->second.arraySize);
+					break;
+				case GPDT_FLOAT2:
+					mVec2Values[iter->first].resize(iter->second.arraySize);
+					break;
+				case GPDT_FLOAT3:
+					mVec3Values[iter->first].resize(iter->second.arraySize);
+					break;
+				case GPDT_FLOAT4:
+					mVec4Values[iter->first].resize(iter->second.arraySize);
+					break;
+				case GPDT_MATRIX_3X3:
+					mMat3Values[iter->first].resize(iter->second.arraySize);
+					break;
+				case GPDT_MATRIX_4X4:
+					mMat4Values[iter->first].resize(iter->second.arraySize);
+					break;
+				default:
+					CM_EXCEPT(InternalErrorException, "Unsupported data type.");
+				}
 			}
 			}
 
 
 			// Create object param mappings
 			// Create object param mappings
@@ -166,6 +198,23 @@ namespace CamelotEngine
 					continue;
 					continue;
 
 
 				mValidParams.insert(iter->first);
 				mValidParams.insert(iter->first);
+
+				if(Shader::isSampler(iter->second.type))
+				{
+					mSamplerValues[iter->first] = SamplerStateHandle();
+				}
+				else if(Shader::isTexture(iter->second.type))
+				{
+					mTextureValues[iter->first] = TextureHandle();
+				}
+				else if(Shader::isBuffer(iter->second.type))
+				{
+					// TODO
+
+					CM_EXCEPT(NotImplementedException, "Buffers not implemented.");
+				}
+				else
+					CM_EXCEPT(InternalErrorException, "Invalid object param type.");
 			}
 			}
 
 
 			for(UINT32 i = 0; i < mBestTechnique->getNumPasses(); i++)
 			for(UINT32 i = 0; i < mBestTechnique->getNumPasses(); i++)
@@ -556,9 +605,11 @@ namespace CamelotEngine
 				}
 				}
 			}
 			}
 		}
 		}
+
+		mTextureValues[name] = value;
 	}
 	}
 
 
-	void Material::setSamplerState(const String& name, SamplerStatePtr samplerState)
+	void Material::setSamplerState(const String& name, SamplerStateHandle& samplerState)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -583,9 +634,11 @@ namespace CamelotEngine
 				}
 				}
 			}
 			}
 		}
 		}
+
+		mSamplerValues[name] = samplerState;
 	}
 	}
 
 
-	void Material::setFloat(const String& name, float value)
+	void Material::setFloat(const String& name, float value, UINT32 arrayIdx)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -596,10 +649,13 @@ namespace CamelotEngine
 			return;
 			return;
 		}
 		}
 
 
-		setParam(name, value);
+		setParam(name, value, arrayIdx);
+
+		auto savedValue = mFloatValues[name];
+		savedValue[arrayIdx] = value;
 	}
 	}
 
 
-	void Material::setColor(const String& name, const Color& value)
+	void Material::setColor(const String& name, const Color& value, UINT32 arrayIdx)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -610,10 +666,13 @@ namespace CamelotEngine
 			return;
 			return;
 		}
 		}
 
 
-		setParam(name, value);
+		setParam(name, value, arrayIdx);
+
+		auto savedValue = mVec4Values[name];
+		savedValue[arrayIdx] = Vector4(value.r, value.g, value.b, value.a);
 	}
 	}
 
 
-	void Material::setVec2(const String& name, const Vector2& value)
+	void Material::setVec2(const String& name, const Vector2& value, UINT32 arrayIdx)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -624,10 +683,13 @@ namespace CamelotEngine
 			return;
 			return;
 		}
 		}
 
 
-		setParam(name, value);
+		setParam(name, value, arrayIdx);
+
+		auto savedValue = mVec2Values[name];
+		savedValue[arrayIdx] = value;
 	}
 	}
 
 
-	void Material::setVec3(const String& name, const Vector3& value)
+	void Material::setVec3(const String& name, const Vector3& value, UINT32 arrayIdx)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -638,10 +700,13 @@ namespace CamelotEngine
 			return;
 			return;
 		}
 		}
 
 
-		setParam(name, value);
+		setParam(name, value, arrayIdx);
+
+		auto savedValue = mVec3Values[name];
+		savedValue[arrayIdx] = value;
 	}
 	}
 
 
-	void Material::setVec4(const String& name, const Vector4& value)
+	void Material::setVec4(const String& name, const Vector4& value, UINT32 arrayIdx)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -652,10 +717,13 @@ namespace CamelotEngine
 			return;
 			return;
 		}
 		}
 
 
-		setParam(name, value);
+		setParam(name, value, arrayIdx);
+
+		auto savedValue = mVec4Values[name];
+		savedValue[arrayIdx] = value;
 	}
 	}
 
 
-	void Material::setMat3(const String& name, const Matrix3& value)
+	void Material::setMat3(const String& name, const Matrix3& value, UINT32 arrayIdx)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -666,10 +734,13 @@ namespace CamelotEngine
 			return;
 			return;
 		}
 		}
 
 
-		setParam(name, value);
+		setParam(name, value, arrayIdx);
+
+		auto savedValue = mMat3Values[name];
+		savedValue[arrayIdx] = value;
 	}
 	}
 
 
-	void Material::setMat4(const String& name, const Matrix4& value)
+	void Material::setMat4(const String& name, const Matrix4& value, UINT32 arrayIdx)
 	{
 	{
 		throwIfNotInitialized();
 		throwIfNotInitialized();
 
 
@@ -680,9 +751,11 @@ namespace CamelotEngine
 			return;
 			return;
 		}
 		}
 
 
-		setParam(name, value);
-	}
+		setParam(name, value, arrayIdx);
 
 
+		auto savedValue = mMat4Values[name];
+		savedValue[arrayIdx] = value;
+	}
 
 
 	void Material::setParamBlock(const String& name, GpuParamBlockPtr paramBlock)
 	void Material::setParamBlock(const String& name, GpuParamBlockPtr paramBlock)
 	{
 	{
@@ -732,6 +805,86 @@ namespace CamelotEngine
 		return mParametersPerPass[passIdx];
 		return mParametersPerPass[passIdx];
 	}
 	}
 
 
+	TextureHandle Material::getTexture(const String& name) const
+	{
+		auto iterFind = mTextureValues.find(name);
+
+		if(iterFind == mTextureValues.end())
+			CM_EXCEPT(InternalErrorException, "No texture parameter with the name: " + name);
+
+		return iterFind->second;
+	}
+
+	SamplerStateHandle Material::getSamplerState(const String& name) const
+	{
+		auto iterFind = mSamplerValues.find(name);
+
+		if(iterFind == mSamplerValues.end())
+			CM_EXCEPT(InternalErrorException, "No sampler state parameter with the name: " + name);
+
+		return iterFind->second;
+	}
+
+	float Material::getFloat(const String& name, UINT32 arrayIdx) const
+	{
+		auto iterFind = mFloatValues.find(name);
+
+		if(iterFind == mFloatValues.end())
+			CM_EXCEPT(InternalErrorException, "No float parameter with the name: " + name);
+
+		return iterFind->second.at(arrayIdx);
+	}
+
+	Vector2 Material::getVec2(const String& name, UINT32 arrayIdx) const
+	{
+		auto iterFind = mVec2Values.find(name);
+
+		if(iterFind == mVec2Values.end())
+			CM_EXCEPT(InternalErrorException, "No float parameter with the name: " + name);
+
+		return iterFind->second.at(arrayIdx);
+	}
+
+	Vector3 Material::getVec3(const String& name, UINT32 arrayIdx) const
+	{
+		auto iterFind = mVec3Values.find(name);
+
+		if(iterFind == mVec3Values.end())
+			CM_EXCEPT(InternalErrorException, "No float parameter with the name: " + name);
+
+		return iterFind->second.at(arrayIdx);
+	}
+
+	Vector4 Material::getVec4(const String& name, UINT32 arrayIdx) const
+	{
+		auto iterFind = mVec4Values.find(name);
+
+		if(iterFind == mVec4Values.end())
+			CM_EXCEPT(InternalErrorException, "No float parameter with the name: " + name);
+
+		return iterFind->second.at(arrayIdx);
+	}
+
+	Matrix3 Material::getMat3(const String& name, UINT32 arrayIdx) const
+	{
+		auto iterFind = mMat3Values.find(name);
+
+		if(iterFind == mMat3Values.end())
+			CM_EXCEPT(InternalErrorException, "No float parameter with the name: " + name);
+
+		return iterFind->second.at(arrayIdx);
+	}
+
+	Matrix4 Material::getMat4(const String& name, UINT32 arrayIdx) const
+	{
+		auto iterFind = mMat4Values.find(name);
+
+		if(iterFind == mMat4Values.end())
+			CM_EXCEPT(InternalErrorException, "No float parameter with the name: " + name);
+
+		return iterFind->second.at(arrayIdx);
+	}
+
 	RTTITypeBase* Material::getRTTIStatic()
 	RTTITypeBase* Material::getRTTIStatic()
 	{
 	{
 		return MaterialRTTI::instance();
 		return MaterialRTTI::instance();

+ 213 - 126
CamelotRenderer/Source/CmMaterialRTTI.cpp

@@ -3,103 +3,164 @@
 
 
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {
-	RTTITypeBase* MaterialRTTI::MaterialParams::getRTTIStatic()
-	{
-		return MaterialParamsRTTI::instance();
-	}
+	RTTITypeBase* MaterialFloatParam::getRTTIStatic() { return MaterialFloatParamRTTI::instance(); }
+	RTTITypeBase* MaterialFloatParam::getRTTI() const { return MaterialFloatParam::getRTTIStatic(); }
 
 
-	RTTITypeBase* MaterialRTTI::MaterialParams::getRTTI() const
-	{
-		return MaterialParams::getRTTIStatic();
-	}
+	RTTITypeBase* MaterialVec2Param::getRTTIStatic() { return MaterialVec2ParamRTTI::instance(); }
+	RTTITypeBase* MaterialVec2Param::getRTTI() const { return MaterialVec2Param::getRTTIStatic(); }
 
 
-	void MaterialRTTI::onSerializationStarted(IReflectable* obj)
-	{
-		Material* material = static_cast<Material*>(obj);
-		std::shared_ptr<MaterialParams> params = std::shared_ptr<MaterialParams>(new MaterialParams());
+	RTTITypeBase* MaterialVec3Param::getRTTIStatic() { return MaterialVec3ParamRTTI::instance(); }
+	RTTITypeBase* MaterialVec3Param::getRTTI() const { return MaterialVec3Param::getRTTIStatic(); }
 
 
-		vector<GpuParamsPtr>::type allParams;
-		//for(size_t i = 0; i < material->mParameters.size(); i++)
-		//{
-		//	if(material->mParameters[i]->mFragParams != nullptr)
-		//		allParams.push_back(material->mParameters[i]->mFragParams);
+	RTTITypeBase* MaterialVec4Param::getRTTIStatic() { return MaterialVec4ParamRTTI::instance(); }
+	RTTITypeBase* MaterialVec4Param::getRTTI() const { return MaterialVec4Param::getRTTIStatic(); }
 
 
-		//	if(material->mParameters[i]->mVertParams != nullptr)
-		//		allParams.push_back(material->mParameters[i]->mVertParams);
+	RTTITypeBase* MaterialMat3Param::getRTTIStatic() { return MaterialMat3ParamRTTI::instance(); }
+	RTTITypeBase* MaterialMat3Param::getRTTI() const { return MaterialMat3Param::getRTTIStatic(); }
 
 
-		//	if(material->mParameters[i]->mGeomParams != nullptr)
-		//		allParams.push_back(material->mParameters[i]->mGeomParams);
-		//}
+	RTTITypeBase* MaterialMat4Param::getRTTIStatic() { return MaterialMat4ParamRTTI::instance(); }
+	RTTITypeBase* MaterialMat4Param::getRTTI() const { return MaterialMat4Param::getRTTIStatic(); }
 
 
-		for(size_t i = 0; i < allParams.size(); i++)
-		{
-			const GpuParamDesc& paramDesc = allParams[i]->getParamDesc();
+	RTTITypeBase* MaterialTextureParam::getRTTIStatic() { return MaterialTextureParamRTTI::instance(); }
+	RTTITypeBase* MaterialTextureParam::getRTTI() const { return MaterialTextureParam::getRTTIStatic(); }
 
 
-			for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
-			{
-				params->mTextureParams[iter->first] = allParams[i]->getTexture(iter->second.slot);
-			}
+	RTTITypeBase* MaterialSamplerStateParam::getRTTIStatic() { return MaterialSamplerStateParamRTTI::instance(); }
+	RTTITypeBase* MaterialSamplerStateParam::getRTTI() const { return MaterialSamplerStateParam::getRTTIStatic(); }
 
 
-			for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
-			{
-				params->mSamplerStateParams[iter->first] = allParams[i]->getSamplerState(iter->second.slot);
-			}
+	RTTITypeBase* MaterialParams::getRTTIStatic() { return MaterialParamsRTTI::instance(); }
+	RTTITypeBase* MaterialParams::getRTTI() const { return MaterialParams::getRTTIStatic(); }
 
 
-			for(auto iter = paramDesc.params.begin(); iter != paramDesc.params.end(); ++iter)
-			{
-				// TODO - Need to save float/int/bool parameters!
-			}
+	void MaterialRTTI::onSerializationStarted(IReflectable* obj)
+	{
+		Material* material = static_cast<Material*>(obj);
+		std::shared_ptr<MaterialParams> params = std::shared_ptr<MaterialParams>(new MaterialParams());
 
 
-			/*const GpuNamedConstants& namedConstants = allParams[i]->getConstantDefinitions();
+		ShaderPtr shader = material->getShader();
+		if(shader != nullptr)
+		{
+			const set<String>::type& validParamNames = material->getValidParamNames();
 
 
-			float tempValue[16];
-			for(auto iter = namedConstants.map.begin(); iter != namedConstants.map.end(); ++iter)
+			for(auto iter = validParamNames.begin(); iter != validParamNames.end(); ++iter)
 			{
 			{
-				const GpuConstantDefinition& def = iter->second;
+				GpuParamType type = shader->getParamType(*iter);
 
 
-				if(def.constType == GCT_SAMPLER2D)
+				if(type == GPT_DATA)
 				{
 				{
-					TextureHandle texture;
-					allParams[i]->getTexture(iter->second.physicalIndex, texture);
-					params->mTextureParams[iter->first] = texture;
+					const SHADER_DATA_PARAM_DESC& paramDesc = shader->getDataParamDesc(*iter);
 
 
-					SamplerStatePtr samplerState = allParams[i]->getSamplerState(iter->second.physicalIndex);
-					params->mSamplerStateParams[iter->first] = samplerState;
-				}
-				else
-				{
-					UINT32 fieldSize = def.getElementSize(def.constType, false);
-					switch(def.constType)
+					switch(paramDesc.type)
 					{
 					{
-					case GCT_FLOAT1:
-					case GCT_FLOAT2:
-					case GCT_FLOAT3:
-					case GCT_FLOAT4:
-					case GCT_MATRIX_3X3:
-					case GCT_MATRIX_4X4:
-					case GCT_SAMPLER2D:
+					case GPDT_FLOAT1:
+						{
+							for(UINT32 i = 0; i < paramDesc.arraySize; i++)
+							{
+								MaterialFloatParam param;
+								param.name = *iter;
+								param.value = material->getFloat(*iter, i);
+								param.arrayIdx = i;
+
+								params->floatParams.push_back(param);
+							}
+						}
+						break;
+					case GPDT_FLOAT2:
+						{
+							for(UINT32 i = 0; i < paramDesc.arraySize; i++)
+							{
+								MaterialVec2Param param;
+								param.name = *iter;
+								param.value = material->getVec2(*iter, i);
+								param.arrayIdx = i;
+
+								params->vec2Params.push_back(param);
+							}
+						}
+						break;
+					case GPDT_FLOAT3:
+						{
+							for(UINT32 i = 0; i < paramDesc.arraySize; i++)
+							{
+								MaterialVec3Param param;
+								param.name = *iter;
+								param.value = material->getVec3(*iter, i);
+								param.arrayIdx = i;
+
+								params->vec3Params.push_back(param);
+							}
+						}
+						break;
+					case GPDT_FLOAT4:
+						{
+							for(UINT32 i = 0; i < paramDesc.arraySize; i++)
+							{
+								MaterialVec4Param param;
+								param.name = *iter;
+								param.value = material->getVec4(*iter, i);
+								param.arrayIdx = i;
+
+								params->vec4Params.push_back(param);
+							}
+						}
+						break;
+					case GPDT_MATRIX_3X3:
+						{
+							for(UINT32 i = 0; i < paramDesc.arraySize; i++)
+							{
+								MaterialMat3Param param;
+								param.name = *iter;
+								param.value = material->getMat3(*iter, i);
+								param.arrayIdx = i;
+
+								params->mat3Params.push_back(param);
+							}
+						}
+						break;
+					case GPDT_MATRIX_4X4:
+						{
+							for(UINT32 i = 0; i < paramDesc.arraySize; i++)
+							{
+								MaterialMat4Param param;
+								param.name = *iter;
+								param.value = material->getMat4(*iter, i);
+								param.arrayIdx = i;
+
+								params->mat4Params.push_back(param);
+							}
+						}
 						break;
 						break;
 					default:
 					default:
-						CM_EXCEPT(InternalErrorException, "Material parameter type not supported! Type: " + toString(def.constType));
+						CM_EXCEPT(InternalErrorException, "Cannot serialize this paramater type: " + toString(paramDesc.type));
 					}
 					}
+				}
+				else if(type == GPT_OBJECT)
+				{
+					const SHADER_OBJECT_PARAM_DESC& paramDesc = shader->getObjectParamDesc(*iter);
 
 
-					if(fieldSize > 16)
-						CM_EXCEPT(InternalErrorException, "Field size larger than the supported size.");
-
-					allParams[i]->_readRawConstants(iter->second.physicalIndex, fieldSize, tempValue);
-
-					auto iterFind = params->mFloatParams.find(iter->first);
-					if(iterFind == params->mFloatParams.end())
+					if(Shader::isSampler(paramDesc.type))
 					{
 					{
-						params->mFloatParams[iter->first] = FloatParam((UINT32)params->mFloatBuffer.size(), def.constType, fieldSize);
-
-						for(UINT32 j = 0; j < fieldSize; j++)
-							params->mFloatBuffer.push_back(tempValue[j]);
+						MaterialSamplerStateParam param;
+						param.name = *iter;
+						param.value = material->getSamplerState(*iter);
+					}
+					else if(Shader::isTexture(paramDesc.type))
+					{
+						MaterialTextureParam param;
+						param.name = *iter;
+						param.value = material->getTexture(*iter);
+					}
+					else if(Shader::isBuffer(paramDesc.type))
+					{
+						CM_EXCEPT(NotImplementedException, "Buffers can't be serialized yet."); // TODO
 					}
 					}
 					else
 					else
-						gDebug().logWarning("While saving material found multiple parameters with the same name. Only saving the first.");
+					{
+						CM_EXCEPT(InternalErrorException, "Cannot serialize this paramater type: " + toString(paramDesc.type));
+					}
 				}
 				}
-			}*/
+				else
+					CM_EXCEPT(InternalErrorException, "Invalid parameter type.");
+
+			}
 		}
 		}
 
 
 		material->mRTTIData = params;
 		material->mRTTIData = params;
@@ -127,86 +188,112 @@ namespace CamelotEngine
 
 
 		std::shared_ptr<MaterialParams> params = boost::any_cast<std::shared_ptr<MaterialParams>>(material->mRTTIData);
 		std::shared_ptr<MaterialParams> params = boost::any_cast<std::shared_ptr<MaterialParams>>(material->mRTTIData);
 
 
-		vector<GpuParamsPtr>::type allParams;
-		//for(size_t i = 0; i < material->mParameters.size(); i++)
-		//{
-		//	if(material->mParameters[i]->mFragParams != nullptr)
-		//		allParams.push_back(material->mParameters[i]->mFragParams);
+		ShaderPtr shader = material->getShader();
+		if(shader != nullptr)
+		{
+			for(auto iter = params->floatParams.begin(); iter != params->floatParams.end(); ++iter)
+			{
+				if(!shader->hasDataParam(iter->name))
+					continue;
 
 
-		//	if(material->mParameters[i]->mVertParams != nullptr)
-		//		allParams.push_back(material->mParameters[i]->mVertParams);
+				const SHADER_DATA_PARAM_DESC& paramDesc = shader->getDataParamDesc(iter->name);
 
 
-		//	if(material->mParameters[i]->mGeomParams != nullptr)
-		//		allParams.push_back(material->mParameters[i]->mGeomParams);
-		//}
+				if(paramDesc.type != GPDT_FLOAT1 || iter->arrayIdx < 0 || iter->arrayIdx >= paramDesc.arraySize)
+					continue;
 
 
-		for(size_t i = 0; i < allParams.size(); i++)
-		{
-			const GpuParamDesc& paramDesc = allParams[i]->getParamDesc();
+				material->setFloat(iter->name, iter->value, iter->arrayIdx);
+			}
 
 
-			for(auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
+			for(auto iter = params->vec2Params.begin(); iter != params->vec2Params.end(); ++iter)
 			{
 			{
-				auto iterFind = params->mTextureParams.find(iter->first);
+				if(!shader->hasDataParam(iter->name))
+					continue;
+
+				const SHADER_DATA_PARAM_DESC& paramDesc = shader->getDataParamDesc(iter->name);
+
+				if(paramDesc.type != GPDT_FLOAT2 || iter->arrayIdx < 0 || iter->arrayIdx >= paramDesc.arraySize)
+					continue;
 
 
-				if(iterFind != params->mTextureParams.end())
-					allParams[i]->setTexture(iter->first, iterFind->second);
+				material->setVec2(iter->name, iter->value, iter->arrayIdx);
 			}
 			}
 
 
-			for(auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
+			for(auto iter = params->vec3Params.begin(); iter != params->vec3Params.end(); ++iter)
 			{
 			{
-				auto iterFind = params->mSamplerStateParams.find(iter->first);
+				if(!shader->hasDataParam(iter->name))
+					continue;
+
+				const SHADER_DATA_PARAM_DESC& paramDesc = shader->getDataParamDesc(iter->name);
+
+				if(paramDesc.type != GPDT_FLOAT3 || iter->arrayIdx < 0 || iter->arrayIdx >= paramDesc.arraySize)
+					continue;
 
 
-				if(iterFind != params->mSamplerStateParams.end())
-					allParams[i]->setSamplerState(iter->first, iterFind->second);
+				material->setVec3(iter->name, iter->value, iter->arrayIdx);
 			}
 			}
 
 
-			for(auto iter = paramDesc.params.begin(); iter != paramDesc.params.end(); ++iter)
+			for(auto iter = params->vec4Params.begin(); iter != params->vec4Params.end(); ++iter)
 			{
 			{
-				// TODO - Need to load float/int/bool parameters!
+				if(!shader->hasDataParam(iter->name))
+					continue;
+
+				const SHADER_DATA_PARAM_DESC& paramDesc = shader->getDataParamDesc(iter->name);
+
+				if(paramDesc.type != GPDT_FLOAT4 || iter->arrayIdx < 0 || iter->arrayIdx >= paramDesc.arraySize)
+					continue;
+
+				material->setVec4(iter->name, iter->value, iter->arrayIdx);
 			}
 			}
 
 
+			for(auto iter = params->mat3Params.begin(); iter != params->mat3Params.end(); ++iter)
+			{
+				if(!shader->hasDataParam(iter->name))
+					continue;
 
 
-			/*const GpuNamedConstants& namedConstants = allParams[i]->getConstantDefinitions();
+				const SHADER_DATA_PARAM_DESC& paramDesc = shader->getDataParamDesc(iter->name);
 
 
-			float tempValue[16];
-			for(auto iter = namedConstants.map.begin(); iter != namedConstants.map.end(); ++iter)
+				if(paramDesc.type != GPDT_MATRIX_3X3 || iter->arrayIdx < 0 || iter->arrayIdx >= paramDesc.arraySize)
+					continue;
+
+				material->setMat3(iter->name, iter->value, iter->arrayIdx);
+			}
+
+			for(auto iter = params->mat4Params.begin(); iter != params->mat4Params.end(); ++iter)
 			{
 			{
-				const GpuConstantDefinition& def = iter->second;
+				if(!shader->hasDataParam(iter->name))
+					continue;
 
 
-				if(def.constType == GCT_SAMPLER2D)
-				{
-					auto iterFind = params->mTextureParams.find(iter->first);
+				const SHADER_DATA_PARAM_DESC& paramDesc = shader->getDataParamDesc(iter->name);
 
 
-					if(iterFind != params->mTextureParams.end())
-						allParams[i]->setNamedConstant(iter->first, iterFind->second);
+				if(paramDesc.type != GPDT_MATRIX_4X4 || iter->arrayIdx < 0 || iter->arrayIdx >= paramDesc.arraySize)
+					continue;
 
 
-					auto iterFind2 = params->mSamplerStateParams.find(iter->first);
+				material->setMat4(iter->name, iter->value, iter->arrayIdx);
+			}
 
 
-					if(iterFind2 != params->mSamplerStateParams.end())
-						allParams[i]->setNamedConstant(iter->first, iterFind2->second);
-				}
-				else
-				{
-					auto iterFind = params->mFloatParams.find(iter->first);
+			for(auto iter = params->samplerStateParams.begin(); iter != params->samplerStateParams.end(); ++iter)
+			{
+				if(!shader->hasObjectParam(iter->name))
+					continue;
 
 
-					if(iterFind != params->mFloatParams.end() && iterFind->second.mType == def.constType)
-					{
-						FloatParam param = iterFind->second;
-						UINT32 fieldSize = def.getElementSize(def.constType, false);
+				const SHADER_OBJECT_PARAM_DESC& paramDesc = shader->getObjectParamDesc(iter->name);
 
 
-						if(fieldSize != param.mCount)
-							CM_EXCEPT(InternalErrorException, "Deserializing material parameter but field sizes don't match.");
+				if(!Shader::isSampler(paramDesc.type))
+					continue;
 
 
-						if(fieldSize > 16)
-							CM_EXCEPT(InternalErrorException, "Field size larger than the supported size.");
+				material->setSamplerState(iter->name, iter->value);
+			}
 
 
-						for(size_t j = 0; j < fieldSize; j++)
-							tempValue[j] = params->mFloatBuffer[param.mBufferIdx + j];
+			for(auto iter = params->textureParams.begin(); iter != params->textureParams.end(); ++iter)
+			{
+				if(!shader->hasObjectParam(iter->name))
+					continue;
 
 
-						allParams[i]->_writeRawConstants(def.physicalIndex, tempValue, fieldSize);
-					}
-				}
-			}*/
+				const SHADER_OBJECT_PARAM_DESC& paramDesc = shader->getObjectParamDesc(iter->name);
+
+				if(!Shader::isTexture(paramDesc.type))
+					continue;
+
+				material->setTexture(iter->name, iter->value);
+			}
 		}
 		}
 
 
 		material->mRTTIData = nullptr; // This will delete temporary data as it's stored in a unique ptr
 		material->mRTTIData = nullptr; // This will delete temporary data as it's stored in a unique ptr

+ 98 - 0
CamelotRenderer/Source/CmShader.cpp

@@ -89,6 +89,55 @@ namespace CamelotEngine
 		mDataParams.erase(name);
 		mDataParams.erase(name);
 	}
 	}
 
 
+	GpuParamType Shader::getParamType(const String& name) const
+	{
+		auto findIterData = mDataParams.find(name);
+		if(findIterData != mDataParams.end())
+			return GPT_DATA;
+
+		auto findIterObject = mObjectParams.find(name);
+		if(findIterObject != mObjectParams.end())
+			return GPT_OBJECT;
+
+		CM_EXCEPT(InternalErrorException, "Cannot find the parameter with the name: " + name);
+	}
+
+	const SHADER_DATA_PARAM_DESC& Shader::getDataParamDesc(const String& name) const
+	{
+		auto findIterData = mDataParams.find(name);
+		if(findIterData != mDataParams.end())
+			return findIterData->second;
+
+		CM_EXCEPT(InternalErrorException, "Cannot find the parameter with the name: " + name);
+	}
+
+	const SHADER_OBJECT_PARAM_DESC& Shader::getObjectParamDesc(const String& name) const
+	{
+		auto findIterObject = mObjectParams.find(name);
+		if(findIterObject != mObjectParams.end())
+			return findIterObject->second;
+
+		CM_EXCEPT(InternalErrorException, "Cannot find the parameter with the name: " + name);
+	}
+
+	bool Shader::hasDataParam(const String& name) const
+	{
+		auto findIterData = mDataParams.find(name);
+		if(findIterData != mDataParams.end())
+			return true;
+
+		return false;
+	}
+
+	bool Shader::hasObjectParam(const String& name) const
+	{
+		auto findIterObject = mObjectParams.find(name);
+		if(findIterObject != mObjectParams.end())
+			return true;
+
+		return false;
+	}
+
 	void Shader::removeParameter(const String& name)
 	void Shader::removeParameter(const String& name)
 	{
 	{
 		mDataParams.erase(name);
 		mDataParams.erase(name);
@@ -105,6 +154,55 @@ namespace CamelotEngine
 		mParamBlocks[name] = desc;
 		mParamBlocks[name] = desc;
 	}
 	}
 
 
+	bool Shader::isSampler(GpuParamObjectType type)
+	{
+		switch(type)
+		{
+			case GPOT_SAMPLER1D:
+			case GPOT_SAMPLER2D:
+			case GPOT_SAMPLER3D:
+			case GPOT_SAMPLERCUBE:
+				return true;
+		}
+
+		return false;
+	}
+
+	bool Shader::isTexture(GpuParamObjectType type)
+	{
+		switch(type)
+		{
+		case GPOT_TEXTURE1D:
+		case GPOT_TEXTURE2D:
+		case GPOT_TEXTURE3D:
+		case GPOT_TEXTURECUBE:
+		case GPOT_RWTEXTURE1D:
+		case GPOT_RWTEXTURE2D:
+		case GPOT_RWTEXTURE3D:
+			return true;
+		}
+
+		return false;
+	}
+
+	bool Shader::isBuffer(GpuParamObjectType type)
+	{
+		switch(type)
+		{
+		case GPOT_BYTE_BUFFER:
+		case GPOT_STRUCTURED_BUFFER:
+		case GPOT_RWBYTE_BUFFER:
+		case GPOT_RWAPPEND_BUFFER:
+		case GPOT_RWCONSUME_BUFFER:
+		case GPOT_RWSTRUCTURED_BUFFER:
+		case GPOT_RWSTRUCTURED_BUFFER_WITH_COUNTER:
+		case GPOT_RWTYPED_BUFFER:
+			return true;
+		}
+
+		return false;
+	}
+
 	RTTITypeBase* Shader::getRTTIStatic()
 	RTTITypeBase* Shader::getRTTIStatic()
 	{
 	{
 		return ShaderRTTI::instance();
 		return ShaderRTTI::instance();

+ 2 - 0
CamelotRenderer/TODO.txt

@@ -50,6 +50,8 @@ Stuff that needs destroy():
   - Shader
   - Shader
   - Technique
   - Technique
 
 
+  Material RTTI should also serialize shared buffers (they need to be made into a resource)
+
 DX9 will have the same name for sampler and texture. This will cause an error in Material param checking.
 DX9 will have the same name for sampler and texture. This will cause an error in Material param checking.
 
 
 Add support for include file resource
 Add support for include file resource

+ 4 - 0
CamelotUtility/CamelotUtility.vcxproj

@@ -87,6 +87,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -105,6 +106,7 @@
       <Optimization>Disabled</Optimization>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -125,6 +127,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -144,6 +147,7 @@
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
       <PreprocessorDefinitions>CM_UTILITY_EXPORTS</PreprocessorDefinitions>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
       <AdditionalIncludeDirectories>./Include;../Dependencies/Include</AdditionalIncludeDirectories>
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     </ClCompile>
     <Link>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>