//===================================================================================================================== // Helper functions to Generate the Octree and then Pack it //===================================================================================================================== //send all scene Geometry(OBBs) to the Octree class void StreamGeometry() { MeshRenderer[] allMesh = FindObjectsOfType(typeof(MeshRenderer)) as MeshRenderer[]; Octree.AABB volume = new Octree.AABB(); //this is the volume of the Octree Root node Vector3 p = transform.position; volume.Max.x = p.x + VoxelSize; volume.Max.y = p.y + VoxelSize; volume.Max.z = p.z + VoxelSize; volume.Min.x = p.x - VoxelSize; volume.Min.y = p.y - VoxelSize; volume.Min.z = p.z - VoxelSize; //All the AABBs for (int i = 0; i < allMesh.Length; ++i) { if (allMesh[i].enabled == false) { continue; } //world position bounds Octree.AABB meshAABB = new Octree.AABB(); meshAABB.Max = allMesh[i].bounds.max; meshAABB.Min = allMesh[i].bounds.min; if (IsInOctree(meshAABB, volume)) { //Now Because Unity uses AABBs for all its bounds we first have to construct our own OBBs Octree.OBB obb = new Octree.OBB(); Vector3 c = allMesh[i].bounds.center; Mesh m = allMesh[i].gameObject.GetComponent <MeshFilter>().sharedMesh; obb.c = c; obb.e = m.bounds.extents; obb.s = allMesh[i].transform.localScale; //if it's a sphere use AABB instead if (m == SphereExample) { obb.x = c + Vector3.right; obb.y = c + Vector3.up; obb.z = c + Vector3.forward; } else { obb.x = c + allMesh[i].transform.right; obb.y = c + allMesh[i].transform.up; obb.z = c + allMesh[i].transform.forward; } Octree.All_OBBs.Add(obb); } } }
bool IsInOctree(Octree.AABB A, Octree.AABB B) { //http://www.miguelcasillas.com/?p=30 return(A.Max.x > B.Min.x && A.Min.x < B.Max.x && A.Max.y > B.Min.y && A.Min.y < B.Max.y && A.Max.z > B.Min.z && A.Min.z < B.Max.z); }
// Use this for initialization void Awake() { meshRenderer = GetComponent <MeshRenderer>(); meshFilter = GetComponent <MeshFilter>(); obb = new Octree.OBB(); if (aabb == null) { aabb = new Octree.AABB(); aabb.Min = new Vector3(-size, -size, -size); aabb.Max = new Vector3(size, size, size); } }