예제 #1
0
    public void EditorTessEnd()
    {
        if (mTessellationJob == null || LOD == null)
        {
            return;
        }
        //save data
        MTQuadTreeHeader header = new MTQuadTreeHeader(DataName);

        header.QuadTreeDepth = QuadTreeDepth;
        header.BoundMin      = VolumnBound.min;
        header.BoundMax      = VolumnBound.max;
        header.LOD           = LOD.Length;
        foreach (var m in mTessellationJob.mesh)
        {
            MTMeshHeader mh = new MTMeshHeader(m.meshId, m.center);
            header.Meshes.Add(m.meshId, mh);
            MTFileUtils.SaveMesh(DataName, m);
        }
        MTLog.Log("mesh saved!");
        MTFileUtils.SaveQuadTreeHeader(DataName, header, Terrain.activeTerrain.terrainData.alphamapTextureCount);
        MTLog.Log("header saved!");
        string matPath = "Assets/MightyTerrainMesh/Resources";

        MTMatUtils.SaveMaterials(matPath, DataName, Terrain.activeTerrain);
        MTLog.Log("material saved!");
    }
예제 #2
0
 public void EditorCreatePreview()
 {
     if (DataName == "")
     {
         Debug.LogError("data should have a name");
         return;
     }
     try
     {
         Transform[] lodParent = new Transform[LOD.Length];
         for (int i = 0; i < LOD.Length; ++i)
         {
             GameObject lodGo = new GameObject("LOD" + i);
             lodGo.transform.parent = transform;
             lodParent[i]           = lodGo.transform;
         }
         MTQuadTreeHeader header = MTFileUtils.LoadQuadTreeHeader(DataName);
         Debug.LogError("RuntimeMats:" + header.RuntimeMats.Length);
         for (int i = 0; i < header.RuntimeMats.Length; i++)
         {
             Debug.LogError("name:" + header.RuntimeMats[i].name);
         }
         foreach (var m in header.Meshes.Values)
         {
             Mesh[] lods = new Mesh[LOD.Length];
             MTFileUtils.LoadMesh(lods, DataName, m.MeshID);
             for (int i = 0; i < LOD.Length; ++i)
             {
                 MeshFilter   meshF;
                 MeshRenderer meshR;
                 GameObject   meshGo = new GameObject("meshObj" + i);
                 meshGo.transform.parent = lodParent[i];
                 meshF            = meshGo.AddComponent <MeshFilter>();
                 meshR            = meshGo.AddComponent <MeshRenderer>();
                 meshR.materials  = header.RuntimeMats;
                 meshF.sharedMesh = lods[i];
             }
         }
     }
     catch
     {
         Debug.LogError("failed to load datas");
     }
 }
예제 #3
0
    private void Awake()
    {
        if (DataName == "")
        {
            return;
        }
        m_Go = new GameObject("Chunk");
        m_Go.Reset();

        try
        {
            m_Header = MTFileUtils.LoadQuadTreeHeader(DataName);

            m_Root = new MTQuadTreeNode(m_Header.QuadTreeDepth, m_Header.BoundMin, m_Header.BoundMax, Vector3.zero);
            foreach (var mh in m_Header.Meshes.Values)
            {
                m_Root.AddMesh(mh);
            }
            int gridMax = 1 << m_Header.QuadTreeDepth;               //1<< X 相当于 2的X次方
            mVisiblePatches = new MTArray <uint>(gridMax * gridMax); //(int)Mathf.Pow(2, 2 * m_Header.QuadTreeDepth)

            if (lodPolicy.Length < m_Header.LOD)
            {
                float[] policy = new float[m_Header.LOD];
                for (int i = 0; i < lodPolicy.Length; ++i)
                {
                    policy[i] = lodPolicy[i];
                }
                lodPolicy = policy;
            }
            lodPolicy[0] = Mathf.Clamp(lodPolicy[0], 0.5f * m_Root.Bound.size.x / gridMax, lodPolicy[0]);
            lodPolicy[lodPolicy.Length - 1] = float.MaxValue;
        }
        catch
        {
            m_Header = null;
            m_Root   = null;
            Debug.LogError("MTLoader load quadtree header failed");
        }

        m_Camera = GetComponent <Camera>();
    }
예제 #4
0
 private void Awake()
 {
     if (DataName == "")
     {
         return;
     }
     try
     {
         mHeader = MTFileUtils.LoadQuadTreeHeader(DataName);
         mRoot   = new MTQuadTreeNode(mHeader.QuadTreeDepth, mHeader.BoundMin, mHeader.BoundMax);
         foreach (var mh in mHeader.Meshes.Values)
         {
             mRoot.AddMesh(mh);
         }
         int gridMax = 1 << mHeader.QuadTreeDepth;
         mVisiblePatches = new MTArray <uint>(gridMax * gridMax);
         if (lodPolicy.Length < mHeader.LOD)
         {
             float[] policy = new float[mHeader.LOD];
             for (int i = 0; i < lodPolicy.Length; ++i)
             {
                 policy[i] = lodPolicy[i];
             }
             lodPolicy = policy;
         }
         lodPolicy[0] = Mathf.Clamp(lodPolicy[0], 0.5f * mRoot.Bound.size.x / gridMax, lodPolicy[0]);
         lodPolicy[lodPolicy.Length - 1] = float.MaxValue;
     }
     catch
     {
         mHeader = null;
         mRoot   = null;
         MTLog.LogError("MTLoader load quadtree header failed");
     }
     mCamera = GetComponent <Camera>();
 }