GuiAssetAdder now allows to add/remove/edit Assets in a Replay. These Assets are not being saved yet.

This commit is contained in:
CrushedPixel
2015-07-06 16:39:30 +02:00
parent bf7b28d53c
commit 948803571d
14 changed files with 283 additions and 62 deletions

View File

@@ -1,20 +1,24 @@
package eu.crushedpixel.replaymod.gui;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.gui.elements.GuiAdvancedTextField;
import eu.crushedpixel.replaymod.gui.elements.GuiEntryList;
import eu.crushedpixel.replaymod.gui.elements.GuiFileChooser;
import eu.crushedpixel.replaymod.gui.elements.GuiNumberInput;
import eu.crushedpixel.replaymod.gui.elements.*;
import eu.crushedpixel.replaymod.gui.elements.listeners.FileChooseListener;
import eu.crushedpixel.replaymod.gui.elements.listeners.SelectionListener;
import eu.crushedpixel.replaymod.holders.CustomImageObject;
import eu.crushedpixel.replaymod.holders.Position;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.resources.I18n;
import net.minecraftforge.fml.client.config.GuiCheckBox;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class GuiAssetAdder extends GuiScreen {
@@ -32,6 +36,8 @@ public class GuiAssetAdder extends GuiScreen {
private GuiNumberInput xInput, yInput, zInput, yawInput, pitchInput, rollInput, scaleInput;
private GuiCheckBox backVisibleCheckBox;
private List<GuiTextField> textFields = new ArrayList<GuiTextField>();
public GuiAssetAdder() {
ReplayMod.replaySender.setReplaySpeed(0);
}
@@ -42,6 +48,12 @@ public class GuiAssetAdder extends GuiScreen {
screenTitle = I18n.format("replaymod.gui.assets.title");
objectList = new GuiEntryList<CustomImageObject>(0, fontRendererObj, 0, 0, 0, 0);
objectList.setEmptyMessage(I18n.format("replaymod.gui.assets.emptylist"));
for(CustomImageObject object : ReplayHandler.getCustomImageObjects()) {
objectList.addElement(object);
}
removeButton = new GuiButton(GuiConstants.ASSET_ADDER_REMOVE_BUTTON, 0, 0, I18n.format("replaymod.gui.remove"));
addButton = new GuiFileChooser(1, 0, 0, I18n.format("replaymod.gui.add"), null, ImageIO.getReaderFileSuffixes()) {
@@ -51,16 +63,89 @@ public class GuiAssetAdder extends GuiScreen {
addButton.registerListener(new FileChooseListener() {
@Override
public void onFileChosen(File file) {
try {
objectList.addElement(new CustomImageObject(new Position(mc.getRenderViewEntity()),
I18n.format("replaymod.gui.assets.defaultname"), file, true));
} catch(IOException e) {
e.printStackTrace();
}
}
});
guiFileChooser = new GuiFileChooser(2, 0, 0, I18n.format("replaymod.gui.assets.filechooser")+": ", null, ImageIO.getReaderFileSuffixes());
nameInput = new GuiAdvancedTextField(fontRendererObj, 2, 0, 0, 20);
nameInput.hint = I18n.format("replaymod.gui.assets.namehint");
xInput = new GuiNumberInput(3, fontRendererObj, 0, 0, 0, null, null, 0d, true);
yInput = new GuiNumberInput(4, fontRendererObj, 0, 0, 0, null, null, 0d, true);
zInput = new GuiNumberInput(5, fontRendererObj, 0, 0, 0, null, null, 0d, true);
yawInput = new GuiNumberInput(6, fontRendererObj, 0, 0, 0, -360d, 360d, 0d, true);
pitchInput = new GuiNumberInput(7, fontRendererObj, 0, 0, 0, -360d, 360d, 0d, true);
rollInput = new GuiNumberInput(8, fontRendererObj, 0, 0, 0, -360d, 360d, 0d, true);
scaleInput = new GuiNumberInputWithText(9, fontRendererObj, 0, 0, 0, 0d, 10000d, 100d, true, "%");
backVisibleCheckBox = new GuiCheckBox(10, 0, 0, I18n.format("replaymod.gui.assets.backvisible"), true);
guiFileChooser = new GuiFileChooser(3, 0, 0, I18n.format("replaymod.gui.assets.filechooser")+": ", null, ImageIO.getReaderFileSuffixes());
guiFileChooser.registerListener(new FileChooseListener() {
@Override
public void onFileChosen(File file) {
try {
objectList.getElement(objectList.getSelectionIndex()).setImageFile(file);
} catch(Exception e) {
e.printStackTrace();
}
}
});
guiFileChooser.enabled = false;
textFields.add(objectList);
textFields.add(nameInput);
textFields.add(xInput);
textFields.add(yInput);
textFields.add(zInput);
textFields.add(pitchInput);
textFields.add(yawInput);
textFields.add(rollInput);
textFields.add(scaleInput);
objectList.addSelectionListener(new SelectionListener() {
@Override
public void onSelectionChanged(int selectionIndex) {
CustomImageObject object = objectList.getElement(selectionIndex);
if(object == null) {
guiFileChooser.enabled = false;
for(GuiTextField tf : textFields) {
tf.setEnabled(false);
}
return;
}
guiFileChooser.enabled = true;
for(GuiTextField tf : textFields) {
tf.setEnabled(true);
}
nameInput.setText(object.getName());
guiFileChooser.setSelectedFile(object.getImageFile());
xInput.setValue(object.getPosition().getX());
yInput.setValue(object.getPosition().getY());
zInput.setValue(object.getPosition().getZ());
pitchInput.setValue(object.getPosition().getPitch());
yawInput.setValue(object.getPosition().getYaw());
rollInput.setValue(object.getPosition().getRoll());
scaleInput.setValue(object.getPosition().getScale()*100);
}
});
if(objectList.getEntryCount() > 0) {
objectList.setSelectionIndex(0);
}
}
int h = (int)Math.floor(((double)this.height-(45+20+15+20))/14);
objectList.width = guiFileChooser.width = 150;
objectList.width = guiFileChooser.width = nameInput.width = 150;
objectList.xPosition = width/2 - objectList.width - 5;
objectList.setVisibleElements(h);
objectList.yPosition = 45;
@@ -70,8 +155,21 @@ public class GuiAssetAdder extends GuiScreen {
removeButton.xPosition = addButton.xPosition+addButton.width;
addButton.yPosition = removeButton.yPosition = objectList.yPosition + objectList.height + 2;
nameInput.xPosition = this.width/2 + 5;
nameInput.yPosition = 45;
guiFileChooser.xPosition = this.width/2 + 5;
guiFileChooser.yPosition = 45;
guiFileChooser.yPosition = nameInput.yPosition + 20 + 5;
xInput.yPosition = yInput.yPosition = zInput.yPosition = guiFileChooser.yPosition + 20 + 5 + 15;
yawInput.yPosition = pitchInput.yPosition = rollInput.yPosition = xInput.yPosition + 20 + 5 + 15;
scaleInput.yPosition = yawInput.yPosition + 20 + 5 + 15;
xInput.xPosition = scaleInput.xPosition = pitchInput.xPosition = this.width/2 + 8;
yInput.xPosition = yawInput.xPosition = xInput.xPosition + 50;
zInput.xPosition = rollInput.xPosition = yInput.xPosition + 50;
xInput.width = yInput.width = zInput.width = yawInput.width = pitchInput.width = rollInput.width = scaleInput.width = 43;
buttonList.add(removeButton);
buttonList.add(addButton);
@@ -89,13 +187,74 @@ public class GuiAssetAdder extends GuiScreen {
drawGradientRect(leftBorder, topBorder, width - leftBorder, this.height - 10, -1072689136, -804253680);
objectList.drawTextBox();
for(GuiTextField textField : textFields) {
textField.drawTextBox();
}
drawCenteredString(fontRendererObj, "X", xInput.xPosition + (xInput.width/2), xInput.yPosition - 12, Color.WHITE.getRGB());
drawCenteredString(fontRendererObj, "Y", yInput.xPosition + (yInput.width/2), yInput.yPosition - 12, Color.WHITE.getRGB());
drawCenteredString(fontRendererObj, "Z", zInput.xPosition + (zInput.width/2), zInput.yPosition - 12, Color.WHITE.getRGB());
drawCenteredString(fontRendererObj, "Yaw", yawInput.xPosition + (yawInput.width/2), yawInput.yPosition - 12, Color.WHITE.getRGB());
drawCenteredString(fontRendererObj, "Pitch", pitchInput.xPosition + (pitchInput.width/2), pitchInput.yPosition - 12, Color.WHITE.getRGB());
drawCenteredString(fontRendererObj, "Roll", rollInput.xPosition + (rollInput.width/2), rollInput.yPosition - 12, Color.WHITE.getRGB());
drawCenteredString(fontRendererObj, "Scale", scaleInput.xPosition + (scaleInput.width/2), scaleInput.yPosition - 12, Color.WHITE.getRGB());
super.drawScreen(mouseX, mouseY, partialTicks);
}
@Override
public void updateScreen() {
super.updateScreen();
for(GuiTextField textField : textFields) {
textField.updateCursorCounter();
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
for(GuiTextField textField : textFields) {
textField.mouseClicked(mouseX, mouseY, mouseButton);
}
super.mouseClicked(mouseX, mouseY, mouseButton);
}
@Override
protected void keyTyped(char typedChar, int keyCode) throws IOException {
for(GuiTextField textField : textFields) {
textField.textboxKeyTyped(typedChar, keyCode);
}
super.keyTyped(typedChar, keyCode);
if(guiFileChooser.enabled) {
CustomImageObject current = objectList.getElement(objectList.getSelectionIndex());
if(current == null) return;
current.setName(nameInput.getText().trim());
current.getPosition().setX(xInput.getPreciseValue());
current.getPosition().setY(yInput.getPreciseValue());
current.getPosition().setZ(zInput.getPreciseValue());
current.getPosition().setPitch((float) pitchInput.getPreciseValue());
current.getPosition().setYaw((float) yawInput.getPreciseValue());
current.getPosition().setRoll((float) rollInput.getPreciseValue());
current.getPosition().setScale((float)scaleInput.getPreciseValue()/100f);
}
}
@Override
public void onGuiClosed() {
ReplayHandler.setCustomImageObjects(objectList.getCopyOfElements());
}
@Override
protected void actionPerformed(GuiButton button) throws IOException {
if(!button.enabled) return;
if(button.id == GuiConstants.ASSET_ADDER_REMOVE_BUTTON) {
CustomImageObject current = objectList.getElement(objectList.getSelectionIndex());
if(current == null) return;
objectList.removeElement(objectList.getSelectionIndex());
}
}
}

View File

@@ -7,6 +7,7 @@ import eu.crushedpixel.replaymod.gui.elements.GuiArrowButton;
import eu.crushedpixel.replaymod.gui.elements.GuiNumberInput;
import eu.crushedpixel.replaymod.holders.*;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.RoundUtils;
import eu.crushedpixel.replaymod.utils.TimestampUtils;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
@@ -113,12 +114,12 @@ public class GuiEditKeyframe extends GuiScreen {
//Position/Virtual Time Input
if(posKeyframe) {
Position pos = ((PositionKeyframe)keyframe).getPosition();
xCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_X_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getX()), true);
yCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_Y_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getY()), true);
zCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_Z_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getZ()), true);
yaw = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_YAW_INPUT, fontRendererObj, 0, 0, 100, -90d, 90d, round(pos.getYaw()), true);
pitch = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_PITCH_INPUT, fontRendererObj, 0, 0, 100, -180d, 180d, round(pos.getPitch()), true);
roll = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_ROLL_INPUT, fontRendererObj, 0, 0, 100, null, null, round(pos.getRoll()), true);
xCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_X_INPUT, fontRendererObj, 0, 0, 100, null, null, RoundUtils.round(pos.getX()), true);
yCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_Y_INPUT, fontRendererObj, 0, 0, 100, null, null, RoundUtils.round(pos.getY()), true);
zCoord = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_Z_INPUT, fontRendererObj, 0, 0, 100, null, null, RoundUtils.round(pos.getZ()), true);
yaw = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_YAW_INPUT, fontRendererObj, 0, 0, 100, -90d, 90d, RoundUtils.round(pos.getYaw()), true);
pitch = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_PITCH_INPUT, fontRendererObj, 0, 0, 100, -180d, 180d, RoundUtils.round(pos.getPitch()), true);
roll = new GuiNumberInput(GuiConstants.KEYFRAME_EDITOR_ROLL_INPUT, fontRendererObj, 0, 0, 100, null, null, RoundUtils.round(pos.getRoll()), true);
posInputs.add(xCoord);
posInputs.add(yCoord);
@@ -267,10 +268,6 @@ public class GuiEditKeyframe extends GuiScreen {
super.drawScreen(mouseX, mouseY, partialTicks);
}
private double round(double val) {
return Math.round(val*100.0) / 100.0;
}
@Override
protected void actionPerformed(GuiButton button) throws IOException {
if(!button.enabled) return;

View File

@@ -106,18 +106,7 @@ public class GuiRenderSettings extends GuiScreen {
}
};
bitrateInput = new GuiNumberInput(GuiConstants.RENDER_SETTINGS_BITRATE_INPUT, fontRendererObj, 0, 0, 50, 1D, null, 10000D, false) {
@Override
public void drawTextBox() {
int index = getCursorPosition();
String textBefore = getText();
setText(textBefore+" kbps");
setCursorPosition(index);
super.drawTextBox();
setText(textBefore);
setCursorPosition(index);
}
};
bitrateInput = new GuiNumberInputWithText(GuiConstants.RENDER_SETTINGS_BITRATE_INPUT, fontRendererObj, 0, 0, 50, 1D, null, 10000D, false, " kbps");
xRes.setEnabled(false);
yRes.setEnabled(false);

