private void ReleaseOldData() { Assert.IsTrue(m_objects.Count == m_renderers.Count); for (int i = 0; i < m_objects.Count; i++) { var go = m_objects[i]; // If the component does not exist it means nothing else has been added as well if (go == null) { continue; } #if DEBUG go.name = m_prefabName; #endif MeshFilter filter = go.GetComponent <MeshFilter>(); filter.sharedMesh.Clear(false); Globals.MemPools.MeshPool.Push(filter.sharedMesh); filter.sharedMesh = null; Renderer renderer = go.GetComponent <Renderer>(); renderer.sharedMaterial = null; GameObjectProvider.PushObject(m_prefabName, go); } m_objects.Clear(); m_renderers.Clear(); }
/// <summary> /// Creates a mesh and commits it to the engine. Bounding box set according to value passed in bounds /// </summary> public void Commit(Vector3 position, Quaternion rotation, ref Bounds bounds #if DEBUG , string debugName = null #endif ) { ReleaseOldData(); for (int j = 0; j < m_buffers.Length; j++) { var holder = m_buffers[j]; var material = (m_materials == null || m_materials.Length < 1) ? null : m_materials[j]; for (int i = 0; i < holder.Count; i++) { ColliderGeometryBuffer buffer = holder[i]; // No data means there's no mesh to build if (buffer.IsEmpty) { continue; } // Create a game object for collider. Unfortunatelly, we can't use object pooling // here. Unity3D would have to rebake the geometry of the old object because of a // change in its position and that is very time consuming. GameObject prefab = GameObjectProvider.GetPool(m_prefabName).Prefab; GameObject go = Object.Instantiate(prefab); go.transform.parent = GameObjectProvider.Instance.ProviderGameObject.transform; { #if DEBUG go.name = string.Format(debugName, "_", i.ToString()); #endif Mesh mesh = Globals.MemPools.MeshPool.Pop(); Assert.IsTrue(mesh.vertices.Length <= 0); buffer.SetupMesh(mesh, false); mesh.bounds = bounds; MeshCollider collider = go.GetComponent <MeshCollider>(); collider.enabled = true; collider.sharedMesh = null; collider.sharedMesh = mesh; var t = collider.transform; t.position = position; t.rotation = rotation; collider.sharedMaterial = material; m_objects.Add(go); } buffer.Clear(); } } }
/// <summary> /// Finalize the draw calls /// </summary> public void Commit(Vector3 position, Quaternion rotation, PhysicMaterial material #if DEBUG , string debugName = null #endif ) { ReleaseOldData(); // No data means there's no mesh to build if (m_buffers[0].IsEmpty()) { return; } for (int i = 0; i < m_buffers.Count; i++) { GeometryBuffer buffer = m_buffers[i]; // Create a game object for collider. Unfortunatelly, we can't use object pooling // here for otherwise, unity would have to rebake because of change in object position // and that is very time consuming. GameObject prefab = GameObjectProvider.GetPool(m_prefabName).Prefab; GameObject go = Object.Instantiate(prefab); go.transform.parent = GameObjectProvider.Instance.ProviderGameObject.transform; { #if DEBUG if (!string.IsNullOrEmpty(debugName)) { go.name = debugName; if (i > 0) { go.name = go.name + "_" + i; } } #endif Mesh mesh = Globals.MemPools.MeshPool.Pop(); Assert.IsTrue(mesh.vertices.Length <= 0); UnityMeshBuilder.BuildColliderMesh(mesh, buffer); MeshCollider collider = go.GetComponent <MeshCollider>(); collider.sharedMesh = null; collider.sharedMesh = mesh; collider.transform.position = position; collider.transform.rotation = rotation; collider.sharedMaterial = material; m_objects.Add(go); m_colliders.Add(collider); } buffer.Clear(); } }
/// <summary> /// Finalize the draw calls /// </summary> public void Commit(Vector3 position, Quaternion rotation, ref Bounds bounds #if DEBUG , string debugName = null #endif ) { ReleaseOldData(); for (int j = 0; j < Buffers.Length; j++) { var holder = Buffers[j]; var material = (m_materials == null || m_materials.Length < 1) ? null : m_materials[j]; for (int i = 0; i < holder.Count; i++) { var buffer = holder[i]; // No data means there's no mesh to build if (buffer.IsEmpty) { continue; } var go = GameObjectProvider.PopObject(m_prefabName); Assert.IsTrue(go != null); if (go != null) { #if DEBUG go.name = string.Format(debugName, "_", i.ToString()); #endif Mesh mesh = Globals.MemPools.MeshPool.Pop(); Assert.IsTrue(mesh.vertices.Length <= 0); buffer.SetupMesh(mesh, false); mesh.bounds = bounds; MeshFilter filter = go.GetComponent <MeshFilter>(); filter.sharedMesh = null; filter.sharedMesh = mesh; var t = filter.transform; t.position = position; t.rotation = rotation; Renderer renderer = go.GetComponent <Renderer>(); renderer.enabled = true; renderer.sharedMaterial = material; m_objects.Add(go); } buffer.Clear(); } } }
/// <summary> /// Finalize the draw calls /// </summary> public void Commit(Vector3 position, Quaternion rotation, Material material #if DEBUG , string debugName = null #endif ) { ReleaseOldData(); // No data means there's no mesh to build if (m_buffers[0].IsEmpty()) { return; } for (int i = 0; i < m_buffers.Count; i++) { GeometryBuffer buffer = m_buffers[i]; var go = GameObjectProvider.PopObject(m_prefabName); Assert.IsTrue(go != null); if (go != null) { #if DEBUG if (!string.IsNullOrEmpty(debugName)) { go.name = debugName; if (i > 0) { go.name = go.name + "_" + i; } } #endif Mesh mesh = Globals.MemPools.MeshPool.Pop(); Assert.IsTrue(mesh.vertices.Length <= 0); UnityMeshBuilder.BuildGeometryMesh(mesh, buffer); MeshFilter filter = go.GetComponent <MeshFilter>(); filter.sharedMesh = null; filter.sharedMesh = mesh; filter.transform.position = position; filter.transform.rotation = rotation; Renderer renderer = go.GetComponent <Renderer>(); renderer.material = material; m_objects.Add(go); m_renderers.Add(renderer); } buffer.Clear(); } }
/// <summary> /// Finalize the draw calls /// </summary> public void Commit() { ReleaseOldData(); // No data means there's no mesh to build if (m_renderBuffers[0].IsEmpty()) { return; } for (int i = 0; i < m_renderBuffers.Count; i++) { var go = GameObjectProvider.PopObject(GOPChunk); Assert.IsTrue(go != null); if (go != null) { Mesh mesh = Globals.Pools.MeshPool.Pop(); Assert.IsTrue(mesh.vertices.Length <= 0); m_meshBuilder.BuildMesh(mesh, m_renderBuffers[i]); MeshFilter filter = go.GetComponent <MeshFilter>(); filter.sharedMesh = null; filter.sharedMesh = mesh; filter.transform.position = Vector3.zero; m_drawCalls.Add(go); m_drawCallRenderers.Add(go.GetComponent <Renderer>()); } } // Make vertex data available again. We need to make this a task because our pooling system works on a per-thread // basis. Therefore, all Push()-es need to be called on the same thread as their respective Pop()-s. m_chunk.EnqueueGenericTask( () => { LocalPools pools = m_chunk.Pools; for (int i = 0; i < m_renderBuffers.Count; i++) { RenderBuffer buffer = m_renderBuffers[i]; for (int v = 0; v < buffer.Vertices.Count; v++) { pools.PushVertexData(buffer.Vertices[v]); } buffer.Clear(); } }); }
/// <summary> /// Finalize the draw calls /// </summary> public void Commit() { ReleaseOldData(); // No data means there's no mesh to build if (m_buffers[0].IsEmpty()) { return; } for (int i = 0; i < m_buffers.Count; i++) { GeometryBuffer buffer = m_buffers[i]; var go = GameObjectProvider.PopObject(GOPChunk); Assert.IsTrue(go != null); if (go != null) { #if DEBUG if (EngineSettings.CoreConfig.Mutlithreading == false) { go.name = m_chunk.Pos.ToString(); } #endif Mesh mesh = Globals.MemPools.MeshPool.Pop(); Assert.IsTrue(mesh.vertices.Length <= 0); m_meshBuilder.BuildMesh(mesh, buffer); MeshFilter filter = go.GetComponent <MeshFilter>(); filter.sharedMesh = null; filter.sharedMesh = mesh; filter.transform.position = Vector3.zero; filter.transform.rotation = Quaternion.identity; Renderer renderer = go.GetComponent <Renderer>(); //renderer.material = m_chunk.world.chunkMaterial; m_objects.Add(go); m_renderers.Add(renderer); } buffer.Clear(); } }
private void ReleaseOldData() { Assert.IsTrue(m_drawCalls.Count == m_drawCallRenderers.Count); for (int i = 0; i < m_drawCalls.Count; i++) { var go = m_drawCalls[i]; // If the component does not exist it means nothing else has been added as well if (go == null) { continue; } var filter = go.GetComponent <MeshFilter>(); filter.sharedMesh.Clear(false); Globals.Pools.MeshPool.Push(filter.sharedMesh); filter.sharedMesh = null; GameObjectProvider.PushObject(GOPChunk, go); } m_drawCalls.Clear(); m_drawCallRenderers.Clear(); }
public TaskPanelItemProvider(string resourceName, int layer) { this.m_gop = new AssetBundleGameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public LeagueTitleCellProvider(string resourceName, int layer) { this.m_gop = new AssetBundleGameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public ResourceGainImageProvider(string resourceName, int layer) { this.m_gop = new AssetBundleGameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public DungeonDropViewProvider(string resourceName, int layer) { this.m_gop = new GameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public CharacterProvider(int layer) { this.m_gop = new GameObjectProvider(string.Empty, App.Binder.PersistentObjectRootTm, layer); }
public ChestGalleryRowProvider(string resourceName, int layer) { this.m_gop = new AssetBundleGameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public BossHuntTickerCellProvider(string resourceName, int layer) { this.m_gop = new AssetBundleGameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public SkillHudButtonProvider(string resourceName, int layer) { this.m_gop = new AssetBundleGameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public ItemCardProvider(string resourceName, int layer) { this.m_gop = new GameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public CombatTextProviderMenu(string resourceName, int layer) { this.m_gop = new GameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public StatusIndicatorProvider(string resourceName, int layer) { this.m_gop = new GameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }
public DungeonBoostProvider(int layer) { this.m_gop = new GameObjectProvider(string.Empty, App.Binder.PersistentObjectRootTm, layer); }
public MenuTreasureChestProvider(string resourceName, int layer) { this.m_gop = new GameObjectProvider(resourceName, App.Binder.PersistentObjectRootTm, layer); }