public Material(FBX.Scene.Materials.MaterialParameters _SourceMaterial, MaterialMapperDelegate _Mapper) { float3 Temp = new float3(); FBX.Scene.Materials.MaterialParameters.Parameter P = null; m_ID = (ushort)_SourceMaterial.ID; // Get diffuse color + texture ID P = _SourceMaterial.Find("DiffuseColor"); if (P != null) { Temp.FromVector3(P.AsFloat3.Value); m_DiffuseColor = Temp; } P = _SourceMaterial.Find("DiffuseTexture"); m_DiffuseTextureID = _Mapper(P != null ? P.AsTexture2D : null); // Get specular color + texture ID + exponent P = _SourceMaterial.Find("SpecularColor"); if (P != null) { Temp.FromVector3(P.AsFloat3.Value); m_SpecularColor = Temp; } P = _SourceMaterial.Find("SpecularTexture"); m_SpecularTextureID = _Mapper(P != null ? P.AsTexture2D : null); P = _SourceMaterial.Find("SpecularExponent"); if (P != null) { Temp.FromVector3(P.AsFloat3.Value); m_SpecularExponent = Temp; } // Get noral map ID P = _SourceMaterial.Find("NormalTexture"); m_NormalTextureID = _Mapper(P != null ? P.AsTexture2D : null); // Get emissive P = _SourceMaterial.Find("EmissiveColor"); if (P != null) { Temp.FromVector3(P.AsFloat3.Value); m_EmissiveColor = Temp; } }
public Light(Scene _Owner, FBX.Scene.Nodes.Node _Node) : base(_Owner, _Node) { FBX.Scene.Nodes.Light _Light = _Node as FBX.Scene.Nodes.Light; m_LightType = (LIGHT_TYPE)_Light.Type; m_Color.FromVector3(_Light.Color); m_Intensity = _Light.Intensity; m_HotSpot = _Light.HotSpot; m_ConeAngle = _Light.ConeAngle; }
public Primitive(Mesh _Owner, FBX.Scene.Nodes.Mesh.Primitive _Primitive) { m_Owner = _Owner; m_MaterialID = (ushort)_Primitive.MaterialParms.ID; m_Faces = new Face[_Primitive.FacesCount]; m_Vertices = new Vertex[_Primitive.VerticesCount]; // Retrieve streams FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE[] Usages = { FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS, }; FBX.Scene.Nodes.Mesh.Primitive.VertexStream[][] Streams = new FBX.Scene.Nodes.Mesh.Primitive.VertexStream[Usages.Length][]; for (int UsageIndex = 0; UsageIndex < Usages.Length; UsageIndex++) { Streams[UsageIndex] = _Primitive.FindStreamsByUsage(Usages[UsageIndex]); if (Streams[UsageIndex].Length == 0) { throw new Exception("No stream for usage " + Usages[UsageIndex] + "! Can't complete target vertex format!"); } } // Build local space bounding box float3 Temp = new float3(); WMath.Vector[] VertexPositions = Streams[0][0].Content as WMath.Vector[]; foreach (WMath.Vector VertexPosition in VertexPositions) { Temp.FromVector3(VertexPosition); m_BBoxMin.Min(Temp); m_BBoxMax.Max(Temp); } // Build faces int FaceIndex = 0; foreach (FBX.Scene.Nodes.Mesh.Primitive.Face F in _Primitive.Faces) { m_Faces[FaceIndex].V0 = F.V0; m_Faces[FaceIndex].V1 = F.V1; m_Faces[FaceIndex].V2 = F.V2; FaceIndex++; } // Build vertices for (int VertexIndex = 0; VertexIndex < m_Vertices.Length; VertexIndex++) { for (int UsageIndex = 0; UsageIndex < Usages.Length; UsageIndex++) { FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE Usage = Usages[UsageIndex]; switch (Usage) { case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].P = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].N = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].G = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].B = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS: { float2[] Stream = Streams[UsageIndex][0].Content as float2[]; m_Vertices[VertexIndex].T = Stream[VertexIndex]; break; } } } } }
public Primitive( Mesh _Owner, FBX.Scene.Nodes.Mesh.Primitive _Primitive ) { m_Owner = _Owner; m_MaterialID = (ushort) _Primitive.MaterialParms.ID; m_Faces = new Face[_Primitive.FacesCount]; m_Vertices = new Vertex[_Primitive.VerticesCount]; // Retrieve streams FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE[] Usages = { FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT, FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS, }; FBX.Scene.Nodes.Mesh.Primitive.VertexStream[][] Streams = new FBX.Scene.Nodes.Mesh.Primitive.VertexStream[Usages.Length][]; for ( int UsageIndex=0; UsageIndex < Usages.Length; UsageIndex++ ) { Streams[UsageIndex] = _Primitive.FindStreamsByUsage( Usages[UsageIndex] ); if ( Streams[UsageIndex].Length == 0 ) throw new Exception( "No stream for usage " + Usages[UsageIndex] + "! Can't complete target vertex format!" ); } // Build local space bounding box float3 Temp = new float3(); WMath.Vector[] VertexPositions = Streams[0][0].Content as WMath.Vector[]; foreach ( WMath.Vector VertexPosition in VertexPositions ) { Temp.FromVector3( VertexPosition ); m_BBoxMin.Min( Temp ); m_BBoxMax.Max( Temp ); } // Build faces int FaceIndex = 0; foreach ( FBX.Scene.Nodes.Mesh.Primitive.Face F in _Primitive.Faces ) { m_Faces[FaceIndex].V0 = F.V0; m_Faces[FaceIndex].V1 = F.V1; m_Faces[FaceIndex].V2 = F.V2; FaceIndex++; } // Build vertices for ( int VertexIndex=0; VertexIndex < m_Vertices.Length; VertexIndex++ ) { for ( int UsageIndex=0; UsageIndex < Usages.Length; UsageIndex++ ) { FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE Usage = Usages[UsageIndex]; switch ( Usage ) { case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.POSITION: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].P = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.NORMAL: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].N = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TANGENT: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].G = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.BITANGENT: { float3[] Stream = Streams[UsageIndex][0].Content as float3[]; m_Vertices[VertexIndex].B = Stream[VertexIndex]; break; } case FBX.Scene.Nodes.Mesh.Primitive.VertexStream.USAGE.TEXCOORDS: { float2[] Stream = Streams[UsageIndex][0].Content as float2[]; m_Vertices[VertexIndex].T = Stream[VertexIndex]; break; } } } } }
public Material( FBX.Scene.Materials.MaterialParameters _SourceMaterial, MaterialMapperDelegate _Mapper ) { float3 Temp = new float3(); FBX.Scene.Materials.MaterialParameters.Parameter P = null; m_ID = (ushort) _SourceMaterial.ID; // Get diffuse color + texture ID P = _SourceMaterial.Find( "DiffuseColor" ); if ( P != null ) { Temp.FromVector3( P.AsFloat3.Value ); m_DiffuseColor = Temp; } P = _SourceMaterial.Find( "DiffuseTexture" ); m_DiffuseTextureID = _Mapper( P != null ? P.AsTexture2D : null ); // Get specular color + texture ID + exponent P = _SourceMaterial.Find( "SpecularColor" ); if ( P != null ) { Temp.FromVector3( P.AsFloat3.Value ); m_SpecularColor = Temp; } P = _SourceMaterial.Find( "SpecularTexture" ); m_SpecularTextureID = _Mapper( P != null ? P.AsTexture2D : null ); P = _SourceMaterial.Find( "SpecularExponent" ); if ( P != null ) { Temp.FromVector3( P.AsFloat3.Value ); m_SpecularExponent = Temp; } // Get noral map ID P = _SourceMaterial.Find( "NormalTexture" ); m_NormalTextureID = _Mapper( P != null ? P.AsTexture2D : null ); // Get emissive P = _SourceMaterial.Find( "EmissiveColor" ); if ( P != null ) { Temp.FromVector3( P.AsFloat3.Value ); m_EmissiveColor = Temp; } }