123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- /*
- * Copyright (c) 2009-2010 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- package com.jme3.app;
- import com.jme3.font.BitmapFont;
- import com.jme3.font.BitmapText;
- import com.jme3.input.FlyByCamera;
- import com.jme3.input.KeyInput;
- import com.jme3.input.controls.ActionListener;
- import com.jme3.input.controls.KeyTrigger;
- import com.jme3.math.Quaternion;
- import com.jme3.math.Vector3f;
- import com.jme3.renderer.RenderManager;
- import com.jme3.renderer.queue.RenderQueue.Bucket;
- import com.jme3.scene.Node;
- import com.jme3.scene.Spatial.CullHint;
- import com.jme3.system.AppSettings;
- import com.jme3.system.JmeContext.Type;
- import com.jme3.system.JmeSystem;
- import com.jme3.util.BufferUtils;
- /**
- * <code>SimpleApplication</code> extends the {@link com.jme3.app.Application}
- * class to provide default functionality like a first-person camera,
- * and an accessible root node that is updated and rendered regularly.
- * Additionally, <code>SimpleApplication</code> will display a statistics view
- * using the {@link com.jme3.app.StatsView} class. It will display
- * the current frames-per-second value on-screen in addition to the statistics.
- * Several keys have special functionality in <code>SimpleApplication</code>:<br/>
- *
- * <table>
- * <tr><td>Esc</td><td>- Close the application</td></tr>
- * <tr><td>C</td><td>- Display the camera position and rotation in the console.</td></tr>
- * <tr><td>M</td><td>- Display memory usage in the console.</td></tr>
- * </table>
- */
- public abstract class SimpleApplication extends Application {
- public static final String INPUT_MAPPING_EXIT = "SIMPLEAPP_Exit";
- public static final String INPUT_MAPPING_CAMERA_POS = "SIMPLEAPP_CameraPos";
- public static final String INPUT_MAPPING_MEMORY = "SIMPLEAPP_Memory";
- public static final String INPUT_MAPPING_HIDE_STATS = "SIMPLEAPP_HideStats";
-
- protected Node rootNode = new Node("Root Node");
- protected Node guiNode = new Node("Gui Node");
- protected float secondCounter = 0.0f;
- protected int frameCounter = 0;
- protected BitmapText fpsText;
- protected BitmapFont guiFont;
- protected StatsView statsView;
- protected FlyByCamera flyCam;
- protected boolean showSettings = true;
- private boolean showFps = true;
- private AppActionListener actionListener = new AppActionListener();
-
- private class AppActionListener implements ActionListener {
- public void onAction(String name, boolean value, float tpf) {
- if (!value) {
- return;
- }
- if (name.equals(INPUT_MAPPING_EXIT)) {
- stop();
- } else if (name.equals(INPUT_MAPPING_CAMERA_POS)) {
- if (cam != null) {
- Vector3f loc = cam.getLocation();
- Quaternion rot = cam.getRotation();
- System.out.println("Camera Position: ("
- + loc.x + ", " + loc.y + ", " + loc.z + ")");
- System.out.println("Camera Rotation: " + rot);
- System.out.println("Camera Direction: " + cam.getDirection());
- }
- } else if (name.equals(INPUT_MAPPING_MEMORY)) {
- BufferUtils.printCurrentDirectMemory(null);
- }else if (name.equals(INPUT_MAPPING_HIDE_STATS)){
- boolean show = showFps;
- setDisplayFps(!show);
- setDisplayStatView(!show);
- }
- }
- }
- public SimpleApplication() {
- super();
- }
- @Override
- public void start() {
- // set some default settings in-case
- // settings dialog is not shown
- boolean loadSettings = false;
- if (settings == null) {
- setSettings(new AppSettings(true));
- loadSettings = true;
- }
- // show settings dialog
- if (showSettings) {
- if (!JmeSystem.showSettingsDialog(settings, loadSettings)) {
- return;
- }
- }
- //re-setting settings they can have been merged from the registry.
- setSettings(settings);
- super.start();
- }
- /**
- * Retrieves flyCam
- * @return flyCam Camera object
- *
- */
- public FlyByCamera getFlyByCamera() {
- return flyCam;
- }
- /**
- * Retrieves guiNode
- * @return guiNode Node object
- *
- */
- public Node getGuiNode() {
- return guiNode;
- }
- /**
- * Retrieves rootNode
- * @return rootNode Node object
- *
- */
- public Node getRootNode() {
- return rootNode;
- }
- public boolean isShowSettings() {
- return showSettings;
- }
- /**
- * Toggles settings window to display at start-up
- * @param showSettings Sets true/false
- *
- */
- public void setShowSettings(boolean showSettings) {
- this.showSettings = showSettings;
- }
- /**
- * Attaches FPS statistics to guiNode and displays it on the screen.
- *
- */
- public void loadFPSText() {
- guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
- fpsText = new BitmapText(guiFont, false);
- fpsText.setLocalTranslation(0, fpsText.getLineHeight(), 0);
- fpsText.setText("Frames per second");
- guiNode.attachChild(fpsText);
- }
- /**
- * Attaches Statistics View to guiNode and displays it on the screen
- * above FPS statistics line.
- *
- */
- public void loadStatsView() {
- statsView = new StatsView("Statistics View", assetManager, renderer.getStatistics());
- // move it up so it appears above fps text
- statsView.setLocalTranslation(0, fpsText.getLineHeight(), 0);
- guiNode.attachChild(statsView);
- }
- @Override
- public void initialize() {
- super.initialize();
- guiNode.setQueueBucket(Bucket.Gui);
- guiNode.setCullHint(CullHint.Never);
- loadFPSText();
- loadStatsView();
- viewPort.attachScene(rootNode);
- guiViewPort.attachScene(guiNode);
- if (inputManager != null) {
- flyCam = new FlyByCamera(cam);
- flyCam.setMoveSpeed(1f);
- flyCam.registerWithInput(inputManager);
- if (context.getType() == Type.Display) {
- inputManager.addMapping(INPUT_MAPPING_EXIT, new KeyTrigger(KeyInput.KEY_ESCAPE));
- }
- inputManager.addMapping(INPUT_MAPPING_CAMERA_POS, new KeyTrigger(KeyInput.KEY_C));
- inputManager.addMapping(INPUT_MAPPING_MEMORY, new KeyTrigger(KeyInput.KEY_M));
- inputManager.addMapping(INPUT_MAPPING_HIDE_STATS, new KeyTrigger(KeyInput.KEY_F5));
- inputManager.addListener(actionListener, INPUT_MAPPING_EXIT,
- INPUT_MAPPING_CAMERA_POS, INPUT_MAPPING_MEMORY, INPUT_MAPPING_HIDE_STATS);
-
- }
- // call user code
- simpleInitApp();
- }
- @Override
- public void update() {
- super.update(); // makes sure to execute AppTasks
- if (speed == 0 || paused) {
- return;
- }
- float tpf = timer.getTimePerFrame() * speed;
- if (showFps) {
- secondCounter += timer.getTimePerFrame();
- frameCounter ++;
- if (secondCounter >= 1.0f) {
- int fps = (int) (frameCounter / secondCounter);
- fpsText.setText("Frames per second: " + fps);
- secondCounter = 0.0f;
- frameCounter = 0;
- }
- }
- // update states
- stateManager.update(tpf);
- // simple update and root node
- simpleUpdate(tpf);
- rootNode.updateLogicalState(tpf);
- guiNode.updateLogicalState(tpf);
- rootNode.updateGeometricState();
- guiNode.updateGeometricState();
- // render states
- stateManager.render(renderManager);
- renderManager.render(tpf, context.isRenderable());
- simpleRender(renderManager);
- stateManager.postRender();
- }
- public void setDisplayFps(boolean show) {
- showFps = show;
- fpsText.setCullHint(show ? CullHint.Never : CullHint.Always);
- }
- public void setDisplayStatView(boolean show) {
- statsView.setEnabled(show);
- statsView.setCullHint(show ? CullHint.Never : CullHint.Always);
- }
- public abstract void simpleInitApp();
- public void simpleUpdate(float tpf) {
- }
- public void simpleRender(RenderManager rm) {
- }
- }
|