public static void LoadSceneFromFolder(string folderName) { try { if (Directory.Exists(folderName)) { // ------ LOAD GEOMETRY ------ // string[] OBJs = Directory.GetFiles(folderName, "*.obj"); foreach (string OBJ in OBJs) { StreamReader obj = new StreamReader(OBJ); char[] spl = new char[] { ' ' }; char[] splFace = new char[] { '/' }; string[] line; Mesh mesh = new Mesh(); List <Vec2> vt = new List <Vec2>(); mesh.tag = "world"; mesh.colour = new Colour(37, 95, 75); while (!obj.EndOfStream) { line = obj.ReadLine().Split(spl); switch (line[0]) { case "v": mesh.AddVert(float.Parse(line[1], CultureInfo.InvariantCulture), float.Parse(line[2], CultureInfo.InvariantCulture), float.Parse(line[3], CultureInfo.InvariantCulture)); break; case "vt": vt.Add(new Vec2(float.Parse(line[1], CultureInfo.InvariantCulture), float.Parse(line[2], CultureInfo.InvariantCulture))); break; case "f": Face face = new Face(); for (int i = 1; i < line.Length; i++) { string[] fDat = line[i].Split(splFace); for (int p = 0; p < fDat.Length; p++) { switch (p) { case 0: face.verts.Add(int.Parse(fDat[0]) - 1); break; case 1: face.uv.Add(vt[int.Parse(fDat[1]) - 1]); break; } } } if (face.verts.Count > 2) { mesh.AddFace(face); } break; } } obj.Close(); } // ------ LOAD TEXTURE ------ // string[] MTLs = Directory.GetFiles(folderName, "*.mtl"); uint texID = 0; GL.GenTextures(texture.Length, texture); foreach (string MTL in MTLs) { StreamReader mtl = new StreamReader(MTL); char[] spl = new char[] { ' ' }; string[] splMat = new string[] { @"..\", ".png" }; char[] splName = new char[] { @"\"[0] }; string[] line; string texDir = ""; string texName; while (!mtl.EndOfStream) { line = mtl.ReadLine().Split(spl); switch (line[0]) { case "map_Kd": if (line[1].Split(splMat, StringSplitOptions.None).Length > 2) { texDir = Editor.cf_gameDir + "\\Data\\World\\Levels\\_raytwol\\" + line[1].Split(splMat, StringSplitOptions.None)[1] + ".png"; } break; } } mtl.Close(); texName = texDir.Split(splName)[texDir.Split(splName).Length - 1]; bool transparent = false; if (texDir != "") { Bitmap textureImage = new Bitmap(Image.FromFile(texDir)); textureImage.RotateFlip(RotateFlipType.RotateNoneFlipY); // -- Check cache -- bool texFound = false; if (File.Exists("RayTwol_texcache.txt")) { var cache = new StreamReader("RayTwol_texcache.txt"); while (!cache.EndOfStream) { string[] l = cache.ReadLine().Split(spl); if (l[0] == texName) { texFound = true; if (l[1] == "tr") { transparent = true; } else if (l[1] == "op") { transparent = false; } } } cache.Close(); } if (!texFound) { transparent = Func.CheckIfTransparent(textureImage); var cache = new StreamWriter("RayTwol_texcache.txt", true); if (transparent) { cache.WriteLine(texName + " tr"); } else { cache.WriteLine(texName + " op"); } cache.Close(); } // -- OpenGL -- GL.BindTexture(TextureTarget.Texture2D, texture[texID]); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, textureImage.Width, textureImage.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, textureImage.LockBits(new Rectangle(0, 0, textureImage.Width, textureImage.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb).Scan0); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMinFilter.Linear); } Meshes.all[(int)texID].texID = texID; if (transparent) { Meshes.world_transparent.Add(Meshes.all[(int)texID]); } else { Meshes.world_opaque.Add(Meshes.all[(int)texID]); } texID++; } textureCount = (int)texID; } } catch (Exception e) { var warn = new Warning("Error", string.Format("The geometry for this level could not be loaded ({0}). Press OK to re-initialise, or Cancel to continue.", e.Message)).ShowDialog(); if (warn.Value) { Setup.FirstTimeSetup(); Environment.Exit(0); } } }