JOGL v2.6.0-rc-20250722
JOGL, High-Performance Graphics Binding for Java™ (public API).
UISceneDemo03b.java
Go to the documentation of this file.
1/**
2 * Copyright 2023-2025 JogAmp Community. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification, are
5 * permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice, this list of
8 * conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
15 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 * The views and conclusions contained in the software and documentation are those of the
25 * authors and should not be interpreted as representing official policies, either expressed
26 * or implied, of JogAmp Community.
27 */
28package com.jogamp.opengl.demos.graph.ui;
29
30import java.io.IOException;
31import java.net.URISyntaxException;
32import java.util.Arrays;
33import java.util.Random;
34
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;
93
94import jogamp.graph.ui.TreeTool;
95
96/**
97 * Res independent Shape, Scene attached to GLWindow showing multiple animated shape movements.
98 *
99 * This is a GLEventListener based version of UISceneDemo03, capable to be used with any GLAutoDrawable.
100 *
101 * This variation of {@link UISceneDemo00} shows
102 * - Two repetitive steady scrolling text lines. One text shorter than the line-width and one longer.
103 * - One line of animated rectangles, rotating around their z-axis and accelerating towards their target.
104 * - A text animation assembling one line of text,
105 * each glyph coming from from a random 3D point moving to its destination all at once including rotation.
106 * - One line of text with sine wave animation flattening and accelerating towards its target.
107 *
108 * Blog entry: https://jausoft.com/blog/2023/08/27/graphui_animation_animgroup/
109 *
110 * Commandline options
111 * - Pass '-keep' to main-function to keep running.
112 * - Pass '-aspeed' to vary velocity
113 * - Pass '-rspeed <float>' angular velocity in radians/s
114 * - Pass '-no_anim_box' to not show a visible and shrunken box around the AnimGroup
115 * - Pass '-audio <uri or file-path>' to play audio (only)
116 */
117public class UISceneDemo03b implements GLEventListener {
118 static final boolean DEBUG = false;
119
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"
125 };
126
127 public static void main(final String[] args) throws IOException {
128 final UISceneDemo03b demo = new UISceneDemo03b(0);
129
130 if (0 != args.length) {
131 final int[] idx = { 0 };
132 for (idx[0] = 0; idx[0] < args.length; ++idx[0]) {
133 if( UISceneDemo03b.options.parse(args, idx) ) {
134 continue;
135 } else if (args[idx[0]].equals("-v")) {
136 ++idx[0];
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);
140 demo.autoSpeed = -1;
141 } else if(args[idx[0]].equals("-rspeed")) {
142 ++idx[0];
143 demo.ang_velo = MiscUtils.atof(args[idx[0]], demo.ang_velo);
144 } else if(args[idx[0]].equals("-no_anim_box")) {
145 demo.showAnimBox = false;
146 } else if(args[idx[0]].equals("-audio")) {
147 ++idx[0];
148 try {
149 demo.audioUri = Uri.cast( args[idx[0]] );
150 } catch (final URISyntaxException e1) {
151 System.err.println(e1);
152 demo.audioUri = null;
153 }
154 }
155 }
156 }
157 System.err.println(JoglVersion.getInstance().toString());
158 // renderModes |= Region.COLORCHANNEL_RENDERING_BIT;
159 System.err.println(UISceneDemo03b.options);
160
161 final Display dpy = NewtFactory.createDisplay(null);
162 final Screen screen = NewtFactory.createScreen(dpy, 0);
163 System.err.println(VersionUtil.getPlatformInfo());
164 // System.err.println(JoglVersion.getAllAvailableCapabilitiesInfo(dpy.getGraphicsDevice(), null).toString());
165
167 System.out.println("Requested: " + caps);
168
169 final GLWindow window = GLWindow.create(screen, caps);
172 }
174 window.setTitle(UISceneDemo03b.class.getSimpleName() + ": " + window.getSurfaceWidth() + " x " + window.getSurfaceHeight());
175
176 window.addGLEventListener(demo);
177
178 final Animator animator = new Animator(0 /* w/o AWT */);
179 animator.setUpdateFPSFrames(5*60, null);
180 animator.add(window);
182
183 window.addWindowListener(new WindowAdapter() {
184 @Override
185 public void windowDestroyed(final WindowEvent e) {
186 animator.stop();
187 }
188 });
189
191 System.err.println("Press enter to continue");
192 MiscUtils.waitForKey("Start");
193 }
194
195 window.setVisible(true);
196 System.out.println("Chosen: " + window.getChosenGLCapabilities());
197
198 animator.start();
199 }
200
202 // public static CommandlineOptions options = new CommandlineOptions(1280, 720, Region.NORM_RENDERING_BIT, Region.DEFAULT_AA_QUALITY, 0, 4);
203
204 boolean showAnimBox = true;
205 float frame_velocity = 5f / 1e3f; // [m]/[s]
206 float velocity = 30 / 1e3f; // [m]/[s]
207 float ang_velo = velocity * 60f; // [radians]/[s]
208 int autoSpeed = -1;
209
210 Uri audioUri = null;
211 GLMediaPlayer mPlayer = null;
212
213 final int[] manualScreenShotCount = { 0 };
214
215 private boolean debug = false;
216 private boolean trace = false;
217
218 private final Font fontButtons, fontSymbols, font, fontStatus;
219 private float dpiV = 96;
220 private float pixPerMM;
221
222 private final Scene scene;
223 private final AABBox sceneBox;
224 private float top_ypos = 0;
225 private final AnimGroup animGroup;
226 private final AABBox animBox;
227 private final Animator animator;
228 private final AnimGroup.Set[] dynAnimSet = { null, null, null };
229 private boolean firstReshape = true;
230 private boolean z_only = true;
231 private int txt_idx = 0;
232 private int m_state = -1;
233 private long t0_us = 0;
234 private long t1_pause_us = 0;
235
236 /**
237 * @param renderModes
238 */
239 public UISceneDemo03b(final int renderModes) {
240 this(null, renderModes, false, false);
241 }
242
243 private UISceneDemo03b(final String fontfilename, final int renderModes, final boolean debug, final boolean trace) {
244 setVelocity(80/1000f);
245 autoSpeed = -1;
246
247 this.debug = debug;
248 this.trace = trace;
249
250 UISceneDemo03b.options.renderModes = renderModes;
251
252 try {
255 font = FontFactory.get(IOUtil.getResource("fonts/freefont/FreeSerif.ttf",FontSetDemos.class.getClassLoader(), FontSetDemos.class).getInputStream(), true);
256 // final Font font = FontFactory.get(IOUtil.getResource("jogamp/graph/font/fonts/ubuntu/Ubuntu-R.ttf",FontSetDemos.class.getClassLoader(), FontSetDemos.class).getInputStream(), true);
257 System.err.println("Font FreeSerif: " + font.getFullFamilyName());
258 fontStatus = FontFactory.get(IOUtil.getResource("fonts/freefont/FreeMono.ttf", FontSetDemos.class.getClassLoader(), FontSetDemos.class).getInputStream(), true);
259 System.err.println("Font Status: " + fontStatus.getFullFamilyName());
260 } catch (final IOException ioe) {
261 throw new RuntimeException(ioe);
262 }
263
264 scene = new Scene(options.graphAASamples);
265 sceneBox = new AABBox();
266 scene.setClearParams(new float[] { 1f, 1f, 1f, 1f }, GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
267 scene.getRenderer().setHintBits(RenderState.BITHINT_GLOBAL_DEPTH_TEST_ENABLED);
268
269 animGroup = new AnimGroup(null);
270 animBox = new AABBox();
271 scene.addShape(animGroup);
272
273 scene.setPMvCullingEnabled(true);
274 animGroup.setPMvCullingEnabled(true);
275
276 animator = new Animator(0 /* w/o AWT */);
277 animator.setUpdateFPSFrames(1 * 60, null); // System.err);
278 }
279
280 void setVelocity(final float v) {
281 velocity = v; // Math.max(1/1e3f, v);
282 ang_velo = velocity * 60f;
283 autoSpeed = 0;
284 }
285
286
287 /**
288 * Rotate the shape while avoiding 90 degree position
289 * @param shape the shape to rotate
290 * @param angle the angle in radians
291 * @param axis 0 for X-, 1 for Y- and 2 for Z-axis
292 */
293 public static void rotateShape(final Shape shape, float angle, final int axis) {
294 final Quaternion rot = shape.getRotation().copy();
295 final Vec3f euler = rot.toEuler(new Vec3f());
296 final Vec3f eulerOld = euler.copy();
297
298 final float eps = FloatUtil.adegToRad(5f);
299 final float sign = angle >= 0f ? 1f : -1f;
300 final float v;
301 switch( axis ) {
302 case 0: v = euler.x(); break;
303 case 1: v = euler.y(); break;
304 case 2: v = euler.z(); break;
305 default: return;
306 }
307 final float av = Math.abs(v);
308 if( 1f*FloatUtil.HALF_PI - eps <= av && av <= 1f*FloatUtil.HALF_PI + eps ||
309 3f*FloatUtil.HALF_PI - eps <= av && av <= 3f*FloatUtil.HALF_PI + eps) {
310 angle = 2f * eps * sign;
311 }
312 switch( axis ) {
313 case 0: euler.add(angle, 0, 0); break;
314 case 1: euler.add(0, angle, 0); break;
315 case 2: euler.add(0, 0, angle); break;
316 }
317 System.err.println("Rot: angleDelta "+angle+" (eps "+eps+"): "+eulerOld+" -> "+euler);
318 shape.setRotation( rot.setFromEuler(euler) );
319 }
320
321 @Override
322 public void init(final GLAutoDrawable glad) {
323 // Resolution independent, no screen size
324 //
325 final Object upObj = glad.getUpstreamWidget();
326 if( upObj instanceof Window ) {
327 final Window upWin = (Window)upObj;
328 final MonitorDevice monitor = upWin.getMainMonitor();
329 final float[] monitorDPI = MonitorDevice.mmToInch( monitor.getPixelsPerMM(new float[2]) );
330 final float[] pixPerX = upWin.getPixelsPerMM(new float[2]);
331 pixPerMM = pixPerX[1]; // [px]/[mm]
332 MonitorDevice.mmToInch( pixPerX );
333 dpiV = pixPerX[1];
334 System.err.println("Monitor detected: "+monitor);
335 System.err.println("Monitor dpi: "+monitorDPI[0]+" x "+monitorDPI[1]);
336 System.err.println("Surface scale: native "+Arrays.toString(upWin.getMaximumSurfaceScale(new float[2]))+", current "+Arrays.toString(upWin.getCurrentSurfaceScale(new float[2])));
337 System.err.println("Surface dpi "+pixPerX[0]+" x "+pixPerX[1]);
338 } else {
339 pixPerMM = MonitorDevice.inchToMM(dpiV); // [px]/[mm]
340 System.err.println("Using default DPI of "+dpiV);
341 }
342 {
344 System.err.println("AUTO RenderMode: dpi "+dpiV+", threshold "+options.noAADPIThreshold+
345 ", mode "+Region.getRenderModeString(o)+" -> "+
347 }
348 if(glad instanceof GLWindow) {
349 System.err.println("UISceneDemo20: init (1.1)");
350 final GLWindow glw = (GLWindow) glad;
351 scene.attachInputListenerTo(glw);
352 } else {
353 System.err.println("UISceneDemo20: init (1.0)");
354 }
355
356 GL2ES2 gl = glad.getGL().getGL2ES2();
357 if(debug) {
358 gl = gl.getContext().setGL( GLPipelineFactory.create("com.jogamp.opengl.Debug", null, gl, null) ).getGL2ES2();
359 }
360 if(trace) {
361 gl = gl.getContext().setGL( GLPipelineFactory.create("com.jogamp.opengl.Trace", null, gl, new Object[] { System.err } ) ).getGL2ES2();
362 }
363 System.err.println(JoglVersion.getGLInfo(gl, null, false /* withCapsAndExts */).toString());
364 System.err.println("VSync Swap Interval: "+gl.getSwapInterval());
365 System.err.println("Chosen: "+glad.getChosenGLCapabilities());
366 MSAATool.dump(glad);
367
368 gl.setSwapInterval(1);
369 gl.glEnable(GL.GL_DEPTH_TEST);
370 // gl.glDepthFunc(GL.GL_LEQUAL);
371 // gl.glEnable(GL.GL_BLEND);
372
374 scene.init(glad);
375
376 //
377 // Optional Audio
378 //
379 if( null != audioUri ) {
381 mPlayer.addEventListener( new MyGLMediaEventListener() );
383 } else {
384 mPlayer = null;
385 }
386
387 firstReshape = true;
388 }
389
390 @Override
391 public void dispose(final GLAutoDrawable drawable) {
392 animGroup.destroy(drawable.getGL().getGL2ES2(), scene.getRenderer());
393 scene.dispose(drawable);
394 if(null != mPlayer) {
395 mPlayer.destroy(drawable.getGL());
396 mPlayer = null;
397 }
398 }
399
400 @Override
401 public void reshape(final GLAutoDrawable glad, final int x, final int y, final int width, final int height) {
402 scene.reshape(glad, x, y, width, height);
403 if( !firstReshape ) {
404 return; // done
405 }
406
407 sceneBox.set( scene.getBounds() );
408 final float sceneBoxFrameWidth = sceneBox.getWidth() * 0.0025f;
409 final GraphShape r = new Rectangle(options.renderModes, sceneBox, sceneBoxFrameWidth);
410 if( showAnimBox ) {
411 r.setColor(0.45f, 0.45f, 0.45f, 0.9f);
412 } else {
413 r.setColor(0f, 0f, 0f, 0f);
414 }
415 r.setInteractive(false);
416 animGroup.addShape( r );
417
418 animGroup.setRotationPivot(0, 0, 0);
419 if( showAnimBox ) {
420 animGroup.scale(0.85f, 0.85f, 1f);
421 animGroup.move(-sceneBox.getWidth()/2f*0.075f, 0f, 0f);
422 animGroup.setRotation( animGroup.getRotation().rotateByAngleY(0.1325f) );
423 } else {
424 animGroup.scale(1.0f, 1.0f, 1f);
425 }
426 final GLProfile hasGLP = glad.getChosenGLCapabilities().getGLProfile();
427 animGroup.validate(hasGLP);
428 animGroup.setInteractive(false);
429 animGroup.setToggleable(true);
430 animGroup.setResizable(false);
431 animGroup.setToggle( false );
432 System.err.println("SceneBox " + sceneBox);
433 System.err.println("Frustum " + scene.getMatrix().getFrustum());
434 System.err.println("AnimGroup.0: "+animGroup);
435
436 final Label statusLabel;
437 {
438 final AABBox fbox = fontStatus.getGlyphBounds("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
439 final float statusLabelScale = sceneBox.getWidth() / fbox.getWidth();
440 System.err.println("StatusLabelScale: " + statusLabelScale + " = " + sceneBox.getWidth() + " / " + fbox.getWidth() + ", " + fbox);
441
442 statusLabel = new Label(options.renderModes, fontStatus, "Nothing there yet");
443 statusLabel.setScale(statusLabelScale, statusLabelScale, 1f);
444 statusLabel.setColor(0.1f, 0.1f, 0.1f, 1.0f);
445 statusLabel.moveTo(sceneBox.getMinX(), sceneBox.getMinY() + statusLabelScale * (fontStatus.getMetrics().getLineGap() - fontStatus.getMetrics().getDescent()), 0f);
446 scene.addShape(statusLabel);
447 }
448 if(glad instanceof GLWindow) {
449 System.err.println("UISceneDemo20: init (1.1)");
450 final GLWindow glw = (GLWindow) glad;
451 sub01SetupWindowListener(glw, scene, animGroup, statusLabel, dpiV);
452 }
453 // HUD UI
454 sub02AddUItoScene(scene, animGroup, 2, glad);
455
456 //
457 // Setup the moving glyphs
458 //
459 animBox.set( animGroup.getBounds() );
460 System.err.println("AnimBox " + animBox);
461 System.err.println("AnimGroup.1 " + animGroup);
462
463 top_ypos = 0;
464 final float fontScale2;
465 {
466 final String vs = "Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... Check out Gamp. XXXXXXXXXXXXXXXXXXXXXXXXXXX";
467 final AABBox fbox = font.getGlyphBounds(vs);
468 fontScale2 = animBox.getWidth() / fbox.getWidth();
469 System.err.println("FontScale2: " + fontScale2 + " = " + animBox.getWidth() + " / " + fbox.getWidth());
470 }
471 final AABBox clippedBox = new AABBox(animBox).resizeWidth(-sceneBoxFrameWidth, -sceneBoxFrameWidth);
472 top_ypos = clippedBox.getMaxY();
473 // AnimGroup.Set 1:
474 // Circular short scrolling text (right to left) without rotation, no acceleration
475 {
476 final String vs = "Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... Check out Gamp.";
477 top_ypos -= fontScale2 * 1.5f;
478 animGroup.addGlyphSetHorizScroll01(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(), options.renderModes,
479 font, vs, fontScale2, new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
480 50 / 1e3f /* velocity */, clippedBox, top_ypos);
481 }
482 // AnimGroup.Set 2:
483 // Circular long scrolling text (right to left) without rotation, no acceleration
484 {
485 final String vs = VersionUtil.getPlatformInfo().replace(Platform.getNewline(), "; ").replace(VersionUtil.SEPERATOR, " *** ").replaceAll("\\s+", " ");
486 top_ypos -= fontScale2 * 1.2f;
487 animGroup.addGlyphSetHorizScroll01(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(), options.renderModes,
488 font, vs, fontScale2, new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
489 30 / 1e3f /* velocity */, clippedBox, top_ypos);
490 }
491
492 firstReshape = false;
493 }
494
495 @Override
496 public void display(final GLAutoDrawable drawable) {
497 final boolean hadActiveAnimSet = null != dynAnimSet[0] && dynAnimSet[0].isAnimationActive();
498 if ( 0 == m_state && !hadActiveAnimSet && !animGroup.getTickPaused() ) {
499 //
500 // Setup new animation sequence
501 // - Flush all AnimGroup.Set entries
502 // - Add newly created AnimGroup.Set entries
503 //
504 if( null != dynAnimSet[0] ) {
505 // Print stats and set pause 1.5s
506 final long t1_us = Clock.currentNanos() / 1000;
507 final float has_dur_s = (t1_us - t0_us) / 1e6f; // [us]
508 final String curText = originalTexts[txt_idx];
509 System.err.printf("Text travel-duration %.3f s, %d chars%n", has_dur_s, curText.length());
510 if( scene.getScreenshotCount() - manualScreenShotCount[0] < 1 + originalTexts.length ) {
511 scene.screenshot(true, scene.nextScreenshotFile(null, UISceneDemo03b.class.getSimpleName(), options.renderModes, drawable.getChosenGLCapabilities(), null));
512 }
513 m_state = 1;
514 t1_pause_us = t1_us + 1500 * 1000;
515 }
516 } else if( 1 == m_state && t1_pause_us <= Clock.currentNanos() / 1000 ) {
517 // Flush all AnimGroup.Set entries and prep param for next cycle
518 animGroup.removeAnimSets(drawable.getGL().getGL2ES2(), scene.getRenderer(), Arrays.asList(dynAnimSet));
519 if( autoSpeed > 0 ) {
520 if( velocity < 60/1000f ) {
521 setVelocity(velocity + 9/1000f);
522 } else {
523 setVelocity(velocity - 9/1000f);
524 autoSpeed = -1;
525 }
526 } else if( autoSpeed < 0 ) {
527 if( velocity > 11/1000f ) {
528 setVelocity(velocity - 9/1000f);
529 } else {
530 setVelocity(velocity + 9/1000f);
531 autoSpeed = 1;
532 }
533 }
534 txt_idx = ( txt_idx + 1 ) % originalTexts.length;
535 z_only = !z_only;
536 m_state = -1;
537 System.err.println("Next animation loop ...");
538 } else if( -1 == m_state ) {
539 // Add newly created AnimGroup.Set entries
540 createAnimSets(drawable.getGL());
541 t0_us = Clock.currentNanos();
542 m_state = 0;
543 }
544 scene.display(drawable);
545 }
546
547 private void createAnimSets(final GL gl) {
548 final GLProfile hasGLP = gl.getGLProfile();
549 final String curText = originalTexts[txt_idx];
550 final float fontScale;
551 {
552 final AABBox fbox = font.getGlyphBounds(curText);
553 fontScale = animBox.getWidth() / fbox.getWidth();
554 System.err.println("FontScale: " + fontScale + " = " + animBox.getWidth() + " / " + fbox.getWidth());
555 }
556
557 // AnimGroup.Set 3: This `mainAnimSet[0]` is controlling overall animation duration
558 // Rotating animated text moving to target (right to left) + slight acceleration on rotation
559 dynAnimSet[0] = animGroup.addGlyphSetRandom01(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(),
560 options.renderModes, font, curText, fontScale, new Vec4f(0.1f, 0.1f, 0.1f, 1f),
561 0f /* accel */, velocity, FloatUtil.PI/20f /* ang_accel */, ang_velo,
562 animBox, z_only, new Random(), new AnimGroup.TargetLerp(Vec3f.UNIT_Y));
563
564 // AnimGroup.Set 4:
565 // Sine animated text moving to target (right to left) with sine amplitude alternating on Z- and Y-axis + acceleration
566 {
567 final GLContext ctx = gl.getContext();
568 final String vs = "JogAmp Version "+JoglVersion.getInstance().getImplementationVersion()+
569 ", GL "+ctx.getGLVersionNumber().getVersionString()+
570 ", GLSL "+ctx.getGLSLVersionNumber().getVersionString() +
571 " by "+gl.glGetString(GL.GL_VENDOR);
572 final float fontScale2;
573 {
574 final AABBox fbox = font.getGlyphBounds(vs);
575 fontScale2 = animBox.getWidth() / fbox.getWidth() * 0.6f;
576 }
577 // Translation : We use velocity as acceleration (good match) and pass only velocity/10 as starting velocity
578 dynAnimSet[1] = animGroup.addGlyphSet(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(),
579 options.renderModes, font, 'X', vs, fontScale2,
580 velocity /* accel */, velocity/10f, 0f /* ang_accel */, 2*FloatUtil.PI /* 1-rotation/s */,
581 new AnimGroup.SineLerp(z_only ? Vec3f.UNIT_Z : Vec3f.UNIT_Y, 1.618f, 1.618f),
582 (final AnimGroup.Set as, final int idx, final AnimGroup.ShapeData sd) -> {
583 sd.shape.setColor(0.1f, 0.1f, 0.1f, 0.9f);
584
585 sd.targetPos.add(
586 animBox.getMinX() + as.refShape.getScaledWidth() * 1.0f,
587 animBox.getMinY() + as.refShape.getScaledHeight() * 2.0f, 0f);
588
589 sd.startPos.set( sd.targetPos.x() + animBox.getWidth(),
590 sd.targetPos.y(), sd.targetPos.z());
591 sd.shape.moveTo( sd.startPos );
592 } );
593 }
594 // AnimGroup.Set 5:
595 // 3 animated Shapes moving to target (right to left) while rotating around z-axis + acceleration on translation
596 {
597 final float size2 = fontScale/2;
598 final float yscale = 1.1f;
599 final GraphShape refShape = new Rectangle(options.renderModes, size2, size2*yscale, sceneBox.getWidth() * 0.0025f );
600 dynAnimSet[2] = animGroup.addAnimSet(
601 pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(),
602 velocity /* accel */, velocity/10f, 0f /* ang_accel */, 2*FloatUtil.PI /* 1-rotation/s */,
603 new AnimGroup.TargetLerp(Vec3f.UNIT_Z), refShape);
604 final AnimGroup.ShapeSetup shapeSetup = (final AnimGroup.Set as, final int idx, final AnimGroup.ShapeData sd) -> {
605 sd.targetPos.add(animBox.getMinX() + as.refShape.getScaledWidth() * 1.0f,
606 top_ypos - as.refShape.getScaledHeight() * 1.5f, 0f);
607
608 sd.startPos.set( sd.targetPos.x() + animBox.getWidth(),
609 sd.targetPos.y(), sd.targetPos.z());
610 sd.shape.moveTo( sd.startPos );
611 };
612 refShape.setColor(1.0f, 0.0f, 0.0f, 0.9f);
613 refShape.setRotation( refShape.getRotation().rotateByAngleZ(FloatUtil.QUARTER_PI) );
614 dynAnimSet[2].addShape(animGroup, refShape, shapeSetup);
615 {
616 final Shape s = new Rectangle(options.renderModes, size2, size2*yscale, sceneBox.getWidth() * 0.0025f ).validate(hasGLP);
617 s.setColor(0.0f, 1.0f, 0.0f, 0.9f);
618 s.move(refShape.getScaledWidth() * 1.5f * 1, 0, 0);
619 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
620 }
621 {
622 final Shape s = new Rectangle(options.renderModes, size2, size2*yscale, sceneBox.getWidth() * 0.0025f ).validate(hasGLP);
623 s.setColor(0.0f, 0.0f, 1.0f, 0.9f);
624 s.move(refShape.getScaledWidth() * 1.5f * 2, 0, 0);
625 s.getRotation().rotateByAngleZ(FloatUtil.QUARTER_PI);
626 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
627 }
628 }
629 }
630
631 /**
632 * Setup Window listener for I/O
633 * @param window
634 * @param animGroup
635 */
636 void sub01SetupWindowListener(final GLWindow window, final Scene scene, final AnimGroup animGroup, final Label statusLabel, final float dpiV) {
637 window.addWindowListener(new WindowAdapter() {
638 @Override
639 public void windowResized(final WindowEvent e) {
640 window.setTitle(UISceneDemo03b.class.getSimpleName() + ": " + window.getSurfaceWidth() + " x " + window.getSurfaceHeight());
641 }
642
643 @Override
644 public void windowDestroyNotify(final WindowEvent e) {
645 final GLAnimatorControl animator = window.getAnimator();
646 if( null != animator ) {
647 animator.stop();
648 }
649 }
650 });
651 window.addKeyListener(new KeyAdapter() {
652 @Override
653 public void keyReleased(final KeyEvent e) {
654 final short keySym = e.getKeySymbol();
655 if (keySym == KeyEvent.VK_PLUS ||
656 keySym == KeyEvent.VK_ADD)
657 {
658 if (e.isShiftDown()) {
659 setVelocity(velocity + 10 / 1000f);
660 } else {
661 setVelocity(velocity + 1 / 1000f);
662 }
663 } else if (keySym == KeyEvent.VK_MINUS ||
664 keySym == KeyEvent.VK_SUBTRACT)
665 {
666 if (e.isShiftDown()) {
667 setVelocity(velocity - 10 / 1000f);
668 } else {
669 setVelocity(velocity - 1 / 1000f);
670 }
671 } else if( keySym == KeyEvent.VK_F4 || keySym == KeyEvent.VK_ESCAPE || keySym == KeyEvent.VK_Q ) {
672 MiscUtils.destroyWindow(window);
673 } else if( keySym == KeyEvent.VK_SPACE ) {
674 animGroup.setTickPaused ( !animGroup.getTickPaused() );
675 } else if( keySym == KeyEvent.VK_ENTER ) {
676 animGroup.stopAnimation();
677 }
678 }
679 });
680 window.addMouseListener( new MouseAdapter() {
681 @Override
682 public void mouseWheelMoved(final MouseEvent e) {
683 int axis = 1;
684 if( e.isControlDown() ) {
685 axis = 0;
686 } else if( e.isAltDown() ) {
687 axis = 2;
688 }
689 final float angle = e.getRotation()[1] < 0f ? FloatUtil.adegToRad(-1f) : FloatUtil.adegToRad(1f);
690 rotateShape(animGroup, angle, axis);
691 }
692 });
693 window.addGLEventListener(new GLEventListener() {
694 float dir = 1f;
695 @Override
696 public void init(final GLAutoDrawable drawable) {
697 System.err.println(JoglVersion.getGLInfo(drawable.getGL(), null));
698 }
699 @Override
700 public void dispose(final GLAutoDrawable drawable) {}
701 @Override
702 public void display(final GLAutoDrawable drawable) {
703 if( animGroup.isToggleOn() ) {
704 final Quaternion rot = animGroup.getRotation();
705 final Vec3f euler = rot.toEuler(new Vec3f());
706 if( FloatUtil.HALF_PI <= euler.y() ) {
707 dir = -1f;
708 } else if( euler.y() <= -FloatUtil.HALF_PI ) {
709 dir = 1f;
710 }
711 rot.rotateByAngleY( frame_velocity * dir );
712 animGroup.setRotation(rot);
713 }
714 final String text = String.format("%s, v %.1f mm/s, r %.3f rad/s",
715 scene.getStatusText(drawable, options.renderModes, dpiV), velocity * 1e3f, ang_velo);
716 statusLabel.setText(text);
717 }
718 @Override
719 public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {}
720 });
721 }
722
723 /**
724 * Add a HUD UI to the scene
725 * @param scene
726 * @param animGroup
727 * @param glad
728 */
729 void sub02AddUItoScene(final Scene scene, final AnimGroup animGroup, final int mainAnimSetIdx, final GLAutoDrawable glad) {
730 final Group buttonsRight = new Group();
731
732 final float buttonWidth = sceneBox.getWidth() * 0.09f;
733 final float buttonHeight = buttonWidth / 3.0f;
734 final float buttonZOffset = scene.getZEpsilon(16);
735 final Vec2f fixedSymSize = new Vec2f(0.0f, 1.0f);
736 final Vec2f symSpacing = new Vec2f(0f, 0.2f);
737
738 buttonsRight.setLayout(new GridLayout(buttonWidth, buttonHeight, Alignment.Fill, new Gap(buttonHeight*0.50f, buttonWidth*0.10f), 7));
739 {
740 final Button button = new Button(options.renderModes, fontSymbols,
741 fontSymbols.getUTF16String("play_arrow"), fontSymbols.getUTF16String("pause"),
742 buttonWidth, buttonHeight, buttonZOffset);
743 button.setSpacing(symSpacing, fixedSymSize);
744 button.onToggle((final Shape s) -> {
745 System.err.println("Play/Pause "+s);
746 animGroup.setTickPaused ( s.isToggleOn() );
747 if( s.isToggleOn() ) {
748 animGroup.setTickPaused ( false );
749 if( null != mPlayer ) {
750 mPlayer.resume();
751 }
752 } else {
753 animGroup.setTickPaused ( true );
754 if( null != mPlayer ) {
755 mPlayer.pause(false);
756 }
757 }
758 });
759 button.setToggle(true); // on == play
760 buttonsRight.addShape(button);
761 }
762 {
763 final Button button = new Button(options.renderModes, fontSymbols, fontSymbols.getUTF16String("fast_forward"), buttonWidth, buttonHeight, buttonZOffset); // next (ffwd)
764 button.setSpacing(symSpacing, fixedSymSize);
765 button.addMouseListener(new Shape.MouseGestureAdapter() {
766 @Override
767 public void mouseClicked(final MouseEvent e) {
768 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
769 if( null != as ) {
770 as.setAnimationActive(false);
771 }
772 } } );
773 buttonsRight.addShape(button);
774 }
775 {
776 final Button button = new Button(options.renderModes, fontSymbols,
777 fontSymbols.getUTF16String("rotate_right"), fontSymbols.getUTF16String("stop_circle"),
778 buttonWidth, buttonHeight, buttonZOffset); // rotate (replay)
779 button.setSpacing(symSpacing, fixedSymSize);
780 button.setToggleable(true);
781 button.onToggle((final Shape s) -> {
782 animGroup.toggle();
783 });
784 buttonsRight.addShape(button);
785 }
786 {
787 final Button button = new Button(options.renderModes, fontButtons, " < Rot > ", buttonWidth, buttonHeight, buttonZOffset);
788 button.addMouseListener(new Shape.MouseGestureAdapter() {
789 @Override
790 public void mouseClicked(final MouseEvent e) {
791 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
792 int axis = 1;
793 if( e.isControlDown() ) {
794 axis = 0;
795 } else if( e.isAltDown() ) {
796 axis = 2;
797 }
798 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
799 rotateShape(animGroup, FloatUtil.adegToRad(1f), axis);
800 } else {
801 rotateShape(animGroup, FloatUtil.adegToRad(-1f), axis);
802 }
803 } } );
804 buttonsRight.addShape(button);
805 }
806 {
807 final Button button = new Button(options.renderModes, fontButtons, " < Velo > ", buttonWidth, buttonHeight, buttonZOffset);
808 button.addMouseListener(new Shape.MouseGestureAdapter() {
809 @Override
810 public void mouseClicked(final MouseEvent e) {
811 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
812 final float scale = e.isShiftDown() ? 1f : 10f;
813 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
814 setVelocity(velocity - scale / 1000f);
815 } else {
816 setVelocity(velocity + scale / 1000f);
817 }
818 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
819 if( null != as ) {
820 as.setAnimationActive(false);
821 }
822 } } );
823 buttonsRight.addShape(button);
824 }
825 {
826 final Button button = new Button(options.renderModes, fontSymbols, fontSymbols.getUTF16String("camera"), buttonWidth, buttonHeight, buttonZOffset); // snapshot (camera)
827 button.setSpacing(symSpacing, fixedSymSize);
828 button.addMouseListener(new Shape.MouseGestureAdapter() {
829 @Override
830 public void mouseClicked(final MouseEvent e) {
831 scene.screenshot(false, scene.nextScreenshotFile(null, UISceneDemo03b.class.getSimpleName(), options.renderModes, glad.getChosenGLCapabilities(), null));
832 manualScreenShotCount[0]++;
833 } } );
834 buttonsRight.addShape(button);
835 }
836 {
837 final Button button = new Button(options.renderModes, fontSymbols, fontSymbols.getUTF16String("power_settings_new"), buttonWidth, buttonHeight, buttonZOffset); // exit (power_settings_new)
838 button.setSpacing(symSpacing, fixedSymSize);
839 button.setColor(0.7f, 0.3f, 0.3f, 1.0f);
840 button.addMouseListener(new Shape.MouseGestureAdapter() {
841 @Override
842 public void mouseClicked(final MouseEvent e) {
843 MiscUtils.destroyWindow(glad);
844 } } );
845 buttonsRight.addShape(button);
846 }
847 TreeTool.forAll(buttonsRight, (final Shape s) -> { s.setDragAndResizable(false); return false; });
848 buttonsRight.validate(glad.getChosenGLCapabilities().getGLProfile());
849 buttonsRight.moveTo(sceneBox.getWidth()/2f - buttonsRight.getScaledWidth()*1.02f,
850 sceneBox.getHeight()/2f - buttonsRight.getScaledHeight()*1.02f, 0f);
851 scene.addShape(buttonsRight);
852 if( DEBUG ) {
853 System.err.println("Buttons-Right: Button-1 "+buttonsRight.getShapes().get(0));
854 System.err.println("Buttons-Right: SceneBox "+sceneBox);
855 System.err.println("Buttons-Right: scaled "+buttonsRight.getScaledWidth()+" x "+buttonsRight.getScaledHeight());
856 System.err.println("Buttons-Right: Box "+buttonsRight.getBounds());
857 System.err.println("Buttons-Right: "+buttonsRight);
858 }
859 }
860
861 class MyGLMediaEventListener implements GLMediaEventListener {
862 @Override
863 public void attributesChanged(final GLMediaPlayer mp, final GLMediaPlayer.EventMask eventMask, final long when) {
864 System.err.println("MediaPlayer.1 AttributesChanges: "+eventMask+", when "+when);
865 System.err.println("MediaPlayer.1 State: "+mp);
866 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Init) ) {
867 new InterruptSource.Thread() {
868 @Override
869 public void run() {
870 try {
871 mp.initGL(null);
872 if ( GLMediaPlayer.State.Paused == mp.getState() ) { // init OK
873 mp.resume();
874 }
875 System.out.println("MediaPlayer.1 "+mp);
876 } catch (final Exception e) {
877 e.printStackTrace();
878 mp.destroy(null);
879 mPlayer = null;
880 return;
881 }
882 }
883 }.start();
884 }
885 boolean destroy = false;
886 Throwable err = null;
887
888 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.EOS) ) {
889 err = mp.getStreamException();
890 if( null != err ) {
891 System.err.println("MovieSimple State: Exception");
892 destroy = true;
893 } else {
894 new InterruptSource.Thread() {
895 @Override
896 public void run() {
897 mp.setPlaySpeed(1f);
898 mp.seek(0);
899 mp.resume();
900 }
901 }.start();
902 }
903 }
904 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Error) ) {
905 err = mp.getStreamException();
906 destroy = true;;
907 }
908 if( destroy ) {
909 if( null != err ) {
910 System.err.println("MovieSimple State: Exception");
911 err.printStackTrace();
912 }
913 mp.destroy(null);
914 mPlayer = null;
915 }
916 }
917 }
918
919}
Abstract Outline shape representation define the method an OutlineShape(s) is bound and rendered.
Definition: Region.java:62
static String getRenderModeString(final int renderModes)
Returns a unique technical description string for renderModes as follows:
Definition: Region.java:251
static final int VBAA_RENDERING_BIT
Rendering-Mode bit for Region.
Definition: Region.java:115
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.
Definition: AnimGroup.java:98
ShapeData addShape(final AnimGroup g, final Shape s, final ShapeSetup op)
Adds given Shape to this Set and its AnimGroup wrapping it in ShapeData.
Definition: AnimGroup.java:169
Group of animated Shapes including other static Shapes, optionally utilizing a Group....
Definition: AnimGroup.java:60
final boolean getTickPaused()
Definition: AnimGroup.java:539
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...
Definition: AnimGroup.java:450
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.
Definition: AnimGroup.java:261
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 ...
Definition: AnimGroup.java:369
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.
Definition: AnimGroup.java:324
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...
Definition: AnimGroup.java:493
Graph based GLRegion Shape.
Definition: GraphShape.java:55
void addShape(final Shape s)
Adds a Shape.
Definition: Group.java:225
final void setPMvCullingEnabled(final boolean v)
Enable or disable Project-Modelview (PMv) frustum culling per Shape for this container.
Definition: Group.java:346
AABBox getBounds(final PMVMatrix4f pmv, final Shape shape)
Returns AABBox dimension of given Shape from this container's perspective, i.e.
Definition: Group.java:686
GraphUI Scene.
Definition: Scene.java:103
void addShape(final Shape s)
Adds a Shape.
Definition: Scene.java:292
final void setClearParams(final float[] clearColor, final int clearMask)
Sets the clear parameter for glClearColor(..) and glClear(..) to be issued at display(GLAutoDrawable)...
Definition: Scene.java:226
void init(final GLAutoDrawable drawable)
Called by the drawable immediately after the OpenGL context is initialized.
Definition: Scene.java:412
RegionRenderer getRenderer()
Returns the associated RegionRenderer.
Definition: Scene.java:213
final void setPMvCullingEnabled(final boolean v)
Enable or disable Project-Modelview (PMv) frustum culling per Shape for this container.
Definition: Scene.java:235
int setAAQuality(final int v)
Sets RegionRenderer#setAAQuality(int).
Definition: Scene.java:388
void dispose(final GLAutoDrawable drawable)
Disposes all added Shapes.
Definition: Scene.java:610
final Recti getViewport(final Recti target)
Copies the current int[4] viewport in given target and returns it for chaining.
Definition: Scene.java:775
PMVMatrix4f getMatrix()
Borrow the current PMVMatrix4f.
Definition: Scene.java:786
AABBox getBounds(final PMVMatrix4f pmv, final Shape shape)
Returns AABBox dimension of given Shape from this container's perspective, i.e.
Definition: Scene.java:683
synchronized void attachInputListenerTo(final GLWindow window)
Definition: Scene.java:251
int getScreenshotCount()
Return the number of nextScreenshotFile(String, String, int, GLCapabilitiesImmutable,...
Definition: Scene.java:1454
void display(final GLAutoDrawable drawable)
Called by the drawable to initiate OpenGL rendering by the client.
Definition: Scene.java:492
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.
Definition: Scene.java:463
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:
Definition: Scene.java:1441
Generic Shape, potentially using a Graph via GraphShape or other means of representing content.
Definition: Shape.java:87
Shape setColor(final float r, final float g, final float b, final float a)
Set base color.
Definition: Shape.java:1389
final Shape move(final float dtx, final float dty, final float dtz)
Move about scaled distance.
Definition: Shape.java:557
final Shape setScale(final Vec3f s)
Set scale factor to given scale.
Definition: Shape.java:641
final Shape setInteractive(final boolean v)
Set whether this shape is interactive in general, i.e.
Definition: Shape.java:1711
final Shape setResizable(final boolean resizable)
Set whether this shape is resizable, i.e.
Definition: Shape.java:1769
final Shape moveTo(final float tx, final float ty, final float tz)
Move to scaled position.
Definition: Shape.java:543
final Shape setToggle(final boolean v)
Set this shape's toggle state, default is off.
Definition: Shape.java:1587
final Quaternion getRotation()
Returns Quaternion for rotation.
Definition: Shape.java:595
final Shape validate(final GL2ES2 gl)
Validates the shape's underlying GLRegion.
Definition: Shape.java:850
final Shape setRotation(final Quaternion q)
Sets the rotation Quaternion.
Definition: Shape.java:604
final void destroy(final GL2ES2 gl, final RegionRenderer renderer)
Destroys all data.
Definition: Shape.java:457
final Shape scale(final Vec3f s)
Multiply current scale factor by given scale.
Definition: Shape.java:661
final Shape setRotationPivot(final float px, final float py, final float pz)
Set unscaled rotation origin, aka pivot.
Definition: Shape.java:620
final Shape setToggleable(final boolean toggleable)
Set this shape toggleable, default is off.
Definition: Shape.java:1573
A GraphUI text label GraphShape.
Definition: Label.java:50
A GraphUI rectangle GraphShape.
Definition: Rectangle.java:47
Basic Float math utility functions.
Definition: FloatUtil.java:83
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.
Definition: Quaternion.java:45
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.
Definition: Vec3f.java:37
static final Vec3f UNIT_Y
Definition: Vec3f.java:41
Vec3f add(final float dx, final float dy, final float dz)
this = this + { dx, dy, dz }, returns this.
Definition: Vec3f.java:239
4D Vector based upon four float components.
Definition: Vec4f.java:37
Axis Aligned Bounding Box.
Definition: AABBox.java:54
final float getWidth()
Definition: AABBox.java:879
final AABBox set(final AABBox o)
Assign values of given AABBox to this instance.
Definition: AABBox.java:262
final float getHeight()
Definition: AABBox.java:883
final AABBox resizeWidth(final float deltaLeft, final float deltaRight)
Resize width of this AABBox with explicit left- and right delta values.
Definition: AABBox.java:218
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.
final float[] getPixelsPerMM(final float[] ppmmStore)
Returns the pixels per millimeter value according to the current mode's surface resolution.
static float[] inchToMM(final float[] ppinch)
Converts [1/inch] to [1/mm] in place.
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.
Definition: Screen.java:58
NEWT Window events are provided for notification purposes ONLY.
An implementation of GLAutoDrawable and Window interface, using a delegated Window instance,...
Definition: GLWindow.java:121
final int getSurfaceHeight()
Returns the height of this GLDrawable's surface client area in pixel units.
Definition: GLWindow.java:466
final void setTitle(final String title)
Definition: GLWindow.java:297
final int getSurfaceWidth()
Returns the width of this GLDrawable's surface client area in pixel units.
Definition: GLWindow.java:461
final void setSize(final int width, final int height)
Sets the size of the window's client area in window units, excluding decorations.
Definition: GLWindow.java:625
final void setVisible(final boolean visible)
Calls setVisible(true, visible), i.e.
Definition: GLWindow.java:615
final void addWindowListener(final WindowListener l)
Appends the given com.jogamp.newt.event.WindowListener to the end of the list.
Definition: GLWindow.java:882
CapabilitiesChooser setCapabilitiesChooser(final CapabilitiesChooser chooser)
Set the CapabilitiesChooser to help determine the native visual type.
Definition: GLWindow.java:261
static GLWindow create(final GLCapabilitiesImmutable caps)
Creates a new GLWindow attaching a new Window referencing a new default Screen and default Display wi...
Definition: GLWindow.java:169
Specifies a set of OpenGL capabilities.
Abstraction for an OpenGL rendering context.
Definition: GLContext.java:74
abstract GL setGL(GL gl)
Sets the GL pipeline object for this GLContext.
final VersionNumberString getGLVersionNumber()
Returns this context OpenGL version.
Definition: GLContext.java:781
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.
Definition: GLProfile.java:77
static JoglVersion getInstance()
static StringBuilder getGLInfo(final GL gl, final StringBuilder sb)
StringBuilder toString(final GL gl, StringBuilder sb)
static void dump(final GLAutoDrawable drawable)
Definition: MSAATool.java:51
Res independent Shape, Scene attached to GLWindow showing multiple animated shape movements.
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.
void display(final GLAutoDrawable drawable)
Called by the drawable to initiate OpenGL rendering by the client.
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.
void dispose(final GLAutoDrawable drawable)
Notifies the listener to perform the release of all OpenGL resources per GLContext,...
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.
static void waitForKey(final String preMessage)
Definition: MiscUtils.java:167
static int atoi(final String str, final int def)
Definition: MiscUtils.java:60
static float atof(final String str, final float def)
Definition: MiscUtils.java:78
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.
Definition: Animator.java:344
final synchronized boolean stop()
Stops this animator.
Definition: Animator.java:368
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.
Definition: Font.java:60
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)...
Definition: Font.java:338
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:
Definition: Window.java:115
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_1, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_DEPTH_TEST" with expr...
Definition: GL.java:43
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...
Definition: GL.java:607
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...
Definition: GL.java:738
GLMediaPlayer interface specifies a TextureSequence state machine using a multiplexed audio/video str...
State pause(boolean flush)
Pauses the StreamWorker decoding thread.
State destroy(GL gl)
Releases the GL, stream and other resources, including attached user objects.
static final int STREAM_ID_NONE
Constant {@value} for mute or not available.
static final int TEXTURE_COUNT_DEFAULT
Default texture count, value {@value}.
void playStream(Uri streamLoc, int vid, int aid, int sid, int textureCount)
Issues asynchronous stream initialization.
void addEventListener(GLMediaEventListener l)
Adds a GLMediaEventListener to this player.
StreamException getStreamException()
Returns the StreamException caught in the decoder thread, or null if none occured.
State resume()
Starts or resumes the StreamWorker decoding thread.
static final int STREAM_ID_AUTO
Constant {@value} for auto or unspecified.