X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Fexamples%2FOctreeDemo.java;h=e9979dc5acced850fa061ec2b76b2fc2f6484bb3;hb=HEAD;hp=c26245fc3648060afafc1aa1027230050fb037c7;hpb=ee85b7fbac8b2f5e329b7fa590a0dcf7691a1084;p=sixth-3d-demos.git diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/examples/OctreeDemo.java b/src/main/java/eu/svjatoslav/sixth/e3d/examples/OctreeDemo.java index c26245f..e9979dc 100755 --- a/src/main/java/eu/svjatoslav/sixth/e3d/examples/OctreeDemo.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/examples/OctreeDemo.java @@ -1,18 +1,17 @@ /* - * Sixth 3D engine demos. Copyright ©2012-2016, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * Sixth 3D engine demos. Author: Svjatoslav Agejenko. + * This project is released under Creative Commons Zero (CC0) license. * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 3 of the GNU Lesser General Public License - * or later as published by the Free Software Foundation. - */ +*/ package eu.svjatoslav.sixth.e3d.examples; import eu.svjatoslav.sixth.e3d.geometry.Point3D; -import eu.svjatoslav.sixth.e3d.geometry.Transform; -import eu.svjatoslav.sixth.e3d.gui.ViewContext; import eu.svjatoslav.sixth.e3d.gui.ViewFrame; -import eu.svjatoslav.sixth.e3d.gui.humaninput.WorldNavigationTracker; +import eu.svjatoslav.sixth.e3d.gui.ViewPanel; +import eu.svjatoslav.sixth.e3d.gui.humaninput.WorldNavigationUserInputTracker; +import eu.svjatoslav.sixth.e3d.math.Transform; +import eu.svjatoslav.sixth.e3d.renderer.octree.IntegerPoint; import eu.svjatoslav.sixth.e3d.renderer.octree.OctreeVolume; import eu.svjatoslav.sixth.e3d.renderer.octree.raytracer.Camera; import eu.svjatoslav.sixth.e3d.renderer.octree.raytracer.LightSource; @@ -27,10 +26,9 @@ import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.textcanvas.TextC import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.wireframe.Grid3D; import java.awt.event.KeyEvent; -import java.io.IOException; import java.util.Vector; -public class OctreeDemo extends WorldNavigationTracker { +public class OctreeDemo extends WorldNavigationUserInputTracker { private static final double magnification = 5; private final LineAppearance gridAppearance = new LineAppearance(40, new Color(255, @@ -38,9 +36,9 @@ public class OctreeDemo extends WorldNavigationTracker { private final Vector lights = new Vector<>(); private OctreeVolume octreeVolume; private ShapeCollection shapeCollection; - private ViewContext context; + private ViewPanel viewPanel; - public static void main(final String[] args) throws IOException { + public static void main(final String[] args) { new OctreeDemo().init(); } @@ -78,7 +76,9 @@ public class OctreeDemo extends WorldNavigationTracker { final double c2 = (Math.cos(x / 10f) * 100f) + 127; final double c3 = (Math.cos(z / 12f) * 100f) + 127; - putRect(x - size, y - size, z - size, x + size, y + size, z + size, + putRect( + new IntegerPoint( x - size, y - size, z - size), + new IntegerPoint( x + size, y + size, z + size), new Color((int) c1, (int) c2, (int) c3, 100)); if (size > 1) { @@ -88,16 +88,16 @@ public class OctreeDemo extends WorldNavigationTracker { } } - private void init() throws IOException { + private void init() { final ViewFrame viewFrame = new ViewFrame(); - context = viewFrame.getView().getContext(); + viewPanel = viewFrame.getViewPanel(); - context.getAvatar().setLocation(new Point3D(0, -30, -300)); + viewPanel.getAvatar().setLocation(new Point3D(0, -30, -300)); octreeVolume = new OctreeVolume(); - shapeCollection = context.getRootShapeCollection(); + shapeCollection = viewPanel.getRootShapeCollection(); shapeCollection.addShape(new Grid3D( new Point3D(-10000, -10000, -10000), new Point3D(10000, 10000, @@ -112,31 +112,39 @@ public class OctreeDemo extends WorldNavigationTracker { dotSpiral(); // arbitrary rectangles - putRect(-10, -10, -10, 10, 10, -20, new Color(200, 255, 200, 100)); - putRect(-3, 0, -30, 12, 3, 300, new Color(255, 200, 200, 100)); - putRect(-20, 20, -20, 20, 80, 20, new Color(255, 200, 255, 100)); + putRect(new IntegerPoint(-10, -10, -10), + new IntegerPoint(10, 10, -20), + new Color(200, 255, 200, 100)); + + putRect(new IntegerPoint(-3, 0, -30), + new IntegerPoint( 12, 3, 300), + new Color(255, 200, 200, 100)); + + putRect(new IntegerPoint(-20, 20, -20), + new IntegerPoint(20, 80, 20), + new Color(255, 200, 255, 100)); tiledFloor(); fractal(-50, 20, 100, 32, 1); final TextCanvas message = new TextCanvas(new Transform(new Point3D( - -10, 20, -180)), "Press \"r\" to raytrace current wiew", + -10, 20, -180)), "Press \"r\" to raytrace current view", Color.WHITE, Color.PURPLE); shapeCollection.addShape(message); - context.getKeyboardFocusTracker().setFocusOwner(this); - context.getView().repaintDuringNextViewUpdate(); + viewPanel.getKeyboardFocusStack().pushFocusOwner(this); + viewPanel.repaintDuringNextViewUpdate(); } @Override - public void keyPressed(final KeyEvent event, final ViewContext viewContext) { + public boolean keyPressed(final KeyEvent event, final ViewPanel viewPanel) { if ('r' == event.getKeyChar()) { raytrace(); - return; + return true; } - super.keyPressed(event, viewContext); + return super.keyPressed(event, viewPanel); } private void putPixel(final int x, final int y, final int z, @@ -147,25 +155,24 @@ public class OctreeDemo extends WorldNavigationTracker { } - private void putRect(final int x1, final int y1, final int z1, final int x2, - final int y2, final int z2, final Color color) { + private void putRect(IntegerPoint p1, IntegerPoint p2, final Color color) { shapeCollection .addShape(new SolidPolygonRectangularBox( - new Point3D(x1, y1, z1).scaleUp(magnification), - new Point3D(x2, y2, z2).scaleUp(magnification), color)); + new Point3D(p1).scaleUp(magnification), + new Point3D(p2).scaleUp(magnification), color)); - octreeVolume.fillRect3D(x1, y1, z1, x2, y2, z2, color); + octreeVolume.fillRectangle(p1, p2, color); } private void raytrace() { // create and add camera object to scene - final Camera camera = new Camera(context.getAvatar(), magnification); + final Camera camera = new Camera(viewPanel.getAvatar(), magnification); shapeCollection.addShape(camera); // initialize and start Raytracer in a separate thread final RayTracer rayTracer = new RayTracer(camera.getTexture(), - octreeVolume, lights, camera, context.getView()); + octreeVolume, lights, camera, viewPanel); final Thread thread = new Thread(rayTracer); thread.start(); } @@ -173,10 +180,13 @@ public class OctreeDemo extends WorldNavigationTracker { private void tiledFloor() { final int step = 40; final int size = step - 15; + Color color = new Color(255, 255, 255, 100); for (int x = -200; x < 200; x += step) for (int z = -200; z < 200; z += step) - putRect(x, 100, z, x + size, 110, z + size, new Color(255, 255, - 255, 100)); + putRect( + new IntegerPoint(x, 100, z), + new IntegerPoint(x + size, 110, z + size), + color); } }