public void LocToVec3_Test2_VectorsRandom()
    {
        OT_LocCode lc = new OT_LocCode();

        System.Random rnd = new System.Random();
        for (int i = 0; i < 4681; i++)
        {
            byte    d          = Convert.ToByte(rnd.Next(1, 6));
            int     coordlimit = Convert.ToInt32(Math.Pow(2, d));
            int     valuelimit = Convert.ToInt32(Math.Pow(8, d));
            Vector3 vec        = new Vector3(rnd.Next(0, coordlimit),
                                             rnd.Next(0, coordlimit), rnd.Next(0, coordlimit));
            long n = lc.Vec3ToLoc(vec, d);
            Assert.AreEqual(vec, lc.LocToVec3(n));
        }
    }
Exemplo n.º 2
0
    public void PerlinNoise()
    {
        Vector3 offset = this.transform.position;

        for (ushort i = 4096; i < (4096 * 2); i++)
        {
            Vector3Int point = olc.LocToVec3(i);
            float      yr    = Mathf.PerlinNoise((offset.x + point.x) * .019f, (offset.z + point.z) * .019f) * 70 + 90;
            if (offset.y + point.y < yr)
            {
                AddNodeRelPos(point, chunkMaxDepth, 1);
            }
            else
            {
                AddNodeRelPos(point, chunkMaxDepth, 0);
            }
        }
    }
