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); }
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"); }
public void Update(Vertex[] verts) { GL.BindBuffer(BufferTarget.ArrayBuffer, vertexID); GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)0, (IntPtr)(verts.Length * Vertex.Size), verts); }
/// <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); } }
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; } }