Working create new shader

This commit is contained in:
fgnm
2022-04-07 19:06:21 +02:00
parent 9beb37bfa7
commit 572b54d5f2
3 changed files with 67 additions and 10 deletions
@@ -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);
}
@@ -20,6 +20,8 @@ public class ShaderManagerDialog extends H2DDialog {
private final SimpleListAdapter<String> shadersListAdapter;
private final Array<String> shaderItems = new Array<>();
private final VisSelectBox<String> 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();
}
@@ -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> {
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<ShaderManagerDialog> {
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();
}
}
}