Пример #1
0
        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();
        }
Пример #2
0
        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();
        }
Пример #3
0
        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();
        }
Пример #4
0
        /// <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);
        }