package GLDrawer;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JTextField;
import com.jogamp.graph.curve.Region;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.graph.curve.opengl.RenderState;
import com.jogamp.graph.curve.opengl.TextRegionUtil;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.font.FontFactory;
import com.jogamp.graph.geom.SVertex;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
import com.jogamp.opengl.util.PMVMatrix;
import GLObjects.LinesObj;
import GLObjects.LinienListe;
import StringProcessing.StringProcessing;
import settings.SettingsBD;
public class TextDrawer {
private SettingsBD set;
private StringProcessing StPro;
public TextDrawer(SettingsBD set, StringProcessing StPro) {
this.set = set;
this.StPro = StPro;
fontSize = set.getFontSize();
}
private List<maßAngabe> PosListe = new ArrayList<maßAngabe>();
public static final int Horizontal = 1;
public static final int Vertikal = 2;
///////
// Text renderer variables
private TextRegionUtil textRegionUtil;
private RenderState renderState;
private RegionRenderer regionRenderer;
private Font font;
private volatile float weight = 1.0f;
private float fontSize;
private int[] sampleCount = new int[] { 4 };
private int renderModes = Region.VARWEIGHT_RENDERING_BIT;
public void createPosList(List<LinesObj> LinieList) {
PosListe = new ArrayList<maßAngabe>();
for (int i = 0; i < LinieList.size(); i++) {
LinesObj Line = LinieList.get(i);
if (Line.getSchnittart().equals("Hilfslinie") && !Line.Deleted) {
maßAngabe maßA = new maßAngabe();
Double[] pos1 = Line.getPosBeginAbs();
Double[] pos2 = Line.getPosEndeAbs();
String[] pos1s = Line.getPosBeginRef();
// String[] pos1s = {
// StPro.getLineObjByName(StPro.getFirstReverenzenName(Line.getPosBeginRef()[0]), LinieList)
// .getPosBeginRef()[0],
// StPro.getLineObjByName(StPro.getFirstReverenzenName(Line.getPosBeginRef()[1]), LinieList)
// .getPosBeginRef()[1],
// "0" };
Integer orintation = Line.getAusrichtung();
if ((orintation.equals(Horizontal) || (!pos1[0].equals(pos2[0]) && pos1[1].equals(pos2[1])))
&& !(pos2[1] == 0)) {
maßA.posX1 = 0d;
maßA.posX2 = 0d;
maßA.posY1 = StPro.Process(StPro.getFirstReverenzen(pos1s[1]), LinieList);
maßA.posY2 = StPro.Process(pos1s[1], LinieList);
if (maßA.posY2 < maßA.posY1) {
Double zs1 = maßA.posY2;
Double zs2 = maßA.posY1;
maßA.posY1 = zs1;
maßA.posY2 = zs2;
maßA.posY1s = pos1s[1];
maßA.posY2s = StPro.removeFirstReverenzen(pos1s[1]);
} else {
maßA.posY1s = StPro.removeFirstReverenzen(pos1s[1]);
maßA.posY2s = pos1s[1];
}
maßA.posX1s = "0";
maßA.posX2s = "0";
maßA.maß = StPro.Process(StPro.removeFirstReverenzen(pos1s[1]), LinieList);
maßA.maßs = StPro.removeFirstReverenzen(pos1s[1]);
maßA.maßPositionX = 0d;
maßA.maßPositionY = (maßA.posY2 - Math.abs(maßA.maß / 2));
maßA.maßShort = StPro.getSMaßangabe(pos1s[1]);
maßA.orientierung = Horizontal;
// System.out.println("X1:"+maßA.posX1+" Y1:"+maßA.posY1+" X2:"+maßA.posX2+" Y2:"+maßA.posY2);
maßA.versatz = 1;
for (maßAngabe maßAngabe : PosListe) {
maßAngabe m = maßAngabe;
if (m.orientierung == Horizontal) {
if (
// p1a zwischen p2a und p2e
(maßA.posY1 >= m.posY1 && maßA.posY1 < m.posY2)
// p1a < p2a und p1e > p2e
|| (maßA.posY1 < m.posY1 && maßA.posY2 > m.posY2)) {
maßA.versatz = m.versatz + 1;
} else if (((maßA.posY2 - maßA.posY1) < 50) && ((m.posY2 - m.posY1) < 50)
&& (maßA.posY1 == m.posY2 || maßA.posY2 == m.posY1)) {
maßA.versatz = m.versatz + 1;
}
}
}
}
if (orintation.equals(Vertikal)
|| (pos1[0].equals(pos2[0]) && !pos1[1].equals(pos2[1])) && !(pos2[0] == 0)) {
maßA.posX1 = StPro.Process(StPro.getFirstReverenzen(pos1s[0]), LinieList);
maßA.posX2 = StPro.Process(pos1s[0], LinieList);
maßA.posY1 = 0d;
maßA.posY2 = 0d;
if (maßA.posX2 < maßA.posX1) {
Double zs1 = maßA.posX2;
Double zs2 = maßA.posX1;
maßA.posX1 = zs1;
maßA.posX2 = zs2;
maßA.posX1s = pos1s[1];
maßA.posX2s = StPro.removeFirstReverenzen(pos1s[0]);
} else {
maßA.posX1s = StPro.removeFirstReverenzen(pos1s[0]);
maßA.posX2s = pos1s[1];
}
// maßA.posX1s = StPro.removeFirstReverenzen(pos1s[0]);
// maßA.posX2s = pos1s[0];
maßA.posY1s = "0";
maßA.posY2s = "0";
maßA.maß = StPro.Process(StPro.removeFirstReverenzen(pos1s[0]), LinieList);
maßA.maßs = StPro.removeFirstReverenzen(pos1s[0]);
maßA.maßPositionX = (maßA.posX2 - Math.abs(maßA.maß / 2));
maßA.maßPositionY = 0d;
maßA.maßShort = StPro.getSMaßangabe(pos1s[0]);
maßA.orientierung = Vertikal;
maßA.versatz = 1;
for (maßAngabe maßAngabe : PosListe) {
maßAngabe m = maßAngabe;
if (m.orientierung == Vertikal) {
if (maßA.posX1 >= m.posX1 && maßA.posX1 < m.posX2
|| (maßA.posX1 < m.posX1 && maßA.posX2 > m.posX2)) {
maßA.versatz = m.versatz + 1;
} else if (((maßA.posX2 - maßA.posX1) < 50) && ((m.posX2 - m.posX1) < 50)
&& (maßA.posX1.equals(m.posX2) || maßA.posX2.equals(m.posX1))) {
maßA.versatz = m.versatz + 1;
}
}
}
}
PosListe.add(maßA);
}
}
}
public void createTurnedPosList(LinienListe LinieList) {
createPosList(LinieList.getLineListN());
String[] MaxLB = LinieList.getMaxLaengeBreite(LinieList.getLineListN());
List<maßAngabe> PosListeQ = new ArrayList<maßAngabe>();
// max x und y finden
Double maxX = StPro.Process(MaxLB[1], LinieList.getLineListN());
// Double maxY = StPro.Process(MaxLB[0], LinieList.getLineListN());
// for (maßAngabe m : PosListe) {
// if (m.posX2 > maxX)
// maxX = m.posX2;
// if (m.posY2 > maxY)
// maxY = m.posY2;
// }
for (maßAngabe m : PosListe) {
maßAngabe nm = new maßAngabe();
nm.maßs = m.maßs;
nm.maß = m.maß;
nm.maßPositionX = m.maßPositionY;
nm.maßShort = m.maßShort;
nm.posX1 = m.posY1;
nm.posX2 = m.posY2;
if (m.orientierung == Horizontal) {
nm.orientierung = Vertikal;
nm.maßPositionY = 0d;
nm.posY1 = 0d;
nm.posY2 = 0d;
} else {
nm.orientierung = Horizontal;
nm.maßPositionY = maxX - m.maßPositionX;
nm.posY1 = maxX - m.posX1;
nm.posY2 = maxX - m.posX2;
}
nm.posX1s = m.posY1s;
nm.posX2s = m.posY2s;
nm.posY1s = m.posX1s;
nm.posY2s = m.posX2s;
nm.versatz = m.versatz;
PosListeQ.add(nm);
}
PosListe = PosListeQ;
}
public void TextDrawerInit(GL2ES2 gl, Integer height, Integer width) {
try {
InputStream in = getClass().getResourceAsStream("/res/Fonts/roboto/Roboto-Medium.ttf");
font = FontFactory.get(in, true);
} catch (IOException e) {
e.printStackTrace();
}
renderState = RenderState.createRenderState(SVertex.factory());
Float[] color = set.getTextColor();
renderState.setColorStatic(color[0], color[1], color[2], color[3]);
renderState.setHintMask(RenderState.BITHINT_BLENDING_ENABLED);
regionRenderer = RegionRenderer.create(renderState, /* GLCallback */ RegionRenderer.defaultBlendEnable,
/* GLCallback */ RegionRenderer.defaultBlendDisable);
textRegionUtil = new TextRegionUtil(renderModes);
regionRenderer.reshapePerspective(90.0f, width, height, 5, 10000);
regionRenderer.init(gl, renderModes);
regionRenderer.enable(gl, false);
}
public void drawBemßung(GL2ES2 gl, LinienListe lineList, double[] PosSystem) {
// double[] Pos = JWindow.getRenderer().getPosition();
Float[] color = set.getTextColor();
regionRenderer.getRenderState().setColorStatic(color[0], color[1], color[2], color[3]);
// Float aspect = (float) (JWindow.getRenderer().glCanvasWidth / JWindow.getRenderer().glCanvasHeight);
// regionRenderer.getRenderState().getMatrix().gluPerspective(90f, aspect, 5f, 10000f);
Float FontDis = set.getFontDistance();
// 0 off ausblenden, 1 Absolute Positions angaben, 2 Variablen angaben, 3
// Absolute angaben
if (set.getShowDimensions() == 1) {
for (int i = 0; i < lineList.getLineList().size(); i++) {
LinesObj linie = lineList.getLineList().get(i);
if (linie.getSchnittart().equals("Hilfslinie") && !linie.getDeleted()) {
Double[] pos1 = linie.getPosBeginAbs();
Double[] pos2 = linie.getPosEndeAbs();
Float PosX1 = (float) (((PosSystem[0] + pos1[0]) * FontDis) / PosSystem[2]);
Float PosY1 = (float) (((PosSystem[1] + pos1[1]) * FontDis) / PosSystem[2]);
Float PosZ1 = FontDis;
renderText(gl, pos1[0] + " ; " + pos1[1], PosX1, PosY1, PosZ1, set.getTextScale(), 0f);
Float PosX2 = (float) (((PosSystem[0] + pos2[0]) * FontDis) / PosSystem[2]);
Float PosY2 = (float) (((PosSystem[1] + pos2[1]) * FontDis) / PosSystem[2]);
Float PosZ2 = FontDis;
renderText(gl, pos2[0] + " ; " + pos2[1], PosX2, PosY2, PosZ2, set.getTextScale(), 0f);
}
}
}
// 0 off ausblenden, 1 Absolute Positions angaben, 2 Variablen angaben, 3
// Absolute angaben
if (set.getShowDimensions() == 2) {
for (int i = 0; i < PosListe.size(); i++) {
maßAngabe Maß = PosListe.get(i);
Float rotate = 0f;
Float PosX = (float) (((PosSystem[0] + Maß.maßPositionX) * (FontDis)) / PosSystem[2]);
Float PosY = (float) (((PosSystem[1] + Maß.maßPositionY) * (FontDis)) / PosSystem[2]);
Float PosZ = FontDis;
System.out.println( Maß.maßShort.toUpperCase());
System.out.println("PosX: " + PosX);
System.out.println("PosY: " +PosY);
System.out.println("PosZ: " +PosZ);
Float PosX1Begin = (float) (((PosSystem[0] + Maß.posX1) * (FontDis)) / PosSystem[2] - PosSystem[0]);
Float PosY1Begin = (float) (((PosSystem[1] + Maß.posY1) * (FontDis)) / PosSystem[2] - PosSystem[1]);
Float PosX2Begin = (float) (((PosSystem[0] + Maß.posX2) * (FontDis)) / PosSystem[2] - PosSystem[0]);
Float PosY2Begin = (float) (((PosSystem[1] + Maß.posY2) * (FontDis)) / PosSystem[2] - PosSystem[1]);
Float[] pos1B = { PosX1Begin, PosY1Begin, PosZ };
Float[] pos2E = { PosX2Begin, PosY2Begin, PosZ };
Integer versatz = Maß.versatz;
dimLine(gl, pos1B, pos2E, Maß.orientierung, versatz, PosSystem);
if (Maß.orientierung == Horizontal) {
PosX = PosX - 6 - 14f * (versatz - 1) * set.getTextScale();
rotate = 90f;
}
if (Maß.orientierung == Vertikal) {
PosY = PosY - (1 + 14f * set.getTextScale()) * versatz;
}
System.out.println("Masßsoc "+Maß.maßShort);
System.out.println("PosMaß:"+PosX+","+PosY+","+PosZ);
//Pos X im zusammenhang moit der schriftgröße
//Pos Y im Zusammenhang mit der schrftgröße und anzahl der zeichen um den text mittig auf der line zu bekommen
float offset;
//Offset um den Text mittig auf die linie zu bekommen
offset= (Maß.maßShort.length()*set.getTextScale());
[B] // HIER MUSS ICH EINEN OFFSET ÜBERGEBEN [/B]
[B] renderText(gl, Maß.maßShort.toUpperCase(), PosX, (float) (PosY-(offset*3.2)), PosZ, set.getTextScale(), rotate);[/B]
}
}
// 0 off ausblenden, 1 Absolute Positions angaben, 2 Variablen angaben, 3
// Absolute angaben
if (set.getShowDimensions() == 3) {
for (int i = 0; i < PosListe.size(); i++) {
maßAngabe Maß = PosListe.get(i);
Float rotate = 0f;
Float PosX = (float) (((PosSystem[0] + Maß.maßPositionX) * (FontDis)) / PosSystem[2]);
Float PosY = (float) (((PosSystem[1] + Maß.maßPositionY) * (FontDis)) / PosSystem[2]);
Float PosZ = FontDis;
Float PosX1Begin = (float) (((PosSystem[0] + Maß.posX1) * (FontDis)) / PosSystem[2] - PosSystem[0]);
Float PosY1Begin = (float) (((PosSystem[1] + Maß.posY1) * (FontDis)) / PosSystem[2] - PosSystem[1]);
Float PosX2Begin = (float) (((PosSystem[0] + Maß.posX2) * (FontDis)) / PosSystem[2] - PosSystem[0]);
Float PosY2Begin = (float) (((PosSystem[1] + Maß.posY2) * (FontDis)) / PosSystem[2] - PosSystem[1]);
Float[] pos1B = { PosX1Begin, PosY1Begin, PosZ };
Float[] pos2E = { PosX2Begin, PosY2Begin, PosZ };
Integer versatz = Maß.versatz;
dimLine(gl, pos1B, pos2E, Maß.orientierung, versatz, PosSystem);
if (Maß.orientierung == Horizontal) {
PosX = PosX - 6 - 14f * (versatz - 1) * set.getTextScale();
rotate = 90f;
}
if (Maß.orientierung == Vertikal) {
PosY = PosY - (1 + 14f * set.getTextScale()) * versatz;
}
// System.out.println("PosMaß:"+PosX+","+PosY+","+PosZ);
renderText(gl, Maß.maß.toString(), PosX, PosY, PosZ, set.getTextScale(), rotate);
}
}
}
public void renderText(GL2ES2 gl, String text, Float posX, Float posY, Float posZ, Float scale, Float rotate) {
// the RegionRenderer PMVMatrix define where we want to render our shape
PMVMatrix Pmv = regionRenderer.getMatrix();
Pmv.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
Pmv.glLoadIdentity();
Pmv.glTranslatef(posX, posY, posZ);
Pmv.glScalef(scale, scale, 1f);
Pmv.glRotatef(rotate, 0f, 0f, 1);
if (weight != regionRenderer.getRenderState().getWeight()) {
regionRenderer.getRenderState().setWeight(weight);
}
// Draw the shape using RegionRenderer and TextRegionUtil
regionRenderer.enable(gl, true);
textRegionUtil.drawString3D(gl, regionRenderer, font, fontSize, text + " ", null, sampleCount);
System.out.println("Fontsite : "+fontSize+" size: "+text +" : " );
regionRenderer.enable(gl, false);
}
// Damit wird die Line gezeichnet
private void dimLine(GL2ES2 gl, Float[] Pos1, Float[] Pos2, Integer orientation, Integer versatz,
double[] PosSystem) {
GL2 gl2 = gl.getGL2();
// double[] PosSystem = JWindow.getRenderer().getPosition();
gl2.glColor3d(0d, 0d, 0d);
gl2.glLineWidth(2f);
if (versatz == null) {
versatz = 1;
}
if (versatz == 0) {
versatz = 1;
}
if (orientation == Vertikal) {
gl2.glBegin(GL.GL_LINES);
gl2.glVertex3f(Pos1[0], Pos1[1] - 2 - (1 + 14f * set.getTextScale()) * versatz,
(float) (-PosSystem[2] + Pos1[2]));
gl2.glVertex3f(Pos2[0], Pos2[1] - 2 - (1 + 14f * set.getTextScale()) * versatz,
(float) (-PosSystem[2] + Pos2[2]));
gl2.glVertex3f(Pos1[0] - 0.5f, Pos1[1] - 3 - (1 + 14f * set.getTextScale()) * versatz,
(float) (-PosSystem[2] + Pos1[2]));
gl2.glVertex3f(Pos1[0] + 0.5f, Pos1[1] - 1 - (1 + 14f * set.getTextScale()) * versatz,
(float) (-PosSystem[2] + Pos2[2]));
gl2.glVertex3f(Pos2[0] - 0.5f, Pos1[1] - 3 - (1 + 14f * set.getTextScale()) * versatz,
(float) (-PosSystem[2] + Pos1[2]));
gl2.glVertex3f(Pos2[0] + 0.5f, Pos1[1] - 1 - (1 + 14f * set.getTextScale()) * versatz,
(float) (-PosSystem[2] + Pos2[2]));
//
// gl2.glVertex3f(Pos1[0], Pos1[1] -3 - (1+ 14f * set.getTextScale() )* versatz,
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos1[0], Pos1[1] -1 - (1+ 14f * set.getTextScale() )* versatz,
// (float) (-PosSystem[2] + Pos2[2]));
//
// gl2.glVertex3f(Pos2[0], Pos1[1] -3 - (1+ 14f * set.getTextScale() )* versatz,
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos2[0], Pos1[1] -1 - (1+ 14f * set.getTextScale() )* versatz,
// (float) (-PosSystem[2] + Pos2[2]));
gl2.glEnd();
// maßpfeile
// gl2.glBegin(GL.GL_TRIANGLES);
// gl2.glVertex3f(Pos1[0], Pos1[1] - 2 - 14f * set.getTextScale() * versatz,
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos1[0] + 4, Pos1[1] - 2 - 14f * set.getTextScale() * versatz - 1,
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos1[0] + 4, Pos1[1] - 2 - 14f * set.getTextScale() * versatz + 1,
// (float) (-PosSystem[2] + Pos1[2]));
//
// gl2.glVertex3f(Pos2[0], Pos2[1] - 2 - 14f * set.getTextScale() * versatz,
// (float) (-PosSystem[2] + Pos2[2]));
// gl2.glVertex3f(Pos2[0] - 4, Pos2[1] - 2 - 14f * set.getTextScale() * versatz + 1,
// (float) (-PosSystem[2] + Pos2[2]));
// gl2.glVertex3f(Pos2[0] - 4, Pos2[1] - 2 - 14f * set.getTextScale() * versatz - 1,
// (float) (-PosSystem[2] + Pos2[2]));
// gl2.glEnd();
}
if (orientation == Horizontal) {
gl2.glBegin(GL.GL_LINES);
gl2.glVertex3f(Pos1[0] - 5 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1],
(float) (-PosSystem[2] + Pos1[2]));
gl2.glVertex3f(Pos2[0] - 5 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1],
(float) (-PosSystem[2] + Pos2[2]));
// gl2.glEnd();
gl2.glVertex3f(Pos1[0] - 6 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1] + 0.5f,
(float) (-PosSystem[2] + Pos1[2]));
gl2.glVertex3f(Pos1[0] - 4 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1] - 0.5f,
(float) (-PosSystem[2] + Pos2[2]));
gl2.glVertex3f(Pos2[0] - 6 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1] + 0.5f,
(float) (-PosSystem[2] + Pos1[2]));
gl2.glVertex3f(Pos2[0] - 4 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1] - 0.5f,
(float) (-PosSystem[2] + Pos2[2]));
// gl2.glVertex3f(Pos1[0] - 6 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1],
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos1[0] - 4 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1],
// (float) (-PosSystem[2] + Pos2[2]));
//
// gl2.glVertex3f(Pos2[0] - 6 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1],
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos2[0] - 4 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1],
// (float) (-PosSystem[2] + Pos2[2]));
gl2.glEnd();
// maßpfeile
// gl2.glBegin(GL.GL_TRIANGLES);
// gl2.glVertex3f(Pos1[0] - 5 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1],
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos1[0] - 4 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1] + 4,
// (float) (-PosSystem[2] + Pos1[2]));
// gl2.glVertex3f(Pos1[0] - 6 - (versatz - 1) * 14 * set.getTextScale(), Pos1[1] + 4,
// (float) (-PosSystem[2] + Pos1[2]));
//
// gl2.glVertex3f(Pos2[0] - 5 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1],
// (float) (-PosSystem[2] + Pos2[2]));
// gl2.glVertex3f(Pos2[0] - 6 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1] - 4,
// (float) (-PosSystem[2] + Pos2[2]));
// gl2.glVertex3f(Pos2[0] - 4 - (versatz - 1) * 14 * set.getTextScale(), Pos2[1] - 4,
// (float) (-PosSystem[2] + Pos2[2]));
// gl2.glEnd();
}
}
}
//http://forum.jogamp.org/Text-without-AWT-td4037684.html