Example #1
0
        public void Export(SceneFormat fmt)
        {
            // 유니티 씬을 제대로 읽었는지 확인
            bool useDump = false;

            if (useDump)
            {
                DumpUnitySceneRoot(unitySceneRoot);
            }

            // 유니티씬을 threejs 씬으로 변환
            ThreeSceneRoot threeSceneRoot = BuildThreeSceneRoot(unitySceneRoot);

            WriteTextureFiles(threeSceneRoot, fmt);
            WriteModelFiles(threeSceneRoot, fmt);


            switch (fmt)
            {
            case SceneFormat.AFrame:
                WriteToAFrame(threeSceneRoot);
                break;

            case SceneFormat.ThreeJS:
                WriteToThreeJS(threeSceneRoot);
                break;

            default:
                Debug.Assert(false, "unknown format");
                break;
            }
        }
Example #2
0
        void WriteModelFiles(ThreeSceneRoot root, SceneFormat fmt)
        {
            // three.js는 단일 파일로 출력하는게 목적이라서 model 파일을 생성하지 않는다
            var pathHelper = ExportPathHelper.Instance;

            if (fmt == SceneFormat.AFrame)
            {
                foreach (var el in root.SharedNodeTable.GetEnumerable <MeshElem>())
                {
                    var bufferGeom = el.Geometry as BufferGeometryElem;
                    if (bufferGeom != null)
                    {
                        string filepath = pathHelper.ToModelPath(bufferGeom.CreateMeshFileName(".obj"));
                        ObjExporter.MeshToFile(bufferGeom.Mesh, filepath);
                    }

                    var mtl = MaterialFacade.Instance.CreateMaterial(el.Material);
                    if (bufferGeom != null)
                    {
                        string filepath = pathHelper.ToModelPath(bufferGeom.CreateMeshFileName(".mtl"));
                        MtlExporter.ToFile(mtl, bufferGeom.SafeName, filepath);
                    }
                }
            }
        }
Example #3
0
        void WriteTextureFiles(ThreeSceneRoot root, SceneFormat fmt)
        {
            var pathHelper = ExportPathHelper.Instance;

            // 일반 텍스쳐 export
            foreach (var el in root.SharedNodeTable.GetEnumerable <ImageElem>())
            {
                el.ExpoortImageFile(pathHelper);
            }
        }
Example #4
0
        void WriteToThreeJS(ThreeSceneRoot root)
        {
            // wrilte to text file
            var sb     = new StringBuilder();
            var writer = new JsonWriter(sb);

            writer.PrettyPrint = true;
            writer.IndentValue = 2;

            root.ExportJson(writer);
            var content = sb.ToString();

            WriteExportedTextFile(content);
        }
Example #5
0
        void WriteMaterialFiles(ThreeSceneRoot root, SceneFormat fmt)
        {
            var pathHelper = ExportPathHelper.Instance;

            if (fmt == SceneFormat.AFrame)
            {
                foreach (var el in root.SharedNodeTable.GetEnumerable <MaterialElem>())
                {
                    var    aframeMtl = MaterialFacade.Instance.CreateMaterial(el);
                    var    name      = el.Name;
                    string filepath  = pathHelper.ToModelPath(name + ".mtl");
                    MtlExporter.ToFile(aframeMtl, name, filepath);
                }
            }
        }
Example #6
0
        void WriteToAFrame(ThreeSceneRoot root)
        {
            var sb   = new StringBuilder();
            var node = root.ExportAFrame();

            node.BuildSource(sb);

            var aframe = ExportSettings.Instance.aframe;
            var source = sb.ToString() + "\n";
            var text   = aframe.TemplateHead + source + aframe.TemplateAppend + aframe.TemplateEnd;

            text = text.Replace("&TITLE&", aframe.title);
            text = text.Replace("&LIBRARY&", aframe.libraryAddress);

            WriteExportedTextFile(text);
        }
Example #7
0
        public void Export()
        {
            // 유니티 씬을 제대로 읽었는지 확인
            {
                var report = new Report("UnitySceneDump");
                report.UseConsole = false;

                var dumpVisitor = new DumpVisitor(report);
                dumpVisitor.Run(unitySceneRoot);

                report.SaveReportFile("unity-scene.log");
            }

            // 유니티씬을 threejs 씬으로 변환
            ThreeSceneRoot threeSceneRoot = null;
            {
                var report = new Report("ThreeSceneConvert");
                report.UseConsole = false;
                var visitor = new ThreeSceneConvertVisitor(report);
                threeSceneRoot = visitor.Run(unitySceneRoot);
            }

            // threejs 씬을 json으로 뽑기
            {
                var sb     = new StringBuilder();
                var writer = new JsonWriter(sb);
                writer.PrettyPrint = true;
                writer.IndentValue = 2;

                threeSceneRoot.ExportJson(writer);
                var report = new Report("ThreeSceneJson");
                report.UseConsole = false;
                report.Info(sb.ToString());

                // 일반 텍스쳐 export
                foreach (var el in threeSceneRoot.SharedNodeTable.GetEnumerable <ImageElem>())
                {
                    el.ExpoortImageFile(pathHelper);
                }


                report.SaveReportFile("demo.json");
            }
        }
Example #8
0
        void WriteModelFiles(ThreeSceneRoot root, SceneFormat fmt)
        {
            // three.js는 단일 파일로 출력하는게 목적이라서 model 파일을 생성하지 않는다
            var pathHelper = ExportPathHelper.Instance;

            if (fmt == SceneFormat.AFrame)
            {
                foreach (var el in root.SharedNodeTable.GetEnumerable <AbstractGeometryElem>())
                {
                    // TODO 타입에 따라서 obj 굽는게 바뀔텐데
                    var bufferGeom = el as BufferGeometryElem;
                    if (bufferGeom == null)
                    {
                        continue;
                    }

                    string filepath = pathHelper.ToModelPath(bufferGeom.CreateMeshFileName(".obj"));
                    ObjExporter.MeshToFile(bufferGeom.Mesh, filepath);
                }
            }
        }
Example #9
0
 public ThreeSceneConvertVisitor(Report report)
 {
     this.report = report;
     this.root   = new ThreeSceneRoot();
 }