Beispiel #1
0
        /// <summary>
        /// Load the model and texture of the JBoundingSphere if we want to render it in the world.
        /// </summary>
        /// <param name="loader"></param>
        public void LoadSphereModel(JLoader loader)
        {
            SphereModelData = JObjFileLoader.LoadObj(SphereModelPath);
            SphereModel     = loader.LoadToVAO(SphereModelData.Vertices, SphereModelData.TextureCoords, SphereModelData.Normals, SphereModelData.Indices);
            JModelTexture texture = new JModelTexture(loader.loadTexture(SphereTexturePathUnselected));

            SphereTexturedModel = new JTexturedModel(SphereModel, texture);
            SphereEntity        = new JEntity(SphereTexturedModel, new Vector3(50, 0, -50), new Vector3(0, 0, 1), 0.5f);
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public List <JEntity> GenerateTrees()
        {
            Console.WriteLine("Generating Trees...");

            List <JEntity> TreeEntities = new List <JEntity>();

            string         TreeTexturePath   = JFileUtils.GetPathToResFile("Tree\\tree_texture_green_brown.png");
            string         TreeModelPath     = JFileUtils.GetPathToResFile("Tree\\tree.obj");
            JModelData     TreeModelData     = JObjFileLoader.LoadObj(TreeModelPath);
            JRawModel      TreeModel         = Loader.LoadToVAO(TreeModelData.Vertices, TreeModelData.TextureCoords, TreeModelData.Normals, TreeModelData.Indices);
            JModelTexture  TreeTexture       = new JModelTexture(Loader.loadTexture(TreeTexturePath));
            JTexturedModel TreeTexturedModel = new JTexturedModel(TreeModel, TreeTexture);
            Random         r = new Random();

            for (int i = 0; i < 200; i++)
            {
                float posX = (float)r.NextDouble() * 800;
                float posZ = -(float)r.NextDouble() * 800;
                float posY = Terrain.GetHeightOfTerrain(posX, posZ);

                while (posY < WaterTile.Height)
                {
                    posX = (float)r.NextDouble() * 800;
                    posZ = -(float)r.NextDouble() * 800;
                    posY = Terrain.GetHeightOfTerrain(posX, posZ);
                }

                Vector3 orientation = new Vector3((float)r.NextDouble(), 0, (float)r.NextDouble());
                orientation.NormalizeFast();

                JEntity entity = new JEntity(TreeTexturedModel, new Vector3(posX, posY, posZ), orientation, 0.25f);
                TreeEntities.Add(entity);
            }

            return(TreeEntities);
        }
        /// <summary>
        /// GraphicsMode used for anitaliasing.
        /// </summary>
        public JGameWindow() : base(WIDTH, HEIGHT, new OpenTK.Graphics.GraphicsMode(32, 24, 0, 8), "JModelViewer", GameWindowFlags.Default, DisplayDevice.Default, 3, 0, GraphicsContextFlags.ForwardCompatible)
        {
            PlayerTexturePath = JFileUtils.GetPathToResFile("Cowboy\\CowboyTexture.png");
            PlayerModelPath   = JFileUtils.GetPathToResFile("Cowboy\\Cowboy.obj");

            Version  version        = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
            DateTime buildDate      = new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.Revision * 2);
            string   displayVersion = $"{version} ({buildDate})";

            Console.WriteLine("JGameEngine v." + displayVersion);

            Console.WriteLine("OpenGL version: " + GL.GetString(StringName.Version));

            Loader          = new JLoader();
            PlayerModelData = JObjFileLoader.LoadObj(PlayerModelPath);

            Console.WriteLine("Using .obj file: " + PlayerModelPath);
            PlayerModel = Loader.LoadToVAO(PlayerModelData.Vertices, PlayerModelData.TextureCoords, PlayerModelData.Normals, PlayerModelData.Indices);

            Console.WriteLine("Using .png texture file: " + PlayerTexturePath + "...");
            JModelTexture texture = new JModelTexture(Loader.loadTexture(PlayerTexturePath));

            TexturedModel = new JTexturedModel(PlayerModel, texture);
            Light         = new JLight(new Vector3(0, 0, 0), new Vector3(1, 1, 1));

            JTerrainTexture textureWaterDeep       = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\WaterDeep.png")));
            JTerrainTexture textureWaterShallow    = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\WaterShallow.png")));
            JTerrainTexture textureSand            = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\Sand.png")));
            JTerrainTexture textureGrassNatural    = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\GrassNatural.png")));
            JTerrainTexture textureGrassLush       = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\GrassLush.png")));
            JTerrainTexture textureMountainNatural = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\MountainNatural.png")));
            JTerrainTexture textureMountainRocky   = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\MountainRocky.png")));
            JTerrainTexture textureSnow            = new JTerrainTexture(Loader.loadTexture(JFileUtils.GetPathToResFile("Terrain\\Snow.png")));

            JTerrainTexturePack texturePack = new JTerrainTexturePack();

            texturePack.AddTerrainTexture(textureWaterDeep, 0.1f);
            texturePack.AddTerrainTexture(textureWaterShallow, 0.15f);
            texturePack.AddTerrainTexture(textureSand, 0.18f);
            texturePack.AddTerrainTexture(textureGrassNatural, 0.35f);
            texturePack.AddTerrainTexture(textureGrassLush, 0.45f);
            texturePack.AddTerrainTexture(textureMountainNatural, 0.6f);
            texturePack.AddTerrainTexture(textureMountainRocky, 0.7f);
            texturePack.AddTerrainTexture(textureSnow, 0.8f);

            MasterRenderer = new JMasterRenderer(texturePack);

            WaterBuffer = new JWaterFrameBuffer(this);
            WaterShader = new JWaterShader();
            waterTiles  = new List <JWaterTile>();
            WaterTile   = new JWaterTile(400, -400, 8, textureWaterShallow);
            waterTiles.Add(WaterTile);
            waterRenderer = new JWaterRenderer(Loader, WaterShader, MasterRenderer.projectionMatrix, WaterBuffer, WaterTile);

            terrain = new JPerlinTerrain(0, -1, Loader, texturePack);

            Entity     = new JBoundedEntity(TexturedModel, new Vector3(50, 0, -50), new Vector3(0, 0, 1), 0.1f, Loader);
            Entity2    = new JBoundedEntity(TexturedModel, new Vector3(100, 0, -50), new Vector3(0, 0, 1), 0.1f, Loader);
            EntityList = new List <JBoundedEntity>();
            EntityList.Add(Entity);
            EntityList.Add(Entity2);

            // Generate Trees
            JEntityGenerator entityGenerator = new JEntityGenerator(Loader, terrain, WaterTile);

            StaticEntities = entityGenerator.GenerateTrees();

            Camera = new JCameraFree();

            picker = new JMousePicker(Camera, MasterRenderer.projectionMatrix, terrain, this);

            LastFrameTime = GetCurrentTime();
        }
