Bladeren bron

Enhancing the Material

Panagiotis Christopoulos Charitos 15 jaren geleden
bovenliggende
commit
6f67a5d49b
3 gewijzigde bestanden met toevoegingen van 78 en 74 verwijderingen
  1. 37 40
      src/Renderer/Renderer.cpp
  2. 10 15
      src/Resources/Material.cpp
  3. 31 19
      src/Resources/Material.h

+ 37 - 40
src/Renderer/Renderer.cpp

@@ -124,41 +124,38 @@ void Renderer::setupMaterial( const Material& mtl )
 		{
 			// texture
 			case GL_SAMPLER_2D:
-				if( !udv->specialVariable )
+				switch( udv->specialValue )
 				{
-					udv->sProgVar->setTexture( *udv->value.texture, textureUnit++ );
-				}
-				else
-				{
-					switch( udv->value.speciaValue )
-					{
-						case Material::UserDefinedVar::SV_MS_NORMAL_FAI:
-							udv->sProgVar->setTexture( ms.normalFai, textureUnit++ );
-							break;
+					case Material::SV_NONE:
+						udv->sProgVar->setTexture( *udv->value.texture, textureUnit++ );
+						break;
 
-						case Material::UserDefinedVar::SV_MS_DIFFUSE_FAI:
-							udv->sProgVar->setTexture( ms.diffuseFai, textureUnit++ );
-							break;
+					case Material::SV_MS_NORMAL_FAI:
+						udv->sProgVar->setTexture( ms.normalFai, textureUnit++ );
+						break;
 
-						case Material::UserDefinedVar::SV_MS_SPECULAR_FAI:
-							udv->sProgVar->setTexture( ms.specularFai, textureUnit++ );
-							break;
+					case Material::SV_MS_DIFFUSE_FAI:
+						udv->sProgVar->setTexture( ms.diffuseFai, textureUnit++ );
+						break;
 
-						case Material::UserDefinedVar::SV_MS_DEPTH_FAI:
-							udv->sProgVar->setTexture( ms.depthFai, textureUnit++ );
-							break;
+					case Material::SV_MS_SPECULAR_FAI:
+						udv->sProgVar->setTexture( ms.specularFai, textureUnit++ );
+						break;
 
-						case Material::UserDefinedVar::SV_IS_FAI:
-							udv->sProgVar->setTexture( is.fai, textureUnit++ );
-							break;
+					case Material::SV_MS_DEPTH_FAI:
+						udv->sProgVar->setTexture( ms.depthFai, textureUnit++ );
+						break;
 
-						case Material::UserDefinedVar::SV_PPS_FAI:
-							udv->sProgVar->setTexture( pps.fai, textureUnit++ );
-							break;
+					case Material::SV_IS_FAI:
+						udv->sProgVar->setTexture( is.fai, textureUnit++ );
+						break;
 
-						default:
-							DEBUG_ERR( 1 );
-					}
+					case Material::SV_PPS_FAI:
+						udv->sProgVar->setTexture( pps.fai, textureUnit++ );
+						break;
+
+					default:
+						DEBUG_ERR( 1 );
 				}
 				break;
 			// float
@@ -167,21 +164,21 @@ void Renderer::setupMaterial( const Material& mtl )
 				break;
 			// vec2
 			case GL_FLOAT_VEC2:
-				if( !udv->specialVariable )
+				switch( udv->specialValue )
 				{
-					udv->sProgVar->setVec2( &udv->value.vec2 );
-				}
-				else
-				{
-					switch( udv->value.speciaValue )
+					case Material::SV_NONE:
+						udv->sProgVar->setVec2( &udv->value.vec2 );
+						break;
+
+					case Material::SV_RENDERER_SIZE:
 					{
-						case Material::UserDefinedVar::SV_RENDERER_SIZE:
-						{
-							Vec2 v( width, height );
-							udv->sProgVar->setVec2( &v );
-							break;
-						}
+						Vec2 v( width, height );
+						udv->sProgVar->setVec2( &v );
+						break;
 					}
+
+					default:
+						DEBUG_ERR( 1 );
 				}
 				break;
 			// vec3

+ 10 - 15
src/Resources/Material.cpp

@@ -239,33 +239,27 @@ bool Material::load( const char* filename )
 						}
 						else if( token->getCode() == Scanner::TC_IDENTIFIER && !strcmp( token->getValue().getString(), "MS_NORMAL_FAI" ) )
 						{
-							var.specialVariable = true;
-							var.value.speciaValue = UserDefinedVar::SV_MS_NORMAL_FAI;
+							var.specialValue = SV_MS_NORMAL_FAI;
 						}
 						else if( token->getCode() == Scanner::TC_IDENTIFIER && !strcmp( token->getValue().getString(), "MS_DIFFUSE_FAI" ) )
 						{
-							var.specialVariable = true;
-							var.value.speciaValue = UserDefinedVar::SV_MS_DIFFUSE_FAI;
+							var.specialValue = SV_MS_DIFFUSE_FAI;
 						}
 						else if( token->getCode() == Scanner::TC_IDENTIFIER && !strcmp( token->getValue().getString(), "MS_SPECULAR_FAI" ) )
 						{
-							var.specialVariable = true;
-							var.value.speciaValue = UserDefinedVar::SV_MS_SPECULAR_FAI;
+							var.specialValue = SV_MS_SPECULAR_FAI;
 						}
 						else if( token->getCode() == Scanner::TC_IDENTIFIER && !strcmp( token->getValue().getString(), "MS_DEPTH_FAI" ) )
 						{
-							var.specialVariable = true;
-							var.value.speciaValue = UserDefinedVar::SV_MS_DEPTH_FAI;
+							var.specialValue = SV_MS_DEPTH_FAI;
 						}
 						else if( token->getCode() == Scanner::TC_IDENTIFIER && !strcmp( token->getValue().getString(), "IS_FAI" ) )
 						{
-							var.specialVariable = true;
-							var.value.speciaValue = UserDefinedVar::SV_IS_FAI;
+							var.specialValue = SV_IS_FAI;
 						}
 						else if( token->getCode() == Scanner::TC_IDENTIFIER && !strcmp( token->getValue().getString(), "PPS_FAI" ) )
 						{
-							var.specialVariable = true;
-							var.value.speciaValue = UserDefinedVar::SV_PPS_FAI;
+							var.specialValue = SV_PPS_FAI;
 						}
 						else
 						{
@@ -286,12 +280,14 @@ bool Material::load( const char* filename )
 						break;
 					// vec2
 					case GL_FLOAT_VEC2:
+						// {
 						token = &scanner.getNextToken();
 						if( token->getCode() == Scanner::TC_LBRACKET )
 						{
 							if( !Parser::parseArrOfNumbers<float>( scanner, false, true, 2, &var.value.vec2[0] ) )
 								return false;
 
+							// }
 							token = &scanner.getNextToken();
 							if( token->getCode() != Scanner::TC_RBRACKET )
 							{
@@ -301,8 +297,7 @@ bool Material::load( const char* filename )
 						}
 						else if( token->getCode() == Scanner::TC_IDENTIFIER && !strcmp( token->getValue().getString(), "RENDERER_SIZE" ) )
 						{
-							var.specialVariable = true;
-							var.value.speciaValue = UserDefinedVar::SV_RENDERER_SIZE;
+							var.specialValue = SV_RENDERER_SIZE;
 						}
 						else
 						{
@@ -388,7 +383,7 @@ void Material::unload()
 	// loop all user defined vars and unload the textures
 	for( uint i=0; i<userDefinedVars.size(); i++ )
 	{
-		if( userDefinedVars[i].sProgVar->getGlDataType() == GL_SAMPLER_2D && ! userDefinedVars[i].specialVariable )
+		if( userDefinedVars[i].sProgVar->getGlDataType() == GL_SAMPLER_2D && userDefinedVars[i].specialValue != SV_NONE )
 			Rsrc::textures.unload( userDefinedVars[i].value.texture );
 	}
 }

+ 31 - 19
src/Resources/Material.h

@@ -7,34 +7,43 @@
 #include "ShaderProg.h"
 
 
-/// Mesh material @ref Resource resource
+/**
+ * Mesh material @ref Resource resource
+ */
 class Material: public Resource
 {
 	friend class Renderer;
 	friend class MeshNode;
 
-	//===================================================================================================================================
-	// User defined variables                                                                                                           =
-	//===================================================================================================================================
 	protected:
+		/**
+		 *
+		 */
+		enum SpecialVar
+		{
+			SV_NONE,           ///< SV_NONE
+			// Texture
+			SV_MS_NORMAL_FAI,  ///< SV_MS_NORMAL_FAI
+			SV_MS_DIFFUSE_FAI, ///< SV_MS_DIFFUSE_FAI
+			SV_MS_SPECULAR_FAI,///< SV_MS_SPECULAR_FAI
+			SV_MS_DEPTH_FAI,   ///< SV_MS_DEPTH_FAI
+			SV_IS_FAI,         ///< SV_IS_FAI
+			SV_PPS_FAI,        ///< SV_PPS_FAI
+			// Vec2
+			SV_RENDERER_SIZE, ///< Active renderer's width and height
+			// Mat3
+			SV_NORMAL_MAT,
+			// Mat4
+			SV_MODELVIEW_MAT,
+			SV_PROJECTION_MAT,
+			SV_MODELVIEWPROJECTION_MAT
+		};
+
 		/**
 		 * Class for user defined material variables that will be passes in to the shader
 		 */
 		struct UserDefinedVar
 		{
-			enum SpecialValue
-			{
-				// Texture
-				SV_MS_NORMAL_FAI,
-				SV_MS_DIFFUSE_FAI,
-				SV_MS_SPECULAR_FAI,
-				SV_MS_DEPTH_FAI,
-				SV_IS_FAI,
-				SV_PPS_FAI,
-				// Vec2
-				SV_RENDERER_SIZE ///< Active renderer's width and height
-			};
-
 			struct Value  // unfortunately we cannot use union because of Vec3 and Vec4
 			{
 				Texture* texture;
@@ -42,15 +51,18 @@ class Material: public Resource
 				Vec2 vec2;
 				Vec3 vec3;
 				Vec4 vec4;
-				SpecialValue speciaValue;
+
 				Value(): texture(NULL) {}
 			};
 
 			Value value;
-			bool specialVariable;
+			SpecialVar specialValue;
 			const ShaderProg::UniVar* sProgVar;
+
+			UserDefinedVar(): specialValue( SV_NONE ) {}
 		}; // end UserDefinedVar
 
+		static map<string, SpecialVar> keywordToSpecial;
 
 		ShaderProg* shaderProg; ///< The most important aspect of materials