Example #1
0
 void OnDestroy()
 {
     if (m_Mesh != null)
     {
         m_Mesh.Release();
     }
     m_Mesh              = null;
     m_OcTree            = null;
     m_BuildMeshCallBack = null;
 }
Example #2
0
 /// <summary>
 /// 重新加载八叉树
 /// </summary>
 /// <returns></returns>
 bool ReLoadOcTree()
 {
     if (string.IsNullOrEmpty(m_OcTreeName))
     {
         return(false);
     }
     m_OcTree = Resources.Load <MeshOcTree>(m_OcTreeName);
     if (m_OcTree == null)
     {
         return(false);
     }
     return(true);
 }
Example #3
0
    void Start()
    {
        if (string.IsNullOrEmpty(ocTreeName))
        {
            return;
        }
        m_OcTree = Resources.Load <MeshOcTree>(ocTreeName);
        if (m_OcTree == null)
        {
            return;
        }
        m_OcTreeName = ocTreeName;

        //m_Handle = OcTreeTriggerHandle;
        m_BuildMeshCallBack = BuildProjectorMesh;

        m_Mesh = new OctProjectorMesh();

        m_IsInitialized = true;
    }
Example #4
0
    private void BuildOcTree()
    {
        if (m_GameObject == null)
        {
            return;
        }
        MeshFilter[] mf = null;
        if (m_ContainChilds)
        {
            mf = m_GameObject.GetComponentsInChildren <MeshFilter>();
        }
        else
        {
            MeshFilter m = m_GameObject.GetComponent <MeshFilter>();
            if (m)
            {
                mf = new MeshFilter[] { m }
            }
            ;
            else
            {
                return;
            }
        }
        if (mf.Length == 0)
        {
            return;
        }

        float maxX = -Mathf.Infinity;
        float minX = Mathf.Infinity;
        float maxY = -Mathf.Infinity;
        float minY = Mathf.Infinity;
        float maxZ = -Mathf.Infinity;
        float minZ = Mathf.Infinity;

        List <OTMeshTriangle> triangles = new List <OTMeshTriangle>();

        EditorUtility.ClearProgressBar();

        for (int i = 0; i < mf.Length; i++)
        {
            if (mf[i].sharedMesh == null)
            {
                continue;
            }

            for (int j = 0; j < mf[i].sharedMesh.triangles.Length; j += 3)
            {
                EditorUtility.DisplayProgressBar("生成OcTree", "正在计算包围盒", ((float)j) / mf[i].sharedMesh.triangles.Length);

                Vector3 p1 =
                    mf[i].transform.localToWorldMatrix.MultiplyPoint(
                        mf[i].sharedMesh.vertices[mf[i].sharedMesh.triangles[j]]);
                Vector3 p2 =
                    mf[i].transform.localToWorldMatrix.MultiplyPoint(
                        mf[i].sharedMesh.vertices[mf[i].sharedMesh.triangles[j + 1]]);
                Vector3 p3 =
                    mf[i].transform.localToWorldMatrix.MultiplyPoint(
                        mf[i].sharedMesh.vertices[mf[i].sharedMesh.triangles[j + 2]]);

                maxX = Mathf.Max(maxX, p1.x, p2.x, p3.x);
                maxY = Mathf.Max(maxY, p1.y, p2.y, p3.y);
                maxZ = Mathf.Max(maxZ, p1.z, p2.z, p3.z);

                minX = Mathf.Min(minX, p1.x, p2.x, p3.x);
                minY = Mathf.Min(minY, p1.y, p2.y, p3.y);
                minZ = Mathf.Min(minZ, p1.z, p2.z, p3.z);

                OTMeshTriangle triangle = new OTMeshTriangle(p1, p2, p3);

                triangles.Add(triangle);
            }
        }

        Vector3 size = new Vector3(maxX - minX, maxY - minY, maxZ - minZ);

        if (size.x <= 0)
        {
            size.x = 0.1f;
        }
        if (size.y <= 0)
        {
            size.y = 0.1f;
        }
        if (size.z <= 0)
        {
            size.z = 0.1f;
        }
        Vector3 center = new Vector3(minX, minY, minZ) + size / 2;

        MeshOcTree tree = MeshOcTree.CreateInstance <MeshOcTree>();

        tree.Build(center, size * 1.1f, 5);
        for (int i = 0; i < triangles.Count; i++)
        {
            EditorUtility.DisplayProgressBar("生成OcTree", "正在生成OcTree", ((float)i) / triangles.Count);
            tree.Add(triangles[i]);
        }

        EditorUtility.ClearProgressBar();


        //if (!string.IsNullOrEmpty(path))
        //{
        //
        //    AssetDatabase.CreateAsset(tree, path);
        //}
        //else
        //{
        ProjectWindowUtil.CreateAsset(tree, "Assets/Resources/New OcTree.asset");
        //}
    }
Example #5
0
 void OnEnable()
 {
     m_Target = (MeshOcTree)target;
 }