Exemple #1
0
        public Chunk()
        {
            List <Vector3>    Vertices = new List <Vector3>();
            List <Vector2>    UVs      = new List <Vector2>();
            List <INDEX_TYPE> TexIDs   = new List <INDEX_TYPE>();

            /*JSONVoxels Torus = Libraria.Serialization.JSON.Deserialize<JSONVoxels>(Files.ReadAllText("torus.json"));
             * XSize = Torus.dimension[0].width + 1;
             * YSize = Torus.dimension[0].height + 1;
             * ZSize = Torus.dimension[0].depth + 1;
             *
             * //XSize = YSize = ZSize = 24;
             * Blocks = new int[XSize * YSize * ZSize];
             *
             * for (int i = 0; i < Torus.voxels.Length; i++) {
             *      JSONVoxels.VoxelElement E = Torus.voxels[i];
             *      SetBlock(E.x, E.y, E.z, 24);
             * }*/

            ///////////////////////

            FastNoise Noise = new FastNoise();

            Noise.SetNoiseType(FastNoise.NoiseType.Simplex);
            Noise.SetFrequency(0.01f);

            XSize  = YSize = ZSize = 60;
            Blocks = new int[XSize * YSize * ZSize];

            for (int X = 0; X < XSize; X++)
            {
                for (int Y = 0; Y < YSize; Y++)
                {
                    for (int Z = 0; Z < ZSize; Z++)
                    {
                        float Weight = ((float)Y / YSize) * 2 - 1;

                        SetBlock(X, Y, Z, Noise.GetNoise(X, Z, Y) > Weight ? 1 : 0);                         //24
                    }
                }
            }

            ///////////////////////

            int C = 0;

            for (int i = 0; i < Blocks.Length; i++)
            {
                if (Blocks[i] != 0)
                {
                    C++;
                }
            }
            Console.WriteLine("{0} blocks {1} vertices {2} triangles", C, 6 * 6 * C, (6 * 6 * C) / 3);

            for (int x = 0; x < XSize; x++)
            {
                for (int y = 0; y < YSize; y++)
                {
                    for (int z = 0; z < ZSize; z++)
                    {
                        GenerateBlock(Vertices, UVs, TexIDs, new Vector3(x, y, z));
                    }
                }
            }

            /*const float Scale = 100;
             * ObjTriangle[] Triangles = ObjLoader.Load("basegame\\objmdl\\cube\\cube.objmdl");
             * for (int i = 0; i < Triangles.Length; i++) {
             *      Vertices.AddRange(new Vector3[] { Triangles[i].A * Scale, Triangles[i].B * Scale, Triangles[i].C * Scale });
             *      UVs.AddRange(new Vector2[] { Triangles[i].A_UV, Triangles[i].B_UV, Triangles[i].C_UV });
             *      TexIDs.AddRange(new float[] { 1, 1, 1 });
             * }*/

            ChunkShader = new ShaderProgram("basegame\\shaders\\chunk");

            /////////////////////////

            /*string[] TextureFiles = Files.GetFilesInDirectory("textures\\blocks", SearchPattern: "*.png");
             * int I = 0;
             *
             * foreach (var TFile in TextureFiles) {
             *      Texture2D Tex = Texture2D.FromFile(Files.GetFullPath(TFile), GenerateMipmap: false, UseSRGBA: true);
             *      Tex.SetFilterMode(TexFilterMode.Nearest, TexFilterMode.LinearMipmapLinear);
             *      Tex.GenerateMipmap();
             *      Tex.Resident = true;
             *      TexList.Add(Tex);
             *
             *      ChunkShader.SetUniform("Textures", I++, Tex.TextureHandle);
             *      //ChunkShader.SetUniform("Textures", I++, new long[] { Tex.TextureHandle, 0, 0, 0, 0 });
             * }*/

            TestMaterial = PBRMaterial.FromDirectory("basegame\\pbr\\brick");
            TestMaterial.MaterialAtlasTexture.Resident = true;

            //////////////////

            RObj = new RenderObject(DrawPrimitiveType.Triangles);
            RObj.BindShader(ChunkShader);

            if (!RObj.BindBuffer("in_Vertex", () => new VertexBuffer().SetData(Vertices.ToArray())))
            {
                throw new Exception();
            }

            if (!RObj.BindBuffer("in_UV", () => DataBuffer.CreateFromData(UVs)))
            {
                throw new Exception();
            }

            if (!RObj.BindBuffer("in_TextureID", () => DataBuffer.CreateFromData(TexIDs)))
            {
                throw new Exception();
            }

            RObj.BindIndexBuffer(new IndexBuffer().SetSequence((uint)Vertices.Count));
        }