Esempio n. 1
0
        /// <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");
            }
        }
Esempio n. 2
0
        /// <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));
            }
        }