Przeglądaj źródła

Added vertex colors to mojo3d + Entity.Color for modulating material colors (if supported by shader etc).

Mark Sibly 7 lat temu
rodzic
commit
4d854d7932

+ 14 - 13
modules/mojo/graphics/vertex3f.monkey2

@@ -5,15 +5,16 @@ Struct Vertex3f
 
 
 	Const Format:=New Vertex3fFormat
 	Const Format:=New Vertex3fFormat
 	
 	
-	Const Pitch:=76			'76
+	Const Pitch:=80				'80
 	
 	
-	Field position:Vec3f	'0
-	Field texCoord0:Vec2f	'12
-	Field texCoord1:Vec2f	'20
-	Field normal:Vec3f		'28
-	Field tangent:Vec4f		'40
-	Field weights:Vec4f		'56
-	Field bones:UInt		'72
+	Field position:Vec3f		'0
+	Field texCoord0:Vec2f		'12
+	Field texCoord1:Vec2f		'20
+	Field color:UInt=~0			'28
+	Field normal:Vec3f			'32
+	Field tangent:Vec4f			'44
+	Field weights:Vec4f			'60
+	Field bones:UInt			'76
 
 
 	Method New()
 	Method New()
 	End
 	End
@@ -106,11 +107,11 @@ Class Vertex3fFormat Extends VertexFormat
 		glEnableVertexAttribArray( A_POSITION ) ; glVertexAttribPointer( A_POSITION,3,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 0 ) )
 		glEnableVertexAttribArray( A_POSITION ) ; glVertexAttribPointer( A_POSITION,3,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 0 ) )
 		glEnableVertexAttribArray( A_TEXCOORD0 ) ; glVertexAttribPointer( A_TEXCOORD0,2,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 12 ) )
 		glEnableVertexAttribArray( A_TEXCOORD0 ) ; glVertexAttribPointer( A_TEXCOORD0,2,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 12 ) )
 		glEnableVertexAttribArray( A_TEXCOORD1 ) ; glVertexAttribPointer( A_TEXCOORD1,2,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 20 ) )
 		glEnableVertexAttribArray( A_TEXCOORD1 ) ; glVertexAttribPointer( A_TEXCOORD1,2,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 20 ) )
-		glDisableVertexAttribArray( A_COLOR )
-		glEnableVertexAttribArray( A_NORMAL ) ; glVertexAttribPointer( A_NORMAL,3,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 28 ) )
-		glEnableVertexAttribArray( A_TANGENT ) ; glVertexAttribPointer( A_TANGENT,4,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 40 ) )
-		glEnableVertexAttribArray( A_WEIGHTS ) ; glVertexAttribPointer( A_WEIGHTS,4,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 56 ) )
-		glEnableVertexAttribArray( A_BONES ) ; glVertexAttribPointer( A_BONES,4,GL_UNSIGNED_BYTE,False,Pitch,Cast<Void Ptr>( 72 ) )
+		glEnableVertexAttribArray( A_COLOR ) ; glVertexAttribPointer( A_COLOR,4,GL_UNSIGNED_BYTE,True,Pitch,Cast<Void Ptr>( 28 ) )
+		glEnableVertexAttribArray( A_NORMAL ) ; glVertexAttribPointer( A_NORMAL,3,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 32 ) )
+		glEnableVertexAttribArray( A_TANGENT ) ; glVertexAttribPointer( A_TANGENT,4,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 44 ) )
+		glEnableVertexAttribArray( A_WEIGHTS ) ; glVertexAttribPointer( A_WEIGHTS,4,GL_FLOAT,False,Pitch,Cast<Void Ptr>( 60 ) )
+		glEnableVertexAttribArray( A_BONES ) ; glVertexAttribPointer( A_BONES,4,GL_UNSIGNED_BYTE,False,Pitch,Cast<Void Ptr>( 76 ) )
 	End
 	End
 	
 	
 End
 End

+ 21 - 2
modules/mojo3d-loaders/loaders/assimp.monkey2

@@ -185,12 +185,31 @@ Class AssimpLoader
 		
 		
 		Local vp:=aimesh.mVertices
 		Local vp:=aimesh.mVertices
 		Local np:=aimesh.mNormals
 		Local np:=aimesh.mNormals
+		Local cp:=aimesh.mColors[0]
 		Local tp:=aimesh.mTextureCoords[0]
 		Local tp:=aimesh.mTextureCoords[0]
 		
 		
 		For Local i:=0 Until vertices.Length
 		For Local i:=0 Until vertices.Length
