diff --git a/assets/Data/fab/disjointedroom1.block b/assets/Data/fab/disjointedroom1.block new file mode 100644 index 00000000..cec50c81 Binary files /dev/null and b/assets/Data/fab/disjointedroom1.block differ diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index b721a044..0ed5cfcd 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1583,6 +1583,8 @@ Grid alignment actually aligns entity to grid Fix door tree physics BlockFab metadata Structure editing tab in editor view +Reduce physics generation calls on GriddedDataCellManager +Fab selection doesn't overflow anymore diff --git a/src/main/java/electrosphere/client/ui/components/FabSelectionPanel.java b/src/main/java/electrosphere/client/ui/components/FabSelectionPanel.java index c2a6065b..af01bc7b 100644 --- a/src/main/java/electrosphere/client/ui/components/FabSelectionPanel.java +++ b/src/main/java/electrosphere/client/ui/components/FabSelectionPanel.java @@ -132,6 +132,7 @@ public class FabSelectionPanel { newButton.setMarginTop(MARGIN_EACH_SIDE); //label Label fabLabel = Label.createLabel(fabFile.getName()); + fabLabel.setMaxWidth(FAB_BUTTON_WIDTH); //icon/model ImagePanel texturePanel = ImagePanel.createImagePanel(AssetDataStrings.TEXTURE_DEFAULT); texturePanel.setWidth(FAB_BUTTON_TEXTURE_DIM); diff --git a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java index bea63049..9794c9c3 100644 --- a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java @@ -151,6 +151,11 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager * Number of data cells cleaned up in the most recent frame */ int numCleaned = 0; + + /** + * Queue of cells that need to have their physics regenerated (ie on block edits) + */ + Map physicsQueue = new HashMap(); /** * Constructor @@ -658,6 +663,20 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager public void simulate(){ Globals.profiler.beginCpuSample("GriddedDataCellManager.simulate"); loadedCellsLock.lock(); + + + //regenerate physics where relevant + terrainEditLock.acquireUninterruptibly(); + if(physicsQueue.size() > 0){ + for(Vector3i pos : physicsQueue.values()){ + this.createTerrainPhysicsEntities(pos); + } + physicsQueue.clear(); + } + terrainEditLock.release(); + + + //micro simulation boolean runMicroSim = Globals.microSimulation != null && Globals.microSimulation.isReady(); for(ServerDataCell cell : this.groundDataCells.values()){ if(runMicroSim && this.shouldSimulate(cell)){ @@ -1041,7 +1060,10 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager ServerDataCell cell = groundDataCells.get(this.getServerDataCellKey(worldPosition)); if(cell != null){ //update physics - this.createTerrainPhysicsEntities(worldPosition); + long key = this.getServerDataCellKey(worldPosition); + if(!this.physicsQueue.containsKey(key)){ + this.physicsQueue.put(key,worldPosition); + } //broadcast update cell.broadcastNetworkMessage(TerrainMessage.constructUpdateBlockMessage(