예제 #1
0
        public RigidModel CreateRigidModel(bool drawable)
        {
            var model = new RigidModel();
            var part  = new RigidModelPart();
            var dcs   = new List <MeshDrawcall>();
            var scale = Matrix4x4.CreateScale(Radius);

            if (drawable && SideMaterials.Length >= 6)
            {
                for (int i = 0; i < 6; i++)
                {
                    int     start, count;
                    Vector3 pos;
                    sphere.GetDrawParameters(faces[i], out start, out count, out pos);
                    var dc = new MeshDrawcall();
                    dc.Buffer         = sphere.VertexBuffer;
                    dc.MaterialCrc    = CrcTool.FLModelCrc(sideMaterialNames[i]);
                    dc.BaseVertex     = 0;
                    dc.StartIndex     = start;
                    dc.PrimitiveCount = count;
                    dc.HasScale       = true;
                    dc.Scale          = scale;
                    dcs.Add(dc);
                }

                if (SideMaterials.Length > 6)
                {
                    var crc = CrcTool.FLModelCrc(sideMaterialNames[6]);
                    for (int i = 0; i < 6; i++)
                    {
                        int     start, count;
                        Vector3 pos;
                        sphere.GetDrawParameters(faces[i], out start, out count, out pos);
                        var dc = new MeshDrawcall();
                        dc.Buffer         = sphere.VertexBuffer;
                        dc.MaterialCrc    = crc;
                        dc.BaseVertex     = 0;
                        dc.StartIndex     = start;
                        dc.PrimitiveCount = count;
                        dc.HasScale       = true;
                        dc.Scale          = scale;
                        dcs.Add(dc);
                    }
                }
            }
            var vmesh = new VisualMesh();

            vmesh.Radius      = Radius;
            vmesh.BoundingBox = BoundingBox.CreateFromSphere(new BoundingSphere(Vector3.Zero, Radius));
            vmesh.Levels      = new[] { dcs.ToArray() };
            part.Hardpoints   = new List <Hardpoint>();
            part.Mesh         = vmesh;
            model.Root        = part;
            model.AllParts    = new[] { part };
            return(model);
        }
예제 #2
0
        public override void Draw()
        {
            viewport.Begin();
            var       cam = new LookAtCamera();
            Matrix4x4 rot = Matrix4x4.CreateRotationX(viewport.CameraRotation.Y) *
                            Matrix4x4.CreateRotationY(viewport.CameraRotation.X);
            var dir = Vector3.Transform(-Vector3.UnitZ, rot);
            var to  = Vector3.Zero;

            cam.Update(viewport.RenderWidth, viewport.RenderHeight, viewport.CameraOffset, to, rot);
            shader.SetViewProjection(cam);
            var w = Matrix4x4.Identity;
            var n = Matrix4x4.Identity;

            shader.SetWorld(ref w, ref n);
            shader.Shader.SetVector3(cameraPositionIndex, cam.Position);
            tex.BindTo(0);
            shader.UseProgram();
            for (int i = 0; i < 6; i++)
            {
                sphere.GetDrawParameters((CubeMapFace)i, out int start, out int count, out _);
                sphere.VertexBuffer.Draw(PrimitiveTypes.TriangleList, 0, start, count);
            }
            viewport.End();
        }
예제 #3
0
        public void DepthPrepass(RenderState rstate, Matrix4 world)
        {
            if (SideMaterials.Length < 6)
            {
                return;
            }
            var transform = Matrix4.CreateScale(Radius) * world;

            for (int i = 0; i < 6; i++)
            {
                if (SideMaterials[i].Render.IsTransparent)
                {
                    continue;
                }
                int     start, count;
                Vector3 pos;
                sphere.GetDrawParameters(faces[i], out start, out count, out pos);
                SideMaterials[i].Render.Camera = _camera;
                SideMaterials[i].Render.World  = transform;
                SideMaterials[i].Render.ApplyDepthPrepass(rstate);
                sphere.VertexBuffer.Draw(PrimitiveTypes.TriangleList, 0, start, count);
            }
        }