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.Display;
63import com.jogamp.newt.MonitorDevice;
64import com.jogamp.newt.NewtFactory;
65import com.jogamp.newt.Screen;
66import com.jogamp.newt.Window;
67import com.jogamp.newt.event.KeyAdapter;
68import com.jogamp.newt.event.KeyEvent;
69import com.jogamp.newt.event.MouseAdapter;
70import com.jogamp.newt.event.MouseEvent;
71import com.jogamp.newt.event.WindowAdapter;
72import com.jogamp.newt.event.WindowEvent;
73import com.jogamp.newt.opengl.GLWindow;
74import com.jogamp.opengl.GL;
75import com.jogamp.opengl.GL2ES2;
76import com.jogamp.opengl.GLAnimatorControl;
77import com.jogamp.opengl.GLAutoDrawable;
78import com.jogamp.opengl.GLCapabilities;
79import com.jogamp.opengl.GLContext;
80import com.jogamp.opengl.GLEventListener;
81import com.jogamp.opengl.GLPipelineFactory;
82import com.jogamp.opengl.GLProfile;
83import com.jogamp.opengl.JoglVersion;
84import com.jogamp.opengl.demos.graph.FontSetDemos;
85import com.jogamp.opengl.demos.graph.MSAATool;
86import com.jogamp.opengl.demos.util.CommandlineOptions;
87import com.jogamp.opengl.demos.util.MiscUtils;
88import com.jogamp.opengl.util.Animator;
89import com.jogamp.opengl.util.av.GLMediaPlayer;
90import com.jogamp.opengl.util.av.GLMediaPlayerFactory;
91import com.jogamp.opengl.util.av.GLMediaPlayer.GLMediaEventListener;
92import com.jogamp.opengl.util.caps.NonFSAAGLCapsChooser;
94import jogamp.graph.ui.TreeTool;
118 static final boolean DEBUG =
false;
120 static final String[] originalTexts = {
121 " JOGL, Java™ Binding for the OpenGL® API ",
122 " GraphUI, Resolution Independent Curves ",
123 " JogAmp, Java™ libraries for 3D & Media ",
124 " Linux, Android, Windows, MacOS; iOS, embedded, etc on demand"
127 public static void main(
final String[] args)
throws IOException {
130 if (0 != args.length) {
131 final int[] idx = { 0 };
132 for (idx[0] = 0; idx[0] < args.length; ++idx[0]) {
135 }
else if (args[idx[0]].equals(
"-v")) {
137 demo.setVelocity(
MiscUtils.
atoi(args[idx[0]], (
int) demo.velocity * 1000) / 1000f);
138 }
else if(args[idx[0]].equals(
"-aspeed")) {
139 demo.setVelocity(80/1000f);
141 }
else if(args[idx[0]].equals(
"-rspeed")) {
144 }
else if(args[idx[0]].equals(
"-no_anim_box")) {
145 demo.showAnimBox =
false;
146 }
else if(args[idx[0]].equals(
"-audio")) {
149 demo.audioUri = Uri.cast( args[idx[0]] );
150 }
catch (
final URISyntaxException e1) {
151 System.err.println(e1);
152 demo.audioUri =
null;
162 System.err.println(VersionUtil.getPlatformInfo());
166 System.out.println(
"Requested: " + caps);
179 animator.
add(window);
190 System.err.println(
"Press enter to continue");
203 boolean showAnimBox =
true;
204 float frame_velocity = 5f / 1e3f;
205 float velocity = 30 / 1e3f;
206 float ang_velo = velocity * 60f;
212 final int[] manualScreenShotCount = { 0 };
214 private boolean debug =
false;
215 private boolean trace =
false;
217 private final Font fontButtons, fontSymbols, font, fontStatus;
218 private float dpiV = 96;
219 private float pixPerMM;
220 private float monitorRefresh = 60;
222 private final Scene scene;
223 private final AABBox sceneBox;
224 private float top_ypos = 0;
226 private final AABBox animBox;
227 private final AnimGroup.
Set[] dynAnimSet = {
null,
null,
null };
228 private boolean firstReshape =
true;
229 private boolean z_only =
true;
230 private int txt_idx = 0;
231 private int m_state = -1;
232 private long t0_us = 0;
233 private long t1_pause_us = 0;
239 this(
null, renderModes,
false,
false);
242 private UISceneDemo03(
final String fontfilename,
final int renderModes,
final boolean debug,
final boolean trace) {
243 setVelocity(80/1000f);
249 options.renderModes = renderModes;
259 }
catch (
final IOException ioe) {
260 throw new RuntimeException(ioe);
264 sceneBox =
new AABBox();
268 animGroup =
new AnimGroup(
null);
269 animBox =
new AABBox();
276 void setVelocity(
final float v) {
278 ang_velo = velocity * 60f;
295 final float sign = angle >= 0f ? 1f : -1f;
298 case 0: v = euler.x();
break;
299 case 1: v = euler.y();
break;
300 case 2: v = euler.z();
break;
303 final float av = Math.abs(v);
306 angle = 2f * eps * sign;
309 case 0: euler.
add(angle, 0, 0);
break;
310 case 1: euler.
add(0, angle, 0);
break;
311 case 2: euler.
add(0, 0, angle);
break;
313 System.err.println(
"Rot: angleDelta "+angle+
" (eps "+eps+
"): "+eulerOld+
" -> "+euler);
322 if( upObj instanceof
Window ) {
327 pixPerMM = pixPerXY[1];
331 System.err.println(
"Monitor detected: "+monitor);
332 System.err.println(
"Monitor dpi: "+monitorDPI[0]+
" x "+monitorDPI[1]);
334 System.err.println(
"Surface dpi "+dpiXY[0]+
" x "+dpiXY[1]+
", refresh "+monitorRefresh+
" Hz");
337 monitorRefresh = 60f;
338 System.err.println(
"Using default DPI of "+dpiV+
", refresh "+monitorRefresh+
" Hz");
347 System.err.println(
"FontView01: init (1.1)");
351 System.err.println(
"FontView01: init (1.0)");
362 System.err.println(
"VSync Swap Interval: "+gl.getSwapInterval());
363 System.err.println(
"Chosen: "+glad.getChosenGLCapabilities());
366 gl.setSwapInterval(1);
377 if(
null != audioUri ) {
392 if(
null != mPlayer) {
400 scene.
reshape(glad, x, y, width, height);
401 if( !firstReshape ) {
406 final float sceneBoxFrameWidth = sceneBox.
getWidth() * 0.0025f;
409 r.
setColor(0.45f, 0.45f, 0.45f, 0.9f);
418 animGroup.
scale(0.85f, 0.85f, 1f);
422 animGroup.
scale(1.0f, 1.0f, 1f);
430 System.err.println(
"SceneBox " + sceneBox);
432 System.err.println(
"AnimGroup.0: "+animGroup);
434 final Label statusLabel;
436 final AABBox fbox = fontStatus.
getGlyphBounds(
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
438 System.err.println(
"StatusLabelScale: " + statusLabelScale +
" = " + sceneBox.
getWidth() +
" / " + fbox.
getWidth() +
", " + fbox);
440 statusLabel =
new Label(options.
renderModes, fontStatus,
"Nothing there yet");
441 statusLabel.
setScale(statusLabelScale, statusLabelScale, 1f);
442 statusLabel.
setColor(0.1f, 0.1f, 0.1f, 1.0f);
447 System.err.println(
"UISceneDemo20: init (1.1)");
449 sub01SetupWindowListener(glw, scene, animGroup, statusLabel, dpiV);
452 sub02AddUItoScene(scene, animGroup, 2, glad);
458 System.err.println(
"AnimBox " + animBox);
459 System.err.println(
"AnimGroup.1 " + animGroup);
462 final float fontScale2;
464 final String vs =
"Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... Check out Gamp. XXXXXXXXXXXXXXXXXXXXXXXXXXX";
467 System.err.println(
"FontScale2: " + fontScale2 +
" = " + animBox.
getWidth() +
" / " + fbox.
getWidth());
470 top_ypos = clippedBox.
getMaxY();
474 final String vs =
"Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... Check out Gamp.";
475 top_ypos -= fontScale2 * 1.5f;
477 font, vs, fontScale2,
new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
478 50 / 1e3f , clippedBox, top_ypos);
483 final String vs = VersionUtil.getPlatformInfo().replace(Platform.getNewline(),
"; ").replace(VersionUtil.SEPERATOR,
" *** ").replaceAll(
"\\s+",
" ");
484 top_ypos -= fontScale2 * 1.2f;
486 font, vs, fontScale2,
new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
487 30 / 1e3f , clippedBox, top_ypos);
490 firstReshape =
false;
495 final boolean hadActiveAnimSet =
null != dynAnimSet[0] && dynAnimSet[0].isAnimationActive();
496 if ( 0 == m_state && !hadActiveAnimSet && !animGroup.
getTickPaused() ) {
502 if(
null != dynAnimSet[0] ) {
504 final long t1_us = Clock.currentNanos() / 1000;
505 final float has_dur_s = (t1_us - t0_us) / 1e6f;
506 final String curText = originalTexts[txt_idx];
507 System.err.printf(
"Text travel-duration %.3f s, %d chars%n", has_dur_s, curText.length());
509 t1_pause_us = t1_us + 1500 * 1000;
511 }
else if( 1 == m_state && t1_pause_us <= Clock.currentNanos() / 1000 ) {
514 if( autoSpeed > 0 ) {
515 if( velocity < 60/1000f ) {
516 setVelocity(velocity + 9/1000f);
518 setVelocity(velocity - 9/1000f);
521 }
else if( autoSpeed < 0 ) {
522 if( velocity > 11/1000f ) {
523 setVelocity(velocity - 9/1000f);
525 setVelocity(velocity + 9/1000f);
529 txt_idx = ( txt_idx + 1 ) % originalTexts.length;
532 System.err.println(
"Next animation loop ...");
533 }
else if( -1 == m_state ) {
535 createAnimSets(drawable.
getGL());
536 t0_us = Clock.currentNanos();
542 private void createAnimSets(
final GL gl) {
544 final String curText = originalTexts[txt_idx];
545 final float fontScale;
549 System.err.println(
"FontScale: " + fontScale +
" = " + animBox.
getWidth() +
" / " + fbox.
getWidth());
555 options.
renderModes, font, curText, fontScale,
new Vec4f(0.1f, 0.1f, 0.1f, 1f),
557 animBox, z_only,
new Random(),
new AnimGroup.TargetLerp(
Vec3f.
UNIT_Y));
565 ", GLSL "+ctx.getGLSLVersionNumber().getVersionString() +
567 final float fontScale2;
576 new AnimGroup.SineLerp(z_only ? Vec3f.UNIT_Z : Vec3f.UNIT_Y, 1.618f, 1.618f),
577 (
final AnimGroup.Set as,
final int idx,
final AnimGroup.ShapeData sd) -> {
578 sd.shape.setColor(0.1f, 0.1f, 0.1f, 0.9f);
581 animBox.getMinX() + as.refShape.getScaledWidth() * 1.0f,
582 animBox.getMinY() + as.refShape.getScaledHeight() * 2.0f, 0f);
584 sd.startPos.set( sd.targetPos.x() + animBox.getWidth(),
585 sd.targetPos.y(), sd.targetPos.z());
586 sd.shape.moveTo( sd.startPos );
592 final float size2 = fontScale/2;
593 final float yscale = 1.1f;
594 final GraphShape refShape =
new Rectangle(options.
renderModes, size2, size2*yscale, sceneBox.
getWidth() * 0.0025f );
598 new AnimGroup.TargetLerp(Vec3f.UNIT_Z), refShape);
599 final AnimGroup.ShapeSetup shapeSetup = (
final AnimGroup.Set as,
final int idx,
final AnimGroup.ShapeData sd) -> {
600 sd.targetPos.add(animBox.
getMinX() + as.refShape.getScaledWidth() * 1.0f,
601 top_ypos - as.refShape.getScaledHeight() * 1.5f, 0f);
603 sd.startPos.set( sd.targetPos.x() + animBox.
getWidth(),
604 sd.targetPos.y(), sd.targetPos.z());
605 sd.shape.moveTo( sd.startPos );
607 refShape.setColor(1.0f, 0.0f, 0.0f, 0.9f);
608 refShape.setRotation( refShape.getRotation().rotateByAngleZ(FloatUtil.QUARTER_PI) );
609 dynAnimSet[2].
addShape(animGroup, refShape, shapeSetup);
611 final Shape s =
new Rectangle(options.
renderModes, size2, size2*yscale, sceneBox.
getWidth() * 0.0025f ).validate(hasGLP);
612 s.setColor(0.0f, 1.0f, 0.0f, 0.9f);
613 s.move(refShape.getScaledWidth() * 1.5f * 1, 0, 0);
614 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
617 final Shape s =
new Rectangle(options.
renderModes, size2, size2*yscale, sceneBox.
getWidth() * 0.0025f ).validate(hasGLP);
618 s.setColor(0.0f, 0.0f, 1.0f, 0.9f);
619 s.move(refShape.getScaledWidth() * 1.5f * 2, 0, 0);
620 s.getRotation().rotateByAngleZ(FloatUtil.QUARTER_PI);
621 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
631 void sub01SetupWindowListener(
final GLWindow window,
final Scene scene,
final AnimGroup animGroup,
final Label statusLabel,
final float dpiV) {
632 window.addWindowListener(
new WindowAdapter() {
634 public void windowResized(
final WindowEvent e) {
635 window.setTitle(UISceneDemo03.class.getSimpleName() +
": " + window.getSurfaceWidth() +
" x " + window.getSurfaceHeight());
639 public void windowDestroyNotify(
final WindowEvent e) {
640 final GLAnimatorControl animator = window.getAnimator();
641 if(
null != animator ) {
646 window.addKeyListener(
new KeyAdapter() {
648 public void keyReleased(
final KeyEvent e) {
649 final short keySym = e.getKeySymbol();
650 if (keySym == KeyEvent.VK_PLUS ||
651 keySym == KeyEvent.VK_ADD)
653 if (e.isShiftDown()) {
654 setVelocity(velocity + 10 / 1000f);
656 setVelocity(velocity + 1 / 1000f);
658 }
else if (keySym == KeyEvent.VK_MINUS ||
659 keySym == KeyEvent.VK_SUBTRACT)
661 if (e.isShiftDown()) {
662 setVelocity(velocity - 10 / 1000f);
664 setVelocity(velocity - 1 / 1000f);
666 }
else if( keySym == KeyEvent.VK_F4 || keySym == KeyEvent.VK_ESCAPE || keySym == KeyEvent.VK_Q ) {
667 MiscUtils.destroyWindow(window);
668 }
else if( keySym == KeyEvent.VK_SPACE ) {
669 animGroup.setTickPaused ( !animGroup.getTickPaused() );
670 }
else if( keySym == KeyEvent.VK_ENTER ) {
671 animGroup.stopAnimation();
675 window.addMouseListener(
new MouseAdapter() {
677 public void mouseWheelMoved(
final MouseEvent e) {
679 if( e.isControlDown() ) {
681 }
else if( e.isAltDown() ) {
684 final float angle = e.getRotation()[1] < 0f ? FloatUtil.adegToRad(-1f) : FloatUtil.adegToRad(1f);
685 rotateShape(animGroup, angle, axis);
688 window.addGLEventListener(
new GLEventListener() {
691 public void init(
final GLAutoDrawable drawable) {
692 System.err.println(JoglVersion.getGLInfo(drawable.getGL(),
null));
695 public void dispose(
final GLAutoDrawable drawable) {}
697 public void display(
final GLAutoDrawable drawable) {
698 if( animGroup.isToggleOn() ) {
699 final Quaternion rot = animGroup.getRotation();
700 final Vec3f euler = rot.toEuler(
new Vec3f());
701 if( FloatUtil.HALF_PI <= euler.y() ) {
703 }
else if( euler.y() <= -FloatUtil.HALF_PI ) {
706 rot.rotateByAngleY( frame_velocity * dir );
707 animGroup.setRotation(rot);
709 final String text = String.format(
"%s, v %.1f mm/s, r %.3f rad/s",
710 scene.getStatusText(drawable, options.
renderModes, dpiV), velocity * 1e3f, ang_velo);
711 statusLabel.setText(text);
714 public void reshape(
final GLAutoDrawable drawable,
final int x,
final int y,
final int width,
final int height) {}
724 void sub02AddUItoScene(
final Scene scene,
final AnimGroup animGroup,
final int mainAnimSetIdx,
final GLAutoDrawable glad) {
725 final Group buttonsRight =
new Group();
727 final float buttonWidth = sceneBox.
getWidth() * 0.09f;
728 final float buttonHeight = buttonWidth / 3.0f;
729 final float buttonZOffset = scene.getZEpsilon(16);
730 final Vec2f fixedSymSize =
new Vec2f(0.0f, 1.0f);
731 final Vec2f symSpacing =
new Vec2f(0f, 0.2f);
733 buttonsRight.setLayout(
new GridLayout(buttonWidth, buttonHeight, Alignment.Fill,
new Gap(buttonHeight*0.50f, buttonWidth*0.10f), 8));
735 final Button button =
new Button(options.
renderModes, fontSymbols,
737 buttonWidth, buttonHeight, buttonZOffset);
738 button.setSpacing(symSpacing, fixedSymSize);
739 button.onToggle((
final Shape s) -> {
740 System.err.println(
"Play/Pause "+s);
741 animGroup.setTickPaused ( s.isToggleOn() );
742 if( s.isToggleOn() ) {
743 animGroup.setTickPaused ( false );
744 if(
null != mPlayer ) {
748 animGroup.setTickPaused ( true );
749 if(
null != mPlayer ) {
750 mPlayer.
pause(
false);
754 button.setToggle(
true);
755 buttonsRight.addShape(button);
758 final Button button =
new Button(options.
renderModes, fontSymbols, fontSymbols.
getUTF16String(
"fast_forward"), buttonWidth, buttonHeight, buttonZOffset);
759 button.setSpacing(symSpacing, fixedSymSize);
760 button.addMouseListener(
new Shape.MouseGestureAdapter() {
762 public void mouseClicked(final MouseEvent e) {
763 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
765 as.setAnimationActive(false);
768 buttonsRight.addShape(button);
771 final Button button =
new Button(options.
renderModes, fontSymbols,
773 buttonWidth, buttonHeight, buttonZOffset);
774 button.setSpacing(symSpacing, fixedSymSize);
775 button.setToggleable(
true);
776 button.onToggle((
final Shape s) -> {
779 buttonsRight.addShape(button);
782 final Button button =
new Button(options.
renderModes, fontButtons,
" < Rot > ", buttonWidth, buttonHeight, buttonZOffset);
783 button.addMouseListener(
new Shape.MouseGestureAdapter() {
785 public void mouseClicked(final MouseEvent e) {
786 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
788 if( e.isControlDown() ) {
790 } else if( e.isAltDown() ) {
793 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
794 rotateShape(animGroup, FloatUtil.adegToRad(1f), axis);
796 rotateShape(animGroup, FloatUtil.adegToRad(-1f), axis);
799 buttonsRight.addShape(button);
802 final Button button =
new Button(options.
renderModes, fontButtons,
" < Velo > ", buttonWidth, buttonHeight, buttonZOffset);
803 button.addMouseListener(
new Shape.MouseGestureAdapter() {
805 public void mouseClicked(final MouseEvent e) {
806 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
807 final float scale = e.isShiftDown() ? 1f : 10f;
808 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
809 setVelocity(velocity - scale / 1000f);
811 setVelocity(velocity + scale / 1000f);
813 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
815 as.setAnimationActive(false);
818 buttonsRight.addShape(button);
821 final Button button =
new Button(options.
renderModes, fontButtons,
"increment",
"realtime", buttonWidth, buttonHeight, buttonZOffset);
822 button.onToggle((
final Shape s) -> {
823 animGroup.setFixedPeriod( s.isToggleOn() ? 0 : 1f/monitorRefresh );
824 System.err.println(
"Realtime/Incr "+s+
", period "+animGroup.getFixedPeriod());
826 button.setToggle(
true);
827 buttonsRight.addShape(button);
830 final Button button =
new Button(options.
renderModes, fontSymbols, fontSymbols.
getUTF16String(
"camera"), buttonWidth, buttonHeight, buttonZOffset);
831 button.setSpacing(symSpacing, fixedSymSize);
832 button.addMouseListener(
new Shape.MouseGestureAdapter() {
834 public void mouseClicked(final MouseEvent e) {
835 scene.screenshot(false, scene.nextScreenshotFile(null, UISceneDemo03.class.getSimpleName(), options.renderModes, glad.getChosenGLCapabilities(), null));
836 manualScreenShotCount[0]++;
838 buttonsRight.addShape(button);
841 final Button button =
new Button(options.
renderModes, fontSymbols, fontSymbols.
getUTF16String(
"power_settings_new"), buttonWidth, buttonHeight, buttonZOffset);
842 button.setSpacing(symSpacing, fixedSymSize);
843 button.setColor(0.7f, 0.3f, 0.3f, 1.0f);
844 button.addMouseListener(
new Shape.MouseGestureAdapter() {
846 public void mouseClicked(final MouseEvent e) {
847 MiscUtils.destroyWindow(glad);
849 buttonsRight.addShape(button);
851 TreeTool.forAll(buttonsRight, (
final Shape s) -> { s.setDragAndResizable(
false);
return false; });
852 buttonsRight.validate(glad.getChosenGLCapabilities().getGLProfile());
853 buttonsRight.moveTo(sceneBox.
getWidth()/2f - buttonsRight.getScaledWidth()*1.02f,
854 sceneBox.
getHeight()/2f - buttonsRight.getScaledHeight()*1.02f, 0f);
855 scene.addShape(buttonsRight);
857 System.err.println(
"Buttons-Right: Button-1 "+buttonsRight.getShapes().get(0));
858 System.err.println(
"Buttons-Right: SceneBox "+sceneBox);
859 System.err.println(
"Buttons-Right: scaled "+buttonsRight.getScaledWidth()+
" x "+buttonsRight.getScaledHeight());
860 System.err.println(
"Buttons-Right: Box "+buttonsRight.getBounds());
861 System.err.println(
"Buttons-Right: "+buttonsRight);
865 class MyGLMediaEventListener
implements GLMediaEventListener {
867 public void attributesChanged(
final GLMediaPlayer mp,
final GLMediaPlayer.EventMask eventMask,
final long when) {
868 System.err.println(
"MediaPlayer.1 AttributesChanges: "+eventMask+
", when "+when);
869 System.err.println(
"MediaPlayer.1 State: "+mp);
870 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Init) ) {
871 new InterruptSource.Thread() {
876 if ( GLMediaPlayer.State.Paused == mp.getState() ) {
879 System.out.println(
"MediaPlayer.1 "+mp);
880 }
catch (
final Exception e) {
889 boolean destroy =
false;
890 Throwable err =
null;
892 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.EOS) ) {
895 System.err.println(
"MovieSimple State: Exception");
898 new InterruptSource.Thread() {
908 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Error) ) {
909 err = mp.getStreamException();
914 System.err.println(
"MovieSimple State: Exception");
915 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 optional property jogamp.graph.font.ctor allows user to specify the FontConstructor implementatio...
static final int SYMBOLS
Symbols is the default symbol font family and contains rounded material symbol fonts,...
static final FontSet get(final int font)
static final int UBUNTU
Ubuntu is the default font family, {@value}.
Animation-Set covering its ShapeData elements, LerpFunc and animation parameter.
ShapeData addShape(final AnimGroup g, final Shape s, final ShapeSetup op)
Adds given Shape to this Set and its AnimGroup wrapping it in ShapeData.
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)...
void init(final GLAutoDrawable drawable)
Called by the drawable immediately after the OpenGL context is initialized.
RegionRenderer getRenderer()
Returns the associated 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 dispose(final GLAutoDrawable drawable)
Disposes all added Shapes.
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.
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)
void display(final GLAutoDrawable drawable)
Called by the drawable to initiate OpenGL rendering by the client.
void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height)
Reshape scene using setupMatrix(PMVMatrix4f, int, int, int, int) using PMVMatrixSetup.
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 Shape setToggle(final boolean v)
Set this shape's toggle state, default is off.
final Quaternion getRotation()
Returns Quaternion for rotation.
final Shape validate(final GL2ES2 gl)
Validates the shape's underlying GLRegion.
final Shape setRotation(final Quaternion q)
Sets the rotation Quaternion.
final void destroy(final GL2ES2 gl, final RegionRenderer renderer)
Destroys all data.
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.
A GraphUI rectangle GraphShape.
Basic Float math utility functions.
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.
3D Vector based upon three float components.
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 set(final AABBox o)
Assign values of given AABBox to this instance.
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[] result, final float[] ppmm)
Converts [1/mm] to [1/inch] from ppmm into result.
static float[] inchToMM(final float[] result, final float[] ppinch)
Converts [1/inch] to [1/mm] in place.
final MonitorMode getCurrentMode()
Returns the cached current MonitorMode w/o native query.
final float[] getPixelsPerMM(final float[] ppmmStore)
Returns the pixels per millimeter value according to the current mode's surface resolution.
final float getRefreshRate()
Returns the vertical refresh rate.
static Display createDisplay(final String name)
Create a Display entity.
static Screen createScreen(final Display display, final int index)
Create a Screen entity.
A screen may span multiple MonitorDevices representing their combined virtual size.
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 void setTitle(final String title)
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.
CapabilitiesChooser setCapabilitiesChooser(final CapabilitiesChooser chooser)
Set the CapabilitiesChooser to help determine the native visual type.
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.
abstract GL setGL(GL gl)
Sets the GL pipeline object for this GLContext.
final VersionNumberString getGLVersionNumber()
Returns this context OpenGL version.
Factory for pipelining GL instances.
static final GL create(final String pipelineClazzBaseName, final Class<?> reqInterface, final GL downstream, final Object[] additionalArgs)
Creates a pipelined GL instance using the given downstream downstream and optional arguments addition...
Specifies the the OpenGL profile.
static JoglVersion getInstance()
static StringBuilder getGLInfo(final GL gl, final StringBuilder sb)
StringBuilder toString(final GL gl, StringBuilder sb)
Res independent Shape, Scene attached to GLWindow showing multiple animated shape movements.
static CommandlineOptions options
static void main(final String[] args)
UISceneDemo03(final int renderModes)
void display(final GLAutoDrawable drawable)
Called by the drawable to initiate OpenGL rendering by the client.
void dispose(final GLAutoDrawable drawable)
Notifies the listener to perform the release of all OpenGL resources per GLContext,...
void reshape(final GLAutoDrawable glad, final int x, final int y, final int width, final int height)
Called by the drawable during the first repaint after the component has been resized.
static void rotateShape(final Shape shape, float angle, final int axis)
Rotate the shape while avoiding 90 degree position.
void init(final GLAutoDrawable glad)
Called by the drawable immediately after the OpenGL context is initialized.
GLCapabilities getGLCaps()
int fixDefaultAARenderModeWithDPIThreshold(final float dpiV)
Changes default AA rendering bit if not modified via parse(), i.e.
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 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.
final synchronized boolean stop()
Stops this animator.
Custom GLCapabilitiesChooser, filtering out all full screen anti-aliasing (FSAA, multisample) capabil...
Font getDefault()
Returns the family FAMILY_REGULAR with STYLE_NONE as retrieved with get(int, int).
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...
static String getUTF16String(final char codepoint)
Returns UTF-16 representation of the specified (unicode) codepoint symbol like Character#toChars(int)...
float[] getMaximumSurfaceScale(final float[] result)
Returns the maximum pixel scale of the associated NativeSurface.
float[] getCurrentSurfaceScale(final float[] result)
Returns the current pixel scale of the associated NativeSurface.
Specifying NEWT's Window functionality:
float[] getPixelsPerMM(final float[] ppmmStore)
Returns the pixels per millimeter of this window's NativeSurface according to the main monitor's curr...
MonitorDevice getMainMonitor()
Returns the MonitorDevice with the highest viewport coverage of this window.
A higher-level abstraction than GLDrawable which supplies an event based mechanism (GLEventListener) ...
GL getGL()
Returns the GL pipeline object this GLAutoDrawable uses.
Object getUpstreamWidget()
Method may return the upstream UI toolkit object holding this GLAutoDrawable instance,...
void addGLEventListener(GLEventListener listener)
Adds the given listener to the end of this drawable queue.
GL2ES2 getGL2ES2()
Casts this object to the GL2ES2 interface.
GLProfile getGLProfile()
Returns the GLProfile associated with this GL object.
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...
Declares events which client code can use to manage OpenGL rendering into a GLAutoDrawable.
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_0, GL_VERSION_ES_1_0 Define "GL_DEPTH_TEST" with expression '0x0B71',...
static final int GL_VENDOR
GL_ES_VERSION_2_0, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_VENDOR" with expression '0x1F00',...
static final int GL_DEPTH_BUFFER_BIT
GL_ES_VERSION_2_0, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_DEPTH_BUFFER_BIT" with expression '0x...