28package com.jogamp.opengl.demos.graph.ui;
30import java.io.IOException;
31import java.net.URISyntaxException;
32import java.util.Arrays;
33import java.util.Random;
35import com.jogamp.common.net.Uri;
36import com.jogamp.common.os.Clock;
37import com.jogamp.common.os.Platform;
38import com.jogamp.common.util.IOUtil;
39import com.jogamp.common.util.InterruptSource;
40import com.jogamp.common.util.VersionUtil;
41import com.jogamp.graph.curve.Region;
42import com.jogamp.graph.curve.opengl.RenderState;
43import com.jogamp.graph.font.Font;
44import com.jogamp.graph.font.FontFactory;
45import com.jogamp.graph.ui.GraphShape;
46import com.jogamp.graph.ui.Group;
47import com.jogamp.graph.ui.Scene;
48import com.jogamp.graph.ui.Shape;
49import com.jogamp.graph.ui.AnimGroup;
50import com.jogamp.graph.ui.layout.Alignment;
51import com.jogamp.graph.ui.layout.Gap;
52import com.jogamp.graph.ui.layout.GridLayout;
53import com.jogamp.graph.ui.shapes.Button;
54import com.jogamp.graph.ui.shapes.Label;
55import com.jogamp.graph.ui.shapes.Rectangle;
56import com.jogamp.math.FloatUtil;
57import com.jogamp.math.Quaternion;
58import com.jogamp.math.Vec2f;
59import com.jogamp.math.Vec3f;
60import com.jogamp.math.Vec4f;
61import com.jogamp.math.geom.AABBox;
62import com.jogamp.newt.MonitorDevice;
63import com.jogamp.newt.event.KeyAdapter;
64import com.jogamp.newt.event.KeyEvent;
65import com.jogamp.newt.event.MouseAdapter;
66import com.jogamp.newt.event.MouseEvent;
67import com.jogamp.newt.event.WindowAdapter;
68import com.jogamp.newt.event.WindowEvent;
69import com.jogamp.newt.opengl.GLWindow;
70import com.jogamp.opengl.GL;
71import com.jogamp.opengl.GL2ES2;
72import com.jogamp.opengl.GLAnimatorControl;
73import com.jogamp.opengl.GLAutoDrawable;
74import com.jogamp.opengl.GLCapabilities;
75import com.jogamp.opengl.GLContext;
76import com.jogamp.opengl.GLEventListener;
77import com.jogamp.opengl.GLProfile;
78import com.jogamp.opengl.JoglVersion;
79import com.jogamp.opengl.demos.graph.FontSetDemos;
80import com.jogamp.opengl.demos.util.CommandlineOptions;
81import com.jogamp.opengl.demos.util.MiscUtils;
82import com.jogamp.opengl.util.Animator;
83import com.jogamp.opengl.util.av.GLMediaPlayer;
84import com.jogamp.opengl.util.av.GLMediaPlayerFactory;
85import com.jogamp.opengl.util.av.GLMediaPlayer.GLMediaEventListener;
87import jogamp.graph.ui.TreeTool;
113 static final boolean DEBUG =
false;
115 static final String[] originalTexts = {
116 " JOGL, Java™ Binding for the OpenGL® API ",
117 " GraphUI, Resolution Independent Curves ",
118 " JogAmp, Java™ libraries for 3D & Media ",
119 " Linux, Android, Windows, MacOS; iOS, embedded, etc on demand"
124 static float frame_velocity = 5f / 1e3f;
125 static float velocity = 30 / 1e3f;
126 static float ang_velo = velocity * 60f;
127 static int autoSpeed = -1;
129 static Uri audioUri =
null;
132 static final int[] manualScreenShorCount = { 0 };
134 static void setVelocity(
final float v) {
136 ang_velo = velocity * 60f;
140 public static void main(
final String[] args)
throws IOException {
141 setVelocity(80/1000f);
143 options.keepRunning =
true;
144 boolean showAnimBox =
true;
146 if (0 != args.length) {
147 final int[] idx = { 0 };
148 for (idx[0] = 0; idx[0] < args.length; ++idx[0]) {
149 if( options.
parse(args, idx) ) {
151 }
else if (args[idx[0]].equals(
"-v")) {
153 setVelocity(
MiscUtils.
atoi(args[idx[0]], (
int) velocity * 1000) / 1000f);
154 }
else if(args[idx[0]].equals(
"-aspeed")) {
155 setVelocity(80/1000f);
157 options.keepRunning =
true;
158 }
else if(args[idx[0]].equals(
"-rspeed")) {
161 }
else if(args[idx[0]].equals(
"-no_anim_box")) {
163 }
else if(args[idx[0]].equals(
"-audio")) {
166 audioUri = Uri.cast( args[idx[0]] );
167 }
catch (
final URISyntaxException e1) {
168 System.err.println(e1);
176 System.err.println(options);
179 System.out.println(
"Requested: " + reqCaps);
216 final float pixPerMM, dpiV;
225 System.err.println(
"AUTO RenderMode: dpi "+dpiV+
", threshold "+options.
noAADPIThreshold+
230 animator.
add(window);
241 window.
invoke(
true, (drawable) -> {
242 final GL gl = drawable.
getGL();
251 final float sceneBoxFrameWidth;
253 sceneBoxFrameWidth = sceneBox.
getWidth() * 0.0025f;
256 r.
setColor(0.45f, 0.45f, 0.45f, 0.9f);
265 animGroup.
scale(0.85f, 0.85f, 1f);
269 animGroup.
scale(1.0f, 1.0f, 1f);
276 System.err.println(
"SceneBox " + sceneBox);
278 System.err.println(
"AnimGroup.0: "+animGroup);
280 final Label statusLabel;
282 final AABBox fbox = fontStatus.
getGlyphBounds(
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
284 System.err.println(
"StatusLabelScale: " + statusLabelScale +
" = " + sceneBox.
getWidth() +
" / " + fbox.
getWidth() +
", " + fbox);
286 statusLabel =
new Label(options.
renderModes, fontStatus,
"Nothing there yet");
287 statusLabel.
setScale(statusLabelScale, statusLabelScale, 1f);
288 statusLabel.
setColor(0.1f, 0.1f, 0.1f, 1.0f);
292 sub01SetupWindowListener(window, scene, animGroup, statusLabel, dpiV);
295 final StringBuilder sb =
new StringBuilder();
296 for(
final String s : originalTexts) {
297 sb.append(s).append(
"\n");
308 statusLabel.
setText(
"Press enter to continue");
312 window.
invoke(
true, (drawable) -> {
323 sub02AddUItoScene(scene, animGroup, 2, window);
328 final boolean[] z_only = {
true };
332 final float g_w = animBox.
getWidth();
333 System.err.println(
"AnimBox " + animBox);
334 System.err.println(
"AnimGroup.1 " + animGroup);
336 final float[] top_ypos = { 0 };
337 window.
invoke(
true, (drawable) -> {
338 final float fontScale2;
340 final String vs =
"Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... Check out Gamp. XXXXXXXXXXXXXXXXXXXXXXXXXXX";
343 System.err.println(
"FontScale2: " + fontScale2 +
" = " + g_w +
" / " + fbox.
getWidth());
346 top_ypos[0] = clippedBox.
getMaxY();
350 final String vs =
"Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... Check out Gamp.";
351 top_ypos[0] -= fontScale2 * 1.5f;
353 font, vs, fontScale2,
new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
354 50 / 1e3f , clippedBox, top_ypos[0]);
359 final String vs = VersionUtil.getPlatformInfo().replace(Platform.getNewline(),
"; ").replace(VersionUtil.SEPERATOR,
" *** ").replaceAll(
"\\s+",
" ");
360 top_ypos[0] -= fontScale2 * 1.2f;
362 font, vs, fontScale2,
new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
363 30 / 1e3f , clippedBox, top_ypos[0]);
371 if(
null != audioUri ) {
380 System.err.println();
381 System.err.println(
"Next animation loop ...");
387 final String curText = originalTexts[txt_idx];
388 final float fontScale;
389 final AnimGroup.
Set[] dynAnimSet = {
null,
null,
null };
393 System.err.println(
"FontScale: " + fontScale +
" = " + g_w +
" / " + fbox.
getWidth());
395 z_only[0] = !z_only[0];
396 window.
invoke(
true, (drawable) -> {
400 options.
renderModes, font, curText, fontScale,
new Vec4f(0.1f, 0.1f, 0.1f, 1f),
407 final GL gl = drawable.
getGL();
411 ", GLSL "+ctx.getGLSLVersionNumber().getVersionString() +
413 final float fontScale2;
416 fontScale2 = g_w / fbox.
getWidth() * 0.6f;
424 sd.shape.setColor(0.1f, 0.1f, 0.1f, 0.9f);
427 animBox.getMinX() + as.refShape.getScaledWidth() * 1.0f,
428 animBox.getMinY() + as.refShape.getScaledHeight() * 2.0f, 0f);
430 sd.startPos.set( sd.targetPos.x() + animBox.getWidth(),
431 sd.targetPos.y(), sd.targetPos.z());
432 sd.shape.moveTo( sd.startPos );
438 final float size2 = fontScale/2;
439 final float yscale = 1.1f;
445 final AnimGroup.ShapeSetup shapeSetup = (
final AnimGroup.Set as,
final int idx,
final AnimGroup.ShapeData sd) -> {
446 sd.targetPos.add(animBox.
getMinX() + as.refShape.getScaledWidth() * 1.0f,
447 top_ypos[0] - as.refShape.getScaledHeight() * 1.5f, 0f);
449 sd.startPos.set( sd.targetPos.x() + animBox.
getWidth(),
450 sd.targetPos.y(), sd.targetPos.z());
451 sd.shape.moveTo( sd.startPos );
453 refShape.
setColor(1.0f, 0.0f, 0.0f, 0.9f);
455 dynAnimSet[2].addShape(animGroup, refShape, shapeSetup);
460 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
467 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
474 final long t0_us = Clock.currentNanos() / 1000;
475 while ( (
null == dynAnimSet[0] || dynAnimSet[0].isAnimationActive() || animGroup.
getTickPaused() ) && window.
isNativeValid() ) {
476 try { Thread.sleep(250); }
catch (
final InterruptedException e1) { }
479 final float has_dur_s = ((Clock.currentNanos() / 1000) - t0_us) / 1e6f;
480 System.err.printf(
"Text travel-duration %.3f s, %d chars%n", has_dur_s, curText.length());
481 if( scene.
getScreenshotCount() - manualScreenShorCount[0] < 1 + originalTexts.length ) {
484 try { Thread.sleep(1500); }
catch (
final InterruptedException e1) { }
486 try { Thread.sleep(250); }
catch (
final InterruptedException e1) { }
488 if( autoSpeed > 0 ) {
489 if( velocity < 60/1000f ) {
490 setVelocity(velocity + 9/1000f);
492 setVelocity(velocity - 9/1000f);
495 }
else if( autoSpeed < 0 ) {
496 if( velocity > 11/1000f ) {
497 setVelocity(velocity - 9/1000f);
499 setVelocity(velocity + 9/1000f);
503 txt_idx = ( txt_idx + 1 ) % originalTexts.length;
506 window.
invoke(
true, (drawable) -> {
522 static void sub01SetupWindowListener(
final GLWindow window,
final Scene scene,
final AnimGroup animGroup,
final Label statusLabel,
final float dpiV) {
530 public void windowDestroyNotify(
final WindowEvent e) {
532 if(
null != animator ) {
539 public void keyReleased(
final KeyEvent e) {
540 final short keySym = e.getKeySymbol();
541 if (keySym == KeyEvent.VK_PLUS ||
542 keySym == KeyEvent.VK_ADD)
544 if (e.isShiftDown()) {
545 setVelocity(velocity + 10 / 1000f);
547 setVelocity(velocity + 1 / 1000f);
549 }
else if (keySym == KeyEvent.VK_MINUS ||
550 keySym == KeyEvent.VK_SUBTRACT)
552 if (e.isShiftDown()) {
553 setVelocity(velocity - 10 / 1000f);
555 setVelocity(velocity - 1 / 1000f);
557 }
else if( keySym == KeyEvent.VK_F4 || keySym == KeyEvent.VK_ESCAPE || keySym == KeyEvent.VK_Q ) {
558 MiscUtils.destroyWindow(window);
559 }
else if( keySym == KeyEvent.VK_SPACE ) {
561 }
else if( keySym == KeyEvent.VK_ENTER ) {
568 public void mouseWheelMoved(
final MouseEvent e) {
570 if( e.isControlDown() ) {
572 }
else if( e.isAltDown() ) {
575 final float angle = e.getRotation()[1] < 0f ? FloatUtil.adegToRad(-1f) : FloatUtil.adegToRad(1f);
582 public void init(
final GLAutoDrawable drawable) {
583 System.err.println(JoglVersion.getGLInfo(drawable.getGL(),
null));
586 public void dispose(
final GLAutoDrawable drawable) {}
588 public void display(
final GLAutoDrawable drawable) {
591 final Vec3f euler = rot.
toEuler(
new Vec3f());
592 if( FloatUtil.HALF_PI <= euler.y() ) {
594 }
else if( euler.y() <= -FloatUtil.HALF_PI ) {
597 rot.rotateByAngleY( frame_velocity * dir );
600 final String text = String.format(
"%s, v %.1f mm/s, r %.3f rad/s",
605 public void reshape(
final GLAutoDrawable drawable,
final int x,
final int y,
final int width,
final int height) {}
616 static void sub02AddUItoScene(
final Scene scene,
final AnimGroup animGroup,
final int mainAnimSetIdx,
final GLWindow window)
throws IOException {
617 final AABBox sceneBox = scene.
getBounds();
618 final Group buttonsRight =
new Group();
620 final Font fontButtons = FontFactory.get(FontFactory.UBUNTU).getDefault();
621 final Font fontSymbols = FontFactory.get(FontFactory.SYMBOLS).getDefault();
623 final float buttonWidth = sceneBox.getWidth() * 0.09f;
624 final float buttonHeight = buttonWidth / 3.0f;
626 final Vec2f fixedSymSize =
new Vec2f(0.0f, 1.0f);
627 final Vec2f symSpacing =
new Vec2f(0f, 0.2f);
629 buttonsRight.setLayout(
new GridLayout(buttonWidth, buttonHeight, Alignment.Fill,
new Gap(buttonHeight*0.50f, buttonWidth*0.10f), 7));
631 final Button button =
new Button(options.
renderModes, fontSymbols,
632 fontSymbols.getUTF16String(
"play_arrow"), fontSymbols.getUTF16String(
"pause"),
633 buttonWidth, buttonHeight, buttonZOffset);
634 button.setSpacing(symSpacing, fixedSymSize);
635 button.onToggle((
final Shape s) -> {
636 System.err.println(
"Play/Pause "+s);
637 animGroup.setTickPaused ( s.isToggleOn() );
638 if( s.isToggleOn() ) {
639 animGroup.setTickPaused ( false );
640 if(
null != mPlayer ) {
644 animGroup.setTickPaused ( true );
645 if(
null != mPlayer ) {
646 mPlayer.
pause(
false);
650 button.setToggle(
true);
651 buttonsRight.addShape(button);
654 final Button button =
new Button(options.
renderModes, fontSymbols, fontSymbols.getUTF16String(
"fast_forward"), buttonWidth, buttonHeight, buttonZOffset);
655 button.setSpacing(symSpacing, fixedSymSize);
656 button.addMouseListener(
new Shape.MouseGestureAdapter() {
658 public void mouseClicked(final MouseEvent e) {
659 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
661 as.setAnimationActive(false);
664 buttonsRight.addShape(button);
667 final Button button =
new Button(options.
renderModes, fontSymbols,
668 fontSymbols.getUTF16String(
"rotate_right"), fontSymbols.getUTF16String(
"stop_circle"),
669 buttonWidth, buttonHeight, buttonZOffset);
670 button.setSpacing(symSpacing, fixedSymSize);
671 button.setToggleable(
true);
672 button.onToggle((
final Shape s) -> {
675 buttonsRight.addShape(button);
678 final Button button =
new Button(options.
renderModes, fontButtons,
" < Rot > ", buttonWidth, buttonHeight, buttonZOffset);
679 button.addMouseListener(
new Shape.MouseGestureAdapter() {
681 public void mouseClicked(final MouseEvent e) {
682 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
684 if( e.isControlDown() ) {
686 } else if( e.isAltDown() ) {
689 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
690 rotateShape(animGroup, FloatUtil.adegToRad(1f), axis);
692 rotateShape(animGroup, FloatUtil.adegToRad(-1f), axis);
695 buttonsRight.addShape(button);
698 final Button button =
new Button(options.
renderModes, fontButtons,
" < Velo > ", buttonWidth, buttonHeight, buttonZOffset);
699 button.addMouseListener(
new Shape.MouseGestureAdapter() {
701 public void mouseClicked(final MouseEvent e) {
702 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
703 final float scale = e.isShiftDown() ? 1f : 10f;
704 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
705 setVelocity(velocity - scale / 1000f);
707 setVelocity(velocity + scale / 1000f);
709 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
711 as.setAnimationActive(false);
714 buttonsRight.addShape(button);
717 final Button button =
new Button(options.
renderModes, fontSymbols, fontSymbols.getUTF16String(
"camera"), buttonWidth, buttonHeight, buttonZOffset);
718 button.setSpacing(symSpacing, fixedSymSize);
719 button.addMouseListener(
new Shape.MouseGestureAdapter() {
721 public void mouseClicked(final MouseEvent e) {
722 scene.screenshot(false, scene.nextScreenshotFile(null, UISceneDemo03.class.getSimpleName(), options.renderModes, window.getChosenGLCapabilities(), null));
723 manualScreenShorCount[0]++;
725 buttonsRight.addShape(button);
728 final Button button =
new Button(options.
renderModes, fontSymbols, fontSymbols.getUTF16String(
"power_settings_new"), buttonWidth, buttonHeight, buttonZOffset);
729 button.setSpacing(symSpacing, fixedSymSize);
730 button.setColor(0.7f, 0.3f, 0.3f, 1.0f);
731 button.addMouseListener(
new Shape.MouseGestureAdapter() {
733 public void mouseClicked(final MouseEvent e) {
734 MiscUtils.destroyWindow(window);
736 buttonsRight.addShape(button);
738 TreeTool.forAll(buttonsRight, (
final Shape s) -> { s.setDragAndResizable(
false);
return false; });
740 buttonsRight.moveTo(sceneBox.getWidth()/2f - buttonsRight.getScaledWidth()*1.02f,
741 sceneBox.getHeight()/2f - buttonsRight.getScaledHeight()*1.02f, 0f);
744 System.err.println(
"Buttons-Right: Button-1 "+buttonsRight.getShapes().get(0));
745 System.err.println(
"Buttons-Right: SceneBox "+sceneBox);
746 System.err.println(
"Buttons-Right: scaled "+buttonsRight.getScaledWidth()+
" x "+buttonsRight.getScaledHeight());
747 System.err.println(
"Buttons-Right: Box "+buttonsRight.getBounds());
748 System.err.println(
"Buttons-Right: "+buttonsRight);
764 final float sign = angle >= 0f ? 1f : -1f;
767 case 0: v = euler.x();
break;
768 case 1: v = euler.y();
break;
769 case 2: v = euler.z();
break;
772 final float av = Math.abs(v);
775 angle = 2f * eps * sign;
778 case 0: euler.
add(angle, 0, 0);
break;
779 case 1: euler.
add(0, angle, 0);
break;
780 case 2: euler.
add(0, 0, angle);
break;
782 System.err.println(
"Rot: angleDelta "+angle+
" (eps "+eps+
"): "+eulerOld+
" -> "+euler);
789 System.err.println(
"MediaPlayer.1 AttributesChanges: "+eventMask+
", when "+when);
790 System.err.println(
"MediaPlayer.1 State: "+mp);
792 new InterruptSource.Thread() {
800 System.out.println(
"MediaPlayer.1 "+mp);
801 }
catch (
final Exception e) {
810 boolean destroy =
false;
811 Throwable err =
null;
813 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.EOS) ) {
816 System.err.println(
"MovieSimple State: Exception");
819 new InterruptSource.Thread() {
829 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Error) ) {
835 System.err.println(
"MovieSimple State: Exception");
836 err.printStackTrace();
Abstract Outline shape representation define the method an OutlineShape(s) is bound and rendered.
static String getRenderModeString(final int renderModes)
Returns a unique technical description string for renderModes as follows:
static final int VBAA_RENDERING_BIT
Rendering-Mode bit for Region.
final void setHintBits(final int mask)
The RenderState is owned by RegionRenderer.
static final int BITHINT_GLOBAL_DEPTH_TEST_ENABLED
Bitfield hint, if set stating globally enabled GL#GL_DEPTH_TEST, otherwise disabled.
The optional property jogamp.graph.font.ctor allows user to specify the FontConstructor implementatio...
static final FontSet get(final int font)
Animation-Set covering its ShapeData elements, LerpFunc and animation parameter.
Animation Shapes data covering one Shape of Set.
Sine target LerpFunc, approaching ShapeData's target position utilizing the angular value for sine am...
Default target LerpFunc, approaching ShapeData's target position inclusive angular rotation around gi...
Group of animated Shapes including other static Shapes, optionally utilizing a Group....
final boolean getTickPaused()
final Set addGlyphSetRandom01(final float pixPerMM, final GLProfile glp, final PMVMatrix4f pmv, final Recti viewport, final int renderModes, final Font font, final CharSequence text, final float fontScale, final Vec4f fgCol, final float accel, final float velocity, final float ang_accel, final float ang_velo, final AABBox animBox, final boolean z_only, final Random random, final LerpFunc lerp)
Add a new Set with ShapeData for each GlyphShape, moving towards its target position using a fixed di...
final void removeAnimSets(final GL2ES2 gl, final RegionRenderer renderer, final List< Set > asList)
Removes the given Sets and destroys them, including their ShapeData and Shape.
final Set addGlyphSet(final float pixPerMM, final GLProfile glp, final PMVMatrix4f pmv, final Recti viewport, final int renderModes, final Font font, final char refChar, final CharSequence text, final float fontScale, final float accel, final float velocity, final float ang_accel, final float ang_velo, final LerpFunc lerp, final ShapeSetup op)
Add a new Set with ShapeData for each GlyphShape, moving towards its target position using a generic ...
Set addAnimSet(final float pixPerMM, final GLProfile glp, final PMVMatrix4f pmv, final Recti viewport, final float accel, final float velocity, final float ang_accel, final float ang_velo, final LerpFunc lerp, final Shape refShape)
Add a new Set with an empty ShapeData container.
final Set addGlyphSetHorizScroll01(final float pixPerMM, final GLProfile glp, final PMVMatrix4f pmv, final Recti viewport, final int renderModes, final Font font, final CharSequence text, final float fontScale, final Vec4f fgCol, final float velocity, final AABBox animBox, final float y_offset)
Add a new Set with ShapeData for each GlyphShape, implementing horizontal continuous scrolling while...
Graph based GLRegion Shape.
void addShape(final Shape s)
Adds a Shape.
final void setPMvCullingEnabled(final boolean v)
Enable or disable Project-Modelview (PMv) frustum culling per Shape for this container.
AABBox getBounds(final PMVMatrix4f pmv, final Shape shape)
Returns AABBox dimension of given Shape from this container's perspective, i.e.
void addShape(final Shape s)
Adds a Shape.
final void setClearParams(final float[] clearColor, final int clearMask)
Sets the clear parameter for glClearColor(..) and glClear(..) to be issued at display(GLAutoDrawable)...
RegionRenderer getRenderer()
Returns the associated RegionRenderer.
Shape removeShape(final Shape s)
Removes given shape, w/o Shape#destroy(GL2ES2, RegionRenderer).
final void setPMvCullingEnabled(final boolean v)
Enable or disable Project-Modelview (PMv) frustum culling per Shape for this container.
int setAAQuality(final int v)
Sets RegionRenderer#setAAQuality(int).
void waitUntilDisplayed()
Blocks until first display(GLAutoDrawable) has completed after construction or dispose(GLAutoDrawable...
final Recti getViewport(final Recti target)
Copies the current int[4] viewport in given target and returns it for chaining.
PMVMatrix4f getMatrix()
Borrow the current PMVMatrix4f.
static float getZEpsilon(final int zBits, final PMVMatrixSetup setup)
Default Z precision on 16-bit depth buffer using -1 z-position and DEFAULT_ZNEAR.
AABBox getBounds(final PMVMatrix4f pmv, final Shape shape)
Returns AABBox dimension of given Shape from this container's perspective, i.e.
synchronized void attachInputListenerTo(final GLWindow window)
int getScreenshotCount()
Return the number of nextScreenshotFile(String, String, int, GLCapabilitiesImmutable,...
String getStatusText(final GLAutoDrawable glad, final int renderModes, final float dpi)
Return a formatted status string containing avg fps and avg frame duration.
File nextScreenshotFile(final String dir, final String prefix, final int renderModes, final GLCapabilitiesImmutable caps, final String contentDetail)
Return the unique next technical screenshot PNG File instance as follows:
Generic Shape, potentially using a Graph via GraphShape or other means of representing content.
Shape setColor(final float r, final float g, final float b, final float a)
Set base color.
final Shape move(final float dtx, final float dty, final float dtz)
Move about scaled distance.
final Shape setScale(final Vec3f s)
Set scale factor to given scale.
final Shape setInteractive(final boolean v)
Set whether this shape is interactive in general, i.e.
final Shape setResizable(final boolean resizable)
Set whether this shape is resizable, i.e.
final Shape moveTo(final float tx, final float ty, final float tz)
Move to scaled position.
final float getScaledWidth()
Returns the scaled width of the bounding AABBox for this shape.
final Shape setToggle(final boolean v)
Set this shape's toggle state, default is off.
final AABBox getBounds()
Returns the unscaled bounding AABBox for this shape, borrowing internal instance.
final Quaternion getRotation()
Returns Quaternion for rotation.
final boolean isToggleOn()
Returns true this shape's toggle state.
final Shape validate(final GL2ES2 gl)
Validates the shape's underlying GLRegion.
final Shape setRotation(final Quaternion q)
Sets the rotation Quaternion.
final Shape scale(final Vec3f s)
Multiply current scale factor by given scale.
final Shape setRotationPivot(final float px, final float py, final float pz)
Set unscaled rotation origin, aka pivot.
final Shape setToggleable(final boolean toggleable)
Set this shape toggleable, default is off.
A GraphUI text label GraphShape.
boolean setText(final CharSequence text)
Set the text to be rendered.
A GraphUI rectangle GraphShape.
Basic Float math utility functions.
static final float QUARTER_PI
The value PI/4, i.e.
static final float PI
The value PI, i.e.
static float adegToRad(final float arc_degree)
Converts arc-degree to radians.
static final float HALF_PI
The value PI/2, i.e.
Quaternion implementation supporting Gimbal-Lock free rotations.
Vec3f toEuler(final Vec3f result)
Transform this quaternion to Euler rotation angles in radians (pitchX, yawY and rollZ).
final Quaternion setFromEuler(final Vec3f angradXYZ)
Initializes this quaternion from the given Euler rotation array angradXYZ in radians.
Quaternion rotateByAngleY(final float angle)
Rotate this quaternion around Y axis with the given angle in radians.
Quaternion rotateByAngleZ(final float angle)
Rotate this quaternion around Z axis with the given angle in radians.
3D Vector based upon three float components.
static final Vec3f UNIT_Z
static final Vec3f UNIT_Y
Vec3f add(final float dx, final float dy, final float dz)
this = this + { dx, dy, dz }, returns this.
4D Vector based upon four float components.
Axis Aligned Bounding Box.
final AABBox resizeWidth(final float deltaLeft, final float deltaRight)
Resize width of this AABBox with explicit left- and right delta values.
final Frustum getFrustum()
Returns the frustum, derived from projection x modelview.
Visual output device, i.e.
static float[] mmToInch(final float[] ppmm)
Converts [1/mm] to [1/inch] in place.
NEWT Window events are provided for notification purposes ONLY.
An implementation of GLAutoDrawable and Window interface, using a delegated Window instance,...
final int getSurfaceHeight()
Returns the height of this GLDrawable's surface client area in pixel units.
final boolean isNativeValid()
final void addMouseListener(final MouseListener l)
Appends the given MouseListener to the end of the list.
final void setTitle(final String title)
final float[] getPixelsPerMM(final float[] ppmmStore)
Returns the pixels per millimeter of this window's NativeSurface according to the main monitor's curr...
final void addKeyListener(final KeyListener l)
Appends the given com.jogamp.newt.event.KeyListener to the end of the list.
final int getSurfaceWidth()
Returns the width of this GLDrawable's surface client area in pixel units.
final void setSize(final int width, final int height)
Sets the size of the window's client area in window units, excluding decorations.
final void setVisible(final boolean visible)
Calls setVisible(true, visible), i.e.
final void addWindowListener(final WindowListener l)
Appends the given com.jogamp.newt.event.WindowListener to the end of the list.
static GLWindow create(final GLCapabilitiesImmutable caps)
Creates a new GLWindow attaching a new Window referencing a new default Screen and default Display wi...
Specifies a set of OpenGL capabilities.
Abstraction for an OpenGL rendering context.
final VersionNumberString getGLVersionNumber()
Returns this context OpenGL version.
Specifies the the OpenGL profile.
static JoglVersion getInstance()
StringBuilder toString(final GL gl, StringBuilder sb)
Res independent Shape, Scene attached to GLWindow showing multiple animated shape movements.
static void main(final String[] args)
static void rotateShape(final Shape shape, float angle, final int axis)
Rotate the shape while avoiding 90 degree position.
GLCapabilities getGLCaps()
int fixDefaultAARenderModeWithDPIThreshold(final float dpiV)
Fix default AA rendering bit, forced if having default_aa_setting is true.
int graphAASamples
Sample count for Graph Region AA render-modes: Region#VBAA_RENDERING_BIT or Region#MSAA_RENDERING_BIT...
int graphAAQuality
Pass2 AA-quality rendering for Graph Region AA render-modes: VBAA_RENDERING_BIT.
void parse(final String[] args)
static void waitForKey(final String preMessage)
static int atoi(final String str, final int def)
static void destroyWindow(final GLAutoDrawable glad)
static float atof(final String str, final float def)
final synchronized void add(final GLAutoDrawable drawable)
Adds a drawable to this animator's list of rendering drawables.
final synchronized Thread setExclusiveContext(final Thread t)
Dedicate all GLAutoDrawable's context to the given exclusive context thread.
final void setUpdateFPSFrames(final int frames, final PrintStream out)
final synchronized boolean start()
Starts this animator, if not running.
float getDescent()
Distance from baseline of lowest descender, a negative value.
float getLineGap()
Typographic line gap, a positive value.
Interface wrapper for font implementation.
String getFullFamilyName()
Shall return the family and subfamily name, separated a dash.
AABBox getGlyphBounds(final CharSequence string)
Try using getGlyphBounds(CharSequence, AffineTransform, AffineTransform) to reuse AffineTransform ins...
String toString()
Returns getFullFamilyName().
An animator control interface, which implementation may drive a com.jogamp.opengl....
boolean stop()
Stops this animator.
A higher-level abstraction than GLDrawable which supplies an event based mechanism (GLEventListener) ...
boolean invoke(boolean wait, GLRunnable glRunnable)
Enqueues a one-shot GLRunnable, which will be executed within the next display() call after all regis...
GLAnimatorControl getAnimator()
GL getGL()
Returns the GL pipeline object this GLAutoDrawable uses.
void addGLEventListener(GLEventListener listener)
Adds the given listener to the end of this drawable queue.
GL getGL()
Casts this object to the GL interface.
GLContext getContext()
Returns the GLContext associated which this GL object.
GLProfile getGLProfile()
Returns the GL profile you desire or used by the drawable.
GLCapabilitiesImmutable getChosenGLCapabilities()
Fetches the GLCapabilitiesImmutable corresponding to the chosen OpenGL capabilities (pixel format / v...
void glEnable(int cap)
Entry point to C language function: void {@native glEnable}(GLenum cap) Part of GL_ES_VERSION_2_0,...
String glGetString(int name)
Entry point to C language function: const GLubyte * {@native glGetString}(GLenum name) Part of GL_...
static final int GL_DEPTH_TEST
GL_ES_VERSION_2_0, GL_VERSION_1_1, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_DEPTH_TEST" with expr...
static final int GL_VENDOR
GL_ES_VERSION_2_0, GL_VERSION_1_1, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_VENDOR" with expressi...
static final int GL_BLEND
GL_ES_VERSION_2_0, GL_VERSION_1_1, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_BLEND" with expressio...
static final int GL_DEPTH_BUFFER_BIT
GL_ES_VERSION_2_0, GL_VERSION_1_1, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_DEPTH_BUFFER_BIT" wit...