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; } }
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); } } } }
void WriteTextureFiles(ThreeSceneRoot root, SceneFormat fmt) { var pathHelper = ExportPathHelper.Instance; // 일반 텍스쳐 export foreach (var el in root.SharedNodeTable.GetEnumerable <ImageElem>()) { el.ExpoortImageFile(pathHelper); } }
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); }
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); } } }
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); }
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"); } }
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); } } }
public ThreeSceneConvertVisitor(Report report) { this.report = report; this.root = new ThreeSceneRoot(); }