| /* |
| * Copyright (c) 2009-2012 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.app.state.AbstractAppState; |
| import com.jme3.app.state.AppStateManager; |
| import com.jme3.font.BitmapFont; |
| import com.jme3.font.BitmapText; |
| import com.jme3.renderer.RenderManager; |
| import com.jme3.scene.Node; |
| import com.jme3.scene.Spatial.CullHint; |
| |
| |
| /** |
| * Displays stats in SimpleApplication's GUI node or |
| * using the node and font parameters provided. |
| * |
| * @author Paul Speed |
| */ |
| public class StatsAppState extends AbstractAppState { |
| |
| private Application app; |
| protected StatsView statsView; |
| protected boolean showSettings = true; |
| private boolean showFps = true; |
| private boolean showStats = true; |
| |
| protected Node guiNode; |
| protected float secondCounter = 0.0f; |
| protected int frameCounter = 0; |
| protected BitmapText fpsText; |
| protected BitmapFont guiFont; |
| |
| public StatsAppState() { |
| } |
| |
| public StatsAppState( Node guiNode, BitmapFont guiFont ) { |
| this.guiNode = guiNode; |
| this.guiFont = guiFont; |
| } |
| |
| /** |
| * Called by SimpleApplication to provide an early font |
| * so that the fpsText can be created before init. This |
| * is because several applications expect to directly access |
| * fpsText... unfortunately. |
| */ |
| void setFont( BitmapFont guiFont ) { |
| this.guiFont = guiFont; |
| this.fpsText = new BitmapText(guiFont, false); |
| } |
| |
| public BitmapText getFpsText() { |
| return fpsText; |
| } |
| |
| public StatsView getStatsView() { |
| return statsView; |
| } |
| |
| public float getSecondCounter() { |
| return secondCounter; |
| } |
| |
| public void toggleStats() { |
| setDisplayFps( !showFps ); |
| setDisplayStatView( !showStats ); |
| } |
| |
| public void setDisplayFps(boolean show) { |
| showFps = show; |
| if (fpsText != null) { |
| fpsText.setCullHint(show ? CullHint.Never : CullHint.Always); |
| } |
| } |
| |
| public void setDisplayStatView(boolean show) { |
| showStats = show; |
| if (statsView != null ) { |
| statsView.setEnabled(show); |
| statsView.setCullHint(show ? CullHint.Never : CullHint.Always); |
| } |
| } |
| |
| @Override |
| public void initialize(AppStateManager stateManager, Application app) { |
| super.initialize(stateManager, app); |
| this.app = app; |
| |
| if (app instanceof SimpleApplication) { |
| SimpleApplication simpleApp = (SimpleApplication)app; |
| if (guiNode == null) |
| guiNode = simpleApp.guiNode; |
| if (guiFont == null ) |
| guiFont = simpleApp.guiFont; |
| } |
| |
| if (guiNode == null) { |
| throw new RuntimeException( "No guiNode specific and cannot be automatically determined." ); |
| } |
| |
| if (guiFont == null) { |
| guiFont = app.getAssetManager().loadFont("Interface/Fonts/Default.fnt"); |
| } |
| |
| loadFpsText(); |
| loadStatsView(); |
| } |
| |
| /** |
| * Attaches FPS statistics to guiNode and displays it on the screen. |
| * |
| */ |
| public void loadFpsText() { |
| if (fpsText == null) { |
| fpsText = new BitmapText(guiFont, false); |
| } |
| |
| fpsText.setLocalTranslation(0, fpsText.getLineHeight(), 0); |
| fpsText.setText("Frames per second"); |
| fpsText.setCullHint(showFps ? CullHint.Never : CullHint.Always); |
| 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", |
| app.getAssetManager(), |
| app.getRenderer().getStatistics()); |
| // move it up so it appears above fps text |
| statsView.setLocalTranslation(0, fpsText.getLineHeight(), 0); |
| statsView.setEnabled(showStats); |
| statsView.setCullHint(showStats ? CullHint.Never : CullHint.Always); |
| guiNode.attachChild(statsView); |
| } |
| |
| @Override |
| public void setEnabled(boolean enabled) { |
| super.setEnabled(enabled); |
| |
| if (enabled) { |
| fpsText.setCullHint(showFps ? CullHint.Never : CullHint.Always); |
| statsView.setEnabled(showStats); |
| statsView.setCullHint(showStats ? CullHint.Never : CullHint.Always); |
| } else { |
| fpsText.setCullHint(CullHint.Always); |
| statsView.setEnabled(false); |
| statsView.setCullHint(CullHint.Always); |
| } |
| } |
| |
| @Override |
| public void update(float tpf) { |
| if (showFps) { |
| secondCounter += app.getTimer().getTimePerFrame(); |
| frameCounter ++; |
| if (secondCounter >= 1.0f) { |
| int fps = (int) (frameCounter / secondCounter); |
| fpsText.setText("Frames per second: " + fps); |
| secondCounter = 0.0f; |
| frameCounter = 0; |
| } |
| } |
| } |
| |
| @Override |
| public void cleanup() { |
| super.cleanup(); |
| |
| guiNode.detachChild(statsView); |
| guiNode.detachChild(fpsText); |
| } |
| |
| |
| } |