/*
Copyright 2016-2017 Will Winder
This file is part of Universal Gcode Sender (UGS).
UGS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UGS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.ugs.nbm.visualizer.renderables;
import static com.jogamp.opengl.GL.GL_LINES;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.willwinder.ugs.nbm.visualizer.options.VisualizerOptions;
import com.willwinder.ugs.nbm.visualizer.shared.Renderable;
import com.willwinder.universalgcodesender.visualizer.VisualizerUtils;
import java.awt.Color;
import javax.vecmath.Point3d;
/**
*
* @author wwinder
*/
public class Grid extends Renderable {
private float[] gridLineColor;
private float[] gridPlaneColor;
private float[] xAxisColor;
private float[] yAxisColor;
private float[] zAxisColor;
public Grid() {
super(5);
reloadPreferences(new VisualizerOptions());
}
@Override
final public void reloadPreferences(VisualizerOptions vo) {
gridLineColor = VisualizerOptions.colorToFloatArray((Color) vo.getOptionForKey("platform.visualizer.color.xy-grid").value);
gridPlaneColor = VisualizerOptions.colorToFloatArray((Color) vo.getOptionForKey("platform.visualizer.color.xy-plane").value);
yAxisColor = VisualizerOptions.colorToFloatArray((Color) vo.getOptionForKey("platform.visualizer.color.y-axis").value);
xAxisColor = VisualizerOptions.colorToFloatArray((Color) vo.getOptionForKey("platform.visualizer.color.x-axis").value);
zAxisColor = VisualizerOptions.colorToFloatArray((Color) vo.getOptionForKey("platform.visualizer.color.z-axis").value);
}
@Override
public boolean rotate() {
return true;
}
@Override
public boolean center() {
return true;
}
@Override
public void init(GLAutoDrawable drawable) {
}
private double getBestStepSize(double maxSide) {
return maxSide/20;
}
private double getDistFromZeroForStepSize(double stepSize, double point, boolean min) {
if (stepSize < 0.01) return min ? -1 : 1;
// Get remainder.
double remainder = Math.abs(point);
while (remainder >= stepSize/2) {
remainder -= stepSize;
}
if (point <= 0) {
if (min) {
return point - (stepSize - remainder);
} else {
return point + remainder;
}
}
else {
if (min) {
return point - remainder;
} else {
return point + (stepSize - remainder);
}
}
}
@Override
public void draw(GLAutoDrawable drawable, boolean idle, Point3d workCoord, Point3d focusMin, Point3d focusMax, double scaleFactor, Point3d mouseCoordinates, Point3d rotation) {
double maxSide = VisualizerUtils.findMaxSide(focusMin, focusMax);
if (maxSide == 0) {
maxSide = 1;
}
double buffer = maxSide * 0.05;
Point3d bottomLeft = new Point3d(focusMin);
Point3d topRight = new Point3d(focusMax);
// Setup the stepSize and min/max edges so that the lines look right.
double stepSize = getBestStepSize(maxSide);
bottomLeft.x = getDistFromZeroForStepSize(stepSize, bottomLeft.x, true);
bottomLeft.y = getDistFromZeroForStepSize(stepSize, bottomLeft.y, true);
topRight.x = getDistFromZeroForStepSize(stepSize, topRight.x, false);
topRight.y = getDistFromZeroForStepSize(stepSize, topRight.y, false);
GL2 gl = drawable.getGL().getGL2();
gl.glPushMatrix();
double offset = 0.001;
gl.glLineWidth(1.5f);
// grid
gl.glBegin(GL_LINES);
for(double x=bottomLeft.x;x<=topRight.x;x+=stepSize) {
for (double y=bottomLeft.y; y<=topRight.y; y+=stepSize) {
if (x==0) continue;
gl.glColor4fv(gridLineColor, 0);
gl.glVertex3d(x, bottomLeft.y, offset);
gl.glVertex3d(x, topRight.y , offset);
gl.glVertex3d(x, bottomLeft.y, -offset);
gl.glVertex3d(x, topRight.y , -offset);
if (y==0) continue;
gl.glColor4fv(gridLineColor, 0);
gl.glVertex3d(bottomLeft.x, y, offset);
gl.glVertex3d(topRight.x , y, offset);
gl.glVertex3d(bottomLeft.x, y, -offset);
gl.glVertex3d(topRight.x , y, -offset);
}
}
gl.glEnd();
gl.glLineWidth(5f);
gl.glBegin(GL_LINES);
// X Axis Line
gl.glColor4fv(yAxisColor, 0);
gl.glVertex3d(0, bottomLeft.y, offset);
gl.glVertex3d(0, topRight.y , offset);
gl.glVertex3d(0, bottomLeft.y, -offset);
gl.glVertex3d(0, topRight.y , -offset);
// Y Axis Line
gl.glColor4fv(xAxisColor, 0);
gl.glVertex3d(bottomLeft.x, 0, offset);
gl.glVertex3d(topRight.x , 0, offset);
gl.glVertex3d(bottomLeft.x, 0, -offset);
gl.glVertex3d(topRight.x , 0, -offset);
// Z Axis Line
gl.glColor4fv(zAxisColor, 0);
gl.glVertex3d(0, 0, bottomLeft.z);
gl.glVertex3d(0, 0, Math.max(topRight.z, -bottomLeft.z));
gl.glEnd();
//gl.glColor4f(.3f,.3f,.3f, .09f);
gl.glColor4fv(gridPlaneColor, 0);
// floor - cover entire model and a little extra.
gl.glBegin(GL2.GL_QUADS);
gl.glVertex3d(bottomLeft.x, bottomLeft.y, 0);
gl.glVertex3d(bottomLeft.x, topRight.y , 0);
gl.glVertex3d(topRight.x , topRight.y , 0);
gl.glVertex3d(topRight.x , bottomLeft.y, 0);
gl.glEnd();
gl.glPopMatrix();
}
}