コード例 #1
0
        public void CreateBabylonMaterial(BabylonScene scene)
        {
            var babylonMaterial = new BabylonMaterial();
            scene.MaterialsList.Add(babylonMaterial);

            // Guid
            babylonMaterial.id = ID.ToString();

            // Name
            babylonMaterial.name = Name;

            // Data
            babylonMaterial.backFaceCulling = BackFaceCulling;
            babylonMaterial.diffuse = Diffuse.ToArray();
            babylonMaterial.emissive = Emissive.ToArray();
            babylonMaterial.specular = Specular.ToArray();
            babylonMaterial.specularPower = SpecularPower;
            babylonMaterial.alpha = Alpha;

            if (string.IsNullOrEmpty(DiffuseTexture))
            {
                babylonMaterial.diffuseTexture = null;
                return;
            }

            babylonMaterial.diffuseTexture = new BabylonTexture();
            babylonMaterial.diffuseTexture.name = Path.GetFileName(DiffuseTexture);

            scene.AddTexture(DiffuseTexture);
        }
コード例 #2
0
        void DumpMaterials(BabylonScene babylonScene)
        {
            var count = 0;
            foreach (NovaMaterial material in materialsToExport)
            {
                var stdMaterial = material as NovaStandardMaterial;

                if (stdMaterial != null)
                {
                    DumpStandardMaterial(stdMaterial, babylonScene);
                    continue;
                }

                var perPixelShader = material as NovaPerPixelShader;

                if (perPixelShader != null)
                {
                    DumpPerPixelShader(perPixelShader, babylonScene);
                    continue;
                }

                var multiMaterial = material as NovaMultiMaterial;

                if (multiMaterial != null)
                {
                    DumpMultiMaterial(multiMaterial, babylonScene);
                }

                ReportProgressChanged(75 + (count++ * 25) / materialsToExport.Count);
            }
        }
コード例 #3
0
ファイル: ProxyMesh.cs プロジェクト: rchntrl/Babylon.js
        public static Guid CreateBabylonMesh(string name, BabylonScene scene)
        {
            var babylonMesh = new BabylonMesh();
            scene.MeshesList.Add(babylonMesh);

            // Guid
            var id = Guid.NewGuid();
            babylonMesh.id = id.ToString();

            // Name
            babylonMesh.name = name;

            // Parent
            babylonMesh.parentId = "";

            // Visible
            babylonMesh.isVisible = false;

            // Material ID
            babylonMesh.materialId = "";

            // Position
            babylonMesh.position = Vector3.Zero.ToArray();

            // Vertices
            babylonMesh.positions = null;

            // Faces
            babylonMesh.indices = null;

            return id;
        }
