From 6ad2e2e4220526363a79e8fd04123210905339d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Sat, 27 Jun 2015 13:24:04 +0200 Subject: [PATCH 01/10] Get rid of CoreRegistry usage in some config classes. --- .../src/main/java/org/terasology/config/BindsConfig.java | 5 ++--- .../src/main/java/org/terasology/config/InputConfig.java | 6 ++++-- .../main/java/org/terasology/config/RenderingConfig.java | 7 ++++--- .../org/terasology/logic/players/DebugControlSystem.java | 8 ++++++-- .../mainMenu/inputSettings/InputSettingsScreen.java | 5 ++++- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/engine/src/main/java/org/terasology/config/BindsConfig.java b/engine/src/main/java/org/terasology/config/BindsConfig.java index b7f54542b45..a1433964cda 100644 --- a/engine/src/main/java/org/terasology/config/BindsConfig.java +++ b/engine/src/main/java/org/terasology/config/BindsConfig.java @@ -49,7 +49,6 @@ import org.terasology.module.ResolutionResult; import org.terasology.module.predicates.FromModule; import org.terasology.naming.Name; -import org.terasology.registry.CoreRegistry; import java.lang.annotation.Annotation; import java.lang.reflect.Type; @@ -126,8 +125,8 @@ public void setBinds(SimpleUri bindUri, Iterable inputs) { /** * @return A new BindsConfig, with inputs set from the DefaultBinding annotations on bind classes */ - public static BindsConfig createDefault() { - ModuleManager moduleManager = CoreRegistry.get(ModuleManager.class); + public static BindsConfig createDefault(Context context) { + ModuleManager moduleManager = context.get(ModuleManager.class); BindsConfig config = new BindsConfig(); DependencyResolver resolver = new DependencyResolver(moduleManager.getRegistry()); for (Name moduleId : moduleManager.getRegistry().getModuleIds()) { diff --git a/engine/src/main/java/org/terasology/config/InputConfig.java b/engine/src/main/java/org/terasology/config/InputConfig.java index d922b136af6..82ad00b82bf 100644 --- a/engine/src/main/java/org/terasology/config/InputConfig.java +++ b/engine/src/main/java/org/terasology/config/InputConfig.java @@ -15,6 +15,8 @@ */ package org.terasology.config; +import org.terasology.context.Context; + /** * @author Immortius */ @@ -36,8 +38,8 @@ public void setMouseSensitivity(float mouseSensitivity) { this.mouseSensitivity = mouseSensitivity; } - public void reset() { - binds.setBinds(BindsConfig.createDefault()); + public void reset(Context context) { + binds.setBinds(BindsConfig.createDefault(context)); InputConfig defaultConfig = new InputConfig(); setMouseSensitivity(defaultConfig.mouseSensitivity); setMouseYAxisInverted(defaultConfig.mouseYAxisInverted); diff --git a/engine/src/main/java/org/terasology/config/RenderingConfig.java b/engine/src/main/java/org/terasology/config/RenderingConfig.java index e32155c46df..a67e1b010e4 100644 --- a/engine/src/main/java/org/terasology/config/RenderingConfig.java +++ b/engine/src/main/java/org/terasology/config/RenderingConfig.java @@ -18,6 +18,7 @@ import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.PixelFormat; +import org.terasology.context.Context; import org.terasology.logic.players.LocalPlayer; import org.terasology.network.events.ChangeViewRangeRequest; import org.terasology.registry.CoreRegistry; @@ -139,12 +140,12 @@ public ViewDistance getViewDistance() { return viewDistance; } - public void setViewDistance(ViewDistance viewDistance) { + public void setViewDistance(ViewDistance viewDistance, Context context) { this.viewDistance = viewDistance; // TODO: Remove this, switch to a property change listener - WorldRenderer worldRenderer = CoreRegistry.get(WorldRenderer.class); - LocalPlayer player = CoreRegistry.get(LocalPlayer.class); + WorldRenderer worldRenderer = context.get(WorldRenderer.class); + LocalPlayer player = context.get(LocalPlayer.class); if (player != null) { player.getClientEntity().send(new ChangeViewRangeRequest(viewDistance)); } diff --git a/engine/src/main/java/org/terasology/logic/players/DebugControlSystem.java b/engine/src/main/java/org/terasology/logic/players/DebugControlSystem.java index 99169cdedac..479a83d8268 100755 --- a/engine/src/main/java/org/terasology/logic/players/DebugControlSystem.java +++ b/engine/src/main/java/org/terasology/logic/players/DebugControlSystem.java @@ -18,6 +18,7 @@ import org.lwjgl.input.Mouse; import org.terasology.config.Config; +import org.terasology.context.Context; import org.terasology.engine.GameEngine; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.entitySystem.event.EventPriority; @@ -62,6 +63,9 @@ public class DebugControlSystem extends BaseComponentSystem { @In private Config config; + @In + private Context context; + @In private NUIManager nuiManager; @@ -93,7 +97,7 @@ public void onIncreaseViewDistance(IncreaseViewDistanceButton button, EntityRef int maxViewDistance = ViewDistance.values().length - 1; if (viewDistance != maxViewDistance) { - config.getRendering().setViewDistance(ViewDistance.forIndex((config.getRendering().getViewDistance().getIndex() + 1))); + config.getRendering().setViewDistance(ViewDistance.forIndex((config.getRendering().getViewDistance().getIndex() + 1)), context); } button.consume(); } @@ -104,7 +108,7 @@ public void onDecreaseViewDistance(DecreaseViewDistanceButton button, EntityRef int minViewDistance = 0; if (viewDistance != minViewDistance) { - config.getRendering().setViewDistance(ViewDistance.forIndex((config.getRendering().getViewDistance().getIndex() - 1))); + config.getRendering().setViewDistance(ViewDistance.forIndex((config.getRendering().getViewDistance().getIndex() - 1)), context); } button.consume(); } diff --git a/engine/src/main/java/org/terasology/rendering/nui/layers/mainMenu/inputSettings/InputSettingsScreen.java b/engine/src/main/java/org/terasology/rendering/nui/layers/mainMenu/inputSettings/InputSettingsScreen.java index 4c9a25e3fa0..d009716fb59 100644 --- a/engine/src/main/java/org/terasology/rendering/nui/layers/mainMenu/inputSettings/InputSettingsScreen.java +++ b/engine/src/main/java/org/terasology/rendering/nui/layers/mainMenu/inputSettings/InputSettingsScreen.java @@ -20,6 +20,7 @@ import com.google.common.collect.Sets; import org.terasology.asset.Assets; import org.terasology.config.Config; +import org.terasology.context.Context; import org.terasology.engine.SimpleUri; import org.terasology.engine.module.ModuleManager; import org.terasology.input.BindButtonEvent; @@ -74,6 +75,8 @@ public class InputSettingsScreen extends CoreScreenLayer { @In private InputSystem inputSystem; + @In + private Context context; @Override public void initialise() { @@ -202,7 +205,7 @@ public void setContents(UIWidget contents) { find("reset", UIButton.class).subscribe(new ActivateEventListener() { @Override public void onActivated(UIWidget button) { - config.getInput().reset(); + config.getInput().reset(context); } }); find("close", UIButton.class).subscribe(new ActivateEventListener() { From 9deecccb4e61db61820b9390e522619f5a77c4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Sun, 28 Jun 2015 11:17:27 +0200 Subject: [PATCH 02/10] Fix start of TeraEd by initializating the PathManager earlier. --- .../main/java/org/terasology/editor/TeraEd.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/engine/src/main/java/org/terasology/editor/TeraEd.java b/engine/src/main/java/org/terasology/editor/TeraEd.java index 568b9131105..5779be0089e 100644 --- a/engine/src/main/java/org/terasology/editor/TeraEd.java +++ b/engine/src/main/java/org/terasology/editor/TeraEd.java @@ -66,18 +66,17 @@ public void run() { // If Nimbus is not available, you can set the GUI to another look and feel. logger.warn("Failed to set look and feel to Nimbus", e); } - - LwjglCustomViewPort lwjglCustomViewPort = new LwjglCustomViewPort(); - Collection subsystemList = Lists.newArrayList(new LwjglGraphics(), new LwjglTimer(), new LwjglAudio(), new LwjglInput(), - lwjglCustomViewPort); - - engine = new TerasologyEngine(subsystemList); - mainWindow = new MainWindow(this); - lwjglCustomViewPort.setCustomViewport(mainWindow.getViewport()); - try { + LwjglCustomViewPort lwjglCustomViewPort = new LwjglCustomViewPort(); + Collection subsystemList = Lists.newArrayList(new LwjglGraphics(), new LwjglTimer(), new LwjglAudio(), new LwjglInput(), + lwjglCustomViewPort); + PathManager.getInstance().useDefaultHomePath(); + engine = new TerasologyEngine(subsystemList); + mainWindow = new MainWindow(this); + lwjglCustomViewPort.setCustomViewport(mainWindow.getViewport()); + engine.setHibernationAllowed(false); engine.subscribeToStateChange(mainWindow); From 496e6c3334f6d1cb491dbe22ffa6ecd46af6f8c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 21:28:44 +0200 Subject: [PATCH 03/10] Make the StateIngame use Context intead of CoreRegistry. --- .../terasology/engine/modes/StateIngame.java | 51 +++++++++---------- .../terasology/engine/modes/StateLoading.java | 2 +- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/engine/src/main/java/org/terasology/engine/modes/StateIngame.java b/engine/src/main/java/org/terasology/engine/modes/StateIngame.java index 39621b432d5..fa1ad517269 100644 --- a/engine/src/main/java/org/terasology/engine/modes/StateIngame.java +++ b/engine/src/main/java/org/terasology/engine/modes/StateIngame.java @@ -21,13 +21,12 @@ import org.terasology.assets.module.ModuleAwareAssetTypeManager; import org.terasology.audio.AudioManager; import org.terasology.config.Config; +import org.terasology.context.Context; import org.terasology.engine.ComponentSystemManager; import org.terasology.engine.GameEngine; import org.terasology.engine.GameThread; import org.terasology.engine.module.ModuleManager; import org.terasology.engine.subsystem.DisplayDevice; -import org.terasology.entitySystem.entity.EntityManager; -import org.terasology.entitySystem.entity.EntityRef; import org.terasology.entitySystem.entity.internal.EngineEntityManager; import org.terasology.entitySystem.event.internal.EventSystem; import org.terasology.entitySystem.systems.UpdateSubscriberSystem; @@ -42,13 +41,11 @@ import org.terasology.network.NetworkSystem; import org.terasology.persistence.StorageManager; import org.terasology.physics.engine.PhysicsEngine; -import org.terasology.registry.CoreRegistry; import org.terasology.rendering.nui.NUIManager; import org.terasology.rendering.nui.databinding.ReadOnlyBinding; import org.terasology.rendering.oculusVr.OculusVrHelper; import org.terasology.rendering.world.WorldRenderer; import org.terasology.rendering.world.WorldRenderer.WorldRenderingStage; -import org.terasology.world.block.BlockManager; import org.terasology.world.chunks.ChunkProvider; import java.util.Collections; @@ -72,6 +69,7 @@ public class StateIngame implements GameState { private CameraTargetSystem cameraTargetSystem; private InputSystem inputSystem; private NetworkSystem networkSystem; + private Context context; /* GAME LOOP */ private boolean pauseGame; @@ -80,25 +78,26 @@ public class StateIngame implements GameState { private GameManifest gameManifest; - public StateIngame(GameManifest gameManifest) { + public StateIngame(GameManifest gameManifest, Context context) { this.gameManifest = gameManifest; + this.context = context; } @Override public void init(GameEngine engine) { // context from loading state gets used. - nuiManager = CoreRegistry.get(NUIManager.class); - worldRenderer = CoreRegistry.get(WorldRenderer.class); - eventSystem = CoreRegistry.get(EventSystem.class); - componentSystemManager = CoreRegistry.get(ComponentSystemManager.class); - entityManager = (EngineEntityManager) CoreRegistry.get(EntityManager.class); - cameraTargetSystem = CoreRegistry.get(CameraTargetSystem.class); - inputSystem = CoreRegistry.get(InputSystem.class); + nuiManager = context.get(NUIManager.class); + worldRenderer = context.get(WorldRenderer.class); + eventSystem = context.get(EventSystem.class); + componentSystemManager = context.get(ComponentSystemManager.class); + entityManager = context.get(EngineEntityManager.class); + cameraTargetSystem = context.get(CameraTargetSystem.class); + inputSystem = context.get(InputSystem.class); eventSystem.registerEventHandler(nuiManager); - networkSystem = CoreRegistry.get(NetworkSystem.class); - storageManager = CoreRegistry.get(StorageManager.class); + networkSystem = context.get(NetworkSystem.class); + storageManager = context.get(StorageManager.class); - if (CoreRegistry.get(Config.class).getRendering().isOculusVrSupport() + if (context.get(Config.class).getRendering().isOculusVrSupport() && OculusVrHelper.isNativeLibraryLoaded()) { logger.info("Trying to initialize Oculus SDK..."); @@ -111,19 +110,19 @@ public void init(GameEngine engine) { nuiManager.getHUD().bindVisible(new ReadOnlyBinding() { @Override public Boolean get() { - return !CoreRegistry.get(Config.class).getRendering().getDebug().isHudHidden(); + return !context.get(Config.class).getRendering().getDebug().isHudHidden(); } }); } @Override public void dispose() { - if (CoreRegistry.get(Config.class).getRendering().isOculusVrSupport() && OculusVrHelper.isNativeLibraryLoaded()) { + if (context.get(Config.class).getRendering().isOculusVrSupport() && OculusVrHelper.isNativeLibraryLoaded()) { logger.info("Shutting down Oculus SDK..."); TeraOVR.clear(); } - ChunkProvider chunkProvider = CoreRegistry.get(ChunkProvider.class); + ChunkProvider chunkProvider = context.get(ChunkProvider.class); chunkProvider.dispose(); boolean save = networkSystem.getMode().isAuthority(); @@ -137,7 +136,7 @@ public void dispose() { GameThread.processWaitingProcesses(); nuiManager.clear(); - CoreRegistry.get(AudioManager.class).stopAllSounds(); + context.get(AudioManager.class).stopAllSounds(); if (worldRenderer != null) { worldRenderer.dispose(); @@ -145,21 +144,21 @@ public void dispose() { } componentSystemManager.shutdown(); - CoreRegistry.get(PhysicsEngine.class).dispose(); + context.get(PhysicsEngine.class).dispose(); entityManager.clear(); if (storageManager != null) { storageManager.finishSavingAndShutdown(); } - ModuleEnvironment oldEnvironment = CoreRegistry.get(ModuleManager.class).getEnvironment(); - ModuleEnvironment environment = CoreRegistry.get(ModuleManager.class).loadEnvironment(Collections.emptySet(), true); + ModuleEnvironment oldEnvironment = context.get(ModuleManager.class).getEnvironment(); + ModuleEnvironment environment = context.get(ModuleManager.class).loadEnvironment(Collections.emptySet(), true); - CoreRegistry.get(ModuleAwareAssetTypeManager.class).switchEnvironment(environment); + context.get(ModuleAwareAssetTypeManager.class).switchEnvironment(environment); if (oldEnvironment != null) { oldEnvironment.close(); } - CoreRegistry.get(Console.class).dispose(); + context.get(Console.class).dispose(); GameThread.clearWaitingProcesses(); /* @@ -204,11 +203,11 @@ private boolean shouldUpdateWorld() { @Override public void render() { - DisplayDevice displayDevice = CoreRegistry.get(DisplayDevice.class); + DisplayDevice displayDevice = context.get(DisplayDevice.class); displayDevice.prepareToRender(); if (worldRenderer != null) { - if (!CoreRegistry.get(Config.class).getRendering().isOculusVrSupport()) { + if (!context.get(Config.class).getRendering().isOculusVrSupport()) { worldRenderer.render(WorldRenderingStage.MONO); } else { worldRenderer.render(WorldRenderingStage.LEFT_EYE); diff --git a/engine/src/main/java/org/terasology/engine/modes/StateLoading.java b/engine/src/main/java/org/terasology/engine/modes/StateLoading.java index 7be27920b6d..3c90eb85ae6 100644 --- a/engine/src/main/java/org/terasology/engine/modes/StateLoading.java +++ b/engine/src/main/java/org/terasology/engine/modes/StateLoading.java @@ -244,7 +244,7 @@ public void update(float delta) { if (current == null) { nuiManager.closeScreen(loadingScreen); nuiManager.setHUDVisible(true); - context.get(GameEngine.class).changeState(new StateIngame(gameManifest)); + context.get(GameEngine.class).changeState(new StateIngame(gameManifest, context)); } else { float progressValue = (progress + current.getExpectedCost() * current.getProgress()) / maxProgress; loadingScreen.updateStatus(current.getMessage(), progressValue); From e7861d77a2e5bf52799040d015d8b063ca2b6446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 21:31:54 +0200 Subject: [PATCH 04/10] Get rid of CoreRegistry usage in TeraEd. It is done by getting the context from the StateIngame. It is the only context that contains the wanted property providers. Only during StateIngame it was actually getting something from the CoreRegisty. --- .../java/org/terasology/editor/TeraEd.java | 5 +- .../editor/properties/SceneProperties.java | 26 +++++++-- .../org/terasology/editor/ui/MainWindow.java | 55 +++++++++++++------ .../terasology/engine/modes/StateIngame.java | 3 + 4 files changed, 65 insertions(+), 24 deletions(-) diff --git a/engine/src/main/java/org/terasology/editor/TeraEd.java b/engine/src/main/java/org/terasology/editor/TeraEd.java index 5779be0089e..f1f9c4c982d 100644 --- a/engine/src/main/java/org/terasology/editor/TeraEd.java +++ b/engine/src/main/java/org/terasology/editor/TeraEd.java @@ -46,7 +46,7 @@ public final class TeraEd extends JWindow { private TerasologyEngine engine; private final Logger logger = LoggerFactory.getLogger(TeraEd.class); - private final SceneProperties sceneProperties = new SceneProperties(); + private SceneProperties sceneProperties; public static void main(String[] args) { new TeraEd().run(); @@ -74,7 +74,8 @@ public void run() { PathManager.getInstance().useDefaultHomePath(); engine = new TerasologyEngine(subsystemList); - mainWindow = new MainWindow(this); + sceneProperties = new SceneProperties(engine); + mainWindow = new MainWindow(this, engine); lwjglCustomViewPort.setCustomViewport(mainWindow.getViewport()); engine.setHibernationAllowed(false); diff --git a/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java b/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java index acfa5b583b6..f6a30ab1863 100644 --- a/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java +++ b/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java @@ -16,7 +16,10 @@ package org.terasology.editor.properties; import com.google.common.collect.Lists; -import org.terasology.registry.CoreRegistry; +import org.terasology.context.Context; +import org.terasology.engine.TerasologyEngine; +import org.terasology.engine.modes.GameState; +import org.terasology.engine.modes.StateIngame; import org.terasology.rendering.backdrop.BackdropProvider; import org.terasology.rendering.backdrop.BackdropRenderer; import org.terasology.rendering.opengl.LwjglRenderingProcess; @@ -27,18 +30,33 @@ * @author Benjamin Glatzel */ public class SceneProperties implements PropertyProvider { + + private final TerasologyEngine engine; + + public SceneProperties(TerasologyEngine engine) { + this.engine = engine; + } + @Override public List> getProperties() { List> result = Lists.newArrayList(); - BackdropProvider backdropProvider = CoreRegistry.get(BackdropProvider.class); + + GameState gameState = engine.getState(); + if (!(gameState instanceof StateIngame)) { + return result; + } + StateIngame ingameState = (StateIngame) gameState; + Context ingameContext = ingameState.getContext(); + + BackdropProvider backdropProvider = ingameContext.get(BackdropProvider.class); if (backdropProvider != null) { result.addAll(new ReflectionProvider(backdropProvider).getProperties()); } - BackdropRenderer backdropRenderer = CoreRegistry.get(BackdropRenderer.class); + BackdropRenderer backdropRenderer = ingameContext.get(BackdropRenderer.class); if (backdropRenderer != null) { result.addAll(new ReflectionProvider(backdropRenderer).getProperties()); } - LwjglRenderingProcess renderingProcess = CoreRegistry.get(LwjglRenderingProcess.class); + LwjglRenderingProcess renderingProcess = ingameContext.get(LwjglRenderingProcess.class); if (renderingProcess != null) { result.addAll(new ReflectionProvider(renderingProcess).getProperties()); } diff --git a/engine/src/main/java/org/terasology/editor/ui/MainWindow.java b/engine/src/main/java/org/terasology/editor/ui/MainWindow.java index 9df6cbdbe3c..4030957ad32 100644 --- a/engine/src/main/java/org/terasology/editor/ui/MainWindow.java +++ b/engine/src/main/java/org/terasology/editor/ui/MainWindow.java @@ -18,16 +18,26 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.assets.management.AssetManager; +import org.terasology.context.Context; import org.terasology.editor.TeraEd; import org.terasology.editor.properties.PropertyProvider; import org.terasology.editor.properties.ReflectionProvider; import org.terasology.engine.StateChangeSubscriber; -import org.terasology.registry.CoreRegistry; +import org.terasology.engine.TerasologyEngine; +import org.terasology.engine.modes.GameState; +import org.terasology.engine.modes.StateIngame; import org.terasology.rendering.assets.material.Material; import org.terasology.rendering.opengl.GLSLMaterial; -import javax.swing.*; -import java.awt.*; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.ScrollPaneConstants; +import java.awt.BorderLayout; +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; @@ -45,6 +55,7 @@ public final class MainWindow extends JFrame implements ActionListener, WindowLi private static final Logger logger = LoggerFactory.getLogger(MainWindow.class); private TeraEd teraEd; + private TerasologyEngine engine; private BorderLayout borderLayout; private Viewport viewport; @@ -65,9 +76,10 @@ public final class MainWindow extends JFrame implements ActionListener, WindowLi private JScrollPane propertyPanelScrollPane; - public MainWindow(TeraEd teraEd) { + public MainWindow(TeraEd teraEd, TerasologyEngine engine) { this.teraEd = teraEd; this.addWindowListener(this); + this.engine = engine; viewport = new Viewport(); @@ -123,23 +135,30 @@ public Viewport getViewport() { public void onStateChange() { shaderPropertyMenuEntries.clear(); shaderPropertiesMenu.removeAll(); - AssetManager assetManager = CoreRegistry.get(AssetManager.class); - for (Material material : assetManager.getLoadedAssets(Material.class)) { - GLSLMaterial finalMat = (GLSLMaterial) material; - if (finalMat.getShaderParameters() != null) { - final PropertyProvider provider = new ReflectionProvider(finalMat.getShaderParameters()); - if (!provider.getProperties().isEmpty()) { - final String programName = material.getUrn().toString(); - JMenuItem menuItem = new JMenuItem(programName); - menuItem.addActionListener(e -> { - propertyPanel.setActivePropertyProvider(provider); - propertyPanel.setTitle(programName); - }); - shaderPropertyMenuEntries.add(menuItem); - shaderPropertiesMenu.add(menuItem); + GameState gameState = engine.getState(); + if (gameState instanceof StateIngame) { + StateIngame stateIngame = (StateIngame) gameState; + Context ingameContext = stateIngame.getContext(); + AssetManager assetManager = ingameContext.get(AssetManager.class); + for (Material material : assetManager.getLoadedAssets(Material.class)) { + GLSLMaterial finalMat = (GLSLMaterial) material; + if (finalMat.getShaderParameters() != null) { + final PropertyProvider provider = new ReflectionProvider(finalMat.getShaderParameters()); + if (!provider.getProperties().isEmpty()) { + final String programName = material.getUrn().toString(); + JMenuItem menuItem = new JMenuItem(programName); + menuItem.addActionListener(e -> { + propertyPanel.setActivePropertyProvider(provider); + propertyPanel.setTitle(programName); + }); + shaderPropertyMenuEntries.add(menuItem); + shaderPropertiesMenu.add(menuItem); + } } } } + + } @Override diff --git a/engine/src/main/java/org/terasology/engine/modes/StateIngame.java b/engine/src/main/java/org/terasology/engine/modes/StateIngame.java index fa1ad517269..8431dfcb128 100644 --- a/engine/src/main/java/org/terasology/engine/modes/StateIngame.java +++ b/engine/src/main/java/org/terasology/engine/modes/StateIngame.java @@ -261,4 +261,7 @@ public boolean isGamePaused() { return pauseGame; } + public Context getContext() { + return context; + } } From 0c268500d46cc4a7bcdbaf6948c87af08790c26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 21:43:00 +0200 Subject: [PATCH 05/10] Get rid of CoreRegistry usage in ReflectionProvider. --- .../editor/properties/ReflectionProvider.java | 14 +++++++------- .../editor/properties/SceneProperties.java | 6 +++--- .../java/org/terasology/editor/ui/MainWindow.java | 3 ++- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/engine/src/main/java/org/terasology/editor/properties/ReflectionProvider.java b/engine/src/main/java/org/terasology/editor/properties/ReflectionProvider.java index 74b7d964ac4..f1db2260d1d 100644 --- a/engine/src/main/java/org/terasology/editor/properties/ReflectionProvider.java +++ b/engine/src/main/java/org/terasology/editor/properties/ReflectionProvider.java @@ -18,14 +18,14 @@ import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.terasology.context.Context; +import org.terasology.editor.EditorRange; +import org.terasology.engine.SimpleUri; +import org.terasology.reflection.copy.CopyStrategyLibrary; import org.terasology.reflection.metadata.ClassMetadata; import org.terasology.reflection.metadata.DefaultClassMetadata; import org.terasology.reflection.metadata.FieldMetadata; -import org.terasology.reflection.copy.CopyStrategyLibrary; import org.terasology.reflection.reflect.ReflectFactory; -import org.terasology.editor.EditorRange; -import org.terasology.registry.CoreRegistry; -import org.terasology.engine.SimpleUri; import java.lang.reflect.Field; import java.util.List; @@ -45,10 +45,10 @@ public class ReflectionProvider implements PropertyProvider { private List> properties = Lists.newArrayList(); - public ReflectionProvider(T target) { + public ReflectionProvider(T target, Context context) { try { - ReflectFactory reflectFactory = CoreRegistry.get(ReflectFactory.class); - CopyStrategyLibrary copyStrategies = CoreRegistry.get(CopyStrategyLibrary.class); + ReflectFactory reflectFactory = context.get(ReflectFactory.class); + CopyStrategyLibrary copyStrategies = context.get(CopyStrategyLibrary.class); ClassMetadata classMetadata = new DefaultClassMetadata<>(new SimpleUri(), (Class) target.getClass(), reflectFactory, copyStrategies); for (Field field : getAllFields(target.getClass(), and(withAnnotation(EditorRange.class), or(withType(Float.TYPE), withType(Float.class))))) { EditorRange range = field.getAnnotation(EditorRange.class); diff --git a/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java b/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java index f6a30ab1863..ccb154e6abb 100644 --- a/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java +++ b/engine/src/main/java/org/terasology/editor/properties/SceneProperties.java @@ -50,15 +50,15 @@ public List> getProperties() { BackdropProvider backdropProvider = ingameContext.get(BackdropProvider.class); if (backdropProvider != null) { - result.addAll(new ReflectionProvider(backdropProvider).getProperties()); + result.addAll(new ReflectionProvider(backdropProvider, ingameContext).getProperties()); } BackdropRenderer backdropRenderer = ingameContext.get(BackdropRenderer.class); if (backdropRenderer != null) { - result.addAll(new ReflectionProvider(backdropRenderer).getProperties()); + result.addAll(new ReflectionProvider(backdropRenderer, ingameContext).getProperties()); } LwjglRenderingProcess renderingProcess = ingameContext.get(LwjglRenderingProcess.class); if (renderingProcess != null) { - result.addAll(new ReflectionProvider(renderingProcess).getProperties()); + result.addAll(new ReflectionProvider(renderingProcess, ingameContext).getProperties()); } return result; } diff --git a/engine/src/main/java/org/terasology/editor/ui/MainWindow.java b/engine/src/main/java/org/terasology/editor/ui/MainWindow.java index 4030957ad32..429d41ce6f7 100644 --- a/engine/src/main/java/org/terasology/editor/ui/MainWindow.java +++ b/engine/src/main/java/org/terasology/editor/ui/MainWindow.java @@ -143,7 +143,8 @@ public void onStateChange() { for (Material material : assetManager.getLoadedAssets(Material.class)) { GLSLMaterial finalMat = (GLSLMaterial) material; if (finalMat.getShaderParameters() != null) { - final PropertyProvider provider = new ReflectionProvider(finalMat.getShaderParameters()); + final PropertyProvider provider = new ReflectionProvider(finalMat.getShaderParameters(), + ingameContext); if (!provider.getProperties().isEmpty()) { final String programName = material.getUrn().toString(); JMenuItem menuItem = new JMenuItem(programName); From 3fa575e3100d074d465f750af99c6f1effa402ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 21:47:59 +0200 Subject: [PATCH 06/10] Get rid of CoreRegistry usage in HeadlessSateChangeListener. --- .../headless/mode/HeadlessStateChangeListener.java | 8 +++++++- .../src/main/java/org/terasology/engine/Terasology.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/HeadlessStateChangeListener.java b/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/HeadlessStateChangeListener.java index 8d391b9c9c7..a13f68453d0 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/HeadlessStateChangeListener.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/HeadlessStateChangeListener.java @@ -17,6 +17,7 @@ import org.terasology.engine.GameEngine; import org.terasology.engine.StateChangeSubscriber; +import org.terasology.engine.TerasologyEngine; import org.terasology.engine.modes.GameState; import org.terasology.engine.modes.StateMainMenu; import org.terasology.registry.CoreRegistry; @@ -27,9 +28,14 @@ */ public class HeadlessStateChangeListener implements StateChangeSubscriber { + private final TerasologyEngine engine; + + public HeadlessStateChangeListener(TerasologyEngine engine) { + this.engine = engine; + } + @Override public void onStateChange() { - GameEngine engine = CoreRegistry.get(GameEngine.class); GameState state = engine.getState(); if (state instanceof StateMainMenu) { engine.shutdown(); diff --git a/facades/PC/src/main/java/org/terasology/engine/Terasology.java b/facades/PC/src/main/java/org/terasology/engine/Terasology.java index 8a3b1257d10..0a0a10599e6 100644 --- a/facades/PC/src/main/java/org/terasology/engine/Terasology.java +++ b/facades/PC/src/main/java/org/terasology/engine/Terasology.java @@ -132,7 +132,7 @@ public static void main(String[] args) { } if (isHeadless) { - engine.subscribeToStateChange(new HeadlessStateChangeListener()); + engine.subscribeToStateChange(new HeadlessStateChangeListener(engine)); engine.run(new StateHeadlessSetup()); } else { if (loadLastGame) { From 3e94414d5181e11a7e6dae124663280a4d33938e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 21:51:03 +0200 Subject: [PATCH 07/10] Get rid of CoreRegistry usage in the CacheBlocks step. --- .../java/org/terasology/engine/modes/StateLoading.java | 4 ++-- .../engine/modes/loadProcesses/CacheBlocks.java | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/engine/src/main/java/org/terasology/engine/modes/StateLoading.java b/engine/src/main/java/org/terasology/engine/modes/StateLoading.java index 3c90eb85ae6..ace78a6f941 100644 --- a/engine/src/main/java/org/terasology/engine/modes/StateLoading.java +++ b/engine/src/main/java/org/terasology/engine/modes/StateLoading.java @@ -149,7 +149,7 @@ private void initClient() { loadProcesses.add(new RegisterBlocks(context, gameManifest)); loadProcesses.add(new RegisterBiomes(context, gameManifest)); loadProcesses.add(new InitialiseGraphics(context)); - loadProcesses.add(new CacheBlocks()); + loadProcesses.add(new CacheBlocks(context)); loadProcesses.add(new LoadPrefabs()); loadProcesses.add(new ProcessBlockPrefabs(context)); loadProcesses.add(new InitialiseComponentSystemManager(context)); @@ -174,7 +174,7 @@ private void initHost() { loadProcesses.add(new RegisterBlocks(context, gameManifest)); loadProcesses.add(new RegisterBiomes(context, gameManifest)); loadProcesses.add(new InitialiseGraphics(context)); - loadProcesses.add(new CacheBlocks()); + loadProcesses.add(new CacheBlocks(context)); loadProcesses.add(new LoadPrefabs()); loadProcesses.add(new ProcessBlockPrefabs(context)); loadProcesses.add(new InitialiseComponentSystemManager(context)); diff --git a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/CacheBlocks.java b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/CacheBlocks.java index f57ab6eb576..f9ae39ea9eb 100644 --- a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/CacheBlocks.java +++ b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/CacheBlocks.java @@ -16,7 +16,7 @@ package org.terasology.engine.modes.loadProcesses; -import org.terasology.registry.CoreRegistry; +import org.terasology.context.Context; import org.terasology.world.block.BlockManager; import org.terasology.world.block.family.BlockFamily; @@ -27,8 +27,13 @@ */ public class CacheBlocks extends StepBasedLoadProcess { + private final Context context; private Iterator blockFamilyIterator; + public CacheBlocks(Context context) { + this.context = context; + } + @Override public String getMessage() { return "Caching Blocks..."; @@ -48,7 +53,7 @@ public boolean step() { @Override public void begin() { - BlockManager blockManager = CoreRegistry.get(BlockManager.class); + BlockManager blockManager = context.get(BlockManager.class); blockFamilyIterator = blockManager.listRegisteredBlockFamilies().iterator(); setTotalSteps(blockManager.getBlockFamilyCount()); } From 1170943a3b15275ce7942d0a3c42dd0eb7abe740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 21:56:32 +0200 Subject: [PATCH 08/10] LoadPrefabs: Use AssetManager from Context instead of Assets class. --- .../org/terasology/HeadlessEnvironment.java | 2 +- .../TerasologyTestingEnvironment.java | 9 +-------- .../terasology/engine/modes/StateLoading.java | 4 ++-- .../modes/loadProcesses/LoadPrefabs.java | 18 ++++++++++-------- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/engine-tests/src/main/java/org/terasology/HeadlessEnvironment.java b/engine-tests/src/main/java/org/terasology/HeadlessEnvironment.java index 82288321ccd..3039d390314 100644 --- a/engine-tests/src/main/java/org/terasology/HeadlessEnvironment.java +++ b/engine-tests/src/main/java/org/terasology/HeadlessEnvironment.java @@ -298,7 +298,7 @@ protected void setupComponentManager() { @Override protected void loadPrefabs() { - LoadPrefabs prefabLoadStep = new LoadPrefabs(); + LoadPrefabs prefabLoadStep = new LoadPrefabs(context); boolean complete = false; prefabLoadStep.begin(); diff --git a/engine-tests/src/main/java/org/terasology/TerasologyTestingEnvironment.java b/engine-tests/src/main/java/org/terasology/TerasologyTestingEnvironment.java index 96a863821cd..44dcbf8c827 100644 --- a/engine-tests/src/main/java/org/terasology/TerasologyTestingEnvironment.java +++ b/engine-tests/src/main/java/org/terasology/TerasologyTestingEnvironment.java @@ -16,7 +16,6 @@ package org.terasology; -import com.google.common.collect.Lists; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.nio.file.ShrinkWrapFileSystems; import org.jboss.shrinkwrap.api.spec.JavaArchive; @@ -31,17 +30,12 @@ import org.terasology.context.Context; import org.terasology.engine.ComponentSystemManager; import org.terasology.engine.EngineTime; -import org.terasology.engine.TerasologyEngine; import org.terasology.engine.Time; import org.terasology.engine.bootstrap.EntitySystemSetupUtil; import org.terasology.engine.modes.loadProcesses.LoadPrefabs; import org.terasology.engine.module.ModuleManager; import org.terasology.engine.paths.PathManager; import org.terasology.entitySystem.entity.internal.EngineEntityManager; -import org.terasology.module.ClasspathModule; -import org.terasology.module.ModuleMetadata; -import org.terasology.module.ModuleRegistry; -import org.terasology.module.TableModuleRegistry; import org.terasology.naming.Name; import org.terasology.network.NetworkSystem; import org.terasology.network.internal.NetworkSystemImpl; @@ -52,7 +46,6 @@ import java.nio.file.FileSystem; import java.nio.file.Path; -import java.util.Arrays; import static org.mockito.Mockito.mock; @@ -115,7 +108,7 @@ public void setup() throws Exception { componentSystemManager = new ComponentSystemManager(context); context.put(ComponentSystemManager.class, componentSystemManager); - LoadPrefabs prefabLoadStep = new LoadPrefabs(); + LoadPrefabs prefabLoadStep = new LoadPrefabs(context); boolean complete = false; prefabLoadStep.begin(); diff --git a/engine/src/main/java/org/terasology/engine/modes/StateLoading.java b/engine/src/main/java/org/terasology/engine/modes/StateLoading.java index ace78a6f941..4aebc62dd6e 100644 --- a/engine/src/main/java/org/terasology/engine/modes/StateLoading.java +++ b/engine/src/main/java/org/terasology/engine/modes/StateLoading.java @@ -150,7 +150,7 @@ private void initClient() { loadProcesses.add(new RegisterBiomes(context, gameManifest)); loadProcesses.add(new InitialiseGraphics(context)); loadProcesses.add(new CacheBlocks(context)); - loadProcesses.add(new LoadPrefabs()); + loadProcesses.add(new LoadPrefabs(context)); loadProcesses.add(new ProcessBlockPrefabs(context)); loadProcesses.add(new InitialiseComponentSystemManager(context)); loadProcesses.add(new RegisterInputSystem(context)); @@ -175,7 +175,7 @@ private void initHost() { loadProcesses.add(new RegisterBiomes(context, gameManifest)); loadProcesses.add(new InitialiseGraphics(context)); loadProcesses.add(new CacheBlocks(context)); - loadProcesses.add(new LoadPrefabs()); + loadProcesses.add(new LoadPrefabs(context)); loadProcesses.add(new ProcessBlockPrefabs(context)); loadProcesses.add(new InitialiseComponentSystemManager(context)); loadProcesses.add(new RegisterInputSystem(context)); diff --git a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/LoadPrefabs.java b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/LoadPrefabs.java index e194b69da2e..8686cfeef85 100644 --- a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/LoadPrefabs.java +++ b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/LoadPrefabs.java @@ -16,10 +16,9 @@ package org.terasology.engine.modes.loadProcesses; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.asset.Assets; import org.terasology.assets.ResourceUrn; +import org.terasology.assets.management.AssetManager; +import org.terasology.context.Context; import org.terasology.entitySystem.prefab.Prefab; import java.util.Iterator; @@ -28,10 +27,13 @@ * @author Immortius */ public class LoadPrefabs extends StepBasedLoadProcess { - private static final Logger logger = LoggerFactory.getLogger(LoadPrefabs.class); - + private final AssetManager assetManager; private Iterator prefabs; + public LoadPrefabs(Context context) { + this.assetManager = context.get(AssetManager.class); + } + @Override public String getMessage() { return "Loading Prefabs..."; @@ -40,7 +42,7 @@ public String getMessage() { @Override public boolean step() { if (prefabs.hasNext()) { - Assets.get(prefabs.next(), Prefab.class); + assetManager.getAsset(prefabs.next(), Prefab.class); stepDone(); } return !prefabs.hasNext(); @@ -48,8 +50,8 @@ public boolean step() { @Override public void begin() { - prefabs = Assets.list(Prefab.class).iterator(); - setTotalSteps(Assets.list(Prefab.class).size()); + prefabs = assetManager.getAvailableAssets(Prefab.class).iterator(); + setTotalSteps(assetManager.getAvailableAssets(Prefab.class).size()); } @Override From ae0b363673a9b0565e239f4ae277f7e59e60965e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 21:59:42 +0200 Subject: [PATCH 09/10] Minimize CoreRegistry usage in StateHeadlessSetup. --- .../subsystem/headless/mode/StateHeadlessSetup.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/StateHeadlessSetup.java b/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/StateHeadlessSetup.java index 669e876c4d2..5006bf4ab09 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/StateHeadlessSetup.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/headless/mode/StateHeadlessSetup.java @@ -64,23 +64,24 @@ public class StateHeadlessSetup implements GameState { private EngineEntityManager entityManager; private EventSystem eventSystem; private ComponentSystemManager componentSystemManager; + private Context context; public StateHeadlessSetup() { } @Override public void init(GameEngine gameEngine) { - Context context = gameEngine.createChildContext(); + context = gameEngine.createChildContext(); CoreRegistry.setContext(context); // let's get the entity event system running EntitySystemSetupUtil.addEntityManagementRelatedClasses(context); entityManager = context.get(EngineEntityManager.class); - eventSystem = CoreRegistry.get(EventSystem.class); + eventSystem = context.get(EventSystem.class); context.put(Console.class, new ConsoleImpl()); - NUIManager nuiManager = CoreRegistry.get(NUIManager.class); + NUIManager nuiManager = context.get(NUIManager.class); ((NUIManagerInternal) nuiManager).refreshWidgetsLibrary(); componentSystemManager = new ComponentSystemManager(context); @@ -109,8 +110,8 @@ public void init(GameEngine gameEngine) { private GameManifest createGameManifest() { GameManifest gameManifest = new GameManifest(); - Config config = CoreRegistry.get(Config.class); - ModuleManager moduleManager = CoreRegistry.get(ModuleManager.class); + Config config = context.get(Config.class); + ModuleManager moduleManager = context.get(ModuleManager.class); for (Name moduleName : config.getDefaultModSelection().listModules()) { Module module = moduleManager.getRegistry().getLatestModuleVersion(moduleName); if (module != null) { From 3ab55d323671f51cc706ff3c38973129202e0750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=B6berle?= Date: Mon, 29 Jun 2015 22:16:06 +0200 Subject: [PATCH 10/10] Simplify the creation of the world renderer by using the Context class. The original motivation was to get rid of CoreRegistry usage. --- .../loadProcesses/InitialiseRemoteWorld.java | 4 +--- .../modes/loadProcesses/InitialiseWorld.java | 4 +--- .../subsystem/RenderingSubsystemFactory.java | 9 ++------ .../HeadlessRenderingSubsystemFactory.java | 13 +++++------ .../renderer/HeadlessWorldRenderer.java | 18 +++++++-------- .../lwjgl/LwjglRenderingSubsystemFactory.java | 11 +++------- .../rendering/world/WorldRendererImpl.java | 22 ++++++++++++------- 7 files changed, 35 insertions(+), 46 deletions(-) diff --git a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseRemoteWorld.java b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseRemoteWorld.java index 156a9504b21..8d586f2acd8 100644 --- a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseRemoteWorld.java +++ b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseRemoteWorld.java @@ -22,7 +22,6 @@ import org.terasology.engine.subsystem.RenderingSubsystemFactory; import org.terasology.game.GameManifest; import org.terasology.logic.players.LocalPlayer; -import org.terasology.logic.players.LocalPlayerSystem; import org.terasology.network.NetworkSystem; import org.terasology.rendering.backdrop.BackdropProvider; import org.terasology.rendering.backdrop.BackdropRenderer; @@ -87,8 +86,7 @@ public boolean step() { context.put(BackdropRenderer.class, backdropRenderer); RenderingSubsystemFactory engineSubsystemFactory = context.get(RenderingSubsystemFactory.class); - WorldRenderer worldRenderer = engineSubsystemFactory.createWorldRenderer(backdropProvider, backdropRenderer, - worldProvider, chunkProvider, context.get(LocalPlayerSystem.class)); + WorldRenderer worldRenderer = engineSubsystemFactory.createWorldRenderer(context); float reflectionHeight = context.get(NetworkSystem.class).getServer().getInfo().getReflectionHeight(); worldRenderer.getActiveCamera().setReflectionHeight(reflectionHeight); context.put(WorldRenderer.class, worldRenderer); diff --git a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseWorld.java b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseWorld.java index 14f37663e5d..b2aa42b1385 100644 --- a/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseWorld.java +++ b/engine/src/main/java/org/terasology/engine/modes/loadProcesses/InitialiseWorld.java @@ -31,7 +31,6 @@ import org.terasology.entitySystem.entity.internal.EngineEntityManager; import org.terasology.game.GameManifest; import org.terasology.logic.players.LocalPlayer; -import org.terasology.logic.players.LocalPlayerSystem; import org.terasology.module.ModuleEnvironment; import org.terasology.persistence.StorageManager; import org.terasology.persistence.internal.ReadOnlyStorageManager; @@ -149,8 +148,7 @@ public boolean step() { context.put(BackdropRenderer.class, backdropRenderer); RenderingSubsystemFactory engineSubsystemFactory = context.get(RenderingSubsystemFactory.class); - WorldRenderer worldRenderer = engineSubsystemFactory.createWorldRenderer(backdropProvider, backdropRenderer, - worldProvider, chunkProvider, context.get(LocalPlayerSystem.class)); + WorldRenderer worldRenderer = engineSubsystemFactory.createWorldRenderer(context); context.put(WorldRenderer.class, worldRenderer); // TODO: These shouldn't be done here, nor so strongly tied to the world renderer diff --git a/engine/src/main/java/org/terasology/engine/subsystem/RenderingSubsystemFactory.java b/engine/src/main/java/org/terasology/engine/subsystem/RenderingSubsystemFactory.java index b98af0e1365..3908e173ec2 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/RenderingSubsystemFactory.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/RenderingSubsystemFactory.java @@ -15,16 +15,11 @@ */ package org.terasology.engine.subsystem; -import org.terasology.logic.players.LocalPlayerSystem; -import org.terasology.rendering.backdrop.BackdropProvider; -import org.terasology.rendering.backdrop.BackdropRenderer; +import org.terasology.context.Context; import org.terasology.rendering.world.WorldRenderer; -import org.terasology.world.WorldProvider; -import org.terasology.world.chunks.ChunkProvider; public interface RenderingSubsystemFactory { - WorldRenderer createWorldRenderer(BackdropProvider backdropProvider, BackdropRenderer backdropRenderer, - WorldProvider worldProvider, ChunkProvider chunkProvider, LocalPlayerSystem localPlayerSystem); + WorldRenderer createWorldRenderer(Context context); } diff --git a/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessRenderingSubsystemFactory.java b/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessRenderingSubsystemFactory.java index efce990d8f4..de4c53e8c47 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessRenderingSubsystemFactory.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessRenderingSubsystemFactory.java @@ -15,19 +15,16 @@ */ package org.terasology.engine.subsystem.headless.renderer; +import org.terasology.context.Context; import org.terasology.engine.subsystem.RenderingSubsystemFactory; -import org.terasology.logic.players.LocalPlayerSystem; -import org.terasology.rendering.backdrop.BackdropProvider; -import org.terasology.rendering.backdrop.BackdropRenderer; import org.terasology.rendering.world.WorldRenderer; -import org.terasology.world.WorldProvider; -import org.terasology.world.chunks.ChunkProvider; public class HeadlessRenderingSubsystemFactory implements RenderingSubsystemFactory { @Override - public WorldRenderer createWorldRenderer(BackdropProvider backdropProvider, BackdropRenderer backdropRenderer, - WorldProvider worldProvider, ChunkProvider chunkProvider, LocalPlayerSystem localPlayerSystem) { - return new HeadlessWorldRenderer(worldProvider, chunkProvider, localPlayerSystem); + public WorldRenderer createWorldRenderer(Context context) { + return new HeadlessWorldRenderer(context); } + + } diff --git a/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java b/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java index 17e4ac59c4f..474b4c7d8c9 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/headless/renderer/HeadlessWorldRenderer.java @@ -17,13 +17,13 @@ import com.google.common.collect.Lists; import org.terasology.config.Config; +import org.terasology.context.Context; import org.terasology.logic.players.LocalPlayer; import org.terasology.logic.players.LocalPlayerSystem; import org.terasology.math.Region3i; import org.terasology.math.geom.Vector3f; import org.terasology.math.geom.Vector3i; import org.terasology.monitoring.PerformanceMonitor; -import org.terasology.registry.CoreRegistry; import org.terasology.rendering.cameras.Camera; import org.terasology.rendering.world.ViewDistance; import org.terasology.rendering.world.WorldRenderer; @@ -53,12 +53,12 @@ public class HeadlessWorldRenderer implements WorldRenderer { private Config config; - public HeadlessWorldRenderer(WorldProvider worldProvider, ChunkProvider chunkProvider, LocalPlayerSystem localPlayerSystem) { - this.worldProvider = worldProvider; - this.chunkProvider = chunkProvider; - + public HeadlessWorldRenderer(Context context) { + this.worldProvider = context.get(WorldProvider.class); + this.chunkProvider = context.get(ChunkProvider.class); + LocalPlayerSystem localPlayerSystem = context.get(LocalPlayerSystem.class); localPlayerSystem.setPlayerCamera(noCamera); - config = CoreRegistry.get(Config.class); + config = context.get(Config.class); } @Override @@ -274,17 +274,17 @@ private Vector3i calcCamChunkOffset() { (int) (getActiveCamera().getPosition().z / ChunkConstants.SIZE_Z)); } - private static float distanceToCamera(RenderableChunk chunk) { + private float distanceToCamera(RenderableChunk chunk) { Vector3f result = new Vector3f((chunk.getPosition().x + 0.5f) * ChunkConstants.SIZE_X, 0, (chunk.getPosition().z + 0.5f) * ChunkConstants.SIZE_Z); - Vector3f cameraPos = CoreRegistry.get(WorldRenderer.class).getActiveCamera().getPosition(); + Vector3f cameraPos = getActiveCamera().getPosition(); result.x -= cameraPos.x; result.z -= cameraPos.z; return result.length(); } - private static class ChunkFrontToBackComparator implements Comparator { + private class ChunkFrontToBackComparator implements Comparator { @Override public int compare(RenderableChunk o1, RenderableChunk o2) { diff --git a/engine/src/main/java/org/terasology/engine/subsystem/lwjgl/LwjglRenderingSubsystemFactory.java b/engine/src/main/java/org/terasology/engine/subsystem/lwjgl/LwjglRenderingSubsystemFactory.java index 673355e9970..6829f351119 100644 --- a/engine/src/main/java/org/terasology/engine/subsystem/lwjgl/LwjglRenderingSubsystemFactory.java +++ b/engine/src/main/java/org/terasology/engine/subsystem/lwjgl/LwjglRenderingSubsystemFactory.java @@ -15,14 +15,10 @@ */ package org.terasology.engine.subsystem.lwjgl; +import org.terasology.context.Context; import org.terasology.engine.subsystem.RenderingSubsystemFactory; -import org.terasology.logic.players.LocalPlayerSystem; -import org.terasology.rendering.backdrop.BackdropProvider; -import org.terasology.rendering.backdrop.BackdropRenderer; import org.terasology.rendering.world.WorldRenderer; import org.terasology.rendering.world.WorldRendererImpl; -import org.terasology.world.WorldProvider; -import org.terasology.world.chunks.ChunkProvider; public class LwjglRenderingSubsystemFactory implements RenderingSubsystemFactory { @@ -33,8 +29,7 @@ public LwjglRenderingSubsystemFactory(GLBufferPool bufferPool) { } @Override - public WorldRenderer createWorldRenderer(BackdropProvider backdropProvider, BackdropRenderer backdropRenderer, - WorldProvider worldProvider, ChunkProvider chunkProvider, LocalPlayerSystem localPlayerSystem) { - return new WorldRendererImpl(backdropProvider, backdropRenderer, worldProvider, chunkProvider, localPlayerSystem, bufferPool); + public WorldRenderer createWorldRenderer(Context context) { + return new WorldRendererImpl(context, bufferPool); } } diff --git a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java index cdfe915bbbd..33167241ea7 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -21,6 +21,7 @@ import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.config.RenderingDebugConfig; +import org.terasology.context.Context; import org.terasology.engine.ComponentSystemManager; import org.terasology.engine.subsystem.lwjgl.GLBufferPool; import org.terasology.entitySystem.entity.EntityManager; @@ -106,19 +107,21 @@ public enum ChunkRenderMode { private ComponentSystemManager systemManager = CoreRegistry.get(ComponentSystemManager.class); - private Config config = CoreRegistry.get(Config.class); - private RenderingConfig renderingConfig = config.getRendering(); - private RenderingDebugConfig renderingDebugConfig = renderingConfig.getDebug(); + private final Config config; + private final RenderingConfig renderingConfig; + private final RenderingDebugConfig renderingDebugConfig; private LwjglRenderingProcess renderingProcess; private GraphicState graphicState; private PostProcessor postProcessor; - public WorldRendererImpl(BackdropProvider backdropProvider, BackdropRenderer backdropRenderer, - WorldProvider worldProvider, ChunkProvider chunkProvider, LocalPlayerSystem localPlayerSystem, GLBufferPool bufferPool) { - this.worldProvider = worldProvider; - this.backdropProvider = backdropProvider; - this.backdropRenderer = backdropRenderer; + public WorldRendererImpl(Context context, GLBufferPool bufferPool) { + this.worldProvider = context.get(WorldProvider.class); + this.backdropProvider = context.get(BackdropProvider.class); + this.backdropRenderer = context.get(BackdropRenderer.class); + this.config = context.get(Config.class); + this.renderingConfig = config.getRendering(); + this.renderingDebugConfig = renderingConfig.getDebug(); // TODO: won't need localPlayerSystem here once camera is in the ES proper if (renderingConfig.isOculusVrSupport()) { @@ -129,10 +132,13 @@ public WorldRendererImpl(BackdropProvider backdropProvider, BackdropRenderer bac playerCamera = new PerspectiveCamera(renderingConfig.getCameraSettings()); currentRenderingStage = WorldRenderingStage.MONO; } + LocalPlayerSystem localPlayerSystem = context.get(LocalPlayerSystem.class); localPlayerSystem.setPlayerCamera(playerCamera); initMainDirectionalLight(); + ChunkProvider chunkProvider = context.get(ChunkProvider.class); + renderableWorld = new RenderableWorldImpl(worldProvider, chunkProvider, bufferPool, playerCamera, shadowMapCamera); renderQueues = renderableWorld.getRenderQueues();