Skip to content

Commit

Permalink
separate shaders for each RenderPass
Browse files Browse the repository at this point in the history
  • Loading branch information
i-make-robots committed Dec 19, 2023
1 parent 1c0ca4c commit 60a2c62
Show file tree
Hide file tree
Showing 19 changed files with 489 additions and 219 deletions.
5 changes: 5 additions & 0 deletions src/main/java/com/marginallyclever/ro3/DockingPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,9 @@ public String getPersistentID() {
public String getTabText() {
return tabText;
}

@Override
public boolean isWrappableInScrollpane() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public void actionPerformed(ActionEvent e) {
File src = (filePath != null)
? new File(filePath) // use the given filename
: runFileDialog((Component) e.getSource()); // ask the user for a filename
if( src == null ) return; // cancelled
loadAsNewScene(src);
}

Expand Down
16 changes: 7 additions & 9 deletions src/main/java/com/marginallyclever/ro3/node/NodeDetailView.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,13 @@
*/
public class NodeDetailView extends JPanel implements SelectionChangeListener {
private static final Logger logger = LoggerFactory.getLogger(NodeDetailView.class);
private final JPanel parent = new JPanel(new BorderLayout());

public NodeDetailView() {
super();
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(parent);
this.add(scroll, BorderLayout.CENTER);
}

/**
Expand All @@ -26,12 +31,7 @@ public NodeDetailView() {
*/
@Override
public void selectionChanged(List<Node> selectedNodes) {
JPanel parent = new JPanel();

parent.setLayout(new BorderLayout());
Box vertical = Box.createVerticalBox();
parent.add(vertical,BorderLayout.PAGE_START);

List<JComponent> list = new ArrayList<>();

for(Node node : selectedNodes) {
Expand All @@ -46,10 +46,8 @@ public void selectionChanged(List<Node> selectedNodes) {
vertical.add(c);
}

this.removeAll();
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(parent);
this.add(scroll, BorderLayout.CENTER);
parent.removeAll();
parent.add(vertical,BorderLayout.NORTH);
this.revalidate();
this.repaint();
}
Expand Down
39 changes: 38 additions & 1 deletion src/main/java/com/marginallyclever/ro3/node/nodes/Camera.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
import java.util.List;

public class Camera extends Pose {
private boolean drawOrthographic = false;
private double fovY = 60;
private double nearZ = 1;
private double farZ = 1000;
private boolean drawOrthographic = false;

public Camera() {
super("Camera");
Expand Down Expand Up @@ -195,4 +195,41 @@ public void lookAt(Vector3d target) {
local.setTranslation(position);
this.setLocal(local);
}

public Matrix4d getPerspectiveFrustum(int width,int height) {
double nearVal = this.getNearZ();
double farVal = this.getFarZ();
double aspect = (double)width / (double)height;

return MatrixHelper.perspectiveMatrix4d(this.getFovY(),aspect,nearVal,farVal);
}

/**
* Render the scene in orthographic projection.
* @param zoom the zoom factor
*/
public Matrix4d getOrthographicMatrix(double zoom,int width,int height) {
double w = width/2.0f;
double h = height/2.0f;

double left = -w/zoom;
double right = w/zoom;
double bottom = -h/zoom;
double top = h/zoom;
double nearVal = this.getNearZ();
double farVal = this.getFarZ();

return MatrixHelper.orthographicMatrix4d(left,right,bottom,top,nearVal,farVal);
}

public Matrix4d getChosenProjectionMatrix(int width,int height) {
return drawOrthographic ? getOrthographicMatrix(1.0,width,height) : getPerspectiveFrustum(width,height);
}

public Matrix4d getViewMatrix() {
Matrix4d inverseCamera = this.getWorld();
inverseCamera.invert();
inverseCamera.transpose();
return inverseCamera;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ public NodeTreeView() {

buildMenuBar();

add(tree, BorderLayout.CENTER);
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(tree);
add(scroll, BorderLayout.CENTER);
add(menuBar, BorderLayout.NORTH);
}

Expand Down
61 changes: 27 additions & 34 deletions src/main/java/com/marginallyclever/ro3/render/OpenGLPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,10 @@
/**
* {@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 {
public class OpenGLPanel extends JPanel implements GLEventListener, MouseListener, MouseMotionListener, MouseWheelListener, KeyListener {
private static final Logger logger = LoggerFactory.getLogger(OpenGLPanel.class);
protected GLJPanel glCanvas;
protected int canvasWidth, canvasHeight;
protected ShaderProgram shaderDefault;
private final FPSAnimator animator = new FPSAnimator(GraphicsPreferences.framesPerSecond.get());
private final List<GLEventListener> listeners = new ArrayList<>();

Expand All @@ -60,6 +59,7 @@ public void addNotify() {
glCanvas.addMouseListener(this);
glCanvas.addMouseMotionListener(this);
glCanvas.addMouseWheelListener(this);
glCanvas.addKeyListener(this);
}

@Override
Expand All @@ -69,6 +69,7 @@ public void removeNotify() {
glCanvas.removeMouseListener(this);
glCanvas.removeMouseMotionListener(this);
glCanvas.removeMouseWheelListener(this);
glCanvas.removeKeyListener(this);
}

private GLCapabilities getCapabilities() {
Expand Down Expand Up @@ -136,32 +137,12 @@ public void init(GLAutoDrawable glAutoDrawable) {
gl3.glBlendFunc(GL3.GL_SRC_ALPHA, GL3.GL_ONE_MINUS_SRC_ALPHA);

gl3.glActiveTexture(GL3.GL_TEXTURE0);

// create the default shader
try {
shaderDefault = new ShaderProgram(gl3,
ResourceHelper.readResource(this.getClass(),"default_330.vert"),
ResourceHelper.readResource(this.getClass(),"default_330.frag"));
} catch(IOException e) {
logger.error("Failed to create default shader.",e);
}
shaderDefault.use(gl3);
shaderDefault.setVector3d(gl3,"lightColor",new Vector3d(1,1,1)); // Light color
shaderDefault.set4f(gl3,"objectColor",1,1,1,1);
shaderDefault.setVector3d(gl3,"specularColor",new Vector3d(0.5,0.5,0.5));
shaderDefault.setVector3d(gl3,"ambientLightColor",new Vector3d(0.2,0.2,0.2));
shaderDefault.set1f(gl3,"useVertexColor",0);
shaderDefault.set1i(gl3,"useLighting",1);
shaderDefault.set1i(gl3,"useTexture",0);
shaderDefault.set1i(gl3,"diffuseTexture",0);
OpenGLHelper.checkGLError(gl3,logger);
}

@Override
public void dispose(GLAutoDrawable glAutoDrawable) {
logger.info("dispose");
GL3 gl3 = glAutoDrawable.getGL().getGL3();
shaderDefault.delete(gl3);
unloadAllMeshes(gl3);
Registry.textureFactory.unloadAll();
}
Expand Down Expand Up @@ -189,18 +170,7 @@ public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int
}

@Override
public void display(GLAutoDrawable glAutoDrawable) {
renderAllPasses();
}

private void renderAllPasses() {
// renderPasses that are always on
for(RenderPass pass : Registry.renderPasses.getList()) {
if(pass.getActiveStatus()==RenderPass.ALWAYS) {
pass.draw(shaderDefault);
}
}
}
public void display(GLAutoDrawable glAutoDrawable) {}

@Override
public void mouseClicked(MouseEvent e) {}
Expand All @@ -225,4 +195,27 @@ 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);
}
}
5 changes: 3 additions & 2 deletions src/main/java/com/marginallyclever/ro3/render/RenderPass.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.marginallyclever.ro3.render;

import com.jogamp.opengl.GLEventListener;
import com.marginallyclever.ro3.Registry;
import com.marginallyclever.robotoverlord.systems.render.ShaderProgram;

/**
* Classes which implement {@link RenderPass} are drawn on top of the 3D scene. They should be registered to the
* {@link Registry}, which remembers the order in which they should be drawn.
*/
public interface RenderPass {
public interface RenderPass extends GLEventListener {
int NEVER = 0;
int SOMETIMES = 1;
int ALWAYS = 2;
Expand All @@ -28,5 +29,5 @@ public interface RenderPass {
*/
String getName();

void draw(ShaderProgram shader);
void draw();
}
Loading

0 comments on commit 60a2c62

Please sign in to comment.