From 9bfe178ff8bbfcc21483f39605904a11d3ce9a6d Mon Sep 17 00:00:00 2001 From: "Raybz@Raybz" Date: Fri, 17 May 2013 14:24:14 +0200 Subject: [PATCH] added cinema, tweaked gui --- ShootingStars/lib/vlc/plugins/plugins.dat | Bin 348097 -> 348097 bytes .../wyrez/shootingstars/ShootingStars.java | 9 +- .../shootingstars/factories/Materials.java | 50 ++++++++ .../org/wyrez/shootingstars/game/Cinema.java | 107 ++++++++++++++++++ .../org/wyrez/shootingstars/gui/GameGUI.java | 43 +++++-- .../wyrez/shootingstars/gui/LoadingGui.java | 32 +----- .../gui/listener/GameListener.java | 1 + .../gui/listener/LoadingListener.java | 26 ----- .../wyrez/shootingstars/states/GameState.java | 30 +++++ .../shootingstars/states/LoadingState.java | 31 +++-- .../shootingstars/states/StateManager.java | 8 +- .../states/util/LoadingProgress.java | 4 +- 12 files changed, 245 insertions(+), 96 deletions(-) create mode 100644 ShootingStars/src/org/wyrez/shootingstars/factories/Materials.java create mode 100644 ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java delete mode 100644 ShootingStars/src/org/wyrez/shootingstars/gui/listener/LoadingListener.java diff --git a/ShootingStars/lib/vlc/plugins/plugins.dat b/ShootingStars/lib/vlc/plugins/plugins.dat index b26a5a98132f928c335dc705b232541fc3ed8a9f..b7bb30484f31bd3b4f197c716b34089f664b5c7e 100644 GIT binary patch delta 31118 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 k8W})(6NzaCaG)~ttM_ and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.wyrez.shootingstars.factories; + +import com.jme3.asset.AssetManager; +import com.jme3.material.Material; + +/** + * + * @author Darth Affe + */ +public enum Materials { + + UNSHADED("Common/MatDefs/Misc/Unshaded.j3md", null); + private static AssetManager assetManager; + private String material; + private String texture; + + Materials(String material, String texture) { + this.material = material; + this.texture = texture; + } + + public Material create() { + Material mat = new Material(assetManager, material); + //TODO load textures + //if (texture != null) { + //mat.setTexture("ColorMap", texture); + //} + return mat; + } + + public static void initialize(AssetManager assetManager) { + Materials.assetManager = assetManager; + } +} diff --git a/ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java b/ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java new file mode 100644 index 0000000..99c5eec --- /dev/null +++ b/ShootingStars/src/org/wyrez/shootingstars/game/Cinema.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2013 Darth Affe and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.wyrez.shootingstars.game; + +import com.jme3.material.Material; +import com.jme3.math.FastMath; +import com.jme3.math.Vector3f; +import com.jme3.renderer.RenderManager; +import com.jme3.scene.Geometry; +import com.jme3.texture.Image; +import com.jme3.texture.Texture2D; +import com.sun.jna.Memory; +import java.nio.ByteBuffer; +import org.wyrez.shootingstars.factories.Materials; +import org.wyrez.shootingstars.mesh.CinemaHex; +import uk.co.caprica.vlcj.player.MediaPlayerFactory; +import uk.co.caprica.vlcj.player.direct.BufferFormat; +import uk.co.caprica.vlcj.player.direct.DirectMediaPlayer; +import uk.co.caprica.vlcj.player.direct.RenderCallback; + +/** + * + * @author Darth Affe + */ +public class Cinema extends Geometry implements RenderCallback { + + private static final int WIDTH = 1280; + private static final int HEIGHT = 720; + private static final int DEPTH = 4; + private static final String VIDEO_FORMAT = "RGBA"; + private static final Image.Format TEXTURE_FORMAT = Image.Format.RGBA8; + private final MediaPlayerFactory mediaPlayerFactory; + private final DirectMediaPlayer mediaPlayer; + private final Image videoImage; + private final Texture2D videoTexture; + private final Object bufferLock = new Object(); + private ByteBuffer buffer; + + public Cinema(String file) { + this(file, 1000f); + } + + public Cinema(String file, float radius) { + this(file, radius, Vector3f.ZERO); + } + + public Cinema(String file, float radius, Vector3f pos) { + super("Cinema: " + file, new CinemaHex(pos, radius, + radius * ((float) HEIGHT / (float) WIDTH))); + mediaPlayerFactory = new MediaPlayerFactory("--no-video-title-show", "--quiet"); + mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(VIDEO_FORMAT, WIDTH, HEIGHT, WIDTH * DEPTH, this); + videoImage = new Image(TEXTURE_FORMAT, WIDTH, HEIGHT, null); + videoTexture = new Texture2D(videoImage); + + Material mat = Materials.UNSHADED.create(); + mat.setTexture("ColorMap", videoTexture); + this.setMaterial(mat); + this.rotate(0f, FastMath.PI / 6f, 0f); + + mediaPlayer.prepareMedia(file); + } + + public void play() { + mediaPlayer.play(); + } + + public void pause() { + mediaPlayer.pause(); + } + + public void stop() { + mediaPlayer.stop(); + } + + public void cleanup() { + stop(); + mediaPlayer.release(); + mediaPlayerFactory.release(); + } + + public void render() { + synchronized (bufferLock) { + videoImage.setData(buffer); + } + } + + @Override + public void display(DirectMediaPlayer mediaPlayer, Memory[] nativeBuffers, BufferFormat bufferFormat) { + synchronized (bufferLock) { + buffer = nativeBuffers[0].getByteBuffer(0, WIDTH * HEIGHT * DEPTH); + } + } +} diff --git a/ShootingStars/src/org/wyrez/shootingstars/gui/GameGUI.java b/ShootingStars/src/org/wyrez/shootingstars/gui/GameGUI.java index 3bde6d7..2182847 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/gui/GameGUI.java +++ b/ShootingStars/src/org/wyrez/shootingstars/gui/GameGUI.java @@ -16,9 +16,13 @@ */ package org.wyrez.shootingstars.gui; +import com.jme3.font.BitmapFont; +import com.jme3.input.event.MouseButtonEvent; import com.jme3.math.Vector2f; +import org.wyrez.shootingstars.gui.controls.ButtonBase; import org.wyrez.shootingstars.gui.controls.PanelBase; import org.wyrez.shootingstars.gui.listener.GameListener; +import tonegod.gui.controls.buttons.Button; import tonegod.gui.controls.windows.Panel; import tonegod.gui.core.Screen; @@ -27,9 +31,10 @@ import tonegod.gui.core.Screen; * @author Darth Affe */ public class GameGUI extends Panel { - + private GameListener listener; - + private Panel pnlStart; + public GameGUI(Screen screen, GameListener listener) { super(screen, new Vector2f(0f, 0f), new Vector2f(1280f, 720f)); //create for full hd this.listener = listener; @@ -38,18 +43,38 @@ public class GameGUI extends Panel { create(); this.resize(screen.getWidth(), screen.getHeight(), Borders.SE); } - + private void create() { - //Panel panel = new PanelBase(screen, new Vector2f(15, 15), new Vector2f(800, 500)); - //panel.setIgnoreMouse(true); - - //this.addChild(panel); + pnlStart = new PanelBase(screen, new Vector2f(15, 15), new Vector2f(800, 500)); + pnlStart.setIgnoreMouse(true); + + Button btnStart = new ButtonBase(screen, new Vector2f(360f, 360f), + new Vector2f(200f, 30f)) { + @Override + public void onButtonMouseLeftUp(MouseButtonEvent evt, boolean toggled) { + listener.start(); + } + }; + btnStart.setText("Start Game"); + btnStart.setTextAlign(BitmapFont.Align.Center); + + pnlStart.addChild(btnStart); + + this.addChild(pnlStart); } - + + public void setStart() { + pnlStart.hide(); + } + + public void setWait() { + pnlStart.show(); + } + public void attach() { screen.addElement(this); } - + public void detach() { screen.removeElement(this); } diff --git a/ShootingStars/src/org/wyrez/shootingstars/gui/LoadingGui.java b/ShootingStars/src/org/wyrez/shootingstars/gui/LoadingGui.java index d8415bd..d63590c 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/gui/LoadingGui.java +++ b/ShootingStars/src/org/wyrez/shootingstars/gui/LoadingGui.java @@ -17,15 +17,11 @@ package org.wyrez.shootingstars.gui; import com.jme3.font.BitmapFont; -import com.jme3.input.event.MouseButtonEvent; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f; -import org.wyrez.shootingstars.gui.controls.ButtonBase; import org.wyrez.shootingstars.gui.controls.IndicatorBase; import org.wyrez.shootingstars.gui.controls.PanelBase; -import org.wyrez.shootingstars.gui.listener.LoadingListener; import org.wyrez.shootingstars.states.util.LoadingProgress; -import tonegod.gui.controls.buttons.Button; import tonegod.gui.controls.extras.Indicator; import tonegod.gui.controls.text.Label; import tonegod.gui.controls.windows.Panel; @@ -37,14 +33,11 @@ import tonegod.gui.core.Screen; */ public class LoadingGui extends Panel { - private LoadingListener listener; private Label lblStatus; private Indicator indProgress; - private Button btnStart; - public LoadingGui(Screen screen, LoadingListener listener) { + public LoadingGui(Screen screen) { super(screen, new Vector2f(0f, 0f), new Vector2f(1280f, 720f)); //create for full hd - this.listener = listener; this.setIgnoreMouse(true); this.setIsVisible(false); create(); @@ -64,19 +57,8 @@ public class LoadingGui extends Panel { lblStatus = new Label(screen, new Vector2f(360f, 400f), new Vector2f(200f, 30f)); lblStatus.setTextAlign(BitmapFont.Align.Center); - btnStart = new ButtonBase(screen, new Vector2f(360f, 360f), - new Vector2f(200f, 30f)) { - @Override - public void onButtonMouseLeftUp(MouseButtonEvent evt, boolean toggled) { - listener.startGame(); - } - }; - btnStart.setText("Start Game"); - btnStart.setTextAlign(BitmapFont.Align.Center); - panel.addChild(indProgress); panel.addChild(lblStatus); - panel.addChild(btnStart); this.addChild(panel); } @@ -93,16 +75,4 @@ public class LoadingGui extends Panel { lblStatus.setText(progress.getText()); indProgress.setCurrentValue(progress.getValue()); } - - public void setLoadingStart() { - btnStart.hide(); - indProgress.show(); - lblStatus.show(); - } - - public void setLoadingDone() { - btnStart.show(); - indProgress.hide(); - lblStatus.hide(); - } } diff --git a/ShootingStars/src/org/wyrez/shootingstars/gui/listener/GameListener.java b/ShootingStars/src/org/wyrez/shootingstars/gui/listener/GameListener.java index 0440857..973c9d8 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/gui/listener/GameListener.java +++ b/ShootingStars/src/org/wyrez/shootingstars/gui/listener/GameListener.java @@ -22,4 +22,5 @@ package org.wyrez.shootingstars.gui.listener; */ public interface GameListener { + public void start(); } diff --git a/ShootingStars/src/org/wyrez/shootingstars/gui/listener/LoadingListener.java b/ShootingStars/src/org/wyrez/shootingstars/gui/listener/LoadingListener.java deleted file mode 100644 index 1591627..0000000 --- a/ShootingStars/src/org/wyrez/shootingstars/gui/listener/LoadingListener.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2013 Darth Affe and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.wyrez.shootingstars.gui.listener; - -/** - * - * @author Darth Affe - */ -public interface LoadingListener { - - public void startGame(); -} diff --git a/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java b/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java index 5c8a050..cbb2884 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java +++ b/ShootingStars/src/org/wyrez/shootingstars/states/GameState.java @@ -16,9 +16,12 @@ */ package org.wyrez.shootingstars.states; +import com.jme3.app.FlyCamAppState; import com.jme3.app.state.AbstractAppState; import com.jme3.app.state.AppStateManager; +import com.jme3.renderer.RenderManager; import com.jme3.scene.Node; +import org.wyrez.shootingstars.game.Cinema; import org.wyrez.shootingstars.gui.GameGUI; import org.wyrez.shootingstars.gui.listener.GameListener; import tonegod.gui.core.Screen; @@ -32,6 +35,7 @@ public class GameState extends AbstractAppState implements GameListener { private StateManager stateManager; private Node rootNode; private GameGUI gui; + private Cinema cinema; public GameState(Node rootNode, Screen screen, StateManager stateManager) { this.rootNode = rootNode; @@ -39,17 +43,43 @@ public class GameState extends AbstractAppState implements GameListener { this.stateManager = stateManager; } + public void loadCinema() { + this.cinema = new Cinema("Broken.mp4"); //TODO settings? + } + + public void start() { + gui.setStart(); + cinema.play(); + } + @Override public void stateAttached(AppStateManager stateManager) { + stateManager.attach(new FlyCamAppState()); //TODO debug + rootNode.attachChild(cinema); + gui.setWait(); gui.attach(); } @Override public void stateDetached(AppStateManager stateManager) { + stateManager.detach(new FlyCamAppState()); //TODO debug gui.detach(); + rootNode.detachChild(cinema); + cinema.cleanup(); + } + + @Override + public void render(RenderManager rm) { + cinema.render(); } @Override public void update(float tpf) { } + + @Override + public void cleanup() { + super.cleanup(); + cinema.cleanup(); + } } diff --git a/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java b/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java index 517b7af..1654bf3 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java +++ b/ShootingStars/src/org/wyrez/shootingstars/states/LoadingState.java @@ -19,7 +19,6 @@ package org.wyrez.shootingstars.states; import com.jme3.app.state.AbstractAppState; import com.jme3.app.state.AppStateManager; import org.wyrez.shootingstars.gui.LoadingGui; -import org.wyrez.shootingstars.gui.listener.LoadingListener; import org.wyrez.shootingstars.states.util.LoadingProgress; import tonegod.gui.core.Screen; @@ -27,7 +26,7 @@ import tonegod.gui.core.Screen; * * @author Darth Affe */ -public class LoadingState extends AbstractAppState implements LoadingListener { +public class LoadingState extends AbstractAppState { private StateManager stateManager; private LoadingGui gui; @@ -35,7 +34,7 @@ public class LoadingState extends AbstractAppState implements LoadingListener { public LoadingState(Screen screen, StateManager stateManager) { this.stateManager = stateManager; - this.gui = new LoadingGui(screen, this); + this.gui = new LoadingGui(screen); } @Override @@ -53,7 +52,6 @@ public class LoadingState extends AbstractAppState implements LoadingListener { public void update(float tpf) { switch (currentProgress) { case START: - gui.setLoadingStart(); currentProgress = LoadingProgress.ANALYSE_LOW_BAND; break; case ANALYSE_LOW_BAND: @@ -62,6 +60,10 @@ public class LoadingState extends AbstractAppState implements LoadingListener { break; case ANALYSE_HIGH_BAND: analyseHighBand(); + currentProgress = LoadingProgress.LOADING_CINEMA; + break; + case LOADING_CINEMA: + loadingCinema(); currentProgress = LoadingProgress.GENERATING_SCENE; break; case GENERATING_SCENE: @@ -69,7 +71,7 @@ public class LoadingState extends AbstractAppState implements LoadingListener { currentProgress = LoadingProgress.DONE; break; case DONE: - gui.setLoadingDone(); + done(); break; } gui.updateProgress(currentProgress); @@ -77,29 +79,22 @@ public class LoadingState extends AbstractAppState implements LoadingListener { private void analyseLowBand() { //TODO fill - try { - Thread.sleep(1000); - } catch (Exception ex) { - } } private void analyseHighBand() { //TODO fill - try { - Thread.sleep(1000); - } catch (Exception ex) { - } + } + + private void loadingCinema() { + GameState gs = stateManager.getState(State.GAME); + gs.loadCinema(); } private void generateScene() { //TODO fill - try { - Thread.sleep(1000); - } catch (Exception ex) { - } } - public void startGame() { + public void done() { stateManager.setState(State.GAME); } } diff --git a/ShootingStars/src/org/wyrez/shootingstars/states/StateManager.java b/ShootingStars/src/org/wyrez/shootingstars/states/StateManager.java index f63299d..9a9f34b 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/states/StateManager.java +++ b/ShootingStars/src/org/wyrez/shootingstars/states/StateManager.java @@ -40,11 +40,7 @@ public class StateManager { appStateManager.attach(getState(State.getState())); } - public T getTypedState(State state) { - return (T) getState(state); - } - - public AppState getState(State state) { + public T getState(State state) { Class clazz = state.getClazz(); if (clazz == null) { return null; @@ -52,6 +48,6 @@ public class StateManager { if (!container.isTypeRegistered(clazz)) { container.registerType(clazz, true); } - return (AppState) container.resolve(clazz); + return (T) container.resolve(clazz); } } diff --git a/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java b/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java index b44b6b5..951cd7c 100644 --- a/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java +++ b/ShootingStars/src/org/wyrez/shootingstars/states/util/LoadingProgress.java @@ -23,8 +23,8 @@ package org.wyrez.shootingstars.states.util; public enum LoadingProgress { START("Loading...", 0), ANALYSE_LOW_BAND("Analyse Low-Band...", 0), - ANALYSE_HIGH_BAND("Analyse High-Band...", 1), GENERATING_SCENE("Generating Scene...", 2), - DONE("Done!", 3); + ANALYSE_HIGH_BAND("Analyse High-Band...", 1), LOADING_CINEMA("Loading Cinema", 2), + GENERATING_SCENE("Generating Scene...", 3), DONE("Done!", 3); private String text; private float value;