+			
 			vertices[i].position=New Vec3f( vp[i].x,vp[i].y,vp[i].z )
 			vertices[i].position=New Vec3f( vp[i].x,vp[i].y,vp[i].z )
-			vertices[i].normal=New Vec3f( np[i].x,np[i].y,np[i].z )
-			If tp vertices[i].texCoord0=New Vec2f( tp[i].x,tp[i].y )
+			
+			If np
+				vertices[i].normal=New Vec3f( np[i].x,np[i].y,np[i].z )
+			Endif
+			
+			If cp
+				Local color:=cp[i]
+				Print "r="+color.r+", g="+color.g+", b="+color.b+", a="+color.a
+				color.r=1
+				color.g=1
+				color.b=0
+				color.a=1
+				Local a:=color.a * 255.0
+				vertices[i].color=UInt(a) Shl 24 | UInt(color.b*a) Shl 16 | UInt(color.g*a) Shl 8 | UInt(color.r*a)
+			Endif
+
+			If tp 
+				vertices[i].texCoord0=New Vec2f( tp[i].x,tp[i].y )
+			Endif
 		Next
 		Next
 		
 		
 		Local indices:=New UInt[ aimesh.mNumFaces*3 ]
 		Local indices:=New UInt[ aimesh.mNumFaces*3 ]

+ 1 - 1
modules/mojo3d/assets/shaders/lighting-deferred.glsl

