From 1fb35d5c74332a840c209471a27630de494de49f Mon Sep 17 00:00:00 2001 From: Tyron Date: Fri, 5 Feb 2021 15:01:51 +0200 Subject: [PATCH] - feature: Added quick controls for the UV fields. - Can hold CTRL + Mousewheel to move UVs in single pixel increments - Can hold SHIFT + Mousewheel to move UVs in 0.1 steps - tweak: re-added 'vs model creator' text in center pane for balduranne - fixed: fixed highlighted/selected UV rects not visible behind other UVs in the left pane code cleanup --- .../modelcreator/gui/ControlsDialog.java | 11 +- .../modelcreator/gui/left/LeftUVSidebar.java | 169 ++++--- .../gui/middle/ModelRenderer.java | 5 +- .../gui/right/face/ElementUVPanel.java | 92 ++-- .../gui/right/face/FaceUVPanel.java | 448 ++++++++---------- .../vintagestory/modelcreator/model/Face.java | 8 +- .../modelcreator/model/RenderFaceTask.java | 12 + 7 files changed, 386 insertions(+), 359 deletions(-) create mode 100644 src/at/vintagestory/modelcreator/model/RenderFaceTask.java diff --git a/src/at/vintagestory/modelcreator/gui/ControlsDialog.java b/src/at/vintagestory/modelcreator/gui/ControlsDialog.java index 3741bbe..5dab3eb 100644 --- a/src/at/vintagestory/modelcreator/gui/ControlsDialog.java +++ b/src/at/vintagestory/modelcreator/gui/ControlsDialog.java @@ -55,10 +55,15 @@ public static void show(JFrame parent) + "
  • Hold CTRL and click on any up/down arrows of the cubes position to not move the origin
  • " + "
  • Focus any of the position/origin/size text fields and use mouse wheel to modify increase/decrease the size in -1/+1 (also works in conjunction with the CTRL and Shift modifiers)
  • " + "" - + "

    Face Pane (Right)

    " + + "

    Face Pane, UVs (Right)

    " + + "
      " + + "
    • Hold SHIFT and mousewheel or click on any of the up/down arrows to modify in increments of 0.1
    • " + + "
    • Hold CTRL and mousewheel or click on any of the up/down arrows to modify in increments of single texture pixels
    • " + + "
    " + + "

    Face Pane, Textures (Right)

    " + "
      " + "
    • Press Copy Button and then hold SHIFT + Left Mousue Click the Paste Button to quickly assign a texture to all the faces of a cube
    • " - + "
    • Press Copy Button and then hold CTRL + SHIFT + Left Mousue Click the Paste Button to quickly assign a texture to all the faces of a cube and all its child elements
    • " + + "
    • Press Copy Button and then hold CTRL + SHIFT + Left Mouse Click the Paste Button to quickly assign a texture to all the faces of a cube and all its child elements
    • " + "
    • Hold SHIFT and toggle 'Enabled', 'Auto Resolution' or 'Snap UV' to toggle it for all faces
    • " + "
    " + "

    Keyframe Pane (Right)

    " @@ -84,7 +89,7 @@ public static void show(JFrame parent) JDialog dialog = new JDialog(parent, "Quick Controls", false); dialog.setResizable(false); - dialog.setPreferredSize(new Dimension(700, 800)); + dialog.setPreferredSize(new Dimension(800, 800)); dialog.add(container); dialog.pack(); dialog.setLocationRelativeTo(null); diff --git a/src/at/vintagestory/modelcreator/gui/left/LeftUVSidebar.java b/src/at/vintagestory/modelcreator/gui/left/LeftUVSidebar.java index 991f012..18337ea 100644 --- a/src/at/vintagestory/modelcreator/gui/left/LeftUVSidebar.java +++ b/src/at/vintagestory/modelcreator/gui/left/LeftUVSidebar.java @@ -17,6 +17,7 @@ import static org.lwjgl.opengl.GL11.glVertex2i; import java.util.ArrayList; +import java.util.Stack; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -28,6 +29,7 @@ import at.vintagestory.modelcreator.interfaces.IElementManager; import at.vintagestory.modelcreator.model.Element; import at.vintagestory.modelcreator.model.Face; +import at.vintagestory.modelcreator.model.RenderFaceTask; import at.vintagestory.modelcreator.model.Sized; import at.vintagestory.modelcreator.model.TextureEntry; @@ -49,6 +51,9 @@ public class LeftUVSidebar extends LeftSidebar int canvasHeight; + Stack renderLastStack = new Stack(); + + public LeftUVSidebar(String title, IElementManager manager) { super(title); @@ -234,90 +239,120 @@ private void drawElementList(String textureCode, ArrayList elems, doubl for (Element elem : elems) { Face[] faces = elem.getAllFaces(); - for (int i = 0; i < 6; i++) { Face face = faces[i]; if (!face.isEnabled() || (textureCode != null && !textureCode.equals(face.getTextureCode()))) continue; - Sized uv = face.translateVoxelPosToUvPos(face.getStartU(), face.getStartV(), true); - Sized uvend = face.translateVoxelPosToUvPos(face.getEndU(), face.getEndV(), true); - - Color color = Face.getFaceColour(i); - - - GL11.glColor4f(color.r * elem.brightnessByFace[i], color.g * elem.brightnessByFace[i], color.b * elem.brightnessByFace[i], 0.3f); - - glBegin(GL_QUADS); - { - glTexCoord2f(0, 1); - glVertex2d(uv.W * texBoxWidth, uvend.H * texBoxHeight); - - glTexCoord2f(1, 1); - glVertex2d(uvend.W * texBoxWidth, uvend.H * texBoxHeight); - - glTexCoord2f(1, 0); - glVertex2d(uvend.W * texBoxWidth, uv.H * texBoxHeight); - - glTexCoord2f(0, 0); - glVertex2d(uv.W * texBoxWidth, uv.H * texBoxHeight); - } - glEnd(); - - glColor3f(0.5f, 0.5f, 0.5f); if (elem == selectedElem) { - glColor3f(0f, 0f, 1f); + renderLastStack.push(new RenderFaceTask(face, elem)); + continue; } if (elem == grabbedElement && face.isAutoUVEnabled()) { - glColor3f(0f, 0.75f, 1f); + renderLastStack.push(new RenderFaceTask(face, elem)); + continue; } if (elem == grabbedElement && !face.isAutoUVEnabled() && i == grabbedFaceIndex) { - glColor3f(0f, 1f, 0.75f); - } - - - glBegin(GL_LINES); - { - glVertex2d(uv.W * texBoxWidth, uv.H * texBoxHeight); - glVertex2d(uv.W * texBoxWidth, uvend.H * texBoxHeight); - - glVertex2d(uv.W * texBoxWidth, uvend.H * texBoxHeight); - glVertex2d(uvend.W * texBoxWidth, uvend.H * texBoxHeight); - - glVertex2d(uvend.W * texBoxWidth, uvend.H * texBoxHeight); - glVertex2d(uvend.W * texBoxWidth, uv.H * texBoxHeight); - - glVertex2d(uvend.W * texBoxWidth, uv.H * texBoxHeight); - glVertex2d(uv.W * texBoxWidth, uv.H * texBoxHeight); + renderLastStack.push(new RenderFaceTask(face, elem)); + continue; } - glEnd(); - - - - boolean renderName = (ModelCreator.uvShowNames && (!elem.isAutoUnwrapEnabled() || (elem.getUnwrapMode() <= 0 && i ==0) || i == elem.getUnwrapMode() - 1)); - - if (renderName) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - GL11.glEnable(GL11.GL_BLEND); - - float width = EnumFonts.BEBAS_NEUE_12.getWidth(elem.getName()); - float height = EnumFonts.BEBAS_NEUE_12.getHeight(elem.getName()); - - int x = (int)((uv.W + (uvend.W - uv.W) / 2) * texBoxWidth - width/2); - int y = (int)((uv.H + (uvend.H - uv.H) / 2) * texBoxHeight - height/2); - - EnumFonts.BEBAS_NEUE_12.drawString(x, y, elem.getName(), BLACK_ALPHA); - - TextureImpl.bindNone(); - } + drawFace(elem, face); + } drawElementList(textureCode, elem.ChildElements, texBoxWidth, texBoxHeight, canvasHeight); } + + // Needs to be drawn at the end so the selected highlight is always visible + while (renderLastStack.size() > 0) { + RenderFaceTask rft = renderLastStack.pop(); + drawFace(rft.elem, rft.face); + } + } + + private void drawFace(Element elem, Face face) { + Element selectedElem = ModelCreator.currentProject.SelectedElement; + + Sized uv = face.translateVoxelPosToUvPos(face.getStartU(), face.getStartV(), true); + Sized uvend = face.translateVoxelPosToUvPos(face.getEndU(), face.getEndV(), true); + + int sidei = face.getSide(); + + Color color = Face.getFaceColour(sidei); + + + GL11.glColor4f(color.r * elem.brightnessByFace[sidei], color.g * elem.brightnessByFace[sidei], color.b * elem.brightnessByFace[sidei], 0.3f); + + glBegin(GL_QUADS); + { + glTexCoord2f(0, 1); + glVertex2d(uv.W * texBoxWidth, uvend.H * texBoxHeight); + + glTexCoord2f(1, 1); + glVertex2d(uvend.W * texBoxWidth, uvend.H * texBoxHeight); + + glTexCoord2f(1, 0); + glVertex2d(uvend.W * texBoxWidth, uv.H * texBoxHeight); + + glTexCoord2f(0, 0); + glVertex2d(uv.W * texBoxWidth, uv.H * texBoxHeight); + } + glEnd(); + + + glColor3f(0.5f, 0.5f, 0.5f); + + + if (elem == selectedElem) { + glColor3f(0f, 0f, 1f); + } + + if (elem == grabbedElement && face.isAutoUVEnabled()) { + glColor3f(0f, 0.75f, 1f); + } + + if (elem == grabbedElement && !face.isAutoUVEnabled() && sidei == grabbedFaceIndex) { + glColor3f(0f, 1f, 0.75f); + } + + glBegin(GL_LINES); + { + glVertex2d(uv.W * texBoxWidth, uv.H * texBoxHeight); + glVertex2d(uv.W * texBoxWidth, uvend.H * texBoxHeight); + + glVertex2d(uv.W * texBoxWidth, uvend.H * texBoxHeight); + glVertex2d(uvend.W * texBoxWidth, uvend.H * texBoxHeight); + + glVertex2d(uvend.W * texBoxWidth, uvend.H * texBoxHeight); + glVertex2d(uvend.W * texBoxWidth, uv.H * texBoxHeight); + + glVertex2d(uvend.W * texBoxWidth, uv.H * texBoxHeight); + glVertex2d(uv.W * texBoxWidth, uv.H * texBoxHeight); + } + + glEnd(); + + + boolean renderName = (ModelCreator.uvShowNames && (!elem.isAutoUnwrapEnabled() || (elem.getUnwrapMode() <= 0 && sidei ==0) || sidei == elem.getUnwrapMode() - 1)); + + if (renderName) { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_BLEND); + + float width = EnumFonts.BEBAS_NEUE_12.getWidth(elem.getName()); + float height = EnumFonts.BEBAS_NEUE_12.getHeight(elem.getName()); + + int x = (int)((uv.W + (uvend.W - uv.W) / 2) * texBoxWidth - width/2); + int y = (int)((uv.H + (uvend.H - uv.H) / 2) * texBoxHeight - height/2); + + EnumFonts.BEBAS_NEUE_12.drawString(x, y, elem.getName(), BLACK_ALPHA); + + TextureImpl.bindNone(); + } } @@ -661,8 +696,8 @@ public void onMouseDownOnPanel() { face.setAutoUVEnabled(false); - face.addTextureXEnd(xMovement / scale.W); - face.addTextureYEnd(-yMovement / scale.H); + face.addTextureUEnd(xMovement / scale.W); + face.addTextureVEnd(-yMovement / scale.H); face.setAutoUVEnabled(false); } diff --git a/src/at/vintagestory/modelcreator/gui/middle/ModelRenderer.java b/src/at/vintagestory/modelcreator/gui/middle/ModelRenderer.java index d16c328..94dd2cd 100644 --- a/src/at/vintagestory/modelcreator/gui/middle/ModelRenderer.java +++ b/src/at/vintagestory/modelcreator/gui/middle/ModelRenderer.java @@ -57,6 +57,7 @@ public void Render(int leftSidebarWidth, int width, int height, int frameHeight) glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLU.gluOrtho2D(0, width, height, 0); + glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -185,10 +186,10 @@ public void drawGridAndElements() GL11.glDisable(GL11.GL_CULL_FACE); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - /*GL11.glTranslated(8, 0, 16); + GL11.glTranslated(0, 0, 16); GL11.glScaled(0.018, 0.018, 0.018); GL11.glRotated(90, 1, 0, 0); - EnumFonts.BEBAS_NEUE_50.drawString(8, 0, "S", new Color(0.5F, 0.5F, 0.6F));*/ + EnumFonts.BEBAS_NEUE_50.drawString(8, 0, "VS Model Creator", new Color(0.5F, 0.5F, 0.6F)); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glShadeModel(GL11.GL_SMOOTH); diff --git a/src/at/vintagestory/modelcreator/gui/right/face/ElementUVPanel.java b/src/at/vintagestory/modelcreator/gui/right/face/ElementUVPanel.java index d03121b..591a098 100644 --- a/src/at/vintagestory/modelcreator/gui/right/face/ElementUVPanel.java +++ b/src/at/vintagestory/modelcreator/gui/right/face/ElementUVPanel.java @@ -22,12 +22,13 @@ import at.vintagestory.modelcreator.ModelCreator; import at.vintagestory.modelcreator.Start; -import at.vintagestory.modelcreator.enums.BlockFacing; import at.vintagestory.modelcreator.enums.EnumAxis; import at.vintagestory.modelcreator.gui.Icons; import at.vintagestory.modelcreator.interfaces.IElementManager; import at.vintagestory.modelcreator.interfaces.IValueUpdater; import at.vintagestory.modelcreator.model.Element; +import at.vintagestory.modelcreator.model.Face; +import at.vintagestory.modelcreator.model.Sized; import at.vintagestory.modelcreator.util.AwtUtil; import at.vintagestory.modelcreator.util.Parser; @@ -53,6 +54,10 @@ public class ElementUVPanel extends JPanel implements IValueUpdater private DecimalFormat df = new DecimalFormat("#.##"); private DefaultComboBoxModel model; + + JTextField[] fields; + JButton[] buttons; + public ElementUVPanel(IElementManager manager) { @@ -73,6 +78,10 @@ public void initComponents() btnNegX = new JButton(Icons.arrow_down); btnNegY = new JButton(Icons.arrow_down); + + fields = new JTextField[] { xStartField, yStartField }; + buttons = new JButton[] { btnPlusX, btnPlusY, btnNegX, btnNegY }; + model = new DefaultComboBoxModel(); model.addElement("Compact"); model.addElement("North is front"); @@ -102,11 +111,6 @@ public void itemStateChanged(ItemEvent e) }); - - - - - autoUnwrap = new Checkbox("Auto-Unwrap"); autoUnwrap.addItemListener(new ItemListener() { @@ -122,6 +126,13 @@ public void itemStateChanged(ItemEvent e) ModelCreator.DidModify(); } }); + + + Font defaultFont = new Font("SansSerif", Font.BOLD, 20); + for (JButton btn : buttons) { + btn.setSize(new Dimension(62, 30)); + btn.setFont(defaultFont); + } } public void initProperties() @@ -152,7 +163,7 @@ public void initProperties() public void mouseWheelMoved(MouseWheelEvent e) { int notches = e.getWheelRotation(); - modifyPosition(EnumAxis.X, (notches > 0 ? 1 : -1)); + modifyPosition(EnumAxis.X, (notches > 0 ? 1 : -1), e.getModifiers(), xStartField); } }); @@ -182,64 +193,41 @@ public void mouseWheelMoved(MouseWheelEvent e) public void mouseWheelMoved(MouseWheelEvent e) { int notches = e.getWheelRotation(); - modifyPosition(EnumAxis.Y, (notches > 0 ? 1 : -1)); + modifyPosition(EnumAxis.Y, (notches > 0 ? 1 : -1), e.getModifiers(), yStartField); } }); - - - + btnPlusX.addActionListener(e -> { - Element elem = manager.getCurrentElement(); - if (elem == null) return; - double diff = ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) ? 0.1 : 1; - elem.setTexUStart(elem.getTexUStart() + diff); - ModelCreator.updateValues(btnPlusX); + modifyPosition(EnumAxis.X, 1, e.getModifiers(), btnPlusX); }); - btnPlusX.setSize(new Dimension(62, 30)); - btnPlusX.setFont(defaultFont); btnPlusX.setToolTipText("Increases the start U.
    Hold shift for decimals"); btnPlusY.addActionListener(e -> { - Element elem = manager.getCurrentElement(); - if (elem == null) return; - double diff = ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) ? 0.1 : 1; - elem.setTexVStart(elem.getTexVStart() + diff); - ModelCreator.updateValues(btnPlusX); + modifyPosition(EnumAxis.Y, 1, e.getModifiers(), btnPlusY); }); - btnPlusY.setPreferredSize(new Dimension(62, 30)); - btnPlusY.setFont(defaultFont); btnPlusY.setToolTipText("Increases the start V.
    Hold shift for decimals"); btnNegX.addActionListener(e -> { - Element elem = manager.getCurrentElement(); - if (elem == null) return; - double diff = ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) ? -0.1 : -1; - elem.setTexUStart(elem.getTexUStart() + diff); - ModelCreator.updateValues(btnNegX); + modifyPosition(EnumAxis.X, -1, e.getModifiers(), btnNegX); }); - btnNegX.setSize(new Dimension(62, 30)); - btnNegX.setFont(defaultFont); btnNegX.setToolTipText("Decreases the start U.
    Hold shift for decimals"); btnNegY.addActionListener(e -> { - Element elem = manager.getCurrentElement(); - if (elem == null) return; - double diff = ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) ? -0.1 : -1; - elem.setTexVStart(elem.getTexVStart() + diff); - ModelCreator.updateValues(btnNegY); + modifyPosition(EnumAxis.Y, -1, e.getModifiers(), btnNegY); }); - btnNegY.setSize(new Dimension(62, 30)); - btnNegY.setFont(defaultFont); btnNegY.setToolTipText("Decreases the start V.
    Hold shift for decimals"); + + + unwrapPanel = new JPanel(new GridLayout(1, 1)); unwrapPanel.setBorder(BorderFactory.createTitledBorder(Start.Border, "UV Unwrap Order")); menuList = new JComboBox(); @@ -365,12 +353,32 @@ public void updateValues(JComponent byGuiElem) - public void modifyPosition(EnumAxis axis, int direction) { + public void modifyPosition(EnumAxis axis, int direction, int modifiers, JComponent sourceField) { Element cube = manager.getCurrentElement(); if (cube == null) return; - float size = direction * 1f; + double size = direction * 1f; + + boolean ctrl = (modifiers & ActionEvent.CTRL_MASK) > 0; + boolean shift = (modifiers & ActionEvent.SHIFT_MASK) == 1; + + Face face = cube.getSelectedFace(); + Sized scale = face.getVoxel2PixelScale(); + if (shift) { + size = direction * 0.1; + } + else if (ctrl) + { + double step = 1 / scale.H; + if (axis == EnumAxis.X) step = 1 / scale.W; + + size = direction * (face.isSnapUvEnabled() ? -step : -0.1); + } + else + { + size = direction * 1; + } switch (axis) { @@ -386,7 +394,7 @@ public void modifyPosition(EnumAxis axis, int direction) { break; } - ModelCreator.updateValues(null); + ModelCreator.updateValues(sourceField); } diff --git a/src/at/vintagestory/modelcreator/gui/right/face/FaceUVPanel.java b/src/at/vintagestory/modelcreator/gui/right/face/FaceUVPanel.java index 012715d..614684c 100644 --- a/src/at/vintagestory/modelcreator/gui/right/face/FaceUVPanel.java +++ b/src/at/vintagestory/modelcreator/gui/right/face/FaceUVPanel.java @@ -4,6 +4,8 @@ import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; import java.text.DecimalFormat; import javax.swing.BorderFactory; @@ -14,6 +16,7 @@ import at.vintagestory.modelcreator.ModelCreator; import at.vintagestory.modelcreator.Start; +import at.vintagestory.modelcreator.enums.EnumAxis; import at.vintagestory.modelcreator.gui.Icons; import at.vintagestory.modelcreator.interfaces.IElementManager; import at.vintagestory.modelcreator.interfaces.IValueUpdater; @@ -28,19 +31,22 @@ public class FaceUVPanel extends JPanel implements IValueUpdater private static final long serialVersionUID = 1L; private IElementManager manager; - private JButton btnPlusX; - private JButton btnPlusY; - private JTextField xStartField; - private JTextField yStartField; - private JButton btnNegX; - private JButton btnNegY; + private JButton btnPlusUStart; + private JButton btnPlusVStart; + private JTextField uStartField; + private JTextField vStartField; + private JButton btnNegUStart; + private JButton btnNegVStart; - private JButton btnPlusXEnd; - private JButton btnPlusYEnd; - private JTextField xEndField; - private JTextField yEndField; - private JButton btnNegXEnd; - private JButton btnNegYEnd; + private JButton btnPlusUEnd; + private JButton btnPlusVEnd; + private JTextField uEndField; + private JTextField vEndField; + private JButton btnNegUEnd; + private JButton btnNegVEnd; + + JTextField[] fields; + JButton[] buttons; private DecimalFormat df = new DecimalFormat("#.##"); @@ -57,64 +63,74 @@ public FaceUVPanel(IElementManager manager) public void initComponents() { - btnPlusX = new JButton(Icons.arrow_up); - btnPlusY = new JButton(Icons.arrow_up); - xStartField = new JTextField(); - yStartField = new JTextField(); - btnNegX = new JButton(Icons.arrow_down); - btnNegY = new JButton(Icons.arrow_down); + btnPlusUStart = new JButton(Icons.arrow_up); + btnPlusVStart = new JButton(Icons.arrow_up); + uStartField = new JTextField(); + vStartField = new JTextField(); + btnNegUStart = new JButton(Icons.arrow_down); + btnNegVStart = new JButton(Icons.arrow_down); + + btnPlusUEnd = new JButton(Icons.arrow_up); + btnPlusVEnd = new JButton(Icons.arrow_up); + uEndField = new JTextField(); + vEndField = new JTextField(); + btnNegUEnd = new JButton(Icons.arrow_down); + btnNegVEnd = new JButton(Icons.arrow_down); - btnPlusXEnd = new JButton(Icons.arrow_up); - btnPlusYEnd = new JButton(Icons.arrow_up); - xEndField = new JTextField(); - yEndField = new JTextField(); - btnNegXEnd = new JButton(Icons.arrow_down); - btnNegYEnd = new JButton(Icons.arrow_down); + fields = new JTextField[] { uStartField, vStartField, uEndField, vEndField }; + buttons = new JButton[] { btnPlusUStart, btnPlusVStart, btnNegUStart, btnNegVStart, btnPlusUEnd, btnPlusVEnd, btnNegUEnd, btnNegVEnd }; + + Font defaultFont = new Font("SansSerif", Font.BOLD, 20); + for (JButton btn : buttons) { + btn.setSize(new Dimension(62, 30)); + btn.setFont(defaultFont); + } } public void initProperties() { Font defaultFont = new Font("SansSerif", Font.BOLD, 20); - xStartField.setSize(new Dimension(62, 30)); - xStartField.setFont(defaultFont); - xStartField.setHorizontalAlignment(JTextField.CENTER); + uStartField.setSize(new Dimension(62, 30)); + uStartField.setFont(defaultFont); + uStartField.setHorizontalAlignment(JTextField.CENTER); - AwtUtil.addChangeListener(xStartField, e -> { + AwtUtil.addChangeListener(uStartField, e -> { Element element = manager.getCurrentElement(); if (element == null) return; Face face = element.getSelectedFace(); - face.setStartU(Parser.parseDouble(xStartField.getText(), face.getStartU())); + face.setStartU(Parser.parseDouble(uStartField.getText(), face.getStartU())); face.updateUV(); - ModelCreator.updateValues(xStartField); + ModelCreator.updateValues(uStartField); }); + - yStartField.setSize(new Dimension(62, 30)); - yStartField.setFont(defaultFont); - yStartField.setHorizontalAlignment(JTextField.CENTER); + vStartField.setSize(new Dimension(62, 30)); + vStartField.setFont(defaultFont); + vStartField.setHorizontalAlignment(JTextField.CENTER); - AwtUtil.addChangeListener(yStartField, e -> { + AwtUtil.addChangeListener(vStartField, e -> { Element element = manager.getCurrentElement(); if (element == null) return; Face face = element.getSelectedFace(); - face.setStartV(Parser.parseDouble(yStartField.getText(), face.getStartV())); + face.setStartV(Parser.parseDouble(vStartField.getText(), face.getStartV())); face.updateUV(); - ModelCreator.updateValues(yStartField); + ModelCreator.updateValues(vStartField); }); - xEndField.setSize(new Dimension(62, 30)); - xEndField.setFont(defaultFont); - xEndField.setHorizontalAlignment(JTextField.CENTER); + uEndField.setSize(new Dimension(62, 30)); + uEndField.setFont(defaultFont); + uEndField.setHorizontalAlignment(JTextField.CENTER); - AwtUtil.addChangeListener(xEndField, e -> { + AwtUtil.addChangeListener(uEndField, e -> { Element element = manager.getCurrentElement(); if (element == null) return; Face face = element.getSelectedFace(); - double nowEndU = Parser.parseDouble(xEndField.getText(), face.getEndU()); + double nowEndU = Parser.parseDouble(uEndField.getText(), face.getEndU()); // Disable auto-uv if user changed End U if (nowEndU != face.getEndU()) { face.setAutoUVEnabled(false); @@ -123,19 +139,19 @@ public void initProperties() face.setEndU(nowEndU); face.updateUV(); - ModelCreator.updateValues(xEndField); + ModelCreator.updateValues(uEndField); }); - yEndField.setSize(new Dimension(62, 30)); - yEndField.setFont(defaultFont); - yEndField.setHorizontalAlignment(JTextField.CENTER); + vEndField.setSize(new Dimension(62, 30)); + vEndField.setFont(defaultFont); + vEndField.setHorizontalAlignment(JTextField.CENTER); - AwtUtil.addChangeListener(yEndField, e -> { + AwtUtil.addChangeListener(vEndField, e -> { Element element = manager.getCurrentElement(); if (element == null) return; Face face = element.getSelectedFace(); - double nowEndV = Parser.parseDouble(yEndField.getText(), face.getEndV()); + double nowEndV = Parser.parseDouble(vEndField.getText(), face.getEndV()); // Disable auto-uv if user changed End V if (nowEndV != face.getEndV()) { face.setAutoUVEnabled(false); @@ -143,218 +159,100 @@ public void initProperties() face.setEndV(nowEndV); face.updateUV(); - ModelCreator.updateValues(yEndField); + ModelCreator.updateValues(vEndField); }); - - btnPlusX.addActionListener(e -> + + for (int i = 0; i < fields.length; i++) { - if (manager.getCurrentElement() != null) + JTextField field = fields[i]; + + final int index = i; + + field.addMouseWheelListener(new MouseWheelListener() { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureX(face.isSnapUvEnabled() ? 1/scale.W : 0.1); - } - else + @Override + public void mouseWheelMoved(MouseWheelEvent e) { - face.addTextureX(1.0); + int notches = e.getWheelRotation(); + modifyPosition(index, (notches > 0 ? 1 : -1), e.getModifiers(), field); } - cube.updateUV(); - ModelCreator.updateValues(btnPlusX); - } + }); + } + + + btnPlusUStart.addActionListener(e -> + { + modifyPosition(0, 1, e.getModifiers(), btnPlusUStart); }); - btnPlusX.setSize(new Dimension(62, 30)); - btnPlusX.setFont(defaultFont); - btnPlusX.setToolTipText("Increases the start U.
    Hold shift for decimals"); + btnPlusUStart.setToolTipText("Increases the start U.
    Hold shift for decimals"); - btnPlusY.addActionListener(e -> + btnPlusVStart.addActionListener(e -> { - if (manager.getCurrentElement() != null) - { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureY(face.isSnapUvEnabled() ? 1/scale.H : 0.1); - } - else - { - face.addTextureY(1.0); - } - cube.updateUV(); - ModelCreator.updateValues(btnPlusY); - } + modifyPosition(1, 1, e.getModifiers(), btnPlusUStart); }); - btnPlusY.setPreferredSize(new Dimension(62, 30)); - btnPlusY.setFont(defaultFont); - btnPlusY.setToolTipText("Increases the start V.
    Hold shift for decimals"); + + btnPlusVStart.setToolTipText("Increases the start V.
    Hold shift for decimals"); - btnNegX.addActionListener(e -> + btnNegUStart.addActionListener(e -> { - if (manager.getCurrentElement() != null) - { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureX(face.isSnapUvEnabled() ? -1/scale.W : -0.1); - } - else - { - face.addTextureX(-1.0); - } - cube.updateUV(); - ModelCreator.updateValues(btnNegX); - } + modifyPosition(0, -1, e.getModifiers(), btnPlusVStart); }); - btnNegX.setSize(new Dimension(62, 30)); - btnNegX.setFont(defaultFont); - btnNegX.setToolTipText("Decreases the start U.
    Hold shift for decimals"); + + btnNegUStart.setToolTipText("Decreases the start U.
    Hold shift for decimals"); - btnNegY.addActionListener(e -> + btnNegVStart.addActionListener(e -> { - if (manager.getCurrentElement() != null) - { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureY(face.isSnapUvEnabled() ? -1/scale.H : -0.1); - } - else - { - face.addTextureY(-1.0); - } - cube.updateUV(); - ModelCreator.updateValues(btnNegY); - } + modifyPosition(1, -1, e.getModifiers(), btnNegUStart); }); - btnNegY.setSize(new Dimension(62, 30)); - btnNegY.setFont(defaultFont); - btnNegY.setToolTipText("Decreases the start V.
    Hold shift for decimals"); + + btnNegVStart.setToolTipText("Decreases the start V.
    Hold shift for decimals"); - btnPlusXEnd.addActionListener(e -> + btnPlusUEnd.addActionListener(e -> { - if (manager.getCurrentElement() != null) - { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureXEnd(face.isSnapUvEnabled() ? 1/scale.W : 0.1); - } - else - { - face.addTextureXEnd(1.0); - } - - ModelCreator.updateValues(btnPlusXEnd); - } + modifyPosition(2, 1, e.getModifiers(), btnPlusUEnd); }); - btnPlusXEnd.setSize(new Dimension(62, 30)); - btnPlusXEnd.setFont(defaultFont); - btnPlusXEnd.setToolTipText("Increases the end U.
    Hold shift for decimals"); + btnPlusUEnd.setToolTipText("Increases the end U.
    Hold shift for decimals"); - btnPlusYEnd.addActionListener(e -> + btnPlusVEnd.addActionListener(e -> { - if (manager.getCurrentElement() != null) - { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureYEnd(face.isSnapUvEnabled() ? 1/scale.H : 0.1); - } - else - { - face.addTextureYEnd(1.0); - } - - ModelCreator.updateValues(btnPlusYEnd); - } + modifyPosition(3, 1, e.getModifiers(), btnPlusVEnd); }); - btnPlusYEnd.setPreferredSize(new Dimension(62, 30)); - btnPlusYEnd.setFont(defaultFont); - btnPlusYEnd.setToolTipText("Increases the end V.
    Hold shift for decimals"); + + btnPlusVEnd.setToolTipText("Increases the end V.
    Hold shift for decimals"); - btnNegXEnd.addActionListener(e -> + btnNegUEnd.addActionListener(e -> { - if (manager.getCurrentElement() != null) - { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureXEnd(face.isSnapUvEnabled() ? -1/scale.W : -0.1); - } - else - { - face.addTextureXEnd(-1.0); - } - - ModelCreator.updateValues(btnNegXEnd); - } + modifyPosition(2, -1, e.getModifiers(), btnNegUEnd); }); - btnNegXEnd.setSize(new Dimension(62, 30)); - btnNegXEnd.setFont(defaultFont); - btnNegXEnd.setToolTipText("Decreases the end U.
    Hold shift for decimals"); + + btnNegUEnd.setToolTipText("Decreases the end U.
    Hold shift for decimals"); - btnNegYEnd.addActionListener(e -> + btnNegVEnd.addActionListener(e -> { - if (manager.getCurrentElement() != null) - { - Element cube = manager.getCurrentElement(); - Face face = cube.getSelectedFace(); - Sized scale = face.getVoxel2PixelScale(); - - if ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 1) - { - face.addTextureYEnd(face.isSnapUvEnabled() ? -1/scale.H : -0.1); - } - else - { - face.addTextureYEnd(-1.0); - } - - ModelCreator.updateValues(btnNegYEnd); - } + modifyPosition(3, -1, e.getModifiers(), btnNegVEnd); }); - btnNegYEnd.setSize(new Dimension(62, 30)); - btnNegYEnd.setFont(defaultFont); - btnNegYEnd.setToolTipText("Decreases the end V.
    Hold shift for decimals"); + + + btnNegVEnd.setToolTipText("Decreases the end V.
    Hold shift for decimals"); } public void addComponents() { - add(btnPlusX); - add(btnPlusY); - add(btnPlusXEnd); - add(btnPlusYEnd); - add(xStartField); - add(yStartField); - add(xEndField); - add(yEndField); - add(btnNegX); - add(btnNegY); - add(btnNegXEnd); - add(btnNegYEnd); + add(btnPlusUStart); + add(btnPlusVStart); + add(btnPlusUEnd); + add(btnPlusVEnd); + add(uStartField); + add(vStartField); + add(uEndField); + add(vEndField); + add(btnNegUStart); + add(btnNegVStart); + add(btnNegUEnd); + add(btnNegVEnd); } @Override @@ -364,28 +262,96 @@ public void updateValues(JComponent byGuiElem) if (cube != null) { - xStartField.setEnabled(true); - yStartField.setEnabled(true); - xEndField.setEnabled(true); - yEndField.setEnabled(true); - if (byGuiElem != xStartField) xStartField.setText(df.format(cube.getSelectedFace().getStartU())); - if (byGuiElem != yStartField) yStartField.setText(df.format(cube.getSelectedFace().getStartV())); - if (byGuiElem != xEndField) xEndField.setText(df.format(cube.getSelectedFace().getEndU())); - if (byGuiElem != yEndField) yEndField.setText(df.format(cube.getSelectedFace().getEndV())); + uStartField.setEnabled(true); + vStartField.setEnabled(true); + uEndField.setEnabled(true); + vEndField.setEnabled(true); + if (byGuiElem != uStartField) uStartField.setText(df.format(cube.getSelectedFace().getStartU())); + if (byGuiElem != vStartField) vStartField.setText(df.format(cube.getSelectedFace().getStartV())); + if (byGuiElem != uEndField) uEndField.setText(df.format(cube.getSelectedFace().getEndU())); + if (byGuiElem != vEndField) vEndField.setText(df.format(cube.getSelectedFace().getEndV())); } else { - xStartField.setEnabled(false); - yStartField.setEnabled(false); - xEndField.setEnabled(false); - yEndField.setEnabled(false); - xStartField.setText(""); - yStartField.setText(""); - xEndField.setText(""); - yEndField.setText(""); + uStartField.setEnabled(false); + vStartField.setEnabled(false); + uEndField.setEnabled(false); + vEndField.setEnabled(false); + uStartField.setText(""); + vStartField.setText(""); + uEndField.setText(""); + vEndField.setText(""); + } + } + + + + public void modifyPosition(int type, int direction, int modifiers, JComponent sourceField) { + Element cube = manager.getCurrentElement(); + if (cube == null) return; + Face face = cube.getSelectedFace(); + + double size = direction * ((modifiers & ActionEvent.SHIFT_MASK) == 1 ? 0.1f : 1f); + + Sized scale = face.getVoxel2PixelScale(); + + boolean ctrl = (modifiers & ActionEvent.CTRL_MASK) > 0; + boolean shift = (modifiers & ActionEvent.SHIFT_MASK) == 1; + + if (shift) { + size = direction * 0.1; + } + else if (ctrl) + { + double step = 1 / scale.H; + if (type == 0 || type == 2) step = 1 / scale.W; + + size = direction * (face.isSnapUvEnabled() ? -step : -0.1); + } + else + { + size = direction * 1; + } + + + ModelCreator.changeHistory.beginMultichangeHistoryState(); + + JTextField targetField; + double targetValue; + + switch (type) { + case 0: + targetField = uStartField; + targetValue = Parser.parseDouble(targetField.getText(), face.getStartU()) + size; + face.setStartU(targetValue); + break; + case 1: + targetField = vStartField; + targetValue = Parser.parseDouble(targetField.getText(), face.getStartV()) + size; + face.setStartV(targetValue); + break; + case 2: + targetField = uEndField; + targetValue = Parser.parseDouble(targetField.getText(), face.getEndU()) + size; + face.setEndU(targetValue); + break; + case 3: + targetField = vEndField; + targetValue = Parser.parseDouble(targetField.getText(), face.getEndV()) + size; + face.setEndV(targetValue); + break; + default: + return; } + + + ModelCreator.changeHistory.endMultichangeHistoryState(ModelCreator.currentProject); + targetField.setText(df.format(targetValue)); + face.updateUV(); + ModelCreator.updateValues(sourceField); } } + diff --git a/src/at/vintagestory/modelcreator/model/Face.java b/src/at/vintagestory/modelcreator/model/Face.java index 4890387..2c6539e 100644 --- a/src/at/vintagestory/modelcreator/model/Face.java +++ b/src/at/vintagestory/modelcreator/model/Face.java @@ -320,7 +320,7 @@ public void moveTextureV(double amt) if (amt != 0) ModelCreator.DidModify(); } - public void addTextureX(double amt) + public void addTextureU(double amt) { this.textureU += amt; cuboid.updateUV(); @@ -328,7 +328,7 @@ public void addTextureX(double amt) if (amt != 0) ModelCreator.DidModify(); } - public void addTextureY(double amt) + public void addTextureV(double amt) { this.textureV += amt; cuboid.updateUV(); @@ -336,7 +336,7 @@ public void addTextureY(double amt) if (amt != 0) ModelCreator.DidModify(); } - public void addTextureXEnd(double amt) + public void addTextureUEnd(double amt) { if (this.autoUV) { this.textureV += amt; @@ -348,7 +348,7 @@ public void addTextureXEnd(double amt) if (amt != 0) ModelCreator.DidModify(); } - public void addTextureYEnd(double amt) + public void addTextureVEnd(double amt) { if (this.autoUV) { this.textureV += amt; diff --git a/src/at/vintagestory/modelcreator/model/RenderFaceTask.java b/src/at/vintagestory/modelcreator/model/RenderFaceTask.java new file mode 100644 index 0000000..35fb364 --- /dev/null +++ b/src/at/vintagestory/modelcreator/model/RenderFaceTask.java @@ -0,0 +1,12 @@ +package at.vintagestory.modelcreator.model; + +public class RenderFaceTask +{ + public Face face; + public Element elem; + + public RenderFaceTask(Face face, Element elem) { + this.face = face; + this.elem = elem; + } +}