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); }
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(); }
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); } }