예제 #1
0
 public void DepthPrepass(RenderState rstate, VMeshData data, ushort startVertex, Matrix4 world, MaterialAnimCollection mc)
 {
     if (Material == null)
     {
         return;
     }
     if (Material.Render.IsTransparent)
     {
         return;
     }
     if (lastmc != mc)
     {
         if (mc != null)
         {
             mc.Anims.TryGetValue(Material.Name, out ma);
             lastmc = mc;
         }
         else
         {
             ma = null;
         }
     }
     Material.Render.MaterialAnim = ma;
     Material.Render.World        = world;
     Material.Render.ApplyDepthPrepass(rstate);
     data.VertexBuffer.Draw(PrimitiveTypes.TriangleList, startVertex + StartVertex, TriangleStart, primitiveCount);
 }
예제 #2
0
        public void DrawBuffer(CommandBuffer buffer, VMeshData data, int vertexOffset, ushort startVertex, int startIndex, Matrix4 world, ref Lighting light, MaterialAnimCollection mc, Material overrideMat = null)
        {
            if (MaterialCrc == 0)
            {
                return;
            }

            var mat = Material;

            if (mat == null)
            {
                mat = defaultMaterial;
            }
            if (overrideMat != null)
            {
                mat = overrideMat;
            }
            if (lastmc != mc)
            {
                if (mc != null)
                {
                    mc.Anims.TryGetValue(mat.Name, out ma);
                    lastmc = mc;
                }
                else
                {
                    ma = null;
                }
            }
            float z = 0;

            if (mat.Render.IsTransparent)
            {
                z = RenderHelpers.GetZ(world, mat.Render.Camera.Position, CalculateAvg(data, startVertex));
            }

            buffer.AddCommand(
                mat.Render,
                ma,
                world,
                light,
                data.VertexBuffer,
                PrimitiveTypes.TriangleList,
                startVertex + vertexOffset + StartVertex,
                startIndex + TriangleStart,
                primitiveCount,
                SortLayers.OBJECT,
                z
                );
        }
예제 #3
0
 public void Draw(RenderState rstate, VertexBuffer buff, ushort startVertex, Matrix4 world, Lighting light, MaterialAnimCollection mc)
 {
     if (lastmc != mc)
     {
         if (mc != null)
         {
             mc.Anims.TryGetValue(Material.Name, out ma);
             lastmc = mc;
         }
         else
         {
             ma = null;
         }
     }
     Material.Render.MaterialAnim = ma;
     Material.Render.World        = world;
     Material.Render.Use(rstate, buff.VertexType, light);
     buff.Draw(PrimitiveTypes.TriangleList, startVertex + StartVertex, TriangleStart, primitiveCount);
 }
예제 #4
0
        public void DepthPrepass(RenderState rstate, VMeshData data, int startVertex, int startIndex, Matrix4 world, MaterialAnimCollection mc)
        {
            if (MaterialCrc == 0)
            {
                return;
            }

            var m = Material;

            if (m == null)
            {
                m = materialLibrary.FindMaterial(0);
            }
            if (m == null)
            {
                return;
            }
            if (m.Render.IsTransparent)
            {
                return;
            }
            if (m.Render.DoubleSided)
            {
                return; //TODO: Fix depth prepass for double-sided
            }
            if (lastmc != mc)
            {
                if (mc != null)
                {
                    mc.Anims.TryGetValue(m.Name, out ma);
                    lastmc = mc;
                }
                else
                {
                    ma = null;
                }
            }
            m.Render.MaterialAnim = ma;
            m.Render.World        = world;
            m.Render.ApplyDepthPrepass(rstate);
            data.VertexBuffer.Draw(PrimitiveTypes.TriangleList, startVertex + StartVertex, startIndex + TriangleStart, primitiveCount);
        }
예제 #5
0
 public MaterialAnim GetMaterialAnim(MaterialAnimCollection mc)
 {
     if (mc == null)
     {
         return(null);
     }
     if (cached == null || !cached.Loaded)
     {
         return(null);
     }
     if (cached == cachedAnimMat && cachedAnim != null)
     {
         return(cachedAnim);
     }
     if (mc.Anims.TryGetValue(cached.Name, out cachedAnim))
     {
         cachedAnimMat = cached;
         return(cachedAnim);
     }
     return(null);
 }
예제 #6
0
        public void DrawBuffer(CommandBuffer buffer, VMeshData data, ushort startVertex, Matrix4 world, Lighting light, MaterialAnimCollection mc)
        {
            if (Material == null)
            {
                return;
            }
            if (lastmc != mc)
            {
                if (mc != null)
                {
                    mc.Anims.TryGetValue(Material.Name, out ma);
                    lastmc = mc;
                }
                else
                {
                    ma = null;
                }
            }
            float z = 0;

            if (Material.Render.IsTransparent)
            {
                z = RenderHelpers.GetZ(world, Material.Render.Camera.Position, CalculateAvg(data, startVertex));
            }

            buffer.AddCommand(
                Material.Render,
                ma,
                world,
                light,
                data.VertexBuffer,
                PrimitiveTypes.TriangleList,
                startVertex + StartVertex,
                TriangleStart,
                primitiveCount,
                SortLayers.OBJECT,
                z
                );
        }
예제 #7
0
 public void DepthPrepass(RenderState rstate, ushort startMesh, int endMesh, ushort startVertex, Matrix4 world, MaterialAnimCollection mc)
 {
     if (ready)
     {
         for (ushort i = startMesh; i < endMesh; i++)
         {
             Meshes[i].DepthPrepass(rstate, this, startVertex, world, mc);
         }
     }
 }
