private bool IsMeshExist(GEOMETRYTYPE meshType, out GeometryMesh mesh, List <System.Object> param = null)
    {
        bool bRet = false;

        mesh = null;

        if (null == m_MeshTbl)
        {
            return(false);
        }

        foreach (var item in m_MeshTbl)
        {
            if (null == item)
            {
                continue;
            }

            if (
                (item.Type == meshType) &&
                item.IsMeshEqual(param)
                )
            {
                mesh = item;
                break;
            }
        }

        return(bRet);
    }
    public void ReleaseMesh(GEOMETRYTYPE meshType, List <System.Object> param = null)
    {
        GeometryMesh geometryMesh = null;

        if (IsMeshExist(meshType, out geometryMesh, param = null))
        {
            if (
                (geometryMesh != null) &&
                (geometryMesh.DrawCounter > 0)
                )
            {
                geometryMesh.DrawCounter--;
            }
        }

        return;
    }
    public void GetMesh(GEOMETRYTYPE meshType, out Mesh realMesh, List <System.Object> param = null)
    {
        realMesh = null;
        GeometryMesh geometryMesh = null;

        if (!IsMeshExist(meshType, out geometryMesh, param))
        {
            CreateNewMesh(meshType, out geometryMesh, param);
        }

        if (geometryMesh != null)
        {
            realMesh = geometryMesh.RealMesh;
            geometryMesh.DrawCounter++;
        }

        return;
    }
    private void CreateNewMesh(GEOMETRYTYPE meshType, out GeometryMesh geometryMesh, List <System.Object> param = null)
    {
        geometryMesh = null;

        if (null == m_MeshTbl)
        {
            return;
        }

        do
        {
            if (IsMeshExist(meshType, out geometryMesh, param))
            {
                break;
            }

            switch (meshType)
            {
            case GEOMETRYTYPE.GEOMETRY_TYPE_TAPER:
                geometryMesh = new TaperMesh();
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_RING:
                geometryMesh = new RingMesh();
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_SECTOR:
                geometryMesh = new SectorMesh(param);
                break;

            default:
                break;
            }

            if (geometryMesh != null)
            {
                m_MeshTbl.Add(geometryMesh);
            }
        } while (false);

        return;
    }
    //private void DrawGeometryObjectWithCamera(string id, GEOMETRYTYPE type, Quaternion roration, Vector3 pos, Vector3 size, Material mat, int layer, Camera cam)
    //{
    //    GeometryObject obj = null;

    //    if (
    //           (null == m_ObjectTbl)
    //        && string.IsNullOrEmpty(id)
    //        )
    //    {
    //        return;
    //    }

    //    if (!m_CanDrawObject)
    //    {
    //        Debug.LogError("未执行DrawBegin");
    //        return;
    //    }

    //    CreateGeometryObj(id, type, roration, pos, size, mat, layer, out obj);

    //    if(obj != null)
    //    {
    //        obj.UpdateCustomStatus(cam);
    //    }
    //}

    private void DrawGeometryObject(string id, GEOMETRYTYPE type, Quaternion roration, Vector3 pos, Vector3 size, Material mat, int layer, out GeometryObject obj, List <object> param = null)
    {
        obj = null;

        if (
            (null == m_ObjectTbl) &&
            string.IsNullOrEmpty(id)
            )
        {
            return;
        }

        if (!m_CanDrawObject)
        {
            Debug.LogError("未执行DrawBegin");
            return;
        }

        CreateGeometryObj(id, type, roration, pos, size, mat, layer, out obj, param);
    }
    private void CreateGeometryObj(string id, GEOMETRYTYPE type, Quaternion roration, Vector3 pos, Vector3 size, Material mat, int layer, out GeometryObject obj, List <object> param = null)
    {
        obj = null;

        if (string.IsNullOrEmpty(id))
        {
            return;
        }

        if (!IsObjExist(id, out obj))
        {
            switch (type)
            {
            case GEOMETRYTYPE.GEOMETRY_TYPE_CUBE:
                obj = new CubeObject(id, roration, pos, size, mat, layer);
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_TAPER:
                obj = new TaperObject(id, roration, pos, size, mat, layer);
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_AXIS:
                obj = new AxisObject(id, roration, pos, size, mat, layer);
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_TEXT:
                obj = new TextObject(id, roration, pos, size, mat, layer);
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_RING:
                obj = new RingObject(id, roration, pos, size, mat, layer);
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_SECTOR:
                obj = new SectorObject(id, roration, pos, size, mat, layer, param);
                break;

            case GEOMETRYTYPE.GEOMETRY_TYPE_SPHERE:
                obj = new SphereObject(id, roration, pos, size, mat, layer);
                break;

            default:
                break;
            }


            if (obj != null)
            {
                obj.DrawCounter++;
                m_ObjectTbl.Add(obj);
            }
        }
        else
        {
            if (obj != null)
            {
                obj.Rotation   = roration;
                obj.Position   = pos;
                obj.Scale      = size;
                obj.DefaultMat = mat;
                obj.Layer      = layer;

                obj.DrawCounter++;
            }
        }
    }