Simple Global Scene Shaders

This commit is contained in:
fgnm
2022-04-11 14:44:19 +02:00
parent 7d0ddbf47e
commit 8979ec4dea
9 changed files with 88 additions and 31 deletions
+1
View File
@@ -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 =
@@ -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;
}
@@ -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;
}
@@ -373,13 +373,13 @@ public class GraphContainer<T extends FieldType> extends Table implements Naviga
}
}
for (Map.Entry<GraphConnection, Shape> connectionEntry : connections.entrySet()) {
/*for (Map.Entry<GraphConnection, Shape> 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<T extends FieldType> 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<T extends FieldType> extends Table implements Naviga
GraphBoxInputConnector<T> 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);
}
}
@@ -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"));
}
}
@@ -99,8 +99,8 @@ public class ShaderAsset extends Asset {
Array<MainItemVO> items = compositeItemVO.getAllItems();
for (MainItemVO itemVO : items)
if (itemVO.shaderName.equals(shaderName))
itemVO.shaderName = "";
if (itemVO.shader.shaderName.equals(shaderName))
itemVO.shader.shaderName = "";
}
}
@@ -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<String> 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<String, ShaderProgram> shaders) {
Array<String> 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()));
}
}
@@ -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<Scen
private static final String TAG = UIScenePropertiesMediator.class.getCanonicalName();
public static final String NAME = TAG;
private final ResourceManager resourceManager;
private final ColorPicker picker = new HyperLapColorPicker();
private final ColorPickerAdapter ambientColorListener = new ColorPickerAdapter() {
@Override
@@ -70,14 +70,19 @@ public class UIScenePropertiesMediator extends UIAbstractPropertiesMediator<Scen
public UIScenePropertiesMediator() {
super(NAME, new UISceneProperties());
resourceManager = facade.retrieveProxy(ResourceManager.NAME);
viewComponent.initShader(resourceManager.getShaders());
}
@Override
public String[] listNotificationInterests() {
String[] defaultNotifications = super.listNotificationInterests();
String[] notificationInterests = new String[]{
String[] notificationInterests = new String[] {
UISceneProperties.AMBIENT_COLOR_BUTTON_CLICKED,
UISceneProperties.DIRECTIONAL_COLOR_BUTTON_CLICKED
UISceneProperties.DIRECTIONAL_COLOR_BUTTON_CLICKED,
UISceneProperties.EDIT_SHADER_BUTTON_CLICKED,
UISceneProperties.UNIFORMS_SHADER_BUTTON_CLICKED
};
return ArrayUtils.addAll(defaultNotifications, notificationInterests);
@@ -108,6 +113,10 @@ public class UIScenePropertiesMediator extends UIAbstractPropertiesMediator<Scen
picker.setListener(directionalColorListener);
Sandbox.getInstance().getUIStage().addActor(picker.fadeIn());
break;
case UISceneProperties.EDIT_SHADER_BUTTON_CLICKED:
break;
case UISceneProperties.UNIFORMS_SHADER_BUTTON_CLICKED:
break;
default:
break;
}
@@ -135,6 +144,8 @@ public class UIScenePropertiesMediator extends UIAbstractPropertiesMediator<Scen
viewComponent.setLightsEnabled(lightsVO.enabled);
viewComponent.setPseudo3DLightsEnabled(lightsVO.pseudo3d);
viewComponent.setLightType(lightsVO.lightType);
viewComponent.setSelectedShader(item.shaderVO.shaderName);
}
@Override
@@ -165,7 +176,10 @@ public class UIScenePropertiesMediator extends UIAbstractPropertiesMediator<Scen
lightsVO.enabled = viewComponent.isLightsEnabled();
lightsVO.pseudo3d = viewComponent.isPseudo3DLightsEnabled();
Object payload = UpdateSceneDataCommand.payload(observableReference, physicsVO, lightsVO);
ShaderVO shaderVO = new ShaderVO();
shaderVO.shaderName = viewComponent.getShader();
Object payload = UpdateSceneDataCommand.payload(observableReference, physicsVO, lightsVO, shaderVO);
facade.sendNotification(MsgAPI.ACTION_UPDATE_SCENE_DATA, payload);
}
}