예제 #8
0
 public void DrawBuffer(CommandBuffer buff, ushort startMesh, int endMesh, ushort startVertex, Matrix4 world, ref Lighting light, Vector3 center, MaterialAnimCollection mc, Material overrideMat = null)
 {
     if (ready)
     {
         for (ushort i = startMesh; i < endMesh; i++)
         {
             Meshes[i].DrawBuffer(buff, this, startVertex, world, ref light, mc, overrideMat);
         }
     }
 }
예제 #9
0
 public void Draw(RenderState rstate, ushort startMesh, int endMesh, ushort startVertex, Matrix4 world, Lighting light, MaterialAnimCollection mc)
 {
     if (ready)
     {
         for (ushort i = startMesh; i < endMesh; i++)
         {
             Meshes [i].Draw(rstate, VertexBuffer, startVertex, world, light, mc);
         }
     }
 }
예제 #10
0
        public void DrawBuffer(int level, ResourceManager res, CommandBuffer buffer, Matrix4x4 world, ref Lighting lights, MaterialAnimCollection mc, Material overrideMat = null)
        {
            if (Levels == null || Levels.Length <= level)
            {
                return;
            }
            var l = Levels[level];

            if (l == null)
            {
                return;
            }
            WorldMatrixHandle wm = buffer.WorldBuffer.SubmitMatrix(ref world);

            for (int i = 0; i < l.Length; i++)
            {
                var          dc  = l[i];
                MaterialAnim ma  = null;
                Material     mat = overrideMat;
                if (mat == null)
                {
                    mat = dc.GetMaterial(res);
                    if (mat != null)
                    {
                        ma = dc.GetMaterialAnim(mc);
                    }
                    else
                    {
                        mat = res.DefaultMaterial;
                    }
                }
                float z = 0;
                if (mat.Render.IsTransparent)
                {
                    z = RenderHelpers.GetZ(world, mat.Render.Camera.Position, Center);
                }
                WorldMatrixHandle worldHandle = wm;
                if (dc.HasScale)
                {
                    Matrix4x4 tr = dc.Scale * world;
                    worldHandle = buffer.WorldBuffer.SubmitMatrix(ref tr);
                }

                buffer.AddCommand(mat.Render,
                                  ma,
                                  worldHandle,
                                  lights,
                                  dc.Buffer,
                                  PrimitiveTypes.TriangleList,
                                  dc.BaseVertex,
                                  dc.StartIndex,
                                  dc.PrimitiveCount,
                                  SortLayers.OBJECT,
                                  z
                                  );
            }
        }
예제 #11
0
        public unsafe void DrawImmediate(int level, ResourceManager res, RenderState renderState, Matrix4x4 world, ref Lighting lights, MaterialAnimCollection mc, Material overrideMat = null)
        {
            if (Levels == null || Levels.Length < level)
            {
                return;
            }
            var l = Levels[level];

            if (l == null)
            {
                return;
            }
            Mat4Source src;
            Mat4Source world2;

            src.World = world;
            Matrix4x4.Invert(world, out src.Normal);
            src.Normal = Matrix4x4.Transpose(src.Normal);
            for (int i = 0; i < l.Length; i++)
            {
                var          dc  = l[i];
                MaterialAnim ma  = null;
                Material     mat = overrideMat;
                if (mat == null)
                {
                    mat = dc.GetMaterial(res);
                    if (mat != null)
                    {
                        ma = dc.GetMaterialAnim(mc);
                    }
                    else
                    {
                        mat = res.DefaultMaterial;
                    }
                }

                WorldMatrixHandle handle;
                handle.Source = (Matrix4x4 *)&src;
                handle.ID     = ulong.MaxValue;
                if (dc.HasScale)
                {
                    world2.World = dc.Scale * world;
                    Matrix4x4.Invert(world2.World, out world2.Normal);
                    world2.Normal = Matrix4x4.Transpose(world2.Normal);
                    handle.Source = (Matrix4x4 *)&world2;
                    handle.ID     = ulong.MaxValue;
                }
                Matrix4x4 tr = world;
                if (dc.HasScale)
                {
                    tr = dc.Scale * world;
                }
                mat.Render.World        = handle;
                mat.Render.MaterialAnim = ma;
                mat.Render.Use(renderState, dc.Buffer.VertexType, ref lights);
                dc.Buffer.Draw(PrimitiveTypes.TriangleList, dc.BaseVertex, dc.StartIndex, dc.PrimitiveCount);
            }
        }
예제 #12
0
        public void DrawImmediate(int level, ResourceManager res, RenderState renderState, Matrix4x4 world, ref Lighting lights, MaterialAnimCollection mc, Material overrideMat = null)
        {
            if (Levels == null || Levels.Length < level)
            {
                return;
            }
            var l = Levels[level];

            if (l == null)
            {
                return;
            }
            for (int i = 0; i < l.Length; i++)
            {
                var          dc  = l[i];
                MaterialAnim ma  = null;
                Material     mat = overrideMat;
                if (mat == null)
                {
                    mat = dc.GetMaterial(res);
                    if (mat != null)
                    {
                        ma = dc.GetMaterialAnim(mc);
                    }
                    else
                    {
                        mat = res.DefaultMaterial;
                    }
                }
                Matrix4x4 tr = world;
                if (dc.HasScale)
                {
                    tr = dc.Scale * world;
                }
                mat.Render.World = tr;
                mat.Render.Use(renderState, dc.Buffer.VertexType, ref lights);
                dc.Buffer.Draw(PrimitiveTypes.TriangleList, dc.BaseVertex, dc.StartIndex, dc.PrimitiveCount);
            }
        }