Exemplo n.º 1
0
        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,
            });
        }
Exemplo n.º 2
0
        //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);
        }