private void DrawMesh(MeshRenderData data, BoxedValueStore <string> metadata) { var mesh = data.Mesh; device.SetVertexBuffer(mesh.VertexBuffer); device.Indices = mesh.IndexBuffer; var world = metadata.Get <Matrix>("world"); var view = metadata.Get <Matrix>("view"); var projection = metadata.Get <Matrix>("projection"); var worldView = metadata.Get <Matrix>("worldview"); var worldViewProjection = metadata.Get <Matrix>("worldviewprojection"); for (int i = 0; i < visibleInstances.Count; i++) { var instance = visibleInstances[i]; world.Value = instance.Instance.Transform; Matrix.Multiply(ref world.Value, ref view.Value, out worldView.Value); Matrix.Multiply(ref worldView.Value, ref projection.Value, out worldViewProjection.Value); foreach (var pass in data.Material.Begin(metadata)) { pass.Apply(); device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, mesh.VertexCount, 0, mesh.TriangleCount); #if PROFILE polysDrawnStat.Value += mesh.TriangleCount; drawsStat.Value++; #endif } } }
private void renderMesh(MeshRenderData data, Matrix world) { for (int i = 0; i < data.Materials.Length; i++) { var mat = data.Materials[i]; for (int j = 0; j < mat.Parts.Length; j++) { var part = mat.Parts[j]; var shader = mat.Shader; //shaders[i].ViewProjection = game.Camera.ViewProjection; shader.World = world * part.ObjectMatrix; shader.DrawPrimitives(delegate { game.GraphicsDevice.Vertices[0].SetSource(part.VertexBuffer, 0, TangentVertex.SizeInBytes); game.GraphicsDevice.Indices = part.IndexBuffer; game.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, part.VertexCount, 0, part.PrimitiveCount); } ); } } }
private MeshRenderData getRenderData(IMesh mesh) { MeshRenderData ret; if (renderDataDict.TryGetValue(mesh, out ret)) { return(ret); } ret = new MeshRenderData(mesh); renderDataDict[mesh] = ret; renderDatas.Add(ret); if (game != null) { initMeshRenderData(ret); } return(ret); }
private void initMeshRenderData(MeshRenderData data) { var materials = new List <MeshRenderMaterial>(); var parts = new Dictionary <MeshRenderMaterial, List <MeshCoreData.Part> >(); var coreData = data.Mesh.GetCoreData(); for (int i = 0; i < coreData.Parts.Count; i++) { var part = coreData.Parts[i]; var mat = materials.Find(o => o.Material.Equals(part.MeshMaterial)); if (mat == null) { mat = new MeshRenderMaterial(); mat.Material = part.MeshMaterial; materials.Add(mat); parts[mat] = new List <MeshCoreData.Part>(); } parts[mat].Add(part); } data.Materials = new MeshRenderMaterial[materials.Count]; for (int i = 0; i < materials.Count; i++) { var renderMat = materials[i]; data.Materials[i] = renderMat; var partList = parts[renderMat]; renderMat.Parts = new MeshRenderPart[partList.Count]; for (int j = 0; j < partList.Count; j++) { var part = partList[j]; var renderPart = new MeshRenderPart(); renderMat.Parts[j] = renderPart; renderPart.IndexBuffer = meshPartPool.GetIndexBuffer(part.MeshPart); renderPart.VertexBuffer = meshPartPool.GetVertexBuffer(part.MeshPart); renderPart.ObjectMatrix = part.ObjectMatrix; var geomData = part.MeshPart.GetGeometryData(); int vertCount = geomData.GetSourceVector3(MeshPartGeometryData.Semantic.Position).Length; renderPart.VertexCount = vertCount; renderPart.PrimitiveCount = vertCount / 3; } renderMat.Shader = baseShader.Clone(); if (renderMat.Material.DiffuseMap != null) { var material = new DefaultModelMaterialTextured(); material.DiffuseTexture = texturePool.LoadTexture(renderMat.Material.DiffuseMap); material.SetMaterialToShader(renderMat.Shader); } else { renderMat.Shader.DiffuseTexture = checkerTexture; renderMat.Shader.Technique = DefaultModelShader.TechniqueType.Textured; } } }