diff options
author | Sven Gothel <[email protected]> | 2023-12-18 09:47:30 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-12-18 09:47:30 +0100 |
commit | c306094e8dbba3c9e77953daaf8054731f327923 (patch) | |
tree | be3b775c7d47bac7c6c2df7777703306d22c2a32 /src/demos/com/jogamp/opengl | |
parent | 47f5e083ba79ac02590a452149e31bf433109346 (diff) |
Bug 805: GraphUI: Add MediaUI01 widtget (MediaButton w/ full feature controls), used in demos UIMediaGrid0[01]
Diffstat (limited to 'src/demos/com/jogamp/opengl')
-rw-r--r-- | src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java | 163 | ||||
-rw-r--r-- | src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java | 76 |
2 files changed, 116 insertions, 123 deletions
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java index fbe62c675..212da6199 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java @@ -32,7 +32,6 @@ import java.util.ArrayList; import java.util.List; import com.jogamp.common.net.Uri; -import com.jogamp.common.util.InterruptSource; import com.jogamp.graph.curve.Region; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontFactory; @@ -43,9 +42,11 @@ import com.jogamp.graph.ui.Shape; import com.jogamp.graph.ui.layout.Alignment; import com.jogamp.graph.ui.layout.Gap; import com.jogamp.graph.ui.layout.GridLayout; +import com.jogamp.graph.ui.shapes.Button; import com.jogamp.graph.ui.shapes.MediaButton; +import com.jogamp.graph.ui.shapes.Rectangle; +import com.jogamp.graph.ui.widgets.MediaUI01; import com.jogamp.math.Vec2i; -import com.jogamp.math.Vec4f; import com.jogamp.math.geom.AABBox; import com.jogamp.newt.event.KeyAdapter; import com.jogamp.newt.event.KeyEvent; @@ -60,11 +61,7 @@ import com.jogamp.opengl.demos.util.CommandlineOptions; import com.jogamp.opengl.demos.util.MiscUtils; import com.jogamp.opengl.util.Animator; import com.jogamp.opengl.util.av.GLMediaPlayer; -import com.jogamp.opengl.util.av.GLMediaPlayer.EventMask; -import com.jogamp.opengl.util.av.GLMediaPlayer.GLMediaEventListener; -import com.jogamp.opengl.util.av.GLMediaPlayer.StreamException; import com.jogamp.opengl.util.av.GLMediaPlayerFactory; -import com.jogamp.opengl.util.texture.TextureSequence.TextureFrame; /** * MediaButtons in a grid, filled by media files from a directory in different aspect ratios @@ -90,8 +87,6 @@ public class UIMediaGrid00 { } else if(args[idx[0]].equals("-aid")) { idx[0]++; aid = MiscUtils.atoi(args[idx[0]], aid); - } else if(args[idx[0]].equals("-mute")) { - aid = GLMediaPlayer.STREAM_ID_NONE; } } } @@ -125,12 +120,12 @@ public class UIMediaGrid00 { animator.setUpdateFPSFrames(1*60, null); // System.err); final GLWindow window = GLWindow.create(caps); window.setSize(options.surface_width, options.surface_height); - window.setTitle(UIMediaGrid00.class.getSimpleName()); window.setVisible(true); + window.setTitle(UIMediaGrid00.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight()); window.addWindowListener(new WindowAdapter() { @Override public void windowResized(final WindowEvent e) { - window.setTitle(FontView01.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight()); + window.setTitle(UIMediaGrid00.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight()); } @Override public void windowDestroyNotify(final WindowEvent e) { @@ -160,14 +155,16 @@ public class UIMediaGrid00 { final float cellWidth = 1f; final float cellHeight = 1f; mediaGrid = new Group(new GridLayout(gridDim.x(), cellWidth*0.9f, cellHeight*0.9f, Alignment.FillCenter, new Gap(cellHeight*0.1f, cellWidth*0.1f))); + mediaGrid.setName("MediaGrid"); mediaGrid.setRelayoutOnDirtyShapes(false); } - addMedia(reqGLP, fontInfo, mediaGrid, gridDim, mediaFiles, null); + addMedia(scene, reqGLP, fontInfo, mediaGrid, mediaFiles); mediaGrid.validate(reqGLP); System.err.println("MediaGrid "+mediaGrid); System.err.println("MediaGrid "+mediaGrid.getLayout()); final Group mainGrid = new Group(new GridLayout(1, 0f, 0f, Alignment.None)); + mainGrid.setName("MainGrid"); mainGrid.addShape(mediaGrid); scene.addShape(mainGrid); @@ -183,21 +180,6 @@ public class UIMediaGrid00 { } else if( keySym == KeyEvent.VK_PAGE_UP ) { } else if( keySym == KeyEvent.VK_F4 || keySym == KeyEvent.VK_ESCAPE || keySym == KeyEvent.VK_Q ) { MiscUtils.destroyWindow(window); - } else if( keySym == KeyEvent.VK_SPACE ) { - final Shape a = scene.getActiveShape(); - if( a instanceof MediaButton ) { - final MediaButton b = (MediaButton)a; - final GLMediaPlayer mPlayer = b.getGLMediaPlayer(); - if( GLMediaPlayer.State.Paused == mPlayer.getState() ) { - mPlayer.resume(); - } else if(GLMediaPlayer.State.Uninitialized == mPlayer.getState()) { - mPlayer.playStream(mPlayer.getUri(), GLMediaPlayer.STREAM_ID_AUTO, aid, MediaTexCount); - } else if( e.isShiftDown() ) { - mPlayer.stop(); - } else { - mPlayer.pause(false); - } - } } } }); @@ -223,97 +205,54 @@ public class UIMediaGrid00 { scene.screenshot(true, scene.nextScreenshotFile(null, UIMediaGrid00.class.getSimpleName(), options.renderModes, caps, "media")); } - public static final int MediaTexUnitMediaPlayer = 1; - public static final int MediaTexCount = 3; // GLMediaPlayer.TEXTURE_COUNT_DEFAULT - - public static MediaButton createMediaButton(final Uri medium, final float aratio, final boolean letterBox, final Shape.MouseGestureListener mouseListener) { - final float borderSz = 0.02f; - final Vec4f borderToggleOff = new Vec4f(0, 0, 0, 0.7f); - final Vec4f borderToggleOn = new Vec4f(0, 0, 1, 0.7f); - final Vec4f borderActive = new Vec4f(1, 1, 0, 0.7f); - final GLMediaPlayer mPlayer = GLMediaPlayerFactory.createDefault(); - mPlayer.setTextureUnit(MediaTexUnitMediaPlayer); - // mPlayer.setAudioChannelLimit(1); // enforce mono to enjoy spatial 3D position effects - final MediaButton button = new MediaButton(options.renderModes, aratio, 1, mPlayer); - button.setVerbose(false).addDefaultEventListener().setTextureLetterbox(letterBox).setFixedARatioResize(true); - if( aid == GLMediaPlayer.STREAM_ID_NONE ) { - button.setToggle( true ); // toggle == false -> mute audio - } else { - button.setToggleable(true); - button.setToggle(false); // toggle == false -> mute audio - } - mPlayer.setAudioVolume( 0f ); - if( null != mouseListener ) { - button.addMouseListener(mouseListener); - } - button.onToggle( (final Shape s) -> { - mPlayer.setAudioVolume( s.isToggleOn() ? 1f : 0f ); - if( s.isActive() ) { - s.setBorderColor(borderActive); - } else { - if( s.isToggleOn() ) { - s.setBorderColor(borderToggleOn); - } else { - s.setBorderColor(borderToggleOff); - } - } - }); - button.onActivation( (final Shape s) -> { - System.err.println("XXX "+s); - if( s.isActive() ) { - s.setBorderColor(borderActive); - } else { - if( s.isToggleOn() ) { - s.setBorderColor(borderToggleOn); - } else { - s.setBorderColor(borderToggleOff); - } + static void addMedia(final Scene scene, final GLProfile glp, final Font font, final Group grid, final List<Uri> mediaFiles) { + final float zoomSize = 0.95f; + for(final Uri medium : mediaFiles) { + final GLMediaPlayer mPlayer = GLMediaPlayerFactory.createDefault(); + if( printNativeInfoOnce ) { + mPlayer.printNativeInfo(System.err); + printNativeInfoOnce = false; } - }); - mPlayer.addEventListener( new GLMediaEventListener() { - @Override - public void newFrameAvailable(final GLMediaPlayer ts, final TextureFrame newFrame, final long when) { } + // mPlayer.setTextureMinMagFilter( new int[] { GL.GL_NEAREST, GL.GL_NEAREST } ); + mPlayer.setTextureMinMagFilter( new int[] { GL.GL_LINEAR, GL.GL_LINEAR } ); - @Override - public void attributesChanged(final GLMediaPlayer mp, final EventMask eventMask, final long when) { - // System.err.println("MediaButton AttributesChanges: "+eventMask+", when "+when); - // System.err.println("MediaButton State: "+mp); - if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.Init) ) { - System.err.println(mp.toString()); - } - if( eventMask.isSet(GLMediaPlayer.EventMask.Bit.EOS) ) { - final StreamException err = mp.getStreamException(); - if( null != err ) { - System.err.println("MovieSimple State: Exception: "+err.getMessage()); - } else { - new InterruptSource.Thread() { - @Override - public void run() { - mp.setPlaySpeed(1f); - mp.seek(0); - mp.resume(); - } - }.start(); - } + final List<Shape> customCtrls = new ArrayList<Shape>(); + { + final Font fontSymbols = MediaUI01.getSymbolsFont(); + if( null == fontSymbols ) { + grid.addShape( new Rectangle(options.renderModes, 16f/9f, 1, 0.10f) ); + return; } + final Button button = new Button(options.renderModes, fontSymbols, + fontSymbols.getUTF16String("reset_tv"), MediaUI01.CtrlButtonWidth, MediaUI01.CtrlButtonHeight, scene.getZEpsilon(16)); + button.setName("reset"); + button.setSpacing(MediaUI01.SymSpacing, MediaUI01.FixedSymSize).setPerp().setColor(MediaUI01.CtrlCellCol); + button.onClicked((final Shape s0) -> { + scene.forAll((final Shape s1) -> { + System.err.println("- "+s1.getName()); + if( s1 instanceof MediaButton ) { + final MediaButton mb = (MediaButton)s1; + final GLMediaPlayer mp = mb.getGLMediaPlayer(); + mp.seek(0); + mp.setPlaySpeed(1f); + mp.setAudioVolume( 0f ); + } + if( s1.getName().equals("muteLabel") ) { + s1.setVisible(true); + } + if( s1.getName().equals("MediaGrid") ) { + s1.markShapeDirty(); + System.err.println("Reset: "+s1); + } + return false; + }); + }); + customCtrls.add(button); } - }); - button.setToggleOffColorMod(1f, 1f, 1f, 1f); - button.setPressedColorMod(1f, 1f, 1f, 0.85f); - button.setPerp().setBorderColor(borderToggleOff).setBorder(borderSz); - mPlayer.playStream(medium, GLMediaPlayer.STREAM_ID_AUTO, aid, MediaTexCount); - return button; - } - - static void addMedia(final GLProfile glp, final Font font, final Group grid, - final Vec2i gridDim, final List<Uri> mediaFiles, - final Shape.MouseGestureListener mouseListener) { - for(final Uri medium : mediaFiles) { - grid.addShape( createMediaButton(medium, 16f/9f, false, mouseListener) ); - grid.addShape( createMediaButton(medium, 4f/3f, false, mouseListener) ); - grid.addShape( createMediaButton(medium, 16f/9f, true, mouseListener) ); - grid.addShape( createMediaButton(medium, 4f/3f, true, mouseListener) ); + grid.addShape( MediaUI01.create(scene, mPlayer, options.renderModes, medium, aid, 16f/9f, false, zoomSize, customCtrls) ); } } + private static boolean printNativeInfoOnce = true; + } diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java index 95c8d3a38..506797275 100644 --- a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java +++ b/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java @@ -45,7 +45,10 @@ import com.jogamp.graph.ui.Shape; import com.jogamp.graph.ui.layout.Alignment; import com.jogamp.graph.ui.layout.Gap; import com.jogamp.graph.ui.layout.GridLayout; +import com.jogamp.graph.ui.shapes.Button; import com.jogamp.graph.ui.shapes.MediaButton; +import com.jogamp.graph.ui.shapes.Rectangle; +import com.jogamp.graph.ui.widgets.MediaUI01; import com.jogamp.math.Vec2i; import com.jogamp.math.geom.AABBox; import com.jogamp.newt.event.KeyAdapter; @@ -61,6 +64,7 @@ import com.jogamp.opengl.demos.util.CommandlineOptions; import com.jogamp.opengl.demos.util.MiscUtils; import com.jogamp.opengl.util.Animator; import com.jogamp.opengl.util.av.GLMediaPlayer; +import com.jogamp.opengl.util.av.GLMediaPlayerFactory; /** * MediaButtons in a grid, filled by media files from a directory. @@ -75,6 +79,7 @@ public class UIMediaGrid01 { public static void main(final String[] args) throws IOException { int maxMediaFiles = 12; // Integer.MAX_VALUE; + int columns = -1; String mediaDir = null; if( 0 != args.length ) { final int[] idx = { 0 }; @@ -90,13 +95,14 @@ public class UIMediaGrid01 { } else if(args[idx[0]].equals("-aid")) { idx[0]++; aid = MiscUtils.atoi(args[idx[0]], aid); - } else if(args[idx[0]].equals("-mute")) { - aid = GLMediaPlayer.STREAM_ID_NONE; } else if(args[idx[0]].equals("-ratio")) { idx[0]++; boxRatio = MiscUtils.atof(args[idx[0]], boxRatio); } else if(args[idx[0]].equals("-zoom")) { letterBox = false; + } else if(args[idx[0]].equals("-col")) { + idx[0]++; + columns = MiscUtils.atoi(args[idx[0]], columns); } } } @@ -106,6 +112,7 @@ public class UIMediaGrid01 { System.err.println("aid "+aid); System.err.println("boxRatio "+boxRatio); System.err.println("letterBox "+letterBox); + System.err.println("columns "+columns); final List<Uri> mediaFiles = new ArrayList<Uri>(); if( null != mediaDir && mediaDir.length() > 0 ) { @@ -128,6 +135,9 @@ public class UIMediaGrid01 { } return true; }); + Arrays.sort(files, (final File f1, final File f2) -> { + return f1.getAbsolutePath().compareTo(f2.getAbsolutePath()); + }); for(final File f : files) { try { final Uri uri = Uri.valueOf(f); @@ -148,7 +158,7 @@ public class UIMediaGrid01 { { // final int w = (int)( Math.round( Math.sqrt( mediaFiles.size() ) ) ); // final int h = (int)( Math.ceil( mediaFiles.size() / w ) ); - final int w = (int)( Math.round( Math.sqrt( mediaFiles.size() ) ) ); + final int w = columns > 0 ? columns : (int)( Math.round( Math.sqrt( mediaFiles.size() ) ) ); final int h = ( Math.round( mediaFiles.size() / w ) ); gridDim.set(w, h); System.err.println("Media files: Count "+mediaFiles.size()+", grid "+gridDim); @@ -172,12 +182,12 @@ public class UIMediaGrid01 { animator.setUpdateFPSFrames(1*60, null); // System.err); final GLWindow window = GLWindow.create(caps); window.setSize(options.surface_width, options.surface_height); - window.setTitle(UIMediaGrid01.class.getSimpleName()); window.setVisible(true); + window.setTitle(UIMediaGrid01.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight()); window.addWindowListener(new WindowAdapter() { @Override public void windowResized(final WindowEvent e) { - window.setTitle(FontView01.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight()); + window.setTitle(UIMediaGrid01.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight()); } @Override public void windowDestroyNotify(final WindowEvent e) { @@ -209,12 +219,14 @@ public class UIMediaGrid01 { mediaGrid = new Group(new GridLayout(gridDim.x(), cellWidth*0.9f, cellHeight*0.9f, Alignment.FillCenter, new Gap(cellHeight*0.1f, cellWidth*0.1f))); mediaGrid.setRelayoutOnDirtyShapes(false); } - addMedia(reqGLP, fontInfo, mediaGrid, gridDim, mediaFiles, boxRatio, null); + mediaGrid.setName("MediaGrid"); + addMedia(scene, reqGLP, fontInfo, mediaGrid, mediaFiles, boxRatio); mediaGrid.validate(reqGLP); System.err.println("MediaGrid "+mediaGrid); System.err.println("MediaGrid "+mediaGrid.getLayout()); final Group mainGrid = new Group(new GridLayout(1, 0f, 0f, Alignment.None)); + mainGrid.setName("MainGrid"); mainGrid.addShape(mediaGrid); scene.addShape(mainGrid); @@ -238,7 +250,7 @@ public class UIMediaGrid01 { if( GLMediaPlayer.State.Paused == mPlayer.getState() ) { mPlayer.resume(); } else if(GLMediaPlayer.State.Uninitialized == mPlayer.getState()) { - mPlayer.playStream(mPlayer.getUri(), GLMediaPlayer.STREAM_ID_AUTO, aid, UIMediaGrid00.MediaTexCount); + mPlayer.playStream(mPlayer.getUri(), GLMediaPlayer.STREAM_ID_AUTO, aid, MediaUI01.MediaTexCount); } else if( e.isShiftDown() ) { mPlayer.stop(); } else { @@ -270,11 +282,53 @@ public class UIMediaGrid01 { scene.screenshot(true, scene.nextScreenshotFile(null, UIMediaGrid01.class.getSimpleName(), options.renderModes, caps, "media")); } - static void addMedia(final GLProfile glp, final Font font, final Group grid, - final Vec2i gridDim, final List<Uri> mediaFiles, final float defRatio, - final Shape.MouseGestureListener mouseListener) { + static void addMedia(final Scene scene, final GLProfile glp, final Font font, final Group grid, + final List<Uri> mediaFiles, final float defRatio) { + final float zoomSize = 0.95f; for(final Uri medium : mediaFiles) { - grid.addShape( UIMediaGrid00.createMediaButton(medium, defRatio, letterBox, mouseListener) ); + final GLMediaPlayer mPlayer = GLMediaPlayerFactory.createDefault(); + if( printNativeInfoOnce ) { + mPlayer.printNativeInfo(System.err); + printNativeInfoOnce = false; + } + // mPlayer.setTextureMinMagFilter( new int[] { GL.GL_NEAREST, GL.GL_NEAREST } ); + mPlayer.setTextureMinMagFilter( new int[] { GL.GL_LINEAR, GL.GL_LINEAR } ); + + final List<Shape> customCtrls = new ArrayList<Shape>(); + if( true ) { + final Font fontSymbols = MediaUI01.getSymbolsFont(); + if( null == fontSymbols ) { + grid.addShape( new Rectangle(options.renderModes, defRatio, 1, 0.10f) ); + return; + } + final Button button = new Button(options.renderModes, fontSymbols, + fontSymbols.getUTF16String("reset_tv"), MediaUI01.CtrlButtonWidth, MediaUI01.CtrlButtonHeight, scene.getZEpsilon(16)); + button.setName("reset"); + button.setSpacing(MediaUI01.SymSpacing, MediaUI01.FixedSymSize).setPerp().setColor(MediaUI01.CtrlCellCol); + button.onClicked((final Shape s0) -> { + scene.forAll((final Shape s1) -> { + System.err.println("- "+s1.getName()); + if( s1 instanceof MediaButton ) { + final MediaButton mb = (MediaButton)s1; + final GLMediaPlayer mp = mb.getGLMediaPlayer(); + mp.seek(0); + mp.setPlaySpeed(1f); + mp.setAudioVolume( 0f ); + } + if( s1.getName().equals("muteLabel") ) { + s1.setVisible(true); + } + if( s1.getName().equals("MediaGrid") ) { + s1.markShapeDirty(); + System.err.println("Reset: "+s1); + } + return false; + }); + }); + customCtrls.add(button); + } + grid.addShape( MediaUI01.create(scene, mPlayer, options.renderModes, medium, aid, defRatio, letterBox, zoomSize, customCtrls) ); } } + private static boolean printNativeInfoOnce = true; } |