Example #1
0
        /// <summary>
        /// Method to load Native Direct X Meshes
        /// </summary>
        private void LoadDirectXMesh(DrawArgs drawArgs)
        {
            m_meshElems = new MeshElem[1];

            ExtendedMaterial[] materials;
            GraphicsStream     adj;

            m_meshElems[0]      = new MeshElem();
            m_meshElems[0].mesh = Mesh.FromFile(meshFileName, MeshFlags.Managed, drawArgs.device, out adj, out materials);

            // Extract the material properties and texture names.
            m_meshElems[0].meshTextures  = new Texture[materials.Length];
            m_meshElems[0].meshMaterials = new Material[materials.Length];
            string xFilePath = Path.GetDirectoryName(meshFileName);

            for (int i = 0; i < materials.Length; i++)
            {
                m_meshElems[0].meshMaterials[i] = materials[i].Material3D;
                // Set the ambient color for the material (D3DX does not do this)
                m_meshElems[0].meshMaterials[i].Ambient = m_meshElems[0].meshMaterials[i].Diffuse;

                // Create the texture.
                if (materials[i].TextureFilename != null)
                {
                    string textureFilePath = Path.Combine(xFilePath, materials[i].TextureFilename);
                    m_meshElems[0].meshTextures[i] = TextureLoader.FromFile(drawArgs.device, textureFilePath);
                }
            }
        }
Example #2
0
        MeshElem RegisterToThreeScene(RenderNode n)
        {
            var hasLightmap = (n.Value.lightmapIndex >= 0);
            var geoKey      = n.Mesh.InstanceId;
            var mtlKey      = n.Material.InstanceId;

            if (hasLightmap)
            {
                geoKey = ConvertKeyForBufferGeometryElem(n.Value);
                mtlKey = ConvertKeyForMaterialELem(n.Value);
            }

            var geometryNode = root.SharedNodeTable.Get <AbstractGeometryElem>(geoKey);
            var materialNode = root.SharedNodeTable.Get <MaterialElem>(mtlKey);

            Debug.Assert(geometryNode != null);
            Debug.Assert(materialNode != null);

            var meshNode = new MeshElem(n)
            {
                Geometry = geometryNode,
                Material = materialNode,
            };
            var parent = objNodeTable[n.CurrentObject.GetInstanceID().ToString()];

            parent.AddChild(meshNode);
            return(meshNode);
        }
Example #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);
        }
 public void Visit(MeshElem el)
 {
     using (var scope = new JsonScopeObjectWriter(writer)) {
         WriteCommonObjectNode(scope, el);
         scope.WriteKeyValue("geometry", el.Geometry.Uuid);
         scope.WriteKeyValue("material", el.Material.Uuid);
     }
 }
Example #5
0
        MeshElem RegisterToThreeScene(RenderNode n)
        {
            var geometryNode = root.SharedNodeTable.Get <BufferGeometryElem>(n.Mesh.InstanceId);
            var materialNode = root.SharedNodeTable.Get <MaterialElem>(n.Material.InstanceId);

            Debug.Assert(geometryNode != null);
            Debug.Assert(materialNode != null);

            var meshNode = new MeshElem(n)
            {
                Geometry = geometryNode,
                Material = materialNode,
            };
            var parent = objNodeTable[n.CurrentObject.GetInstanceID()];

            parent.AddChild(meshNode);
            return(meshNode);
        }
Example #6
0
 public void Visit(MeshElem el)
 {
     Node = factory.Create(el);
 }