コード例 #4
0
        void ImportMaterialLibraries(ObjLine materialLine, BabylonScene scene)
        {
            for (int i = 1; i < materialLine.Tokens.Length; i++)
            {
                string fileName = materialLine.Tokens[i];

                var mtlDocument = new Document<MtlLine>(File.ReadAllText(fileName));

                StandardMaterial currentMaterial = null;

                foreach (var lines in mtlDocument.Blocks)
                {
                    foreach (MtlLine line in lines)
                    {

                        switch (line.Header)
                        {
                            case MtlHeader.Material:
                                currentMaterial = new StandardMaterial(line.Tokens[1]);
                                currentMaterial.BackFaceCulling = false;
                                materials.Add(currentMaterial);
                                break;
                            case MtlHeader.DiffuseColor:
                                currentMaterial.Diffuse = line.ToColor();
                                break;
                            case MtlHeader.DiffuseTexture:
                                currentMaterial.Diffuse = new Color3(1, 1, 1);
                                currentMaterial.DiffuseTexture = line.Tokens[1].Replace("//", @"\");
                                break;
                            case MtlHeader.Alpha:
                                currentMaterial.Alpha = line.ToFloat();
                                break;
                            case MtlHeader.EmissiveColor:
                                currentMaterial.Emissive = line.ToColor();
                                break;
                            case MtlHeader.SpecularColor:
                                currentMaterial.Specular = line.ToColor();
                                break;
                            case MtlHeader.SpecularPower:
                                currentMaterial.SpecularPower = line.ToFloat();
                                break;
                        }
                    }
                }
            }

            foreach (var material in materials)
            {
                material.CreateBabylonMaterial(scene);
            }
        }
コード例 #5
0
        void DumpStandardMaterial(NovaStandardMaterial stdMaterial, BabylonScene babylonScene)
        {
            var babylonMaterial = new BabylonMaterial();
            babylonScene.MaterialsList.Add(babylonMaterial);

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

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

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

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

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

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

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

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

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

            if (stdMaterial.BumpTexture != null && stdMaterial.BumpTexture.HasTextureData && !stdMaterial.BumpTexture.IsVideo && !stdMaterial.BumpTexture.IsCubeRender)
            {
                babylonMaterial.bumpTexture = new BabylonTexture();
                DumpTexture(stdMaterial.BumpTexture, babylonMaterial.bumpTexture, babylonScene);
                babylonMaterial.bumpTexture.level /= 2.0f;
            }
        }
コード例 #6
0
        string CopyTexture(NovaTexture texture, BabylonScene babylonScene)
        {
            string name = texture.Name;
            // Data
            if (!alreadyExportedTextures.Contains(texture.Name + texture.HasAlpha))
            {
                alreadyExportedTextures.Add(texture.Name + texture.HasAlpha);

                if (Path.GetExtension(texture.Name).ToLower() == ".dds" || Path.GetExtension(texture.Name).ToLower() == ".bmp")
                {
                    name = Path.GetFileNameWithoutExtension(texture.Name) + ".png";
                    var alreadyExists = File.Exists(Path.Combine(babylonScene.OutputPath, name));

                    texture.LoadedTexture.SaveToPNG(Path.Combine(babylonScene.OutputPath, name));

                    if (!texture.HasAlpha)
                    {
                        var oldPath = Path.Combine(babylonScene.OutputPath, name);
                        var bmp = Image.FromFile(oldPath);

                        name = Path.GetFileNameWithoutExtension(texture.Name) + ".jpg";

                        bmp.Save(Path.Combine(babylonScene.OutputPath, name), ImageFormat.Jpeg);
                        bmp.Dispose();

                        if (!alreadyExists)
                        {
                            File.Delete(oldPath);
                        }
                    }
                }
                else
                {
                    var sourceFile = Path.Combine(texture.Directory, texture.Filename);
                    File.Copy(sourceFile, Path.Combine(babylonScene.OutputPath, Path.GetFileName(sourceFile)), true);
                }
            }
            else
            {
                if (Path.GetExtension(texture.Name).ToLower() == ".dds" ||
                    Path.GetExtension(texture.Name).ToLower() == ".bmp")
                {
                    name = Path.GetFileNameWithoutExtension(texture.Name) + (texture.HasAlpha ? ".png" : ".jpg");
                }
            }

            return name;
        }
コード例 #7
0
        void DumpTexture(NovaTexture texture, BabylonTexture babylonTexture, BabylonScene babylonScene)
        {
            babylonTexture.level = texture.Level;
            babylonTexture.hasAlpha = texture.HasAlpha;
            babylonTexture.coordinatesMode = (int)texture.MapType;

            if (texture.LoadedTexture.IsCube)
            {
                DumpCubeTexture(texture, babylonTexture, babylonScene);
                return;
            }

            babylonTexture.name = texture.Name;
            babylonTexture.uOffset = texture.UOffset;
            babylonTexture.vOffset = texture.VOffset;
            babylonTexture.uScale = texture.UScale;
            babylonTexture.vScale = texture.VScale;
            babylonTexture.uAng = texture.UAng;
            babylonTexture.vAng = texture.VAng;
            babylonTexture.wAng = texture.WAng;
            switch (texture.UAddressMode)
            {
                case NovaTextureAddress.Wrap:
                    babylonTexture.wrapU = 1;
                    break;
                case NovaTextureAddress.Mirror:
                    babylonTexture.wrapU = 2;
                    break;
                case NovaTextureAddress.Clamp:
                    babylonTexture.wrapU = 0;
                    break;
            }
            switch (texture.VAddressMode)
            {
                case NovaTextureAddress.Wrap:
                    babylonTexture.wrapV = 1;
                    break;
                case NovaTextureAddress.Mirror:
                    babylonTexture.wrapV = 2;
                    break;
                case NovaTextureAddress.Clamp:
                    babylonTexture.wrapV = 0;
                    break;
            }
            babylonTexture.coordinatesIndex = texture.MapCoordinateIndex;

            DumpTextureAnimation(texture, babylonTexture);

            babylonTexture.name = CopyTexture(texture, babylonScene);
        }
コード例 #8
0
        private void DumpCubeTexture(NovaTexture texture, BabylonTexture babylonTexture, BabylonScene babylonScene)
        {
            var textureFilename = Path.Combine(texture.LoadedTexture.Directory, texture.LoadedTexture.Filename);
            var baseName = Path.GetFileNameWithoutExtension(texture.LoadedTexture.Filename);

            babylonTexture.isCube = true;
            babylonTexture.name = baseName;

            baseName = Path.Combine(babylonScene.OutputPath, baseName);

            if (!File.Exists(textureFilename))
            {
                texture.LoadedTexture.SaveToDDS(false, textureFilename);
            }

            if (!alreadyExportedTextures.Contains(textureFilename))
            {
                alreadyExportedTextures.Add(textureFilename);

                // Use SharpDX to extract face images
                var form = new Form { ClientSize = new Size(64, 64) };
                var device = new Device(new Direct3D(), 0, DeviceType.Hardware, form.Handle,
                                        CreateFlags.HardwareVertexProcessing,
                                        new PresentParameters(form.ClientSize.Width, form.ClientSize.Height));

                var cubeTexture = CubeTexture.FromFile(device, textureFilename);

                using (var surface = cubeTexture.GetCubeMapSurface(CubeMapFace.PositiveX, 0))
                {
                    Surface.ToFile(surface, baseName + "_px.jpg", ImageFileFormat.Jpg);
                }
                using (var surface = cubeTexture.GetCubeMapSurface(CubeMapFace.PositiveY, 0))
                {
                    Surface.ToFile(surface, baseName + "_py.jpg", ImageFileFormat.Jpg);
                }
                using (var surface = cubeTexture.GetCubeMapSurface(CubeMapFace.PositiveZ, 0))
                {
                    Surface.ToFile(surface, baseName + "_pz.jpg", ImageFileFormat.Jpg);
                }
                using (var surface = cubeTexture.GetCubeMapSurface(CubeMapFace.NegativeX, 0))
                {
                    Surface.ToFile(surface, baseName + "_nx.jpg", ImageFileFormat.Jpg);
                }
                using (var surface = cubeTexture.GetCubeMapSurface(CubeMapFace.NegativeY, 0))
                {
                    Surface.ToFile(surface, baseName + "_ny.jpg", ImageFileFormat.Jpg);
                }
                using (var surface = cubeTexture.GetCubeMapSurface(CubeMapFace.NegativeZ, 0))
                {
                    Surface.ToFile(surface, baseName + "_nz.jpg", ImageFileFormat.Jpg);
                }

                cubeTexture.Dispose();
                device.Dispose();
                form.Dispose();
            }
        }
コード例 #9
0
        static void DumpMultiMaterial(NovaMultiMaterial multiMaterial, BabylonScene babylonScene)
        {
            var babylonMultiMaterial = new BabylonMultiMaterial();
            babylonScene.MultiMaterialsList.Add(babylonMultiMaterial);

            babylonMultiMaterial.name = multiMaterial.Name;
            babylonMultiMaterial.id = multiMaterial.ID.ToString();

            babylonMultiMaterial.materials = multiMaterial.Materials.Select(material => (material != null ? material.ID.ToString() : "")).ToArray();
        }
コード例 #10
0
        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;
            }
        }
