diff --git a/CHANGES b/CHANGES index ede3ba75..7d610e0d 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ - Particle Effects auto start flag - Add support to Bitmap Fonts (.fnt) - Add support to TinyVG (.tvg) +- Add support for global scene shader - Bug fixes and stability improvements (as usual...) = Editor = diff --git a/hyperlap2d-runtime-libgdx b/hyperlap2d-runtime-libgdx index 70488d7e..7ffcfd00 160000 --- a/hyperlap2d-runtime-libgdx +++ b/hyperlap2d-runtime-libgdx @@ -1 +1 @@ -Subproject commit 70488d7e963a6b9144e3435979a9472b90b2d47a +Subproject commit 7ffcfd005c8e6f098b3950ef229933d5cbcfffb4 diff --git a/src/main/java/games/rednblack/editor/controller/commands/UpdateSceneDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/UpdateSceneDataCommand.java index 77150af3..6ce3567d 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/UpdateSceneDataCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/UpdateSceneDataCommand.java @@ -3,6 +3,7 @@ package games.rednblack.editor.controller.commands; import games.rednblack.editor.renderer.data.LightsPropertiesVO; import games.rednblack.editor.renderer.data.PhysicsPropertiesVO; import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.data.ShaderVO; import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.h2d.common.MsgAPI; @@ -11,6 +12,7 @@ public class UpdateSceneDataCommand extends EntityModifyRevertibleCommand { private SceneVO sceneVO; private PhysicsPropertiesVO physicsBackup; private LightsPropertiesVO lightsBackup; + private ShaderVO shaderBackup; @Override public void doAction() { @@ -18,9 +20,11 @@ public class UpdateSceneDataCommand extends EntityModifyRevertibleCommand { sceneVO = (SceneVO) payload[0]; PhysicsPropertiesVO physicsPropertiesVO = (PhysicsPropertiesVO) payload[1]; LightsPropertiesVO lightsPropertiesVO = (LightsPropertiesVO) payload[2]; + ShaderVO shaderVO = (ShaderVO) payload[3]; physicsBackup = new PhysicsPropertiesVO(sceneVO.physicsPropertiesVO); lightsBackup = new LightsPropertiesVO(sceneVO.lightsPropertiesVO); + shaderBackup = new ShaderVO(sceneVO.shaderVO); PhysicsPropertiesVO physicsVO = sceneVO.physicsPropertiesVO; physicsVO.gravityX = physicsPropertiesVO.gravityX; @@ -46,6 +50,9 @@ public class UpdateSceneDataCommand extends EntityModifyRevertibleCommand { lightsVO.enabled = lightsPropertiesVO.enabled; lightsVO.pseudo3d = lightsPropertiesVO.pseudo3d; + ShaderVO shader = sceneVO.shaderVO; + shader.shaderName = shaderVO.shaderName; + Sandbox.getInstance().sceneControl.updateAmbientLights(); facade.sendNotification(MsgAPI.ITEM_DATA_UPDATED); @@ -77,16 +84,20 @@ public class UpdateSceneDataCommand extends EntityModifyRevertibleCommand { lightsVO.enabled = lightsBackup.enabled; lightsVO.pseudo3d = lightsBackup.pseudo3d; + ShaderVO shader = sceneVO.shaderVO; + shader.shaderName = shaderBackup.shaderName; + Sandbox.getInstance().sceneControl.updateAmbientLights(); facade.sendNotification(MsgAPI.ITEM_DATA_UPDATED); } - public static Object payload(SceneVO scene, PhysicsPropertiesVO physicsPropertiesVO, LightsPropertiesVO lightsPropertiesVO) { - Object[] payload = new Object[3]; + public static Object payload(SceneVO scene, PhysicsPropertiesVO physicsPropertiesVO, LightsPropertiesVO lightsPropertiesVO, ShaderVO shaderVO) { + Object[] payload = new Object[4]; payload[0] = scene; payload[1] = physicsPropertiesVO; payload[2] = lightsPropertiesVO; + payload[3] = shaderVO; return payload; } diff --git a/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java index bbfe0b91..9f01e298 100644 --- a/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java +++ b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java @@ -252,9 +252,7 @@ public class VersionMigTo100 implements IVersionMigrator { target.light = new LightBodyDataVO(vo.light); } - target.shaderName = vo.shaderName; - target.shaderUniforms.clear(); - target.shaderUniforms.putAll(vo.shaderUniforms); + target.shader.set(vo.shader); target.renderingLayer = vo.renderingLayer; } diff --git a/src/main/java/games/rednblack/editor/graph/GraphContainer.java b/src/main/java/games/rednblack/editor/graph/GraphContainer.java index 27d851aa..86ef67d7 100644 --- a/src/main/java/games/rednblack/editor/graph/GraphContainer.java +++ b/src/main/java/games/rednblack/editor/graph/GraphContainer.java @@ -373,13 +373,13 @@ public class GraphContainer extends Table implements Naviga } } - for (Map.Entry connectionEntry : connections.entrySet()) { + /*for (Map.Entry connectionEntry : connections.entrySet()) { if (connectionEntry.getValue().contains(x, y)) { GraphConnection connection = connectionEntry.getKey(); removeConnection(connection); return; } - } + }*/ drawingFromConnector = null; } @@ -682,7 +682,7 @@ public class GraphContainer extends Table implements Naviga } } - BasicStroke basicStroke = new BasicStroke(7); + //BasicStroke basicStroke = new BasicStroke(7); Vector2 to = new Vector2(); for (GraphConnection graphConnection : graphConnections) { NodeConnector fromNode = getNodeInfo(graphConnection.getNodeFrom(), graphConnection.getFieldFrom()); @@ -694,9 +694,9 @@ public class GraphContainer extends Table implements Naviga GraphBoxInputConnector input = getGraphBoxById(toNode.getNodeId()).getInputs().get(toNode.getFieldId()); calculateConnection(to, toWindow, input); - Shape shape = basicStroke.createStrokedShape(new Line2D.Float(from.x, from.y, to.x, to.y)); + //Shape shape = basicStroke.createStrokedShape(new Line2D.Float(from.x, from.y, to.x, to.y)); - connections.put(graphConnection, shape); + //connections.put(graphConnection, shape); } } diff --git a/src/main/java/games/rednblack/editor/utils/asset/Asset.java b/src/main/java/games/rednblack/editor/utils/asset/Asset.java index e34ea33c..a79a7abe 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/Asset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/Asset.java @@ -81,21 +81,21 @@ public abstract class Asset implements IAsset { @Override public boolean exportAsset(MainItemVO item, ExportMapperVO exportMapperVO, File tmpDir) throws IOException { currentProjectPath = projectManager.getCurrentProjectPath() + File.separator; - copyShader(item.shaderName, tmpDir, exportMapperVO); + copyShader(item.shader, tmpDir, exportMapperVO); return true; } - private void copyShader(String shaderName, File tmpDir, ExportMapperVO exportMapperVO) throws IOException { - if (shaderName.equals("")) + private void copyShader(ShaderVO shaderVO, File tmpDir, ExportMapperVO exportMapperVO) throws IOException { + if (shaderVO.shaderName.equals("")) return; - File f = new File(currentProjectPath + ProjectManager.SHADER_DIR_PATH + File.separator + shaderName + ".frag"); + File f = new File(currentProjectPath + ProjectManager.SHADER_DIR_PATH + File.separator + shaderVO.shaderName + ".frag"); FileUtils.copyFileToDirectory(f, tmpDir); - File v = new File(currentProjectPath + ProjectManager.SHADER_DIR_PATH + File.separator + shaderName + ".vert"); + File v = new File(currentProjectPath + ProjectManager.SHADER_DIR_PATH + File.separator + shaderVO.shaderName + ".vert"); FileUtils.copyFileToDirectory(v, tmpDir); - exportMapperVO.mapper.add(new ExportMapperVO.ExportedAsset(AssetsUtils.TYPE_SHADER, shaderName + ".frag")); - exportMapperVO.mapper.add(new ExportMapperVO.ExportedAsset(AssetsUtils.TYPE_SHADER, shaderName + ".vert")); + exportMapperVO.mapper.add(new ExportMapperVO.ExportedAsset(AssetsUtils.TYPE_SHADER, shaderVO.shaderName + ".frag")); + exportMapperVO.mapper.add(new ExportMapperVO.ExportedAsset(AssetsUtils.TYPE_SHADER, shaderVO.shaderName + ".vert")); } } diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/ShaderAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/ShaderAsset.java index 1dcf482e..e0b9197a 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/ShaderAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/ShaderAsset.java @@ -99,8 +99,8 @@ public class ShaderAsset extends Asset { Array items = compositeItemVO.getAllItems(); for (MainItemVO itemVO : items) - if (itemVO.shaderName.equals(shaderName)) - itemVO.shaderName = ""; + if (itemVO.shader.shaderName.equals(shaderName)) + itemVO.shader.shaderName = ""; } } diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISceneProperties.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISceneProperties.java index f7993a25..4adc55e7 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISceneProperties.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISceneProperties.java @@ -19,28 +19,33 @@ package games.rednblack.editor.view.ui.properties.panels; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.Array; import com.kotcrab.vis.ui.util.Validators; import com.kotcrab.vis.ui.widget.*; import com.kotcrab.vis.ui.widget.spinner.Spinner; -import games.rednblack.editor.event.CheckBoxChangeListener; -import games.rednblack.editor.event.KeyboardListener; -import games.rednblack.editor.event.NumberSelectorOverlapListener; -import games.rednblack.editor.event.SelectBoxChangeListener; +import games.rednblack.editor.event.*; import games.rednblack.editor.view.ui.properties.UIAbstractProperties; import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; import games.rednblack.h2d.common.view.ui.widget.TintButton; +import java.util.HashMap; + public class UISceneProperties extends UIAbstractProperties { public static final String prefix = "games.rednblack.editor.view.ui.properties.panels.UISceneProperties"; public static final String AMBIENT_COLOR_BUTTON_CLICKED = prefix + ".AMBIENT_COLOR_BUTTON_CLICKED"; public static final String DIRECTIONAL_COLOR_BUTTON_CLICKED = prefix + ".DIRECTIONAL_COLOR_BUTTON_CLICKED"; + public static final String EDIT_SHADER_BUTTON_CLICKED = prefix + ".EDIT_SHADER_BUTTON_CLICKED"; + public static final String EDIT_SHADER_DONE = prefix + ".EDIT_SHADER_DONE"; + public static final String UNIFORMS_SHADER_BUTTON_CLICKED = prefix + ".UNIFORMS_SHADER_BUTTON_CLICKED"; + final private VisLabel pixelsPerWorldUnitField; final private VisLabel worldSizeField; final private VisCheckBox physicsEnabledCheckBox; @@ -56,6 +61,7 @@ public class UISceneProperties extends UIAbstractProperties { final private VisTextField directionalDegreeTextField; final private VisTextField directionalHeightTextField; final private TintButton directionalLightColor; + private final VisSelectBox shadersSelector; VisTable directionalTable = new VisTable(); @@ -89,6 +95,16 @@ public class UISceneProperties extends UIAbstractProperties { add(worldSizeField).width(30).left().padLeft(7); row().padTop(5); addSeparator().colspan(2).padTop(5).padBottom(5); + shadersSelector = StandardWidgetsFactory.createSelectBox(String.class); + add(new VisLabel("Scene Shader: ", Align.right)).padRight(5).width(75).right(); + add(shadersSelector).width(100).left().row(); + //TextButton editButton = StandardWidgetsFactory.createTextButton("Edit"); + //editButton.addListener(new ButtonToNotificationListener(EDIT_SHADER_BUTTON_CLICKED)); + //add(editButton).padTop(5).padRight(3); + //TextButton uniformsButton = StandardWidgetsFactory.createTextButton("Uniforms"); + //uniformsButton.addListener(new ButtonToNotificationListener(UNIFORMS_SHADER_BUTTON_CLICKED)); + //add(uniformsButton).padTop(5).row(); + addSeparator().colspan(2).padTop(5).padBottom(5); add(new VisLabel("Physics enabled:", Align.right)).padRight(5).width(115); add(physicsEnabledCheckBox).padLeft(1).left(); row().padTop(5); @@ -260,6 +276,22 @@ public class UISceneProperties extends UIAbstractProperties { worldSizeField.setText((resolutionWidth / value) + " x " + (resolutionHeight / value)); } + public void initShader(HashMap shaders) { + Array shaderNames = new Array<>(); + shaderNames.add("Default"); + shaders.keySet().forEach(shaderNames::add); + + shadersSelector.setItems(shaderNames); + } + + public String getShader() { + return shadersSelector.getSelected(); + } + + public void setSelectedShader(String currShaderName) { + shadersSelector.setSelected(currShaderName); + } + @Override public String getPrefix() { return this.getClass().getCanonicalName(); @@ -298,5 +330,6 @@ public class UISceneProperties extends UIAbstractProperties { facade.sendNotification(DIRECTIONAL_COLOR_BUTTON_CLICKED, directionalLightColor.getColorValue(), null); } }); + shadersSelector.addListener(new SelectBoxChangeListener(getUpdateEventName())); } } diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIScenePropertiesMediator.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIScenePropertiesMediator.java index 9b65d71b..d3c9e7b2 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIScenePropertiesMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIScenePropertiesMediator.java @@ -23,10 +23,8 @@ import com.kotcrab.vis.ui.widget.color.ColorPicker; import com.kotcrab.vis.ui.widget.color.ColorPickerAdapter; import games.rednblack.editor.controller.commands.UpdateSceneDataCommand; import games.rednblack.editor.proxy.ResolutionManager; -import games.rednblack.editor.renderer.data.LightsPropertiesVO; -import games.rednblack.editor.renderer.data.PhysicsPropertiesVO; -import games.rednblack.editor.renderer.data.ResolutionEntryVO; -import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.proxy.ResourceManager; +import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.editor.view.ui.properties.UIAbstractPropertiesMediator; import games.rednblack.h2d.common.MsgAPI; @@ -42,6 +40,8 @@ public class UIScenePropertiesMediator extends UIAbstractPropertiesMediator