JOGL v2.6.0-rc-20250706
JOGL, High-Performance Graphics Binding for Java™ (public API).
UISceneDemo03.java
Go to the documentation of this file.
1/**
2 * Copyright 2023 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.util.IOUtil;
38import com.jogamp.common.util.InterruptSource;
39import com.jogamp.graph.curve.Region;
40import com.jogamp.graph.font.Font;
41import com.jogamp.graph.font.FontFactory;
42import com.jogamp.graph.ui.GraphShape;
43import com.jogamp.graph.ui.Group;
44import com.jogamp.graph.ui.Scene;
45import com.jogamp.graph.ui.Shape;
46import com.jogamp.graph.ui.AnimGroup;
47import com.jogamp.graph.ui.layout.Alignment;
48import com.jogamp.graph.ui.layout.Gap;
49import com.jogamp.graph.ui.layout.GridLayout;
50import com.jogamp.graph.ui.shapes.Button;
51import com.jogamp.graph.ui.shapes.Label;
52import com.jogamp.graph.ui.shapes.Rectangle;
53import com.jogamp.math.FloatUtil;
54import com.jogamp.math.Quaternion;
55import com.jogamp.math.Vec2f;
56import com.jogamp.math.Vec3f;
57import com.jogamp.math.Vec4f;
58import com.jogamp.math.geom.AABBox;
59import com.jogamp.newt.MonitorDevice;
60import com.jogamp.newt.event.KeyAdapter;
61import com.jogamp.newt.event.KeyEvent;
62import com.jogamp.newt.event.MouseAdapter;
63import com.jogamp.newt.event.MouseEvent;
64import com.jogamp.newt.event.WindowAdapter;
65import com.jogamp.newt.event.WindowEvent;
66import com.jogamp.newt.opengl.GLWindow;
67import com.jogamp.opengl.GL;
68import com.jogamp.opengl.GL2ES2;
69import com.jogamp.opengl.GLAnimatorControl;
70import com.jogamp.opengl.GLAutoDrawable;
71import com.jogamp.opengl.GLCapabilities;
72import com.jogamp.opengl.GLEventListener;
73import com.jogamp.opengl.GLProfile;
74import com.jogamp.opengl.JoglVersion;
75import com.jogamp.opengl.demos.graph.FontSetDemos;
76import com.jogamp.opengl.demos.util.CommandlineOptions;
77import com.jogamp.opengl.demos.util.MiscUtils;
78import com.jogamp.opengl.util.Animator;
79import com.jogamp.opengl.util.av.GLMediaPlayer;
80import com.jogamp.opengl.util.av.GLMediaPlayerFactory;
81import com.jogamp.opengl.util.av.GLMediaPlayer.GLMediaEventListener;
82
83import jogamp.graph.ui.TreeTool;
84
85/**
86 * Res independent Shape, Scene attached to GLWindow showing multiple animated shape movements.
87 * <p>
88 * This variation of {@link UISceneDemo00} shows
89 * <ul>
90 * <li>Two repetitive steady scrolling text lines. One text shorter than the line-width and one longer.</li>
91 * <li>One line of animated rectangles, rotating around their z-axis and accelerating towards their target.</li>
92 * <li>A text animation assembling one line of text,
93 * each glyph coming from from a random 3D point moving to its destination all at once including rotation.</li>
94 * <li>One line of text with sine wave animation flattening and accelerating towards its target.</li>
95 * </ul>
96 * </p>
97 * <p>
98 * Blog entry: https://jausoft.com/blog/2023/08/27/graphui_animation_animgroup/
99 * </p>
100 * <p>
101 * - Pass '-keep' to main-function to keep running.
102 * - Pass '-aspeed' to vary velocity
103 * - Pass '-rspeed <float>' angular velocity in radians/s
104 * - Pass '-no_anim_box' to not show a visible and shrunken box around the AnimGroup
105 * - Pass '-audio <uri or file-path>' to play audio (only)
106 * </p>
107 */
108public class UISceneDemo03 {
109 static final boolean DEBUG = false;
110
111 static final String[] originalTexts = {
112 " JOGL, Java™ Binding for the OpenGL® API ",
113 " GraphUI, Resolution Independent Curves ",
114 " JogAmp, Java™ libraries for 3D & Media "
115 };
116
117 static CommandlineOptions options = new CommandlineOptions(1280, 720, Region.VBAA_RENDERING_BIT);
118 static float frame_velocity = 5f / 1e3f; // [m]/[s]
119 static float velocity = 30 / 1e3f; // [m]/[s]
120 static float ang_velo = velocity * 60f; // [radians]/[s]
121 static int autoSpeed = -1;
122
123 static Uri audioUri = null;
124 static GLMediaPlayer mPlayer = null;
125
126 static final int[] manualScreenShorCount = { 0 };
127
128 static void setVelocity(final float v) {
129 velocity = v; // Math.max(1/1e3f, v);
130 ang_velo = velocity * 60f;
131 autoSpeed = 0;
132 }
133
134 public static void main(final String[] args) throws IOException {
135 setVelocity(80/1000f);
136 autoSpeed = -1;
137 options.keepRunning = true;
138 boolean showAnimBox = true;
139
140 if (0 != args.length) {
141 final int[] idx = { 0 };
142 for (idx[0] = 0; idx[0] < args.length; ++idx[0]) {
143 if( options.parse(args, idx) ) {
144 continue;
145 } else if (args[idx[0]].equals("-v")) {
146 ++idx[0];
147 setVelocity(MiscUtils.atoi(args[idx[0]], (int) velocity * 1000) / 1000f);
148 } else if(args[idx[0]].equals("-aspeed")) {
149 setVelocity(80/1000f);
150 autoSpeed = -1;
151 options.keepRunning = true;
152 } else if(args[idx[0]].equals("-rspeed")) {
153 ++idx[0];
154 ang_velo = MiscUtils.atof(args[idx[0]], ang_velo);
155 } else if(args[idx[0]].equals("-no_anim_box")) {
156 showAnimBox = false;
157 } else if(args[idx[0]].equals("-audio")) {
158 ++idx[0];
159 try {
160 audioUri = Uri.cast( args[idx[0]] );
161 } catch (final URISyntaxException e1) {
162 System.err.println(e1);
163 audioUri = null;
164 }
165 }
166 }
167 }
168 System.err.println(JoglVersion.getInstance().toString());
169 // renderModes |= Region.COLORCHANNEL_RENDERING_BIT;
170 System.err.println(options);
171
172 final GLCapabilities reqCaps = options.getGLCaps();
173 System.out.println("Requested: " + reqCaps);
174
175 //
176 // Resolution independent, no screen size
177 //
178 final Font font = FontFactory.get(IOUtil.getResource("fonts/freefont/FreeSerif.ttf",FontSetDemos.class.getClassLoader(), FontSetDemos.class).getInputStream(), true);
179 // final Font font = FontFactory.get(IOUtil.getResource("jogamp/graph/font/fonts/ubuntu/Ubuntu-R.ttf",FontSetDemos.class.getClassLoader(), FontSetDemos.class).getInputStream(), true);
180 System.err.println("Font FreeSerif: " + font.getFullFamilyName());
181 final Font fontStatus = FontFactory.get(IOUtil.getResource("fonts/freefont/FreeMono.ttf", FontSetDemos.class.getClassLoader(), FontSetDemos.class).getInputStream(), true);
182 System.err.println("Font Status: " + fontStatus.getFullFamilyName());
183
184 final Scene scene = new Scene(options.graphAASamples);
185 scene.setClearParams(new float[] { 1f, 1f, 1f, 1f }, GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
186
187 final AnimGroup animGroup = new AnimGroup(null);
188 scene.addShape(animGroup);
189
190 scene.setPMvCullingEnabled(true);
191 animGroup.setPMvCullingEnabled(true);
192
193 final Animator animator = new Animator(0 /* w/o AWT */);
194 animator.setUpdateFPSFrames(1 * 60, null); // System.err);
195
196 final GLWindow window = GLWindow.create(reqCaps);
197 window.invoke(false, (final GLAutoDrawable glad) -> {
198 glad.getGL().setSwapInterval(options.swapInterval);
199 return true;
200 } );
201 window.setSize(options.surface_width, options.surface_height);
202 window.setTitle(UISceneDemo03.class.getSimpleName() + ": " + window.getSurfaceWidth() + " x " + window.getSurfaceHeight());
203 window.setVisible(true);
204 window.addGLEventListener(scene);
205 scene.attachInputListenerTo(window);
206
207 final float pixPerMM, dpiV;
208 {
209 final float[] tmp = window.getPixelsPerMM(new float[2]);
210 pixPerMM = tmp[0]; // [px]/[mm]
211 final float[] sDPI = MonitorDevice.perMMToPerInch( tmp );
212 dpiV = sDPI[1];
213 }
214
215 animator.add(window);
216 animator.setExclusiveContext(options.exclusiveContext);
217 animator.start();
218
219 //
220 // After initial display we can use screen resolution post initial
221 // Scene.reshape(..)
222 // However, in this example we merely use the resolution to
223 // - Compute the animation values with DPI
224 scene.waitUntilDisplayed();
225
226 window.invoke(true, (drawable) -> {
227 final GL gl = drawable.getGL();
229 // gl.glDepthFunc(GL.GL_LEQUAL);
230 // gl.glEnable(GL.GL_BLEND);
231 return true;
232 });
233
234 final GLProfile hasGLP = window.getChosenGLCapabilities().getGLProfile();
235 final AABBox sceneBox = scene.getBounds();
236 final float sceneBoxFrameWidth;
237 {
238 sceneBoxFrameWidth = sceneBox.getWidth() * 0.0025f;
239 final GraphShape r = new Rectangle(options.renderModes, sceneBox, sceneBoxFrameWidth);
240 if( showAnimBox ) {
241 r.setColor(0.45f, 0.45f, 0.45f, 0.9f);
242 } else {
243 r.setColor(0f, 0f, 0f, 0f);
244 }
245 r.setInteractive(false);
246 animGroup.addShape( r );
247 }
248 animGroup.setRotationPivot(0, 0, 0);
249 if( showAnimBox ) {
250 animGroup.scale(0.85f, 0.85f, 1f);
251 animGroup.move(-sceneBox.getWidth()/2f*0.075f, 0f, 0f);
252 animGroup.setRotation( animGroup.getRotation().rotateByAngleY(0.1325f) );
253 } else {
254 animGroup.scale(1.0f, 1.0f, 1f);
255 }
256 animGroup.validate(hasGLP);
257 animGroup.setInteractive(false);
258 animGroup.setToggleable(true);
259 animGroup.setResizable(false);
260 animGroup.setToggle( false );
261 System.err.println("SceneBox " + sceneBox);
262 System.err.println("Frustum " + scene.getMatrix().getFrustum());
263 System.err.println("AnimGroup.0: "+animGroup);
264
265 final Label statusLabel;
266 {
267 final AABBox fbox = fontStatus.getGlyphBounds("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
268 final float statusLabelScale = sceneBox.getWidth() / fbox.getWidth();
269 System.err.println("StatusLabelScale: " + statusLabelScale + " = " + sceneBox.getWidth() + " / " + fbox.getWidth() + ", " + fbox);
270
271 statusLabel = new Label(options.renderModes, fontStatus, "Nothing there yet");
272 statusLabel.setScale(statusLabelScale, statusLabelScale, 1f);
273 statusLabel.setColor(0.1f, 0.1f, 0.1f, 1.0f);
274 statusLabel.moveTo(sceneBox.getMinX(), sceneBox.getMinY() + statusLabelScale * (fontStatus.getMetrics().getLineGap() - fontStatus.getMetrics().getDescent()), 0f);
275 scene.addShape(statusLabel);
276 }
277 sub01SetupWindowListener(window, scene, animGroup, statusLabel, dpiV);
278
279 {
280 final StringBuilder sb = new StringBuilder();
281 for(final String s : originalTexts) {
282 sb.append(s).append("\n");
283 }
284 final Label l = new Label(options.renderModes, font, sb.toString()); // originalTexts[0]);
285 l.validate(hasGLP);
286 final float scale = sceneBox.getWidth() / l.getBounds().getWidth();
287 l.setScale(scale, scale, 1f);
288 l.setColor(0.1f, 0.1f, 0.1f, 1.0f);
289 l.moveTo(sceneBox.getMinX(), 0f, 0f);
290 scene.addShape(l);
291
292 if( options.wait_to_start ) {
293 statusLabel.setText("Press enter to continue");
294 MiscUtils.waitForKey("Start");
295 }
296
297 window.invoke(true, (drawable) -> {
298 final GL2ES2 gl = drawable.getGL().getGL2ES2();
299 scene.screenshot(gl, scene.nextScreenshotFile(null, UISceneDemo03.class.getSimpleName(), options.renderModes, window.getChosenGLCapabilities(), null));
300 scene.removeShape(gl, l);
301 return true;
302 });
303 }
304
305 //
306 // HUD UI
307 //
308 sub02AddUItoScene(scene, animGroup, 2, window);
309
310 //
311 // Setup the moving glyphs
312 //
313 final boolean[] z_only = { true };
314 int txt_idx = 0;
315
316 final AABBox animBox = new AABBox( animGroup.getBounds() );
317 final float g_w = animBox.getWidth();
318 System.err.println("AnimBox " + animBox);
319 System.err.println("AnimGroup.1 " + animGroup);
320
321 final float[] y_pos = { 0 };
322 window.invoke(true, (drawable) -> {
323 final float fontScale2;
324 {
325 final String vs = "Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... Bremerhaven 19°C, Munich";
326 final AABBox fbox = font.getGlyphBounds(vs);
327 fontScale2 = g_w / fbox.getWidth();
328 System.err.println("FontScale2: " + fontScale2 + " = " + g_w + " / " + fbox.getWidth());
329 }
330 final AABBox clippedBox = new AABBox(animBox).resizeWidth(-sceneBoxFrameWidth, -sceneBoxFrameWidth);
331 y_pos[0] = clippedBox.getMaxY();
332 // AnimGroup.Set 1:
333 // Circular short scrolling text (right to left) without rotation, no acceleration
334 {
335 final String vs = "Welcome to Göthel Software *** Jausoft *** https://jausoft.com *** We do software ... ";
336 y_pos[0] -= fontScale2 * 1.5f;
337 animGroup.addGlyphSetHorizScroll01(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(), options.renderModes,
338 font, vs, fontScale2, new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
339 50 / 1e3f /* velocity */, clippedBox, y_pos[0]);
340 }
341 // AnimGroup.Set 2:
342 // Circular long scrolling text (right to left) without rotation, no acceleration
343 {
344 final String vs = "Berlin 23°C, London 20°C, Paris 22°C, Madrid 26°C, Lisbon 28°C, Moscow 22°C, Prag 22°C, Bremerhaven 19°C, Munich 25°C, Fukushima 40°C, Bejing 30°C, Rome 29°C, Beirut 28°C, Damaskus 29°C *** ";
345 y_pos[0] -= fontScale2 * 1.2f;
346 animGroup.addGlyphSetHorizScroll01(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(), options.renderModes,
347 font, vs, fontScale2, new Vec4f(0.1f, 0.1f, 0.1f, 0.9f),
348 30 / 1e3f /* velocity */, clippedBox, y_pos[0]);
349 }
350 return true;
351 });
352
353 //
354 // Optional Audio
355 //
356 if( null != audioUri ) {
358 mPlayer.addEventListener( new MyGLMediaEventListener() );
360 } else {
361 mPlayer = null;
362 }
363
364 do {
365 System.err.println();
366 System.err.println("Next animation loop ...");
367 //
368 // Setup new animation sequence
369 // - Flush all AnimGroup.Set entries
370 // - Add newly created AnimGroup.Set entries
371 //
372 final String curText = originalTexts[txt_idx];
373 final float fontScale;
374 final AnimGroup.Set[] dynAnimSet = { null, null, null };
375 {
376 final AABBox fbox = font.getGlyphBounds(curText);
377 fontScale = g_w / fbox.getWidth();
378 System.err.println("FontScale: " + fontScale + " = " + g_w + " / " + fbox.getWidth());
379 }
380 z_only[0] = !z_only[0];
381 window.invoke(true, (drawable) -> {
382 // AnimGroup.Set 3: This `mainAnimSet[0]` is controlling overall animation duration
383 // Rotating animated text moving to target (right to left) + slight acceleration on rotation
384 dynAnimSet[0] = animGroup.addGlyphSetRandom01(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(),
385 options.renderModes, font, curText, fontScale, new Vec4f(0.1f, 0.1f, 0.1f, 1f),
386 0f /* accel */, velocity, FloatUtil.PI/20f /* ang_accel */, ang_velo,
387 animBox, z_only[0], new Random(), new AnimGroup.TargetLerp(Vec3f.UNIT_Y));
388
389 // AnimGroup.Set 4:
390 // Sine animated text moving to target (right to left) with sine amplitude alternating on Z- and Y-axis + acceleration
391 {
392 final GL gl = drawable.getGL();
393
394 final String vs = "JogAmp Version "+JoglVersion.getInstance().getImplementationVersion()+", "+gl.glGetString(GL.GL_VERSION)+", "+gl.glGetString(GL.GL_VENDOR);
395 final float fontScale2;
396 {
397 final AABBox fbox = font.getGlyphBounds(vs);
398 fontScale2 = g_w / fbox.getWidth() * 0.6f;
399 }
400 // Translation : We use velocity as acceleration (good match) and pass only velocity/10 as starting velocity
401 dynAnimSet[1] = animGroup.addGlyphSet(pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(),
402 options.renderModes, font, 'X', vs, fontScale2,
403 velocity /* accel */, velocity/10f, 0f /* ang_accel */, 2*FloatUtil.PI /* 1-rotation/s */,
404 new AnimGroup.SineLerp(z_only[0] ? Vec3f.UNIT_Z : Vec3f.UNIT_Y, 1.618f, 1.618f),
405 (final AnimGroup.Set as, final int idx, final AnimGroup.ShapeData sd) -> {
406 sd.shape.setColor(0.1f, 0.1f, 0.1f, 0.9f);
407
408 sd.targetPos.add(
409 animBox.getMinX() + as.refShape.getScaledWidth() * 1.0f,
410 animBox.getMinY() + as.refShape.getScaledHeight() * 2.0f, 0f);
411
412 sd.startPos.set( sd.targetPos.x() + animBox.getWidth(),
413 sd.targetPos.y(), sd.targetPos.z());
414 sd.shape.moveTo( sd.startPos );
415 } );
416 }
417 // AnimGroup.Set 5:
418 // 3 animated Shapes moving to target (right to left) while rotating around z-axis + acceleration on translation
419 {
420 final float size2 = fontScale/2;
421 final float yscale = 1.1f;
422 final GraphShape refShape = new Rectangle(options.renderModes, size2, size2*yscale, sceneBox.getWidth() * 0.0025f );
423 dynAnimSet[2] = animGroup.addAnimSet(
424 pixPerMM, hasGLP, scene.getMatrix(), scene.getViewport(),
425 velocity /* accel */, velocity/10f, 0f /* ang_accel */, 2*FloatUtil.PI /* 1-rotation/s */,
426 new AnimGroup.TargetLerp(Vec3f.UNIT_Z), refShape);
427 final AnimGroup.ShapeSetup shapeSetup = (final AnimGroup.Set as, final int idx, final AnimGroup.ShapeData sd) -> {
428 sd.targetPos.add(animBox.getMinX() + as.refShape.getScaledWidth() * 1.0f,
429 y_pos[0] - as.refShape.getScaledHeight() * 1.5f, 0f);
430
431 sd.startPos.set( sd.targetPos.x() + animBox.getWidth(),
432 sd.targetPos.y(), sd.targetPos.z());
433 sd.shape.moveTo( sd.startPos );
434 };
435 refShape.setColor(1.0f, 0.0f, 0.0f, 0.9f);
437 dynAnimSet[2].addShape(animGroup, refShape, shapeSetup);
438 {
439 final Shape s = new Rectangle(options.renderModes, size2, size2*yscale, sceneBox.getWidth() * 0.0025f ).validate(hasGLP);
440 s.setColor(0.0f, 1.0f, 0.0f, 0.9f);
441 s.move(refShape.getScaledWidth() * 1.5f * 1, 0, 0);
442 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
443 }
444 {
445 final Shape s = new Rectangle(options.renderModes, size2, size2*yscale, sceneBox.getWidth() * 0.0025f ).validate(hasGLP);
446 s.setColor(0.0f, 0.0f, 1.0f, 0.9f);
447 s.move(refShape.getScaledWidth() * 1.5f * 2, 0, 0);
449 dynAnimSet[2].addShape(animGroup, s, shapeSetup);
450 }
451 }
452 return true;
453 });
454 scene.setAAQuality(options.graphAAQuality);
455
456 final long t0_us = Clock.currentNanos() / 1000; // [us]
457 while ( ( null == dynAnimSet[0] || dynAnimSet[0].isAnimationActive() || animGroup.getTickPaused() ) && window.isNativeValid() ) {
458 try { Thread.sleep(250); } catch (final InterruptedException e1) { }
459 }
460 if( window.isNativeValid() ) {
461 final float has_dur_s = ((Clock.currentNanos() / 1000) - t0_us) / 1e6f; // [us]
462 System.err.printf("Text travel-duration %.3f s, %d chars%n", has_dur_s, curText.length());
463 if( scene.getScreenshotCount() - manualScreenShorCount[0] < 1 + originalTexts.length ) {
464 scene.screenshot(true, scene.nextScreenshotFile(null, UISceneDemo03.class.getSimpleName(), options.renderModes, window.getChosenGLCapabilities(), null));
465 }
466 try { Thread.sleep(1500); } catch (final InterruptedException e1) { }
467 while ( animGroup.getTickPaused() && window.isNativeValid() ) {
468 try { Thread.sleep(250); } catch (final InterruptedException e1) { }
469 }
470 if( autoSpeed > 0 ) {
471 if( velocity < 60/1000f ) {
472 setVelocity(velocity + 9/1000f);
473 } else {
474 setVelocity(velocity - 9/1000f);
475 autoSpeed = -1;
476 }
477 } else if( autoSpeed < 0 ) {
478 if( velocity > 11/1000f ) {
479 setVelocity(velocity - 9/1000f);
480 } else {
481 setVelocity(velocity + 9/1000f);
482 autoSpeed = 1;
483 }
484 }
485 txt_idx = ( txt_idx + 1 ) % originalTexts.length;
486 }
487 if( window.isNativeValid() ) {
488 window.invoke(true, (drawable) -> {
489 animGroup.removeAnimSets(drawable.getGL().getGL2ES2(), scene.getRenderer(), Arrays.asList(dynAnimSet));
490 return true;
491 } );
492 }
493 } while (options.keepRunning && window.isNativeValid());
494 if (!options.stayOpen) {
495 MiscUtils.destroyWindow(window);
496 }
497 }
498
499 /**
500 * Setup Window listener for I/O
501 * @param window
502 * @param animGroup
503 */
504 static void sub01SetupWindowListener(final GLWindow window, final Scene scene, final AnimGroup animGroup, final Label statusLabel, final float dpiV) {
505 window.addWindowListener(new WindowAdapter() {
506 @Override
507 public void windowResized(final WindowEvent e) {
508 window.setTitle(UISceneDemo03.class.getSimpleName() + ": " + window.getSurfaceWidth() + " x " + window.getSurfaceHeight());
509 }
510
511 @Override
512 public void windowDestroyNotify(final WindowEvent e) {
513 final GLAnimatorControl animator = window.getAnimator();
514 if( null != animator ) {
515 animator.stop();
516 }
517 }
518 });
519 window.addKeyListener(new KeyAdapter() {
520 @Override
521 public void keyReleased(final KeyEvent e) {
522 final short keySym = e.getKeySymbol();
523 if (keySym == KeyEvent.VK_PLUS ||
524 keySym == KeyEvent.VK_ADD)
525 {
526 if (e.isShiftDown()) {
527 setVelocity(velocity + 10 / 1000f);
528 } else {
529 setVelocity(velocity + 1 / 1000f);
530 }
531 } else if (keySym == KeyEvent.VK_MINUS ||
532 keySym == KeyEvent.VK_SUBTRACT)
533 {
534 if (e.isShiftDown()) {
535 setVelocity(velocity - 10 / 1000f);
536 } else {
537 setVelocity(velocity - 1 / 1000f);
538 }
539 } else if( keySym == KeyEvent.VK_F4 || keySym == KeyEvent.VK_ESCAPE || keySym == KeyEvent.VK_Q ) {
540 MiscUtils.destroyWindow(window);
541 } else if( keySym == KeyEvent.VK_SPACE ) {
542 animGroup.setTickPaused ( !animGroup.getTickPaused() );
543 } else if( keySym == KeyEvent.VK_ENTER ) {
544 animGroup.stopAnimation();
545 }
546 }
547 });
548 window.addMouseListener( new MouseAdapter() {
549 @Override
550 public void mouseWheelMoved(final MouseEvent e) {
551 int axis = 1;
552 if( e.isControlDown() ) {
553 axis = 0;
554 } else if( e.isAltDown() ) {
555 axis = 2;
556 }
557 final float angle = e.getRotation()[1] < 0f ? FloatUtil.adegToRad(-1f) : FloatUtil.adegToRad(1f);
558 rotateShape(animGroup, angle, axis);
559 }
560 });
561 window.addGLEventListener(new GLEventListener() {
562 float dir = 1f;
563 @Override
564 public void init(final GLAutoDrawable drawable) {
565 System.err.println(JoglVersion.getGLInfo(drawable.getGL(), null));
566 }
567 @Override
568 public void dispose(final GLAutoDrawable drawable) {}
569 @Override
570 public void display(final GLAutoDrawable drawable) {
571 if( animGroup.isToggleOn() ) {
572 final Quaternion rot = animGroup.getRotation();
573 final Vec3f euler = rot.toEuler(new Vec3f());
574 if( FloatUtil.HALF_PI <= euler.y() ) {
575 dir = -1f;
576 } else if( euler.y() <= -FloatUtil.HALF_PI ) {
577 dir = 1f;
578 }
579 rot.rotateByAngleY( frame_velocity * dir );
580 animGroup.setRotation(rot);
581 }
582 final String text = String.format("%s, v %.1f mm/s, r %.3f rad/s",
583 scene.getStatusText(drawable, options.renderModes, dpiV), velocity * 1e3f, ang_velo);
584 statusLabel.setText(text);
585 }
586 @Override
587 public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {}
588 });
589 }
590
591 /**
592 * Add a HUD UI to the scene
593 * @param scene
594 * @param animGroup
595 * @param window
596 * @throws IOException
597 */
598 static void sub02AddUItoScene(final Scene scene, final AnimGroup animGroup, final int mainAnimSetIdx, final GLWindow window) throws IOException {
599 final AABBox sceneBox = scene.getBounds();
600 final Group buttonsRight = new Group();
601
602 final Font fontButtons = FontFactory.get(FontFactory.UBUNTU).getDefault();
603 final Font fontSymbols = FontFactory.get(FontFactory.SYMBOLS).getDefault();
604
605 final float buttonWidth = sceneBox.getWidth() * 0.09f;
606 final float buttonHeight = buttonWidth / 3.0f;
607 final float buttonZOffset = scene.getZEpsilon(16);
608 final Vec2f fixedSymSize = new Vec2f(0.0f, 1.0f);
609 final Vec2f symSpacing = new Vec2f(0f, 0.2f);
610
611 buttonsRight.setLayout(new GridLayout(buttonWidth, buttonHeight, Alignment.Fill, new Gap(buttonHeight*0.50f, buttonWidth*0.10f), 7));
612 {
613 final Button button = new Button(options.renderModes, fontSymbols,
614 fontSymbols.getUTF16String("play_arrow"), fontSymbols.getUTF16String("pause"),
615 buttonWidth, buttonHeight, buttonZOffset);
616 button.setSpacing(symSpacing, fixedSymSize);
617 button.onToggle((final Shape s) -> {
618 System.err.println("Play/Pause "+s);
619 animGroup.setTickPaused ( s.isToggleOn() );
620 if( s.isToggleOn() ) {
621 animGroup.setTickPaused ( false );
622 if( null != mPlayer ) {
623 mPlayer.resume();
624 }
625 } else {
626 animGroup.setTickPaused ( true );
627 if( null != mPlayer ) {
628 mPlayer.pause(false);
629 }
630 }
631 });
632 button.setToggle(true); // on == play
633 buttonsRight.addShape(button);
634 }
635 {
636 final Button button = new Button(options.renderModes, fontSymbols, fontSymbols.getUTF16String("fast_forward"), buttonWidth, buttonHeight, buttonZOffset); // next (ffwd)
637 button.setSpacing(symSpacing, fixedSymSize);
638 button.addMouseListener(new Shape.MouseGestureAdapter() {
639 @Override
640 public void mouseClicked(final MouseEvent e) {
641 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
642 if( null != as ) {
643 as.setAnimationActive(false);
644 }
645 } } );
646 buttonsRight.addShape(button);
647 }
648 {
649 final Button button = new Button(options.renderModes, fontSymbols,
650 fontSymbols.getUTF16String("rotate_right"), fontSymbols.getUTF16String("stop_circle"),
651 buttonWidth, buttonHeight, buttonZOffset); // rotate (replay)
652 button.setSpacing(symSpacing, fixedSymSize);
653 button.setToggleable(true);
654 button.onToggle((final Shape s) -> {
655 animGroup.toggle();
656 });
657 buttonsRight.addShape(button);
658 }
659 {
660 final Button button = new Button(options.renderModes, fontButtons, " < Rot > ", buttonWidth, buttonHeight, buttonZOffset);
661 button.addMouseListener(new Shape.MouseGestureAdapter() {
662 @Override
663 public void mouseClicked(final MouseEvent e) {
664 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
665 int axis = 1;
666 if( e.isControlDown() ) {
667 axis = 0;
668 } else if( e.isAltDown() ) {
669 axis = 2;
670 }
671 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
672 rotateShape(animGroup, FloatUtil.adegToRad(1f), axis);
673 } else {
674 rotateShape(animGroup, FloatUtil.adegToRad(-1f), axis);
675 }
676 } } );
677 buttonsRight.addShape(button);
678 }
679 {
680 final Button button = new Button(options.renderModes, fontButtons, " < Velo > ", buttonWidth, buttonHeight, buttonZOffset);
681 button.addMouseListener(new Shape.MouseGestureAdapter() {
682 @Override
683 public void mouseClicked(final MouseEvent e) {
684 final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
685 final float scale = e.isShiftDown() ? 1f : 10f;
686 if( shapeEvent.objPos.x() < shapeEvent.shape.getBounds().getCenter().x() ) {
687 setVelocity(velocity - scale / 1000f);
688 } else {
689 setVelocity(velocity + scale / 1000f);
690 }
691 final AnimGroup.Set as = animGroup.getAnimSet(mainAnimSetIdx);
692 if( null != as ) {
693 as.setAnimationActive(false);
694 }
695 } } );
696 buttonsRight.addShape(button);
697 }
698 {
699 final Button button = new Button(options.renderModes, fontSymbols, fontSymbols.getUTF16String("camera"), buttonWidth, buttonHeight, buttonZOffset); // snapshot (camera)
700 button.setSpacing(symSpacing, fixedSymSize);
701 button.addMouseListener(new Shape.MouseGestureAdapter() {
702 @Override
703 public void mouseClicked(final MouseEvent e) {
704 scene.screenshot(false, scene.nextScreenshotFile(null, UISceneDemo03.class.getSimpleName(), options.renderModes, window.getChosenGLCapabilities(), null));
705 manualScreenShorCount[0]++;
706 } } );
707 buttonsRight.addShape(button);
708 }
709 {
710 final Button button = new Button(options.renderModes, fontSymbols, fontSymbols.getUTF16String("power_settings_new"), buttonWidth, buttonHeight, buttonZOffset); // exit (power_settings_new)
711 button.setSpacing(symSpacing, fixedSymSize);
712 button.setColor(0.7f, 0.3f, 0.3f, 1.0f);
713 button.addMouseListener(new Shape.MouseGestureAdapter() {
714 @Override
715 public void mouseClicked(final MouseEvent e) {
716 MiscUtils.destroyWindow(window);
717 } } );
718 buttonsRight.addShape(button);
719 }
720 TreeTool.forAll(buttonsRight, (final Shape s) -> { s.setDragAndResizable(false); return false; });
721 buttonsRight.validate(window.getChosenGLCapabilities().getGLProfile());
722 buttonsRight.moveTo(sceneBox.getWidth()/2f - buttonsRight.getScaledWidth()*1.02f,
723 sceneBox.getHeight()/2f - buttonsRight.getScaledHeight()*1.02f, 0f);
724 scene.addShape(buttonsRight);
725 if( DEBUG ) {
726 System.err.println("Buttons-Right: Button-1 "+buttonsRight.getShapes().get(0));
727 System.err.println("Buttons-Right: SceneBox "+sceneBox);
728 System.err.println("Buttons-Right: scaled "+buttonsRight.getScaledWidth()+" x "+buttonsRight.getScaledHeight());
729 System.err.println("Buttons-Right: Box "+buttonsRight.getBounds());
730 System.err.println("Buttons-Right: "+buttonsRight);
731 }
732 }
733
734 /**
735 * Rotate the shape while avoiding 90 degree position
736 * @param shape the shape to rotate
737 * @param angle the angle in radians
738 * @param axis 0 for X-, 1 for Y- and 2 for Z-axis
739 */
740 public static void rotateShape(final Shape shape, float angle, final int axis) {
741 final Quaternion rot = shape.getRotation().copy();
742 final Vec3f euler = rot.toEuler(new Vec3f());
743 final Vec3f eulerOld = euler.copy();
744
745 final float eps = FloatUtil.adegToRad(5f);
746 final float sign = angle >= 0f ? 1f : -1f;
747 final float v;
748 switch( axis ) {
749 case 0: v = euler.x(); break;
750 case 1: v = euler.y(); break;
751 case 2: v = euler.z(); break;
752 default: return;
753 }
754 final float av = Math.abs(v);
755 if( 1f*FloatUtil.HALF_PI - eps <= av && av <= 1f*FloatUtil.HALF_PI + eps ||
756 3f*FloatUtil.HALF_PI - eps <= av && av <= 3f*FloatUtil.HALF_PI + eps) {
757 angle = 2f * eps * sign;
758 }
759 switch( axis ) {
760 case 0: euler.add(angle, 0, 0); break;
761 case 1: euler.add(0, angle, 0); break;
762 case 2: euler.add(0, 0, angle); break;
763 }
764 System.err.println("Rot: angleDelta "+angle+" (eps "+eps+"): "+eulerOld+" -> "+euler);
765 shape.setRotation( rot.setFromEuler(euler) );
766 }
767
768 static class MyGLMediaEventListener implements GLMediaEventListener {
769 @Override
770 public void attributesChanged(final GLMediaPlayer mp, final GLMediaPlayer.EventMask eventMask, final long when) {
771 System.err.println("MediaPlayer.1 AttributesChanges: "+eventMask+", when "+when);
772 System.err.println("MediaPlayer.1 State: "+mp);
773 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Init) ) {
774 new InterruptSource.Thread() {
775 @Override
776 public void run() {
777 try {
778 mp.initGL(null);
779 if ( GLMediaPlayer.State.Paused == mp.getState() ) { // init OK
780 mp.resume();
781 }
782 System.out.println("MediaPlayer.1 "+mp);
783 } catch (final Exception e) {
784 e.printStackTrace();
785 mp.destroy(null);
786 mPlayer = null;
787 return;
788 }
789 }
790 }.start();
791 }
792 boolean destroy = false;
793 Throwable err = null;
794
795 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.EOS) ) {
796 err = mp.getStreamException();
797 if( null != err ) {
798 System.err.println("MovieSimple State: Exception");
799 destroy = true;
800 } else {
801 new InterruptSource.Thread() {
802 @Override
803 public void run() {
804 mp.setPlaySpeed(1f);
805 mp.seek(0);
806 mp.resume();
807 }
808 }.start();
809 }
810 }
811 if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Error) ) {
812 err = mp.getStreamException();
813 destroy = true;;
814 }
815 if( destroy ) {
816 if( null != err ) {
817 System.err.println("MovieSimple State: Exception");
818 err.printStackTrace();
819 }
820 mp.destroy(null);
821 mPlayer = null;
822 }
823 }
824 };
825}
Abstract Outline shape representation define the method an OutlineShape(s) is bound and rendered.
Definition: Region.java:62
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 FontSet get(final int font)
Animation-Set covering its ShapeData elements, LerpFunc and animation parameter.
Definition: AnimGroup.java:98
Animation Shapes data covering one Shape of Set.
Definition: AnimGroup.java:75
Sine target LerpFunc, approaching ShapeData's target position utilizing the angular value for sine am...
Definition: AnimGroup.java:762
Default target LerpFunc, approaching ShapeData's target position inclusive angular rotation around gi...
Definition: AnimGroup.java:619
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:102
void addShape(final Shape s)
Adds a Shape.
Definition: Scene.java:287
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:221
RegionRenderer getRenderer()
Returns the associated RegionRenderer.
Definition: Scene.java:208
Shape removeShape(final Shape s)
Removes given shape, w/o Shape#destroy(GL2ES2, RegionRenderer).
Definition: Scene.java:292
final void setPMvCullingEnabled(final boolean v)
Enable or disable Project-Modelview (PMv) frustum culling per Shape for this container.
Definition: Scene.java:230
int setAAQuality(final int v)
Sets RegionRenderer#setAAQuality(int).
Definition: Scene.java:383
void waitUntilDisplayed()
Blocks until first display(GLAutoDrawable) has completed after construction or dispose(GLAutoDrawable...
Definition: Scene.java:584
final Recti getViewport(final Recti target)
Copies the current int[4] viewport in given target and returns it for chaining.
Definition: Scene.java:768
PMVMatrix4f getMatrix()
Borrow the current PMVMatrix4f.
Definition: Scene.java:779
static float getZEpsilon(final int zBits, final PMVMatrixSetup setup)
Default Z precision on 16-bit depth buffer using -1 z-position and DEFAULT_ZNEAR.
Definition: Scene.java:126
AABBox getBounds(final PMVMatrix4f pmv, final Shape shape)
Returns AABBox dimension of given Shape from this container's perspective, i.e.
Definition: Scene.java:676
synchronized void attachInputListenerTo(final GLWindow window)
Definition: Scene.java:246
int getScreenshotCount()
Return the number of nextScreenshotFile(String, String, int, GLCapabilitiesImmutable,...
Definition: Scene.java:1447
String getStatusText(final GLAutoDrawable glad, final int renderModes, final float dpi)
Return a formatted status string containing avg fps and avg frame duration.
Definition: Scene.java:1381
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:1434
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 toggle()
Definition: Shape.java:1596
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 float getScaledWidth()
Returns the scaled width of the bounding AABBox for this shape.
Definition: Shape.java:745
final Shape setToggle(final boolean v)
Set this shape's toggle state, default is off.
Definition: Shape.java:1587
final AABBox getBounds()
Returns the unscaled bounding AABBox for this shape, borrowing internal instance.
Definition: Shape.java:732
final Quaternion getRotation()
Returns Quaternion for rotation.
Definition: Shape.java:595
final boolean isToggleOn()
Returns true this shape's toggle state.
Definition: Shape.java:1610
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 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
boolean setText(final CharSequence text)
Set the text to be rendered.
Definition: Label.java:94
A GraphUI rectangle GraphShape.
Definition: Rectangle.java:47
Basic Float math utility functions.
Definition: FloatUtil.java:83
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.
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.
Quaternion rotateByAngleZ(final float angle)
Rotate this quaternion around Z axis with the given angle in radians.
3D Vector based upon three float components.
Definition: Vec3f.java:37
static final Vec3f UNIT_Z
Definition: Vec3f.java:43
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 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[] perMMToPerInch(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,...
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 addMouseListener(final MouseListener l)
Appends the given MouseListener to the end of the list.
Definition: GLWindow.java:927
final void setTitle(final String title)
Definition: GLWindow.java:297
final float[] getPixelsPerMM(final float[] ppmmStore)
Returns the pixels per millimeter of this window's NativeSurface according to the main monitor's curr...
Definition: GLWindow.java:520
final void addKeyListener(final KeyListener l)
Appends the given com.jogamp.newt.event.KeyListener to the end of the list.
Definition: GLWindow.java:902
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
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.
Specifies the the OpenGL profile.
Definition: GLProfile.java:77
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.
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 void destroyWindow(final GLAutoDrawable glad)
Definition: MiscUtils.java:269
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
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...
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.
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...
static final int GL_VERSION
GL_ES_VERSION_2_0, GL_VERSION_1_1, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_VERSION" with express...
Definition: GL.java:190
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...
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
As the contract of GLMediaFrameListener and TexSeqEventListener requests, implementations of GLMediaE...
void attributesChanged(GLMediaPlayer mp, EventMask event_mask, long when)
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.
void initGL(GL gl)
Initializes OpenGL related resources.
static final int TEXTURE_COUNT_DEFAULT
Default texture count, value {@value}.
boolean setPlaySpeed(float rate)
Sets the playback speed.
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.
int seek(int msec)
Seeks to the new absolute position.
State resume()
Starts or resumes the StreamWorker decoding thread.
static final int STREAM_ID_AUTO
Constant {@value} for auto or unspecified.