void DumpPerPixelShader(NovaPerPixelShader ppShader, BabylonScene babylonScene)
        {
            var babylonMaterial = new BabylonMaterial();
            babylonScene.MaterialsList.Add(babylonMaterial);

            babylonMaterial.name = ppShader.Name;
            babylonMaterial.id = ppShader.ID.ToString();
            babylonMaterial.alpha = ppShader.Alpha;
            babylonMaterial.ambient = (ppShader.Ambient * (1.0f - ppShader.SelfIllumination)).ToArray();
            babylonMaterial.diffuse = (ppShader.Diffuse * (1.0f - ppShader.SelfIllumination)).ToArray();
            babylonMaterial.emissive = (ppShader.Emissive * ppShader.SelfIllumination).ToArray();
            babylonMaterial.specular = ppShader.Specular.ToArray();
            babylonMaterial.specularPower = ppShader.SpecularSharpness;
            babylonMaterial.backFaceCulling = (ppShader.CullMode == NovaCull.CounterClockwise);

            if (ppShader.DiffuseTexture != null && ppShader.DiffuseTexture.HasTextureData && ppShader.OpacityTexture != null && ppShader.OpacityTexture.HasTextureData)
            {
                if (ppShader.DiffuseTexture.LoadedTexture == ppShader.OpacityTexture.LoadedTexture)
                {
                    ppShader.DiffuseTexture = ppShader.OpacityTexture;
                    ppShader.OpacityTexture = null;
                }
            }

            if (ppShader.DiffuseTexture != null && ppShader.DiffuseTexture.HasTextureData && !ppShader.DiffuseTexture.IsVideo && !ppShader.DiffuseTexture.IsCubeRender)
            {
                babylonMaterial.diffuseTexture = new BabylonTexture();
                DumpTexture(ppShader.DiffuseTexture, babylonMaterial.diffuseTexture, babylonScene);
            }

            if (ppShader.AmbientTexture != null && ppShader.AmbientTexture.HasTextureData && !ppShader.AmbientTexture.IsVideo && !ppShader.AmbientTexture.IsCubeRender)
            {
                babylonMaterial.ambientTexture = new BabylonTexture();
                DumpTexture(ppShader.AmbientTexture, babylonMaterial.ambientTexture, babylonScene);
            }

            if (ppShader.OpacityTexture != null && ppShader.OpacityTexture.HasTextureData && !ppShader.OpacityTexture.IsVideo && !ppShader.OpacityTexture.IsCubeRender)
            {
                babylonMaterial.opacityTexture = new BabylonTexture();
                DumpTexture(ppShader.OpacityTexture, babylonMaterial.opacityTexture, babylonScene);
            }

            if (mirrorsMaterials.ContainsKey(ppShader))
            {
                babylonMaterial.reflectionTexture = new BabylonTexture();
                var novaObject = mirrorsMaterials[ppShader];
                DumpRenderTargetTexture(ppShader.ReflectionTexture, babylonMaterial.reflectionTexture, novaObject.MirrorMapSize, novaObject.MirrorLevel, novaObject.MirroredObjects);

                AttachMirrorPlane(babylonMaterial.reflectionTexture, novaObject);
            }
            else if (ppShader.ReflectionTexture != null && ppShader.ReflectionTexture.HasTextureData && !ppShader.ReflectionTexture.IsVideo && !ppShader.ReflectionTexture.IsCubeRender)
            {
                babylonMaterial.reflectionTexture = new BabylonTexture();
                DumpTexture(ppShader.ReflectionTexture, babylonMaterial.reflectionTexture, babylonScene);
            }

            // Refraction
            if (ppShader.RefractionLevel > 0)
            {
                babylonMaterial.alpha = 1.0f - ppShader.RefractionLevel;
            }

            if (ppShader.EmissiveTexture != null && ppShader.EmissiveTexture.HasTextureData && !ppShader.EmissiveTexture.IsVideo && !ppShader.EmissiveTexture.IsCubeRender)
            {
                babylonMaterial.emissiveTexture = new BabylonTexture();
                DumpTexture(ppShader.EmissiveTexture, babylonMaterial.emissiveTexture, babylonScene);
            }

            if (ppShader.SpecularTexture != null && ppShader.SpecularTexture.HasTextureData && !ppShader.SpecularTexture.IsVideo && !ppShader.SpecularTexture.IsCubeRender)
            {
                babylonMaterial.specularTexture = new BabylonTexture();
                DumpTexture(ppShader.SpecularTexture, babylonMaterial.specularTexture, babylonScene);
            }

            if (ppShader.BumpTexture != null && ppShader.BumpTexture.HasTextureData && !ppShader.BumpTexture.IsVideo && !ppShader.BumpTexture.IsCubeRender)
            {
                babylonMaterial.bumpTexture = new BabylonTexture();
                DumpTexture(ppShader.BumpTexture, babylonMaterial.bumpTexture, babylonScene);
                babylonMaterial.bumpTexture.level /= 2.0f;
            }
        }
        void DumpPerPixelShader(NovaPerPixelShader ppShader, BabylonScene babylonScene)
        {
            var babylonMaterial = new BabylonMaterial();

            babylonScene.MaterialsList.Add(babylonMaterial);

            babylonMaterial.name            = ppShader.Name;
            babylonMaterial.id              = ppShader.ID.ToString();
            babylonMaterial.alpha           = ppShader.Alpha;
            babylonMaterial.ambient         = (ppShader.Ambient * (1.0f - ppShader.SelfIllumination)).ToArray();
            babylonMaterial.diffuse         = (ppShader.Diffuse * (1.0f - ppShader.SelfIllumination)).ToArray();
            babylonMaterial.emissive        = (ppShader.Emissive * ppShader.SelfIllumination).ToArray();
            babylonMaterial.specular        = ppShader.Specular.ToArray();
            babylonMaterial.specularPower   = ppShader.SpecularSharpness;
            babylonMaterial.backFaceCulling = (ppShader.CullMode == NovaCull.CounterClockwise);

            if (ppShader.DiffuseTexture != null && ppShader.DiffuseTexture.HasTextureData && ppShader.OpacityTexture != null && ppShader.OpacityTexture.HasTextureData)
            {
                if (ppShader.DiffuseTexture.LoadedTexture == ppShader.OpacityTexture.LoadedTexture)
                {
                    ppShader.DiffuseTexture = ppShader.OpacityTexture;
                    ppShader.OpacityTexture = null;
                }
            }

            if (ppShader.DiffuseTexture != null && ppShader.DiffuseTexture.HasTextureData && !ppShader.DiffuseTexture.IsVideo && !ppShader.DiffuseTexture.IsCubeRender)
            {
                babylonMaterial.diffuseTexture = new BabylonTexture();
                DumpTexture(ppShader.DiffuseTexture, babylonMaterial.diffuseTexture, babylonScene);
            }

            if (ppShader.AmbientTexture != null && ppShader.AmbientTexture.HasTextureData && !ppShader.AmbientTexture.IsVideo && !ppShader.AmbientTexture.IsCubeRender)
            {
                babylonMaterial.ambientTexture = new BabylonTexture();
                DumpTexture(ppShader.AmbientTexture, babylonMaterial.ambientTexture, babylonScene);
            }

            if (ppShader.OpacityTexture != null && ppShader.OpacityTexture.HasTextureData && !ppShader.OpacityTexture.IsVideo && !ppShader.OpacityTexture.IsCubeRender)
            {
                babylonMaterial.opacityTexture = new BabylonTexture();
                DumpTexture(ppShader.OpacityTexture, babylonMaterial.opacityTexture, babylonScene);
            }

            if (mirrorsMaterials.ContainsKey(ppShader))
            {
                babylonMaterial.reflectionTexture = new BabylonTexture();
                var novaObject = mirrorsMaterials[ppShader];
                DumpRenderTargetTexture(ppShader.ReflectionTexture, babylonMaterial.reflectionTexture, novaObject.MirrorMapSize, novaObject.MirrorLevel, novaObject.MirroredObjects);

                AttachMirrorPlane(babylonMaterial.reflectionTexture, novaObject);
            }
            else if (ppShader.ReflectionTexture != null && ppShader.ReflectionTexture.HasTextureData && !ppShader.ReflectionTexture.IsVideo && !ppShader.ReflectionTexture.IsCubeRender)
            {
                babylonMaterial.reflectionTexture = new BabylonTexture();
                DumpTexture(ppShader.ReflectionTexture, babylonMaterial.reflectionTexture, babylonScene);
            }

            // Refraction
            if (ppShader.RefractionLevel > 0)
            {
                babylonMaterial.alpha = 1.0f - ppShader.RefractionLevel;
            }

            if (ppShader.EmissiveTexture != null && ppShader.EmissiveTexture.HasTextureData && !ppShader.EmissiveTexture.IsVideo && !ppShader.EmissiveTexture.IsCubeRender)
            {
                babylonMaterial.emissiveTexture = new BabylonTexture();
                DumpTexture(ppShader.EmissiveTexture, babylonMaterial.emissiveTexture, babylonScene);
            }

            if (ppShader.SpecularTexture != null && ppShader.SpecularTexture.HasTextureData && !ppShader.SpecularTexture.IsVideo && !ppShader.SpecularTexture.IsCubeRender)
            {
                babylonMaterial.specularTexture = new BabylonTexture();
                DumpTexture(ppShader.SpecularTexture, babylonMaterial.specularTexture, babylonScene);
            }

            if (ppShader.BumpTexture != null && ppShader.BumpTexture.HasTextureData && !ppShader.BumpTexture.IsVideo && !ppShader.BumpTexture.IsCubeRender)
            {
                babylonMaterial.bumpTexture = new BabylonTexture();
                DumpTexture(ppShader.BumpTexture, babylonMaterial.bumpTexture, babylonScene);
                babylonMaterial.bumpTexture.level /= 2.0f;
            }
        }