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); }