/// <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); } } }
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); }
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); } }
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); }
public void Visit(MeshElem el) { Node = factory.Create(el); }
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); }