Пример #1
0
    //=====================================================================================================================
    // 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);
            }
        }
    }
Пример #2
0
 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);
 }
Пример #3
0
    // 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);
        }
    }