OSDN Git Service

Set optimal mime types and executable settings.
[mikumikustudio/MikuMikuStudio.git] / src / com / jme / app / BaseHeadlessApp.java
1 /*
2  * Copyright (c) 2003-2009 jMonkeyEngine
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in the
14  *   documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17  *   may be used to endorse or promote products derived from this software
18  *   without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 // $Id$
33 package com.jme.app;
34
35 import java.util.logging.Level;
36 import java.util.logging.Logger;
37
38 import com.jme.renderer.Renderer;
39 import com.jme.system.GameSettings;
40
41 /**
42  * A game implementation suitable for use in 'headless' applications.
43  * <p>
44  * This is basically identical to {@link BaseGame} expect for the fact that it
45  * does not update the user input or call {@code Thread#yield()} on each pass
46  * through the main loop.
47  *
48  * @author Joshua Slack, Mark Powell, Eric Woroshow
49  * @version $Revision$, $Date$
50  */
51 public abstract class BaseHeadlessApp extends AbstractGame {
52     private static final Logger logger = Logger.getLogger(BaseHeadlessApp.class
53             .getName());
54
55   /**
56    * The simplest main game loop possible: render and update as fast as
57    * possible.
58    */
59   public final void start() {
60     logger.info( "Application started.");
61     try {
62       getAttributes();
63
64       initSystem();
65
66       assertDisplayCreated();
67
68       initGame();
69
70       //main loop
71             Renderer r = display.getRenderer();
72       while (!finished && !display.isClosing()) {
73         //update game state, do not use interpolation parameter
74         update( -1.0f);
75
76         //render
77         render( -1.0f);
78
79         //draw queue contents
80         r.displayBackBuffer();
81       }
82     }
83     catch (Throwable t) {
84         logger.logp(Level.SEVERE, this.getClass().toString(), "start()", "Exception in game loop", t);
85         t.printStackTrace();
86     }
87
88     cleanup();
89     logger.info( "Application ending.");
90
91     if (display != null)
92             display.reset();
93     quit();
94   }
95
96   /**
97    * Quits the program abruptly using <code>System.exit</code>.
98    * @see AbstractGame#quit()
99    */
100   protected void quit() {
101       if (display != null)
102           display.close();
103     System.exit(0);
104   }
105
106   /**
107    * @param interpolation unused in this implementation
108    * @see AbstractGame#update(float interpolation)
109    */
110   protected abstract void update(float interpolation);
111
112   /**
113    * @param interpolation unused in this implementation
114    * @see AbstractGame#render(float interpolation)
115    */
116   protected abstract void render(float interpolation);
117
118   /**
119    * @see AbstractGame#initSystem()
120    */
121   protected abstract void initSystem();
122
123   /**
124    * @see AbstractGame#initGame()
125    */
126   protected abstract void initGame();
127
128   /**
129    * @see AbstractGame#reinit()
130    */
131   protected abstract void reinit();
132
133   /**
134    * @see AbstractGame#cleanup()
135    */
136   protected abstract void cleanup();
137
138   /**
139    * TODO:  Implement
140    * @see AbstractGame#getNewSettings
141    */
142   protected GameSettings getNewSettings() {
143       return null;
144   }
145 }