package org.iplantc.phyloviewer.shared.render; import org.iplantc.phyloviewer.shared.math.Box2D; import org.iplantc.phyloviewer.shared.math.Matrix33; import org.iplantc.phyloviewer.shared.math.Vector2; public abstract class Graphics implements IGraphics { private Matrix33 viewMatrix = new Matrix33(); private Matrix33 projectionMatrix = new Matrix33(); private Viewport viewport = new Viewport(); protected Matrix33 objectToScreenMatrix = new Matrix33(); protected Matrix33 screenToObjectMatrix = new Matrix33(); private Box2D screenBounds = new Box2D(); private static Matrix33 createProjectionMatrix(double left, double right, double bottom, double top) { Matrix33 m = new Matrix33(); // From OpenGL documentation. double tx = (-(right + left) / (right - left)); double ty = (-(top + bottom) / (top - bottom)); m.set(0, 0, 2 / (right - left)); m.set(1, 1, 2 / (top - bottom)); m.setTranslationX(tx); m.setTranslationY(ty); return m; } @Override public void setSize(int width, int height) { viewport.setX(0); viewport.setY(0); viewport.setWidth(width); viewport.setHeight(height); projectionMatrix = createProjectionMatrix(0, width, 0, height); updateMatrix(); } @Override public int getWidth() { return viewport.getWidth(); } @Override public int getHeight() { return viewport.getHeight(); } @Override public Matrix33 getObjectToScreenMatrix() { return objectToScreenMatrix; } @Override public Matrix33 getScreenToObjectMatrix() { return screenToObjectMatrix; } /** * Set the view matrix */ @Override public void setViewMatrix(Matrix33 matrix) { this.viewMatrix = matrix; updateMatrix(); } protected void updateMatrix() { objectToScreenMatrix = viewMatrix.multiply(projectionMatrix.multiply(viewport .computeWindowMatrix())); try { screenToObjectMatrix = objectToScreenMatrix.inverse(); } catch(Exception e) { screenToObjectMatrix = new Matrix33(); } Vector2 min = new Vector2(0, 0); Vector2 max = new Vector2(getWidth(), getHeight()); min = screenToObjectMatrix.transform(min); max = screenToObjectMatrix.transform(max); screenBounds.setMin(min); screenBounds.setMax(max); } /** * Get the view matrix. */ @Override public Matrix33 getViewMatrix() { return viewMatrix; } /** * Check to see if the given bounding box is visible. */ @Override public Boolean isCulled(Box2D bbox) { if(!bbox.valid()) return false; return !screenBounds.intersects(bbox); } }