Example #1
0
        DuMixNodeJSONFrame FillSceneGraph(DuMixNodeJSONFrame frame, DuMixCaseType type)
        {
            var converter = new DuMixNodeConvertor();

            if (type == DuMixCaseType.SLAM)
            {
                Debug.Log("转换SLAM场景");
                // Convert 3D coordinate parts
                var scene = Object.FindObjectOfType <DuMixCMPTSlamScene>();
                // SLAM坐标系转换需先将3D坐标系绕X轴旋转90度
                var rootGroup = new DuMixNodeGroup
                {
                    name     = "slam_root",
                    rotation = "90,0,0"
                };
                frame.nodeList.Add(rootGroup);
                foreach (Transform child in scene.gameObject.transform)
                {
                    var node = child.gameObject.GetComponent <DuMixCMPT3DObject>();
                    if (node != null)
                    {
                        var childDuMixNode = node.ToDuMixNode(converter);
                        Debug.Log("转换 " + node.name + " 节点");
                        rootGroup.children.Add(childDuMixNode);
                    }
                }
            }
            else if (type == DuMixCaseType.TRACK2D)
            {
                // TODO
            }
            else if (type == DuMixCaseType.IMU)
            {
                // TODO
            }

            // Convert HUD Coordinate parts
            var uiCanvas = Object.FindObjectOfType <DuMixCMPTUICanvas>();

            foreach (Transform child in uiCanvas.gameObject.transform)
            {
                var node = child.gameObject.GetComponent <DuMixCMPTUIObject>();
                if (node != null)
                {
                    var duMixNode = node.ToDuMixNode(converter);
                    Debug.Log("转换 " + node.name + " 节点");
                    frame.nodeList.Add(duMixNode);
                }
            }
            return(frame);
        }
