Browse Source

Fixed gltfloader matrix bug + added secondary texcoord1 support.

Mark Sibly 7 years ago
parent
commit
1b1f633100
2 changed files with 53 additions and 13 deletions
  1. 9 3
      modules/mojo3d/loader/gltf2.monkey2
  2. 44 10
      modules/mojo3d/loader/gltf2loader.monkey2

+ 9 - 3
modules/mojo3d/loader/gltf2.monkey2

@@ -75,6 +75,7 @@ Class Gltf2Material
 	Field emissiveFactor:Vec3f=New Vec3f(0)
 	Field emissiveFactor:Vec3f=New Vec3f(0)
 	Field occlusionTexture:Gltf2Texture
 	Field occlusionTexture:Gltf2Texture
 	Field normalTexture:Gltf2Texture
 	Field normalTexture:Gltf2Texture
+	Field doubleSided:Bool
 	Field alphaMode:String
 	Field alphaMode:String
 End
 End
 
 
@@ -86,6 +87,7 @@ Class Gltf2Primitive
 	Field TANGENT:Gltf2Accessor
 	Field TANGENT:Gltf2Accessor
 	Field COLOR_0:Gltf2Accessor
 	Field COLOR_0:Gltf2Accessor
 	Field TEXCOORD_0:Gltf2Accessor
 	Field TEXCOORD_0:Gltf2Accessor
+	Field TEXCOORD_1:Gltf2Accessor
 	Field JOINTS_0:Gltf2Accessor
 	Field JOINTS_0:Gltf2Accessor
 	Field WEIGHTS_0:Gltf2Accessor
 	Field WEIGHTS_0:Gltf2Accessor
 	Field indices:Gltf2Accessor
 	Field indices:Gltf2Accessor
@@ -110,8 +112,8 @@ Class Gltf2Node
 	Field rotation:Quatf=New Quatf
 	Field rotation:Quatf=New Quatf
 	Field scale:Vec3f=New Vec3f(1)
 	Field scale:Vec3f=New Vec3f(1)
 	Field matrix:Mat4f=New Mat4f
 	Field matrix:Mat4f=New Mat4f
-	Field mesh:Gltf2Mesh
 	Field hasMatrix:Bool
 	Field hasMatrix:Bool
+	Field mesh:Gltf2Mesh
 End
 End
 
 
 #rem monkeydoc @hidden
 #rem monkeydoc @hidden
@@ -382,6 +384,8 @@ Class Gltf2Asset
 			materials[i]=material
 			materials[i]=material
 			
 			
 			material.name=jmaterial.GetString( "name" )
 			material.name=jmaterial.GetString( "name" )
+			
+			material.doubleSided=jmaterial.GetBool( "doubleSided" )
 
 
 			Local jpbr:=jmaterial.GetObject( "pbrMetallicRoughness" )
 			Local jpbr:=jmaterial.GetObject( "pbrMetallicRoughness" )
 			If jpbr
 			If jpbr
@@ -471,6 +475,9 @@ Class Gltf2Asset
 				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
+				If jattribs.Contains( "TEXCOORD_1" )
+					prim.TEXCOORD_0=accessors[jattribs.GetNumber( "TEXCOORD_1" )]
+				Endif
 				If jattribs.Contains( "JOINTS_0" )
 				If jattribs.Contains( "JOINTS_0" )
 					prim.JOINTS_0=accessors[jattribs.GetNumber( "JOINTS_0" )]
 					prim.JOINTS_0=accessors[jattribs.GetNumber( "JOINTS_0" )]
 				Endif
 				Endif
@@ -643,8 +650,7 @@ Class Gltf2Asset
 				
 				
 			If jnode.Contains( "matrix" )
 			If jnode.Contains( "matrix" )
 				node.matrix=GetMat4f( jnode.GetArray( "matrix" ) )
 				node.matrix=GetMat4f( jnode.GetArray( "matrix" ) )
-			Else
-				node.matrix=Mat4f.Translation( node.translation ) * Mat4f.Rotation( node.rotation ) * Mat4f.Scaling( node.scale )
+				node.hasMatrix=True
 			Endif
 			Endif
 			
 			
 			If jnode.Contains( "mesh" )
 			If jnode.Contains( "mesh" )

+ 44 - 10
modules/mojo3d/loader/gltf2loader.monkey2

@@ -222,6 +222,10 @@ Class Gltf2Loader
 		Case "BLEND" mat.BlendMode=BlendMode.Alpha
 		Case "BLEND" mat.BlendMode=BlendMode.Alpha
 		End
 		End
 			
 			
+		If material.doubleSided
+			mat.CullMode=CullMode.None
+		Endif
+			
 		_materialCache[material]=mat
 		_materialCache[material]=mat
 		Return mat
 		Return mat
 	End
 	End
@@ -235,11 +239,28 @@ Class Gltf2Loader
 		Return matrix
 		Return matrix
 	End
 	End
 	
 	
