private static void EndRenderingImpl(TreeManager tm, RenderManager.CameraInfo cameraInfo) { unsafe { if (Input.GetKeyDown(KeyCode.F5) && Event.current.control) { DebugOutputPanel.AddMessage(PluginManager.MessageType.Message, string.Format("TreeLimit: TreeCount={0}, TreeLimit={1}, CanPlaceMoreTrees={2}", tm.m_treeCount, LimitTreeManager.Helper.TreeLimit, tm.CheckLimits())); Array32<TreeInstance> mTrees = tm.m_trees; DebugOutputPanel.AddMessage(PluginManager.MessageType.Message, string.Format("TreeLimit: ArraySize={0}, ItemCount={1}, UnusedCount={2}", mTrees.m_size, mTrees.ItemCount(), mTrees.GetType().GetField("m_unusedCount", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(mTrees))); } FastList<RenderGroup> mRenderedGroups = Singleton<RenderManager>.instance.m_renderedGroups; for (int i = 0; i < mRenderedGroups.m_size; i++) { RenderGroup mBuffer = mRenderedGroups.m_buffer[i]; if ((mBuffer.m_instanceMask & 1 << (tm.m_treeLayer & 31)) != 0) { int mX = mBuffer.m_x * 540 / 45; int mZ = mBuffer.m_z * 540 / 45; int num = (mBuffer.m_x + 1) * 540 / 45 - 1; int mZ1 = (mBuffer.m_z + 1) * 540 / 45 - 1; for (int j = mZ; j <= mZ1; j++) { for (int k = mX; k <= num; k++) { uint mTreeGrid = tm.m_treeGrid[j * 540 + k]; int num1 = 0; while (mTreeGrid != 0) { tm.m_trees.m_buffer[mTreeGrid].RenderInstance(cameraInfo, mTreeGrid, mBuffer.m_instanceMask); mTreeGrid = tm.m_trees.m_buffer[mTreeGrid].m_nextGridTree; int num2 = num1 + 1; num1 = num2; if (num2 < LimitTreeManager.Helper.TreeLimit) { continue; } CODebugBase<LogChannel>.Error(LogChannel.Core, string.Concat("Invalid list detected!\n", Environment.StackTrace)); break; } } } } } int num3 = PrefabCollection<TreeInfo>.PrefabCount(); for (int l = 0; l < num3; l++) { TreeInfo prefab = PrefabCollection<TreeInfo>.GetPrefab((uint)l); if (prefab != null && prefab.m_lodCount != 0) { TreeInstance.RenderLod(cameraInfo, prefab); } } } }