コード例 #11
0
        public void GenerateBabylonFile(string file, string outputFile, bool skinned)
        {
            var text = File.ReadAllText(file);

            Environment.CurrentDirectory = Path.GetDirectoryName(file);

            // Scene
            var scene = new BabylonScene(Path.GetDirectoryName(outputFile));

            // Loading
            var objDocument = new Document<ObjLine>(text);

            materials.Clear();

            int currentProgression = 0;

            int total = objDocument.Blocks.Sum(lines => lines.Count);

            string currentName = "";
            StandardMaterial currentMaterial = null;

            foreach (var lines in objDocument.Blocks)
            {
                if (lines[0].Tokens[0] == lines[0].BlockSperator)
                {
                    AppendNewPart(currentName, currentMaterial);
                }
                foreach (ObjLine line in lines)
                {
                    currentProgression++;
                    ReportProgressChanged((currentProgression * 100) / total);

                    switch (line.Header)
                    {
                        case ObjHeader.Vertices:
                            positions.Add(line.ToVector3());
                            break;
                        case ObjHeader.TextureCoordinates:
                            Vector2 tv = line.ToVector2();
                            textureCoordinates.Add(tv);
                            break;
                        case ObjHeader.Normals:
                            normals.Add(line.ToVector3());
                            break;
                        case ObjHeader.Group:
                            currentName = line.Tokens[1];
                            break;
                        case ObjHeader.Faces:
                            AppendFace(line);
                            break;
                        case ObjHeader.MaterialLibrary:
                            ImportMaterialLibraries(line, scene);
                            break;
                        case ObjHeader.Material:
                            string materialName = line.Tokens[1];
                            currentMaterial = materials.FirstOrDefault(e => e.Name == materialName);
                            break;
                    }
                }
            }

            if (positions.Count > 0)
            {
                AppendNewPart(currentName, currentMaterial);
            }

            if (meshParts.Count > 1)
            {
                var proxyID = ProxyMesh.CreateBabylonMesh(currentName, scene);
                foreach (Mesh<PositionNormalTextured> part in meshParts.Values)
                {
                    part.CreateBabylonMesh(scene, proxyID);
                }
            }
            else
            {
                meshParts.Values.First().CreateBabylonMesh(scene);
            }

            // Output
            scene.Prepare();
            using (var outputStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
            {
                var ser = new DataContractJsonSerializer(typeof (BabylonScene));
                ser.WriteObject(outputStream, scene);
            }
        }
コード例 #12
0
        string CopyTexture(NovaTexture texture, BabylonScene babylonScene)
        {
            string name = texture.Name;
            // Data
            if (!alreadyExportedTextures.Contains(texture.Name))
            {
                alreadyExportedTextures.Add(texture.Name);

                if (Path.GetExtension(texture.Name).ToLower() == ".dds" || Path.GetExtension(texture.Name).ToLower() == ".bmp")
                {
                    name = Path.GetFileNameWithoutExtension(texture.Name) + ".png";
                    texture.LoadedTexture.SaveToPNG(Path.Combine(babylonScene.OutputPath, name));
                }
                else
                {
                    var sourceFile = Path.Combine(texture.Directory, texture.Filename);
                    File.Copy(sourceFile, Path.Combine(babylonScene.OutputPath, Path.GetFileName(sourceFile)), true);
                }
            }
            else
            {
                if (Path.GetExtension(texture.Name).ToLower() == ".dds" ||
                    Path.GetExtension(texture.Name).ToLower() == ".bmp")
                {
                    name = Path.GetFileNameWithoutExtension(texture.Name) + ".png";
                }
            }

            return name;
        }