/*
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 com.willwinder.ugs.nbm.visualizer.shared.Renderable;
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.universalgcodesender.visualizer.LineSegment;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Collection;
import javax.vecmath.Point3d;
/**
*
* @author wwinder
*/
public class Highlight extends Renderable {
GcodeModel model;
private Collection<Integer> highlightedLines = null;
private int numberOfVertices = -1;
private float[] lineVertexData = null;
// Preferences
Color highlightColor;
public Highlight(GcodeModel model) {
super(9);
this.model = model;
reloadPreferences(new VisualizerOptions());
}
@Override
final public void reloadPreferences(VisualizerOptions vo) {
highlightColor = (Color)vo.getOptionForKey("platform.visualizer.color.highlight").value;
}
@Override
public boolean rotate() {
return true;
}
@Override
public boolean center() {
return true;
}
@Override
public void init(GLAutoDrawable drawable) {
}
@Override
public void draw(GLAutoDrawable drawable, boolean idle, Point3d workCoord, Point3d focusMin, Point3d focusMax, double scaleFactor, Point3d mouseCoordinates, Point3d rotation) {
if (lineVertexData == null || highlightedLines == null || highlightedLines.isEmpty()) {
return;
}
GL2 gl = drawable.getGL().getGL2();
gl.glDisable(GL2.GL_LIGHTING);
//gl.glEnable(GL2.GL_LINE_SMOOTH);
gl.glBegin(GL_LINES);
gl.glLineWidth(2.0f);
float[] c = VisualizerOptions.colorToFloatArray(Color.YELLOW);
for (int verts = 0; verts < (this.numberOfVertices * 3); ) {
gl.glColor4fv(c, 0);
gl.glVertex3d(lineVertexData[verts++], lineVertexData[verts++], lineVertexData[verts++]);
gl.glColor4fv(c, 0);
gl.glVertex3d(lineVertexData[verts++], lineVertexData[verts++], lineVertexData[verts++]);
}
gl.glEnd();
}
public void setHighlightedLines(Collection<Integer> lines) {
this.highlightedLines = lines;
if (lines.isEmpty()) {
this.numberOfVertices = -1;
this.lineVertexData = null;
return;
}
ArrayList<LineSegment> highlights = new ArrayList<>();
int vertIndex = 0;
for (LineSegment ls : model.getLineList()) {
if (lines.contains(ls.getLineNumber())) {
highlights.add(ls);
}
}
this.numberOfVertices = highlights.size() * 2;
this.lineVertexData = new float[numberOfVertices * 3];
for (LineSegment ls : highlights) {
System.out.println("Line number: " + ls.getLineNumber());
Point3d p1 = ls.getStart();
Point3d p2 = ls.getEnd();
// p1 location
lineVertexData[vertIndex++] = (float)p1.x;
lineVertexData[vertIndex++] = (float)p1.y;
lineVertexData[vertIndex++] = (float)p1.z;
//p2
lineVertexData[vertIndex++] = (float)p2.x;
lineVertexData[vertIndex++] = (float)p2.y;
lineVertexData[vertIndex++] = (float)p2.z;
}
}
}