Beispiel #4
0
        public static JModelData LoadObj(string fileName)
        {
            List <JVertex> vertices = new List <JVertex>();
            List <Vector2> textures = new List <Vector2>();
            List <Vector3> normals  = new List <Vector3>();
            List <uint>    indices  = new List <uint>();

            try
            {
                string line;
                using (FileStream stream = new FileStream(fileName, FileMode.Open))
                {
                    using (StreamReader rdr = new StreamReader(stream))
                    {
                        while (true)
                        {
                            line = rdr.ReadLine();

                            if (line.StartsWith("v "))
                            {
                                string[] currentLine = line.Split(' ');
                                Vector3  vertex      = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3]));
                                JVertex  newVertex   = new JVertex((uint)vertices.Count, vertex);
                                vertices.Add(newVertex);
                            }
                            else if (line.StartsWith("vt "))
                            {
                                string[] currentLine = line.Split(' ');
                                Vector2  texture     = new Vector2(float.Parse(currentLine[1]), float.Parse(currentLine[2]));
                                textures.Add(texture);
                            }
                            else if (line.StartsWith("vn "))
                            {
                                string[] currentLine = line.Split(' ');
                                Vector3  normal      = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3]));
                                normals.Add(normal);
                            }
                            else if (line.StartsWith("f "))
                            {
                                break;
                            }
                        }
                        while (line != null && line.StartsWith("f "))
                        {
                            string[] currentLine = line.Split(' ');
                            string[] vertex1     = currentLine[1].Split('/');
                            string[] vertex2     = currentLine[2].Split('/');
                            string[] vertex3     = currentLine[3].Split('/');

                            ProcessVertex(vertex1, vertices, indices);
                            ProcessVertex(vertex2, vertices, indices);
                            ProcessVertex(vertex3, vertices, indices);

                            line = rdr.ReadLine();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
            }

            RemoveUnusedVertices(vertices);
            float[] verticesArray = new float[vertices.Count * 3];
            float[] normalsArray  = new float[vertices.Count * 3];
            float[] textureArray  = new float[vertices.Count * 2];
            float   furthest      = convertDataToArrays(vertices, textures, normals, verticesArray, textureArray, normalsArray);

            uint[] indicesArray = ConvertIndicesListToArray(indices);

            JModelData modelData = new JModelData(verticesArray, textureArray, normalsArray, indicesArray, furthest);

            return(modelData);
        }