@@ -98,7 +98,7 @@ float shadowColor(){
 //	vec3 vn=vec4( cross( dx,dy ),0.0 );
 //	vec3 vn=vec4( cross( dx,dy ),0.0 );
 //	vec4 vpos=vec4( v_Position + v_Normal*0.01,1.0 );
 //	vec4 vpos=vec4( v_Position + v_Normal*0.01,1.0 );
 
 
-	if( v_Position.z>=r_ShadowCSMSplits.w ) return r_ShadowAlpha*0.5;
+	if( v_Position.z>=r_ShadowCSMSplits.w ) return 1.0;//(1.0-r_ShadowAlpha)*0.5;
 	
 	
 	vec4 vpos=vec4( v_Position,1.0 );
 	vec4 vpos=vec4( v_Position,1.0 );
 	vec2 off;
 	vec2 off;

+ 14 - 1
modules/mojo3d/assets/shaders/material-pbr-deferred.glsl

@@ -24,6 +24,9 @@ uniform mat3 i_ModelViewNormalMatrix;
 
 
 #if MX2_COLORPASS
 #if MX2_COLORPASS
 
 
+uniform vec4  i_Color;
+uniform float i_Alpha;
+
 uniform vec4 r_AmbientDiffuse;
 uniform vec4 r_AmbientDiffuse;
 uniform samplerCube r_EnvTexture;
 uniform samplerCube r_EnvTexture;
 uniform float r_EnvTextureMaxLod;
 uniform float r_EnvTextureMaxLod;
@@ -34,6 +37,7 @@ uniform mat3 r_EnvMatrix;
 
 
 varying vec3 v_Position;
 varying vec3 v_Position;
 varying vec3 v_Normal;
 varying vec3 v_Normal;
+varying vec4 v_Color;
 #ifdef MX2_TEXTURED
 #ifdef MX2_TEXTURED
 varying vec2 v_TexCoord0;
 varying vec2 v_TexCoord0;
 #ifdef MX2_BUMPMAPPED
 #ifdef MX2_BUMPMAPPED
@@ -68,6 +72,7 @@ attribute vec4 a_Bones;
 #if MX2_COLORPASS
 #if MX2_COLORPASS
 
 
 attribute vec3 a_Normal;
 attribute vec3 a_Normal;
+attribute vec4 a_Color;
 #ifdef MX2_TEXTURED
 #ifdef MX2_TEXTURED
 attribute vec2 a_TexCoord0;
 attribute vec2 a_TexCoord0;
 #ifdef MX2_BUMPMAPPED
 #ifdef MX2_BUMPMAPPED
@@ -119,6 +124,10 @@ void main(){
 	// viewspace normal
 	// viewspace normal
 	v_Normal=i_ModelViewNormalMatrix * b_Normal;
 	v_Normal=i_ModelViewNormalMatrix * b_Normal;
 	
 	
+	// vertex color
+	v_Color=a_Color * i_Color;
+	v_Color.a*=i_Alpha;
+	
 #ifdef MX2_TEXTURED
 #ifdef MX2_TEXTURED
 	// texture coord0
 	// texture coord0
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
@@ -147,6 +156,10 @@ void main(){
 	// viewspace normal
 	// viewspace normal
 	v_Normal=i_ModelViewNormalMatrix * a_Normal;
 	v_Normal=i_ModelViewNormalMatrix * a_Normal;
 	
 	
+	// vertex color
+	v_Color=a_Color * i_Color;
+	v_Color.a*=i_Alpha;
+	
 #ifdef MX2_TEXTURED
 #ifdef MX2_TEXTURED
 	// texture coord0
 	// texture coord0
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
@@ -271,7 +284,7 @@ void main(){
 
 
 #endif
 #endif
 
 
-	pbrWriteFragData( color,emissive,metalness,roughness,occlusion,normal );
+	pbrWriteFragData( color*v_Color.rgb,emissive,metalness,roughness,occlusion,normal );
 }
 }
 	
 	
 #else	//MX2_COLORPASS
 #else	//MX2_COLORPASS

+ 16 - 5
modules/mojo3d/assets/shaders/material-pbr-forward.glsl

@@ -26,12 +26,13 @@ uniform mat3 i_ModelViewNormalMatrix;
 uniform mat4 i_ModelBoneMatrices[96];
 uniform mat4 i_ModelBoneMatrices[96];
 #endif
 #endif
 
 
-//material uniforms
-
 #if MX2_COLORPASS
 #if MX2_COLORPASS
+uniform vec4  i_Color;
 uniform float i_Alpha;
 uniform float i_Alpha;
 #endif
 #endif
 
 
+//material uniforms
+//
 #if MX2_COLORPASS && defined( MX2_TEXTURED )
 #if MX2_COLORPASS && defined( MX2_TEXTURED )
 uniform mat3 m_TextureMatrix;
 uniform mat3 m_TextureMatrix;
 #endif
 #endif
@@ -82,6 +83,7 @@ uniform float r_LightRange;
 //
 //
 varying vec3 v_Position;
 varying vec3 v_Position;
 varying vec3 v_Normal;
 varying vec3 v_Normal;
+varying vec4 v_Color;
 #if MX2_COLORPASS && defined( MX2_TEXTURED )
 #if MX2_COLORPASS && defined( MX2_TEXTURED )
 varying vec2 v_TexCoord0;
 varying vec2 v_TexCoord0;
 #if defined( MX2_BUMPMAPPED )
 #if defined( MX2_BUMPMAPPED )
@@ -95,6 +97,7 @@ attribute vec4 a_Position;
 
 
 #if MX2_COLORPASS
 #if MX2_COLORPASS
 attribute vec3 a_Normal;
 attribute vec3 a_Normal;
+attribute vec4 a_Color;
 #if defined( MX2_TEXTURED )
 #if defined( MX2_TEXTURED )
 attribute vec2 a_TexCoord0;
 attribute vec2 a_TexCoord0;
 #if defined( MX2_BUMPMAPPED )
 #if defined( MX2_BUMPMAPPED )
@@ -148,6 +151,10 @@ void main(){
 	// viewspace normal
 	// viewspace normal
 	v_Normal=i_ModelViewNormalMatrix * b_Normal;
 	v_Normal=i_ModelViewNormalMatrix * b_Normal;
 	
 	
+	// vertex color
+	v_Color=a_Color * i_Color;
+	v_Color.a*=i_Alpha;
+	
 #if MX2_COLORPASS && defined( MX2_TEXTURED )
 #if MX2_COLORPASS && defined( MX2_TEXTURED )
 	// texture coord0
 	// texture coord0
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
@@ -176,6 +183,10 @@ void main(){
 	// viewspace normal
 	// viewspace normal
 	v_Normal=i_ModelViewNormalMatrix * a_Normal;
 	v_Normal=i_ModelViewNormalMatrix * a_Normal;
 	
 	
+	// vertex color
+	v_Color=a_Color * i_Color;
+	v_Color.a*=i_Alpha;
+	
 #if defined( MX2_TEXTURED )
 #if defined( MX2_TEXTURED )
 	// texture coord0
 	// texture coord0
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
 	v_TexCoord0=(m_TextureMatrix * vec3(a_TexCoord0,1.0)).st;
@@ -224,7 +235,7 @@ uniform vec4 r_FogColor;
 
 
 float shadowColor(){
 float shadowColor(){
 
 
-	if( v_Position.z>=r_ShadowCSMSplits.w ) return r_ShadowAlpha*0.5;
+	if( v_Position.z>=r_ShadowCSMSplits.w ) return 1.0;//(1.0-r_ShadowAlpha)*0.5;
 
 
 	vec4 vpos=vec4( v_Position,1.0 );
 	vec4 vpos=vec4( v_Position,1.0 );
 	vec2 off;
 	vec2 off;
@@ -397,9 +408,9 @@ void main(){
 #endif
 #endif
 
 
 	//perform lighting
 	//perform lighting
-	vec3 frag=lighting( color,emissive,metalness,roughness,occlusion,normal );
+	vec3 frag=lighting( color*v_Color.rgb,emissive,metalness,roughness,occlusion,normal );
 	
 	
-	alpha*=i_Alpha;
+	alpha*=v_Color.a;
 	
 	
 	frag*alpha;
 	frag*alpha;
 	
 	

+ 0 - 1
modules/mojo3d/assets/shaders/material-sprite.glsl

@@ -24,7 +24,6 @@ uniform float i_Alpha;
 //varyings...
 //varyings...
 
 
 varying vec3 v_Position;
 varying vec3 v_Position;
-
 varying vec2 v_TexCoord0;
 varying vec2 v_TexCoord0;
 
 
 //@vertex
 //@vertex

+ 1 - 0
modules/mojo3d/entities/camera.monkey2

@@ -164,6 +164,7 @@ Class Camera Extends Entity
 		
 		
 		Local targetSize:=canvas.GraphicsDevice.RenderTargetSize
 		Local targetSize:=canvas.GraphicsDevice.RenderTargetSize
 		
 		
+'		Local viewport:=canvas.RenderMatrix * Viewport
 		Local viewport:=canvas.RenderBounds
 		Local viewport:=canvas.RenderBounds
 		
 		
 		canvas.Flush()
 		canvas.Flush()

+ 2 - 0
modules/mojo3d/entities/light.monkey2

@@ -67,6 +67,7 @@ Class Light Extends Entity
 		_type=type
 		_type=type
 	End
 	End
 	
 	
+	#rem
 	#rem monkeydoc The light color.
 	#rem monkeydoc The light color.
 	#end
 	#end
 	Property Color:Color()
 	Property Color:Color()
@@ -77,6 +78,7 @@ Class Light Extends Entity
 	
 	
 		_color=color
 		_color=color
 	End
 	End
+	#end
 	
 	
 	#rem monkeydoc The light range.
 	#rem monkeydoc The light range.
 	#end
 	#end

+ 4 - 0
modules/mojo3d/loader/gltf2.monkey2

@@ -84,6 +84,7 @@ Class Gltf2Primitive
 	Field POSITION:Gltf2Accessor
 	Field POSITION:Gltf2Accessor
 	Field NORMAL:Gltf2Accessor
 	Field NORMAL:Gltf2Accessor
 	Field TANGENT:Gltf2Accessor
 	Field TANGENT:Gltf2Accessor
+	Field COLOR_0:Gltf2Accessor
 	Field TEXCOORD_0:Gltf2Accessor
 	Field TEXCOORD_0:Gltf2Accessor
 	Field JOINTS_0:Gltf2Accessor
 	Field JOINTS_0:Gltf2Accessor
 	Field WEIGHTS_0:Gltf2Accessor
 	Field WEIGHTS_0:Gltf2Accessor
@@ -464,6 +465,9 @@ Class Gltf2Asset
 				If jattribs.Contains( "TANGENT" )
 				If jattribs.Contains( "TANGENT" )
 					prim.TANGENT=accessors[jattribs.GetNumber( "TANGENT" )]
 					prim.TANGENT=accessors[jattribs.GetNumber( "TANGENT" )]
 				Endif
 				Endif
+				If jattribs.Contains( "COLOR_0" )
+					prim.COLOR_0=accessors[jattribs.GetNumber( "COLOR_0" )]
+				Endif
 				If jattribs.Contains( "TEXCOORD_0" )
 				If jattribs.Contains( "TEXCOORD_0" )
 					prim.TEXCOORD_0=accessors[jattribs.GetNumber( "TEXCOORD_0" )]
 					prim.TEXCOORD_0=accessors[jattribs.GetNumber( "TEXCOORD_0" )]
 				Endif
 				Endif

+ 15 - 0
modules/mojo3d/loader/gltf2loader.monkey2

@@ -283,6 +283,21 @@ Class Gltf2Loader
 			Endif
 			Endif
 		Endif
 		Endif
 		
 		
+		If prim.COLOR_0 
+			If prim.COLOR_0.componentType=GLTF_FLOAT And prim.COLOR_0.type="VEC4"
+				Print "Gltf2 primitive has colors"
+				Local datap:=GetData( prim.COLOR_0 )
+				Local stride:=prim.COLOR_0.bufferView.byteStride ?Else 16
+				For Local i:=0 Until vcount
+					Local color:=Cast<Vec4f Ptr>( datap )[0]
+					color.w=1
+					Local a:=color.w * 255.0
+					vertices[i].color=UInt(a) Shl 24 | UInt(color.z*a) Shl 16 | UInt(color.y*a) Shl 8 | UInt(color.x*a)
+					datap+=stride
+				Next
+			Endif
+		Endif
+		
 		If prim.TEXCOORD_0
 		If prim.TEXCOORD_0
 			If prim.TEXCOORD_0.componentType=GLTF_FLOAT And prim.TEXCOORD_0.type="VEC2"
 			If prim.TEXCOORD_0.componentType=GLTF_FLOAT And prim.TEXCOORD_0.type="VEC2"
 '				Print "Gltf2 primitive has texcoords"
 '				Print "Gltf2 primitive has texcoords"

+ 1 - 0
modules/mojo3d/render/renderer.monkey2

@@ -557,6 +557,7 @@ Class Renderer
 				_iuniforms.SetMat4f( "ModelViewMatrix",modelViewMat )
 				_iuniforms.SetMat4f( "ModelViewMatrix",modelViewMat )
 				_iuniforms.SetMat3f( "ModelViewNormalMatrix",modelViewNormMat )
 				_iuniforms.SetMat3f( "ModelViewNormalMatrix",modelViewNormMat )
 				_iuniforms.SetMat4f( "ModelViewProjectionMatrix",modelViewProjMat )
 				_iuniforms.SetMat4f( "ModelViewProjectionMatrix",modelViewProjMat )
+				_iuniforms.SetColor( "Color",instance ? instance.Color Else Color.White )
 				_iuniforms.SetFloat( "Alpha",instance ? instance.Alpha Else 1.0 )
 				_iuniforms.SetFloat( "Alpha",instance ? instance.Alpha Else 1.0 )
 				
 				
 			Endif
 			Endif

+ 13 - 1
modules/mojo3d/scene/entity.monkey2

@@ -171,7 +171,18 @@ Class Entity Extends DynamicObject
 		Return _lastCopy
 		Return _lastCopy
 	End
 	End
 	
 	
-	#rem monkeydoc Master alpha level.
+	#rem monkeydoc Master color.
+	#end
+	Property Color:Color()
+		
+		Return _color
+		
+	Setter( color:Color )
+			
+		_color=color
+	End
+	
+	#rem monkeydoc Master alpha.
 	#end
 	#end
 	Property Alpha:Float()
 	Property Alpha:Float()
 		
 		
@@ -544,6 +555,7 @@ Private
 	Field _lastCopy:Entity
 	Field _lastCopy:Entity
 	Field _rvisible:Bool
 	Field _rvisible:Bool
 	Field _visible:Bool
 	Field _visible:Bool
+	Field _color:Color=std.graphics.Color.White
 	Field _alpha:Float=1
 	Field _alpha:Float=1
 	
 	
 	Field _t:Vec3f=New Vec3f
 	Field _t:Vec3f=New Vec3f

+ 4 - 0
modules/sdl2/sdl2.monkey2

@@ -1214,5 +1214,9 @@ Function SDL_ThreadID:SDL_threadID()
 'FILE="sdl2/SDL_fileystem.h"
 'FILE="sdl2/SDL_fileystem.h"
 
 
 Function SDL_GetPrefPath:CString( org:CString,app:CString )
 Function SDL_GetPrefPath:CString( org:CString,app:CString )
+	
+'FILE="sdl2/SDL_pixels.h"
+
+Function SDL_BYTESPERPIXEL:Int( format:Int )
 
 
 '${END}
 '${END}