From 8211147b2803bad022554b1a0ba21091f2b4cc5e Mon Sep 17 00:00:00 2001 From: philippe lhardy Date: Tue, 3 Nov 2020 17:33:25 +0100 Subject: [PATCH] minetest worledit .we format export - harcoded generation of lua content of .we export - export something, but not yet correct ( walls are points ... ) --- .../games/maze/DrawingGenerator.java | 80 +++++++ .../games/maze/gui/Display.java | 201 +++++++----------- .../maze/persist/MazePeristWorldEdit.java | 110 ++++++++++ .../artisanlogiciel/games/minetest/Node.java | 27 +++ .../games/minetest/WorlEditGenerator.java | 64 ++++++ 5 files changed, 363 insertions(+), 119 deletions(-) create mode 100644 java/org/artisanlogiciel/games/maze/DrawingGenerator.java create mode 100644 java/org/artisanlogiciel/games/maze/persist/MazePeristWorldEdit.java create mode 100644 java/org/artisanlogiciel/games/minetest/WorlEditGenerator.java diff --git a/java/org/artisanlogiciel/games/maze/DrawingGenerator.java b/java/org/artisanlogiciel/games/maze/DrawingGenerator.java new file mode 100644 index 0000000..42ae8d9 --- /dev/null +++ b/java/org/artisanlogiciel/games/maze/DrawingGenerator.java @@ -0,0 +1,80 @@ +package org.artisanlogiciel.games.maze; + +import org.artisanlogiciel.graphics.Drawing; +import org.artisanlogiciel.graphics.DrawingLine; + +import java.awt.*; + +public class DrawingGenerator { + + LabyModel model; + + public DrawingGenerator(LabyModel model) { + this.model = model; + } + + void addWallInDrawing(int pX, int pY, Drawing d) { + short walls = model.getWalls(pX, pY); + short wdrawn = 0; + // todo + int w = 2; + int h = 2; + int ox = 0; + int oy = 0; + + int x = ox + (int) (pX * w); + int y = oy + (int) (pY * h); + DrawingLine dl = new DrawingLine(); + // order matters since all points are linked + if ((pY == 0) && LabyModel.isFlagSet(walls, Brick.UP)) { + dl.addPoint(new Point(x, y)); + dl.addPoint(new Point(x + (int) w, y)); + wdrawn |= Brick.UP; + } + if (LabyModel.isFlagSet(walls, Brick.RIGHT)) { + if (!LabyModel.isFlagSet(wdrawn, Brick.UP)) { + dl.addPoint(new Point(x + (int) w, y)); + } + dl.addPoint(new Point(x + (int) w, y + (int) h)); + wdrawn |= Brick.RIGHT; + } + if (LabyModel.isFlagSet(walls, Brick.DOWN)) { + if (!LabyModel.isFlagSet(wdrawn, Brick.RIGHT)) { + if (wdrawn != 0) { + d.addLine(dl); + dl = new DrawingLine(); + } + dl.addPoint(new Point(x + (int) w, y + (int) h)); + } + dl.addPoint(new Point(x, y + (int) h)); + wdrawn |= Brick.DOWN; + } + if ((pX == 0) && LabyModel.isFlagSet(walls, Brick.LEFT)) { + if (!LabyModel.isFlagSet(wdrawn, Brick.DOWN)) { + if (wdrawn != 0) { + d.addLine(dl); + dl = new DrawingLine(); + } + dl.addPoint(new Point(x, y + (int) h)); + } + dl.addPoint(new Point(x, y)); + wdrawn |= Brick.LEFT; + } + if (wdrawn != 0) { + d.addLine(dl); + } + } + + public Drawing createDrawing() { + Drawing d = new Drawing(); + { + // draw all walls within clip bounds horiz first then lines + for (int y = 0; y < model.getHeight(); y++) { + for (int x = 0; x < model.getWidth(); x++) { + addWallInDrawing(x, y, d); + } + } + } + return d; + } +} diff --git a/java/org/artisanlogiciel/games/maze/gui/Display.java b/java/org/artisanlogiciel/games/maze/gui/Display.java index e9b81f9..15f94f8 100644 --- a/java/org/artisanlogiciel/games/maze/gui/Display.java +++ b/java/org/artisanlogiciel/games/maze/gui/Display.java @@ -1,36 +1,33 @@ package org.artisanlogiciel.games.maze.gui; -import java.awt.BorderLayout; -import java.awt.image.BufferedImage; -import java.awt.Container; -import java.awt.FlowLayout; -import java.awt.Graphics; -import java.awt.Point; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.io.*; -import java.util.*; - -import javax.imageio.ImageIO; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import org.artisanlogiciel.games.maze.*; +import org.artisanlogiciel.games.maze.DrawingGenerator; +import org.artisanlogiciel.games.maze.LabyModel; +import org.artisanlogiciel.games.maze.MazeParams; +import org.artisanlogiciel.games.maze.MazeParamsFixed; +import org.artisanlogiciel.games.maze.persist.MazePeristWorldEdit; import org.artisanlogiciel.games.maze.persist.MazePersistRaw; import org.artisanlogiciel.games.maze.solve.SolvingModel; import org.artisanlogiciel.games.stl.Maze3dParams; import org.artisanlogiciel.games.stl.Wall3dStream; +import org.artisanlogiciel.graphics.Drawing; +import org.artisanlogiciel.graphics.SvgWriter; import org.artisanlogiciel.osm.OsmReader; import org.artisanlogiciel.osm.convert.OsmToDrawing; import org.artisanlogiciel.util.UTF8Control; -import org.artisanlogiciel.graphics.Drawing; -import org.artisanlogiciel.graphics.DrawingLine; -import org.artisanlogiciel.graphics.SvgWriter; +import javax.imageio.ImageIO; +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.Locale; +import java.util.ResourceBundle; /** * Display is Main JFrame for this tool @@ -176,72 +173,7 @@ implements StatusListener } } - void addWallInDrawing(int pX, int pY, Drawing d) { - short walls = model.getWalls(pX, pY); - short wdrawn = 0; - // todo - int w = 2; - int h = 2; - int ox = 0; - int oy = 0; - int x = ox + (int) (pX * w); - int y = oy + (int) (pY * h); - DrawingLine dl = new DrawingLine(); - // order matters since all points are linked - if ((pY == 0) && LabyModel.isFlagSet(walls, Brick.UP)) { - dl.addPoint(new Point(x, y)); - dl.addPoint(new Point(x + (int) w, y)); - wdrawn |= Brick.UP; - } - if (LabyModel.isFlagSet(walls, Brick.RIGHT)) { - if (!LabyModel.isFlagSet(wdrawn, Brick.UP)) { - dl.addPoint(new Point(x + (int) w, y)); - } - dl.addPoint(new Point(x + (int) w, y + (int) h)); - wdrawn |= Brick.RIGHT; - } - if (LabyModel.isFlagSet(walls, Brick.DOWN)) { - if (!LabyModel.isFlagSet(wdrawn, Brick.RIGHT)) { - if (wdrawn != 0) { - d.addLine(dl); - dl = new DrawingLine(); - } - dl.addPoint(new Point(x + (int) w, y + (int) h)); - } - dl.addPoint(new Point(x, y + (int) h)); - wdrawn |= Brick.DOWN; - } - if ((pX == 0) && LabyModel.isFlagSet(walls, Brick.LEFT)) { - if (!LabyModel.isFlagSet(wdrawn, Brick.DOWN)) { - if (wdrawn != 0) { - d.addLine(dl); - dl = new DrawingLine(); - } - dl.addPoint(new Point(x, y + (int) h)); - } - dl.addPoint(new Point(x, y)); - wdrawn |= Brick.LEFT; - } - if (wdrawn != 0) { - d.addLine(dl); - } - } - - Drawing createDrawing() { - Drawing d = new Drawing(); - { - short walls; - - // draw all walls within clip bounds horiz first then lines - for (int y = 0; y < model.getHeight(); y++) { - for (int x = 0; x < model.getWidth(); x++) { - addWallInDrawing(x, y, d); - } - } - } - return d; - } // to allow to log / write somewher into screen... void writeSentence(String pSentence) { @@ -253,6 +185,10 @@ implements StatusListener System.err.println(pError); } + public Drawing createDrawing() { + return new DrawingGenerator(model).createDrawing(); + } + void saveImc() { Drawing d = createDrawing(); @@ -442,67 +378,69 @@ implements StatusListener private JMenu createSavingMenu() { final JTextField saveName = new JTextField("newlaby"); - final JButton savePngButton = new JButton(labels.getString("save") + " png"); - Action savePngAction = new AbstractAction() { - public void actionPerformed(ActionEvent evt) { + + final JButton savePngButton = newSaveButton( "png", + new AbstractAction() { + public void actionPerformed(ActionEvent evt) { // - addStatus("save png"); - setMazeName(saveName.getText()); - savePng(); - } - }; - savePngButton.addActionListener(savePngAction); - final JButton saveSvgButton = new JButton(labels.getString("save") + " svg"); - Action saveSvgAction = new AbstractAction() { + addStatus("save png"); + setMazeName(saveName.getText()); + savePng(); + } + }); + + final JButton saveSvgButton = newSaveButton("svg", + new AbstractAction() { public void actionPerformed(ActionEvent evt) { writeSentence("save svg"); setMazeName(saveName.getText()); saveSvg(); } - }; - saveSvgButton.addActionListener(saveSvgAction); - final JButton saveButton = new JButton(labels.getString("save") + " raw"); - Action saveAction = new AbstractAction() { + }); + + final JButton saveButton = newSaveButton("raw", + new AbstractAction() { public void actionPerformed(ActionEvent evt) { - // - addStatus("save"); setMazeName(saveName.getText()); MazeParamsFixed p = (MazeParamsFixed) params; save(p, model); } - }; - saveButton.addActionListener(saveAction); - final JButton saveImcButton = new JButton(labels.getString("save") + " imc"); + }); + Action saveImcAction = new AbstractAction() { public void actionPerformed(ActionEvent evt) { - // - addStatus("save imc"); setMazeName(saveName.getText()); saveImc(); } }; - saveImcButton.addActionListener(saveImcAction); - final JButton saveStlButton = new JButton(labels.getString("save") + " stl"); + final JButton saveImcButton = newSaveButton("imc", saveImcAction); + Action saveStlAction = new AbstractAction() { public void actionPerformed(ActionEvent evt) { // - addStatus("save stl"); setMazeName(saveName.getText()); MazeParamsFixed p = (MazeParamsFixed) params; saveStl(p, model,stlsettings.createParams()); } }; - saveStlButton.addActionListener(saveStlAction); - final JButton saveTextButton = new JButton(labels.getString("save") + " txt"); + final JButton saveStlButton = newSaveButton("stl", saveStlAction); + Action saveTextAction = new AbstractAction() { public void actionPerformed(ActionEvent evt) { // - addStatus("save txt"); setMazeName(saveName.getText()); saveText(); } }; - saveTextButton.addActionListener(saveTextAction); + final JButton saveTextButton = newSaveButton("txt", saveTextAction); + + final JButton saveWorleEditButton = newSaveButton( "we", + new AbstractAction() { + public void actionPerformed(ActionEvent evt) { + setMazeName(saveName.getText()); + saveWorldEdit(); + } + }); stlsettings = new Maze3dSettings(new Maze3dParams()); @@ -515,11 +453,18 @@ implements StatusListener saveMenu.add(saveStlButton); saveMenu.add(saveImcButton); saveMenu.add(saveTextButton); + saveMenu.add(saveWorleEditButton); return saveMenu; } + private JButton newSaveButton(String format, Action action) { + final JButton saveTextButton = new JButton(labels.getString("save") + " " + format); + saveTextButton.addActionListener(action); + return saveTextButton; + } + private JPanel createResolveQuitBar() { JPanel resolveQuitBar = new JPanel(new FlowLayout()); @@ -829,10 +774,28 @@ implements StatusListener Display display = new Display(model, W, H, params); } + private void saveWorldEdit() { + File outfile = getFileForExtension("we"); + if (!outfile.exists()) { + addStatus("Saving we to " + outfile + " ..."); + try { + FileOutputStream out = new FileOutputStream(outfile); + new MazePeristWorldEdit(model).streamOut("we", out); + out.close(); + addStatus("... Done."); + } catch (IOException io) { + io.printStackTrace(System.err); + } + } else { + addStatus("we file " + outfile + " already exists"); + } + + } + public void saveStl(MazeParamsFixed params, LabyModel model, Maze3dParams wallparams) { File outfile = getFileForExtension("stl"); if (!outfile.exists()) { - addStatus("Saving to " + outfile + " ..."); + addStatus("Saving stl to " + outfile + " ..."); try { FileOutputStream out = new FileOutputStream(outfile); new Wall3dStream(params.getName(), model, out, wallparams).stream(); @@ -842,7 +805,7 @@ implements StatusListener io.printStackTrace(System.err); } } else { - addStatus("" + outfile + " already exists"); + addStatus("stl file " + outfile + " already exists"); } } diff --git a/java/org/artisanlogiciel/games/maze/persist/MazePeristWorldEdit.java b/java/org/artisanlogiciel/games/maze/persist/MazePeristWorldEdit.java new file mode 100644 index 0000000..1342cfe --- /dev/null +++ b/java/org/artisanlogiciel/games/maze/persist/MazePeristWorldEdit.java @@ -0,0 +1,110 @@ +package org.artisanlogiciel.games.maze.persist; + +import org.artisanlogiciel.games.maze.Brick; +import org.artisanlogiciel.games.maze.LabyModel; +import org.artisanlogiciel.games.minetest.Node; +import org.artisanlogiciel.games.minetest.WorlEditGenerator; +import java.io.*; + +public class MazePeristWorldEdit { + + private LabyModel model; + private WorlEditGenerator generator; + private static final String GRASS_MATERIAL = "default:dirt_with_grass"; + + public MazePeristWorldEdit(LabyModel model) { + this.model = model; + } + + void addNode(Node node) + { + if (node != null ) + { + generator.writeNode(node); + } + } + + void addWalls(int pX, int pY) { + short walls = model.getWalls(pX, pY); + short wdrawn = 0; + // todo + int w = 2; + int h = 2; + int ox = 0; + int oy = 0; + int z = 0; + + String material = GRASS_MATERIAL; + + int x = ox + (int) (pX * w); + int y = oy + (int) (pY * h); + + // copied from drawing, where order did matter, might not be the case here... + if ((pY == 0) && LabyModel.isFlagSet(walls, Brick.UP)) { + addNode(new Node(x,y,z,material)); + addNode(new Node(x + (int) w,y,z,material)); + wdrawn |= Brick.UP; + } + if (LabyModel.isFlagSet(walls, Brick.RIGHT)) { + if (!LabyModel.isFlagSet(wdrawn, Brick.UP)) { + addNode(new Node(x + (int) w, y, 0, material)); + } + addNode(new Node(x + (int) w, y + (int) h, z, material)); + wdrawn |= Brick.RIGHT; + } + if (LabyModel.isFlagSet(walls, Brick.DOWN)) { + if (!LabyModel.isFlagSet(wdrawn, Brick.RIGHT)) { + addNode(new Node(x + (int) w, y + (int) h, z, material)); + } + addNode(new Node(x, y + (int) h, z, material)); + wdrawn |= Brick.DOWN; + } + if ((pX == 0) && LabyModel.isFlagSet(walls, Brick.LEFT)) { + if (!LabyModel.isFlagSet(wdrawn, Brick.DOWN)) { + addNode(new Node(x, y + (int) h, z, material)); + } + addNode(new Node(x, y, z, material)); + wdrawn |= Brick.LEFT; + } + } + + + public void streamOut(String pFormat, OutputStream pOut) throws IOException { + // WIP using WorldEditGenerator + if ((pFormat == null) || (pFormat.equals("we"))) { + + Node refNode = new Node(0,0,0,"default:dirt_with_grass"); + StringBuilder builder = new StringBuilder(); + generator = new WorlEditGenerator(builder,refNode); + generator.writeStart(); + // first raw format, not smart. + DataOutputStream dataOut = new DataOutputStream(pOut); + dataOut.flush(); + for (int y = 0; y < model.getHeight(); y++) { + for (int x = 0; x < model.getWidth(); x++) { + addWalls(x,y); + } + } + generator.writeEnd(); + dataOut.write(builder.toString().getBytes()); + dataOut.flush(); + } else { + throw new IOException("Format " + pFormat + " Not yet implemented."); + } + } + + + public LabyModel parseInputStream(String pFormat, InputStream pIn) throws IOException { + // TODO using WorldEditGenerator + if ((pFormat == null) || (pFormat.equals("we"))) { + // DataInputStream in = new DataInputStream(pIn); + throw new IOException("Format " + pFormat + " Not yet implemented."); + // should be at end of stream ? Not necessary can stream multiple + // labs ( or tiling ). + } else { + throw new IOException("Format " + pFormat + " Not yet implemented."); + } + + } + +} diff --git a/java/org/artisanlogiciel/games/minetest/Node.java b/java/org/artisanlogiciel/games/minetest/Node.java index a5adc2d..d1e8bb1 100644 --- a/java/org/artisanlogiciel/games/minetest/Node.java +++ b/java/org/artisanlogiciel/games/minetest/Node.java @@ -1,4 +1,31 @@ package org.artisanlogiciel.games.minetest; public class Node { + int x; + int y; + int z; + String material; + + public Node(int x, int y, int z, String material) { + this.x = x; + this.y = y; + this.z = z; + this.material = material; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getZ() { + return z; + } + + public String getMaterial() { + return material; + } } diff --git a/java/org/artisanlogiciel/games/minetest/WorlEditGenerator.java b/java/org/artisanlogiciel/games/minetest/WorlEditGenerator.java new file mode 100644 index 0000000..550a11c --- /dev/null +++ b/java/org/artisanlogiciel/games/minetest/WorlEditGenerator.java @@ -0,0 +1,64 @@ +package org.artisanlogiciel.games.minetest; + +public class WorlEditGenerator +{ + + Node refNode; + StringBuilder luaNode; + boolean start = true; + + public WorlEditGenerator(StringBuilder luaNode, Node refNode) { + this.luaNode = luaNode; + start = true; + this.refNode = refNode; + } + + private void addIntMember(String name, int value) + { + addSeparator(); + addMember(name); + luaNode.append(value); + } + + private void addStringMember( String name, String value) + { + addSeparator(); + addMember(name); + luaNode.append('"').append(value).append('"'); + } + + private void addMember(String name) { + luaNode.append("[\"").append(name).append("\"]="); + } + + private void addSeparator() { + if ( ! start) + { + luaNode.append(","); + } + start = false; + } + + public void writeStart() + { + luaNode.append("5.return {"); + } + public void writeNode(Node node) + { + addSeparator(); + luaNode.append("{"); + start=true; + addIntMember("x", node.getX() - refNode.getX()); + addIntMember("y", node.getY() - refNode.getY()); + addIntMember("z", node.getZ() - refNode.getZ()); + addStringMember("name",node.getMaterial()); + luaNode.append("}"); + start=false; + } + + public void writeEnd() + { + luaNode.append("}"); + } + +}