public void DrawSkybox() { if (SkyboxModel == null) { SkyboxModel = new libTechModel(); SkyboxModel.Scale = new Vector3(5000); libTechMesh CubeMesh = new libTechMesh(FishGfx.Formats.Obj.Load("content/models/cube.obj").First().Vertices.ToArray(), Engine.GetMaterial("skybox")); CubeMesh.SetLabel("Skybox Cube"); SkyboxModel.AddMesh(CubeMesh); } RenderState RS = Gfx.PeekRenderState(); RS.EnableCullFace = false; RS.EnableDepthMask = false; RS.EnableDepthTest = true; RS.EnableBlend = false; Gfx.PushRenderState(RS); SkyboxModel.Position = Engine.Camera3D.Position; SkyboxModel.DrawOpaque(); Gfx.PopRenderState(); }
public static libTechMap LoadMap(Stream BSPStream) { Q3BSP Map = Q3BSP.FromStream(BSPStream); libTechMap Q3Map = new libTechMap(); Dictionary <int, List <Vertex3> > TexturedMeshes = new Dictionary <int, List <Vertex3> >(); foreach (var FaceIdx in GetFaceIndices(Map)) { Q3BSPFace Face = Map.Faces[FaceIdx]; if (!TexturedMeshes.ContainsKey(Face.Texture)) { TexturedMeshes.Add(Face.Texture, new List <Vertex3>()); } if (Face.Type == FaceType.Polygon || Face.Type == FaceType.Mesh) { Vertex3[] Vertices = new Vertex3[Face.NVerts]; for (int VertOffset = 0; VertOffset < Face.NVerts; VertOffset++) { Vertices[VertOffset] = Map.Vertices[Face.Vert + VertOffset].ToVertex3(); } for (int MeshVertOffset = 0; MeshVertOffset < Face.NMeshVerts; MeshVertOffset++) { TexturedMeshes[Face.Texture].Add(Vertices[Map.MeshVertices[Face.MeshVert + MeshVertOffset]]); } } } string[] TextureNames = Map.Textures.Select(T => T.GetName()).ToArray(); libTechModel Model = new libTechModel(); Q3Map.AddModel(Model); foreach (var KV in TexturedMeshes) { string TexName = TextureNames[KV.Key]; if (TexName == "textures/lun3dm5/lblusky2") { continue; } Model.AddMesh(new libTechMesh(KV.Value.ToArray().Reverse().ToArray(), Engine.GetMaterial(TexName))); } return(Q3Map); }