/// <summary> /// Adds source data. /// </summary> /// <param name="mesh">Parent mesh element.</param> /// <param name="srcID">ID of new source.</param> /// <param name="paramNames">Parameters.</param> /// <param name="values">Values.</param> private void AddSource(ref _daeElement mesh, string srcID, string paramNames, ref List <float> values) { _daeElement src = mesh.add("source"); src.setAttribute("id", srcID); _daeElement fa = src.add("float_array"); fa.setAttribute("id", src.getAttribute("id") + "-array"); fa.setAttribute("count", values.Count.ToString()); fa.setCharData(FloatArrayToString(ref values)); _daeElement acc = src.add("technique_common accessor"); acc.setAttribute("source", MakeUriRef(fa.getAttribute("id"))); string[] _params = paramNames.Split(' '); acc.setAttribute("stride", _params.Length.ToString()); acc.setAttribute("count", (values.Count / _params.Length).ToString()); foreach (string param in _params) { _daeElement p = acc.add("param"); p.setAttribute("name", param); p.setAttribute("type", "float"); } }
/// <summary> /// Adds geometry elements. /// </summary> /// <param name="root">Root element.</param> /// <param name="dfMesh">DFMesh.</param> private void AddGeometry(ref _daeElement root, ref DFMesh dfMesh) { _daeElement geomLib = root.add("library_geometries"); _daeElement geom = geomLib.add("geometry"); string geomId = "model" + dfMesh.ObjectId.ToString(); geom.setAttribute("id", geomId); _daeElement mesh = geom.add("mesh"); // Get source vertex data List <float> posArray = new List <float>(dfMesh.TotalVertices * 3); List <float> normalArray = new List <float>(dfMesh.TotalVertices * 3); List <float> uvArray = new List <float>(dfMesh.TotalVertices * 2); foreach (var subMesh in dfMesh.SubMeshes) { // Get texture dimensions for this submesh string archivePath = Path.Combine(arena2Path, TextureFile.IndexToFileName(subMesh.TextureArchive)); System.Drawing.Size sz = TextureFile.QuickSize(archivePath, subMesh.TextureRecord); // Collect vertex information for every plane in this submesh foreach (var plane in subMesh.Planes) { foreach (var point in plane.Points) { // Add position data posArray.Add(point.X); posArray.Add(-point.Y); posArray.Add(-point.Z); // Add normal data normalArray.Add(point.NX); normalArray.Add(-point.NY); normalArray.Add(-point.NZ); // Add UV data uvArray.Add(point.U / (float)sz.Width); uvArray.Add(-(point.V / (float)sz.Height)); } } } // Add positions, normals, and texture coordinates AddSource(ref mesh, geomId + "-positions", "X Y Z", ref posArray); AddSource(ref mesh, geomId + "-normals", "X Y Z", ref normalArray); AddSource(ref mesh, geomId + "-uv", "S T", ref uvArray); // Add <vertices> element _daeElement vertices = mesh.add("vertices"); vertices.setAttribute("id", geomId + "-vertices"); _daeElement verticesInput = vertices.add("input"); verticesInput.setAttribute("semantic", "POSITION"); verticesInput.setAttribute("source", MakeUriRef(geomId + "-positions")); // Add triangle indices for each submesh uint vertexCount = 0; foreach (var subMesh in dfMesh.SubMeshes) { // Loop through all planes in this submesh List <uint> indexArray = new List <uint>(subMesh.TotalTriangles * (3 * 3)); foreach (var plane in subMesh.Planes) { // Every DFPlane is a triangle fan radiating from point 0 uint sharedPoint = vertexCount++; // Index remaining points. There are (plane.Points.Length - 2) triangles in every plane for (int tri = 0; tri < plane.Points.Length - 2; tri++) { // Position, Normal, UV index for shared point indexArray.Add(sharedPoint); indexArray.Add(sharedPoint); indexArray.Add(sharedPoint); // Position, Normal, UV index for vertexCount indexArray.Add(vertexCount); indexArray.Add(vertexCount); indexArray.Add(vertexCount); // Position, Normal, UV index for vertexCount + 1 indexArray.Add(vertexCount + 1); indexArray.Add(vertexCount + 1); indexArray.Add(vertexCount + 1); // Increment vertexCount to next point in fan vertexCount++; } // Increment vertexCount to start of next fan in vertex buffer vertexCount++; } // Add <triangle> string materialName = MakeMaterialName(subMesh.TextureArchive, subMesh.TextureRecord); _daeElement triangles = mesh.add("triangles"); triangles.setAttribute("count", (indexArray.Count / (3 * 3)).ToString()); triangles.setAttribute("material", materialName + "-material"); AddInput(ref triangles, "VERTEX", geomId + "-vertices", 0); AddInput(ref triangles, "NORMAL", geomId + "-normals", 1); AddInput(ref triangles, "TEXCOORD", geomId + "-uv", 2); // Add <p> _daeElement p = triangles.add("p"); p.setCharData(UIntArrayToString(ref indexArray)); } }