Пример #1
0
        public void AddPath(string name, Vertex[] path)
        {
            this.path = new List<Vector3>();
            for (int q = 0; q < path.Length; q++)
            {
                if (q < path.Length - 1 && path[q].Position == path[q + 1].Position)
                    this.path.Add(path[q].Position);
            }

            Paths.Add(name, this);
        }
Пример #2
0
Файл: VBO.cs Проект: bosoni/csat
        public void DataToVBO(Vertex[] vertices, ushort[] indices, VertexMode mode)
        {
            if (numOfIndices > 0) Dispose();
            int size;
            vertexFlags = mode;
            numOfIndices = indices.Length;
            Vertex.Size = BlittableValueType.StrideOf(vertices);

            GL.GenBuffers(1, out vertexID);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vertexID);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * Vertex.Size), vertices, usage);
            GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size);
            if (vertices.Length * BlittableValueType.StrideOf(vertices) != size) Log.Error("DataToVBO: Vertex data not uploaded correctly");

            GL.GenBuffers(1, out indexID);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexID);
            GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices.Length * sizeof(ushort)), indices, usage);
            GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out size);
            if (indices.Length * sizeof(short) != size) throw new ApplicationException("DataToVBO: Element data not uploaded correctly");

            Shader = GLSLShader.Load();

            if (Shader != null)
            {
                if (Settings.UseGL3)
                {
                    GL.GenVertexArrays(1, out vaoID);
                    GL.BindVertexArray(vaoID);
                }
                GL.BindBuffer(BufferTarget.ArrayBuffer, vertexID);
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexID);
                Shader.SetAttributes();
                if (Settings.UseGL3) GL.BindVertexArray(0);
            }

            GLExt.CheckGLError("DataToVBO");
        }
Пример #3
0
Файл: VBO.cs Проект: bosoni/csat
 public void Update(Vertex[] verts)
 {
     GL.BindBuffer(BufferTarget.ArrayBuffer, vertexID);
     GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)0, (IntPtr)(verts.Length * Vertex.Size), verts);
 }
Пример #4
0
        /// <summary>
        /// Prepare mesh for rendering
        /// </summary>
        void PrepareMesh()
        {
            int i, j, k;
            meshes.Clear();

            // Calculate the final Position ingame Position of all the model vertexes
            for (k = 0; k < numMesh; k++)
            {
                numOfFaces = model[k].numTris;
                VertexBuffer = new Vertex[numOfFaces * 3];

                for (i = 0; i < model[k].numVert; i++)
                {
                    Vector3 finalVertex = new Vector3(0, 0, 0);
                    for (j = 0; j < model[k].verts[i].countw; j++)
                    {
                        MD5Weight wt = model[k].weights[model[k].verts[i].startw + j];
                        MD5Joint joint = skeleton[wt.joint];

                        Vector3 wv = QuaternionExt.RotatePoint(joint.orient, wt.pos);
                        finalVertex.X += (joint.pos.X + wv.X) * wt.bias;
                        finalVertex.Y += (joint.pos.Y + wv.Y) * wt.bias;
                        finalVertex.Z += (joint.pos.Z + wv.Z) * wt.bias;
                    }
                    finalVert[i] = finalVertex;
                }

                int count = 0;
                // Organize the final vertexes acording to the meshes triangles
                for (i = 0; i < model[k].numTris; i++)
                {
                    VertexBuffer[count] = new Vertex(finalVert[(int)model[k].faces[i][0]], normals[(int)model[k].faces[i][0]], model[k].verts[(int)model[k].faces[i][0]].uv);
                    VertexBuffer[count + 1] = new Vertex(finalVert[(int)model[k].faces[i][1]], normals[(int)model[k].faces[i][1]], model[k].verts[(int)model[k].faces[i][1]].uv);
                    VertexBuffer[count + 2] = new Vertex(finalVert[(int)model[k].faces[i][2]], normals[(int)model[k].faces[i][2]], model[k].verts[(int)model[k].faces[i][2]].uv);

                    count += 3;
                }
                meshes.Add(VertexBuffer);

                if (model[k].vbo != null) model[k].vbo.Update(VertexBuffer);
            }
        }
Пример #5
0
 void processGeometry(XmlElement XMLNode, bool path)
 {
     int numOfVerts = (int)XML.GetAttribFloat(XMLNode, "vertexcount");
     VertexBuffer = new Vertex[numOfVerts];
     XmlElement pElement = (XmlElement)XMLNode.SelectSingleNode("vertexbuffer");
     pElement = (XmlElement)pElement.SelectSingleNode("vertex");
     for (int q = 0; q < numOfVerts; q++)
     {
         processVertex(pElement, q);
         pElement = (XmlElement)pElement.NextSibling;
     }
 }