Example #2
0
        public void Run()
        {
            Debug.Log("Unit2DuMix 开始");
            // Check AR Type
            var rootScene = Object.FindObjectOfType <DuMixCMPTScene>();

            if (rootScene == null)
            {
                Debug.LogError("找不到有效的Scene");
                return;
            }

            if (rootScene.GetType() == typeof(DuMixCMPTSlamScene))
            {
                Debug.Log("AR type: SLAM");
                this.caseType = DuMixCaseType.SLAM;
            }
            else if (rootScene.GetType() == typeof(DuMixCMPTTrackScene))
            {
                Debug.Log("AR type: TRACK");
                this.caseType = DuMixCaseType.TRACK2D;
            }
            else if (rootScene.GetType() == typeof(DuMixCMPTImuScene))
            {
                Debug.Log("AR type: IMU");
                this.caseType = DuMixCaseType.IMU;
            }

            // setup build path
            var templatePath = DuMixGlobalStringDefs.TemplatePath() + "ar";
            var buildPath    = DuMixGlobalStringDefs.BuildPath() + "ar";

            if (!Directory.Exists(DuMixGlobalStringDefs.BuildPath()))
            {
                Directory.CreateDirectory(DuMixGlobalStringDefs.BuildPath());
            }

            if (!Directory.Exists(templatePath))
            {
                Debug.LogError("DuMixARCase/Templates/ar 文件夹不存在");
            }

            if (Directory.Exists(buildPath))
            {
                FileUtil.DeleteFileOrDirectory(buildPath);
            }

            FileUtil.CopyFileOrDirectory(templatePath, buildPath);

            // -- 输出 ar/res/main.json
            DuMixNodeJSONFrame frame      = new DuMixNodeJSONFrame();
            DuMixNodeCamera    mainCamera = new DuMixNodeCamera();

            frame.nodeList.Add(mainCamera);
            frame = this.FillSceneGraph(frame, this.caseType);
            string json         = JsonConvert.SerializeObject(frame);
            var    mainJsonPath = DuMixGlobalStringDefs.BuildPath() + "ar/res/main.json";

            if (File.Exists(mainJsonPath))
            {
                File.Delete(mainJsonPath);
            }

            FileStream   fileStream   = new FileStream(mainJsonPath, FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter streamWriter = new StreamWriter(fileStream);

            streamWriter.WriteLine(json);
            streamWriter.Close();
            streamWriter.Dispose();
            fileStream.Close();
            fileStream.Dispose();

            // -- 输出 ar/targets.json
            DuMixCaseConfig config         = new DuMixCaseConfig();
            var             targetJsonPath = DuMixGlobalStringDefs.BuildPath() + "ar/targets.json";

            if (File.Exists(targetJsonPath))
            {
                File.Delete(targetJsonPath);
            }
            fileStream   = new FileStream(targetJsonPath, FileMode.OpenOrCreate, FileAccess.Write);
            streamWriter = new StreamWriter(fileStream);
            // TODO
            if (this.caseType == DuMixCaseType.TRACK2D)
            {
                // Update target values
            }
            json = JsonConvert.SerializeObject(config);
            streamWriter.WriteLine(json);
            streamWriter.Close();
            streamWriter.Dispose();
            fileStream.Close();
            fileStream.Dispose();

            // -- 输出 ar/default.lua
            var templateLuaPath = DuMixGlobalStringDefs.TemplatePath() + "default_lua/";

            switch (this.caseType)
            {
            case DuMixCaseType.IMU:
                templateLuaPath += "default_imu.lua";
                break;

            case DuMixCaseType.SLAM:
                templateLuaPath += "default_slam.lua";
                break;

            case DuMixCaseType.TRACK2D:
                templateLuaPath += "default_track.lua";
                break;
            }
            var desLuaPath = DuMixGlobalStringDefs.BuildPath() + "ar/default.lua";

            if (File.Exists(desLuaPath))
            {
                File.Delete(desLuaPath);
            }
            FileUtil.CopyFileOrDirectory(templateLuaPath, desLuaPath);

            // Copy Audio Resources
            var audioPlayers = Object.FindObjectsOfType <DuMixCMPTAudio>();

            foreach (var audio in audioPlayers)
            {
                var src        = DuMixGlobalStringDefs.ResourcePath() + audio.resPath;
                var dest       = DuMixGlobalStringDefs.BuildPath() + "ar/res/" + audio.resPath;
                var desDirPath = Path.GetDirectoryName(dest);
                if (!Directory.Exists(desDirPath))
                {    // create directory
                    Directory.CreateDirectory(desDirPath);
                }
                FileUtil.CopyFileOrDirectory(src, dest);
            }

            // User Scripts
            var luaFiles = Directory.GetFiles(DuMixGlobalStringDefs.LuaFilePath());

            foreach (var luaFile in luaFiles)
            {
                var fileName = Path.GetFileName(luaFile);
                var desPath  = DuMixGlobalStringDefs.BuildPath() + "ar/" + fileName;
                FileUtil.CopyFileOrDirectory(luaFile, desPath);
            }
            var luaFileDirs = Directory.GetDirectories(DuMixGlobalStringDefs.LuaFilePath());

            foreach (var dir in luaFileDirs)
            {
                var dirName = Path.GetFileName(dir);
                var desPath = DuMixGlobalStringDefs.BuildPath() + "ar/" + dirName;
                FileUtil.CopyFileOrDirectory(dir, desPath);
            }

            // Write to ar/unity.lua
            var luaBuilder = new LuaConstructor();

            luaBuilder.Reset();
            var evtObjests = Object.FindObjectsOfType <DuMixCMPTEvent>();

            foreach (var evt in evtObjests)
            {
                var newLine = evt.TransferToDuMixScript();
                luaBuilder.AddScript(newLine);
            }
            luaBuilder.End();

            var unityLuaPath = DuMixGlobalStringDefs.BuildPath() + "ar/unity.lua";

            fileStream   = new FileStream(unityLuaPath, FileMode.OpenOrCreate, FileAccess.Write);
            streamWriter = new StreamWriter(fileStream);
            streamWriter.WriteLine(luaBuilder.lua);
            streamWriter.Close();
            streamWriter.Dispose();

            fileStream.Close();
            fileStream.Dispose();

            // Send Case Type Message
            var setCaseTypeMsg = new DuMixRDMessageSetCaseType();

            switch (this.caseType)
            {
            case DuMixCaseType.IMU:
                setCaseTypeMsg.caseType = "imu";
                break;

            case DuMixCaseType.SLAM:
                setCaseTypeMsg.caseType = "slam";
                break;

            case DuMixCaseType.TRACK2D:
                setCaseTypeMsg.caseType = "track";
                break;
            }
            var msgJson = JsonConvert.SerializeObject(setCaseTypeMsg);

            Debug.Log("Unity2DuMix 完成");
            // Zip ar
            string zipPath = DuMixGlobalStringDefs.BuildPath() + "ar.zip";

            DuMixZipUtility.Zip(buildPath, zipPath, delegate() {
                //DuMixARNetwork.Instance.sendString(msgJson);
                DuMixARNetwork.Instance.sendFile(zipPath);
            });
        }