public override void render(float elapsedTime) { Device d3dDevice = GuiController.Instance.D3dDevice; time += elapsedTime; if (time > 1f) { Mesh d3dMesh = new Mesh(boxMesh.NumberTriangles, boxMesh.NumberVertices, MeshFlags.Managed, TgcSceneLoader.VertexColorVertexElements, d3dDevice); TgcSceneLoader.VertexColorVertex[] origVert = (TgcSceneLoader.VertexColorVertex[])boxMesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.ReadOnly, boxMesh.D3dMesh.NumberVertices); boxMesh.D3dMesh.UnlockVertexBuffer(); TgcSceneLoader.VertexColorVertex[] newVert = (TgcSceneLoader.VertexColorVertex[])d3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.None, d3dMesh.NumberVertices); for (int i = 0; i < origVert.Length; i++) { newVert[i] = origVert[i]; } //d3dMesh.SetVertexBufferData(newVert, LockFlags.None); d3dMesh.UnlockVertexBuffer(); boxMesh.changeD3dMesh(d3dMesh); time = 0; } boxMesh.render(); }
public override void Render() { PreRender(); time += ElapsedTime; if (time > 1f) { var d3dMesh = new Mesh(boxMesh.NumberTriangles, boxMesh.NumberVertices, MeshFlags.Managed, TgcSceneLoader.VertexColorVertexElements, D3DDevice.Instance.Device); var origVert = (TgcSceneLoader.VertexColorVertex[])boxMesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.ReadOnly, boxMesh.D3dMesh.NumberVertices); boxMesh.D3dMesh.UnlockVertexBuffer(); var newVert = (TgcSceneLoader.VertexColorVertex[])d3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.None, d3dMesh.NumberVertices); for (var i = 0; i < origVert.Length; i++) { newVert[i] = origVert[i]; } d3dMesh.UnlockVertexBuffer(); boxMesh.changeD3dMesh(d3dMesh); time = 0; } boxMesh.render(); PostRender(); }
public override void Render() { PreRender(); DrawText.drawText("Cantidad de elementos liberados: " + disposed, 5, 20, Color.Red); //Renderisamos todo hasta que pase cierto tiempo y ahi liberamos todos los recursos. if (time >= 0f && time < 30f) { var d3dMesh = new Mesh(boxMesh.NumberTriangles, boxMesh.NumberVertices, MeshFlags.Managed, TgcSceneLoader.VertexColorVertexElements, D3DDevice.Instance.Device); var origVert = (TgcSceneLoader.VertexColorVertex[])boxMesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.ReadOnly, boxMesh.D3dMesh.NumberVertices); boxMesh.D3dMesh.UnlockVertexBuffer(); var newVert = (TgcSceneLoader.VertexColorVertex[])d3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.None, d3dMesh.NumberVertices); for (var i = 0; i < origVert.Length; i++) { newVert[i] = origVert[i]; newVert[i].Position.Y += time; } d3dMesh.UnlockVertexBuffer(); boxMesh.changeD3dMesh(d3dMesh); //Render de todas las palmeras. foreach (var m in meshes) { m.Render(); } //Render de una esena. scene1.RenderAll(); //Render de la caja. boxMesh.Render(); time += ElapsedTime; } else { //ATENCION ESTO QUE SIGUE es solo para el ejemplo este, no es buena practica invocar al dispose completo. //En su lugar se puede invocar caso por caso segun las necidades. //Hacemos el dispose 1 vez sola. if (time != -1) { time = -1; Dispose(); } } PostRender(); }
/// <summary> /// Actualizar vertexBuffer de mesh original en base a la estructura interna del editablePoly /// </summary> private void updateMesh() { //Cambio la estructura interna del mesh, crear uno nuevo if (recreateMesh) { //Crear nuevo mesh con una cantidad distinta de triangulos y vertices Mesh newD3dMesh = null; var triCount = IndexBuffer.Length / 3; var vertCount = IndexBuffer.Length; var w = 0; var delTriIdx = 0; switch (mesh.RenderType) { case TgcMesh.MeshRenderType.VERTEX_COLOR: newD3dMesh = new Mesh(triCount, vertCount, MeshFlags.Managed, TgcSceneLoader.VertexColorVertexElements, D3DDevice.Instance.Device); var origVert1 = (TgcSceneLoader.VertexColorVertex[])mesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.ReadOnly, mesh.D3dMesh.NumberVertices); mesh.D3dMesh.UnlockVertexBuffer(); var newVert1 = (TgcSceneLoader.VertexColorVertex[])newD3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.None, newD3dMesh.NumberVertices); for (var i = 0; i < origVert1.Length; i += 3) { if (delTriIdx < deletedTriangles.Count && i == deletedTriangles[delTriIdx]) { delTriIdx++; } else { newVert1[w++] = origVert1[i]; newVert1[w++] = origVert1[i + 1]; newVert1[w++] = origVert1[i + 2]; } } mesh.D3dMesh.UnlockVertexBuffer(); newD3dMesh.SetVertexBufferData(newVert1, LockFlags.None); newD3dMesh.UnlockVertexBuffer(); break; case TgcMesh.MeshRenderType.DIFFUSE_MAP: newD3dMesh = new Mesh(triCount, vertCount, MeshFlags.Managed, TgcSceneLoader.DiffuseMapVertexElements, D3DDevice.Instance.Device); var origVert2 = (TgcSceneLoader.DiffuseMapVertex[])mesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.DiffuseMapVertex), LockFlags.ReadOnly, mesh.D3dMesh.NumberVertices); mesh.D3dMesh.UnlockVertexBuffer(); var newVert2 = (TgcSceneLoader.DiffuseMapVertex[])newD3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.DiffuseMapVertex), LockFlags.None, newD3dMesh.NumberVertices); for (var i = 0; i < origVert2.Length; i += 3) { if (delTriIdx < deletedTriangles.Count && i == deletedTriangles[delTriIdx]) { delTriIdx++; } else { newVert2[w++] = origVert2[i]; newVert2[w++] = origVert2[i + 1]; newVert2[w++] = origVert2[i + 2]; } } newD3dMesh.SetVertexBufferData(newVert2, LockFlags.None); newD3dMesh.UnlockVertexBuffer(); break; case TgcMesh.MeshRenderType.DIFFUSE_MAP_AND_LIGHTMAP: newD3dMesh = new Mesh(triCount, vertCount, MeshFlags.Managed, TgcSceneLoader.DiffuseMapAndLightmapVertexElements, D3DDevice.Instance.Device); var origVert3 = (TgcSceneLoader.DiffuseMapAndLightmapVertex[])mesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.DiffuseMapAndLightmapVertex), LockFlags.ReadOnly, mesh.D3dMesh.NumberVertices); mesh.D3dMesh.UnlockVertexBuffer(); var newVert3 = (TgcSceneLoader.DiffuseMapAndLightmapVertex[])newD3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.DiffuseMapAndLightmapVertex), LockFlags.None, newD3dMesh.NumberVertices); for (var i = 0; i < origVert3.Length; i += 3) { if (delTriIdx < deletedTriangles.Count && i == deletedTriangles[delTriIdx]) { delTriIdx++; } else { newVert3[w++] = origVert3[i]; newVert3[w++] = origVert3[i + 1]; newVert3[w++] = origVert3[i + 2]; } } mesh.D3dMesh.UnlockVertexBuffer(); newD3dMesh.SetVertexBufferData(newVert3, LockFlags.None); newD3dMesh.UnlockVertexBuffer(); break; } //Cambiar mesh mesh.changeD3dMesh(newD3dMesh); deletedTriangles.Clear(); } //Aplicar movimiento de vertices for (var i = 0; i < Vertices.Count; i++) { Vertices[i].position += Vertices[i].movement; Vertices[i].movement = TGCVector3.Empty; } //Actualizar vertexBuffer using (var vb = mesh.D3dMesh.VertexBuffer) { switch (mesh.RenderType) { case TgcMesh.MeshRenderType.VERTEX_COLOR: var verts1 = (TgcSceneLoader.VertexColorVertex[])mesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.VertexColorVertex), LockFlags.None, mesh.D3dMesh.NumberVertices); for (var i = 0; i < verts1.Length; i++) { verts1[i].Position = Vertices[IndexBuffer[i]].position; } mesh.D3dMesh.SetVertexBufferData(verts1, LockFlags.None); mesh.D3dMesh.UnlockVertexBuffer(); break; case TgcMesh.MeshRenderType.DIFFUSE_MAP: var verts2 = (TgcSceneLoader.DiffuseMapVertex[])mesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.DiffuseMapVertex), LockFlags.ReadOnly, mesh.D3dMesh.NumberVertices); for (var i = 0; i < verts2.Length; i++) { verts2[i].Position = Vertices[IndexBuffer[i]].position; } mesh.D3dMesh.SetVertexBufferData(verts2, LockFlags.None); mesh.D3dMesh.UnlockVertexBuffer(); break; case TgcMesh.MeshRenderType.DIFFUSE_MAP_AND_LIGHTMAP: var verts3 = (TgcSceneLoader.DiffuseMapAndLightmapVertex[])mesh.D3dMesh.LockVertexBuffer( typeof(TgcSceneLoader.DiffuseMapAndLightmapVertex), LockFlags.ReadOnly, mesh.D3dMesh.NumberVertices); for (var i = 0; i < verts3.Length; i++) { verts3[i].Position = Vertices[IndexBuffer[i]].position; } mesh.D3dMesh.SetVertexBufferData(verts3, LockFlags.None); mesh.D3dMesh.UnlockVertexBuffer(); break; } } //Actualizar indexBuffer (en forma secuencial) using (var ib = mesh.D3dMesh.IndexBuffer) { var seqIndexBuffer = new short[IndexBuffer.Length]; for (var i = 0; i < seqIndexBuffer.Length; i++) { seqIndexBuffer[i] = (short)i; } ib.SetData(seqIndexBuffer, 0, LockFlags.None); } //Actualizar attributeBuffer var attributeBuffer = mesh.D3dMesh.LockAttributeBufferArray(LockFlags.None); foreach (var p in Polygons) { //Setear en cada triangulo el material ID del poligono foreach (var idx in p.vbTriangles) { var triIdx = idx / 3; attributeBuffer[triIdx] = p.matId; } } mesh.D3dMesh.UnlockAttributeBuffer(attributeBuffer); }