Example #7
0
        private void LoadColladaMesh(DrawArgs drawArgs)
        {
            XmlDocument colladaDoc = new XmlDocument();

            colladaDoc.Load(meshFileName);
            XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(colladaDoc.NameTable);

            xmlnsManager.AddNamespace("c", colladaDoc.GetElementsByTagName("COLLADA")[0].NamespaceURI);

            int meshCount =
                colladaDoc.SelectNodes("//c:COLLADA/c:library_geometries/c:geometry/c:mesh",
                                       xmlnsManager).Count;

            if (meshCount == 0)
            {
                return;
            }
            if (m_meshElems != null)
            {
                foreach (MeshElem me in m_meshElems)
                {
                    if (me.mesh != null)
                    {
                        me.mesh.Dispose();
                    }
                    if (me.meshTextures != null)
                    {
                        foreach (Texture t in me.meshTextures)
                        {
                            if (t != null)
                            {
                                t.Dispose();
                            }
                        }
                    }
                }
            }
            m_meshElems = new MeshElem[meshCount];

            for (int j = 0; j < meshCount; j++)
            {
                XmlNode meshNode = colladaDoc.SelectNodes(
                    "//c:COLLADA/c:library_geometries/c:geometry/c:mesh",
                    xmlnsManager)[j];

                Matrix transform   = Matrix.Identity;
                string sGeometryId = meshNode.SelectNodes("../@id", xmlnsManager)[0].Value;
                if (colladaDoc.SelectNodes("//c:COLLADA/c:library_visual_scenes/c:visual_scene/c:node" +
                                           "[c:instance_geometry/@url='#" + sGeometryId + "']", xmlnsManager).Count == 1)
                {
                    XmlNode sceneNode =
                        colladaDoc.SelectNodes("//c:COLLADA/c:library_visual_scenes/c:visual_scene/c:node" +
                                               "[c:instance_geometry/@url='#" + sGeometryId + "']", xmlnsManager)[0];

                    foreach (XmlNode childNode in sceneNode.ChildNodes)
                    {
                        Matrix m;
                        if (childNode.Name == "translate")
                        {
                            string[] translateParams = childNode.InnerText.Trim().Split(' ');
                            m = Matrix.Translation(new Vector3(
                                                       System.Decimal.ToSingle(System.Decimal.Parse(
                                                                                   translateParams[0],
                                                                                   System.Globalization.NumberStyles.Any)),
                                                       System.Decimal.ToSingle(System.Decimal.Parse(
                                                                                   translateParams[1],
                                                                                   System.Globalization.NumberStyles.Any)),
                                                       System.Decimal.ToSingle(System.Decimal.Parse(
                                                                                   translateParams[2],
                                                                                   System.Globalization.NumberStyles.Any))));
                        }
                        else if (childNode.Name == "rotate")
                        {
                            string[] rotateParams = childNode.InnerText.Trim().Split(' ');
                            m = Matrix.RotationAxis(
                                new Vector3(
                                    System.Decimal.ToSingle(System.Decimal.Parse(
                                                                rotateParams[0],
                                                                System.Globalization.NumberStyles.Any)),
                                    System.Decimal.ToSingle(System.Decimal.Parse(
                                                                rotateParams[1],
                                                                System.Globalization.NumberStyles.Any)),
                                    System.Decimal.ToSingle(System.Decimal.Parse(
                                                                rotateParams[2],
                                                                System.Globalization.NumberStyles.Any))),
                                (float)Math.PI * System.Decimal.ToSingle(System.Decimal.Parse(
                                                                             rotateParams[3],
                                                                             System.Globalization.NumberStyles.Any)) / 180.0f);
                        }
                        else if (childNode.Name == "scale")
                        {
                            string[] scaleParams = childNode.InnerText.Trim().Split(' ');
                            m = Matrix.Scaling(new Vector3(
                                                   System.Decimal.ToSingle(System.Decimal.Parse(
                                                                               scaleParams[0],
                                                                               System.Globalization.NumberStyles.Any)),
                                                   System.Decimal.ToSingle(System.Decimal.Parse(
                                                                               scaleParams[1],
                                                                               System.Globalization.NumberStyles.Any)),
                                                   System.Decimal.ToSingle(System.Decimal.Parse(
                                                                               scaleParams[2],
                                                                               System.Globalization.NumberStyles.Any))));
                        }
                        else
                        {
                            continue;
                        }
                        transform = Matrix.Multiply(m, transform);
                    }
                }



                string sVertSource = meshNode.SelectNodes(
                    "c:vertices/c:input[@semantic='POSITION']/@source",
                    xmlnsManager)[0].Value;
                int iVertCount = System.Decimal.ToInt32(System.Decimal.Parse(
                                                            meshNode.SelectNodes(
                                                                "c:source[@id='" +
                                                                sVertSource.Substring(1) +
                                                                "']/c:float_array/@count", xmlnsManager)[0].Value)) / 3;
                string[] vertCoords = meshNode.SelectNodes(
                    "c:source[@id='" +
                    sVertSource.Substring(1) +
                    "']/c:float_array", xmlnsManager)[0].InnerText.Trim().Split(' ');
                CustomVertex.PositionNormalTextured[] vertices =
                    new CustomVertex.PositionNormalTextured[iVertCount];
                Vector3 v = new Vector3();
                for (int i = 0; i < iVertCount; i++)
                {
                    v.X = System.Decimal.ToSingle(System.Decimal.Parse(vertCoords[i * 3 + 0],
                                                                       System.Globalization.NumberStyles.Any));
                    v.Y = System.Decimal.ToSingle(System.Decimal.Parse(vertCoords[i * 3 + 1],
                                                                       System.Globalization.NumberStyles.Any));
                    v.Z = System.Decimal.ToSingle(System.Decimal.Parse(vertCoords[i * 3 + 2],
                                                                       System.Globalization.NumberStyles.Any));
                    v.TransformCoordinate(transform);

                    vertices[i] = new CustomVertex.PositionNormalTextured(
                        v.X, v.Y, v.Z, 0.0f, 0.0f, 0.0f, v.X, v.Y);
                }
                int iFaceCount = System.Decimal.ToInt32(System.Decimal.Parse(
                                                            meshNode.SelectNodes(
                                                                "c:triangles/@count",
                                                                xmlnsManager)[0].Value));

                string[] triVertIndicesStr = meshNode.SelectNodes(
                    "c:triangles/c:p",
                    xmlnsManager)[0].InnerText.Trim().Split(' ');;
                short[] triVertIndices = new short[triVertIndicesStr.Length];
                for (int i = 0; i < triVertIndicesStr.Length; i++)
                {
                    triVertIndices[i] = System.Decimal.ToInt16(System.Decimal.Parse(triVertIndicesStr[i]));
                }

                m_meshElems[j]      = new MeshElem();
                m_meshElems[j].mesh = new Mesh(iFaceCount, iVertCount, 0, CustomVertex.PositionNormalTextured.Format, drawArgs.device);
                m_meshElems[j].mesh.SetVertexBufferData(vertices, LockFlags.None);
                m_meshElems[j].mesh.SetIndexBufferData(triVertIndices, LockFlags.None);

                int[] adjacency = new int[m_meshElems[j].mesh.NumberFaces * 3];
                m_meshElems[j].mesh.GenerateAdjacency(0.000000001F, adjacency);
                m_meshElems[j].mesh.OptimizeInPlace(MeshFlags.OptimizeVertexCache, adjacency);
                m_meshElems[j].mesh.ComputeNormals();

                int numSubSets = m_meshElems[j].mesh.GetAttributeTable().Length;
                m_meshElems[j].meshTextures  = new Texture[numSubSets];
                m_meshElems[j].meshMaterials = new Material[numSubSets];

                for (int i = 0; i < numSubSets; i++)
                {
                    m_meshElems[j].meshMaterials[i].Ambient  = Color.FromArgb(255, 255, 43, 48);
                    m_meshElems[j].meshMaterials[i].Diffuse  = Color.FromArgb(255, 155, 113, 148);
                    m_meshElems[j].meshMaterials[i].Emissive = Color.FromArgb(255, 255, 143, 98);
                    m_meshElems[j].meshMaterials[i].Specular = Color.FromArgb(255, 155, 243, 48);
                }
            }
        }
        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);
        }