From bfcad7452976d9b04ca54cd1e8fe2e99d0d172ca Mon Sep 17 00:00:00 2001 From: Recrown Date: Wed, 21 Mar 2018 23:26:09 -0500 Subject: [PATCH] made more visualizer code accessible for other platforms by using interface --- .../audio/visualizer/CircularVisualizer.java | 10 +++-- .../visualizer/HorizontalVisualizer.java | 38 ++++++++++++------- .../audio/visualizer/MusicManagerFFT.java | 9 +---- .../audio/visualizer/Visualizer.java | 21 ++++++++++ ...Visualizer.java => DesktopVisualizer.java} | 33 +++++++++++++++- .../HorizontalVisualizerWidget.java | 9 +++-- .../ui/components/TitleBarVisualizer.java | 10 ++--- .../graphics/ui/pages/OptionsPage.java | 4 +- .../desktop/screens/GameScreen.java | 18 +++++---- .../desktop/screens/SplashScreen.java | 1 - 10 files changed, 106 insertions(+), 47 deletions(-) rename {desktop/src/zero1hd/rhythmbullet/desktop => core/src/zero1hd/rhythmbullet}/audio/visualizer/CircularVisualizer.java (92%) rename {desktop/src/zero1hd/rhythmbullet/desktop => core/src/zero1hd/rhythmbullet}/audio/visualizer/HorizontalVisualizer.java (86%) create mode 100755 core/src/zero1hd/rhythmbullet/audio/visualizer/Visualizer.java rename desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/{Visualizer.java => DesktopVisualizer.java} (80%) diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/CircularVisualizer.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/CircularVisualizer.java similarity index 92% rename from desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/CircularVisualizer.java rename to core/src/zero1hd/rhythmbullet/audio/visualizer/CircularVisualizer.java index ad82efb..6501c41 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/CircularVisualizer.java +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/CircularVisualizer.java @@ -1,4 +1,4 @@ -package zero1hd.rhythmbullet.desktop.audio.visualizer; +package zero1hd.rhythmbullet.audio.visualizer; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Camera; @@ -12,7 +12,7 @@ import com.badlogic.gdx.utils.Disposable; import zero1hd.rhythmbullet.RhythmBullet; -public class CircularVisualizer extends Visualizer implements Disposable { +public class CircularVisualizer implements Disposable { private int circlePointIndex; private int centerX, centerY; private int r; @@ -22,17 +22,21 @@ public class CircularVisualizer extends Visualizer implements Disposable { private float color; private Mesh mesh; private ShaderProgram shader; + private Visualizer visualizer; private int barCount = 180; private float barHeightMultiplier = 1.5f; private float[] audioSpectrum; private Camera camera; - public CircularVisualizer() { + + public CircularVisualizer(Visualizer visualizer) { shader = new ShaderProgram(Gdx.files.internal("shaders/mesh.vsh"), Gdx.files.internal("shaders/mesh.fsh")); if (!shader.isCompiled() || shader.getLog().length() != 0) { Gdx.app.debug("Circular visualizer shader", shader.getLog()); Gdx.app.exit(); } r = RhythmBullet.pixels_per_unit*RhythmBullet.SPAWN_CIRCLE_RADIUS; + + this.visualizer = visualizer; } /** diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/HorizontalVisualizer.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/HorizontalVisualizer.java similarity index 86% rename from desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/HorizontalVisualizer.java rename to core/src/zero1hd/rhythmbullet/audio/visualizer/HorizontalVisualizer.java index cd60ac9..7a5867d 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/HorizontalVisualizer.java +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/HorizontalVisualizer.java @@ -1,4 +1,4 @@ -package zero1hd.rhythmbullet.desktop.audio.visualizer; +package zero1hd.rhythmbullet.audio.visualizer; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; @@ -10,11 +10,11 @@ import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Disposable; import zero1hd.rhythmbullet.audio.MusicManager; -import zero1hd.rhythmbullet.audio.visualizer.MirrorVisualizer; -public class HorizontalVisualizer extends Visualizer { +public class HorizontalVisualizer implements Disposable { private Pixmap pixmap; private Texture barTexture; private int barWidth; @@ -34,7 +34,9 @@ public class HorizontalVisualizer extends Visualizer { private int barCount; private float width, height, x, y; - public HorizontalVisualizer() { + private Visualizer visualizer; + + public HorizontalVisualizer(Visualizer visualizer) { super(); mirrors = new Array<>(); pixmap = new Pixmap(2, 2, Format.RGBA8888); @@ -48,6 +50,7 @@ public class HorizontalVisualizer extends Visualizer { x = 0; y = 0; + this.visualizer = visualizer; smoothRange = 2; angleRot = new Vector2(MathUtils.cosDeg(rotation), MathUtils.sinDeg(rotation)); @@ -62,9 +65,8 @@ public class HorizontalVisualizer extends Visualizer { pixmap.dispose(); } - @Override public void render(Batch batch, float parentAlpha) { - if (mm != null) { + if (visualizer.getMM() != null) { for (int i = 0; i < bars.length; i++) { bars[i].draw(batch); for (int j = 0; j < mirrors.size; j++) { @@ -72,16 +74,16 @@ public class HorizontalVisualizer extends Visualizer { } } } - super.render(batch, parentAlpha); + } public void update(float delta) { - if (mm != null) { + if (visualizer.getMM() != null) { //Averaging bins together for (int i = 0; i < barCount; i++) { float barHeight = 0; for (int j = 0; j < binsPerBar; j++) { - barHeight += Math.abs(audioPCM[j+i*binsPerBar +1]); + barHeight += Math.abs(visualizer.getAudioPCMData()[j+i*binsPerBar +1]); } barHeight /= binsPerBar; barHeight *= barHeightMultiplier; @@ -115,7 +117,6 @@ public class HorizontalVisualizer extends Visualizer { } } - @Override public void setMM(MusicManager mm) { maxAvgHeight = 0; currentAvg = 0; @@ -123,13 +124,12 @@ public class HorizontalVisualizer extends Visualizer { Gdx.app.debug("Visualizer", "valid frequency bins " + validBins); binsPerBar = MathUtils.round((validBins/barCount)); barHeights = new float[barCount]; - super.setMM(mm); + visualizer.setMM(mm); } - @Override public void dispose() { barTexture.dispose(); - super.dispose(); + visualizer.dispose(); } public void updatePositionInfo() { @@ -266,4 +266,16 @@ public class HorizontalVisualizer extends Visualizer { public float getHeight() { return height; } + + public void calcPCMData() { + visualizer.calcPCMData(); + } + + public void calculate() { + visualizer.fft(); + } + + public Visualizer getVisualizer() { + return visualizer; + } } diff --git a/core/src/zero1hd/rhythmbullet/audio/visualizer/MusicManagerFFT.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/MusicManagerFFT.java index 43052d3..0786ba1 100755 --- a/core/src/zero1hd/rhythmbullet/audio/visualizer/MusicManagerFFT.java +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/MusicManagerFFT.java @@ -2,7 +2,6 @@ package zero1hd.rhythmbullet.audio.visualizer; import java.util.concurrent.locks.ReentrantLock; -import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.utils.Disposable; import edu.emory.mathcs.jtransforms.fft.FloatFFT_1D; @@ -19,7 +18,7 @@ public class MusicManagerFFT implements Disposable { lock = new ReentrantLock(); } - public void calculate(float delta) { + public void calculate() { if (mm != null && calc && mm.isPlaying()) { lock.lock(); fft.realForward(audioPCM); @@ -39,12 +38,6 @@ public class MusicManagerFFT implements Disposable { lock.unlock(); } - public void render(Batch batch, float parentAlpha) { - } - - public void update(float delta) { - } - @Override public void dispose() { } diff --git a/core/src/zero1hd/rhythmbullet/audio/visualizer/Visualizer.java b/core/src/zero1hd/rhythmbullet/audio/visualizer/Visualizer.java new file mode 100755 index 0000000..bbfbd1b --- /dev/null +++ b/core/src/zero1hd/rhythmbullet/audio/visualizer/Visualizer.java @@ -0,0 +1,21 @@ +package zero1hd.rhythmbullet.audio.visualizer; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.utils.Disposable; + +import zero1hd.rhythmbullet.audio.MusicManager; + +public interface Visualizer extends Disposable { + + void calcPCMData(); + + void setMM(MusicManager mm); + + MusicManager getMM(); + + void render(Batch batch, float delta); + + float[] getAudioPCMData(); + + void fft(); +} \ No newline at end of file diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/Visualizer.java b/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/DesktopVisualizer.java similarity index 80% rename from desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/Visualizer.java rename to desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/DesktopVisualizer.java index 24302ac..fc7e052 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/Visualizer.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/audio/visualizer/DesktopVisualizer.java @@ -9,21 +9,23 @@ import org.lwjgl.openal.AL11; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl.audio.OpenALMusic; +import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.utils.reflect.ClassReflection; import com.badlogic.gdx.utils.reflect.Field; import com.badlogic.gdx.utils.reflect.ReflectionException; import zero1hd.rhythmbullet.audio.MusicManager; import zero1hd.rhythmbullet.audio.visualizer.MusicManagerFFT; +import zero1hd.rhythmbullet.audio.visualizer.Visualizer; -public class Visualizer extends MusicManagerFFT { +public class DesktopVisualizer extends MusicManagerFFT implements Visualizer { private ShortBuffer playingBuffer; private ShortBuffer compareBuffer; private ShortBuffer buffer; private int sourceID; private int readWindowIndex; - public Visualizer() { + public DesktopVisualizer() { super(); try { Field bufferField = ClassReflection.getDeclaredField(OpenALMusic.class, "tempBuffer"); @@ -36,6 +38,10 @@ public class Visualizer extends MusicManagerFFT { } } + /* (non-Javadoc) + * @see zero1hd.rhythmbullet.desktop.audio.visualizer.Visualizer#calcPCMData() + */ + @Override public void calcPCMData() { short chanVal; int bufferPosOffset = 0; @@ -98,6 +104,10 @@ public class Visualizer extends MusicManagerFFT { return pos; } + /* (non-Javadoc) + * @see zero1hd.rhythmbullet.desktop.audio.visualizer.Visualizer#setMM(zero1hd.rhythmbullet.audio.MusicManager) + */ + @Override public void setMM(MusicManager mm) { try { Field sourceIDField = ClassReflection.getDeclaredField(OpenALMusic.class, "sourceID"); @@ -123,4 +133,23 @@ public class Visualizer extends MusicManagerFFT { super.setMM(mm); } + + @Override + public MusicManager getMM() { + return mm; + } + + @Override + public void render(Batch batch, float parentAlpha) { + } + + @Override + public float[] getAudioPCMData() { + return getAudioPCM(); + } + + @Override + public void fft() { + calculate(); + } } diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/HorizontalVisualizerWidget.java b/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/HorizontalVisualizerWidget.java index 9dab8b6..f078999 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/HorizontalVisualizerWidget.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/HorizontalVisualizerWidget.java @@ -7,7 +7,8 @@ import com.badlogic.gdx.scenes.scene2d.ui.Widget; import com.badlogic.gdx.utils.Disposable; import zero1hd.rhythmbullet.audio.MusicManager; -import zero1hd.rhythmbullet.desktop.audio.visualizer.HorizontalVisualizer; +import zero1hd.rhythmbullet.audio.visualizer.HorizontalVisualizer; +import zero1hd.rhythmbullet.desktop.audio.visualizer.DesktopVisualizer; public class HorizontalVisualizerWidget extends Widget implements Disposable { private HorizontalVisualizer vis; @@ -17,7 +18,7 @@ public class HorizontalVisualizerWidget extends Widget implements Disposable { private float visRefreshRate; private float timer; public HorizontalVisualizerWidget() { - vis = new HorizontalVisualizer(); + vis = new HorizontalVisualizer(new DesktopVisualizer()); } @Override @@ -49,7 +50,7 @@ public class HorizontalVisualizerWidget extends Widget implements Disposable { if (timer >= visRefreshRate) { timer = 0; vis.calcPCMData(); - vis.calculate(delta); + vis.calculate(); } else { timer += delta; } @@ -98,7 +99,7 @@ public class HorizontalVisualizerWidget extends Widget implements Disposable { return updatePositioning; } - public HorizontalVisualizer getVis() { + public HorizontalVisualizer getVisualizerType() { return vis; } diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/TitleBarVisualizer.java b/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/TitleBarVisualizer.java index 0cc30b3..6d9c8b7 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/TitleBarVisualizer.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/components/TitleBarVisualizer.java @@ -33,18 +33,18 @@ public class TitleBarVisualizer extends Group implements Disposable { public TitleBarVisualizer(AssetManager assets) { if (assets == null) throw new NullPointerException("TitleBarVisualizer requires assets manager... ITS NULL YOU FOOL"); visual = new HorizontalVisualizerWidget(); - visual.getVis().setSpaceBetweenBars(visual.getVis().getBarWidth()- 2); + visual.getVisualizerType().setSpaceBetweenBars(visual.getVisualizerType().getBarWidth()- 2); addActor(visual); setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()*0.2f); setPosition(0, (Gdx.graphics.getHeight()-getHeight())/2f); visual.setWidth(getWidth()); visual.setHeight(getHeight()); - visual.getVis().flip(); - visual.getVis().reverse(); + visual.getVisualizerType().flip(); + visual.getVisualizerType().reverse(); visual2 = new MirrorVisualizer(); visual.setUpdatePositioning(false); - visual.getVis().addMirrorVisualizer(visual2); + visual.getVisualizerType().addMirrorVisualizer(visual2); visual2.setyPos(MathUtils.round(getHeight())); visual.setY(-2); visual.updateVisualPosition(); @@ -85,7 +85,7 @@ public class TitleBarVisualizer extends Group implements Disposable { @Override public void act(float delta) { if (particleLimitTime > 1f/60f) { - if (visual.getVis().getMm() != null && visual.getVis().getMm().isPlaying() && visual.getVis().getCurrentAvg() > visual.getVis().getMaxAvgHeight()*0.55f) { + if (visual.getVisualizerType().getVisualizer().getMM() != null && visual.getVisualizerType().getVisualizer().getMM().isPlaying() && visual.getVisualizerType().getCurrentAvg() > visual.getVisualizerType().getMaxAvgHeight()*0.55f) { PooledEffect effect = beatEffectPool.obtain(); effect.setPosition(0, 0); effects.add(effect); diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/pages/OptionsPage.java b/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/pages/OptionsPage.java index a4dff04..9f340db 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/pages/OptionsPage.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/graphics/ui/pages/OptionsPage.java @@ -21,12 +21,10 @@ public class OptionsPage extends Page { private ProgressBar musicVolSlider; private ProgressBar fxVolSlider; private TextField directoryField; - private MusicListController mlc; private float musicSearchTimer; - public OptionsPage(final RhythmBullet core, final Vector3 targetPosition, KeybindOptionsPage moreOptionsPage, final MusicListController mlc) { + public OptionsPage(final RhythmBullet core, final Vector3 targetPosition, KeybindOptionsPage moreOptionsPage, MusicListController mlc) { super("General", core.getDefaultSkin()); - this.mlc = mlc; //Back button TextButton backButton = new TextButton("Back", core.getDefaultSkin()); diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/screens/GameScreen.java b/desktop/src/zero1hd/rhythmbullet/desktop/screens/GameScreen.java index 29a4173..7d2c785 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/screens/GameScreen.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/screens/GameScreen.java @@ -10,7 +10,8 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.utils.viewport.ExtendViewport; import zero1hd.rhythmbullet.RhythmBullet; -import zero1hd.rhythmbullet.desktop.audio.visualizer.CircularVisualizer; +import zero1hd.rhythmbullet.audio.visualizer.CircularVisualizer; +import zero1hd.rhythmbullet.desktop.audio.visualizer.DesktopVisualizer; import zero1hd.rhythmbullet.game.GameController; public class GameScreen extends ScreenAdapter { @@ -18,16 +19,17 @@ public class GameScreen extends ScreenAdapter { private SpriteBatch batch; private ExtendViewport viewport; private GameController gc; - private CircularVisualizer cVisualizer; + private CircularVisualizer circleVisualizer; + public GameScreen(AssetManager assets, Preferences prefs) { this.assets = assets; batch = new SpriteBatch(); viewport = new ExtendViewport(RhythmBullet.WORLD_WIDTH, RhythmBullet.WORLD_HEIGHT); - cVisualizer = new CircularVisualizer(); - cVisualizer.setCenter(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2); - cVisualizer.setCamera(viewport.getCamera()); - cVisualizer.setColor(Color.CYAN.toFloatBits()); - cVisualizer.applyPositionChanges(); + circleVisualizer = new CircularVisualizer(new DesktopVisualizer()); + circleVisualizer.setCenter(Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2); + circleVisualizer.setCamera(viewport.getCamera()); + circleVisualizer.setColor(Color.CYAN.toFloatBits()); + circleVisualizer.applyPositionChanges(); } @@ -35,7 +37,7 @@ public class GameScreen extends ScreenAdapter { public void render(float delta) { Gdx.gl.glClearColor(0.22f, 0.22f, 0.22f, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - cVisualizer.drawVisualizer(); + circleVisualizer.drawVisualizer(); super.render(delta); } } diff --git a/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java b/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java index b9349bb..2e40d7d 100755 --- a/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java +++ b/desktop/src/zero1hd/rhythmbullet/desktop/screens/SplashScreen.java @@ -29,7 +29,6 @@ public class SplashScreen extends ScreenAdapter implements AdvancedResizeScreen super.show(); } - float count = 0; @Override public void render(float delta) { Gdx.gl.glClearColor(1f, 1f, 1f, 1f);