Exemplo n.º 3
0
    public void DrawChunk(GameObject chunk)

    {
        block_Manager = new Block_Manager();
        Mesh octree_mesh = chunk.GetComponent <MeshFilter>().mesh;
        //Dictionary<ushort, int> materialdic = chunk.GetComponent<Octree_Controller>().materialdic;
        MeshRenderer octree_MeshRender = chunk.GetComponent <MeshRenderer>();

        Dictionary <ushort, int> octree = chunk.GetComponent <Octree_Controller>().octree;
        float octreeSize = chunk.GetComponent <Octree_Controller>().octreeSize;

        //Set up Mesh
        octree_mesh.Clear();
        byte lengthverts = 18;

        Vector3[]  meshverts     = new Vector3[octree.Count * lengthverts];
        List <int> facetriangles = new List <int>();
        int        count         = 0;

        foreach (ushort code in octree.Keys)
        {
            bool[] sidestorender = { DetermineSideRender(octree, code, olc.CalculateAdjacent(code, axisZ, -1)), DetermineSideRender(octree, code, olc.CalculateAdjacent(code, axisY, 1)),    // -z, +y
                                     DetermineSideRender(octree, code, olc.CalculateAdjacent(code, axisX,  1)), DetermineSideRender(octree, code, olc.CalculateAdjacent(code, axisX, -1)),   // +x, -x
                                     DetermineSideRender(octree, code, olc.CalculateAdjacent(code, axisZ,  1)), DetermineSideRender(octree, code, olc.CalculateAdjacent(code, axisY, -1)) }; // +z, -y

            if (sidestorender.Any(x => x))                                                                                                                                                   //If at least one side can be rendered
            {
                float   tier_size = octreeSize * (1 / (float)Math.Pow(2, olc.CalculateDepth(code)));
                Vector3 test      = olc.LocToVec3(code);
                Vector3 locpos    = test * tier_size;

                //MultiSide
                meshverts[(count * lengthverts) + 0] = locpos + new Vector3(0, 0, 0);
                meshverts[(count * lengthverts) + 1] = locpos + new Vector3(0, tier_size, 0);
                meshverts[(count * lengthverts) + 2] = locpos + new Vector3(0, tier_size, tier_size);
                meshverts[(count * lengthverts) + 3] = locpos + new Vector3(0, 0, tier_size);
                //Side Z-
                meshverts[(count * lengthverts) + 4] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisZ, -1), 0, 0);
                meshverts[(count * lengthverts) + 5] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisZ, -1), tier_size, 0);
                //Side Y+
                meshverts[(count * lengthverts) + 6] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisY, 1), tier_size, 0);
                meshverts[(count * lengthverts) + 7] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisY, 1), tier_size, tier_size);
                //Side X+
                meshverts[(count * lengthverts) + 8]  = locpos + new Vector3(tier_size, 0, 0);
                meshverts[(count * lengthverts) + 9]  = locpos + new Vector3(tier_size, tier_size, 0);
                meshverts[(count * lengthverts) + 10] = locpos + new Vector3(tier_size, tier_size, tier_size * GreedyAdjacent(octree, code, axisZ, axisX, 1));
                meshverts[(count * lengthverts) + 11] = locpos + new Vector3(tier_size, 0, tier_size * GreedyAdjacent(octree, code, axisZ, axisX, 1));
                //Side X-
                meshverts[(count * lengthverts) + 12] = locpos + new Vector3(0, tier_size, tier_size * GreedyAdjacent(octree, code, axisZ, axisX, -1));
                meshverts[(count * lengthverts) + 13] = locpos + new Vector3(0, 0, tier_size * GreedyAdjacent(octree, code, axisZ, axisX, -1));
                //Side Z+
                meshverts[(count * lengthverts) + 14] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisZ, 1), tier_size, tier_size);
                meshverts[(count * lengthverts) + 15] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisZ, 1), 0, tier_size);
                //Side Y-
                meshverts[(count * lengthverts) + 16] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisY, -1), 0, 0);
                meshverts[(count * lengthverts) + 17] = locpos + new Vector3(tier_size * GreedyAdjacent(octree, code, axisX, axisY, -1), 0, tier_size);


                //face front: -z
                if (sidestorender[0] && !GreedySubAdjacent(octree, code, axisX, axisZ, -1))     //Should this side show? Plus Greedmesh Check
                {
                    facetriangles.Add((count * lengthverts) + 0);
                    facetriangles.Add((count * lengthverts) + 5);
                    facetriangles.Add((count * lengthverts) + 4);     //f-z t1
                    facetriangles.Add((count * lengthverts) + 0);
                    facetriangles.Add((count * lengthverts) + 1);
                    facetriangles.Add((count * lengthverts) + 5);     //f-z t2
                }

                //face top: +y
                if (sidestorender[1] && !GreedySubAdjacent(octree, code, axisX, axisY, 1))     //Should this side show? Plus Greedmesh Check
                {
                    facetriangles.Add((count * lengthverts) + 6);
                    facetriangles.Add((count * lengthverts) + 1);
                    facetriangles.Add((count * lengthverts) + 2);     //t+y t1
                    facetriangles.Add((count * lengthverts) + 6);
                    facetriangles.Add((count * lengthverts) + 2);
                    facetriangles.Add((count * lengthverts) + 7);     //t+y t2
                }

                //face right: +x
                if (sidestorender[2] && !GreedySubAdjacent(octree, code, axisZ, axisX, 1))     //Should this side show? Plus Greedmesh Check
                {
                    facetriangles.Add((count * lengthverts) + 8);
                    facetriangles.Add((count * lengthverts) + 9);
                    facetriangles.Add((count * lengthverts) + 10);     //r+x t1
                    facetriangles.Add((count * lengthverts) + 8);
                    facetriangles.Add((count * lengthverts) + 10);
                    facetriangles.Add((count * lengthverts) + 11);     //r+x t2
                }

                //face left: -x
                if (sidestorender[3] && !GreedySubAdjacent(octree, code, axisZ, axisX, -1))     //Should this side show? Plus Greedmesh Check
                {
                    facetriangles.Add((count * lengthverts) + 0);
                    facetriangles.Add((count * lengthverts) + 13);
                    facetriangles.Add((count * lengthverts) + 12);     //l-x t1
                    facetriangles.Add((count * lengthverts) + 0);
                    facetriangles.Add((count * lengthverts) + 12);
                    facetriangles.Add((count * lengthverts) + 1);     //l-x t2
                }

                //face back: +z
                if (sidestorender[4] && !GreedySubAdjacent(octree, code, axisX, axisZ, 1))     //Checking side - Plus Greedmesh Check
                {
                    facetriangles.Add((count * lengthverts) + 14);
                    facetriangles.Add((count * lengthverts) + 2);
                    facetriangles.Add((count * lengthverts) + 3);     //l-z t1
                    facetriangles.Add((count * lengthverts) + 14);
                    facetriangles.Add((count * lengthverts) + 3);
                    facetriangles.Add((count * lengthverts) + 15);     //l-z t2
                }

                //face bottom: -y
                if (sidestorender[5] && !GreedySubAdjacent(octree, code, axisX, axisY, -1))     //Checking Side -  Plus Greedmesh Check
                {
                    facetriangles.Add((count * lengthverts) + 0);
                    facetriangles.Add((count * lengthverts) + 17);
                    facetriangles.Add((count * lengthverts) + 3);     //b-y t1
                    facetriangles.Add((count * lengthverts) + 0);
                    facetriangles.Add((count * lengthverts) + 16);
                    facetriangles.Add((count * lengthverts) + 17);     //b-y t2
                }
                count++;
            }
            else
            {
                continue;
            }
        }
        octree_mesh.vertices       = meshverts;
        octree_mesh.triangles      = facetriangles.ToArray();
        octree_MeshRender.material = (Material)Resources.Load("Default", typeof(Material));
        octree_mesh.RecalculateNormals();
        octree_mesh.RecalculateBounds();
        chunk.GetComponent <MeshCollider>().sharedMesh = octree_mesh;
    }