-	Method GetMatrix:Mat4f( node:Gltf2Node )
+	Method GetWorldMatrix:Mat4f( node:Gltf2Node )
+		
+		Return node.parent ? GetWorldMatrix( node.parent ) * GetLocalMatrix( node ) Else GetLocalMatrix( node )
+	End
+	
+	Method GetLocalMatrix:Mat4f( node:Gltf2Node )
+		
+		Local matrix:Mat4f
+		
+		If node.hasMatrix Return FlipMatrix( node.matrix )
+		
+		Local v:=node.translation
+		v.z=-v.z
 		
 		
-		Local matrix:=FlipMatrix( node.matrix )
+		Local q:=node.rotation
+		q.v.x=-q.v.x
+		q.v.y=-q.v.y
+		q.w=-q.w
 		
 		
-		Return node.parent ? GetMatrix( node.parent ) * matrix Else matrix
+		Local s:=node.scale
+		
+		Return Mat4f.Translation( v ) * Mat4f.Rotation( q ) * Mat4f.Scaling( s )
 	End
 	End
 	
 	
 	Method LoadPrimitive:Mesh( prim:Gltf2Primitive )
 	Method LoadPrimitive:Mesh( prim:Gltf2Primitive )
@@ -311,7 +332,7 @@ Class Gltf2Loader
 		
 		
 		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 texcoords0"
 				Local datap:=GetData( prim.TEXCOORD_0 )
 				Local datap:=GetData( prim.TEXCOORD_0 )
 				Local stride:=prim.TEXCOORD_0.bufferView.byteStride ?Else 8
 				Local stride:=prim.TEXCOORD_0.bufferView.byteStride ?Else 8
 				For Local i:=0 Until vcount
 				For Local i:=0 Until vcount
@@ -323,6 +344,20 @@ Class Gltf2Loader
 			Endif
 			Endif
 		Endif
 		Endif
 		
 		
+		If prim.TEXCOORD_1
+			If prim.TEXCOORD_1.componentType=GLTF_FLOAT And prim.TEXCOORD_1.type="VEC2"
+'				Print "Gltf2 primitive has texcoords1"
+				Local datap:=GetData( prim.TEXCOORD_1 )
+				Local stride:=prim.TEXCOORD_1.bufferView.byteStride ?Else 8
+				For Local i:=0 Until vcount
+					vertices[i].texCoord1=Cast<Vec2f Ptr>( datap )[0]
+					datap+=stride
+				Next
+			Else
+				Print "Unsupported gltf2 primitive TEXCOORD_1 format"
+			Endif
+		Endif
+		
 		If prim.JOINTS_0
 		If prim.JOINTS_0
 			Local datap:=GetData( prim.JOINTS_0 )
 			Local datap:=GetData( prim.JOINTS_0 )
 			If prim.JOINTS_0.componentType=GLTF_UNSIGNED_SHORT And prim.JOINTS_0.type="VEC4"
 			If prim.JOINTS_0.componentType=GLTF_UNSIGNED_SHORT And prim.JOINTS_0.type="VEC4"
@@ -407,7 +442,7 @@ Class Gltf2Loader
 		
 		
 		If node.mesh
 		If node.mesh
 			
 			
-			Local matrix:=New AffineMat4f( GetMatrix( node ) )
+			Local matrix:=New AffineMat4f( GetWorldMatrix( node ) )
 
 
 			For Local prim:=Eachin node.mesh.primitives
 			For Local prim:=Eachin node.mesh.primitives
 				
 				
@@ -445,7 +480,7 @@ Class Gltf2Loader
 		
 		
 		model.Name=node.name
 		model.Name=node.name
 		
 		
-		model.LocalMatrix=New AffineMat4f( FlipMatrix( node.matrix ) )
+		model.LocalMatrix=New AffineMat4f( GetLocalMatrix( node ) )
 		
 		
 		Local id:=_entities.Length
 		Local id:=_entities.Length
 		_entities.Add( model )
 		_entities.Add( model )
@@ -696,11 +731,10 @@ Class Gltf2Loader
 		
 		
 		For Local i:=0 Until n
 		For Local i:=0 Until n
 			
 			
-			Local entity:=_entities[ _nodeIds[skin.joints[i]] ]
-			Local matrix:=datap ? FlipMatrix( Cast<Mat4f Ptr>( datap )[0] ) Else New Mat4f
+			Local matrix:=datap ? New AffineMat4f( FlipMatrix( Cast<Mat4f Ptr>( datap )[0] ) ) Else New AffineMat4f
 			
 			
-			_bones[i].entity=entity
-			_bones[i].offset=New AffineMat4f( matrix )
+			_bones[i].entity=_entities[ _nodeIds[skin.joints[i]] ]
+			_bones[i].offset=matrix
 			
 			
 			If datap datap+=stride
 			If datap datap+=stride
 		Next
 		Next