public AFrameNode Create(SceneElem el)
        {
            var node = new AFrameNode("a-scene");

            var aframe = ExportSettings.Instance.aframe;

            if (aframe.enablePerformanceStatistics)
            {
                node.AddAttribute("stats", "true");
            }

            // assets
            var assetsNode = new AFrameNode("a-assets");

            // export mesh
            foreach (var elem in sharedNodeTable.GetEnumerable <AbstractGeometryElem>())
            {
                // TODO 타입에 따라서 obj 굽는게 바뀔텐데
                var bufferGeom = elem as BufferGeometryElem;
                if (bufferGeom == null)
                {
                    continue;
                }

                var assetNode = new AFrameNode("a-asset-item");
                assetNode.AddAttribute("id", bufferGeom.CreateSafeMeshName("-obj"));
                string filepath = "./models/" + bufferGeom.CreateMeshFileName(".obj");
                assetNode.AddAttribute("src", filepath);
                assetsNode.AddChild(assetNode);

                var assetNode_mtl = new AFrameNode("a-asset-item");
                assetNode_mtl.AddAttribute("id", bufferGeom.CreateSafeMeshName("-mtl"));
                string filepath_mtl = "./models/" + bufferGeom.CreateMeshFileName(".mtl");
                assetNode_mtl.AddAttribute("src", filepath_mtl);
                assetsNode.AddChild(assetNode_mtl);
            }
            node.AddChild(assetsNode);

            var sky = ExportSettings.Instance.sky;

            if (sky.mode != SkySettings.SkyMode.None)
            {
                var skyNode = Create(sky);
                node.AddChild(skyNode);
            }

            WriteCommonAFrameNode(el, node);

            return(node);
        }
        public AFrameNode Create(PerspectiveCameraElem el)
        {
            var container = new AFrameNode("a-entity");

            WriteCommonAFrameNode(el, container);

            var cam = new AFrameNode("a-camera");

            cam.AddAttribute("far", new SimpleProperty <float>(el.Far));
            cam.AddAttribute("near", new SimpleProperty <float>(el.Near));

            var camsettings = ExportSettings.Instance.camera;

            cam.AddAttribute("look-controls-enabled", camsettings.lookControlsEnabled.ToString().ToLower());
            cam.AddAttribute("wasd-controls-enabled", camsettings.wasdControlsEnabled.ToString().ToLower());

            container.AddChild(cam);

            var cursorsettings = ExportSettings.Instance.cursor;

            if (cursorsettings.enabled)
            {
                var cursor = Create(cursorsettings);
                cam.AddChild(cursor);
            }
            return(container);
        }
Пример #3
0
        public AFrameNode Create(MeshElem el)
        {
            var node = new AFrameNode("a-entity");

            WriteCommonAFrameNode(el, node);

            AFrameNode geometryNode = null;
            IProperty  mtl          = MaterialFacade.Instance.GetMaterialProperty(el.Material);

            if (mtl == null)
            {
                mtl = new SimpleProperty <string>("side: double");
            }

            // TODO 타입 하드코딩해서 분기하는거 제거하기

            if (el.Geometry.Type != "BufferGeometry")
            {
                var v = new AFrameExportVisitor(sharedNodeTable);
                el.Geometry.Accept(v);
                geometryNode = v.Node;

                geometryNode.AddAttribute("material", mtl);
                node.AddChild(geometryNode);
            }
            else
            {
                var geom = el.Geometry as BufferGeometryElem;
                node.AddAttribute("obj-model", "obj: #" + geom.CreateSafeMeshName("-obj"));
                node.AddAttribute("material", mtl);
            }

            return(node);
        }
        void WriteCommonAFrameNode(Object3DElem el, AFrameNode node)
        {
            // http://math.stackexchange.com/questions/237369/given-this-transformation-matrix-how-do-i-decompose-it-into-translation-rotati
            var m   = el.Matrix;
            var pos = Vector3Property.MakePosition(new Vector3(m[12], m[13], m[14]));

            node.AddAttribute("position", pos);

            var sx    = new Vector3(m[0], m[1], m[2]).magnitude;
            var sy    = new Vector3(m[4], m[5], m[6]).magnitude;
            var sz    = new Vector3(m[8], m[9], m[10]).magnitude;
            var scale = Vector3Property.MakeScale(new Vector3(sx, sy, sz));

            node.AddAttribute("scale", scale);

            var forward = el.UnityMatrix.MultiplyVector(Vector3.forward);
            var upward  = el.UnityMatrix.MultiplyVector(Vector3.up);
            var q       = Quaternion.LookRotation(forward, upward);
            var rot     = Vector3Property.MakeRotation(q);

            node.AddAttribute("rotation", rot);

            node.AddAttribute("id", el.Name);
            if (el.HasTag)
            {
                node.AddAttribute("tag", el.Tag);
            }
            if (el.HasLayer)
            {
                node.AddAttribute("layer", el.Layer);
            }


            var visitor = new AFrameExportVisitor(sharedNodeTable);

            foreach (var child in el.Children)
            {
                child.Accept(visitor);
                node.AddChild(visitor.Node);
            }
        }
        public AFrameNode Create(MeshElem el)
        {
            var node = new AFrameNode("a-entity");

            WriteCommonAFrameNode(el, node);

            AFrameNode geometryNode = null;
            var        mtl          = MaterialFacade.Instance.CreateMaterial(el.Material);

            // TODO 타입 하드코딩해서 분기하는거 제거하기
            if (el.Geometry.Type != "BufferGeometry")
            {
                var v = new AFrameExportVisitor(sharedNodeTable);
                el.Geometry.Accept(v);
                geometryNode = v.Node;

                // v0.3.2
                var standard = mtl.Shader as StandardAFrameShader;
                var flat     = mtl.Shader as FlatAFrameShader;

                var props = new Dictionary <string, IProperty>();
                if (standard != null)
                {
                    var shader = standard;
                    props["shader"]    = new SimpleProperty <string>(shader.ShaderName);
                    props["color"]     = new ColorProperty(shader.Color, StandardAFrameShader.DefaultColor);
                    props["roughness"] = new SimpleProperty <float>(shader.Roughness, StandardAFrameShader.DefaultRoughness);
                    props["metalness"] = new SimpleProperty <float>(shader.Metalness, StandardAFrameShader.DefaultMetalness);
                    props["repeat"]    = new Vector2Property(shader.Repeat, StandardAFrameShader.DefaultRepeat);
                    props["src"]       = new SimpleProperty <string>(shader.Src, "");
                }

                if (flat != null)
                {
                    var shader = flat;
                    props["shader"] = new SimpleProperty <string>(shader.ShaderName);
                    props["color"]  = new ColorProperty(shader.Color, StandardAFrameShader.DefaultColor);
                    props["repeat"] = new Vector2Property(shader.Repeat, StandardAFrameShader.DefaultRepeat);
                    props["src"]    = new SimpleProperty <string>(shader.Src, "");
                }

                foreach (var kv in props)
                {
                    geometryNode.AddAttribute(kv.Key, kv.Value);
                }

                node.AddChild(geometryNode);
            }
            else
            {
                var geom = el.Geometry as BufferGeometryElem;
                var sb   = new StringBuilder();
                sb.Append("obj: ");

                sb.Append("#" + geom.CreateSafeMeshName("-obj"));
                sb.Append("; ");

                var exporter = new MtlExporter();
                if (!exporter.IsBlank(mtl))
                {
                    sb.Append("mtl: ");
                    sb.Append("#" + geom.CreateSafeMeshName("-mtl"));
                }

                node.AddAttribute("obj-model", sb.ToString());
            }

            return(node);
        }