View File

@@ -36,7 +36,7 @@ public class GuiAdvancedTextField extends GuiTextField implements GuiElement {
@Override
public void drawTextBox() {
if (text.isEmpty() && !isFocused()) {
if (text.isEmpty() && !isFocused() && hint.length() > 0) {
super.setEnabled(false);
super.setDisabledTextColour(hintTextColor);
text = hint;

View File

@@ -120,10 +120,10 @@ public class GuiEntryList<T extends GuiEntryListEntry> extends GuiTextField {
}
public void addElement(T element) {
if(element == null) return;
this.elements.add(element);
if(selectionIndex == -1) {
selectionIndex = 0;
}
selectionIndex = elements.size()-1;
fireSelectionChangeEvent();
}
public T getElement(int index) {

View File

@@ -2,7 +2,6 @@ package eu.crushedpixel.replaymod.gui.elements;
import eu.crushedpixel.replaymod.gui.elements.listeners.FileChooseListener;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
@@ -15,9 +14,13 @@ import java.util.List;
public class GuiFileChooser extends GuiButton {
@Getter
@Setter
private File selectedFile;
public void setSelectedFile(File selectedFile) {
this.selectedFile = selectedFile;
updateDisplayString();
}
private String baseString;
private String[] allowedExtensions = null;
@@ -70,8 +73,9 @@ public class GuiFileChooser extends GuiButton {
fileDialog.setVisible(true);
String filename = fileDialog.getFile();
String directory = fileDialog.getDirectory();
if(filename != null) {
selectedFile = new File(filename);
selectedFile = new File(directory, filename);
updateDisplayString();

View File

@@ -15,12 +15,9 @@ public class GuiNumberInput extends GuiTextField {
this.minimum = minimum;
this.maximum = maximum;
this.acceptFloats = acceptFloats;
setCursorPositionZero();
if(defaultValue != null) {
if(acceptFloats) {
setText("" + defaultValue);
} else {
setText("" + (int)Math.round(defaultValue));
}
setValue(defaultValue);
}
}
@@ -29,6 +26,15 @@ public class GuiNumberInput extends GuiTextField {
this(id, fontRenderer, xPos, yPos, width, (double) minimum, (double) maximum, (double) defaultValue, acceptFloats);
}
public void setValue(double value) {
if(acceptFloats) {
setText("" + value);
} else {
setText("" + (int)Math.round(value));
}
setCursorPositionZero();
}
@Override
public void writeText(String text) {
String textBefore = getText();

View File

@@ -0,0 +1,32 @@
package eu.crushedpixel.replaymod.gui.elements;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
public class GuiNumberInputWithText extends GuiNumberInput {
private final Minecraft mc = Minecraft.getMinecraft();
private String suffix;
public GuiNumberInputWithText(int id, FontRenderer fontRenderer,
int xPos, int yPos, int width, Double minimum, Double maximum, Double defaultValue,
boolean acceptFloats, String suffix) {
super(id, fontRenderer, xPos, yPos, width, minimum, maximum, defaultValue, acceptFloats);
if(suffix == null) suffix = "";
this.suffix = suffix;
}
@Override
public void drawTextBox() {
int index = getCursorPosition();
String textBefore = getText();
setText(textBefore + suffix);
setCursorPosition(index);
super.drawTextBox();
setText(textBefore);
setCursorPosition(index);
}
}

View File

@@ -1,6 +1,7 @@
package eu.crushedpixel.replaymod.holders;
import eu.crushedpixel.replaymod.registry.ResourceHelper;
import eu.crushedpixel.replaymod.utils.RoundUtils;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.client.Minecraft;
@@ -14,8 +15,25 @@ import java.io.IOException;
public class CustomImageObject implements GuiEntryListEntry {
public CustomImageObject(Position position, String name, File imageSource, boolean backVisible) throws IOException {
BufferedImage bufferedImage = ImageIO.read(imageSource);
public CustomImageObject(Position position, String name, final File imageSource, boolean backVisible) throws IOException {
this.position = new ExtendedPosition(RoundUtils.round(position.getX()), RoundUtils.round(position.getY()), RoundUtils.round(position.getZ()), 0, 0);
this.name = name;
this.backVisible = backVisible;
setImageFile(imageSource);
}
@Getter @Setter private ExtendedPosition position;
@Getter @Setter private String name;
@Getter @Setter private boolean backVisible;
@Getter private File imageFile;
public void setImageFile(final File imageSource) throws IOException {
this.imageFile = imageSource;
final BufferedImage bufferedImage = ImageIO.read(imageSource);
this.textureWidth = bufferedImage.getWidth();
this.textureHeight = bufferedImage.getHeight();
@@ -31,19 +49,18 @@ public class CustomImageObject implements GuiEntryListEntry {
h = 1;
}
this.position = new ExtendedPosition(position.getX(), position.getY(), position.getZ(), w, h);
this.name = name;
this.position.setWidth(w);
this.position.setHeight(h);
this.resourceLocation = new ResourceLocation("customImages/"+imageSource.getAbsolutePath());
this.dynamicTexture = new DynamicTexture(bufferedImage);
this.backVisible = backVisible;
Minecraft.getMinecraft().addScheduledTask(new Runnable() {
@Override
public void run() {
resourceLocation = new ResourceLocation("customImages/"+imageSource.getAbsolutePath());
dynamicTexture = new DynamicTexture(bufferedImage);
}
});
}
@Getter @Setter private ExtendedPosition position;
@Getter @Setter private String name;
@Getter @Setter private boolean backVisible;
private ResourceLocation resourceLocation;
private DynamicTexture dynamicTexture;

View File

@@ -3,6 +3,6 @@ package eu.crushedpixel.replaymod.holders;
public interface GuiEntryListEntry {
public String getDisplayString();
String getDisplayString();
}

View File

@@ -95,10 +95,12 @@ public class CustomObjectRenderer {
renderer.addVertexWithUV(maxX, maxY, 0, 0, 0);
renderer.addVertexWithUV(maxX, minY, 0, 0, 1);
renderer.addVertexWithUV(maxX, maxY, 0, 0, 0);
renderer.addVertexWithUV(minX, maxY, 0, 1, 0);
renderer.addVertexWithUV(minX, minY, 0, 1, 1);
renderer.addVertexWithUV(maxX, minY, 0, 0, 1);
if(customImageObject.isBackVisible()) {
renderer.addVertexWithUV(maxX, maxY, 0, 0, 0);
renderer.addVertexWithUV(minX, maxY, 0, 1, 0);
renderer.addVertexWithUV(minX, minY, 0, 1, 1);
renderer.addVertexWithUV(maxX, minY, 0, 0, 1);
}
tessellator.draw();
renderer.setTranslation(0, 0, 0);

View File

@@ -744,4 +744,8 @@ public class ReplayHandler {
public static void addCustomImageObject(CustomImageObject object) {
customImageObjects.add(object);
}
public static void setCustomImageObjects(List<CustomImageObject> objects) {
customImageObjects = objects;
}
}

View File

@@ -0,0 +1,7 @@
package eu.crushedpixel.replaymod.utils;
public class RoundUtils {
public static double round(double val) { return Math.round(val*100.0) / 100.0; }
}

View File

@@ -359,4 +359,8 @@ replaymod.gui.clearcallback.message=This Callback can be disabled in the Replay
#Asset Adder Gui
replaymod.gui.assets.title=Asset Manager
replaymod.gui.assets.filechooser=Image File
replaymod.gui.assets.filechooser=Image File
replaymod.gui.assets.defaultname=New Asset
replaymod.gui.assets.emptylist=No Assets available
replaymod.gui.assets.namehint=Asset Name
replaymod.gui.assets.backvisible=Visible from behind