aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener00.java4
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener01.java4
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/GPURegionNewtDemo.java2
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java1
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/UIShapeDemo01.java3
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java5
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java2
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java2
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java2
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java2
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java2
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/GraphShape.java12
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/Group.java4
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/Shape.java57
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java22
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java2
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java2
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java26
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java17
-rw-r--r--src/graphui/classes/jogamp/graph/ui/shapes/Label0.java16
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java70
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/Region.java51
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java14
-rw-r--r--src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java17
-rw-r--r--src/jogl/classes/com/jogamp/graph/geom/Outline.java8
-rw-r--r--src/jogl/classes/com/jogamp/graph/geom/SVertex.java224
-rw-r--r--src/jogl/classes/com/jogamp/graph/geom/Triangle.java14
-rw-r--r--src/jogl/classes/com/jogamp/graph/geom/Vertex.java181
-rw-r--r--src/jogl/classes/com/jogamp/graph/geom/plane/AffineTransform.java24
-rw-r--r--src/jogl/classes/com/jogamp/opengl/math/Vec2f.java33
-rw-r--r--src/jogl/classes/com/jogamp/opengl/math/Vec3f.java47
-rw-r--r--src/jogl/classes/com/jogamp/opengl/math/Vec4f.java27
-rw-r--r--src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java673
-rw-r--r--src/jogl/classes/com/jogamp/opengl/math/Vert2fImmutable.java7
-rw-r--r--src/jogl/classes/com/jogamp/opengl/math/Vert3fImmutable.java4
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java28
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java28
-rw-r--r--src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java28
-rw-r--r--src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java5
-rw-r--r--src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2DExpAddOn.java87
-rw-r--r--src/jogl/classes/jogamp/graph/curve/tess/GraphVertex.java16
-rw-r--r--src/jogl/classes/jogamp/graph/curve/tess/Loop.java19
-rw-r--r--src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java6
-rw-r--r--src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java9
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/GPURegionGLListener01.java4
-rw-r--r--src/test/com/jogamp/opengl/test/junit/graph/PerfTextRendererNEWT00.java3
46 files changed, 639 insertions, 1175 deletions
diff --git a/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener00.java b/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener00.java
index 089731e40..6cb19101c 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener00.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener00.java
@@ -33,7 +33,7 @@ import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
-
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.graph.curve.OutlineShape;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RenderState;
@@ -92,7 +92,7 @@ public class GPURegionGLListener00 extends GPURendererListenerBase01 {
outlineShape.closeLastOutline(true);
region = GLRegion.create(glp, getRenderModes(), null);
- region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new float[4]) : null);
+ region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new Vec4f()) : null);
}
@Override
diff --git a/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener01.java b/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener01.java
index bc7aebdec..404e502cf 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener01.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/GPURegionGLListener01.java
@@ -32,7 +32,7 @@ import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
-
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.graph.curve.OutlineShape;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RenderState;
@@ -273,7 +273,7 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 {
break;
}
region = GLRegion.create(gl.getGLProfile(), getRenderModes(), null);
- region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new float[4]) : null);
+ region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new Vec4f()) : null);
}
@Override
diff --git a/src/demos/com/jogamp/opengl/demos/graph/GPURegionNewtDemo.java b/src/demos/com/jogamp/opengl/demos/graph/GPURegionNewtDemo.java
index e65f74e57..5e2ac39ca 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/GPURegionNewtDemo.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/GPURegionNewtDemo.java
@@ -32,8 +32,6 @@ import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.demos.util.MiscUtils;
import com.jogamp.graph.curve.Region;
-import com.jogamp.graph.curve.opengl.RenderState;
-import com.jogamp.graph.geom.SVertex;
import com.jogamp.newt.event.KeyAdapter;
import com.jogamp.newt.event.KeyEvent;
import com.jogamp.newt.event.WindowAdapter;
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java b/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java
index 5dd5afc35..4cd5cd49b 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java
@@ -53,6 +53,7 @@ import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLCapabilitiesImmutable;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.demos.graph.FontSetDemos;
+import com.jogamp.opengl.demos.graph.ui.util.GraphUIDemoArgs;
import com.jogamp.opengl.demos.util.MiscUtils;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.Animator;
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UIShapeDemo01.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UIShapeDemo01.java
index 8e2c45431..fa2af1ea0 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/UIShapeDemo01.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/UIShapeDemo01.java
@@ -46,6 +46,7 @@ import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
import com.jogamp.opengl.math.FloatUtil;
import com.jogamp.opengl.math.Recti;
import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.common.util.InterruptSource;
import com.jogamp.graph.curve.Region;
@@ -296,7 +297,7 @@ public class UIShapeDemo01 implements GLEventListener {
pmv.glPushMatrix();
pmv.glScalef(txt_scale, txt_scale, 1f);
pmv.glTranslatef(-txt_box_em.getWidth(), 0f, 0f);
- final AABBox txt_box_r = TextRegionUtil.drawString3D(gl, renderModes, renderer, font, text, new float[] { 0, 0, 0, 1 }, sampleCount, tempT1, tempT2);
+ final AABBox txt_box_r = TextRegionUtil.drawString3D(gl, renderModes, renderer, font, text, new Vec4f( 0, 0, 0, 1 ), sampleCount, tempT1, tempT2);
if( once ) {
final AABBox txt_box_em2 = font.getGlyphShapeBounds(null, text);
System.err.println("XXX: full_width: "+full_width_o+" / "+txt_box_em.getWidth()+" -> "+full_width_s);
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java
index ed96112cd..6fe7e1791 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/UITypeDemo01.java
@@ -70,6 +70,7 @@ import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
import com.jogamp.opengl.math.FloatUtil;
import com.jogamp.opengl.math.Recti;
import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.Animator;
import com.jogamp.opengl.util.GLReadBufferUtil;
@@ -158,7 +159,7 @@ public class UITypeDemo01 implements GLEventListener {
animator.start();
}
- private final float[] fg_color = new float[] { 0, 0, 0, 1 };
+ private final Vec4f fg_color = new Vec4f( 0, 0, 0, 1 );
private final Font font;
private final String text;
private final int glyph_id;
@@ -332,7 +333,7 @@ public class UITypeDemo01 implements GLEventListener {
pmv.glTranslatef(-txt_box_em.getWidth(), 0f, 0f);
if( null != glyph.getShape() ) {
final GLRegion region = GLRegion.create(gl.getGLProfile(), renderModes, null);
- region.addOutlineShape(glyph.getShape(), null, region.hasColorChannel() ? fg_color : null);
+ region.addOutlineShape(glyph.getShape(), null, fg_color);
region.draw(gl, renderer, sampleCount);
region.destroy(gl);
}
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java
index 69f1fff71..1272a3a94 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph01UbuntuLight_o.java
@@ -45,7 +45,7 @@ public class Glyph01UbuntuLight_o extends GraphShape {
@SuppressWarnings("unused")
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
// Ubuntu-Light, lower case 'o'
// Start TTF Shape for Glyph 82
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java
index 020b950eb..e4604bf45 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph02UbuntuLight_ae.java
@@ -44,7 +44,7 @@ public class Glyph02UbuntuLight_ae extends GraphShape {
@SuppressWarnings("unused")
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
// Ubuntu-Light, lower case 'æ'
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java
index 518718cff..877a72648 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph03FreeMonoRegular_M.java
@@ -44,7 +44,7 @@ public class Glyph03FreeMonoRegular_M extends GraphShape {
@SuppressWarnings("unused")
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
if( false ) {
// Start TTF Shape for Glyph 48
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java
index f5341cefd..13273488e 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph04FreeSans_0.java
@@ -43,7 +43,7 @@ public class Glyph04FreeSans_0 extends GraphShape {
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
// Start TTF Shape for Glyph 19
// 000: B0a: move-to p0
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java
index 6daf665e7..8e858be16 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/testshapes/Glyph05FreeSerifBoldItalic_ae.java
@@ -43,7 +43,7 @@ public class Glyph05FreeSerifBoldItalic_ae extends GraphShape {
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
// Start TTF Shape for Glyph 168
// 000: B0a: move-to p0
diff --git a/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java b/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java
index 4d2202145..89e77d2fe 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/GraphShape.java
@@ -34,10 +34,9 @@ import com.jogamp.graph.curve.OutlineShape;
import com.jogamp.graph.curve.Region;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RegionRenderer;
-import com.jogamp.graph.geom.Vertex;
-import com.jogamp.graph.geom.Vertex.Factory;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLProfile;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.util.texture.TextureSequence;
/**
@@ -51,8 +50,6 @@ import com.jogamp.opengl.util.texture.TextureSequence;
* @see Scene
*/
public abstract class GraphShape extends Shape {
- protected final Factory<? extends Vertex> vertexFactory;
-
protected final int renderModes;
protected GLRegion region = null;
protected float oshapeSharpness = OutlineShape.DEFAULT_SHARPNESS;
@@ -66,7 +63,6 @@ public abstract class GraphShape extends Shape {
*/
public GraphShape(final int renderModes) {
super();
- this.vertexFactory = OutlineShape.getDefaultVertexFactory();
this.renderModes = renderModes;
}
@@ -122,7 +118,7 @@ public abstract class GraphShape extends Shape {
}
@Override
- protected final void drawImpl0(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount, final float[] rgba) {
+ protected final void drawImpl0(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount, final Vec4f rgba) {
if( null != rgba ) {
renderer.getRenderState().setColorStatic(rgba);
}
@@ -157,10 +153,10 @@ public abstract class GraphShape extends Shape {
}
}
- private final float[] dbgColor = {0.3f, 0.3f, 0.3f, 0.5f};
+ private final Vec4f dbgColor = new Vec4f(0.3f, 0.3f, 0.3f, 0.5f);
protected void addDebugOutline() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
final float x1 = box.getMinX();
final float x2 = box.getMaxX();
final float y1 = box.getMinY();
diff --git a/src/graphui/classes/com/jogamp/graph/ui/Group.java b/src/graphui/classes/com/jogamp/graph/ui/Group.java
index d89d91c8c..c45292f1b 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/Group.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/Group.java
@@ -37,6 +37,7 @@ import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RegionRenderer;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLProfile;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.PMVMatrix;
@@ -194,7 +195,7 @@ public class Group extends Shape implements Container {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
- protected final void drawImpl0(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount, final float[] rgba) {
+ protected final void drawImpl0(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount, final Vec4f rgba) {
final PMVMatrix pmv = renderer.getMatrix();
final Object[] shapesS = shapes.toArray();
Arrays.sort(shapesS, (Comparator)Shape.ZAscendingComparator);
@@ -207,6 +208,7 @@ public class Group extends Shape implements Container {
shape.setTransform(pmv);
if( !doFrustumCulling || !pmv.getFrustum().isAABBoxOutside( shape.getBounds() ) ) {
+ // FIXME: Optimize to reuse modulated rgba
if( null == rgba ) {
shape.drawToSelect(gl, renderer, sampleCount);
} else {
diff --git a/src/graphui/classes/com/jogamp/graph/ui/Shape.java b/src/graphui/classes/com/jogamp/graph/ui/Shape.java
index 132521f0a..a8e3196c9 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/Shape.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/Shape.java
@@ -48,6 +48,7 @@ import com.jogamp.opengl.math.Quaternion;
import com.jogamp.opengl.math.Recti;
import com.jogamp.opengl.math.Vec2f;
import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.PMVMatrix;
@@ -118,13 +119,13 @@ public abstract class Shape {
private final Object dirtySync = new Object();
/** Default base-color w/o color channel, will be modulated w/ pressed- and toggle color */
- protected final float[] rgbaColor = {0.75f, 0.75f, 0.75f, 1.0f};
+ protected final Vec4f rgbaColor = new Vec4f(0.75f, 0.75f, 0.75f, 1.0f);
/** Default pressed color-factor w/o color channel, modulated base-color. 0.75 * 1.2 = 0.9 */
- protected final float[] pressedRGBAModulate = {1.2f, 1.2f, 1.2f, 0.7f};
+ protected final Vec4f pressedRGBAModulate = new Vec4f(1.20f, 1.20f, 1.20f, 0.7f);
/** Default toggle color-factor w/o color channel, modulated base-color. 0.75 * 1.13 ~ 0.85 */
- protected final float[] toggleOnRGBAModulate = {1.13f, 1.13f, 1.13f, 1.0f};
+ protected final Vec4f toggleOnRGBAModulate = new Vec4f(1.13f, 1.13f, 1.13f, 1.0f);
/** Default toggle color-factor w/o color channel, modulated base-color. 0.75 * 0.86 ~ 0.65 */
- protected final float[] toggleOffRGBAModulate = {0.86f, 0.86f, 0.86f, 1.0f};
+ protected final Vec4f toggleOffRGBAModulate = new Vec4f(0.86f, 0.86f, 0.86f, 1.0f);
private int name = -1;
@@ -372,7 +373,7 @@ public abstract class Shape {
}
}
- private final float[] rgba_tmp = { 0, 0, 0, 1 };
+ private final Vec4f rgba_tmp = new Vec4f(0, 0, 0, 1);
/**
* Renders the shape.
@@ -385,7 +386,7 @@ public abstract class Shape {
*/
public void draw(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount) {
final boolean isPressed = isPressed(), isToggleOn = isToggleOn();
- final float[] rgba;
+ final Vec4f rgba;
if( hasColorChannel() ) {
if( isPressed ) {
rgba = pressedRGBAModulate;
@@ -401,27 +402,15 @@ public abstract class Shape {
} else {
rgba = rgba_tmp;
if( isPressed ) {
- rgba[0] = rgbaColor[0]*pressedRGBAModulate[0];
- rgba[1] = rgbaColor[1]*pressedRGBAModulate[1];
- rgba[2] = rgbaColor[2]*pressedRGBAModulate[2];
- rgba[3] = rgbaColor[3]*pressedRGBAModulate[3];
+ rgba.mul(rgbaColor, pressedRGBAModulate);
} else if( isToggleable() ) {
if( isToggleOn ) {
- rgba[0] = rgbaColor[0]*toggleOnRGBAModulate[0];
- rgba[1] = rgbaColor[1]*toggleOnRGBAModulate[1];
- rgba[2] = rgbaColor[2]*toggleOnRGBAModulate[2];
- rgba[3] = rgbaColor[3]*toggleOnRGBAModulate[3];
+ rgba.mul(rgbaColor, toggleOnRGBAModulate);
} else {
- rgba[0] = rgbaColor[0]*toggleOffRGBAModulate[0];
- rgba[1] = rgbaColor[1]*toggleOffRGBAModulate[1];
- rgba[2] = rgbaColor[2]*toggleOffRGBAModulate[2];
- rgba[3] = rgbaColor[3]*toggleOffRGBAModulate[3];
+ rgba.mul(rgbaColor, toggleOffRGBAModulate);
}
} else {
- rgba[0] = rgbaColor[0];
- rgba[1] = rgbaColor[1];
- rgba[2] = rgbaColor[2];
- rgba[3] = rgbaColor[3];
+ rgba.set(rgbaColor);
}
}
synchronized ( dirtySync ) {
@@ -771,7 +760,7 @@ public abstract class Shape {
return this.winToShapeCoord(scene.getPMVMatrixSetup(), scene.getViewport(), glWinX, glWinY, pmv, objPos);
}
- public float[] getColor() {
+ public Vec4f getColor() {
return rgbaColor;
}
@@ -782,10 +771,7 @@ public abstract class Shape {
* </p>
*/
public final Shape setColor(final float r, final float g, final float b, final float a) {
- this.rgbaColor[0] = r;
- this.rgbaColor[1] = g;
- this.rgbaColor[2] = b;
- this.rgbaColor[3] = a;
+ this.rgbaColor.set(r, g, b, a);
return this;
}
@@ -796,10 +782,7 @@ public abstract class Shape {
* </p>
*/
public final Shape setPressedColorMod(final float r, final float g, final float b, final float a) {
- this.pressedRGBAModulate[0] = r;
- this.pressedRGBAModulate[1] = g;
- this.pressedRGBAModulate[2] = b;
- this.pressedRGBAModulate[3] = a;
+ this.pressedRGBAModulate.set(r, g, b, a);
return this;
}
@@ -810,10 +793,7 @@ public abstract class Shape {
* </p>
*/
public final Shape setToggleOnColorMod(final float r, final float g, final float b, final float a) {
- this.toggleOnRGBAModulate[0] = r;
- this.toggleOnRGBAModulate[1] = g;
- this.toggleOnRGBAModulate[2] = b;
- this.toggleOnRGBAModulate[3] = a;
+ this.toggleOnRGBAModulate.set(r, g, b, a);
return this;
}
@@ -824,10 +804,7 @@ public abstract class Shape {
* </p>
*/
public final Shape setToggleOffColorMod(final float r, final float g, final float b, final float a) {
- this.toggleOffRGBAModulate[0] = r;
- this.toggleOffRGBAModulate[1] = g;
- this.toggleOffRGBAModulate[2] = b;
- this.toggleOffRGBAModulate[3] = a;
+ this.toggleOffRGBAModulate.set(r, g, b, a);
return this;
}
@@ -1275,7 +1252,7 @@ public abstract class Shape {
protected abstract void validateImpl(final GLProfile glp, final GL2ES2 gl);
- protected abstract void drawImpl0(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount, float[] rgba);
+ protected abstract void drawImpl0(final GL2ES2 gl, final RegionRenderer renderer, final int[] sampleCount, Vec4f rgba);
protected abstract void clearImpl0(final GL2ES2 gl, final RegionRenderer renderer);
diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java
index e8b0be863..0f754d32a 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/Button.java
@@ -37,6 +37,7 @@ import com.jogamp.graph.geom.plane.AffineTransform;
import com.jogamp.graph.ui.GraphShape;
import com.jogamp.opengl.math.Vec2f;
import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import jogamp.graph.ui.shapes.Label0;
@@ -72,7 +73,7 @@ public class Button extends RoundButton {
final String labelText, final float width,
final float height) {
super(renderModes | Region.COLORCHANNEL_RENDERING_BIT, width, height);
- this.label = new Label0(labelFont, labelText, new float[] { 1.33f, 1.33f, 1.33f, 1.0f }); // 0.75 * 1.33 = 1.0
+ this.label = new Label0(labelFont, labelText, new Vec4f( 1.33f, 1.33f, 1.33f, 1.0f )); // 0.75 * 1.33 = 1.0
setColor(0.75f, 0.75f, 0.75f, 1.0f);
setPressedColorMod(0.9f, 0.9f, 0.9f, 0.7f);
setToggleOffColorMod(0.65f, 0.65f, 0.65f, 1.0f);
@@ -93,16 +94,7 @@ public class Button extends RoundButton {
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
- if(corner == 0.0f) {
- createSharpOutline(shape, twoPassLabelZOffset);
- } else {
- createCurvedOutline(shape, twoPassLabelZOffset);
- }
- shape.setIsQuadraticNurbs();
- shape.setSharpness(oshapeSharpness);
- region.addOutlineShape(shape, null, rgbaColor);
- box.resize(shape.getBounds());
+ addRoundShapeToRegion( twoPassLabelZOffset );
// Precompute text-box size .. guessing pixelSize
final float lw = box.getWidth() * ( 1f - spacingX ) ;
@@ -133,12 +125,6 @@ public class Button extends RoundButton {
if( DEBUG_DRAW ) {
System.err.printf("Button.X: lbox2 %s%n", lbox2);
}
-
- setRotationPivot( ctr );
-
- if( DEBUG_DRAW ) {
- System.err.println("XXX.Button: Added Shape: "+shape+", "+box);
- }
}
public float get2PassLabelZOffset() { return twoPassLabelZOffset; }
@@ -174,7 +160,7 @@ public class Button extends RoundButton {
markShapeDirty();
}
- public final float[] getLabelColor() {
+ public final Vec4f getLabelColor() {
return label.getColor();
}
diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java
index 3e36422a4..f0c6b1369 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/CrossHair.java
@@ -59,7 +59,7 @@ public class CrossHair extends GraphShape {
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
final float lwh = lineWidth/2f;
diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java
index 339ecf645..dd6a272cb 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/Rectangle.java
@@ -59,7 +59,7 @@ public class Rectangle extends GraphShape {
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
final float x1 = 0f;
final float y1 = 0f;
final float x2 = getWidth();
diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java
index 4ea154c09..672d99c3e 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/RoundButton.java
@@ -40,7 +40,7 @@ import com.jogamp.graph.ui.GraphShape;
* To render it rectangular, {@link #setCorner(float)} to zero.
* </p>
*/
-public abstract class RoundButton extends GraphShape {
+public class RoundButton extends GraphShape {
/** {@value} */
public static final float DEFAULT_CORNER = 1f;
@@ -48,7 +48,7 @@ public abstract class RoundButton extends GraphShape {
protected float height;
protected float corner = DEFAULT_CORNER;
- protected RoundButton(final int renderModes, final float width, final float height) {
+ public RoundButton(final int renderModes, final float width, final float height) {
super(renderModes);
this.width = width;
this.height = height;
@@ -67,6 +67,28 @@ public abstract class RoundButton extends GraphShape {
return this;
}
+ @Override
+ protected void addShapeToRegion() {
+ addRoundShapeToRegion(0f);
+ }
+ protected OutlineShape addRoundShapeToRegion(final float zOffset) {
+ final OutlineShape shape = new OutlineShape();
+ if(corner == 0.0f) {
+ createSharpOutline(shape, zOffset);
+ } else {
+ createCurvedOutline(shape, zOffset);
+ }
+ shape.setIsQuadraticNurbs();
+ shape.setSharpness(oshapeSharpness);
+ region.addOutlineShape(shape, null, rgbaColor);
+ box.resize(shape.getBounds());
+ setRotationPivot( box.getCenter() );
+ if( DEBUG_DRAW ) {
+ System.err.println("GraphShape.RoundButton: Added Shape: "+shape+", "+box);
+ }
+ return shape;
+ }
+
protected void createSharpOutline(final OutlineShape shape, final float zOffset) {
final float tw = getWidth();
final float th = getHeight();
diff --git a/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java b/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java
index 2f7d85198..87a86e706 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/shapes/TexSeqButton.java
@@ -62,21 +62,6 @@ public abstract class TexSeqButton extends RoundButton {
@Override
protected void addShapeToRegion() {
- final OutlineShape shape = new OutlineShape(vertexFactory);
- if(corner == 0.0f) {
- createSharpOutline(shape, 0f);
- } else {
- createCurvedOutline(shape, 0f);
- }
- shape.setIsQuadraticNurbs();
- shape.setSharpness(oshapeSharpness);
- region.addOutlineShape(shape, null, rgbaColor);
- box.resize(shape.getBounds());
-
- setRotationPivot( box.getCenter() );
-
- if( DEBUG_DRAW ) {
- System.err.println("XXX.UIShape.TextureSeqButton: Added Shape: "+shape+", "+box);
- }
+ addRoundShapeToRegion( 0f );
}
}
diff --git a/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java b/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java
index a091a89ed..1eafcd58c 100644
--- a/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java
+++ b/src/graphui/classes/jogamp/graph/ui/shapes/Label0.java
@@ -32,14 +32,15 @@ import com.jogamp.graph.curve.opengl.TextRegionUtil;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.geom.plane.AffineTransform;
import com.jogamp.opengl.math.Vec2f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
public class Label0 {
protected Font font;
protected String text;
- protected final float[] rgbaColor;
+ protected final Vec4f rgbaColor;
- public Label0(final Font font, final String text, final float[] rgbaColor) {
+ public Label0(final Font font, final String text, final Vec4f rgbaColor) {
this.font = font;
this.text = text;
this.rgbaColor = rgbaColor;
@@ -47,13 +48,14 @@ public class Label0 {
public final String getText() { return text; }
- public final float[] getColor() { return rgbaColor; }
+ public final Vec4f getColor() { return rgbaColor; }
public final void setColor(final float r, final float g, final float b, final float a) {
- this.rgbaColor[0] = r;
- this.rgbaColor[1] = g;
- this.rgbaColor[2] = b;
- this.rgbaColor[3] = a;
+ this.rgbaColor.set(r, g, b, a);
+ }
+
+ public final void setColor(final Vec4f v) {
+ this.rgbaColor.set(v);
}
public final void setText(final String text) {
diff --git a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java
index 9b71865f6..30987ec7e 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/OutlineShape.java
@@ -34,14 +34,15 @@ import java.util.Comparator;
import com.jogamp.graph.curve.tess.Triangulation;
import com.jogamp.graph.curve.tess.Triangulator;
import com.jogamp.graph.geom.Outline;
-import com.jogamp.graph.geom.SVertex;
import com.jogamp.graph.geom.Triangle;
import com.jogamp.graph.geom.Vertex;
import com.jogamp.graph.geom.plane.AffineTransform;
import com.jogamp.graph.geom.plane.Path2F;
import com.jogamp.graph.geom.plane.Winding;
import com.jogamp.opengl.math.FloatUtil;
+import com.jogamp.opengl.math.Vec3f;
import com.jogamp.opengl.math.VectorUtil;
+import com.jogamp.opengl.math.Vert2fImmutable;
import com.jogamp.opengl.math.geom.AABBox;
/**
@@ -142,8 +143,6 @@ public final class OutlineShape implements Comparable<OutlineShape> {
*/
public static final int DIRTY_TRIANGLES = 1 << 2;
- private final Vertex.Factory<? extends Vertex> vertexFactory;
-
/** The list of {@link Outline}s that are part of this
* outline shape.
*/
@@ -161,25 +160,14 @@ public final class OutlineShape implements Comparable<OutlineShape> {
private float sharpness;
- private final float[] tmpV1 = new float[3];
- private final float[] tmpV2 = new float[3];
- private final float[] tmpV3 = new float[3];
-
- /** Returns the default Vertex.Factory. */
- public static Vertex.Factory<? extends Vertex> getDefaultVertexFactory() { return SVertex.factory(); }
-
- /**
- * Create a new Outline based Shape using {@link #getDefaultVertexFactory()}
- */
- public OutlineShape() {
- this(getDefaultVertexFactory());
- }
+ private final Vec3f tmpV1 = new Vec3f();
+ private final Vec3f tmpV2 = new Vec3f();
+ private final Vec3f tmpV3 = new Vec3f();
/**
* Create a new Outline based Shape
*/
- public OutlineShape(final Vertex.Factory<? extends Vertex> factory) {
- this.vertexFactory = factory;
+ public OutlineShape() {
this.outlines = new ArrayList<Outline>(3);
this.outlines.add(new Outline());
this.outlineState = VerticesState.UNDEFINED;
@@ -230,12 +218,6 @@ public final class OutlineShape implements Comparable<OutlineShape> {
dirtyBits |= DIRTY_TRIANGLES | DIRTY_VERTICES;
}
- /**
- * Returns the associated vertex factory of this outline shape
- * @return Vertex.Factory object
- */
- public final Vertex.Factory<? extends Vertex> vertexFactory() { return vertexFactory; }
-
/** Returns the number of {@link Outline}s. */
public final int getOutlineCount() {
return outlines.size();
@@ -437,7 +419,7 @@ public final class OutlineShape implements Comparable<OutlineShape> {
* @see <a href="#windingrules">see winding rules</a>
*/
public final void addVertex(final float x, final float y, final boolean onCurve) {
- addVertex(vertexFactory.create(x, y, 0f, onCurve));
+ addVertex(new Vertex(x, y, 0f, onCurve));
}
/**
@@ -451,7 +433,7 @@ public final class OutlineShape implements Comparable<OutlineShape> {
* @see <a href="#windingrules">see winding rules</a>
*/
public final void addVertex(final int position, final float x, final float y, final boolean onCurve) {
- addVertex(position, vertexFactory.create(x, y, 0f, onCurve));
+ addVertex(position, new Vertex(x, y, 0f, onCurve));
}
/**
@@ -464,7 +446,7 @@ public final class OutlineShape implements Comparable<OutlineShape> {
* @see <a href="#windingrules">see winding rules</a>
*/
public final void addVertex(final float x, final float y, final float z, final boolean onCurve) {
- addVertex(vertexFactory.create(x, y, z, onCurve));
+ addVertex(new Vertex(x, y, z, onCurve));
}
/**
@@ -478,7 +460,7 @@ public final class OutlineShape implements Comparable<OutlineShape> {
* @see <a href="#windingrules">see winding rules</a>
*/
public final void addVertex(final int position, final float x, final float y, final float z, final boolean onCurve) {
- addVertex(position, vertexFactory.create(x, y, z, onCurve));
+ addVertex(position, new Vertex(x, y, z, onCurve));
}
/**
@@ -495,7 +477,7 @@ public final class OutlineShape implements Comparable<OutlineShape> {
* @see <a href="#windingrules">see winding rules</a>
*/
public final void addVertex(final float[] coordsBuffer, final int offset, final int length, final boolean onCurve) {
- addVertex(vertexFactory.create(coordsBuffer, offset, length, onCurve));
+ addVertex(new Vertex(coordsBuffer, offset, length, onCurve));
}
/**
@@ -513,7 +495,7 @@ public final class OutlineShape implements Comparable<OutlineShape> {
* @see <a href="#windingrules">see winding rules</a>
*/
public final void addVertex(final int position, final float[] coordsBuffer, final int offset, final int length, final boolean onCurve) {
- addVertex(position, vertexFactory.create(coordsBuffer, offset, length, onCurve));
+ addVertex(position, new Vertex(coordsBuffer, offset, length, onCurve));
}
/**
@@ -578,9 +560,9 @@ public final class OutlineShape implements Comparable<OutlineShape> {
}
{
// Skip if last vertex in last outline matching this point -> already connected.
- final float[] llc = lo.getVertex(lo_sz-1).getCoord();
- if( llc[0] == points[idx+0] &&
- llc[1] == points[idx+1] ) {
+ final Vert2fImmutable llc = lo.getVertex(lo_sz-1);
+ if( llc.x() == points[idx+0] &&
+ llc.y() == points[idx+1] ) {
break;
}
}
@@ -652,9 +634,9 @@ public final class OutlineShape implements Comparable<OutlineShape> {
}
{
// Skip if last vertex in last outline matching this point -> already connected.
- final float[] llc = lo.getVertex(0).getCoord();
- if( llc[0] == points[idx+0] &&
- llc[1] == points[idx+1] ) {
+ final Vert2fImmutable llc = lo.getVertex(0);
+ if( llc.x() == points[idx+0] &&
+ llc.y() == points[idx+1] ) {
break;
}
}
@@ -790,11 +772,11 @@ public final class OutlineShape implements Comparable<OutlineShape> {
VectorUtil.midVec3(tmpV2, tmpV1, tmpV3);
//drop off-curve vertex to image on the curve
- b.setCoord(tmpV2, 0, 3);
+ b.setCoord(tmpV2);
b.setOnCurve(true);
- outline.addVertex(index, vertexFactory.create(tmpV1, 0, 3, false));
- outline.addVertex(index+2, vertexFactory.create(tmpV3, 0, 3, false));
+ outline.addVertex(index, new Vertex(tmpV1, false));
+ outline.addVertex(index+2, new Vertex(tmpV3, false));
addedVerticeCount += 2;
}
@@ -934,7 +916,7 @@ public final class OutlineShape implements Comparable<OutlineShape> {
if ( !currentVertex.isOnCurve() && !nextVertex.isOnCurve() ) {
VectorUtil.midVec3(tmpV1, currentVertex.getCoord(), nextVertex.getCoord());
System.err.println("XXX: Cubic: "+i+": "+currentVertex+", "+j+": "+nextVertex);
- final Vertex v = vertexFactory.create(tmpV1, 0, 3, true);
+ final Vertex v = new Vertex(tmpV1, true);
i++;
vertexCount++;
addedVerticeCount++;
@@ -946,8 +928,8 @@ public final class OutlineShape implements Comparable<OutlineShape> {
outlines.remove(outline);
cc--;
count--;
- } else if( 0 < vertexCount &&
- VectorUtil.isVec3Equal( outline.getVertex(0).getCoord(), 0, outline.getLastVertex().getCoord(), 0, FloatUtil.EPSILON )) {
+ } else if( 0 < vertexCount &&
+ outline.getVertex(0).getCoord().isEqual( outline.getLastVertex().getCoord() ) ) {
outline.removeVertex(vertexCount-1);
}
}
@@ -1047,10 +1029,10 @@ public final class OutlineShape implements Comparable<OutlineShape> {
* </p>
*/
public final OutlineShape transform(final AffineTransform t) {
- final OutlineShape newOutlineShape = new OutlineShape(vertexFactory);
+ final OutlineShape newOutlineShape = new OutlineShape();
final int osize = outlines.size();
for(int i=0; i<osize; i++) {
- newOutlineShape.addOutline( outlines.get(i).transform(t, vertexFactory) );
+ newOutlineShape.addOutline( outlines.get(i).transform(t) );
}
return newOutlineShape;
}
diff --git a/src/jogl/classes/com/jogamp/graph/curve/Region.java b/src/jogl/classes/com/jogamp/graph/curve/Region.java
index b3cee629c..799b8b7bd 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/Region.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/Region.java
@@ -47,6 +47,8 @@ import com.jogamp.common.util.PerfCounterCtrl;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.opengl.GLCapabilitiesImmutable;
import com.jogamp.opengl.GLProfile;
+import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.math.geom.Frustum;
import com.jogamp.opengl.util.texture.TextureSequence;
@@ -256,9 +258,9 @@ public abstract class Region {
*/
public abstract void setBufferCapacity(int verticesCount, int indicesCount);
- protected abstract void pushVertex(final float[] coords, final float[] texParams, float[] rgba);
- protected abstract void pushVertices(final float[] coords1, final float[] coords2, final float[] coords3,
- final float[] texParams1, final float[] texParams2, final float[] texParams3, float[] rgba);
+ protected abstract void pushVertex(final Vec3f coords, final Vec3f texParams, Vec4f rgba);
+ protected abstract void pushVertices(final Vec3f coords1, final Vec3f coords2, final Vec3f coords3,
+ final Vec3f texParams1, final Vec3f texParams2, final Vec3f texParams3, Vec4f rgba);
protected abstract void pushIndex(int idx);
protected abstract void pushIndices(int idx1, int idx2, int idx3);
@@ -336,12 +338,9 @@ public abstract class Region {
this.frustum = frustum;
}
- private void pushNewVertexImpl(final Vertex vertIn, final AffineTransform transform, final float[] rgba) {
+ private void pushNewVertexImpl(final Vertex vertIn, final AffineTransform transform, final Vec4f rgba) {
if( null != transform ) {
- final float[] coordsEx1 = new float[3];
- final float[] coordsIn = vertIn.getCoord();
- transform.transform(coordsIn, coordsEx1);
- coordsEx1[2] = coordsIn[2];
+ final Vec3f coordsEx1 = transform.transform(vertIn.getCoord(), new Vec3f());
box.resize(coordsEx1);
pushVertex(coordsEx1, vertIn.getTexCoord(), rgba);
} else {
@@ -351,20 +350,11 @@ public abstract class Region {
numVertices++;
}
- private void pushNewVerticesImpl(final Vertex vertIn1, final Vertex vertIn2, final Vertex vertIn3, final AffineTransform transform, final float[] rgba) {
+ private void pushNewVerticesImpl(final Vertex vertIn1, final Vertex vertIn2, final Vertex vertIn3, final AffineTransform transform, final Vec4f rgba) {
if( null != transform ) {
- final float[] coordsEx1 = new float[3];
- final float[] coordsEx2 = new float[3];
- final float[] coordsEx3 = new float[3];
- final float[] coordsIn1 = vertIn1.getCoord();
- final float[] coordsIn2 = vertIn2.getCoord();
- final float[] coordsIn3 = vertIn3.getCoord();
- transform.transform(coordsIn1, coordsEx1);
- transform.transform(coordsIn2, coordsEx2);
- transform.transform(coordsIn3, coordsEx3);
- coordsEx1[2] = coordsIn1[2];
- coordsEx2[2] = coordsIn2[2];
- coordsEx3[2] = coordsIn3[2];
+ final Vec3f coordsEx1 = transform.transform(vertIn1.getCoord(), new Vec3f());
+ final Vec3f coordsEx2 = transform.transform(vertIn2.getCoord(), new Vec3f());
+ final Vec3f coordsEx3 = transform.transform(vertIn3.getCoord(), new Vec3f());
box.resize(coordsEx1);
box.resize(coordsEx2);
box.resize(coordsEx3);
@@ -381,11 +371,11 @@ public abstract class Region {
}
@SuppressWarnings("unused")
- private void pushNewVertexIdxImpl(final Vertex vertIn, final AffineTransform transform, final float[] rgba) {
+ private void pushNewVertexIdxImpl(final Vertex vertIn, final AffineTransform transform, final Vec4f rgba) {
pushIndex(numVertices);
pushNewVertexImpl(vertIn, transform, rgba);
}
- private void pushNewVerticesIdxImpl(final Vertex vertIn1, final Vertex vertIn2, final Vertex vertIn3, final AffineTransform transform, final float[] rgba) {
+ private void pushNewVerticesIdxImpl(final Vertex vertIn1, final Vertex vertIn2, final Vertex vertIn3, final AffineTransform transform, final Vec4f rgba) {
pushIndices(numVertices, numVertices+1, numVertices+2);
pushNewVerticesImpl(vertIn1, vertIn2, vertIn3, transform, rgba);
}
@@ -396,12 +386,15 @@ public abstract class Region {
protected static void put3s(final ShortBuffer b, final short v1, final short v2, final short v3) {
b.put(v1); b.put(v2); b.put(v3);
}
- protected static void put3f(final FloatBuffer b, final float v1, final float v2, final float v3) {
- b.put(v1); b.put(v2); b.put(v3);
+ protected static void put3f(final FloatBuffer b, final Vec3f v) {
+ b.put(v.x()); b.put(v.y()); b.put(v.z());
}
protected static void put4f(final FloatBuffer b, final float v1, final float v2, final float v3, final float v4) {
b.put(v1); b.put(v2); b.put(v3); b.put(v4);
}
+ protected static void put4f(final FloatBuffer b, final Vec4f v) {
+ b.put(v.x()); b.put(v.y()); b.put(v.z()); b.put(v.w());
+ }
private final AABBox tmpBox = new AABBox();
@@ -529,7 +522,7 @@ public abstract class Region {
* @param t the optional {@link AffineTransform} to be applied on each vertex
* @param rgbaColor if {@link #hasColorChannel()} RGBA color must be passed, otherwise value is ignored.
*/
- public final void addOutlineShape(final OutlineShape shape, final AffineTransform t, final float[] rgbaColor) {
+ public final void addOutlineShape(final OutlineShape shape, final AffineTransform t, final Vec4f rgbaColor) {
if( null != frustum ) {
final AABBox shapeBox = shape.getBounds();
final AABBox shapeBoxT;
@@ -550,7 +543,7 @@ public abstract class Region {
}
markShapeDirty();
}
- private final void addOutlineShape0(final OutlineShape shape, final AffineTransform t, final float[] rgbaColor) {
+ private final void addOutlineShape0(final OutlineShape shape, final AffineTransform t, final Vec4f rgbaColor) {
final List<Triangle> trisIn = shape.getTriangles(OutlineShape.VerticesState.QUADRATIC_NURBS);
final ArrayList<Vertex> vertsIn = shape.getVertices();
{
@@ -587,7 +580,7 @@ public abstract class Region {
}
}
}
- private final void addOutlineShape1(final OutlineShape shape, final AffineTransform t, final float[] rgbaColor) {
+ private final void addOutlineShape1(final OutlineShape shape, final AffineTransform t, final Vec4f rgbaColor) {
++perf.count;
final long t0 = Clock.currentNanos();
final List<Triangle> trisIn = shape.getTriangles(OutlineShape.VerticesState.QUADRATIC_NURBS);
@@ -682,7 +675,7 @@ public abstract class Region {
* @param t the optional {@link AffineTransform} to be applied on each vertex
* @param rgbaColor if {@link #hasColorChannel()} RGBA color must be passed, otherwise value is ignored.
*/
- public final void addOutlineShapes(final List<OutlineShape> shapes, final AffineTransform transform, final float[] rgbaColor) {
+ public final void addOutlineShapes(final List<OutlineShape> shapes, final AffineTransform transform, final Vec4f rgbaColor) {
for (int i = 0; i < shapes.size(); i++) {
addOutlineShape(shapes.get(i), transform, rgbaColor);
}
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
index 2f518d1cc..89a48e0c8 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/RenderState.java
@@ -33,6 +33,7 @@ import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLException;
import com.jogamp.opengl.GLUniformData;
+import com.jogamp.opengl.math.Vec4f;
import jogamp.common.os.PlatformPropsImpl;
import jogamp.graph.curve.opengl.shader.UniformNames;
@@ -241,13 +242,14 @@ public class RenderState {
weight[0] = v;
}
-
- public final float[] getColorStatic(final float[] rgbaColor) {
- System.arraycopy(colorStatic, 0, rgbaColor, 0, 4);
- return rgbaColor;
+ public final Vec4f getColorStatic(final Vec4f rgbaColor) {
+ return rgbaColor.set(colorStatic);
}
- public final void setColorStatic(final float[] rgbaColor){
- System.arraycopy(rgbaColor, 0, colorStatic, 0, 4);
+ public final void setColorStatic(final Vec4f rgbaColor){
+ colorStatic[0] = rgbaColor.x();
+ colorStatic[1] = rgbaColor.y();
+ colorStatic[2] = rgbaColor.z();
+ colorStatic[3] = rgbaColor.w();
}
public final void setColorStatic(final float r, final float g, final float b, final float a){
colorStatic[0] = r;
diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java
index 237d93184..6beb11be1 100644
--- a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java
+++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java
@@ -33,6 +33,7 @@ import java.util.Iterator;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLException;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.graph.curve.OutlineShape;
import com.jogamp.graph.curve.Region;
@@ -82,7 +83,7 @@ public class TextRegionUtil {
* @return the bounding box of the given string by taking each glyph's font em-sized [0..1] OutlineShape into account.
*/
public static AABBox addStringToRegion(final Region region, final Font font, final AffineTransform transform,
- final CharSequence str, final float[] rgbaColor) {
+ final CharSequence str, final Vec4f rgbaColor) {
return addStringToRegion(region, font, transform, str, rgbaColor, new AffineTransform(), new AffineTransform());
}
@@ -105,7 +106,7 @@ public class TextRegionUtil {
* @return the bounding box of the given string by taking each glyph's font em-sized [0..1] OutlineShape into account.
*/
public static AABBox addStringToRegion(final Region region, final Font font, final AffineTransform transform,
- final CharSequence str, final float[] rgbaColor,
+ final CharSequence str, final Vec4f rgbaColor,
final AffineTransform temp1, final AffineTransform temp2) {
final Font.GlyphVisitor visitor = new Font.GlyphVisitor() {
@Override
@@ -113,7 +114,7 @@ public class TextRegionUtil {
if( glyph.isWhiteSpace() ) {
return;
}
- region.addOutlineShape(glyph.getShape(), t, region.hasColorChannel() ? rgbaColor : null);
+ region.addOutlineShape(glyph.getShape(), t, rgbaColor);
}
};
return font.processString(visitor, transform, str, temp1, temp2);
@@ -167,7 +168,7 @@ public class TextRegionUtil {
*/
public AABBox drawString3D(final GL2ES2 gl,
final RegionRenderer renderer, final Font font, final CharSequence str,
- final float[] rgbaColor, final int[/*1*/] sampleCount) {
+ final Vec4f rgbaColor, final int[/*1*/] sampleCount) {
if( !renderer.isInitialized() ) {
throw new GLException("TextRendererImpl01: not initialized!");
}
@@ -193,7 +194,7 @@ public class TextRegionUtil {
*/
public static AABBox drawString3D(final GL2ES2 gl, final int renderModes,
final RegionRenderer renderer, final Font font, final CharSequence str,
- final float[] rgbaColor, final int[/*1*/] sampleCount) {
+ final Vec4f rgbaColor, final int[/*1*/] sampleCount) {
return drawString3D(gl, renderModes, renderer, font, str, rgbaColor, sampleCount, new AffineTransform(), new AffineTransform());
}
@@ -228,7 +229,7 @@ public class TextRegionUtil {
*/
public static AABBox drawString3D(final GL2ES2 gl, final int renderModes,
final RegionRenderer renderer, final Font font, final CharSequence str,
- final float[] rgbaColor, final int[/*1*/] sampleCount, final AffineTransform tmp1, final AffineTransform tmp2) {
+ final Vec4f rgbaColor, final int[/*1*/] sampleCount, final AffineTransform tmp1, final AffineTransform tmp2) {
if(!renderer.isInitialized()){
throw new GLException("TextRendererImpl01: not initialized!");
}
@@ -246,7 +247,7 @@ public class TextRegionUtil {
* </p>
*/
public static AABBox drawString3D(final GL2ES2 gl, final GLRegion region, final RegionRenderer renderer,
- final Font font, final CharSequence str, final float[] rgbaColor, final int[/*1*/] sampleCount) {
+ final Font font, final CharSequence str, final Vec4f rgbaColor, final int[/*1*/] sampleCount) {
return drawString3D(gl, region, renderer, font, str, rgbaColor, sampleCount, new AffineTransform(), new AffineTransform());
}
@@ -278,7 +279,7 @@ public class TextRegionUtil {
* @throws Exception if TextRenderer not initialized
*/
public static AABBox drawString3D(final GL2ES2 gl, final GLRegion region, final RegionRenderer renderer,
- final Font font, final CharSequence str, final float[] rgbaColor,
+ final Font font, final CharSequence str, final Vec4f rgbaColor,
final int[/*1*/] sampleCount, final AffineTransform tmp1, final AffineTransform tmp2) {
if(!renderer.isInitialized()){
throw new GLException("TextRendererImpl01: not initialized!");
diff --git a/src/jogl/classes/com/jogamp/graph/geom/Outline.java b/src/jogl/classes/com/jogamp/graph/geom/Outline.java
index bd25aeccc..a0999baa1 100644
--- a/src/jogl/classes/com/jogamp/graph/geom/Outline.java
+++ b/src/jogl/classes/com/jogamp/graph/geom/Outline.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2010 JogAmp Community. All rights reserved.
+ * Copyright 2010-2023 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
@@ -268,7 +268,7 @@ public class Outline implements Comparable<Outline> {
if( !isEmpty() ) {
final Vertex first = vertices.get(0);
final Vertex last = getLastVertex();
- if( !VectorUtil.isVec3Equal( first.getCoord(), 0, last.getCoord(), 0, FloatUtil.EPSILON ) ) {
+ if( !first.getCoord().isEqual( last.getCoord() ) ) {
if( closeTail ) {
vertices.add(first.clone());
} else {
@@ -283,12 +283,12 @@ public class Outline implements Comparable<Outline> {
/**
* Return a transformed instance with all vertices are copied and transformed.
*/
- public final Outline transform(final AffineTransform t, final Vertex.Factory<? extends Vertex> vertexFactory) {
+ public final Outline transform(final AffineTransform t) {
final Outline newOutline = new Outline();
final int vsize = vertices.size();
for(int i=0; i<vsize; i++) {
final Vertex v = vertices.get(i);
- newOutline.addVertex(t.transform(v, vertexFactory.create()));
+ newOutline.addVertex(t.transform(v, new Vertex()));
}
newOutline.closed = this.closed;
return newOutline;
diff --git a/src/jogl/classes/com/jogamp/graph/geom/SVertex.java b/src/jogl/classes/com/jogamp/graph/geom/SVertex.java
deleted file mode 100644
index dc6982025..000000000
--- a/src/jogl/classes/com/jogamp/graph/geom/SVertex.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * Copyright 2010 JogAmp Community. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of JogAmp Community.
- */
-package com.jogamp.graph.geom;
-
-import com.jogamp.opengl.math.FloatUtil;
-import com.jogamp.opengl.math.VectorUtil;
-
-/** A Simple Vertex Implementation. Where the coordinates, and other attributes are
- * float based, and the coordinates and texture coordinates are saved in two float arrays.
- *
- */
-public class SVertex implements Vertex {
- private int id;
- protected boolean onCurve;
- protected final float[] coord = new float[3];
- private final float[] texCoord = new float[3];
-
- static final Factory factory = new Factory();
-
- public static Factory factory() { return factory; }
-
- public static class Factory implements Vertex.Factory<SVertex> {
- @Override
- public SVertex create() {
- return new SVertex();
- }
-
- public SVertex create(final Vertex src) {
- return new SVertex(src);
- }
-
- @Override
- public SVertex create(final int id, final boolean onCurve, final float[] texCoordsBuffer) {
- return new SVertex(id, onCurve, texCoordsBuffer);
- }
-
- @Override
- public SVertex create(final float x, final float y, final float z, final boolean onCurve) {
- return new SVertex(x, y, z, onCurve);
- }
-
- @Override
- public SVertex create(final float[] coordsBuffer, final int offset, final int length, final boolean onCurve) {
- return new SVertex(coordsBuffer, offset, length, onCurve);
- }
- }
-
- public SVertex() {
- this.id = Integer.MAX_VALUE;
- }
-
- public SVertex(final Vertex src) {
- this.id = Integer.MAX_VALUE;
- System.arraycopy(src.getCoord(), 0, coord, 0, 3);
- System.arraycopy(src.getTexCoord(), 0, texCoord, 0, 3);
- setOnCurve(src.isOnCurve());
- }
-
- public SVertex(final int id, final boolean onCurve, final float[] texCoordsBuffer) {
- this.id = id;
- this.onCurve = onCurve;
- System.arraycopy(texCoordsBuffer, 0, texCoord, 0, 3);
- }
-
- public SVertex(final float x, final float y, final float z, final boolean onCurve) {
- this.id = Integer.MAX_VALUE;
- setCoord(x, y, z);
- setOnCurve(onCurve);
- }
-
- public SVertex(final float[] coordsBuffer, final int offset, final int length, final boolean onCurve) {
- this.id = Integer.MAX_VALUE;
- setCoord(coordsBuffer, offset, length);
- setOnCurve(onCurve);
- }
-
- @Override
- public final void setCoord(final float x, final float y, final float z) {
- coord[0] = x;
- coord[1] = y;
- coord[2] = z;
- }
-
- @Override
- public final void setCoord(final float[] coordsBuffer, final int offset, final int length) {
- System.arraycopy(coordsBuffer, offset, coord, 0, length);
- }
-
- @Override
- public int getCoordCount() {
- return 3;
- }
-
- @Override
- public final float[] getCoord() {
- return coord;
- }
-
- @Override
- public final void setX(final float x) {
- this.coord[0] = x;
- }
-
- @Override
- public final void setY(final float y) {
- this.coord[1] = y;
- }
-
- @Override
- public final void setZ(final float z) {
- this.coord[2] = z;
- }
-
- @Override
- public final float getX() {
- return this.coord[0];
- }
-
- @Override
- public final float getY() {
- return this.coord[1];
- }
-
- @Override
- public final float getZ() {
- return this.coord[2];
- }
-
- @Override
- public final boolean isOnCurve() {
- return onCurve;
- }
-
- @Override
- public final void setOnCurve(final boolean onCurve) {
- this.onCurve = onCurve;
- }
-
- @Override
- public final int getId(){
- return id;
- }
-
- @Override
- public final void setId(final int id){
- this.id = id;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if( obj == this) {
- return true;
- }
- if( null == obj || !(obj instanceof Vertex) ) {
- return false;
- }
- final Vertex v = (Vertex) obj;
- return this == v ||
- isOnCurve() == v.isOnCurve() &&
- VectorUtil.isVec3Equal(getTexCoord(), 0, v.getTexCoord(), 0, FloatUtil.EPSILON) &&
- VectorUtil.isVec3Equal(getCoord(), 0, v.getCoord(), 0, FloatUtil.EPSILON) ;
- }
- @Override
- public final int hashCode() {
- throw new InternalError("hashCode not designed");
- }
-
- @Override
- public final float[] getTexCoord() {
- return texCoord;
- }
-
- @Override
- public final void setTexCoord(final float s, final float t, final float p) {
- texCoord[0] = s;
- texCoord[1] = t;
- texCoord[2] = p;
- }
-
- @Override
- public final void setTexCoord(final float[] texCoordsBuffer, final int offset, final int length) {
- System.arraycopy(texCoordsBuffer, offset, texCoord, 0, length);
- }
-
- /**
- * @return deep clone of this Vertex elements
- */
- @Override
- public SVertex clone(){
- return new SVertex(this); // OK to not call super.clone(), using own copy-ctor
- }
-
- @Override
- public String toString() {
- return "[ID: " + id + ", onCurve: " + onCurve +
- ": p " + coord[0] + ", " + coord[1] + ", " + coord[2] +
- ", t " + texCoord[0] + ", " + texCoord[1] + ", " + texCoord[2] + "]";
- }
-}
diff --git a/src/jogl/classes/com/jogamp/graph/geom/Triangle.java b/src/jogl/classes/com/jogamp/graph/geom/Triangle.java
index 1c63c4005..6b07501a6 100644
--- a/src/jogl/classes/com/jogamp/graph/geom/Triangle.java
+++ b/src/jogl/classes/com/jogamp/graph/geom/Triangle.java
@@ -64,11 +64,11 @@ public class Triangle {
/**
* Returns a transformed a clone of this instance using the given AffineTransform.
*/
- public Triangle transform(final AffineTransform t, final Vertex.Factory<? extends Vertex> vertexFactory) {
+ public Triangle transform(final AffineTransform t) {
final Triangle tri = new Triangle(id, boundaryEdges, boundaryVertices);
- tri.vertices[0] = t.transform(vertices[0], vertexFactory.create());
- tri.vertices[1] = t.transform(vertices[1], vertexFactory.create());
- tri.vertices[2] = t.transform(vertices[2], vertexFactory.create());
+ tri.vertices[0] = t.transform(vertices[0], new Vertex());
+ tri.vertices[1] = t.transform(vertices[1], new Vertex());
+ tri.vertices[2] = t.transform(vertices[2], new Vertex());
return tri;
}
@@ -83,9 +83,9 @@ public class Triangle {
* Returns true if all vertices are lines, i.e. zero tex-coord, otherwise false.
*/
public final boolean isLine() {
- return VectorUtil.isVec2Zero(vertices[0].getTexCoord(), 0) &&
- VectorUtil.isVec2Zero(vertices[1].getTexCoord(), 0) &&
- VectorUtil.isVec2Zero(vertices[2].getTexCoord(), 0) ;
+ return VectorUtil.isVec2Zero(vertices[0].getTexCoord()) &&
+ VectorUtil.isVec2Zero(vertices[1].getTexCoord()) &&
+ VectorUtil.isVec2Zero(vertices[2].getTexCoord()) ;
}
public int getId() {
diff --git a/src/jogl/classes/com/jogamp/graph/geom/Vertex.java b/src/jogl/classes/com/jogamp/graph/geom/Vertex.java
index e9c8dd193..e5fe76c28 100644
--- a/src/jogl/classes/com/jogamp/graph/geom/Vertex.java
+++ b/src/jogl/classes/com/jogamp/graph/geom/Vertex.java
@@ -1,5 +1,5 @@
/**
- * Copyright 2011 JogAmp Community. All rights reserved.
+ * Copyright 2011-2023 JogAmp Community. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
@@ -27,64 +27,185 @@
*/
package com.jogamp.graph.geom;
+import com.jogamp.opengl.math.Vec2f;
+import com.jogamp.opengl.math.Vec3f;
import com.jogamp.opengl.math.Vert3fImmutable;
/**
- * A Vertex with custom memory layout using custom factory.
+ * A Vertex exposing Vec3f vertex- and texture-coordinates.
*/
-public interface Vertex extends Vert3fImmutable, Cloneable {
+public final class Vertex implements Vert3fImmutable, Cloneable {
+ private int id;
+ private boolean onCurve;
+ private final Vec3f coord = new Vec3f();
+ private final Vec3f texCoord = new Vec3f();
+
+ public Vertex() {
+ this.id = Integer.MAX_VALUE;
+ }
- public static interface Factory <T extends Vertex> {
- T create();
+ public Vertex(final Vertex src) {
+ this.id = Integer.MAX_VALUE;
+ coord.set(src.getCoord());
+ texCoord.set(src.getTexCoord());
+ setOnCurve(src.isOnCurve());
+ }
- T create(Vertex src);
+ public Vertex(final int id, final boolean onCurve, final Vec3f texCoord) {
+ this.id = id;
+ this.onCurve = onCurve;
+ this.texCoord.set(texCoord);
+ }
- T create(int id, boolean onCurve, float[] texCoordsBuffer);
+ public Vertex(final int id, final boolean onCurve, final float texCoordX, final float texCoordY, final float texCoordZ) {
+ this.id = id;
+ this.onCurve = onCurve;
+ this.texCoord.set(texCoordX, texCoordY, texCoordZ);
+ }
- T create(float x, float y, float z, boolean onCurve);
+ public Vertex(final Vec3f coord, final boolean onCurve) {
+ this.id = Integer.MAX_VALUE;
+ this.coord.set(coord);
+ setOnCurve(onCurve);
+ }
- T create(float[] coordsBuffer, int offset, int length, boolean onCurve);
+ public Vertex(final Vec2f coord, final boolean onCurve) {
+ this.id = Integer.MAX_VALUE;
+ this.coord.set(coord, 0f);
+ setOnCurve(onCurve);
}
- void setCoord(float x, float y, float z);
+ public Vertex(final float x, final float y, final boolean onCurve) {
+ this(x, y, 0, onCurve);
+ }
- /**
- * @see System#arraycopy(Object, int, Object, int, int) for thrown IndexOutOfBoundsException
- */
- void setCoord(float[] coordsBuffer, int offset, int length);
+ public Vertex(final float[] coordsBuffer, final int offset, final int length, final boolean onCurve) {
+ this(coordsBuffer[offset+0], coordsBuffer[offset+1], 2 < length ? coordsBuffer[offset+2] : 0f, onCurve);
+ }
- void setX(float x);
+ public Vertex(final float x, final float y, final float z, final boolean onCurve) {
+ this.id = Integer.MAX_VALUE;
+ coord.set(x, y, z);
+ setOnCurve(onCurve);
+ }
- void setY(float y);
+ public final void setCoord(final Vec3f coord) {
+ this.coord.set(coord);
+ }
- void setZ(float z);
+ public void setCoord(final Vec2f coord) {
+ this.coord.set(coord, 0f);
+ }
+
+ public final void setCoord(final float x, final float y, final float z) {
+ coord.set(x, y, z);
+ }
- boolean isOnCurve();
+ public final void setCoord(final float x, final float y) {
+ coord.set(x, y, 0f);
+ }
- void setOnCurve(boolean onCurve);
+ @Override
+ public int getCoordCount() {
+ return 3;
+ }
- int getId();
+ @Override
+ public final Vec3f getCoord() {
+ return coord;
+ }
- void setId(int id);
+ public final void setX(final float x) {
+ coord.setX(x);
+ }
- float[] getTexCoord();
+ public final void setY(final float y) {
+ coord.setY(y);
+ }
- void setTexCoord(float s, float t, float p);
+ public final void setZ(final float z) {
+ coord.setZ(z);
+ }
- /**
- * @see System#arraycopy(Object, int, Object, int, int) for thrown IndexOutOfBoundsException
- */
- void setTexCoord(float[] texCoordsBuffer, int offset, int length);
+ @Override
+ public final float x() {
+ return coord.x();
+ }
+
+ @Override
+ public final float y() {
+ return coord.y();
+ }
+
+ @Override
+ public final float z() {
+ return coord.z();
+ }
+
+ public final boolean isOnCurve() {
+ return onCurve;
+ }
+
+ public final void setOnCurve(final boolean onCurve) {
+ this.onCurve = onCurve;
+ }
+
+ public final int getId(){
+ return id;
+ }
+
+ public final void setId(final int id){
+ this.id = id;
+ }
/**
* @param obj the Object to compare this Vertex with
* @return true if {@code obj} is a Vertex and not null, on-curve flag is equal and has same vertex- and tex-coords.
*/
@Override
- boolean equals(Object obj);
+ public boolean equals(final Object obj) {
+ if( obj == this) {
+ return true;
+ }
+ if( null == obj || !(obj instanceof Vertex) ) {
+ return false;
+ }
+ final Vertex v = (Vertex) obj;
+ return this == v ||
+ isOnCurve() == v.isOnCurve() &&
+ getTexCoord().isEqual( v.getTexCoord() ) &&
+ getCoord().isEqual( v.getCoord() );
+ }
+
+ @Override
+ public final int hashCode() {
+ throw new InternalError("hashCode not designed");
+ }
+
+ public final Vec3f getTexCoord() {
+ return texCoord;
+ }
+
+ public final void setTexCoord(final Vec3f v) {
+ texCoord.set(v);
+ }
+
+ public final void setTexCoord(final float s, final float t, final float p) {
+ texCoord.set(s, t, p);
+ }
/**
- * @return deep clone of this Vertex
+ * @return deep clone of this Vertex elements
*/
- Vertex clone();
+ @Override
+ public Vertex clone(){
+ return new Vertex(this); // OK to not call super.clone(), using own copy-ctor
+ }
+
+ @Override
+ public String toString() {
+ return "[ID: " + id + ", onCurve: " + onCurve +
+ ": p " + coord +
+ ", t " + texCoord + "]";
+ }
}
diff --git a/src/jogl/classes/com/jogamp/graph/geom/plane/AffineTransform.java b/src/jogl/classes/com/jogamp/graph/geom/plane/AffineTransform.java
index 74036f97d..434746240 100644
--- a/src/jogl/classes/com/jogamp/graph/geom/plane/AffineTransform.java
+++ b/src/jogl/classes/com/jogamp/graph/geom/plane/AffineTransform.java
@@ -420,9 +420,9 @@ public class AffineTransform implements Cloneable {
* @return dst for chaining
*/
public final Vertex transform(final Vertex src, final Vertex dst) {
- final float x = src.getX();
- final float y = src.getY();
- dst.setCoord(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12, src.getZ());
+ final float x = src.x();
+ final float y = src.y();
+ dst.setCoord(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12, src.z());
return dst;
}
@@ -433,9 +433,9 @@ public class AffineTransform implements Cloneable {
if (dstPoint == null) {
throw new IllegalArgumentException("dst["+dstOff+"] is null");
}
- final float x = srcPoint.getX();
- final float y = srcPoint.getY();
- dstPoint.setCoord(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12, srcPoint.getZ());
+ final float x = srcPoint.x();
+ final float y = srcPoint.y();
+ dstPoint.setCoord(x * m00 + y * m01 + m02, x * m10 + y * m11 + m12, srcPoint.z());
dst[dstOff++] = dstPoint;
}
}
@@ -511,9 +511,9 @@ public class AffineTransform implements Cloneable {
* @return return dst for chaining
*/
public final Vertex deltaTransform(final Vertex src, final Vertex dst) {
- final float x = src.getX();
- final float y = src.getY();
- dst.setCoord(x * m00 + y * m01, x * m10 + y * m11, src.getZ());
+ final float x = src.x();
+ final float y = src.y();
+ dst.setCoord(x * m00 + y * m01, x * m10 + y * m11, src.z());
return dst;
}
@@ -538,9 +538,9 @@ public class AffineTransform implements Cloneable {
if (FloatUtil.abs(det) < ZERO) {
throw new NoninvertibleTransformException(determinantIsZero);
}
- final float x = src.getX() - m02;
- final float y = src.getY() - m12;
- dst.setCoord((x * m11 - y * m01) / det, (y * m00 - x * m10) / det, src.getZ());
+ final float x = src.x() - m02;
+ final float y = src.y() - m12;
+ dst.setCoord((x * m11 - y * m01) / det, (y * m00 - x * m10) / det, src.z());
return dst;
}
diff --git a/src/jogl/classes/com/jogamp/opengl/math/Vec2f.java b/src/jogl/classes/com/jogamp/opengl/math/Vec2f.java
index 616ba0f60..20628d949 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/Vec2f.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/Vec2f.java
@@ -126,6 +126,13 @@ public final class Vec2f {
return new Vec2f(this).scale(val);
}
+ /** this = a * b, returns this. */
+ public Vec2f mul(final Vec2f a, final Vec2f b) {
+ x = a.x * b.x;
+ y = a.y * b.y;
+ return this;
+ }
+
/** this = this * s, returns this. */
public Vec2f scale(final float s) {
x *= s;
@@ -145,6 +152,13 @@ public final class Vec2f {
return new Vec2f(this).add(arg);
}
+ /** this = a + b, returns this. */
+ public Vec2f plus(final Vec2f a, final Vec2f b) {
+ x = a.x + b.x;
+ y = a.y + b.y;
+ return this;
+ }
+
/** this = this + { dx, dy }, returns this. */
public Vec2f add(final float dx, final float dy) {
x += dx;
@@ -159,23 +173,18 @@ public final class Vec2f {
return this;
}
- /** Returns this + s * arg; creates new vector */
- public Vec2f plusScaled(final float s, final Vec2f arg) {
- return new Vec2f(this).addScaled(s, arg);
- }
-
- /** this = this + s * b, returns this. */
- public Vec2f addScaled(final float s, final Vec2f b) {
- x += s * b.x;
- y += s * b.y;
- return this;
- }
-
/** Returns this - arg; creates new vector */
public Vec2f minus(final Vec2f arg) {
return new Vec2f(this).sub(arg);
}
+ /** this = a - b, returns this. */
+ public Vec2f minus(final Vec2f a, final Vec2f b) {
+ x = a.x - b.x;
+ y = a.y - b.y;
+ return this;
+ }
+
/** this = this - b, returns this. */
public Vec2f sub(final Vec2f b) {
x -= b.x;
diff --git a/src/jogl/classes/com/jogamp/opengl/math/Vec3f.java b/src/jogl/classes/com/jogamp/opengl/math/Vec3f.java
index 9ef985b36..fbcd1e9a5 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/Vec3f.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/Vec3f.java
@@ -35,11 +35,11 @@ package com.jogamp.opengl.math;
* and its data layout from JOAL's Vec3f.
*/
public final class Vec3f {
- public static final Vec3f ONE = new Vec3f(VectorUtil.VEC3_ONE);
- public static final Vec3f UNIT_Y = new Vec3f(VectorUtil.VEC3_UNIT_Y);
- public static final Vec3f UNIT_Y_NEG = new Vec3f(VectorUtil.VEC3_UNIT_Y_NEG);
- public static final Vec3f UNIT_Z = new Vec3f(VectorUtil.VEC3_UNIT_Z);
- public static final Vec3f UNIT_Z_NEG = new Vec3f(VectorUtil.VEC3_UNIT_Z_NEG);
+ public static final Vec3f ONE = new Vec3f(1f, 1f, 1f);
+ public static final Vec3f UNIT_Y = new Vec3f(0f, 1f, 0f);
+ public static final Vec3f UNIT_Y_NEG = new Vec3f(0f, -1f, 0f);
+ public static final Vec3f UNIT_Z = new Vec3f(0f, 0f, 1f);
+ public static final Vec3f UNIT_Z_NEG = new Vec3f(0f, 0f, -1f);
private float x;
private float y;
@@ -154,6 +154,14 @@ public final class Vec3f {
return new Vec3f(this).scale(val);
}
+ /** this = a * b, returns this. */
+ public Vec3f mul(final Vec3f a, final Vec3f b) {
+ x = a.x * b.x;
+ y = a.y * b.y;
+ z = a.z * b.z;
+ return this;
+ }
+
/** this = this * s, returns this. */
public Vec3f scale(final float s) {
x *= s;
@@ -175,6 +183,14 @@ public final class Vec3f {
return new Vec3f(this).add(arg);
}
+ /** this = a + b, returns this. */
+ public Vec3f plus(final Vec3f a, final Vec3f b) {
+ x = a.x + b.x;
+ y = a.y + b.y;
+ z = a.z + b.z;
+ return this;
+ }
+
/** this = this + { dx, dy, dz }, returns this. */
public Vec3f add(final float dx, final float dy, final float dz) {
x += dx;
@@ -191,24 +207,19 @@ public final class Vec3f {
return this;
}
- /** Returns this + s * arg; creates new vector */
- public Vec3f plusScaled(final float s, final Vec3f arg) {
- return new Vec3f(this).addScaled(s, arg);
- }
-
- /** this = this + s * b, returns this. */
- public Vec3f addScaled(final float s, final Vec3f b) {
- x += s * b.x;
- y += s * b.y;
- z += s * b.z;
- return this;
- }
-
/** Returns this - arg; creates new vector */
public Vec3f minus(final Vec3f arg) {
return new Vec3f(this).sub(arg);
}
+ /** this = a - b, returns this. */
+ public Vec3f minus(final Vec3f a, final Vec3f b) {
+ x = a.x - b.x;
+ y = a.y - b.y;
+ z = a.z - b.z;
+ return this;
+ }
+
/** this = this - b, returns this. */
public Vec3f sub(final Vec3f b) {
x -= b.x;
diff --git a/src/jogl/classes/com/jogamp/opengl/math/Vec4f.java b/src/jogl/classes/com/jogamp/opengl/math/Vec4f.java
index 570b7b2b3..254566ae0 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/Vec4f.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/Vec4f.java
@@ -145,6 +145,15 @@ public final class Vec4f {
return new Vec4f(this).scale(val);
}
+ /** this = a * b, returns this. */
+ public Vec4f mul(final Vec4f a, final Vec4f b) {
+ x = a.x * b.x;
+ y = a.y * b.y;
+ z = a.z * b.z;
+ w = a.w * b.w;
+ return this;
+ }
+
/** this = this * s, returns this. */
public Vec4f scale(final float s) {
x *= s;
@@ -168,6 +177,15 @@ public final class Vec4f {
return new Vec4f(this).add(arg);
}
+ /** this = a + b, returns this. */
+ public Vec4f plus(final Vec4f a, final Vec4f b) {
+ x = a.x + b.x;
+ y = a.y + b.y;
+ z = a.z + b.z;
+ w = a.w + b.w;
+ return this;
+ }
+
/** this = this + { dx, dy, dz, dw }, returns this. */
public Vec4f add(final float dx, final float dy, final float dz, final float dw) {
x += dx;
@@ -191,6 +209,15 @@ public final class Vec4f {
return new Vec4f(this).sub(arg);
}
+ /** this = a - b, returns this. */
+ public Vec4f minus(final Vec4f a, final Vec4f b) {
+ x = a.x - b.x;
+ y = a.y - b.y;
+ z = a.z - b.z;
+ w = a.w - b.w;
+ return this;
+ }
+
/** this = this - b, returns this. */
public Vec4f sub(final Vec4f b) {
x -= b.x;
diff --git a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
index 8edbd0cd7..2bf468435 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/VectorUtil.java
@@ -32,144 +32,11 @@ import java.util.ArrayList;
import com.jogamp.graph.geom.plane.Winding;
public final class VectorUtil {
-
- public static final float[] VEC3_ONE = { 1f, 1f, 1f };
- public static final float[] VEC3_UNIT_Y = { 0f, 1f, 0f };
- public static final float[] VEC3_UNIT_Y_NEG = { 0f, -1f, 0f };
- public static final float[] VEC3_UNIT_Z = { 0f, 0f, 1f };
- public static final float[] VEC3_UNIT_Z_NEG = { 0f, 0f, -1f };
-
- /**
- * Copies a vector of length 2
- * @param dst output vector
- * @param dstOffset offset of dst in array
- * @param src input vector
- * @param srcOffset offset of src in array
- * @return copied output vector for chaining
- */
- public static float[] copyVec2(final float[] dst, final int dstOffset, final float[] src, final int srcOffset)
- {
- System.arraycopy(src, srcOffset, dst, dstOffset, 2);
- return dst;
- }
-
- /**
- * Copies a vector of length 3
- * @param dst output vector
- * @param dstOffset offset of dst in array
- * @param src input vector
- * @param srcOffset offset of src in array
- * @return copied output vector for chaining
- */
- public static float[] copyVec3(final float[] dst, final int dstOffset, final float[] src, final int srcOffset)
- {
- System.arraycopy(src, srcOffset, dst, dstOffset, 3);
- return dst;
- }
-
- /**
- * Copies a vector of length 4
- * @param dst output vector
- * @param dstOffset offset of dst in array
- * @param src input vector
- * @param srcOffset offset of src in array
- * @return copied output vector for chaining
- */
- public static float[] copyVec4(final float[] dst, final int dstOffset, final float[] src, final int srcOffset)
- {
- System.arraycopy(src, srcOffset, dst, dstOffset, 4);
- return dst;
- }
-
/**
- * Return true if both vectors are equal w/o regarding an epsilon.
- * <p>
- * Implementation uses {@link FloatUtil#isEqual(float, float)}, see API doc for details.
- * </p>
+ * Return true if 2D vector components are zero, no {@link FloatUtil#EPSILON} is taken into consideration.
*/
- public static boolean isVec2Equal(final float[] vec1, final int vec1Offset, final float[] vec2, final int vec2Offset) {
- return FloatUtil.isEqual(vec1[0+vec1Offset], vec2[0+vec2Offset]) &&
- FloatUtil.isEqual(vec1[1+vec1Offset], vec2[1+vec2Offset]) ;
- }
-
- /**
- * Return true if both vectors are equal w/o regarding an epsilon.
- * <p>
- * Implementation uses {@link FloatUtil#isEqual(float, float)}, see API doc for details.
- * </p>
- */
- public static boolean isVec3Equal(final float[] vec1, final int vec1Offset, final float[] vec2, final int vec2Offset) {
- return FloatUtil.isEqual(vec1[0+vec1Offset], vec2[0+vec2Offset]) &&
- FloatUtil.isEqual(vec1[1+vec1Offset], vec2[1+vec2Offset]) &&
- FloatUtil.isEqual(vec1[2+vec1Offset], vec2[2+vec2Offset]) ;
- }
-
- /**
- * Return true if both vectors are equal, i.e. their absolute delta < <code>epsilon</code>.
- * <p>
- * Implementation uses {@link FloatUtil#isEqual(float, float, float)}, see API doc for details.
- * </p>
- */
- public static boolean isVec2Equal(final float[] vec1, final int vec1Offset, final float[] vec2, final int vec2Offset, final float epsilon) {
- return FloatUtil.isEqual(vec1[0+vec1Offset], vec2[0+vec2Offset], epsilon) &&
- FloatUtil.isEqual(vec1[1+vec1Offset], vec2[1+vec2Offset], epsilon) ;
- }
-
- /**
- * Return true if both vectors are equal, i.e. their absolute delta < <code>epsilon</code>.
- * <p>
- * Implementation uses {@link FloatUtil#isEqual(float, float, float)}, see API doc for details.
- * </p>
- */
- public static boolean isVec3Equal(final float[] vec1, final int vec1Offset, final float[] vec2, final int vec2Offset, final float epsilon) {
- return FloatUtil.isEqual(vec1[0+vec1Offset], vec2[0+vec2Offset], epsilon) &&
- FloatUtil.isEqual(vec1[1+vec1Offset], vec2[1+vec2Offset], epsilon) &&
- FloatUtil.isEqual(vec1[2+vec1Offset], vec2[2+vec2Offset], epsilon) ;
- }
-
- /**
- * Return true if vector is zero, no {@link FloatUtil#EPSILON} is taken into consideration.
- */
- public static boolean isVec2Zero(final float[] vec, final int vecOffset) {
- return 0f == vec[0+vecOffset] && 0f == vec[1+vecOffset];
- }
-
- /**
- * Return true if vector is zero, no {@link FloatUtil#EPSILON} is taken into consideration.
- */
- public static boolean isVec3Zero(final float[] vec, final int vecOffset) {
- return 0f == vec[0+vecOffset] && 0f == vec[1+vecOffset] && 0f == vec[2+vecOffset];
- }
-
- /**
- * Return true if vector is zero, i.e. it's absolute components < <code>epsilon</code>.
- * <p>
- * Implementation uses {@link FloatUtil#isZero(float, float)}, see API doc for details.
- * </p>
- */
- public static boolean isVec2Zero(final float[] vec, final int vecOffset, final float epsilon) {
- return isZero(vec[0+vecOffset], vec[1+vecOffset], epsilon);
- }
-
- /**
- * Return true if vector is zero, i.e. it's absolute components < <code>epsilon</code>.
- * <p>
- * Implementation uses {@link FloatUtil#isZero(float, float)}, see API doc for details.
- * </p>
- */
- public static boolean isVec3Zero(final float[] vec, final int vecOffset, final float epsilon) {
- return isZero(vec[0+vecOffset], vec[1+vecOffset], vec[2+vecOffset], epsilon);
- }
-
- /**
- * Return true if all two vector components are zero, i.e. it's their absolute value < <code>epsilon</code>.
- * <p>
- * Implementation uses {@link FloatUtil#isZero(float, float)}, see API doc for details.
- * </p>
- */
- public static boolean isZero(final float x, final float y, final float epsilon) {
- return FloatUtil.isZero(x, epsilon) &&
- FloatUtil.isZero(y, epsilon) ;
+ public static boolean isVec2Zero(final Vec3f vec) {
+ return 0f == vec.x() && 0f == vec.y();
}
/**
@@ -206,34 +73,6 @@ public final class VectorUtil {
}
/**
- * Return the dot product of two points
- * @param vec1 vector 1
- * @param vec2 vector 2
- * @return the dot product as float
- */
- public static float dotVec3(final float[] vec1, final float[] vec2) {
- return vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2];
- }
-
- /**
- * Return the cosines of the angle between to vectors
- * @param vec1 vector 1
- * @param vec2 vector 2
- */
- public static float cosAngleVec3(final float[] vec1, final float[] vec2) {
- return dotVec3(vec1, vec2) / ( normVec3(vec1) * normVec3(vec2) ) ;
- }
-
- /**
- * Return the angle between to vectors in radians
- * @param vec1 vector 1
- * @param vec2 vector 2
- */
- public static float angleVec3(final float[] vec1, final float[] vec2) {
- return FloatUtil.acos(cosAngleVec3(vec1, vec2));
- }
-
- /**
* Return the squared length of a vector, a.k.a the squared <i>norm</i> or squared <i>magnitude</i>
*/
public static float normSquareVec2(final float[] vec) {
@@ -243,16 +82,6 @@ public final class VectorUtil {
/**
* Return the squared length of a vector, a.k.a the squared <i>norm</i> or squared <i>magnitude</i>
*/
- public static float normSquareVec2(final float[] vec, final int offset) {
- float v = vec[0+offset];
- final float r = v*v;
- v = vec[1+offset];
- return r + v*v;
- }
-
- /**
- * Return the squared length of a vector, a.k.a the squared <i>norm</i> or squared <i>magnitude</i>
- */
public static float normSquareVec3(final float[] vec) {
return vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2];
}
@@ -277,73 +106,6 @@ public final class VectorUtil {
}
/**
- * Return the length of a vector, a.k.a the <i>norm</i> or <i>magnitude</i>
- */
- public static float normVec3(final float[] vec) {
- return FloatUtil.sqrt(normSquareVec3(vec));
- }
-
- /**
- * Normalize a vector
- * @param result output vector, may be vector (in-place)
- * @param vector input vector
- * @return normalized output vector
- * @return result vector for chaining
- */
- public static float[] normalizeVec2(final float[] result, final float[] vector) {
- final float lengthSq = normSquareVec2(vector);
- if ( FloatUtil.isZero(lengthSq, FloatUtil.EPSILON) ) {
- result[0] = 0f;
- result[1] = 0f;
- } else {
- final float invSqr = 1f / FloatUtil.sqrt(lengthSq);
- result[0] = vector[0] * invSqr;
- result[1] = vector[1] * invSqr;
- }
- return result;
- }
-
- /**
- * Normalize a vector in place
- * @param vector input vector
- * @return normalized output vector
- */
- public static float[] normalizeVec2(final float[] vector) {
- final float lengthSq = normSquareVec2(vector);
- if ( FloatUtil.isZero(lengthSq, FloatUtil.EPSILON) ) {
- vector[0] = 0f;
- vector[1] = 0f;
- } else {
- final float invSqr = 1f / FloatUtil.sqrt(lengthSq);
- vector[0] *= invSqr;
- vector[1] *= invSqr;
- }
- return vector;
- }
-
- /**
- * Normalize a vector
- * @param result output vector, may be vector (in-place)
- * @param vector input vector
- * @return normalized output vector
- * @return result vector for chaining
- */
- public static float[] normalizeVec3(final float[] result, final float[] vector) {
- final float lengthSq = normSquareVec3(vector);
- if ( FloatUtil.isZero(lengthSq, FloatUtil.EPSILON) ) {
- result[0] = 0f;
- result[1] = 0f;
- result[2] = 0f;
- } else {
- final float invSqr = 1f / FloatUtil.sqrt(lengthSq);
- result[0] = vector[0] * invSqr;
- result[1] = vector[1] * invSqr;
- result[2] = vector[2] * invSqr;
- }
- return result;
- }
-
- /**
* Normalize a vector in place
* @param vector input vector
* @return normalized output vector
@@ -400,35 +162,6 @@ public final class VectorUtil {
* Scales a vector by param using given result float[], result = vector * scale
* @param result vector for the result, may be vector (in-place)
* @param vector input vector
- * @param scale single scale constant for all vector components
- * @return result vector for chaining
- */
- public static float[] scaleVec3(final float[] result, final float[] vector, final float scale) {
- result[0] = vector[0] * scale;
- result[1] = vector[1] * scale;
- result[2] = vector[2] * scale;
- return result;
- }
-
- /**
- * Scales a vector by param using given result float[], result = vector * scale
- * @param result vector for the result, may be vector (in-place)
- * @param vector input vector
- * @param scale 3 component scale constant for each vector component
- * @return result vector for chaining
- */
- public static float[] scaleVec3(final float[] result, final float[] vector, final float[] scale)
- {
- result[0] = vector[0] * scale[0];
- result[1] = vector[1] * scale[1];
- result[2] = vector[2] * scale[2];
- return result;
- }
-
- /**
- * Scales a vector by param using given result float[], result = vector * scale
- * @param result vector for the result, may be vector (in-place)
- * @param vector input vector
* @param scale 2 component scale constant for each vector component
* @return result vector for chaining
*/
@@ -456,35 +189,6 @@ public final class VectorUtil {
* Divides a vector by param using given result float[], result = vector / scale
* @param result vector for the result, may be vector (in-place)
* @param vector input vector
- * @param scale single scale constant for all vector components
- * @return result vector for chaining
- */
- public static float[] divVec3(final float[] result, final float[] vector, final float scale) {
- result[0] = vector[0] / scale;
- result[1] = vector[1] / scale;
- result[2] = vector[2] / scale;
- return result;
- }
-
- /**
- * Divides a vector by param using given result float[], result = vector / scale
- * @param result vector for the result, may be vector (in-place)
- * @param vector input vector
- * @param scale 3 component scale constant for each vector component
- * @return result vector for chaining
- */
- public static float[] divVec3(final float[] result, final float[] vector, final float[] scale)
- {
- result[0] = vector[0] / scale[0];
- result[1] = vector[1] / scale[1];
- result[2] = vector[2] / scale[2];
- return result;
- }
-
- /**
- * Divides a vector by param using given result float[], result = vector / scale
- * @param result vector for the result, may be vector (in-place)
- * @param vector input vector
* @param scale 2 component scale constant for each vector component
* @return result vector for chaining
*/
@@ -509,20 +213,6 @@ public final class VectorUtil {
}
/**
- * Adds two vectors, result = v1 + v2
- * @param result float[3] result vector, may be either v1 or v2 (in-place)
- * @param v1 vector 1
- * @param v2 vector 2
- * @return result vector for chaining
- */
- public static float[] addVec3(final float[] result, final float[] v1, final float[] v2) {
- result[0] = v1[0] + v2[0];
- result[1] = v1[1] + v2[1];
- result[2] = v1[2] + v2[2];
- return result;
- }
-
- /**
* Subtracts two vectors, result = v1 - v2
* @param result float[2] result vector, may be either v1 or v2 (in-place)
* @param v1 vector 1
@@ -536,34 +226,6 @@ public final class VectorUtil {
}
/**
- * Subtracts two vectors, result = v1 - v2
- * @param result float[3] result vector, may be either v1 or v2 (in-place)
- * @param v1 vector 1
- * @param v2 vector 2
- * @return result vector for chaining
- */
- public static float[] subVec3(final float[] result, final float[] v1, final float[] v2) {
- result[0] = v1[0] - v2[0];
- result[1] = v1[1] - v2[1];
- result[2] = v1[2] - v2[2];
- return result;
- }
-
- /**
- * cross product vec1 x vec2
- * @param v1 vector 1
- * @param v2 vector 2
- * @return the resulting vector
- */
- public static float[] crossVec3(final float[] result, final float[] v1, final float[] v2)
- {
- result[0] = v1[1] * v2[2] - v1[2] * v2[1];
- result[1] = v1[2] * v2[0] - v1[0] * v2[2];
- result[2] = v1[0] * v2[1] - v1[1] * v2[0];
- return result;
- }
-
- /**
* cross product vec1 x vec2
* @param v1 vector 1
* @param v2 vector 2
@@ -578,55 +240,15 @@ public final class VectorUtil {
}
/**
- * Multiplication of column-major 4x4 matrix with vector
- * @param colMatrix column matrix (4x4)
- * @param vec vector(x,y,z)
- * @return result
- */
- public static float[] mulColMat4Vec3(final float[] result, final float[] colMatrix, final float[] vec)
- {
- result[0] = vec[0]*colMatrix[0] + vec[1]*colMatrix[4] + vec[2]*colMatrix[8] + colMatrix[12];
- result[1] = vec[0]*colMatrix[1] + vec[1]*colMatrix[5] + vec[2]*colMatrix[9] + colMatrix[13];
- result[2] = vec[0]*colMatrix[2] + vec[1]*colMatrix[6] + vec[2]*colMatrix[10] + colMatrix[14];
-
- return result;
- }
-
- /**
- * Matrix Vector multiplication
- * @param rawMatrix column matrix (4x4)
- * @param vec vector(x,y,z)
- * @return result
- */
- public static float[] mulRowMat4Vec3(final float[] result, final float[] rawMatrix, final float[] vec)
- {
- result[0] = vec[0]*rawMatrix[0] + vec[1]*rawMatrix[1] + vec[2]*rawMatrix[2] + rawMatrix[3];
- result[1] = vec[0]*rawMatrix[4] + vec[1]*rawMatrix[5] + vec[2]*rawMatrix[6] + rawMatrix[7];
- result[2] = vec[0]*rawMatrix[8] + vec[1]*rawMatrix[9] + vec[2]*rawMatrix[10] + rawMatrix[11];
-
- return result;
- }
-
- /**
- * Calculate the midpoint of two values
- * @param p1 first value
- * @param p2 second vale
- * @return midpoint
- */
- public static float mid(final float p1, final float p2) {
- return (p1+p2)*0.5f;
- }
-
- /**
* Calculate the midpoint of two points
* @param p1 first point vector
* @param p2 second point vector
* @return midpoint
*/
- public static float[] midVec3(final float[] result, final float[] p1, final float[] p2) {
- result[0] = (p1[0] + p2[0])*0.5f;
- result[1] = (p1[1] + p2[1])*0.5f;
- result[2] = (p1[2] + p2[2])*0.5f;
+ public static Vec3f midVec3(final Vec3f result, final Vec3f p1, final Vec3f p2) {
+ result.set( (p1.x() + p2.x())*0.5f,
+ (p1.y() + p2.y())*0.5f,
+ (p1.z() + p2.z())*0.5f );
return result;
}
@@ -637,8 +259,8 @@ public final class VectorUtil {
* @param c vector 3
* @return the determinant value
*/
- public static float determinantVec3(final float[] a, final float[] b, final float[] c) {
- return a[0]*b[1]*c[2] + a[1]*b[2]*c[0] + a[2]*b[0]*c[1] - a[0]*b[2]*c[1] - a[1]*b[0]*c[2] - a[2]*b[1]*c[0];
+ public static float determinantVec3(final Vec3f a, final Vec3f b, final Vec3f c) {
+ return a.x()*b.y()*c.z() + a.y()*b.z()*c.x() + a.z()*b.x()*c.y() - a.x()*b.z()*c.y() - a.y()*b.x()*c.z() - a.z()*b.y()*c.x();
}
/**
@@ -648,7 +270,7 @@ public final class VectorUtil {
* @param v3 vertex 3
* @return true if collinear, false otherwise
*/
- public static boolean isCollinearVec3(final float[] v1, final float[] v2, final float[] v3) {
+ public static boolean isCollinearVec3(final Vec3f v1, final Vec3f v2, final Vec3f v3) {
return FloatUtil.isZero( determinantVec3(v1, v2, v3), FloatUtil.EPSILON );
}
@@ -662,14 +284,10 @@ public final class VectorUtil {
* vertices a, b, c. from paper by Guibas and Stolfi (1985).
*/
public static boolean isInCircleVec2(final Vert2fImmutable a, final Vert2fImmutable b, final Vert2fImmutable c, final Vert2fImmutable d) {
- final float[] A = a.getCoord();
- final float[] B = b.getCoord();
- final float[] C = c.getCoord();
- final float[] D = d.getCoord();
- return (A[0] * A[0] + A[1] * A[1]) * triAreaVec2(B, C, D) -
- (B[0] * B[0] + B[1] * B[1]) * triAreaVec2(A, C, D) +
- (C[0] * C[0] + C[1] * C[1]) * triAreaVec2(A, B, D) -
- (D[0] * D[0] + D[1] * D[1]) * triAreaVec2(A, B, C) > 0;
+ return (a.x() * a.x() + a.y() * a.y()) * triAreaVec2(b, c, d) -
+ (b.x() * b.x() + b.y() * b.y()) * triAreaVec2(a, c, d) +
+ (c.x() * c.x() + c.y() * c.y()) * triAreaVec2(a, b, d) -
+ (d.x() * d.x() + d.y() * d.y()) * triAreaVec2(a, b, c) > 0;
}
/**
@@ -681,47 +299,34 @@ public final class VectorUtil {
* is positive if the triangle is oriented counterclockwise.
*/
public static float triAreaVec2(final Vert2fImmutable a, final Vert2fImmutable b, final Vert2fImmutable c){
- final float[] A = a.getCoord();
- final float[] B = b.getCoord();
- final float[] C = c.getCoord();
- return (B[0] - A[0]) * (C[1] - A[1]) - (B[1] - A[1]) * (C[0] - A[0]);
- }
-
- /**
- * Computes oriented area of a triangle
- * @param A first vertex
- * @param B second vertex
- * @param C third vertex
- * @return compute twice the area of the oriented triangle (a,b,c), the area
- * is positive if the triangle is oriented counterclockwise.
- */
- public static float triAreaVec2(final float[] A, final float[] B, final float[] C){
- return (B[0] - A[0]) * (C[1] - A[1]) - (B[1] - A[1])*(C[0] - A[0]);
+ return (b.x() - a.x()) * (c.y() - a.y()) - (b.y() - a.y()) * (c.x() - a.x());
}
/**
- * Check if a vertex is in triangle using
- * barycentric coordinates computation.
+ * Check if a vertex is in triangle using barycentric coordinates computation.
* @param a first triangle vertex
* @param b second triangle vertex
* @param c third triangle vertex
* @param p the vertex in question
+ * @param ac temporary storage
+ * @param ab temporary storage
+ * @param ap temporary storage
* @return true if p is in triangle (a, b, c), false otherwise.
*/
- public static boolean isInTriangleVec3(final float[] a, final float[] b, final float[] c,
- final float[] p,
- final float[] ac, final float[] ab, final float[] ap){
+ public static boolean isInTriangleVec3(final Vec3f a, final Vec3f b, final Vec3f c,
+ final Vec3f p,
+ final Vec3f ac, final Vec3f ab, final Vec3f ap){
// Compute vectors
- subVec3(ac, c, a); //v0
- subVec3(ab, b, a); //v1
- subVec3(ap, p, a); //v2
+ ac.minus( c, a); // v0
+ ab.minus( b, a); // v1
+ ap.minus( p, a); // v2
// Compute dot products
- final float dotAC_AC = dotVec3(ac, ac);
- final float dotAC_AB = dotVec3(ac, ab);
- final float dotAB_AB = dotVec3(ab, ab);
- final float dotAC_AP = dotVec3(ac, ap);
- final float dotAB_AP = dotVec3(ab, ap);
+ final float dotAC_AC = ac.dot(ac);
+ final float dotAC_AB = ac.dot(ab);
+ final float dotAB_AB = ab.dot(ab);
+ final float dotAC_AP = ac.dot(ap);
+ final float dotAB_AP = ab.dot(ap);
// Compute barycentric coordinates
final float invDenom = 1 / (dotAC_AC * dotAB_AB - dotAC_AB * dotAC_AB);
@@ -733,37 +338,36 @@ public final class VectorUtil {
}
/**
- * Check if one of three vertices are in triangle using
- * barycentric coordinates computation.
+ * Check if one of three vertices are in triangle using barycentric coordinates computation.
* @param a first triangle vertex
* @param b second triangle vertex
* @param c third triangle vertex
* @param p1 the vertex in question
* @param p2 the vertex in question
* @param p3 the vertex in question
- * @param tmpAC
- * @param tmpAB
- * @param tmpAP
+ * @param ac temporary storage
+ * @param ab temporary storage
+ * @param ap temporary storage
* @return true if p1 or p2 or p3 is in triangle (a, b, c), false otherwise.
*/
- public static boolean isVec3InTriangle3(final float[] a, final float[] b, final float[] c,
- final float[] p1, final float[] p2, final float[] p3,
- final float[] tmpAC, final float[] tmpAB, final float[] tmpAP){
+ public static boolean isVec3InTriangle3(final Vec3f a, final Vec3f b, final Vec3f c,
+ final Vec3f p1, final Vec3f p2, final Vec3f p3,
+ final Vec3f ac, final Vec3f ab, final Vec3f ap){
// Compute vectors
- subVec3(tmpAC, c, a); //v0
- subVec3(tmpAB, b, a); //v1
+ ac.minus(c, a); // v0
+ ab.minus(b, a); // v1
// Compute dot products
- final float dotAC_AC = dotVec3(tmpAC, tmpAC);
- final float dotAC_AB = dotVec3(tmpAC, tmpAB);
- final float dotAB_AB = dotVec3(tmpAB, tmpAB);
+ final float dotAC_AC = ac.dot(ac);
+ final float dotAC_AB = ac.dot(ab);
+ final float dotAB_AB = ab.dot(ab);
// Compute barycentric coordinates
final float invDenom = 1 / (dotAC_AC * dotAB_AB - dotAC_AB * dotAC_AB);
{
- subVec3(tmpAP, p1, a); //v2
- final float dotAC_AP1 = dotVec3(tmpAC, tmpAP);
- final float dotAB_AP1 = dotVec3(tmpAB, tmpAP);
+ ap.minus(p1, a); // v2
+ final float dotAC_AP1 = ac.dot(ap);
+ final float dotAB_AP1 = ab.dot(ap);
final float u = (dotAB_AB * dotAC_AP1 - dotAC_AB * dotAB_AP1) * invDenom;
final float v = (dotAC_AC * dotAB_AP1 - dotAC_AB * dotAC_AP1) * invDenom;
@@ -773,10 +377,11 @@ public final class VectorUtil {
}
}
- {
- subVec3(tmpAP, p1, a); //v2
- final float dotAC_AP2 = dotVec3(tmpAC, tmpAP);
- final float dotAB_AP2 = dotVec3(tmpAB, tmpAP);
+ { // FIXME: p2?
+ ap.minus(p1, a); // v3
+ // ap.minus(p2, a); // v2
+ final float dotAC_AP2 = ac.dot(ap);
+ final float dotAB_AP2 = ab.dot(ap);
final float u = (dotAB_AB * dotAC_AP2 - dotAC_AB * dotAB_AP2) * invDenom;
final float v = (dotAC_AC * dotAB_AP2 - dotAC_AB * dotAC_AP2) * invDenom;
@@ -786,10 +391,11 @@ public final class VectorUtil {
}
}
- {
- subVec3(tmpAP, p2, a); //v2
- final float dotAC_AP3 = dotVec3(tmpAC, tmpAP);
- final float dotAB_AP3 = dotVec3(tmpAB, tmpAP);
+ { // FIXME: p3?
+ ap.minus(p2, a); // v4
+ // ap.minus(p3, a); // v3
+ final float dotAC_AP3 = ac.dot(ap);
+ final float dotAB_AP3 = ab.dot(ap);
final float u = (dotAB_AB * dotAC_AP3 - dotAC_AB * dotAB_AP3) * invDenom;
final float v = (dotAC_AC * dotAB_AP3 - dotAC_AB * dotAC_AP3) * invDenom;
@@ -814,25 +420,25 @@ public final class VectorUtil {
* @param tmpAP
* @return true if p1 or p2 or p3 is in triangle (a, b, c), false otherwise.
*/
- public static boolean isVec3InTriangle3(final float[] a, final float[] b, final float[] c,
- final float[] p1, final float[] p2, final float[] p3,
- final float[] tmpAC, final float[] tmpAB, final float[] tmpAP,
- final float epsilon){
+ public static boolean isVec3InTriangle3(final Vec3f a, final Vec3f b, final Vec3f c,
+ final Vec3f p1, final Vec3f p2, final Vec3f p3,
+ final Vec3f ac, final Vec3f ab, final Vec3f ap,
+ final float epsilon) {
// Compute vectors
- subVec3(tmpAC, c, a); //v0
- subVec3(tmpAB, b, a); //v1
+ ac.minus(c, a); // v0
+ ab.minus(b, a); // v1
// Compute dot products
- final float dotAC_AC = dotVec3(tmpAC, tmpAC);
- final float dotAC_AB = dotVec3(tmpAC, tmpAB);
- final float dotAB_AB = dotVec3(tmpAB, tmpAB);
+ final float dotAC_AC = ac.dot(ac);
+ final float dotAC_AB = ac.dot(ab);
+ final float dotAB_AB = ab.dot(ab);
// Compute barycentric coordinates
final float invDenom = 1 / (dotAC_AC * dotAB_AB - dotAC_AB * dotAC_AB);
{
- subVec3(tmpAP, p1, a); //v2
- final float dotAC_AP1 = dotVec3(tmpAC, tmpAP);
- final float dotAB_AP1 = dotVec3(tmpAB, tmpAP);
+ ap.minus(p1, a); // v2
+ final float dotAC_AP1 = ac.dot(ap);
+ final float dotAB_AP1 = ab.dot(ap);
final float u = (dotAB_AB * dotAC_AP1 - dotAC_AB * dotAB_AP1) * invDenom;
final float v = (dotAC_AC * dotAB_AP1 - dotAC_AB * dotAC_AP1) * invDenom;
@@ -844,10 +450,11 @@ public final class VectorUtil {
}
}
- {
- subVec3(tmpAP, p1, a); //v2
- final float dotAC_AP2 = dotVec3(tmpAC, tmpAP);
- final float dotAB_AP2 = dotVec3(tmpAB, tmpAP);
+ { // FIXME: p2?
+ ap.minus(p1, a); // v2
+ // ap.minus(p2, a); // v3
+ final float dotAC_AP2 = ac.dot(ap);
+ final float dotAB_AP2 = ab.dot(ap);
final float u = (dotAB_AB * dotAC_AP2 - dotAC_AB * dotAB_AP2) * invDenom;
final float v = (dotAC_AC * dotAB_AP2 - dotAC_AB * dotAC_AP2) * invDenom;
@@ -859,10 +466,11 @@ public final class VectorUtil {
}
}
- {
- subVec3(tmpAP, p2, a); //v2
- final float dotAC_AP3 = dotVec3(tmpAC, tmpAP);
- final float dotAB_AP3 = dotVec3(tmpAB, tmpAP);
+ { // FIXME: p3?
+ ap.minus(p2, a); // v2
+ // ap.minus(p3, a); // v4
+ final float dotAC_AP3 = ac.dot(ap);
+ final float dotAB_AP3 = ab.dot(ap);
final float u = (dotAB_AB * dotAC_AP3 - dotAC_AB * dotAB_AP3) * invDenom;
final float v = (dotAC_AC * dotAB_AP3 - dotAC_AB * dotAC_AP3) * invDenom;
@@ -873,7 +481,6 @@ public final class VectorUtil {
return true;
}
}
-
return false;
}
@@ -917,9 +524,9 @@ public final class VectorUtil {
final int n = vertices.size();
float area = 0.0f;
for (int p = n - 1, q = 0; q < n; p = q++) {
- final float[] pCoord = vertices.get(p).getCoord();
- final float[] qCoord = vertices.get(q).getCoord();
- area += pCoord[0] * qCoord[1] - qCoord[0] * pCoord[1];
+ final Vert2fImmutable pCoord = vertices.get(p);
+ final Vert2fImmutable qCoord = vertices.get(q);
+ area += pCoord.x() * qCoord.y() - qCoord.x() * pCoord.y();
}
return area;
}
@@ -939,36 +546,6 @@ public final class VectorUtil {
}
/**
- * @param result vec2 result for normal
- * @param v1 vec2
- * @param v2 vec2
- * @return result for chaining
- */
- public static float[] getNormalVec2(final float[] result, final float[] v1, final float[] v2 ) {
- subVec2(result, v2, v1);
- final float tmp = result [ 0 ] ; result [ 0 ] = -result [ 1 ] ; result [ 1 ] = tmp ;
- return normalizeVec2 ( result ) ;
- }
-
- /**
- * Returns the 3d surface normal of a triangle given three vertices.
- *
- * @param result vec3 result for normal
- * @param v1 vec3
- * @param v2 vec3
- * @param v3 vec3
- * @param tmp1Vec3 temp vec3
- * @param tmp2Vec3 temp vec3
- * @return result for chaining
- */
- public static float[] getNormalVec3(final float[] result, final float[] v1, final float[] v2, final float[] v3,
- final float[] tmp1Vec3, final float[] tmp2Vec3) {
- subVec3 ( tmp1Vec3, v2, v1 );
- subVec3 ( tmp2Vec3, v3, v1 ) ;
- return normalizeVec3 ( crossVec3(result, tmp1Vec3, tmp2Vec3) ) ;
- }
-
- /**
* Finds the plane equation of a plane given its normal and a point on the plane.
*
* @param resultV4 vec4 plane equation
@@ -976,15 +553,14 @@ public final class VectorUtil {
* @param pVec3
* @return result for chaining
*/
- public static float[] getPlaneVec3(final float[/*4*/] resultV4, final float[] normalVec3, final float[] pVec3) {
+ public static Vec4f getPlaneVec3(final Vec4f resultV4, final Vec3f normalVec3, final Vec3f pVec3) {
/**
Ax + By + Cz + D == 0 ;
D = - ( Ax + By + Cz )
= - ( A*a[0] + B*a[1] + C*a[2] )
= - vec3Dot ( normal, a ) ;
*/
- System.arraycopy(normalVec3, 0, resultV4, 0, 3);
- resultV4 [ 3 ] = -dotVec3(normalVec3, pVec3) ;
+ resultV4.set(normalVec3, -normalVec3.dot(pVec3));
return resultV4;
}
@@ -999,16 +575,16 @@ public final class VectorUtil {
* @param temp2V3
* @return result for chaining
*/
- public static float[] getPlaneVec3(final float[/*4*/] resultVec4, final float[] v1, final float[] v2, final float[] v3,
- final float[] temp1V3, final float[] temp2V3) {
+ public static Vec4f getPlaneVec3(final Vec4f resultVec4, final Vec3f v1, final Vec3f v2, final Vec3f v3,
+ final Vec3f temp1V3, final Vec3f temp2V3, final Vec3f temp3V3) {
/**
Ax + By + Cz + D == 0 ;
D = - ( Ax + By + Cz )
= - ( A*a[0] + B*a[1] + C*a[2] )
= - vec3Dot ( normal, a ) ;
*/
- getNormalVec3( resultVec4, v1, v2, v3, temp1V3, temp2V3 ) ;
- resultVec4 [ 3 ] = -dotVec3 (resultVec4, v1) ;
+ temp3V3.cross(temp1V3.minus(v2, v1), temp2V3.minus(v3, v1)).normalize();
+ resultVec4.set(temp3V3, -temp3V3.dot(v1));
return resultVec4;
}
@@ -1042,26 +618,23 @@ public final class VectorUtil {
* @param d vertex 2 of second segment
* @return the intersection coordinates if the segments intersect, otherwise returns null
*/
- public static float[] seg2SegIntersection(final float[] result, final Vert2fImmutable a, final Vert2fImmutable b, final Vert2fImmutable c, final Vert2fImmutable d) {
- final float determinant = (a.getX()-b.getX())*(c.getY()-d.getY()) - (a.getY()-b.getY())*(c.getX()-d.getX());
+ public static Vec3f seg2SegIntersection(final Vec3f result, final Vert2fImmutable a, final Vert2fImmutable b, final Vert2fImmutable c, final Vert2fImmutable d) {
+ final float determinant = (a.x()-b.x())*(c.y()-d.y()) - (a.y()-b.y())*(c.x()-d.x());
if (determinant == 0)
return null;
- final float alpha = (a.getX()*b.getY()-a.getY()*b.getX());
- final float beta = (c.getX()*d.getY()-c.getY()*d.getY());
- final float xi = ((c.getX()-d.getX())*alpha-(a.getX()-b.getX())*beta)/determinant;
- final float yi = ((c.getY()-d.getY())*alpha-(a.getY()-b.getY())*beta)/determinant;
+ final float alpha = (a.x()*b.y()-a.y()*b.x());
+ final float beta = (c.x()*d.y()-c.y()*d.y());
+ final float xi = ((c.x()-d.x())*alpha-(a.x()-b.x())*beta)/determinant;
+ final float yi = ((c.y()-d.y())*alpha-(a.y()-b.y())*beta)/determinant;
- final float gamma = (xi - a.getX())/(b.getX() - a.getX());
- final float gamma1 = (xi - c.getX())/(d.getX() - c.getX());
+ final float gamma = (xi - a.x())/(b.x() - a.x());
+ final float gamma1 = (xi - c.x())/(d.x() - c.x());
if(gamma <= 0 || gamma >= 1) return null;
if(gamma1 <= 0 || gamma1 >= 1) return null;
- result[0] = xi;
- result[1] = yi;
- result[2] = 0;
- return result;
+ return result.set(xi, yi, 0);
}
/**
@@ -1074,23 +647,18 @@ public final class VectorUtil {
*/
public static boolean testSeg2SegIntersection(final Vert2fImmutable a, final Vert2fImmutable b,
final Vert2fImmutable c, final Vert2fImmutable d) {
- final float[] A = a.getCoord();
- final float[] B = b.getCoord();
- final float[] C = c.getCoord();
- final float[] D = d.getCoord();
-
- final float determinant = (A[0]-B[0])*(C[1]-D[1]) - (A[1]-B[1])*(C[0]-D[0]);
+ final float determinant = (a.x()-b.x())*(c.y()-d.y()) - (a.y()-b.y())*(c.x()-d.x());
if (determinant == 0) {
return false;
}
- final float alpha = (A[0]*B[1]-A[1]*B[0]);
- final float beta = (C[0]*D[1]-C[1]*D[1]);
- final float xi = ((C[0]-D[0])*alpha-(A[0]-B[0])*beta)/determinant;
+ final float alpha = (a.x()*b.y()-a.y()*b.x());
+ final float beta = (c.x()*d.y()-c.y()*d.y());
+ final float xi = ((c.x()-d.x())*alpha-(a.x()-b.x())*beta)/determinant;
- final float gamma0 = (xi - A[0])/(B[0] - A[0]);
- final float gamma1 = (xi - C[0])/(D[0] - C[0]);
+ final float gamma0 = (xi - a.x())/(b.x() - a.x());
+ final float gamma1 = (xi - c.x())/(d.x() - c.x());
if(gamma0 <= 0 || gamma0 >= 1 || gamma1 <= 0 || gamma1 >= 1) {
return false;
}
@@ -1108,23 +676,19 @@ public final class VectorUtil {
public static boolean testSeg2SegIntersection(final Vert2fImmutable a, final Vert2fImmutable b,
final Vert2fImmutable c, final Vert2fImmutable d,
final float epsilon) {
- final float[] A = a.getCoord();
- final float[] B = b.getCoord();
- final float[] C = c.getCoord();
- final float[] D = d.getCoord();
-
- final float determinant = (A[0]-B[0])*(C[1]-D[1]) - (A[1]-B[1])*(C[0]-D[0]);
+ final float determinant = (a.x()-b.x())*(c.y()-d.y()) - (a.y()-b.y())*(c.x()-d.x());
if ( FloatUtil.isZero(determinant, epsilon) ) {
return false;
}
- final float alpha = (A[0]*B[1]-A[1]*B[0]);
- final float beta = (C[0]*D[1]-C[1]*D[1]);
- final float xi = ((C[0]-D[0])*alpha-(A[0]-B[0])*beta)/determinant;
+ final float alpha = (a.x()*b.y()-a.y()*b.x());
+ final float beta = (c.x()*d.y()-c.y()*d.y());
+ final float xi = ((c.x()-d.x())*alpha-(a.x()-b.x())*beta)/determinant;
+
+ final float gamma0 = (xi - a.x())/(b.x() - a.x());
+ final float gamma1 = (xi - c.x())/(d.x() - c.x());
- final float gamma0 = (xi - A[0])/(B[0] - A[0]);
- final float gamma1 = (xi - C[0])/(D[0] - C[0]);
if( FloatUtil.compare(gamma0, 0.0f, epsilon) <= 0 ||
FloatUtil.compare(gamma0, 1.0f, epsilon) >= 0 ||
FloatUtil.compare(gamma1, 0.0f, epsilon) <= 0 ||
@@ -1148,23 +712,20 @@ public final class VectorUtil {
* @return the intersection coordinates if the lines intersect, otherwise
* returns null
*/
- public static float[] line2lineIntersection(final float[] result,
- final Vert2fImmutable a, final Vert2fImmutable b,
- final Vert2fImmutable c, final Vert2fImmutable d) {
- final float determinant = (a.getX()-b.getX())*(c.getY()-d.getY()) - (a.getY()-b.getY())*(c.getX()-d.getX());
+ public static Vec3f line2lineIntersection(final Vec3f result,
+ final Vert2fImmutable a, final Vert2fImmutable b,
+ final Vert2fImmutable c, final Vert2fImmutable d) {
+ final float determinant = (a.x()-b.x())*(c.y()-d.y()) - (a.y()-b.y())*(c.x()-d.x());
if (determinant == 0)
return null;
- final float alpha = (a.getX()*b.getY()-a.getY()*b.getX());
- final float beta = (c.getX()*d.getY()-c.getY()*d.getY());
- final float xi = ((c.getX()-d.getX())*alpha-(a.getX()-b.getX())*beta)/determinant;
- final float yi = ((c.getY()-d.getY())*alpha-(a.getY()-b.getY())*beta)/determinant;
+ final float alpha = (a.x()*b.y()-a.y()*b.x());
+ final float beta = (c.x()*d.y()-c.y()*d.y());
+ final float xi = ((c.x()-d.x())*alpha-(a.x()-b.x())*beta)/determinant;
+ final float yi = ((c.y()-d.y())*alpha-(a.y()-b.y())*beta)/determinant;
- result[0] = xi;
- result[1] = yi;
- result[2] = 0;
- return result;
+ return result.set(xi, yi, 0);
}
/**
diff --git a/src/jogl/classes/com/jogamp/opengl/math/Vert2fImmutable.java b/src/jogl/classes/com/jogamp/opengl/math/Vert2fImmutable.java
index ec90b401f..66bf078f3 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/Vert2fImmutable.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/Vert2fImmutable.java
@@ -28,12 +28,9 @@
package com.jogamp.opengl.math;
public interface Vert2fImmutable {
- float getX();
+ float x();
- float getY();
+ float y();
int getCoordCount();
-
- float[] getCoord();
-
}
diff --git a/src/jogl/classes/com/jogamp/opengl/math/Vert3fImmutable.java b/src/jogl/classes/com/jogamp/opengl/math/Vert3fImmutable.java
index 76bd02fbc..6f63a746c 100644
--- a/src/jogl/classes/com/jogamp/opengl/math/Vert3fImmutable.java
+++ b/src/jogl/classes/com/jogamp/opengl/math/Vert3fImmutable.java
@@ -28,5 +28,7 @@
package com.jogamp.opengl.math;
public interface Vert3fImmutable extends Vert2fImmutable {
- float getZ();
+ float z();
+
+ Vec3f getCoord();
}
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
index d970b7029..c6c7f567c 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PMSAAES2.java
@@ -48,6 +48,8 @@ import com.jogamp.opengl.FBObject;
import com.jogamp.opengl.FBObject.Attachment;
import com.jogamp.opengl.math.Matrix4f;
import com.jogamp.opengl.math.Recti;
+import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.SyncMatrices4f16;
@@ -221,12 +223,12 @@ public final class VBORegion2PMSAAES2 extends GLRegion {
}
@Override
- protected final void pushVertex(final float[] coords, final float[] texParams, final float[] rgba) {
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords[0], coords[1], coords[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams[0], texParams[1], texParams[2]);
+ protected final void pushVertex(final Vec3f coords, final Vec3f texParams, final Vec4f rgba) {
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams);
if( null != gca_ColorsAttr ) {
if( null != rgba ) {
- put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), rgba[0], rgba[1], rgba[2], rgba[3]);
+ put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), rgba);
} else {
throw new IllegalArgumentException("Null color given for COLOR_CHANNEL rendering mode");
}
@@ -234,17 +236,17 @@ public final class VBORegion2PMSAAES2 extends GLRegion {
}
@Override
- protected final void pushVertices(final float[] coords1, final float[] coords2, final float[] coords3,
- final float[] texParams1, final float[] texParams2, final float[] texParams3, final float[] rgba) {
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords1[0], coords1[1], coords1[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords2[0], coords2[1], coords2[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords3[0], coords3[1], coords3[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams1[0], texParams1[1], texParams1[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams2[0], texParams2[1], texParams2[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams3[0], texParams3[1], texParams3[2]);
+ protected final void pushVertices(final Vec3f coords1, final Vec3f coords2, final Vec3f coords3,
+ final Vec3f texParams1, final Vec3f texParams2, final Vec3f texParams3, final Vec4f rgba) {
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords1);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords2);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords3);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams1);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams2);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams3);
if( null != gca_ColorsAttr ) {
if( null != rgba ) {
- final float r=rgba[0], g=rgba[1], b=rgba[2], a=rgba[3];
+ final float r=rgba.x(), g=rgba.y(), b=rgba.z(), a=rgba.w();
put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), r, g, b, a);
put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), r, g, b, a);
put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), r, g, b, a);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
index 889f4448d..1b580437f 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegion2PVBAAES2.java
@@ -51,6 +51,8 @@ import com.jogamp.opengl.FBObject.Attachment;
import com.jogamp.opengl.FBObject.TextureAttachment;
import com.jogamp.opengl.math.Matrix4f;
import com.jogamp.opengl.math.Recti;
+import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.util.GLArrayDataServer;
import com.jogamp.opengl.util.SyncMatrices4f16;
@@ -322,19 +324,19 @@ public final class VBORegion2PVBAAES2 extends GLRegion {
}
@Override
- protected final void pushVertex(final float[] coords, final float[] texParams, final float[] rgba) {
+ protected final void pushVertex(final Vec3f coords, final Vec3f texParams, final Vec4f rgba) {
// NIO array[3] is much slows than group/single
// gca_VerticesAttr.putf(coords, 0, 3);
// gca_CurveParamsAttr.putf(texParams, 0, 3);
// gca_VerticesAttr.put3f(coords[0], coords[1], coords[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords[0], coords[1], coords[2]);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords);
// gca_CurveParamsAttr.put3f(texParams[0], texParams[1], texParams[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams[0], texParams[1], texParams[2]);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams);
if( null != gca_ColorsAttr ) {
if( null != rgba ) {
// gca_ColorsAttr.putf(rgba, 0, 4);
// gca_ColorsAttr.put4f(rgba[0], rgba[1], rgba[2], rgba[3]);
- put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), rgba[0], rgba[1], rgba[2], rgba[3]);
+ put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), rgba);
} else {
throw new IllegalArgumentException("Null color given for COLOR_CHANNEL rendering mode");
}
@@ -342,23 +344,23 @@ public final class VBORegion2PVBAAES2 extends GLRegion {
}
@Override
- protected final void pushVertices(final float[] coords1, final float[] coords2, final float[] coords3,
- final float[] texParams1, final float[] texParams2, final float[] texParams3, final float[] rgba) {
+ protected final void pushVertices(final Vec3f coords1, final Vec3f coords2, final Vec3f coords3,
+ final Vec3f texParams1, final Vec3f texParams2, final Vec3f texParams3, final Vec4f rgba) {
// gca_VerticesAttr.put3f(coords1[0], coords1[1], coords1[2]);
// gca_VerticesAttr.put3f(coords2[0], coords2[1], coords2[2]);
// gca_VerticesAttr.put3f(coords3[0], coords3[1], coords3[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords1[0], coords1[1], coords1[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords2[0], coords2[1], coords2[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords3[0], coords3[1], coords3[2]);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords1);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords2);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords3);
// gca_CurveParamsAttr.put3f(texParams1[0], texParams1[1], texParams1[2]);
// gca_CurveParamsAttr.put3f(texParams2[0], texParams2[1], texParams2[2]);
// gca_CurveParamsAttr.put3f(texParams3[0], texParams3[1], texParams3[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams1[0], texParams1[1], texParams1[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams2[0], texParams2[1], texParams2[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams3[0], texParams3[1], texParams3[2]);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams1);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams2);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams3);
if( null != gca_ColorsAttr ) {
if( null != rgba ) {
- final float r=rgba[0], g=rgba[1], b=rgba[2], a=rgba[3];
+ final float r=rgba.x(), g=rgba.y(), b=rgba.z(), a=rgba.w();
// gca_ColorsAttr.put4f(r, g, b, a);
// gca_ColorsAttr.put4f(r, g, b, a);
// gca_ColorsAttr.put4f(r, g, b, a);
diff --git a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
index 9e29821fa..e149203f9 100644
--- a/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
+++ b/src/jogl/classes/jogamp/graph/curve/opengl/VBORegionSPES2.java
@@ -36,6 +36,8 @@ import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.GLUniformData;
+import com.jogamp.opengl.math.Vec3f;
+import com.jogamp.opengl.math.Vec4f;
import jogamp.graph.curve.opengl.shader.AttributeNames;
import jogamp.graph.curve.opengl.shader.UniformNames;
@@ -172,12 +174,12 @@ public final class VBORegionSPES2 extends GLRegion {
}
@Override
- protected final void pushVertex(final float[] coords, final float[] texParams, final float[] rgba) {
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords[0], coords[1], coords[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams[0], texParams[1], texParams[2]);
+ protected final void pushVertex(final Vec3f coords, final Vec3f texParams, final Vec4f rgba) {
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams);
if( null != gca_ColorsAttr ) {
if( null != rgba ) {
- put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), rgba[0], rgba[1], rgba[2], rgba[3]);
+ put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), rgba);
} else {
throw new IllegalArgumentException("Null color given for COLOR_CHANNEL rendering mode");
}
@@ -185,17 +187,17 @@ public final class VBORegionSPES2 extends GLRegion {
}
@Override
- protected final void pushVertices(final float[] coords1, final float[] coords2, final float[] coords3,
- final float[] texParams1, final float[] texParams2, final float[] texParams3, final float[] rgba) {
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords1[0], coords1[1], coords1[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords2[0], coords2[1], coords2[2]);
- put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords3[0], coords3[1], coords3[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams1[0], texParams1[1], texParams1[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams2[0], texParams2[1], texParams2[2]);
- put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams3[0], texParams3[1], texParams3[2]);
+ protected final void pushVertices(final Vec3f coords1, final Vec3f coords2, final Vec3f coords3,
+ final Vec3f texParams1, final Vec3f texParams2, final Vec3f texParams3, final Vec4f rgba) {
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords1);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords2);
+ put3f((FloatBuffer)gca_VerticesAttr.getBuffer(), coords3);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams1);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams2);
+ put3f((FloatBuffer)gca_CurveParamsAttr.getBuffer(), texParams3);
if( null != gca_ColorsAttr ) {
if( null != rgba ) {
- final float r=rgba[0], g=rgba[1], b=rgba[2], a=rgba[3];
+ final float r=rgba.x(), g=rgba.y(), b=rgba.z(), a=rgba.w();
put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), r, g, b, a);
put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), r, g, b, a);
put4f((FloatBuffer)gca_ColorsAttr.getBuffer(), r, g, b, a);
diff --git a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
index 715b812c1..9772b860f 100644
--- a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
+++ b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
@@ -36,6 +36,7 @@ import com.jogamp.graph.geom.Outline;
import com.jogamp.graph.geom.Triangle;
import com.jogamp.graph.geom.Vertex;
import com.jogamp.graph.geom.plane.Winding;
+import com.jogamp.opengl.math.Vec2f;
import com.jogamp.opengl.math.VectorUtil;
import jogamp.opengl.Debug;
@@ -145,13 +146,13 @@ public class CDTriangulator2D implements Triangulator {
}
}
if( TEST_ENABLED ) {
- final float[] tempV2 = new float[2];
+ final Vec2f tempV2 = new Vec2f();
final CDTriangulator2DExpAddOn addOn = new CDTriangulator2DExpAddOn();
final int sinkSize = sink.size();
if( TEST_MARK_LINE ) {
for(int i=0; i<sinkSize; i++) {
final Triangle t0 = sink.get(i);
- addOn.markLineInTriangle(t0, tempV2);
+ addOn.markLineInTriangle(t0);
}
} else if ( TEST_LINE_AA ){
for(int i=0; i<sinkSize-1; i+=2) {
diff --git a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2DExpAddOn.java b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2DExpAddOn.java
index a836e2023..86edf7d61 100644
--- a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2DExpAddOn.java
+++ b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2DExpAddOn.java
@@ -30,7 +30,8 @@ package jogamp.graph.curve.tess;
import com.jogamp.graph.geom.Triangle;
import com.jogamp.graph.geom.Vertex;
-import com.jogamp.opengl.math.FloatUtil;
+import com.jogamp.opengl.math.Vec2f;
+import com.jogamp.opengl.math.Vec3f;
import com.jogamp.opengl.math.VectorUtil;
/**
@@ -40,10 +41,10 @@ import com.jogamp.opengl.math.VectorUtil;
*/
public class CDTriangulator2DExpAddOn {
- private final float[] tempV3a = new float[3];
- private final float[] tempV3b = new float[3];
+ private final Vec3f tempV3a = new Vec3f();
+ private final Vec3f tempV3b = new Vec3f();
- protected final void markLineInTriangle(final Triangle tri1, final float[] tempV2) {
+ protected final void markLineInTriangle(final Triangle tri1) {
if( !tri1.isOnCurve() || !tri1.isLine() ) {
return;
}
@@ -56,19 +57,19 @@ public class CDTriangulator2DExpAddOn {
int lineSegCount = 0;
final boolean v0IsLS, v1IsLS, v2IsLS;
- if( v0.isOnCurve() && VectorUtil.isVec2Zero(v0.getTexCoord(), 0) && !boundVs[0] ) {
+ if( v0.isOnCurve() && VectorUtil.isVec2Zero(v0.getTexCoord()) && !boundVs[0] ) {
v0IsLS = true;
lineSegCount++;
} else {
v0IsLS = false;
}
- if( v1.isOnCurve() && VectorUtil.isVec2Zero(v1.getTexCoord(), 0) && !boundVs[1] ) {
+ if( v1.isOnCurve() && VectorUtil.isVec2Zero(v1.getTexCoord()) && !boundVs[1] ) {
v1IsLS = true;
lineSegCount++;
} else {
v1IsLS = false;
}
- if( v2.isOnCurve() && VectorUtil.isVec2Zero(v2.getTexCoord(), 0) && !boundVs[2] ) {
+ if( v2.isOnCurve() && VectorUtil.isVec2Zero(v2.getTexCoord()) && !boundVs[2] ) {
v2IsLS = true;
lineSegCount++;
} else {
@@ -155,17 +156,17 @@ public class CDTriangulator2DExpAddOn {
* </p>
* @param tri2
* @param checkThisOnCurve
- * @param tempV2 temp float[2] storage
+ * @param temp temp storage
*/
- protected final float[] processLineAA(final int i, final Triangle tri1, final Triangle tri2, final float[] tempV2) {
+ protected final Vec2f processLineAA(final int i, final Triangle tri1, final Triangle tri2, final Vec2f temp) {
if(CDTriangulator2D.DEBUG){
System.err.println("CDTri.genP2["+i+"].1: ? t1 "+tri1);
System.err.println("CDTri.genP2["+i+"].1: ? t2 "+tri2);
}
- final float[] rect = processLineAAImpl(tri1, tri2, tempV2);
+ final Vec2f rect = processLineAAImpl(tri1, tri2, temp);
if(CDTriangulator2D.DEBUG){
if( null != rect ) {
- System.err.println("CDTri.genP2["+i+"].1: RECT ["+rect[0]+", "+rect[1]+"]");
+ System.err.println("CDTri.genP2["+i+"].1: RECT ["+rect.x()+", "+rect.y()+"]");
System.err.println("CDTri.genP2["+i+"].1: RECT t1 "+tri1);
System.err.println("CDTri.genP2["+i+"].1: RECT t2 "+tri2);
} else {
@@ -175,40 +176,40 @@ public class CDTriangulator2DExpAddOn {
}
return rect;
}
- private final float[] processLineAAImpl(final Triangle tri1, final Triangle tri2, final float[] tempV2) {
+ private final Vec2f processLineAAImpl(final Triangle tri1, final Triangle tri2, final Vec2f temp) {
if( !tri1.isOnCurve() || !tri2.isOnCurve() || !tri1.isLine() || !tri2.isLine() ) {
return null;
}
- final float[] rect;
+ final Vec2f rect;
int eqCount = 0;
final int[] commonIdxA = { -1, -1 };
final int[] commonIdxB = { -1, -1 };
final Vertex[] verts1 = tri1.getVertices();
final Vertex[] verts2 = tri2.getVertices();
- float[] coord = verts1[0].getCoord();
- if( VectorUtil.isVec3Equal(coord, 0, verts2[0].getCoord(), 0, FloatUtil.EPSILON) ) {
+ Vec3f coord = verts1[0].getCoord();
+ if( coord.isEqual( verts2[0].getCoord() ) ) {
commonIdxA[eqCount] = 0;
commonIdxB[eqCount] = 0;
eqCount++;
- } else if( VectorUtil.isVec3Equal(coord, 0, verts2[1].getCoord(), 0, FloatUtil.EPSILON) ) {
+ } else if( coord.isEqual( verts2[1].getCoord() ) ) {
commonIdxA[eqCount] = 0;
commonIdxB[eqCount] = 1;
eqCount++;
- } else if( VectorUtil.isVec3Equal(coord, 0, verts2[2].getCoord(), 0, FloatUtil.EPSILON) ) {
+ } else if( coord.isEqual( verts2[2].getCoord() ) ) {
commonIdxA[eqCount] = 0;
commonIdxB[eqCount] = 2;
eqCount++;
}
coord = verts1[1].getCoord();
- if( VectorUtil.isVec3Equal(coord, 0, verts2[0].getCoord(), 0, FloatUtil.EPSILON) ) {
+ if( coord.isEqual( verts2[0].getCoord() ) ) {
commonIdxA[eqCount] = 1;
commonIdxB[eqCount] = 0;
eqCount++;
- } else if( VectorUtil.isVec3Equal(coord, 0, verts2[1].getCoord(), 0, FloatUtil.EPSILON) ) {
+ } else if( coord.isEqual( verts2[1].getCoord() ) ) {
commonIdxA[eqCount] = 1;
commonIdxB[eqCount] = 1;
eqCount++;
- } else if( VectorUtil.isVec3Equal(coord, 0, verts2[2].getCoord(), 0, FloatUtil.EPSILON) ) {
+ } else if( coord.isEqual( verts2[2].getCoord() ) ) {
commonIdxA[eqCount] = 1;
commonIdxB[eqCount] = 2;
eqCount++;
@@ -218,15 +219,15 @@ public class CDTriangulator2DExpAddOn {
otherIdxA = 3 - ( commonIdxA[0] + commonIdxA[1] );
} else {
coord = verts1[2].getCoord();
- if( VectorUtil.isVec3Equal(coord, 0, verts2[0].getCoord(), 0, FloatUtil.EPSILON) ) {
+ if( coord.isEqual( verts2[0].getCoord() ) ) {
commonIdxA[eqCount] = 2;
commonIdxB[eqCount] = 0;
eqCount++;
- } else if( VectorUtil.isVec3Equal(coord, 0, verts2[1].getCoord(), 0, FloatUtil.EPSILON) ) {
+ } else if( coord.isEqual( verts2[1].getCoord() ) ) {
commonIdxA[eqCount] = 2;
commonIdxB[eqCount] = 1;
eqCount++;
- } else if( VectorUtil.isVec3Equal(coord, 0, verts2[2].getCoord(), 0, FloatUtil.EPSILON) ) {
+ } else if( coord.isEqual( verts2[2].getCoord() ) ) {
commonIdxA[eqCount] = 2;
commonIdxB[eqCount] = 2;
eqCount++;
@@ -265,30 +266,30 @@ public class CDTriangulator2DExpAddOn {
}
final float texZTag = 2f;
- final float[] vOACoords = vOA.getCoord();
- final float dOC0A = VectorUtil.distVec3(vOACoords, vC0A.getCoord());
- final float dOC1A = VectorUtil.distVec3(vOACoords, vC1A.getCoord());
+ final Vec3f vOACoords = vOA.getCoord();
+ final float dOC0A = vOACoords.dist( vC0A.getCoord() );
+ final float dOC1A = vOACoords.dist( vC1A.getCoord() );
if( false ) {
- final float[] vec3Z = { 0f, 0f, -1f };
- final float[] vecLongSide, vecLineHeight;
+ final Vec3f vec3Z = new Vec3f(0f, 0f, -1f);
+ final Vec3f vecLongSide, vecLineHeight;
if( dOC0A < dOC1A ) {
- tempV2[0] = dOC0A; // line width
- tempV2[1] = dOC1A; // long side
- vecLongSide = VectorUtil.normalizeVec3( VectorUtil.subVec2(tempV3a, vOACoords, vC1A.getCoord()) ); // normal long side vector
- vecLineHeight = VectorUtil.crossVec3(tempV3b, vec3Z, tempV3a); // the line-height vector (normal)
+ temp.set( dOC0A, // line width
+ dOC1A); // long side
+ vecLongSide = tempV3a.minus(vOACoords, vC1A.getCoord()).normalize(); // normal long side vector
+ vecLineHeight = tempV3b.cross(vec3Z, tempV3a); // the line-height vector (normal)
vOA.setTexCoord(-1f, -1f, texZTag);
vC1A.setTexCoord(1f, -1f, texZTag);
vOB.setTexCoord(0f, 1f, texZTag);
vC0A.setTexCoord(0f, 1f, texZTag);
} else {
- tempV2[0] = dOC1A; // line width
- tempV2[1] = dOC0A; // long side
- vecLongSide = VectorUtil.normalizeVec3( VectorUtil.subVec2(tempV3a, vOACoords, vC0A.getCoord()) ); // normal long side vector
- vecLineHeight = VectorUtil.crossVec3(tempV3b, vec3Z, tempV3a); // the line-height vector (normal)
+ temp.set( dOC1A, // line width
+ dOC0A); // long side
+ vecLongSide = tempV3a.minus(vOACoords, vC0A.getCoord()).normalize(); // normal long side vector
+ vecLineHeight = tempV3b.cross(vec3Z, tempV3a); // the line-height vector (normal)
}
if(CDTriangulator2D.DEBUG){
- System.err.println("RECT.0 : long-side-vec "+vecLongSide[0]+", "+vecLongSide[1]+", "+vecLongSide[2]);
- System.err.println("RECT.0 : line-height-vec "+vecLineHeight[0]+", "+vecLineHeight[1]+", "+vecLineHeight[2]);
+ System.err.println("RECT.0 : long-side-vec "+vecLongSide);
+ System.err.println("RECT.0 : line-height-vec "+vecLineHeight);
}
} else {
@@ -303,16 +304,16 @@ public class CDTriangulator2DExpAddOn {
final Vertex vL1, vL2, vR1, vR2;
if( dOC0A < dOC1A ) {
lineWidth = dOC0A; // line width
- tempV2[0] = dOC0A; // line width
- tempV2[1] = dOC1A; // long side
+ temp.set( dOC0A, // line width
+ dOC1A); // long side
// Left: vOA, vC1A
// Right: vOB, vC0A
vL1 = vOA; vL2 = vC1A;
vR1 = vOB; vR2 = vC0A;
} else {
lineWidth = dOC1A; // line width
- tempV2[0] = dOC1A; // line width
- tempV2[1] = dOC0A; // long side
+ temp.set( dOC1A, // line width
+ dOC0A); // long side
// Left: vOB, vC1A
// Right: vOA, vC0A
vL1 = vOB; vL2 = vC1A;
@@ -331,7 +332,7 @@ public class CDTriangulator2DExpAddOn {
System.err.println("RECT Right.0: "+vR1+", "+vR2);
}
}
- rect = tempV2;
+ rect = temp;
} else {
rect = null;
}
diff --git a/src/jogl/classes/jogamp/graph/curve/tess/GraphVertex.java b/src/jogl/classes/jogamp/graph/curve/tess/GraphVertex.java
index 391e71011..275abda23 100644
--- a/src/jogl/classes/jogamp/graph/curve/tess/GraphVertex.java
+++ b/src/jogl/classes/jogamp/graph/curve/tess/GraphVertex.java
@@ -30,6 +30,7 @@ package jogamp.graph.curve.tess;
import java.util.ArrayList;
import com.jogamp.graph.geom.Vertex;
+import com.jogamp.opengl.math.Vec3f;
public class GraphVertex {
private Vertex point;
@@ -44,18 +45,18 @@ public class GraphVertex {
return point;
}
- public float getX(){
- return point.getX();
+ public float x(){
+ return point.x();
}
- public float getY(){
- return point.getY();
+ public float y(){
+ return point.y();
}
- public float getZ(){
- return point.getZ();
+ public float z(){
+ return point.z();
}
- public float[] getCoord() {
+ public Vec3f getCoord() {
return point.getCoord();
}
@@ -121,6 +122,7 @@ public class GraphVertex {
this.boundaryContained = boundaryContained;
}
+ @Override
public String toString() {
return "GraphVertex[contained "+boundaryContained+", "+point+"]";
}
diff --git a/src/jogl/classes/jogamp/graph/curve/tess/Loop.java b/src/jogl/classes/jogamp/graph/curve/tess/Loop.java
index 155fbd18d..1939dcb1e 100644
--- a/src/jogl/classes/jogamp/graph/curve/tess/Loop.java
+++ b/src/jogl/classes/jogamp/graph/curve/tess/Loop.java
@@ -33,6 +33,7 @@ import java.util.ArrayList;
import com.jogamp.graph.geom.Vertex;
import com.jogamp.graph.geom.plane.Winding;
import com.jogamp.graph.geom.Triangle;
+import com.jogamp.opengl.math.Vec3f;
import com.jogamp.opengl.math.VectorUtil;
import com.jogamp.opengl.math.Vert2fImmutable;
import com.jogamp.opengl.math.geom.AABBox;
@@ -96,9 +97,9 @@ public class Loop {
final int n = vertices.size();
float area = 0.0f;
for (int p = n - 1, q = 0; q < n; p = q++) {
- final float[] pCoord = vertices.get(p).getCoord();
- final float[] qCoord = vertices.get(q).getCoord();
- area += pCoord[0] * qCoord[1] - qCoord[0] * pCoord[1];
+ final Vec3f pCoord = vertices.get(p).getCoord();
+ final Vec3f qCoord = vertices.get(q).getCoord();
+ area += pCoord.x() * qCoord.y() - qCoord.x() * pCoord.y();
}
return area;
}
@@ -136,7 +137,7 @@ public class Loop {
final int max = vertices.size() - 1;
for(int index = 0; index <= max; ++index) {
final GraphVertex v1 = vertices.get(index);
- box.resize(v1.getX(), v1.getY(), v1.getZ());
+ box.resize(v1.x(), v1.y(), v1.z());
final HEdge edge = new HEdge(v1, edgeType);
@@ -157,7 +158,7 @@ public class Loop {
// CCW -> CW
for(int index = vertices.size() - 1; index >= 0; --index) {
final GraphVertex v1 = vertices.get(index);
- box.resize(v1.getX(), v1.getY(), v1.getZ());
+ box.resize(v1.x(), v1.y(), v1.z());
final HEdge edge = new HEdge(v1, edgeType);
@@ -222,7 +223,7 @@ public class Loop {
final GraphVertex nextV = initVertices.get(i+1);
for(int pos=0; pos<vertices.size(); pos++) {
final GraphVertex cand = vertices.get(pos);
- final float distance = VectorUtil.distVec3(v.getCoord(), cand.getCoord());
+ final float distance = v.getCoord().dist( cand.getCoord() );
if(distance < minDistance){
for (final GraphVertex vert:vertices){
if(vert == v || vert == nextV || vert == cand)
@@ -312,7 +313,7 @@ public class Loop {
}
public boolean checkInside(final Vertex v) {
- if(!box.contains(v.getX(), v.getY(), v.getZ())){
+ if(!box.contains(v.x(), v.y(), v.z())){
return false;
}
@@ -323,8 +324,8 @@ public class Loop {
final Vertex v2 = current.getGraphPoint().getPoint();
final Vertex v1 = next.getGraphPoint().getPoint();
- if ( ((v1.getY() > v.getY()) != (v2.getY() > v.getY())) &&
- (v.getX() < (v2.getX() - v1.getX()) * (v.getY() - v1.getY()) / (v2.getY() - v1.getY()) + v1.getX()) ){
+ if ( ((v1.y() > v.y()) != (v2.y() > v.y())) &&
+ (v.x() < (v2.x() - v1.x()) * (v.y() - v1.y()) / (v2.y() - v1.y()) + v1.x()) ){
inside = !inside;
}
diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java
index 8a9ad8bab..f7c10c335 100644
--- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java
+++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java
@@ -213,7 +213,7 @@ class TypecastFont implements Font {
glyph_advance = glyph.getAdvanceWidth();
glyph_leftsidebearings = glyph.getLeftSideBearing();
final AABBox sb = glyph.getBBox();
- final OutlineShape s = TypecastRenderer.buildShape(metrics.getUnitsPerEM(), glyph, OutlineShape.getDefaultVertexFactory());
+ final OutlineShape s = TypecastRenderer.buildShape(metrics.getUnitsPerEM(), glyph);
if( 0 < s.getOutlineVectexCount() ) {
glyph_bbox = sb;
shape = s;
@@ -221,7 +221,7 @@ class TypecastFont implements Font {
} else {
// non-contour glyph -> whitespace
glyph_bbox = new AABBox(0f,0f,0f, glyph_advance, glyph_height, 0f);
- shape = TypecastRenderer.buildEmptyShape(metrics.getUnitsPerEM(), glyph_bbox, OutlineShape.getDefaultVertexFactory());
+ shape = TypecastRenderer.buildEmptyShape(metrics.getUnitsPerEM(), glyph_bbox);
isWhiteSpace = true;
}
} else {
@@ -229,7 +229,7 @@ class TypecastFont implements Font {
glyph_advance = getAdvanceWidthFU(glyph_id);
glyph_leftsidebearings = 0;
glyph_bbox = new AABBox(0f,0f,0f, glyph_advance, glyph_height, 0f);
- shape = TypecastRenderer.buildEmptyShape(metrics.getUnitsPerEM(), glyph_bbox, OutlineShape.getDefaultVertexFactory());
+ shape = TypecastRenderer.buildEmptyShape(metrics.getUnitsPerEM(), glyph_bbox);
isWhiteSpace = true;
}
KernSubtable kernSub = null;
diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java
index 7b0e1b5c9..3aa9a1c12 100644
--- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java
+++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java
@@ -34,7 +34,6 @@ import jogamp.opengl.Debug;
import com.jogamp.graph.curve.OutlineShape;
import com.jogamp.graph.geom.Vertex;
-import com.jogamp.graph.geom.Vertex.Factory;
import com.jogamp.opengl.math.geom.AABBox;
/**
@@ -137,8 +136,8 @@ public class TypecastRenderer {
shape.addVertex(0, p3.x/unitsPerEM, p3.y/unitsPerEM, true);
}
- public static OutlineShape buildEmptyShape(final int unitsPerEM, final AABBox box, final Factory<? extends Vertex> vertexFactory) {
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ public static OutlineShape buildEmptyShape(final int unitsPerEM, final AABBox box) {
+ final OutlineShape shape = new OutlineShape();
if( PRINT_CODE ) { System.err.printf("%n// Start Empty Shape%n"); }
final float x1 = box.getMinX() / unitsPerEM;
final float x2 = box.getMaxX() / unitsPerEM;
@@ -169,11 +168,11 @@ public class TypecastRenderer {
return shape;
}
- public static OutlineShape buildShape(final int unitsPerEM, final Glyph glyph, final Factory<? extends Vertex> vertexFactory) {
+ public static OutlineShape buildShape(final int unitsPerEM, final Glyph glyph) {
if (glyph == null) {
return null;
}
- final OutlineShape shape = new OutlineShape(vertexFactory);
+ final OutlineShape shape = new OutlineShape();
if (glyph instanceof T2Glyph) {
// Type 1/2: Cubic
if( PRINT_CODE ) { System.err.printf("%n// Start Type-2 Shape for Glyph %d%n", glyph.getID()); }
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/GPURegionGLListener01.java b/src/test/com/jogamp/opengl/test/junit/graph/GPURegionGLListener01.java
index 2dacdec68..fd4ec47b1 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/GPURegionGLListener01.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/GPURegionGLListener01.java
@@ -32,7 +32,7 @@ import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
-
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.graph.curve.OutlineShape;
import com.jogamp.graph.curve.opengl.GLRegion;
import com.jogamp.graph.curve.opengl.RenderState;
@@ -273,7 +273,7 @@ public class GPURegionGLListener01 extends GPURendererListenerBase01 {
break;
}
region = GLRegion.create(gl.getGLProfile(), getRenderModes(), null);
- region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new float[4]) : null);
+ region.addOutlineShape(outlineShape, null, region.hasColorChannel() ? getRenderer().getRenderState().getColorStatic(new Vec4f()) : null);
}
@Override
diff --git a/src/test/com/jogamp/opengl/test/junit/graph/PerfTextRendererNEWT00.java b/src/test/com/jogamp/opengl/test/junit/graph/PerfTextRendererNEWT00.java
index 4d4d31027..8719fea27 100644
--- a/src/test/com/jogamp/opengl/test/junit/graph/PerfTextRendererNEWT00.java
+++ b/src/test/com/jogamp/opengl/test/junit/graph/PerfTextRendererNEWT00.java
@@ -55,6 +55,7 @@ import com.jogamp.graph.curve.opengl.TextRegionUtil;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.font.FontFactory;
import com.jogamp.graph.geom.plane.AffineTransform;
+import com.jogamp.opengl.math.Vec4f;
import com.jogamp.opengl.math.geom.AABBox;
import com.jogamp.opengl.test.junit.util.MiscUtils;
import com.jogamp.opengl.test.junit.util.NEWTGLContext;
@@ -87,7 +88,7 @@ public class PerfTextRendererNEWT00 {
static boolean do_vsync = false;
static Font font;
- private final float[] fg_color = new float[] { 0, 0, 0, 1 };
+ private final Vec4f fg_color = new Vec4f( 0, 0, 0, 1 );
static {
try {