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(); } }
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; }
public void CalculateDepth_Test1_Manual() { OT_LocCode lc = new OT_LocCode(); long[] testdepths = { lc.CalculateDepth(8), lc.CalculateDepth(15), lc.CalculateDepth(12), lc.CalculateDepth(64), lc.CalculateDepth(127), lc.CalculateDepth(93), lc.CalculateDepth(512), lc.CalculateDepth(1023), lc.CalculateDepth(856), lc.CalculateDepth(4096), lc.CalculateDepth(8191), lc.CalculateDepth(5237), lc.CalculateDepth(32768), lc.CalculateDepth(65535), lc.CalculateDepth(60353) }; long[] checkdepths = { 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5 }; CollectionAssert.AreEqual(checkdepths, testdepths); }