From c0973b4acda8d9cc8cc64fef58a6226f26235041 Mon Sep 17 00:00:00 2001 From: vampcat Date: Sat, 12 Aug 2017 06:52:28 +0530 Subject: [PATCH 1/9] Alowed arbitrary output fbo in CopyImageToScreenNode --- .../rendering/dag/DebugCommands.java | 31 ++++++++++ .../dag/nodes/CopyImageToScreenNode.java | 58 ++++++++++++++++++- 2 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java diff --git a/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java b/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java new file mode 100644 index 00000000000..dba149c24a1 --- /dev/null +++ b/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java @@ -0,0 +1,31 @@ +/* + * Copyright 2017 MovingBlocks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.terasology.rendering.dag; + +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.logic.console.commandSystem.annotations.Command; +import org.terasology.logic.console.commandSystem.annotations.CommandParam; +import org.terasology.logic.permission.PermissionManager; +import org.terasology.rendering.dag.nodes.CopyImageToScreenNode; + +@RegisterSystem +public class DebugCommands extends BaseComponentSystem { + @Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION) + public void dagSetOutputFbo(@CommandParam("fboUri") final String fboUri) { + CopyImageToScreenNode.getInstance().setFbo(fboUri); + } +} diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToScreenNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToScreenNode.java index 3d4a4b51a1d..ab40f47ac50 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToScreenNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToScreenNode.java @@ -18,12 +18,14 @@ import org.lwjgl.opengl.Display; import org.terasology.assets.ResourceUrn; import org.terasology.context.Context; +import org.terasology.engine.SimpleUri; import org.terasology.monitoring.PerformanceMonitor; import org.terasology.rendering.dag.ConditionDependentNode; +import org.terasology.rendering.dag.StateChange; import org.terasology.rendering.dag.stateChanges.EnableMaterial; import org.terasology.rendering.dag.stateChanges.SetInputTextureFromFbo; import org.terasology.rendering.opengl.FBO; -import org.terasology.rendering.opengl.FBOManagerSubscriber; +import org.terasology.rendering.opengl.SwappableFBO; import org.terasology.rendering.opengl.fbms.DisplayResolutionDependentFBOs; import org.terasology.rendering.world.WorldRenderer; @@ -37,16 +39,35 @@ public class CopyImageToScreenNode extends ConditionDependentNode { private static final ResourceUrn DEFAULT_TEXTURED_MATERIAL_URN = new ResourceUrn("engine:prog.defaultTextured"); + // TODO: Remove as soon as nodeGraph.findNode(nodeUri) is available + private static CopyImageToScreenNode nodeInstance; + + private DisplayResolutionDependentFBOs displayResolutionDependentFBOs; + private WorldRenderer worldRenderer; + + private FBO lastUpdatedGBuffer; + private FBO staleGBuffer; + + private StateChange bindFbo; + public CopyImageToScreenNode(Context context) { super(context); + displayResolutionDependentFBOs = context.get(DisplayResolutionDependentFBOs.class); + worldRenderer = context.get(WorldRenderer.class); + WorldRenderer worldRenderer = context.get(WorldRenderer.class); requiresCondition(() -> worldRenderer.getCurrentRenderStage() == MONO || worldRenderer.getCurrentRenderStage() == LEFT_EYE); addDesiredStateChange(new EnableMaterial(DEFAULT_TEXTURED_MATERIAL_URN)); - addDesiredStateChange(new SetInputTextureFromFbo(0, FINAL_BUFFER, ColorTexture, - context.get(DisplayResolutionDependentFBOs.class), DEFAULT_TEXTURED_MATERIAL_URN, "texture")); + bindFbo = new SetInputTextureFromFbo(0, FINAL_BUFFER, ColorTexture, displayResolutionDependentFBOs, DEFAULT_TEXTURED_MATERIAL_URN, "texture"); + addDesiredStateChange(bindFbo); + + nodeInstance = this; + SwappableFBO gBufferPair = displayResolutionDependentFBOs.getGBufferPair(); + lastUpdatedGBuffer = gBufferPair.getLastUpdatedFbo(); + staleGBuffer = gBufferPair.getStaleFbo(); } @Override @@ -59,4 +80,35 @@ public void process() { renderFullscreenQuad(); PerformanceMonitor.endActivity(); } + + public static CopyImageToScreenNode getInstance() { + return nodeInstance; + } + + public void setFbo(String fboUri) { + FBO fbo; + + switch (fboUri) { + case "engine:fbo.gBuffer": + case "engine:fbo.lastUpdatedGBuffer": + fbo = lastUpdatedGBuffer; + break; + case "engine:fbo.staleGBuffer": + fbo = staleGBuffer; + break; + default: + // TODO: We should probably do some more error checking here. + fbo = displayResolutionDependentFBOs.get(new SimpleUri(fboUri)); + break; + } + + setFbo(fbo); + } + + private void setFbo(FBO fbo) { + removeDesiredStateChange(bindFbo); + bindFbo = new SetInputTextureFromFbo(0, fbo, ColorTexture, displayResolutionDependentFBOs, DEFAULT_TEXTURED_MATERIAL_URN, "texture"); + addDesiredStateChange(bindFbo); + worldRenderer.requestTaskListRefresh(); + } } From 06b970af8232e1ebb5b72952746c824b97f21ae4 Mon Sep 17 00:00:00 2001 From: vampcat Date: Sat, 12 Aug 2017 06:53:24 +0530 Subject: [PATCH 2/9] Renamed CopyImage*Node to Output*Node --- .../java/org/terasology/rendering/dag/DebugCommands.java | 4 ++-- .../{CopyImageToHMDNode.java => OutputToHMDNode.java} | 4 ++-- ...CopyImageToScreenNode.java => OutputToScreenNode.java} | 8 ++++---- .../org/terasology/rendering/world/WorldRendererImpl.java | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) rename engine/src/main/java/org/terasology/rendering/dag/nodes/{CopyImageToHMDNode.java => OutputToHMDNode.java} (98%) rename engine/src/main/java/org/terasology/rendering/dag/nodes/{CopyImageToScreenNode.java => OutputToScreenNode.java} (95%) diff --git a/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java b/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java index dba149c24a1..693112076b1 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java +++ b/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java @@ -20,12 +20,12 @@ import org.terasology.logic.console.commandSystem.annotations.Command; import org.terasology.logic.console.commandSystem.annotations.CommandParam; import org.terasology.logic.permission.PermissionManager; -import org.terasology.rendering.dag.nodes.CopyImageToScreenNode; +import org.terasology.rendering.dag.nodes.OutputToScreenNode; @RegisterSystem public class DebugCommands extends BaseComponentSystem { @Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION) public void dagSetOutputFbo(@CommandParam("fboUri") final String fboUri) { - CopyImageToScreenNode.getInstance().setFbo(fboUri); + OutputToScreenNode.getInstance().setFbo(fboUri); } } diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToHMDNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToHMDNode.java similarity index 98% rename from engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToHMDNode.java rename to engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToHMDNode.java index 0d019436fbd..ca8d0a841ac 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToHMDNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToHMDNode.java @@ -40,7 +40,7 @@ import static org.terasology.rendering.opengl.ScalingFactors.FULL_SCALE; import static org.terasology.rendering.opengl.fbms.DisplayResolutionDependentFBOs.FINAL_BUFFER; -public class CopyImageToHMDNode extends ConditionDependentNode { +public class OutputToHMDNode extends ConditionDependentNode { private static final SimpleUri LEFT_EYE_FBO_URI = new SimpleUri("engine:fbo.leftEye"); private static final SimpleUri RIGHT_EYE_FBO_URI = new SimpleUri("engine:fbo.rightEye"); private static final ResourceUrn DEFAULT_TEXTURED_MATERIAL_URN = new ResourceUrn("engine:prog.defaultTextured"); @@ -57,7 +57,7 @@ public class CopyImageToHMDNode extends ConditionDependentNode { * Constructs an instance of this node. Specifically, initialize the vrProvider and pass the frame buffer * information for the vrProvider to use. */ - public CopyImageToHMDNode(Context context) { + public OutputToHMDNode(Context context) { super(context); vrProvider = context.get(OpenVRProvider.class); diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToScreenNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java similarity index 95% rename from engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToScreenNode.java rename to engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java index ab40f47ac50..fac13135cc4 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/CopyImageToScreenNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java @@ -36,11 +36,11 @@ import static org.terasology.rendering.world.WorldRenderer.RenderingStage.LEFT_EYE; import static org.terasology.rendering.world.WorldRenderer.RenderingStage.MONO; -public class CopyImageToScreenNode extends ConditionDependentNode { +public class OutputToScreenNode extends ConditionDependentNode { private static final ResourceUrn DEFAULT_TEXTURED_MATERIAL_URN = new ResourceUrn("engine:prog.defaultTextured"); // TODO: Remove as soon as nodeGraph.findNode(nodeUri) is available - private static CopyImageToScreenNode nodeInstance; + private static OutputToScreenNode nodeInstance; private DisplayResolutionDependentFBOs displayResolutionDependentFBOs; private WorldRenderer worldRenderer; @@ -50,7 +50,7 @@ public class CopyImageToScreenNode extends ConditionDependentNode { private StateChange bindFbo; - public CopyImageToScreenNode(Context context) { + public OutputToScreenNode(Context context) { super(context); displayResolutionDependentFBOs = context.get(DisplayResolutionDependentFBOs.class); @@ -81,7 +81,7 @@ public void process() { PerformanceMonitor.endActivity(); } - public static CopyImageToScreenNode getInstance() { + public static OutputToScreenNode getInstance() { return nodeInstance; } 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 e769464914e..d7ef37b8ac5 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -43,8 +43,8 @@ import org.terasology.rendering.dag.nodes.BloomBlurNode; import org.terasology.rendering.dag.nodes.BlurredAmbientOcclusionNode; import org.terasology.rendering.dag.nodes.BufferClearingNode; -import org.terasology.rendering.dag.nodes.CopyImageToHMDNode; -import org.terasology.rendering.dag.nodes.CopyImageToScreenNode; +import org.terasology.rendering.dag.nodes.OutputToHMDNode; +import org.terasology.rendering.dag.nodes.OutputToScreenNode; import org.terasology.rendering.dag.nodes.DeferredMainLightNode; import org.terasology.rendering.dag.nodes.DeferredPointLightsNode; import org.terasology.rendering.dag.nodes.DownSamplerForExposureNode; @@ -448,10 +448,10 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { } private void addCopyOutputNodes(RenderGraph renderGraph) { - Node copyToVRFrameBufferNode = new CopyImageToHMDNode(context); + Node copyToVRFrameBufferNode = new OutputToHMDNode(context); renderGraph.addNode(copyToVRFrameBufferNode, "copyToVRFrameBufferNode"); - Node copyImageToScreenNode = new CopyImageToScreenNode(context); + Node copyImageToScreenNode = new OutputToScreenNode(context); renderGraph.addNode(copyImageToScreenNode, "copyImageToScreenNode"); } From b4582ede3f5bccab0ea51b253babd2cebefa65f1 Mon Sep 17 00:00:00 2001 From: vampcat Date: Mon, 14 Aug 2017 11:37:19 +0530 Subject: [PATCH 3/9] Added findNode() to RenderGraph and handleCommand() to Nodes --- .../renderer/HeadlessWorldRenderer.java | 1 - .../rendering/dag/AbstractNode.java | 15 +++++ .../rendering/dag/DebugCommands.java | 31 ---------- .../org/terasology/rendering/dag/Node.java | 8 +++ .../terasology/rendering/dag/RenderGraph.java | 15 ++++- .../dag/nodes/OutputToScreenNode.java | 42 +++++++------ .../rendering/world/WorldRenderer.java | 1 + .../rendering/world/WorldRendererImpl.java | 59 ++++++++++++++++--- 8 files changed, 110 insertions(+), 62 deletions(-) delete mode 100644 engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java 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 247272eca68..d887329c29d 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 @@ -294,5 +294,4 @@ public int compare(RenderableChunk o1, RenderableChunk o2) { return distance2 > distance ? -1 : 1; } } - } diff --git a/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java b/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java index fff2c1d4847..d5f2c692293 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java @@ -36,6 +36,8 @@ public abstract class AbstractNode implements Node { protected static final Logger logger = LoggerFactory.getLogger(AbstractNode.class); + private String nodeUri; + private Set desiredStateChanges = Sets.newLinkedHashSet(); private Map fboUsages = Maps.newHashMap(); private boolean enabled = true; @@ -95,6 +97,19 @@ public void setEnabled(boolean enabled) { this.enabled = enabled; } + @Override + public void setUri(String nodeUri) { + this.nodeUri = nodeUri; + } + + @Override + public String getUri() { + return nodeUri; + } + + @Override + public void handleCommand(String command, String arg1) { } + /** * Utility method to conveniently retrieve materials from the Assets system, * hiding the relative complexity of the exception handling. diff --git a/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java b/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java deleted file mode 100644 index 693112076b1..00000000000 --- a/engine/src/main/java/org/terasology/rendering/dag/DebugCommands.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2017 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.terasology.rendering.dag; - -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.logic.console.commandSystem.annotations.Command; -import org.terasology.logic.console.commandSystem.annotations.CommandParam; -import org.terasology.logic.permission.PermissionManager; -import org.terasology.rendering.dag.nodes.OutputToScreenNode; - -@RegisterSystem -public class DebugCommands extends BaseComponentSystem { - @Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION) - public void dagSetOutputFbo(@CommandParam("fboUri") final String fboUri) { - OutputToScreenNode.getInstance().setFbo(fboUri); - } -} diff --git a/engine/src/main/java/org/terasology/rendering/dag/Node.java b/engine/src/main/java/org/terasology/rendering/dag/Node.java index 2674acc9237..e05d9c8c001 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/Node.java +++ b/engine/src/main/java/org/terasology/rendering/dag/Node.java @@ -17,6 +17,8 @@ //TODO: consider removing the word "Node" from the name of all Node implementations now that they are in the dag.nodes package. +import org.terasology.engine.SimpleUri; + import java.util.Set; /** @@ -31,4 +33,10 @@ public interface Node extends RenderPipelineTask { boolean isEnabled(); void setEnabled(boolean enabled); + + void setUri(String nodeUri); + + String getUri(); + + void handleCommand(String command, String arg1); } diff --git a/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java b/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java index 6c8bbed5c8b..8275bb85987 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java +++ b/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java @@ -16,6 +16,8 @@ package org.terasology.rendering.dag; import com.google.common.collect.Lists; +import org.terasology.engine.SimpleUri; + import java.util.List; /** @@ -28,11 +30,22 @@ public RenderGraph() { nodes = Lists.newArrayList(); } - public String addNode(Node node, String suggestedId) { + public String addNode(Node node, String suggestedId) { // TODO: Change suggestedId to SimpleUri nodes.add(node); + node.setUri(suggestedId); return suggestedId; // TODO: for instance if "blur" present make id "blur1" and return it } + public Node findNode(String nodeUri) { + for (Node node: nodes) { + if (node.getUri().equals(nodeUri)) { + return node; + } + } + + return null; + } + // TODO: add remove, get, addEdge, removeEdge methods here public List getNodesInTopologicalOrder() { diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java index fac13135cc4..2558de3eadf 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java @@ -39,9 +39,6 @@ public class OutputToScreenNode extends ConditionDependentNode { private static final ResourceUrn DEFAULT_TEXTURED_MATERIAL_URN = new ResourceUrn("engine:prog.defaultTextured"); - // TODO: Remove as soon as nodeGraph.findNode(nodeUri) is available - private static OutputToScreenNode nodeInstance; - private DisplayResolutionDependentFBOs displayResolutionDependentFBOs; private WorldRenderer worldRenderer; @@ -64,7 +61,6 @@ public OutputToScreenNode(Context context) { bindFbo = new SetInputTextureFromFbo(0, FINAL_BUFFER, ColorTexture, displayResolutionDependentFBOs, DEFAULT_TEXTURED_MATERIAL_URN, "texture"); addDesiredStateChange(bindFbo); - nodeInstance = this; SwappableFBO gBufferPair = displayResolutionDependentFBOs.getGBufferPair(); lastUpdatedGBuffer = gBufferPair.getLastUpdatedFbo(); staleGBuffer = gBufferPair.getStaleFbo(); @@ -81,28 +77,30 @@ public void process() { PerformanceMonitor.endActivity(); } - public static OutputToScreenNode getInstance() { - return nodeInstance; - } - - public void setFbo(String fboUri) { - FBO fbo; + @Override + public void handleCommand(String command, String arg1) { + switch (command) { + case "setFbo": + FBO fbo; + switch (arg1) { + case "engine:fbo.gBuffer": + case "engine:fbo.lastUpdatedGBuffer": + fbo = lastUpdatedGBuffer; + break; + case "engine:fbo.staleGBuffer": + fbo = staleGBuffer; + break; + default: + // TODO: We should probably do some more error checking here. + fbo = displayResolutionDependentFBOs.get(new SimpleUri(arg1)); + break; + } + setFbo(fbo); - switch (fboUri) { - case "engine:fbo.gBuffer": - case "engine:fbo.lastUpdatedGBuffer": - fbo = lastUpdatedGBuffer; - break; - case "engine:fbo.staleGBuffer": - fbo = staleGBuffer; break; default: - // TODO: We should probably do some more error checking here. - fbo = displayResolutionDependentFBOs.get(new SimpleUri(fboUri)); - break; + // TODO: Throw error or log something? } - - setFbo(fbo); } private void setFbo(FBO fbo) { diff --git a/engine/src/main/java/org/terasology/rendering/world/WorldRenderer.java b/engine/src/main/java/org/terasology/rendering/world/WorldRenderer.java index cc101304d46..e72bd176c65 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRenderer.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRenderer.java @@ -15,6 +15,7 @@ */ package org.terasology.rendering.world; +import org.terasology.entitySystem.systems.ComponentSystem; import org.terasology.math.geom.Vector3f; import org.terasology.math.geom.Vector3i; import org.terasology.rendering.assets.material.Material; 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 d7ef37b8ac5..452c2829006 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -18,8 +18,14 @@ import org.terasology.config.Config; import org.terasology.config.RenderingConfig; import org.terasology.context.Context; +import org.terasology.engine.SimpleUri; import org.terasology.engine.subsystem.lwjgl.GLBufferPool; import org.terasology.engine.subsystem.lwjgl.LwjglGraphics; +import org.terasology.entitySystem.systems.ComponentSystem; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.logic.console.commandSystem.annotations.Command; +import org.terasology.logic.console.commandSystem.annotations.CommandParam; +import org.terasology.logic.permission.PermissionManager; import org.terasology.logic.players.LocalPlayerSystem; import org.terasology.math.TeraMath; import org.terasology.math.geom.Vector3f; @@ -112,7 +118,8 @@ * TODO: update this section to include new, relevant objects * - a RenderableWorld instance, providing acceleration structures caching blocks requiring different rendering treatments
*/ -public final class WorldRendererImpl implements WorldRenderer { +@RegisterSystem +public final class WorldRendererImpl implements WorldRenderer, ComponentSystem { private boolean isFirstRenderingStageForCurrentFrame; private final RenderQueuesHelper renderQueues; @@ -152,6 +159,21 @@ public final class WorldRendererImpl implements WorldRenderer { private DisplayResolutionDependentFBOs displayResolutionDependentFBOs; private ShadowMapResolutionDependentFBOs shadowMapResolutionDependentFBOs; + private static RenderGraph renderGraph = new RenderGraph(); // TODO: Try making this non-static + + // Required for the reflection magic that Systems use. + public WorldRendererImpl() { + renderingConfig = null; + vrProvider = null; + renderQueues = null; + context = null; + backdropProvider = null; + worldProvider = null; + renderableWorld = null; + shaderManager = null; + playerCamera = null; + } + /** * Instantiates a WorldRenderer implementation. * @@ -229,8 +251,6 @@ private void initRenderingSupport() { } private void initRenderGraph() { - RenderGraph renderGraph = new RenderGraph(); - addShadowMapNodes(renderGraph); addReflectionNodes(renderGraph); @@ -249,7 +269,7 @@ private void initRenderGraph() { addPostProcessingNodes(renderGraph); - addCopyOutputNodes(renderGraph); + addOutputNodes(renderGraph); renderTaskListGenerator = new RenderTaskListGenerator(); List orderedNodes = renderGraph.getNodesInTopologicalOrder(); @@ -447,12 +467,12 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { renderGraph.addNode(finalPostProcessingNode, "finalPostProcessingNode"); } - private void addCopyOutputNodes(RenderGraph renderGraph) { + private void addOutputNodes(RenderGraph renderGraph) { Node copyToVRFrameBufferNode = new OutputToHMDNode(context); - renderGraph.addNode(copyToVRFrameBufferNode, "copyToVRFrameBufferNode"); + renderGraph.addNode(copyToVRFrameBufferNode, "outputToVRFrameBufferNode"); Node copyImageToScreenNode = new OutputToScreenNode(context); - renderGraph.addNode(copyImageToScreenNode, "copyImageToScreenNode"); + renderGraph.addNode(copyImageToScreenNode, "outputToScreenNode"); } @Override @@ -677,4 +697,29 @@ public RenderingStage getCurrentRenderStage() { public void recompileShaders() { shaderManager.recompileAllShaders(); } + + @Override + public void initialise() { } + + @Override + public void preBegin() { } + + @Override + public void postBegin() { } + + @Override + public void preSave() { } + + @Override + public void postSave() { } + + @Override + public void shutdown() { } + + @Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION) + public void dagNodeCommand(@CommandParam("nodeUri") final String nodeUri, @CommandParam("command") final String command, @CommandParam("arg1") final String arg1) { + // TODO: Convert arg1 to args[] + Node node = renderGraph.findNode(nodeUri); + node.handleCommand(command, arg1); + } } From 407d92f91e44ec60cdde24b590bacb93f2b577d9 Mon Sep 17 00:00:00 2001 From: vampcat Date: Tue, 15 Aug 2017 17:33:56 +0530 Subject: [PATCH 4/9] Requested Changes --- .../rendering/dag/AbstractNode.java | 8 +- .../org/terasology/rendering/dag/Node.java | 6 +- .../terasology/rendering/dag/RenderGraph.java | 9 +- .../rendering/dag/nodes/OutputToHMDNode.java | 2 +- .../dag/nodes/OutputToScreenNode.java | 20 ++- .../fbms/DisplayResolutionDependentFBOs.java | 8 +- .../rendering/world/WorldRendererImpl.java | 118 +++++++++--------- 7 files changed, 90 insertions(+), 81 deletions(-) diff --git a/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java b/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java index d5f2c692293..abe758b239a 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java @@ -36,7 +36,7 @@ public abstract class AbstractNode implements Node { protected static final Logger logger = LoggerFactory.getLogger(AbstractNode.class); - private String nodeUri; + private SimpleUri nodeUri; private Set desiredStateChanges = Sets.newLinkedHashSet(); private Map fboUsages = Maps.newHashMap(); @@ -98,17 +98,17 @@ public void setEnabled(boolean enabled) { } @Override - public void setUri(String nodeUri) { + public void setUri(SimpleUri nodeUri) { this.nodeUri = nodeUri; } @Override - public String getUri() { + public SimpleUri getUri() { return nodeUri; } @Override - public void handleCommand(String command, String arg1) { } + public void handleCommand(String command, String[] args) { } /** * Utility method to conveniently retrieve materials from the Assets system, diff --git a/engine/src/main/java/org/terasology/rendering/dag/Node.java b/engine/src/main/java/org/terasology/rendering/dag/Node.java index e05d9c8c001..c2a3d5b2899 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/Node.java +++ b/engine/src/main/java/org/terasology/rendering/dag/Node.java @@ -34,9 +34,9 @@ public interface Node extends RenderPipelineTask { void setEnabled(boolean enabled); - void setUri(String nodeUri); + void setUri(SimpleUri nodeUri); - String getUri(); + SimpleUri getUri(); - void handleCommand(String command, String arg1); + void handleCommand(String command, String[] args); } diff --git a/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java b/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java index 8275bb85987..29436533184 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java +++ b/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java @@ -30,13 +30,16 @@ public RenderGraph() { nodes = Lists.newArrayList(); } - public String addNode(Node node, String suggestedId) { // TODO: Change suggestedId to SimpleUri + public SimpleUri addNode(Node node, SimpleUri suggestedId) { nodes.add(node); + + // TODO: make sure URIs are actually unique: if "myModule:blur" is present the node gets the uri "myModule:blur2" instead. + // TODO: make sure the namespace in the uri is engine-assigned, so that only engine nodes can have the "engine:" namespace - everything else gets the namespace of the module. node.setUri(suggestedId); - return suggestedId; // TODO: for instance if "blur" present make id "blur1" and return it + return suggestedId; } - public Node findNode(String nodeUri) { + public Node findNode(SimpleUri nodeUri) { for (Node node: nodes) { if (node.getUri().equals(nodeUri)) { return node; diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToHMDNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToHMDNode.java index ca8d0a841ac..b5dda0a920b 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToHMDNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToHMDNode.java @@ -89,7 +89,7 @@ public OutputToHMDNode(Context context) { */ @Override public void process() { - PerformanceMonitor.startActivity("rendering/copyImageToHMD"); + PerformanceMonitor.startActivity("rendering/outputToHMD"); finalFbo.bindTexture(); renderFinalStereoImage(worldRenderer.getCurrentRenderStage()); PerformanceMonitor.endActivity(); diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java index 2558de3eadf..e280f0c1d00 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java @@ -68,7 +68,7 @@ public OutputToScreenNode(Context context) { @Override public void process() { - PerformanceMonitor.startActivity("rendering/copyImageToScreen"); + PerformanceMonitor.startActivity("rendering/outputToScreen"); // The way things are set-up right now, we can have FBOs that are not the same size as the display (if scale != 100%). // However, when drawing the final image to the screen, we always want the viewport to match the size of display, // and not that of some FBO. Hence, we are manually setting the viewport via glViewport over here. @@ -78,11 +78,15 @@ public void process() { } @Override - public void handleCommand(String command, String arg1) { + public void handleCommand(String command, String[] args) { switch (command) { case "setFbo": + if (args.length != 1) { + throw new RuntimeException("Invalid number of arguments; expected 1, received " + args.length + "!"); + } + FBO fbo; - switch (arg1) { + switch (args[0]) { case "engine:fbo.gBuffer": case "engine:fbo.lastUpdatedGBuffer": fbo = lastUpdatedGBuffer; @@ -91,15 +95,19 @@ public void handleCommand(String command, String arg1) { fbo = staleGBuffer; break; default: - // TODO: We should probably do some more error checking here. - fbo = displayResolutionDependentFBOs.get(new SimpleUri(arg1)); + fbo = displayResolutionDependentFBOs.get(new SimpleUri(args[0])); + + if (fbo == null) { + throw new RuntimeException("Invalid fbo uri: " + args[0] + "!"); + } + break; } setFbo(fbo); break; default: - // TODO: Throw error or log something? + throw new RuntimeException("Invalid command: " + command + "!"); } } diff --git a/engine/src/main/java/org/terasology/rendering/opengl/fbms/DisplayResolutionDependentFBOs.java b/engine/src/main/java/org/terasology/rendering/opengl/fbms/DisplayResolutionDependentFBOs.java index b7fff743f0d..c5d56ad4156 100644 --- a/engine/src/main/java/org/terasology/rendering/opengl/fbms/DisplayResolutionDependentFBOs.java +++ b/engine/src/main/java/org/terasology/rendering/opengl/fbms/DisplayResolutionDependentFBOs.java @@ -31,8 +31,6 @@ * TODO: Better naming */ public class DisplayResolutionDependentFBOs extends AbstractFBOsManager { - public static final SimpleUri READONLY_GBUFFER = new SimpleUri("engine:fbo.readOnlyGBuffer"); - public static final SimpleUri WRITEONLY_GBUFFER = new SimpleUri("engine:fbo.writeOnlyGBuffer"); public static final SimpleUri FINAL_BUFFER = new SimpleUri("engine:fbo.finalBuffer"); private SwappableFBO gBufferPair; @@ -50,13 +48,13 @@ public DisplayResolutionDependentFBOs(RenderingConfig renderingConfig, ScreenGra } private void generateDefaultFBOs() { - FBO readOnlyGBuffer = generateWithDimensions(new FBOConfig(READONLY_GBUFFER, FULL_SCALE, FBO.Type.HDR) + FBO gBuffer1 = generateWithDimensions(new FBOConfig(new SimpleUri("engine:fbo.gBuffer1"), FULL_SCALE, FBO.Type.HDR) .useDepthBuffer().useNormalBuffer().useLightBuffer().useStencilBuffer(), fullScale); - FBO writeOnlyGBuffer = generateWithDimensions(new FBOConfig(WRITEONLY_GBUFFER, FULL_SCALE, FBO.Type.HDR) + FBO gBuffer2 = generateWithDimensions(new FBOConfig(new SimpleUri("engine:fbo.gBuffer2"), FULL_SCALE, FBO.Type.HDR) .useDepthBuffer().useNormalBuffer().useLightBuffer().useStencilBuffer(), fullScale); generateWithDimensions(new FBOConfig(FINAL_BUFFER, FULL_SCALE, FBO.Type.DEFAULT), fullScale); - gBufferPair = new SwappableFBO(readOnlyGBuffer, writeOnlyGBuffer); + gBufferPair = new SwappableFBO(gBuffer1, gBuffer2); } @Override 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 452c2829006..2810f4fac30 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -49,8 +49,6 @@ import org.terasology.rendering.dag.nodes.BloomBlurNode; import org.terasology.rendering.dag.nodes.BlurredAmbientOcclusionNode; import org.terasology.rendering.dag.nodes.BufferClearingNode; -import org.terasology.rendering.dag.nodes.OutputToHMDNode; -import org.terasology.rendering.dag.nodes.OutputToScreenNode; import org.terasology.rendering.dag.nodes.DeferredMainLightNode; import org.terasology.rendering.dag.nodes.DeferredPointLightsNode; import org.terasology.rendering.dag.nodes.DownSamplerForExposureNode; @@ -64,6 +62,8 @@ import org.terasology.rendering.dag.nodes.OpaqueBlocksNode; import org.terasology.rendering.dag.nodes.OpaqueObjectsNode; import org.terasology.rendering.dag.nodes.OutlineNode; +import org.terasology.rendering.dag.nodes.OutputToHMDNode; +import org.terasology.rendering.dag.nodes.OutputToScreenNode; import org.terasology.rendering.dag.nodes.OverlaysNode; import org.terasology.rendering.dag.nodes.PrePostCompositeNode; import org.terasology.rendering.dag.nodes.RefractiveReflectiveBlocksNode; @@ -105,8 +105,6 @@ import static org.terasology.rendering.opengl.ScalingFactors.ONE_32TH_SCALE; import static org.terasology.rendering.opengl.ScalingFactors.ONE_8TH_SCALE; import static org.terasology.rendering.opengl.ScalingFactors.QUARTER_SCALE; -import static org.terasology.rendering.opengl.fbms.DisplayResolutionDependentFBOs.READONLY_GBUFFER; -import static org.terasology.rendering.opengl.fbms.DisplayResolutionDependentFBOs.WRITEONLY_GBUFFER; /** * Renders the 3D world, including background, overlays and first person/in hand objects. 2D UI elements are dealt with elsewhere. @@ -161,7 +159,10 @@ public final class WorldRendererImpl implements WorldRenderer, ComponentSystem { private static RenderGraph renderGraph = new RenderGraph(); // TODO: Try making this non-static - // Required for the reflection magic that Systems use. + // Required for ComponentSystem to register the system (via @RegisterSystem). + // @RegisterSystem requires a default constructor, and since we have final variables in the class, + // it was essential to set them to some value (in this case, null) in this constructor. + // Note that this constructor shouldn't be actually used normally anywhere in code. public WorldRendererImpl() { renderingConfig = null; vrProvider = null; @@ -279,40 +280,40 @@ private void initRenderGraph() { private void addShadowMapNodes(RenderGraph renderGraph) { FBOConfig shadowMapConfig = new FBOConfig(ShadowMapNode.SHADOW_MAP_FBO_URI, FBO.Type.NO_COLOR).useDepthBuffer(); BufferClearingNode shadowMapClearingNode = new BufferClearingNode(shadowMapConfig, shadowMapResolutionDependentFBOs, GL_DEPTH_BUFFER_BIT); - renderGraph.addNode(shadowMapClearingNode, "shadowMapClearingNode"); + renderGraph.addNode(shadowMapClearingNode, new SimpleUri("engine:shadowMapClearingNode")); shadowMapNode = new ShadowMapNode(context); - renderGraph.addNode(shadowMapNode, "shadowMapNode"); + renderGraph.addNode(shadowMapNode, new SimpleUri("engine:shadowMapNode")); } private void addReflectionNodes(RenderGraph renderGraph) { FBOConfig reflectedBufferConfig = new FBOConfig(BackdropReflectionNode.REFLECTED_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT).useDepthBuffer(); BufferClearingNode reflectedBufferClearingNode = new BufferClearingNode(reflectedBufferConfig, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - renderGraph.addNode(reflectedBufferClearingNode, "reflectedBufferClearingNode"); + renderGraph.addNode(reflectedBufferClearingNode, new SimpleUri("engine:reflectedBufferClearingNode")); Node reflectedBackdropNode = new BackdropReflectionNode(context); - renderGraph.addNode(reflectedBackdropNode, "reflectedBackdropNode"); + renderGraph.addNode(reflectedBackdropNode, new SimpleUri("engine:reflectedBackdropNode")); Node worldReflectionNode = new WorldReflectionNode(context); - renderGraph.addNode(worldReflectionNode, "worldReflectionNode"); + renderGraph.addNode(worldReflectionNode, new SimpleUri("worldReflectionNode")); } private void addSkyNodes(RenderGraph renderGraph) { FBOConfig reflectedRefractedBufferConfig = new FBOConfig(RefractiveReflectiveBlocksNode.REFRACTIVE_REFLECTIVE_FBO_URI, FULL_SCALE, FBO.Type.HDR).useNormalBuffer(); BufferClearingNode reflectedRefractedClearingNode = new BufferClearingNode(reflectedRefractedBufferConfig, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - renderGraph.addNode(reflectedRefractedClearingNode, "reflectedRefractedClearingNode"); + renderGraph.addNode(reflectedRefractedClearingNode, new SimpleUri("engine:reflectedRefractedClearingNode")); - FBOConfig lastUpdatedGBufferConfig = displayResolutionDependentFBOs.getFboConfig(READONLY_GBUFFER); - FBOConfig staleGBufferConfig = displayResolutionDependentFBOs.getFboConfig(WRITEONLY_GBUFFER); + FBOConfig gBuffer1Config = displayResolutionDependentFBOs.getFboConfig(new SimpleUri("engine:fbo.gBuffer1")); // TODO: Remove the hard coded value here + FBOConfig gBuffer2Config = displayResolutionDependentFBOs.getFboConfig(new SimpleUri("engine:fbo.gBuffer2")); // TODO: Remove the hard coded value here - BufferClearingNode lastUpdatedGBufferClearingNode = new BufferClearingNode(lastUpdatedGBufferConfig, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - renderGraph.addNode(lastUpdatedGBufferClearingNode, "lastUpdatedGBufferClearingNode"); + BufferClearingNode lastUpdatedGBufferClearingNode = new BufferClearingNode(gBuffer1Config, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + renderGraph.addNode(lastUpdatedGBufferClearingNode, new SimpleUri("engine:gBuffer1ClearingNode")); - BufferClearingNode staleGBufferClearingNode = new BufferClearingNode(staleGBufferConfig, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - renderGraph.addNode(staleGBufferClearingNode, "staleGBufferClearingNode"); + BufferClearingNode staleGBufferClearingNode = new BufferClearingNode(gBuffer2Config, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + renderGraph.addNode(staleGBufferClearingNode, new SimpleUri("engine:gBuffer2ClearingNode")); Node backdropNode = new BackdropNode(context); - renderGraph.addNode(backdropNode, "backdropNode"); + renderGraph.addNode(backdropNode, new SimpleUri("engine:backdropNode")); DisplayResolutionDependentFBOs displayResolutionDependentFBOs = context.get(DisplayResolutionDependentFBOs.class); @@ -321,109 +322,110 @@ private void addSkyNodes(RenderGraph renderGraph) { String label = "hazeIntermediateNode"; HazeNode hazeIntermediateNode = new HazeNode(context, displayResolutionDependentFBOs.getGBufferPair().getLastUpdatedFbo(), hazeIntermediateFbo, label); - renderGraph.addNode(hazeIntermediateNode, label); + renderGraph.addNode(hazeIntermediateNode, new SimpleUri("engine:" + label)); FBOConfig hazeFinalConfig = new FBOConfig(HazeNode.FINAL_HAZE_FBO_URI, ONE_32TH_SCALE, FBO.Type.DEFAULT); FBO hazeFinalFbo = displayResolutionDependentFBOs.request(hazeFinalConfig); + label = "hazeFinalNode"; HazeNode hazeFinalNode = new HazeNode(context, hazeIntermediateFbo, hazeFinalFbo, label); - renderGraph.addNode(hazeFinalNode, "hazeFinalNode"); + renderGraph.addNode(hazeFinalNode, new SimpleUri("engine:" + label)); } private void addWorldRenderingNodes(RenderGraph renderGraph) { Node opaqueObjectsNode = new OpaqueObjectsNode(context); - renderGraph.addNode(opaqueObjectsNode, "opaqueObjectsNode"); + renderGraph.addNode(opaqueObjectsNode, new SimpleUri("engine:opaqueObjectsNode")); Node opaqueBlocksNode = new OpaqueBlocksNode(context); - renderGraph.addNode(opaqueBlocksNode, "opaqueBlocksNode"); + renderGraph.addNode(opaqueBlocksNode, new SimpleUri("engine:opaqueBlocksNode")); Node alphaRejectBlocksNode = new AlphaRejectBlocksNode(context); - renderGraph.addNode(alphaRejectBlocksNode, "alphaRejectBlocksNode"); + renderGraph.addNode(alphaRejectBlocksNode, new SimpleUri("engine:alphaRejectBlocksNode")); Node overlaysNode = new OverlaysNode(context); - renderGraph.addNode(overlaysNode, "overlaysNode"); + renderGraph.addNode(overlaysNode, new SimpleUri("engine:overlaysNode")); // TODO: remove this, including associated method in the RenderSystem interface Node firstPersonViewNode = new FirstPersonViewNode(context); - renderGraph.addNode(firstPersonViewNode, "firstPersonViewNode"); + renderGraph.addNode(firstPersonViewNode, new SimpleUri("engine:firstPersonViewNode")); } private void addLightingNodes(RenderGraph renderGraph) { Node deferredPointLightsNode = new DeferredPointLightsNode(context); - renderGraph.addNode(deferredPointLightsNode, "DeferredPointLightsNode"); + renderGraph.addNode(deferredPointLightsNode, new SimpleUri("engine:DeferredPointLightsNode")); Node deferredMainLightNode = new DeferredMainLightNode(context); - renderGraph.addNode(deferredMainLightNode, "deferredMainLightNode"); + renderGraph.addNode(deferredMainLightNode, new SimpleUri("engine:deferredMainLightNode")); Node applyDeferredLightingNode = new ApplyDeferredLightingNode(context); - renderGraph.addNode(applyDeferredLightingNode, "applyDeferredLightingNode"); + renderGraph.addNode(applyDeferredLightingNode, new SimpleUri("engine:applyDeferredLightingNode")); } private void addRefractiveReflectiveNode(RenderGraph renderGraph) { Node chunksRefractiveReflectiveNode = new RefractiveReflectiveBlocksNode(context); - renderGraph.addNode(chunksRefractiveReflectiveNode, "chunksRefractiveReflectiveNode"); + renderGraph.addNode(chunksRefractiveReflectiveNode, new SimpleUri("engine:chunksRefractiveReflectiveNode")); // TODO: consider having a non-rendering node for FBO.attachDepthBufferTo() methods } private void add3dDecorationNodes(RenderGraph renderGraph) { Node outlineNode = new OutlineNode(context); - renderGraph.addNode(outlineNode, "outlineNode"); + renderGraph.addNode(outlineNode, new SimpleUri("engine:outlineNode")); Node ambientOcclusionNode = new AmbientOcclusionNode(context); - renderGraph.addNode(ambientOcclusionNode, "ambientOcclusionNode"); + renderGraph.addNode(ambientOcclusionNode, new SimpleUri("engine:ambientOcclusionNode")); Node blurredAmbientOcclusionNode = new BlurredAmbientOcclusionNode(context); - renderGraph.addNode(blurredAmbientOcclusionNode, "blurredAmbientOcclusionNode"); + renderGraph.addNode(blurredAmbientOcclusionNode, new SimpleUri("engine:blurredAmbientOcclusionNode")); } private void addPrePostProcessingNodes(RenderGraph renderGraph) { // Pre-post-processing, just one more interaction with 3D data (semi-transparent objects, in SimpleBlendMaterialsNode) // and then it's 2D post-processing all the way to the image shown on the display. Node prePostCompositeNode = new PrePostCompositeNode(context); - renderGraph.addNode(prePostCompositeNode, "prePostCompositeNode"); + renderGraph.addNode(prePostCompositeNode, new SimpleUri("engine:prePostCompositeNode")); Node simpleBlendMaterialsNode = new SimpleBlendMaterialsNode(context); - renderGraph.addNode(simpleBlendMaterialsNode, "simpleBlendMaterialsNode"); + renderGraph.addNode(simpleBlendMaterialsNode, new SimpleUri("engine:simpleBlendMaterialsNode")); } private void addPostProcessingNodes(RenderGraph renderGraph) { // Post-Processing proper: tone mapping, light shafts, bloom and blur passes Node lightShaftsNode = new LightShaftsNode(context); - renderGraph.addNode(lightShaftsNode, "lightShaftsNode"); + renderGraph.addNode(lightShaftsNode, new SimpleUri("engine:lightShaftsNode")); Node initialPostProcessingNode = new InitialPostProcessingNode(context); - renderGraph.addNode(initialPostProcessingNode, "initialPostProcessingNode"); + renderGraph.addNode(initialPostProcessingNode, new SimpleUri("engine:initialPostProcessingNode")); - FBOConfig writeOnlyGBufferConfig = displayResolutionDependentFBOs.getFboConfig(WRITEONLY_GBUFFER); + FBOConfig gBuffer2Config = displayResolutionDependentFBOs.getFboConfig(new SimpleUri("engine:fbo.gBuffer2")); // TODO: Remove the hard coded value here String label = "downSampling_gBuffer_to_16x16px_forExposure"; - DownSamplerForExposureNode exposureDownSamplerTo16pixels = new DownSamplerForExposureNode(context, writeOnlyGBufferConfig, displayResolutionDependentFBOs, FBO_16X16_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo16pixels, label); + DownSamplerForExposureNode exposureDownSamplerTo16pixels = new DownSamplerForExposureNode(context, gBuffer2Config, displayResolutionDependentFBOs, FBO_16X16_CONFIG, immutableFBOs, label); + renderGraph.addNode(exposureDownSamplerTo16pixels, new SimpleUri("engine:" + label)); label = "downSampling_16x16px_to_8x8px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo8pixels = new DownSamplerForExposureNode(context, FBO_16X16_CONFIG, immutableFBOs, FBO_8X8_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo8pixels, label); + renderGraph.addNode(exposureDownSamplerTo8pixels, new SimpleUri("engine:" + label)); label = "downSampling_8x8px_to_4x4px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo4pixels = new DownSamplerForExposureNode(context, FBO_8X8_CONFIG, immutableFBOs, FBO_4X4_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo4pixels, label); + renderGraph.addNode(exposureDownSamplerTo4pixels, new SimpleUri("engine:" + label)); label = "downSampling_4x4px_to_2x2px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo2pixels = new DownSamplerForExposureNode(context, FBO_4X4_CONFIG, immutableFBOs, FBO_2X2_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo2pixels, label); + renderGraph.addNode(exposureDownSamplerTo2pixels, new SimpleUri("engine:" + label)); label = "downSampling_2x2px_to_1x1px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo1pixel = new DownSamplerForExposureNode(context, FBO_2X2_CONFIG, immutableFBOs, FBO_1X1_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo1pixel, label); + renderGraph.addNode(exposureDownSamplerTo1pixel, new SimpleUri("engine:" + label)); Node updateExposureNode = new UpdateExposureNode(context); - renderGraph.addNode(updateExposureNode, "updateExposureNode"); + renderGraph.addNode(updateExposureNode, new SimpleUri("engine:updateExposureNode")); Node toneMappingNode = new ToneMappingNode(context); - renderGraph.addNode(toneMappingNode, "toneMappingNode"); + renderGraph.addNode(toneMappingNode, new SimpleUri("engine:toneMappingNode")); // Bloom Effect: one high-pass filter and three blur passes Node highPassNode = new HighPassNode(context); - renderGraph.addNode(highPassNode, "highPassNode"); + renderGraph.addNode(highPassNode, new SimpleUri("engine:highPassNode")); DisplayResolutionDependentFBOs displayResolutionDependentFBOs = context.get(DisplayResolutionDependentFBOs.class); @@ -432,21 +434,21 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { label = "halfScaleBlurredBloom"; BloomBlurNode halfScaleBlurredBloom = new BloomBlurNode(context, displayResolutionDependentFBOs.get(HighPassNode.HIGH_PASS_FBO_URI), halfScaleBloomFbo, label); - renderGraph.addNode(halfScaleBlurredBloom, label); + renderGraph.addNode(halfScaleBlurredBloom, new SimpleUri("engine:" + label)); FBOConfig quarterScaleBloomConfig = new FBOConfig(BloomBlurNode.QUARTER_SCALE_FBO_URI, QUARTER_SCALE, FBO.Type.DEFAULT); FBO quarterScaleBloomFbo = displayResolutionDependentFBOs.request(quarterScaleBloomConfig); label = "quarterScaleBlurredBloom"; BloomBlurNode quarterScaleBlurredBloom = new BloomBlurNode(context, halfScaleBloomFbo, quarterScaleBloomFbo, label); - renderGraph.addNode(quarterScaleBlurredBloom, label); + renderGraph.addNode(quarterScaleBlurredBloom, new SimpleUri("engine:" + label)); FBOConfig one8thScaleBloomConfig = new FBOConfig(BloomBlurNode.ONE_8TH_SCALE_FBO_URI, ONE_8TH_SCALE, FBO.Type.DEFAULT); FBO one8thScaleBloomFbo = displayResolutionDependentFBOs.request(one8thScaleBloomConfig); label = "one8thScaleBlurredBloom"; BloomBlurNode one8thScaleBlurredBloom = new BloomBlurNode(context, quarterScaleBloomFbo, one8thScaleBloomFbo, label); - renderGraph.addNode(one8thScaleBlurredBloom, label); + renderGraph.addNode(one8thScaleBlurredBloom, new SimpleUri("engine:" + label)); // Late Blur nodes: assisting Motion Blur and Depth-of-Field effects FBOConfig firstLateBlurConfig = new FBOConfig(FIRST_LATE_BLUR_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT); @@ -454,25 +456,25 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { label = "firstLateBlurNode"; LateBlurNode firstLateBlurNode = new LateBlurNode(context, displayResolutionDependentFBOs.get(ToneMappingNode.TONE_MAPPING_FBO_URI), firstLateBlurFbo, label); - renderGraph.addNode(firstLateBlurNode, label); + renderGraph.addNode(firstLateBlurNode, new SimpleUri("engine:" + label)); FBOConfig secondLateBlurConfig = new FBOConfig(SECOND_LATE_BLUR_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT); FBO secondLateBlurFbo = displayResolutionDependentFBOs.request(secondLateBlurConfig); label = "secondLateBlurNode"; LateBlurNode secondLateBlurNode = new LateBlurNode(context, firstLateBlurFbo, secondLateBlurFbo, label); - renderGraph.addNode(secondLateBlurNode, label); + renderGraph.addNode(secondLateBlurNode, new SimpleUri("engine:" + label)); Node finalPostProcessingNode = new FinalPostProcessingNode(context); - renderGraph.addNode(finalPostProcessingNode, "finalPostProcessingNode"); + renderGraph.addNode(finalPostProcessingNode, new SimpleUri("engine:finalPostProcessingNode")); } private void addOutputNodes(RenderGraph renderGraph) { Node copyToVRFrameBufferNode = new OutputToHMDNode(context); - renderGraph.addNode(copyToVRFrameBufferNode, "outputToVRFrameBufferNode"); + renderGraph.addNode(copyToVRFrameBufferNode, new SimpleUri("engine:outputToVRFrameBufferNode")); Node copyImageToScreenNode = new OutputToScreenNode(context); - renderGraph.addNode(copyImageToScreenNode, "outputToScreenNode"); + renderGraph.addNode(copyImageToScreenNode, new SimpleUri("engine:outputToScreenNode")); } @Override @@ -506,7 +508,6 @@ public void update(float deltaInSeconds) { secondsSinceLastFrame += deltaInSeconds; } - private void resetStats() { statChunkMeshEmpty = 0; statChunkNotReady = 0; @@ -717,9 +718,8 @@ public void postSave() { } public void shutdown() { } @Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION) - public void dagNodeCommand(@CommandParam("nodeUri") final String nodeUri, @CommandParam("command") final String command, @CommandParam("arg1") final String arg1) { - // TODO: Convert arg1 to args[] - Node node = renderGraph.findNode(nodeUri); - node.handleCommand(command, arg1); + public void dagNodeCommand(@CommandParam("nodeUri") final String nodeUri, @CommandParam("command") final String command, @CommandParam(value= "args") final String args[]) { + Node node = renderGraph.findNode(new SimpleUri(nodeUri)); + node.handleCommand(command, args); } } From 5db63feaf51f244d4a790a1bd83cd84de659bc4f Mon Sep 17 00:00:00 2001 From: vampcat Date: Tue, 15 Aug 2017 17:38:20 +0530 Subject: [PATCH 5/9] PerformanceMonitor Label / Node Uri consistency fixes --- .../rendering/world/WorldRendererImpl.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) 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 2810f4fac30..8f23fbe408d 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -320,16 +320,16 @@ private void addSkyNodes(RenderGraph renderGraph) { FBOConfig hazeIntermediateConfig = new FBOConfig(HazeNode.INTERMEDIATE_HAZE_FBO_URI, ONE_16TH_SCALE, FBO.Type.DEFAULT); FBO hazeIntermediateFbo = displayResolutionDependentFBOs.request(hazeIntermediateConfig); - String label = "hazeIntermediateNode"; + String label = "hazeIntermediate"; HazeNode hazeIntermediateNode = new HazeNode(context, displayResolutionDependentFBOs.getGBufferPair().getLastUpdatedFbo(), hazeIntermediateFbo, label); - renderGraph.addNode(hazeIntermediateNode, new SimpleUri("engine:" + label)); + renderGraph.addNode(hazeIntermediateNode, new SimpleUri("engine:" + label + "Node")); FBOConfig hazeFinalConfig = new FBOConfig(HazeNode.FINAL_HAZE_FBO_URI, ONE_32TH_SCALE, FBO.Type.DEFAULT); FBO hazeFinalFbo = displayResolutionDependentFBOs.request(hazeFinalConfig); - label = "hazeFinalNode"; + label = "hazeFinal"; HazeNode hazeFinalNode = new HazeNode(context, hazeIntermediateFbo, hazeFinalFbo, label); - renderGraph.addNode(hazeFinalNode, new SimpleUri("engine:" + label)); + renderGraph.addNode(hazeFinalNode, new SimpleUri("engine:" + label + "Node")); } private void addWorldRenderingNodes(RenderGraph renderGraph) { @@ -399,23 +399,23 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { FBOConfig gBuffer2Config = displayResolutionDependentFBOs.getFboConfig(new SimpleUri("engine:fbo.gBuffer2")); // TODO: Remove the hard coded value here String label = "downSampling_gBuffer_to_16x16px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo16pixels = new DownSamplerForExposureNode(context, gBuffer2Config, displayResolutionDependentFBOs, FBO_16X16_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo16pixels, new SimpleUri("engine:" + label)); + renderGraph.addNode(exposureDownSamplerTo16pixels, new SimpleUri("engine:" + label + "Node")); label = "downSampling_16x16px_to_8x8px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo8pixels = new DownSamplerForExposureNode(context, FBO_16X16_CONFIG, immutableFBOs, FBO_8X8_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo8pixels, new SimpleUri("engine:" + label)); + renderGraph.addNode(exposureDownSamplerTo8pixels, new SimpleUri("engine:" + label + "Node")); label = "downSampling_8x8px_to_4x4px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo4pixels = new DownSamplerForExposureNode(context, FBO_8X8_CONFIG, immutableFBOs, FBO_4X4_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo4pixels, new SimpleUri("engine:" + label)); + renderGraph.addNode(exposureDownSamplerTo4pixels, new SimpleUri("engine:" + label + "Node")); label = "downSampling_4x4px_to_2x2px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo2pixels = new DownSamplerForExposureNode(context, FBO_4X4_CONFIG, immutableFBOs, FBO_2X2_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo2pixels, new SimpleUri("engine:" + label)); + renderGraph.addNode(exposureDownSamplerTo2pixels, new SimpleUri("engine:" + label + "Node")); label = "downSampling_2x2px_to_1x1px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo1pixel = new DownSamplerForExposureNode(context, FBO_2X2_CONFIG, immutableFBOs, FBO_1X1_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo1pixel, new SimpleUri("engine:" + label)); + renderGraph.addNode(exposureDownSamplerTo1pixel, new SimpleUri("engine:" + label + "Node")); Node updateExposureNode = new UpdateExposureNode(context); renderGraph.addNode(updateExposureNode, new SimpleUri("engine:updateExposureNode")); @@ -434,36 +434,36 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { label = "halfScaleBlurredBloom"; BloomBlurNode halfScaleBlurredBloom = new BloomBlurNode(context, displayResolutionDependentFBOs.get(HighPassNode.HIGH_PASS_FBO_URI), halfScaleBloomFbo, label); - renderGraph.addNode(halfScaleBlurredBloom, new SimpleUri("engine:" + label)); + renderGraph.addNode(halfScaleBlurredBloom, new SimpleUri("engine:" + label + "Node")); FBOConfig quarterScaleBloomConfig = new FBOConfig(BloomBlurNode.QUARTER_SCALE_FBO_URI, QUARTER_SCALE, FBO.Type.DEFAULT); FBO quarterScaleBloomFbo = displayResolutionDependentFBOs.request(quarterScaleBloomConfig); label = "quarterScaleBlurredBloom"; BloomBlurNode quarterScaleBlurredBloom = new BloomBlurNode(context, halfScaleBloomFbo, quarterScaleBloomFbo, label); - renderGraph.addNode(quarterScaleBlurredBloom, new SimpleUri("engine:" + label)); + renderGraph.addNode(quarterScaleBlurredBloom, new SimpleUri("engine:" + label + "Node")); FBOConfig one8thScaleBloomConfig = new FBOConfig(BloomBlurNode.ONE_8TH_SCALE_FBO_URI, ONE_8TH_SCALE, FBO.Type.DEFAULT); FBO one8thScaleBloomFbo = displayResolutionDependentFBOs.request(one8thScaleBloomConfig); label = "one8thScaleBlurredBloom"; BloomBlurNode one8thScaleBlurredBloom = new BloomBlurNode(context, quarterScaleBloomFbo, one8thScaleBloomFbo, label); - renderGraph.addNode(one8thScaleBlurredBloom, new SimpleUri("engine:" + label)); + renderGraph.addNode(one8thScaleBlurredBloom, new SimpleUri("engine:" + label + "Node")); // Late Blur nodes: assisting Motion Blur and Depth-of-Field effects FBOConfig firstLateBlurConfig = new FBOConfig(FIRST_LATE_BLUR_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT); FBO firstLateBlurFbo = displayResolutionDependentFBOs.request(firstLateBlurConfig); - label = "firstLateBlurNode"; + label = "firstLateBlur"; LateBlurNode firstLateBlurNode = new LateBlurNode(context, displayResolutionDependentFBOs.get(ToneMappingNode.TONE_MAPPING_FBO_URI), firstLateBlurFbo, label); - renderGraph.addNode(firstLateBlurNode, new SimpleUri("engine:" + label)); + renderGraph.addNode(firstLateBlurNode, new SimpleUri("engine:" + label + "Node")); FBOConfig secondLateBlurConfig = new FBOConfig(SECOND_LATE_BLUR_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT); FBO secondLateBlurFbo = displayResolutionDependentFBOs.request(secondLateBlurConfig); - label = "secondLateBlurNode"; + label = "secondLateBlur"; LateBlurNode secondLateBlurNode = new LateBlurNode(context, firstLateBlurFbo, secondLateBlurFbo, label); - renderGraph.addNode(secondLateBlurNode, new SimpleUri("engine:" + label)); + renderGraph.addNode(secondLateBlurNode, new SimpleUri("engine:" + label + "Node")); Node finalPostProcessingNode = new FinalPostProcessingNode(context); renderGraph.addNode(finalPostProcessingNode, new SimpleUri("engine:finalPostProcessingNode")); From c9e54062fab8da09408355ca45a6c77d7aa20dcc Mon Sep 17 00:00:00 2001 From: vampcat Date: Thu, 17 Aug 2017 16:16:19 +0530 Subject: [PATCH 6/9] Requested changes --- .../org/terasology/rendering/dag/AbstractNode.java | 2 +- .../main/java/org/terasology/rendering/dag/Node.java | 2 +- .../org/terasology/rendering/dag/RenderGraph.java | 7 ++++--- .../rendering/dag/nodes/OutputToScreenNode.java | 12 ++++++------ 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java b/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java index abe758b239a..3bbc336c36e 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/AbstractNode.java @@ -108,7 +108,7 @@ public SimpleUri getUri() { } @Override - public void handleCommand(String command, String[] args) { } + public void handleCommand(String command, String... arguments) { } /** * Utility method to conveniently retrieve materials from the Assets system, diff --git a/engine/src/main/java/org/terasology/rendering/dag/Node.java b/engine/src/main/java/org/terasology/rendering/dag/Node.java index c2a3d5b2899..36cc1045ffa 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/Node.java +++ b/engine/src/main/java/org/terasology/rendering/dag/Node.java @@ -38,5 +38,5 @@ public interface Node extends RenderPipelineTask { SimpleUri getUri(); - void handleCommand(String command, String[] args); + void handleCommand(String command, String... arguments); } diff --git a/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java b/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java index 29436533184..a474cbde9a4 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java +++ b/engine/src/main/java/org/terasology/rendering/dag/RenderGraph.java @@ -30,13 +30,14 @@ public RenderGraph() { nodes = Lists.newArrayList(); } - public SimpleUri addNode(Node node, SimpleUri suggestedId) { + public SimpleUri addNode(Node node, String suggestedUri) { nodes.add(node); // TODO: make sure URIs are actually unique: if "myModule:blur" is present the node gets the uri "myModule:blur2" instead. // TODO: make sure the namespace in the uri is engine-assigned, so that only engine nodes can have the "engine:" namespace - everything else gets the namespace of the module. - node.setUri(suggestedId); - return suggestedId; + SimpleUri nodeUri = new SimpleUri("engine:" + suggestedUri); + node.setUri(nodeUri); + return nodeUri; } public Node findNode(SimpleUri nodeUri) { diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java index e280f0c1d00..7e63df81a1c 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java @@ -78,15 +78,15 @@ public void process() { } @Override - public void handleCommand(String command, String[] args) { + public void handleCommand(String command, String... arguments) { switch (command) { case "setFbo": - if (args.length != 1) { - throw new RuntimeException("Invalid number of arguments; expected 1, received " + args.length + "!"); + if (arguments.length != 1) { + throw new RuntimeException("Invalid number of arguments; expected 1, received " + arguments.length + "!"); } FBO fbo; - switch (args[0]) { + switch (arguments[0]) { case "engine:fbo.gBuffer": case "engine:fbo.lastUpdatedGBuffer": fbo = lastUpdatedGBuffer; @@ -95,10 +95,10 @@ public void handleCommand(String command, String[] args) { fbo = staleGBuffer; break; default: - fbo = displayResolutionDependentFBOs.get(new SimpleUri(args[0])); + fbo = displayResolutionDependentFBOs.get(new SimpleUri(arguments[0])); if (fbo == null) { - throw new RuntimeException("Invalid fbo uri: " + args[0] + "!"); + throw new RuntimeException("Invalid fbo uri: " + arguments[0] + "!"); } break; From 9547f03ed57f1a4d91f32e7ea959efffc6fe5088 Mon Sep 17 00:00:00 2001 From: vampcat Date: Thu, 24 Aug 2017 02:15:32 +0530 Subject: [PATCH 7/9] Requested changes --- .../dag/nodes/OutputToScreenNode.java | 4 +- .../rendering/world/WorldRendererImpl.java | 90 +++++++++---------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java index 7e63df81a1c..b06b9ba2a68 100644 --- a/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java +++ b/engine/src/main/java/org/terasology/rendering/dag/nodes/OutputToScreenNode.java @@ -98,7 +98,7 @@ public void handleCommand(String command, String... arguments) { fbo = displayResolutionDependentFBOs.get(new SimpleUri(arguments[0])); if (fbo == null) { - throw new RuntimeException("Invalid fbo uri: " + arguments[0] + "!"); + throw new RuntimeException(("No FBO is associated with URI '" + arguments[0] + "'")); } break; @@ -107,7 +107,7 @@ public void handleCommand(String command, String... arguments) { break; default: - throw new RuntimeException("Invalid command: " + command + "!"); + throw new RuntimeException("Unrecognized command: '" + command + "'"); } } 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 8f23fbe408d..22db232b156 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -280,40 +280,40 @@ private void initRenderGraph() { private void addShadowMapNodes(RenderGraph renderGraph) { FBOConfig shadowMapConfig = new FBOConfig(ShadowMapNode.SHADOW_MAP_FBO_URI, FBO.Type.NO_COLOR).useDepthBuffer(); BufferClearingNode shadowMapClearingNode = new BufferClearingNode(shadowMapConfig, shadowMapResolutionDependentFBOs, GL_DEPTH_BUFFER_BIT); - renderGraph.addNode(shadowMapClearingNode, new SimpleUri("engine:shadowMapClearingNode")); + renderGraph.addNode(shadowMapClearingNode, "shadowMapClearingNode"); shadowMapNode = new ShadowMapNode(context); - renderGraph.addNode(shadowMapNode, new SimpleUri("engine:shadowMapNode")); + renderGraph.addNode(shadowMapNode, "shadowMapNode"); } private void addReflectionNodes(RenderGraph renderGraph) { FBOConfig reflectedBufferConfig = new FBOConfig(BackdropReflectionNode.REFLECTED_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT).useDepthBuffer(); BufferClearingNode reflectedBufferClearingNode = new BufferClearingNode(reflectedBufferConfig, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - renderGraph.addNode(reflectedBufferClearingNode, new SimpleUri("engine:reflectedBufferClearingNode")); + renderGraph.addNode(reflectedBufferClearingNode, "reflectedBufferClearingNode"); Node reflectedBackdropNode = new BackdropReflectionNode(context); - renderGraph.addNode(reflectedBackdropNode, new SimpleUri("engine:reflectedBackdropNode")); + renderGraph.addNode(reflectedBackdropNode, "reflectedBackdropNode"); Node worldReflectionNode = new WorldReflectionNode(context); - renderGraph.addNode(worldReflectionNode, new SimpleUri("worldReflectionNode")); + renderGraph.addNode(worldReflectionNode, "worldReflectionNode"); } private void addSkyNodes(RenderGraph renderGraph) { FBOConfig reflectedRefractedBufferConfig = new FBOConfig(RefractiveReflectiveBlocksNode.REFRACTIVE_REFLECTIVE_FBO_URI, FULL_SCALE, FBO.Type.HDR).useNormalBuffer(); BufferClearingNode reflectedRefractedClearingNode = new BufferClearingNode(reflectedRefractedBufferConfig, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - renderGraph.addNode(reflectedRefractedClearingNode, new SimpleUri("engine:reflectedRefractedClearingNode")); + renderGraph.addNode(reflectedRefractedClearingNode, "reflectedRefractedClearingNode"); FBOConfig gBuffer1Config = displayResolutionDependentFBOs.getFboConfig(new SimpleUri("engine:fbo.gBuffer1")); // TODO: Remove the hard coded value here FBOConfig gBuffer2Config = displayResolutionDependentFBOs.getFboConfig(new SimpleUri("engine:fbo.gBuffer2")); // TODO: Remove the hard coded value here BufferClearingNode lastUpdatedGBufferClearingNode = new BufferClearingNode(gBuffer1Config, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - renderGraph.addNode(lastUpdatedGBufferClearingNode, new SimpleUri("engine:gBuffer1ClearingNode")); + renderGraph.addNode(lastUpdatedGBufferClearingNode, "gBuffer1ClearingNode"); BufferClearingNode staleGBufferClearingNode = new BufferClearingNode(gBuffer2Config, displayResolutionDependentFBOs, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - renderGraph.addNode(staleGBufferClearingNode, new SimpleUri("engine:gBuffer2ClearingNode")); + renderGraph.addNode(staleGBufferClearingNode, "gBuffer2ClearingNode"); Node backdropNode = new BackdropNode(context); - renderGraph.addNode(backdropNode, new SimpleUri("engine:backdropNode")); + renderGraph.addNode(backdropNode, "backdropNode"); DisplayResolutionDependentFBOs displayResolutionDependentFBOs = context.get(DisplayResolutionDependentFBOs.class); @@ -322,110 +322,110 @@ private void addSkyNodes(RenderGraph renderGraph) { String label = "hazeIntermediate"; HazeNode hazeIntermediateNode = new HazeNode(context, displayResolutionDependentFBOs.getGBufferPair().getLastUpdatedFbo(), hazeIntermediateFbo, label); - renderGraph.addNode(hazeIntermediateNode, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(hazeIntermediateNode, label + "Node"); FBOConfig hazeFinalConfig = new FBOConfig(HazeNode.FINAL_HAZE_FBO_URI, ONE_32TH_SCALE, FBO.Type.DEFAULT); FBO hazeFinalFbo = displayResolutionDependentFBOs.request(hazeFinalConfig); label = "hazeFinal"; HazeNode hazeFinalNode = new HazeNode(context, hazeIntermediateFbo, hazeFinalFbo, label); - renderGraph.addNode(hazeFinalNode, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(hazeFinalNode, label + "Node"); } private void addWorldRenderingNodes(RenderGraph renderGraph) { Node opaqueObjectsNode = new OpaqueObjectsNode(context); - renderGraph.addNode(opaqueObjectsNode, new SimpleUri("engine:opaqueObjectsNode")); + renderGraph.addNode(opaqueObjectsNode, "opaqueObjectsNode"); Node opaqueBlocksNode = new OpaqueBlocksNode(context); - renderGraph.addNode(opaqueBlocksNode, new SimpleUri("engine:opaqueBlocksNode")); + renderGraph.addNode(opaqueBlocksNode, "opaqueBlocksNode"); Node alphaRejectBlocksNode = new AlphaRejectBlocksNode(context); - renderGraph.addNode(alphaRejectBlocksNode, new SimpleUri("engine:alphaRejectBlocksNode")); + renderGraph.addNode(alphaRejectBlocksNode, "alphaRejectBlocksNode"); Node overlaysNode = new OverlaysNode(context); - renderGraph.addNode(overlaysNode, new SimpleUri("engine:overlaysNode")); + renderGraph.addNode(overlaysNode, "overlaysNode"); // TODO: remove this, including associated method in the RenderSystem interface Node firstPersonViewNode = new FirstPersonViewNode(context); - renderGraph.addNode(firstPersonViewNode, new SimpleUri("engine:firstPersonViewNode")); + renderGraph.addNode(firstPersonViewNode, "firstPersonViewNode"); } private void addLightingNodes(RenderGraph renderGraph) { Node deferredPointLightsNode = new DeferredPointLightsNode(context); - renderGraph.addNode(deferredPointLightsNode, new SimpleUri("engine:DeferredPointLightsNode")); + renderGraph.addNode(deferredPointLightsNode, "DeferredPointLightsNode"); Node deferredMainLightNode = new DeferredMainLightNode(context); - renderGraph.addNode(deferredMainLightNode, new SimpleUri("engine:deferredMainLightNode")); + renderGraph.addNode(deferredMainLightNode, "deferredMainLightNode"); Node applyDeferredLightingNode = new ApplyDeferredLightingNode(context); - renderGraph.addNode(applyDeferredLightingNode, new SimpleUri("engine:applyDeferredLightingNode")); + renderGraph.addNode(applyDeferredLightingNode, "applyDeferredLightingNode"); } private void addRefractiveReflectiveNode(RenderGraph renderGraph) { Node chunksRefractiveReflectiveNode = new RefractiveReflectiveBlocksNode(context); - renderGraph.addNode(chunksRefractiveReflectiveNode, new SimpleUri("engine:chunksRefractiveReflectiveNode")); + renderGraph.addNode(chunksRefractiveReflectiveNode, "chunksRefractiveReflectiveNode"); // TODO: consider having a non-rendering node for FBO.attachDepthBufferTo() methods } private void add3dDecorationNodes(RenderGraph renderGraph) { Node outlineNode = new OutlineNode(context); - renderGraph.addNode(outlineNode, new SimpleUri("engine:outlineNode")); + renderGraph.addNode(outlineNode, "outlineNode"); Node ambientOcclusionNode = new AmbientOcclusionNode(context); - renderGraph.addNode(ambientOcclusionNode, new SimpleUri("engine:ambientOcclusionNode")); + renderGraph.addNode(ambientOcclusionNode, "ambientOcclusionNode"); Node blurredAmbientOcclusionNode = new BlurredAmbientOcclusionNode(context); - renderGraph.addNode(blurredAmbientOcclusionNode, new SimpleUri("engine:blurredAmbientOcclusionNode")); + renderGraph.addNode(blurredAmbientOcclusionNode, "blurredAmbientOcclusionNode"); } private void addPrePostProcessingNodes(RenderGraph renderGraph) { // Pre-post-processing, just one more interaction with 3D data (semi-transparent objects, in SimpleBlendMaterialsNode) // and then it's 2D post-processing all the way to the image shown on the display. Node prePostCompositeNode = new PrePostCompositeNode(context); - renderGraph.addNode(prePostCompositeNode, new SimpleUri("engine:prePostCompositeNode")); + renderGraph.addNode(prePostCompositeNode, "prePostCompositeNode"); Node simpleBlendMaterialsNode = new SimpleBlendMaterialsNode(context); - renderGraph.addNode(simpleBlendMaterialsNode, new SimpleUri("engine:simpleBlendMaterialsNode")); + renderGraph.addNode(simpleBlendMaterialsNode, "simpleBlendMaterialsNode"); } private void addPostProcessingNodes(RenderGraph renderGraph) { // Post-Processing proper: tone mapping, light shafts, bloom and blur passes Node lightShaftsNode = new LightShaftsNode(context); - renderGraph.addNode(lightShaftsNode, new SimpleUri("engine:lightShaftsNode")); + renderGraph.addNode(lightShaftsNode, "lightShaftsNode"); Node initialPostProcessingNode = new InitialPostProcessingNode(context); - renderGraph.addNode(initialPostProcessingNode, new SimpleUri("engine:initialPostProcessingNode")); + renderGraph.addNode(initialPostProcessingNode, "initialPostProcessingNode"); FBOConfig gBuffer2Config = displayResolutionDependentFBOs.getFboConfig(new SimpleUri("engine:fbo.gBuffer2")); // TODO: Remove the hard coded value here String label = "downSampling_gBuffer_to_16x16px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo16pixels = new DownSamplerForExposureNode(context, gBuffer2Config, displayResolutionDependentFBOs, FBO_16X16_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo16pixels, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(exposureDownSamplerTo16pixels, label + "Node"); label = "downSampling_16x16px_to_8x8px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo8pixels = new DownSamplerForExposureNode(context, FBO_16X16_CONFIG, immutableFBOs, FBO_8X8_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo8pixels, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(exposureDownSamplerTo8pixels, label + "Node"); label = "downSampling_8x8px_to_4x4px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo4pixels = new DownSamplerForExposureNode(context, FBO_8X8_CONFIG, immutableFBOs, FBO_4X4_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo4pixels, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(exposureDownSamplerTo4pixels, label + "Node"); label = "downSampling_4x4px_to_2x2px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo2pixels = new DownSamplerForExposureNode(context, FBO_4X4_CONFIG, immutableFBOs, FBO_2X2_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo2pixels, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(exposureDownSamplerTo2pixels, label + "Node"); label = "downSampling_2x2px_to_1x1px_forExposure"; DownSamplerForExposureNode exposureDownSamplerTo1pixel = new DownSamplerForExposureNode(context, FBO_2X2_CONFIG, immutableFBOs, FBO_1X1_CONFIG, immutableFBOs, label); - renderGraph.addNode(exposureDownSamplerTo1pixel, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(exposureDownSamplerTo1pixel, label + "Node"); Node updateExposureNode = new UpdateExposureNode(context); - renderGraph.addNode(updateExposureNode, new SimpleUri("engine:updateExposureNode")); + renderGraph.addNode(updateExposureNode, "updateExposureNode"); Node toneMappingNode = new ToneMappingNode(context); - renderGraph.addNode(toneMappingNode, new SimpleUri("engine:toneMappingNode")); + renderGraph.addNode(toneMappingNode, "toneMappingNode"); // Bloom Effect: one high-pass filter and three blur passes Node highPassNode = new HighPassNode(context); - renderGraph.addNode(highPassNode, new SimpleUri("engine:highPassNode")); + renderGraph.addNode(highPassNode, "highPassNode"); DisplayResolutionDependentFBOs displayResolutionDependentFBOs = context.get(DisplayResolutionDependentFBOs.class); @@ -434,21 +434,21 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { label = "halfScaleBlurredBloom"; BloomBlurNode halfScaleBlurredBloom = new BloomBlurNode(context, displayResolutionDependentFBOs.get(HighPassNode.HIGH_PASS_FBO_URI), halfScaleBloomFbo, label); - renderGraph.addNode(halfScaleBlurredBloom, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(halfScaleBlurredBloom, label + "Node"); FBOConfig quarterScaleBloomConfig = new FBOConfig(BloomBlurNode.QUARTER_SCALE_FBO_URI, QUARTER_SCALE, FBO.Type.DEFAULT); FBO quarterScaleBloomFbo = displayResolutionDependentFBOs.request(quarterScaleBloomConfig); label = "quarterScaleBlurredBloom"; BloomBlurNode quarterScaleBlurredBloom = new BloomBlurNode(context, halfScaleBloomFbo, quarterScaleBloomFbo, label); - renderGraph.addNode(quarterScaleBlurredBloom, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(quarterScaleBlurredBloom, label + "Node"); FBOConfig one8thScaleBloomConfig = new FBOConfig(BloomBlurNode.ONE_8TH_SCALE_FBO_URI, ONE_8TH_SCALE, FBO.Type.DEFAULT); FBO one8thScaleBloomFbo = displayResolutionDependentFBOs.request(one8thScaleBloomConfig); label = "one8thScaleBlurredBloom"; BloomBlurNode one8thScaleBlurredBloom = new BloomBlurNode(context, quarterScaleBloomFbo, one8thScaleBloomFbo, label); - renderGraph.addNode(one8thScaleBlurredBloom, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(one8thScaleBlurredBloom, label + "Node"); // Late Blur nodes: assisting Motion Blur and Depth-of-Field effects FBOConfig firstLateBlurConfig = new FBOConfig(FIRST_LATE_BLUR_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT); @@ -456,25 +456,25 @@ private void addPostProcessingNodes(RenderGraph renderGraph) { label = "firstLateBlur"; LateBlurNode firstLateBlurNode = new LateBlurNode(context, displayResolutionDependentFBOs.get(ToneMappingNode.TONE_MAPPING_FBO_URI), firstLateBlurFbo, label); - renderGraph.addNode(firstLateBlurNode, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(firstLateBlurNode, label + "Node"); FBOConfig secondLateBlurConfig = new FBOConfig(SECOND_LATE_BLUR_FBO_URI, HALF_SCALE, FBO.Type.DEFAULT); FBO secondLateBlurFbo = displayResolutionDependentFBOs.request(secondLateBlurConfig); label = "secondLateBlur"; LateBlurNode secondLateBlurNode = new LateBlurNode(context, firstLateBlurFbo, secondLateBlurFbo, label); - renderGraph.addNode(secondLateBlurNode, new SimpleUri("engine:" + label + "Node")); + renderGraph.addNode(secondLateBlurNode, label + "Node"); Node finalPostProcessingNode = new FinalPostProcessingNode(context); - renderGraph.addNode(finalPostProcessingNode, new SimpleUri("engine:finalPostProcessingNode")); + renderGraph.addNode(finalPostProcessingNode, "finalPostProcessingNode"); } private void addOutputNodes(RenderGraph renderGraph) { Node copyToVRFrameBufferNode = new OutputToHMDNode(context); - renderGraph.addNode(copyToVRFrameBufferNode, new SimpleUri("engine:outputToVRFrameBufferNode")); + renderGraph.addNode(copyToVRFrameBufferNode, "outputToVRFrameBufferNode"); Node copyImageToScreenNode = new OutputToScreenNode(context); - renderGraph.addNode(copyImageToScreenNode, new SimpleUri("engine:outputToScreenNode")); + renderGraph.addNode(copyImageToScreenNode, "outputToScreenNode"); } @Override @@ -718,8 +718,8 @@ public void postSave() { } public void shutdown() { } @Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION) - public void dagNodeCommand(@CommandParam("nodeUri") final String nodeUri, @CommandParam("command") final String command, @CommandParam(value= "args") final String args[]) { + public void dagNodeCommand(@CommandParam("nodeUri") final String nodeUri, @CommandParam("command") final String command, @CommandParam(value= "args") final String... arguments) { Node node = renderGraph.findNode(new SimpleUri(nodeUri)); - node.handleCommand(command, args); + node.handleCommand(command, arguments); } } From ddd0521019060f21cc1aa7dda2209ccb059e39d9 Mon Sep 17 00:00:00 2001 From: vampcat Date: Thu, 24 Aug 2017 02:37:55 +0530 Subject: [PATCH 8/9] Added null check for FBO --- .../org/terasology/rendering/world/WorldRendererImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 22db232b156..cdeb1da42b6 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -718,8 +718,11 @@ public void postSave() { } public void shutdown() { } @Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION) - public void dagNodeCommand(@CommandParam("nodeUri") final String nodeUri, @CommandParam("command") final String command, @CommandParam(value= "args") final String... arguments) { + public void dagNodeCommand(@CommandParam("nodeUri") final String nodeUri, @CommandParam("command") final String command, @CommandParam(value= "arguments") final String... arguments) { Node node = renderGraph.findNode(new SimpleUri(nodeUri)); + if (node == null) { + throw new RuntimeException(("No node is associated with URI '" + nodeUri + "'")); + } node.handleCommand(command, arguments); } } From e32a352abb87e495d8d05cf9cfcdb2ddba0e250c Mon Sep 17 00:00:00 2001 From: vampcat Date: Thu, 24 Aug 2017 03:00:26 +0530 Subject: [PATCH 9/9] Indentation fix --- .../java/org/terasology/rendering/world/WorldRendererImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cdeb1da42b6..21aded71b84 100644 --- a/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java +++ b/engine/src/main/java/org/terasology/rendering/world/WorldRendererImpl.java @@ -619,7 +619,7 @@ public void dispose() { renderableWorld.dispose(); worldProvider.dispose(); // TODO: Shift this to a better place, after a RenderGraph class has been implemented. - SetViewportToSizeOf.disposeDefaultInstance(); + SetViewportToSizeOf.disposeDefaultInstance(); } @Override