diff --git a/pom.xml b/pom.xml index 03a7fd03e..7a62c86d6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.marginallyclever RobotOverlord - 2.90.0 + 2.92.0 Robot Overlord A friendly 3D user interface for controlling robots. http://www.marginallyclever.com/ diff --git a/src/main/java/com/marginallyclever/ro3/Registry.java b/src/main/java/com/marginallyclever/ro3/Registry.java index 08daa3fb7..1defbf2c8 100644 --- a/src/main/java/com/marginallyclever/ro3/Registry.java +++ b/src/main/java/com/marginallyclever/ro3/Registry.java @@ -38,6 +38,7 @@ public static void start() { pose.add("Camera", Camera::new); renderPasses.add(new DrawBackground()); + renderPasses.add(new DrawGroundPlane()); renderPasses.add(new DrawMeshes()); renderPasses.add(new DrawBoundingBoxes()); renderPasses.add(new DrawCameras()); diff --git a/src/main/java/com/marginallyclever/ro3/render/OpenGLPanel.java b/src/main/java/com/marginallyclever/ro3/render/OpenGLPanel.java index 6d4100763..381c03d03 100644 --- a/src/main/java/com/marginallyclever/ro3/render/OpenGLPanel.java +++ b/src/main/java/com/marginallyclever/ro3/render/OpenGLPanel.java @@ -10,20 +10,16 @@ import org.slf4j.LoggerFactory; import java.awt.event.*; -import java.util.List; -import java.util.ArrayList; import javax.swing.*; import java.awt.*; /** * {@link OpenGLPanel} is a {@link DockingPanel} that contains a {@link GLJPanel} and an {@link FPSAnimator}. */ -public class OpenGLPanel extends JPanel implements GLEventListener, MouseListener, MouseMotionListener, MouseWheelListener, KeyListener { +public class OpenGLPanel extends JPanel implements GLEventListener, MouseListener, MouseMotionListener, MouseWheelListener { private static final Logger logger = LoggerFactory.getLogger(OpenGLPanel.class); protected GLJPanel glCanvas; - protected int canvasWidth, canvasHeight; private final FPSAnimator animator = new FPSAnimator(GraphicsPreferences.framesPerSecond.get()); - private final List listeners = new ArrayList<>(); public OpenGLPanel() { super(new BorderLayout()); @@ -48,7 +44,6 @@ public void addNotify() { glCanvas.addMouseListener(this); glCanvas.addMouseMotionListener(this); glCanvas.addMouseWheelListener(this); - glCanvas.addKeyListener(this); } @Override @@ -58,7 +53,6 @@ public void removeNotify() { glCanvas.removeMouseListener(this); glCanvas.removeMouseMotionListener(this); glCanvas.removeMouseWheelListener(this); - glCanvas.removeKeyListener(this); } private GLCapabilities getCapabilities() { @@ -80,21 +74,11 @@ private GLCapabilities getCapabilities() { } public void addGLEventListener(GLEventListener listener) { - listeners.add(listener); glCanvas.addGLEventListener(listener); } public void removeGLEventListener(GLEventListener listener) { glCanvas.removeGLEventListener(listener); - listeners.remove(listener); - } - - public int getGLEventListenersCount() { - return listeners.size(); - } - - public GLEventListener getGLEventListener(int index) { - return listeners.get(index); } public void stopAnimationSystem() { @@ -131,15 +115,12 @@ public void init(GLAutoDrawable glAutoDrawable) { @Override public void dispose(GLAutoDrawable glAutoDrawable) { logger.info("dispose"); - GL3 gl3 = glAutoDrawable.getGL().getGL3(); Registry.textureFactory.unloadAll(); } @Override public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int height) { //logger.debug("reshape {}x{}",width,height); - canvasWidth = width; - canvasHeight = height; } @Override @@ -168,27 +149,4 @@ public void mouseMoved(MouseEvent e) {} @Override public void mouseWheelMoved(MouseWheelEvent e) {} - - public int getCanvasHeight() { - return canvasHeight; - } - - public int getCanvasWidth() { - return canvasWidth; - } - - @Override - public void keyTyped(KeyEvent e) { - System.out.println("keyTyped "+e); - } - - @Override - public void keyPressed(KeyEvent e) { - System.out.println("keyPressed "+e); - } - - @Override - public void keyReleased(KeyEvent e) { - System.out.println("keyReleased "+e); - } } diff --git a/src/main/java/com/marginallyclever/ro3/render/renderpasses/AbstractRenderPass.java b/src/main/java/com/marginallyclever/ro3/render/renderpasses/AbstractRenderPass.java new file mode 100644 index 000000000..a360e2ccb --- /dev/null +++ b/src/main/java/com/marginallyclever/ro3/render/renderpasses/AbstractRenderPass.java @@ -0,0 +1,74 @@ +package com.marginallyclever.ro3.render.renderpasses; + +import com.jogamp.opengl.GLAutoDrawable; +import com.marginallyclever.ro3.render.RenderPass; + +/** + * {@link AbstractRenderPass} handles common methods for all {@link RenderPass}. + */ +public abstract class AbstractRenderPass implements RenderPass { + private String name; + private int activeStatus = ALWAYS; + protected int canvasWidth, canvasHeight; + + protected AbstractRenderPass() {} + + protected AbstractRenderPass(String name) { + this(); + this.name = name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * @return the localized name of this pass. + */ + @Override + public String getName() { + return name; + } + + /** + * @return NEVER, SOMETIMES, or ALWAYS + */ + @Override + public int getActiveStatus() { + return activeStatus; + } + + /** + * @param status NEVER, SOMETIMES, or ALWAYS + */ + @Override + public void setActiveStatus(int status) { + activeStatus = status; + } + + @Override + public void draw() { + + } + + @Override + public void init(GLAutoDrawable glAutoDrawable) { + + } + + @Override + public void dispose(GLAutoDrawable glAutoDrawable) { + + } + + @Override + public void display(GLAutoDrawable glAutoDrawable) { + + } + + @Override + public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int height) { + canvasWidth = width; + canvasHeight = height; + } +} diff --git a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBackground.java b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBackground.java index e1fa6a6cb..1d3d482c1 100644 --- a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBackground.java +++ b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBackground.java @@ -24,16 +24,16 @@ *

