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

        long[] Testcodes  = { lc.CalculateAdjacent(12, 2, -1), lc.CalculateAdjacent(15, 1, -1) };
        long[] TestAssert = { 8, 13 };
        CollectionAssert.AreEqual(TestAssert, Testcodes);
    }
 //TODO: CalculateAdjacent Offset Random, do negative values
 public void CalculateAdjacent_Test2_Offset1Random()
 {
     {
         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 - 1),
                                              rnd.Next(0, coordlimit - 1), rnd.Next(0, coordlimit - 1));
             long    n    = lc.Vec3ToLoc(vec, d);
             Vector3 vec1 = (new Vector3(1, 0, 0) + vec);
             long    n1   = lc.Vec3ToLoc(vec1, d);
             long    a    = lc.CalculateAdjacent(n, 2, 1);
             Assert.IsTrue(n1 == a || a == n);
             vec1 = (new Vector3(-1, 0, 0) + vec);
             n1   = lc.Vec3ToLoc(vec1, d);
             a    = lc.CalculateAdjacent(n, 2, -1);
             Assert.IsTrue(n1 == a || a == n);
             vec1 = (new Vector3(0, 1, 0) + vec);
             n1   = lc.Vec3ToLoc(vec1, d);
             a    = lc.CalculateAdjacent(n, 1, 1);
             Assert.IsTrue(n1 == a || a == n);;
             vec1 = (new Vector3(0, -1, 0) + vec);
             n1   = lc.Vec3ToLoc(vec1, d);
             a    = lc.CalculateAdjacent(n, 1, -1);
             Assert.IsTrue(n1 == a || a == n);
             vec1 = (new Vector3(0, 0, 1) + vec);
             n1   = lc.Vec3ToLoc(vec1, d);
             a    = lc.CalculateAdjacent(n, 0, 1);
             Assert.IsTrue(n1 == a || a == n);
             vec1 = (new Vector3(0, 0, -1) + vec);
             n1   = lc.Vec3ToLoc(vec1, d);
             a    = lc.CalculateAdjacent(n, 0, -1);
             Assert.IsTrue(n1 == a || a == n);
         }
     }
 }
Ejemplo 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;
    }
Ejemplo 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();
        }
    }