Exemplo n.º 1
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);
        }