Draw the background. This may be a skybox or a solid color.

*

TODO use the OpenGL cube map texture?

*/ -public class DrawBackground implements RenderPass { +public class DrawBackground extends AbstractRenderPass { private static final Logger logger = LoggerFactory.getLogger(DrawBackground.class); - private int activeStatus = ALWAYS; private final ColorRGB eraseColor = new ColorRGB(64,64,128); private ShaderProgram shader; private final Mesh mesh = new Mesh(); private final TextureWithMetadata texture; - private int canvasWidth, canvasHeight; public DrawBackground() { + super("Erase/Background"); + // build a box mesh.setRenderStyle(GL3.GL_QUADS); @@ -83,22 +83,6 @@ public DrawBackground() { texture.setDoNotExport(true); } - /** - * @return NEVER, SOMETIMES, or ALWAYS - */ - @Override - public int getActiveStatus() { - return activeStatus; - } - - /** - * @param status NEVER, SOMETIMES, or ALWAYS - */ - @Override - public void setActiveStatus(int status) { - activeStatus = status; - } - /** * @return the localized name of this overlay */ @@ -126,15 +110,6 @@ public void dispose(GLAutoDrawable glAutoDrawable) { shader.delete(gl3); } - @Override - public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int height) { - canvasWidth = width; - canvasHeight = height; - } - - @Override - public void display(GLAutoDrawable glAutoDrawable) {} - @Override public void draw() { GL3 gl3 = GLContext.getCurrentGL().getGL3(); diff --git a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBoundingBoxes.java b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBoundingBoxes.java index 2acb272c2..1b20d9e4f 100644 --- a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBoundingBoxes.java +++ b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawBoundingBoxes.java @@ -30,14 +30,14 @@ /** * Draw the bounding box of each {@link MeshInstance} in the scene. */ -public class DrawBoundingBoxes implements RenderPass { +public class DrawBoundingBoxes extends AbstractRenderPass { private static final Logger logger = LoggerFactory.getLogger(DrawBoundingBoxes.class); - private int activeStatus = ALWAYS; private ShaderProgram shader; private final Mesh mesh = new Mesh(); - private int canvasWidth, canvasHeight; public DrawBoundingBoxes() { + super("Bounding Boxes"); + mesh.setRenderStyle(GL3.GL_LINES); // add 8 points of a unit cube centered on the origin mesh.addVertex(-0.5f, 0.5f, 0.5f); @@ -65,30 +65,6 @@ public DrawBoundingBoxes() { mesh.addIndex(3); mesh.addIndex(7); } - /** - * @return NEVER, SOMETIMES, or ALWAYS - */ - @Override - public int getActiveStatus() { - return activeStatus; - } - - /** - * @param status NEVER, SOMETIMES, or ALWAYS - */ - @Override - public void setActiveStatus(int status) { - activeStatus = status; - } - - /** - * @return the localized name of this overlay - */ - @Override - public String getName() { - return "Bounding Boxes"; - } - @Override public void init(GLAutoDrawable glAutoDrawable) { GL3 gl3 = glAutoDrawable.getGL().getGL3(); @@ -108,15 +84,6 @@ public void dispose(GLAutoDrawable glAutoDrawable) { shader.delete(gl3); } - @Override - public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int height) { - canvasWidth = width; - canvasHeight = height; - } - - @Override - public void display(GLAutoDrawable glAutoDrawable) {} - @Override public void draw() { Camera camera = Registry.getActiveCamera(); diff --git a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawCameras.java b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawCameras.java index dbcc73c02..9691c9d6a 100644 --- a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawCameras.java +++ b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawCameras.java @@ -19,14 +19,14 @@ /** * Draws each {@link Camera} as a pyramid approximating the perspective view frustum. */ -public class DrawCameras implements RenderPass { +public class DrawCameras extends AbstractRenderPass { private static final Logger logger = LoggerFactory.getLogger(DrawCameras.class); - private int activeStatus = ALWAYS; private final Mesh mesh = new Mesh(); private ShaderProgram shader; - private int canvasWidth,canvasHeight; public DrawCameras() { + super("Cameras"); + // add mesh to a list that can be unloaded and reloaded as needed. mesh.setRenderStyle(GL3.GL_LINES); Vector3d a = new Vector3d(-1,-1,-1); @@ -47,30 +47,6 @@ public DrawCameras() { mesh.addColor(0,0,0,1); mesh.addVertex((float)a.x, (float)a.y, (float)a.z); } - /** - * @return NEVER, SOMETIMES, or ALWAYS - */ - @Override - public int getActiveStatus() { - return activeStatus; - } - - /** - * @param status NEVER, SOMETIMES, or ALWAYS - */ - @Override - public void setActiveStatus(int status) { - activeStatus = status; - } - - /** - * @return the localized name of this overlay - */ - @Override - public String getName() { - return "Cameras"; - } - @Override public void init(GLAutoDrawable glAutoDrawable) { GL3 gl3 = glAutoDrawable.getGL().getGL3(); @@ -90,15 +66,6 @@ public void dispose(GLAutoDrawable glAutoDrawable) { shader.delete(gl3); } - @Override - public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int height) { - canvasWidth = width; - canvasHeight = height; - } - - @Override - public void display(GLAutoDrawable glAutoDrawable) {} - @Override public void draw() { Camera camera = Registry.getActiveCamera(); diff --git a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawDHParameters.java b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawDHParameters.java index 36e2bee9b..5656d0fef 100644 --- a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawDHParameters.java +++ b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawDHParameters.java @@ -26,14 +26,14 @@ /** * Draws each {@link DHParameter} as two lines from the previous joint to the current joint. */ -public class DrawDHParameters implements RenderPass { +public class DrawDHParameters extends AbstractRenderPass { private static final Logger logger = LoggerFactory.getLogger(DrawDHParameters.class); - private int activeStatus = ALWAYS; private final Mesh mesh = new Mesh(); private ShaderProgram shader; - private int canvasWidth,canvasHeight; public DrawDHParameters() { + super("DH Parameters"); + // add mesh to a list that can be unloaded and reloaded as needed. mesh.setRenderStyle(GL3.GL_LINES); // line d @@ -44,30 +44,6 @@ public DrawDHParameters() { mesh.addColor(1,0,0,1); mesh.addVertex(0,0,0); } - /** - * @return NEVER, SOMETIMES, or ALWAYS - */ - @Override - public int getActiveStatus() { - return activeStatus; - } - - /** - * @param status NEVER, SOMETIMES, or ALWAYS - */ - @Override - public void setActiveStatus(int status) { - activeStatus = status; - } - - /** - * @return the localized name of this overlay - */ - @Override - public String getName() { - return "DH Parameters"; - } - @Override public void init(GLAutoDrawable glAutoDrawable) { GL3 gl3 = glAutoDrawable.getGL().getGL3(); @@ -87,15 +63,6 @@ public void dispose(GLAutoDrawable glAutoDrawable) { shader.delete(gl3); } - @Override - public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int height) { - canvasWidth = width; - canvasHeight = height; - } - - @Override - public void display(GLAutoDrawable glAutoDrawable) {} - @Override public void draw() { Camera camera = Registry.getActiveCamera(); diff --git a/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawGroundPlane.java b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawGroundPlane.java new file mode 100644 index 000000000..2a708f6d1 --- /dev/null +++ b/src/main/java/com/marginallyclever/ro3/render/renderpasses/DrawGroundPlane.java @@ -0,0 +1,92 @@ +package com.marginallyclever.ro3.render.renderpasses; + +import com.jogamp.opengl.GL3; +import com.jogamp.opengl.GLAutoDrawable; +import com.jogamp.opengl.GLContext; +import com.marginallyclever.convenience.helpers.MatrixHelper; +import com.marginallyclever.convenience.helpers.ResourceHelper; +import com.marginallyclever.ro3.Registry; +import com.marginallyclever.ro3.node.Node; +import com.marginallyclever.ro3.node.nodes.Camera; +import com.marginallyclever.ro3.node.nodes.Pose; +import com.marginallyclever.ro3.render.RenderPass; +import com.marginallyclever.robotoverlord.systems.render.ShaderProgram; +import com.marginallyclever.robotoverlord.systems.render.mesh.Mesh; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.vecmath.Matrix4d; +import javax.vecmath.Vector3d; +import java.util.ArrayList; +import java.util.List; + +/** + * Draw the ground plane. + */ +public class DrawGroundPlane extends AbstractRenderPass { + private static final Logger logger = LoggerFactory.getLogger(DrawGroundPlane.class); + private final Mesh mesh = MatrixHelper.createMesh(1.0); + private ShaderProgram shader; + + public DrawGroundPlane() { + super("Ground plane"); + + mesh.setRenderStyle(GL3.GL_LINES); + int v = 1000; + int stepSize=100; + for(int s=-v;s