Ejemplo n.º 1
0
            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
                    }
                }
            }
Ejemplo n.º 2
0
        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);
                    }
                                          );
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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;
                }
            }
        }