diff --git a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java index 87f10cf7..e631144b 100644 --- a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java @@ -528,6 +528,10 @@ public class ResourceManager extends Proxy implements IResourceRetriever { return shaderPrograms.get(shaderName); } + public void addShaderProgram(String name, ShaderProgram shaderProgram) { + shaderPrograms.put(name, shaderProgram); + } + public void removeShaderProgram(String shaderName) { shaderPrograms.remove(shaderName); } diff --git a/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialog.java b/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialog.java index 6dbf18fc..e3be7c15 100644 --- a/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialog.java +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialog.java @@ -20,6 +20,8 @@ public class ShaderManagerDialog extends H2DDialog { private final SimpleListAdapter shadersListAdapter; private final Array shaderItems = new Array<>(); + private final VisSelectBox newShaderTypeSelectBox; + public static final String prefix = "games.rednblack.editor.view.ui.dialog.ShaderManagerDialog"; public static final String EDIT_FRAGMENT_SHADER = prefix + ".EDIT_FRAGMENT_SHADER"; @@ -27,6 +29,8 @@ public class ShaderManagerDialog extends H2DDialog { public static final String EDIT_FRAGMENT_SHADER_DONE = prefix + ".EDIT_FRAGMENT_SHADER_DONE"; public static final String EDIT_VERTEX_SHADER_DONE = prefix + ".EDIT_VERTEX_SHADER_DONE"; + public static final String CREATE_NEW_SHADER = prefix + ".CREATE_NEW_SHADER"; + public ShaderManagerDialog() { super("Shader Manager"); @@ -43,27 +47,29 @@ public class ShaderManagerDialog extends H2DDialog { getContentTable().add(shaderList.getMainTable()).uniformX().grow(); VisTextField newShaderName = StandardWidgetsFactory.createTextField(); - newShaderName.setMessageText("Create New Shader"); + newShaderName.setMessageText("New Shader Name"); getButtonsTable().add(newShaderName).growX(); - VisTextButton newShaderButton = StandardWidgetsFactory.createTextButton("Simple"); + VisTextButton newShaderButton = StandardWidgetsFactory.createTextButton("Create"); newShaderButton.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { + if (newShaderName.getText().isEmpty()) return; + Object[] payload = new Object[2]; + payload[0] = newShaderName.getText(); + payload[1] = newShaderTypeSelectBox.getSelectedIndex(); + + HyperLap2DFacade.getInstance().sendNotification(CREATE_NEW_SHADER, payload); } }); - VisTextButton newScreenReadingShaderButton = StandardWidgetsFactory.createTextButton("Screen Reading"); - newShaderButton.addListener(new ClickListener() { - @Override - public void clicked(InputEvent event, float x, float y) { - - } - }); + String[] data = {"Simple", "Simple Array", "Screen Reading", "Screen Reading Array"}; + newShaderTypeSelectBox = StandardWidgetsFactory.createSelectBox(String.class); + newShaderTypeSelectBox.setItems(data); + getButtonsTable().add(newShaderTypeSelectBox); getButtonsTable().add(newShaderButton).pad(2); - getButtonsTable().add(newScreenReadingShaderButton).pad(2); getCell(getButtonsTable()).growX(); } diff --git a/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialogMediator.java b/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialogMediator.java index 4f336256..63bf62c9 100644 --- a/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialogMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/ShaderManagerDialogMediator.java @@ -1,14 +1,18 @@ package games.rednblack.editor.view.ui.dialog; +import com.badlogic.gdx.files.FileHandle; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.code.syntax.GLSLSyntax; import games.rednblack.editor.controller.commands.resource.DeleteShaderCommand; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.proxy.ResourceManager; +import games.rednblack.editor.renderer.utils.DefaultShaders; +import games.rednblack.editor.renderer.utils.ShaderCompiler; import games.rednblack.editor.view.menu.ResourcesMenu; import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.editor.view.stage.UIStage; import games.rednblack.h2d.common.MsgAPI; +import org.apache.commons.io.FileUtils; import org.puremvc.java.interfaces.INotification; import org.puremvc.java.patterns.mediator.Mediator; @@ -43,6 +47,7 @@ public class ShaderManagerDialogMediator extends Mediator { ShaderManagerDialog.EDIT_VERTEX_SHADER_DONE, ShaderManagerDialog.EDIT_FRAGMENT_SHADER, ShaderManagerDialog.EDIT_VERTEX_SHADER, + ShaderManagerDialog.CREATE_NEW_SHADER, DeleteShaderCommand.DONE }; } @@ -103,6 +108,48 @@ public class ShaderManagerDialogMediator extends Mediator { e.printStackTrace(); } break; + case ShaderManagerDialog.CREATE_NEW_SHADER: + payload = notification.getBody(); + createNewShader((String) payload[0], (int) payload[1]); + break; + } + } + + private void createNewShader(String name, int type) { + String vertex = null; + String fragment = null; + + switch (type) { + case 0: + vertex = DefaultShaders.DEFAULT_VERTEX_SHADER; + fragment = DefaultShaders.DEFAULT_FRAGMENT_SHADER; + break; + case 1: + vertex = DefaultShaders.DEFAULT_ARRAY_VERTEX_SHADER; + fragment = DefaultShaders.DEFAULT_ARRAY_FRAGMENT_SHADER; + break; + case 2: + case 3: + break; + } + + if (vertex == null || fragment == null) return; + + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + ResourceManager rm = facade.retrieveProxy(ResourceManager.NAME); + + FileHandle vert = new FileHandle(projectManager.getCurrentProjectPath() + File.separator + + ProjectManager.SHADER_DIR_PATH + File.separator + name + ".vert"); + FileHandle frag = new FileHandle(projectManager.getCurrentProjectPath() + File.separator + + ProjectManager.SHADER_DIR_PATH + File.separator + name + ".frag"); + + try { + FileUtils.writeStringToFile(vert.file(), vertex, "utf-8"); + FileUtils.writeStringToFile(frag.file(), fragment, "utf-8"); + rm.addShaderProgram(name, ShaderCompiler.compileShader(vertex, fragment)); + viewComponent.updateShaderList(rm.getShaders().keySet()); + } catch (IOException e) { + e.printStackTrace(); } } }