public static MgtfMaterial ExtractNewMaterial(Material src) { MgtfMaterialTexture baseColorTexture = null; MgtfMaterialTexture roughnessTexture = null; var baseColorFactor = new MgVec4f(1f, 1f, 1f, 1f); var metallicFactor = 1f; var roughnessFactor = 1f; var pbrInfo = src.PbrMetallicRoughness; if (pbrInfo != null) { baseColorFactor = new MgVec4f { X = pbrInfo.BaseColorFactor[0], Y = pbrInfo.BaseColorFactor[1], Z = pbrInfo.BaseColorFactor[2], W = pbrInfo.BaseColorFactor[3], }; if (pbrInfo.BaseColorTexture != null) { baseColorTexture = new MgtfMaterialTexture { Texture = pbrInfo.BaseColorTexture.Index, TexCoords = pbrInfo.BaseColorTexture.TexCoord, }; metallicFactor = pbrInfo.MetallicFactor; roughnessFactor = pbrInfo.RoughnessFactor; } if (pbrInfo.MetallicRoughnessTexture != null) { roughnessTexture = new MgtfMaterialTexture { Texture = pbrInfo.MetallicRoughnessTexture.Index, TexCoords = pbrInfo.MetallicRoughnessTexture.TexCoord, }; } } MgtfMaterialTexture NormalTexture = null; float normalScale = 1f; if (src.NormalTexture != null) { NormalTexture = new MgtfMaterialTexture { Texture = src.NormalTexture.Index, TexCoords = src.NormalTexture.TexCoord, }; normalScale = src.NormalTexture.Scale; } MgtfMaterialTexture EmissiveTexture = null; if (src.EmissiveTexture != null) { EmissiveTexture = new MgtfMaterialTexture { Texture = src.EmissiveTexture.Index, TexCoords = src.EmissiveTexture.TexCoord, }; } var emissiveFactor = new Color3f { R = 0f, G = 0f, B = 0f }; if (src.EmissiveFactor != null) { emissiveFactor = new Color3f { R = src.EmissiveFactor[0], G = src.EmissiveFactor[1], B = src.EmissiveFactor[2] }; } MgtfMaterialTexture OcclusionTexture = null; float strength = 1f; if (src.OcclusionTexture != null) { OcclusionTexture = new MgtfMaterialTexture { Texture = src.OcclusionTexture.Index, TexCoords = src.OcclusionTexture.TexCoord, }; strength = src.OcclusionTexture.Strength; } return(new MgtfMaterial { DoubleSided = src.DoubleSided, AlphaCutoff = src.AlphaCutoff, AlphaMode = ExtractAlphaMode(src.AlphaMode), BaseColorTexture = baseColorTexture, BaseColorFactor = baseColorFactor, NormalTexture = NormalTexture, NormalScale = normalScale, EmissiveTexture = EmissiveTexture, EmissiveFactor = emissiveFactor, OcclusionTexture = OcclusionTexture, OcclusionStrength = strength, MetallicFactor = metallicFactor, RoughnessFactor = roughnessFactor, RoughnessTexture = roughnessTexture, }); }
//public GltfTextureInfo[] ExtractTextures(uint bucketSize, Texture[] textures, Sampler[] samples, Image[] images) //{ // var count = textures != null ? textures.Length : 0; // var noOfBuckets = (count / bucketSize) + 1; // var chunks = new GltfTextureInfo[noOfBuckets]; // for (var i = 0; i < count; i += 1) // { // var current = textures[i]; // current.Source. // var info = new GltfTextureInfo // { // }; // chunks[i] = info; // } // return chunks; //} private GltfMaterialChunk[] ExtractMaterials(int bucketSize, Material[] materials) { var noOfMaterials = materials != null ? materials.Length : 0; var noOfBuckets = (noOfMaterials / bucketSize) + 1; var chunks = new GltfMaterialChunk[noOfBuckets]; var k = 0; for (var i = 0; i < noOfBuckets; i += 1) { chunks[i] = new GltfMaterialChunk { Items = new GltfMaterialCapsule[bucketSize], }; for (var j = 0; j < bucketSize; j += 1) { if (i == 0 && j == 0) { chunks[i].Items[j] = new GltfMaterialCapsule { DoubleSided = false, UBO = new MaterialUBO { BaseTexture = 0, BaseTextureTexCoords = 0, BaseColorFactor = new MgVec4f(1f, 1f, 1f, 1f), MetallicFactor = 1f, RoughnessFactor = 1f, NormalTexture = 0, NormalTexCoords = 0, NormalScale = 1f, OcclusionTexture = 0, OcclusionTexCoords = 0, OcclusionStrength = 1f, EmissiveFactor = new Color3f { R = 0f, G = 0f, B = 0f }, AlphaCutoff = 0.5f, // OPAQUE A = 1.0f, // A * vec4(fragColor.rgb, 1f)) B = 0f, // + B * vec4(step(alphacutoff, fragColor.a) * fragColor.rgb, 1f) C = 0f, // + C * vec4(fragColor.rgb, fragColor.a) } }; } else { if (k < noOfMaterials) { var src = materials[k]; var temp = new GltfMaterialCapsule { DoubleSided = src.DoubleSided, }; var baseColorFactor = new MgVec4f(1f, 1f, 1f, 1f); if (src.PbrMetallicRoughness != null) { baseColorFactor = new MgVec4f { X = src.PbrMetallicRoughness.BaseColorFactor[0], Y = src.PbrMetallicRoughness.BaseColorFactor[1], Z = src.PbrMetallicRoughness.BaseColorFactor[2], W = src.PbrMetallicRoughness.BaseColorFactor[3], }; } ushort normalTexCoords = 0; ushort normalTexSetOffset = 0; float normalScale = 1f; if (src.NormalTexture != null) { normalScale = src.NormalTexture.Scale; normalTexSetOffset = (ushort)src.NormalTexture.Index; normalTexCoords = (ushort)src.NormalTexture.TexCoord; } temp.UBO = new MaterialUBO { BaseColorFactor = baseColorFactor, EmissiveFactor = (src.EmissiveFactor != null) ? new Color3f { R = src.EmissiveFactor[0], G = src.EmissiveFactor[1], B = src.EmissiveFactor[2] } : new Color3f { R = 0f, G = 0f, B = 0f }, NormalScale = normalScale, NormalTexCoords = normalTexCoords, NormalTexture = normalTexSetOffset, }; chunks[i].Items[j] = temp; k += 1; } } } } // Default - chunk 0, slot 0 return(chunks); }