Added text editor demo2 inspired by hackers movie :)
[sixth-3d-demos.git] / src / main / java / eu / svjatoslav / sixth / e3d / examples / TextEditorDemo2.java
diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/examples/TextEditorDemo2.java b/src/main/java/eu/svjatoslav/sixth/e3d/examples/TextEditorDemo2.java
new file mode 100644 (file)
index 0000000..f78734b
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Sixth 3D engine demos. Author: Svjatoslav Agejenko. 
+ * This project is released under Creative Commons Zero (CC0) license.
+ *
+*/
+
+package eu.svjatoslav.sixth.e3d.examples;
+
+import eu.svjatoslav.sixth.e3d.geometry.Point2D;
+import eu.svjatoslav.sixth.e3d.geometry.Point3D;
+import eu.svjatoslav.sixth.e3d.geometry.Rectangle;
+import eu.svjatoslav.sixth.e3d.gui.Avatar;
+import eu.svjatoslav.sixth.e3d.gui.ViewFrame;
+import eu.svjatoslav.sixth.e3d.gui.ViewPanel;
+import eu.svjatoslav.sixth.e3d.gui.textEditorComponent.LookAndFeel;
+import eu.svjatoslav.sixth.e3d.gui.textEditorComponent.TextEditComponent;
+import eu.svjatoslav.sixth.e3d.math.Transform;
+import eu.svjatoslav.sixth.e3d.renderer.raster.Color;
+import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection;
+import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.line.LineAppearance;
+import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.wireframe.Grid2D;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URISyntaxException;
+import java.util.stream.Collectors;
+
+public class TextEditorDemo2 {
+
+    public static void main(final String[] args) {
+        try {
+            new TextEditorDemo2().build();
+        } catch (URISyntaxException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void build() throws URISyntaxException, IOException {
+        final ViewFrame viewFrame = new ViewFrame();
+        final ViewPanel viewPanel = viewFrame.getViewPanel();
+
+        final ShapeCollection shapeCollection = viewFrame.getViewPanel()
+                .getRootShapeCollection();
+
+        setAvatarLocation(viewPanel);
+
+        addGrid(shapeCollection);
+
+        addCity(viewPanel, shapeCollection);
+    }
+
+    private void addCity(ViewPanel viewPanel, ShapeCollection shapeCollection) throws URISyntaxException, IOException {
+        int citySize = 4000;
+        for (int z = -citySize; z< citySize; z+= 1000 ){
+            for (int x = -citySize; x< citySize; x+= 1000 ){
+                addBuilding(viewPanel, shapeCollection, x, z);
+            }
+        }
+    }
+
+
+    private static void addGrid(ShapeCollection shapeCollection) {
+        final Transform transform = new Transform(new Point3D(0, 100, 0), 0,
+                Math.PI / 2);
+
+        final Rectangle rectangle = new Rectangle(10000);
+        final LineAppearance appearance = new LineAppearance(10, new Color(
+                "00b3ad"));
+
+        shapeCollection.addShape(new Grid2D(transform, rectangle, 50, 50, appearance));
+    }
+
+
+    private void addBuilding(ViewPanel viewPanel, ShapeCollection shapeCollection, double x, double z) throws URISyntaxException, IOException {
+        Transform transform = new Transform(new Point3D(x, -390, z-200));
+        addTextEditor(viewPanel, shapeCollection, transform);
+
+        transform = new Transform(new Point3D(x, -390, z+200),Math.PI, 0);
+        addTextEditor(viewPanel, shapeCollection, transform);
+
+        transform = new Transform(new Point3D(x-200, -390, z),Math.PI/2, 0);
+        addTextEditor(viewPanel, shapeCollection, transform);
+
+        transform = new Transform(new Point3D(x+200, -390, z),Math.PI/2*3f, 0);
+        addTextEditor(viewPanel, shapeCollection, transform);
+    }
+
+    private void addTextEditor(ViewPanel viewPanel, ShapeCollection shapeCollection, Transform transform) throws IOException {
+        LookAndFeel lookAndFeel = getLookAndFeel();
+
+        final TextEditComponent textEditor = new TextEditComponent(
+                transform,
+                viewPanel,
+                new Point2D(400, 1000),
+                lookAndFeel
+                );
+
+        String text = getResourceFileAsString("demo.txt");
+
+        textEditor.setText(text);
+        textEditor.goToLine((int)(Math.random()*200f));
+        shapeCollection.addShape(textEditor);
+    }
+
+    private LookAndFeel getLookAndFeel() {
+        LookAndFeel lookAndFeel = new LookAndFeel();
+        lookAndFeel.background = new Color(20, 20, 50, 150);
+        lookAndFeel.tabStopBackground = lookAndFeel.background;
+        lookAndFeel.foreground = new Color(150, 150, 255,250);
+        return lookAndFeel;
+    }
+
+    static String getResourceFileAsString(String fileName) throws IOException {
+        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
+        try (InputStream is = classLoader.getResourceAsStream(fileName)) {
+            if (is == null) return null;
+            try (InputStreamReader isr = new InputStreamReader(is);
+                 BufferedReader reader = new BufferedReader(isr)) {
+                return reader.lines().collect(Collectors.joining(System.lineSeparator()));
+            }
+        }
+    }
+
+    private static void setAvatarLocation(ViewPanel viewPanel) {
+        Avatar avatar = viewPanel.getAvatar();
+        avatar.setLocation(new Point3D(500, -300, -800));
+        avatar.setAngleXZ(0.6);
+        avatar.setAngleYZ(-0.5);
+    }
+}