Exemplo n.º 4
0
    private void PreRender()
    {
        //Set up Mesh
        this.octree_mesh = GetComponent <MeshFilter>().mesh;
        this.octree_mesh.Clear();
        this.octree_mesh.subMeshCount = this.materialdic.Count;
        //Set Up Materials
        this.octree_MeshRender = GetComponent <MeshRenderer>();
        //Collect Materials that belong in this chunk
        Material[] materiallist = new Material[this.materialdic.Count];
        foreach (int key in this.materialdic.Keys)
        {
            materiallist[this.materialdic[key]] = this.block_Manager.blockMaterialList[key];
        }
        int count = 0;

        //Check each node in the octree if it should be rendered.
        foreach (int code in octree.Keys)
        {
            //Debug.Log("Current Code: " + code);
            //Only Render if node is  (has no children, identified if a key exists with string (current node.locationCode + "000"))
            if (octree.ContainsKey(code << 3) == false)
            {
                bool[] sidestorender = { DetermineSideRender(code, olc.CalculateAdjacent(code, 0, -1)), DetermineSideRender(code, olc.CalculateAdjacent(code, 1, 1)),    // -z, +y
                                         DetermineSideRender(code, olc.CalculateAdjacent(code, 2,  1)), DetermineSideRender(code, olc.CalculateAdjacent(code, 2, -1)),   // +x, -x
                                         DetermineSideRender(code, olc.CalculateAdjacent(code, 0,  1)), DetermineSideRender(code, olc.CalculateAdjacent(code, 1, -1)) }; // +z, -y

                if (sidestorender.Any(x => x))                                                                                                                           //If at least one side can be rendered
                {
                    float   tier_size = this.octreesize * (1 / (float)Math.Pow(2, olc.CalculateDepth(code)));
                    Vector3 locpos    = olc.LocToVec3(code) * tier_size;

                    Vector3[] verts =
                    {
                        //octreepos +
                        locpos + new Vector3(0,                 0,         0),
                        locpos + new Vector3(tier_size,         0,         0),
                        locpos + new Vector3(tier_size, tier_size,         0),
                        locpos + new Vector3(0,         tier_size,         0),
                        locpos + new Vector3(0,         tier_size, tier_size),
                        locpos + new Vector3(tier_size, tier_size, tier_size),
                        locpos + new Vector3(tier_size,         0, tier_size),
                        locpos + new Vector3(0,                 0, tier_size),
                    };

                    List <int> facetriangles = new List <int>();

                    //face front: -z
                    if (sidestorender[0])
                    {
                        int[] sidetriangles =
                        {
                            (count * 8) + 0, (count * 8) + 2, (count * 8) + 1, //f-z t1
                            (count * 8) + 0, (count * 8) + 3, (count * 8) + 2, //f-z t2
                        };
                        facetriangles.AddRange(sidetriangles);
                    }

                    //face top: +y
                    if (sidestorender[1])
                    {
                        int[] sidetriangles =
                        {
                            (count * 8) + 2, (count * 8) + 3, (count * 8) + 4, //t+y t1
                            (count * 8) + 2, (count * 8) + 4, (count * 8) + 5, //t+y t2
                        };
                        facetriangles.AddRange(sidetriangles);
                    }

                    //face right: +x
                    if (sidestorender[2])
                    {
                        int[] sidetriangles =
                        {
                            (count * 8) + 1, (count * 8) + 2, (count * 8) + 5, //r+x t1
                            (count * 8) + 1, (count * 8) + 5, (count * 8) + 6, //r+x t2
                        };
                        facetriangles.AddRange(sidetriangles);
                    }

                    //face left: -x
                    if (sidestorender[3])
                    {
                        int[] sidetriangles =
                        {
                            (count * 8) + 0, (count * 8) + 7, (count * 8) + 4, //l-x t1
                            (count * 8) + 0, (count * 8) + 4, (count * 8) + 3, //l-x t2
                        };
                        facetriangles.AddRange(sidetriangles);
                    }

                    //face back: +z
                    if (sidestorender[4])
                    {
                        int[] sidetriangles =
                        {
                            (count * 8) + 5, (count * 8) + 4, (count * 8) + 7, //l-z t1
                            (count * 8) + 5, (count * 8) + 7, (count * 8) + 6, //l-z t2
                        };
                        facetriangles.AddRange(sidetriangles);
                    }

                    //face bottom: -y
                    if (sidestorender[5])
                    {
                        int[] sidetriangles =
                        {
                            (count * 8) + 0, (count * 8) + 6, (count * 8) + 7, //b-y t1
                            (count * 8) + 0, (count * 8) + 1, (count * 8) + 6  //b-y t2
                        };
                        facetriangles.AddRange(sidetriangles);
                    }
                    this.octree_mesh.vertices = CombineVector3Arrays(this.octree_mesh.vertices, verts);
                    this.octree_mesh.SetTriangles(CombineIntArrays(this.octree_mesh.GetTriangles(this.materialdic[octree[code]]), facetriangles.ToArray()), this.materialdic[octree[code]]);
                    count++;
                }

                else
                {
                    continue;
                }
            }
            else
            {
                continue;
            }
            this.octree_MeshRender.materials = materiallist.ToArray();
            this.octree_mesh.RecalculateNormals();
            this.octree_mesh.RecalculateBounds();
        }
    }