@ -29,22 +29,19 @@
* 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.system ;
import com.jme3.app.SettingsDialog ;
import com.jme3.app.SettingsDialog.SelectionListener ;
import com.jme3.asset.AssetManager ;
import com.jme3.asset.AssetNotFoundException ;
import com.jme3.asset.DesktopAssetManager ;
import com.jme3.audio.AudioRenderer ;
import com.jme3.util.JmeFormatter ;
import java.io.IOException ;
import java.io.InputStream ;
import java.net.URL ;
import java.util.concurrent.atomic.AtomicBoolean ;
import java.util.concurrent.atomic.AtomicInteger ;
import java.util.logging.ConsoleHandler ;
import java.util.logging.Handler ;
import java.util.logging.Level ;
import java.util.logging.Logger ;
import javax.swing.SwingUtilities ;
@ -57,54 +54,44 @@ public class JmeSystem {
* Microsoft Windows 32 bit
* /
Windows32 ,
/ * *
* Microsoft Windows 64 bit
* /
Windows64 ,
/ * *
* Linux 32 bit
* /
Linux32 ,
/ * *
* Linux 64 bit
* /
Linux64 ,
/ * *
* Apple Mac OS X 32 bit
* /
MacOSX32 ,
/ * *
* Apple Mac OS X 64 bit
* /
MacOSX64 ,
/ * *
* Apple Mac OS X 32 bit PowerPC
* /
MacOSX_PPC32 ,
/ * *
* Apple Mac OS X 64 bit PowerPC
* /
MacOSX_PPC64 ,
}
private static final Logger logger = Logger . getLogger ( JmeSystem . class . getName ( ) ) ;
private static boolean initialized = false ;
private static boolean lowPermissions = false ;
public static boolean trackDirectMemory ( ) {
public static boolean trackDirectMemory ( ) {
return false ;
}
public static void setLowPermissions ( boolean lowPerm ) {
public static void setLowPermissions ( boolean lowPerm ) {
lowPermissions = lowPerm ;
}
@ -112,30 +99,36 @@ public class JmeSystem {
return lowPermissions ;
}
public static AssetManager newAssetManager ( URL configFile ) {
public static AssetManager newAssetManager ( URL configFile ) {
return new DesktopAssetManager ( configFile ) ;
}
public static AssetManager newAssetManager ( ) {
public static AssetManager newAssetManager ( ) {
return new DesktopAssetManager ( null ) ;
}
public static boolean showSettingsDialog ( AppSettings sourceSettings , final boolean loadFromRegistry ) {
if ( SwingUtilities . isEventDispatchThread ( ) )
public static boolean showSettingsDialog ( AppSettings sourceSettings , final boolean loadFromRegistry ) {
if ( SwingUtilities . isEventDispatchThread ( ) ) {
throw new IllegalStateException ( "Cannot run from EDT" ) ;
}
final AppSettings settings = new AppSettings ( false ) ;
settings . copyFrom ( sourceSettings ) ;
final URL iconUrl = JmeSystem . class . getResource ( sourceSettings . getSettingsDialogImage ( ) ) ;
String iconPath = sourceSettings . getSettingsDialogImage ( ) ;
final URL iconUrl = JmeSystem . class . getResource ( iconPath . startsWith ( "/" ) ? iconPath : "/" + iconPath ) ;
if ( iconUrl = = null ) {
throw new AssetNotFoundException ( sourceSettings . getSettingsDialogImage ( ) ) ;
}
final AtomicBoolean done = new AtomicBoolean ( ) ;
final AtomicInteger result = new AtomicInteger ( ) ;
final Object lock = new Object ( ) ;
final SelectionListener selectionListener = new SelectionListener ( ) {
public void onSelection ( int selection ) {
synchronized ( lock ) {
final SelectionListener selectionListener = new SelectionListener ( ) {
public void onSelection ( int selection ) {
synchronized ( lock ) {
done . set ( true ) ;
result . set ( selection ) ;
lock . notifyAll ( ) ;
@ -143,21 +136,23 @@ public class JmeSystem {
}
} ;
SwingUtilities . invokeLater ( new Runnable ( ) {
public void run ( ) {
synchronized ( lock ) {
SettingsDialog dialog = new SettingsDialog ( settings , iconUrl , loadFromRegistry ) ;
SettingsDialog dialog = new SettingsDialog ( settings , iconUrl , loadFromRegistry ) ;
dialog . setSelectionListener ( selectionListener ) ;
dialog . showDialog ( ) ;
}
}
} ) ;
synchronized ( lock ) {
while ( ! done . get ( ) )
synchronized ( lock ) {
while ( ! done . get ( ) ) {
try {
lock . wait ( ) ;
} catch ( InterruptedException ex ) {
}
}
}
sourceSettings . copyFrom ( settings ) ;
@ -165,48 +160,49 @@ public class JmeSystem {
return result . get ( ) = = SettingsDialog . APPROVE_SELECTION ;
}
private static boolean is64Bit ( String arch ) {
if ( arch . equals ( "x86" ) )
private static boolean is64Bit ( String arch ) {
if ( arch . equals ( "x86" ) ) {
return false ;
else if ( arch . equals ( "amd64" ) )
} else if ( arch . equals ( "amd64" ) ) {
return true ;
else if ( arch . equals ( "x86_64" ) )
} else if ( arch . equals ( "x86_64" ) ) {
return true ;
else if ( arch . equals ( "ppc" ) | | arch . equals ( "PowerPC" ) )
} else if ( arch . equals ( "ppc" ) | | arch . equals ( "PowerPC" ) ) {
return false ;
else if ( arch . equals ( "ppc64" ) )
} else if ( arch . equals ( "ppc64" ) ) {
return true ;
else if ( arch . equals ( "i386" ) | | arch . equals ( "i686" ) )
} else if ( arch . equals ( "i386" ) | | arch . equals ( "i686" ) ) {
return false ;
else if ( arch . equals ( "universal" ) )
} else if ( arch . equals ( "universal" ) ) {
return false ;
else
throw new UnsupportedOperationException ( "Unsupported architecture: " + arch ) ;
} else {
throw new UnsupportedOperationException ( "Unsupported architecture: " + arch ) ;
}
}
public static Platform getPlatform ( ) {
public static Platform getPlatform ( ) {
String os = System . getProperty ( "os.name" ) . toLowerCase ( ) ;
String arch = System . getProperty ( "os.arch" ) . toLowerCase ( ) ;
boolean is64 = is64Bit ( arch ) ;
if ( os . contains ( "windows" ) ) {
if ( os . contains ( "windows" ) ) {
return is64 ? Platform . Windows64 : Platform . Windows32 ;
} else if ( os . contains ( "linux" ) | | os . contains ( "freebsd" ) | | os . contains ( "sunos" ) ) {
} else if ( os . contains ( "linux" ) | | os . contains ( "freebsd" ) | | os . contains ( "sunos" ) ) {
return is64 ? Platform . Linux64 : Platform . Linux32 ;
} else if ( os . contains ( "mac os x" ) | | os . contains ( "darwin" ) ) {
if ( arch . startsWith ( "ppc" ) ) {
} else if ( os . contains ( "mac os x" ) | | os . contains ( "darwin" ) ) {
if ( arch . startsWith ( "ppc" ) ) {
return is64 ? Platform . MacOSX_PPC64 : Platform . MacOSX_PPC32 ;
} else {
} else {
return is64 ? Platform . MacOSX64 : Platform . MacOSX32 ;
}
} else {
throw new UnsupportedOperationException ( "The specified platform: " + os + " is not supported." ) ;
} else {
throw new UnsupportedOperationException ( "The specified platform: " + os + " is not supported." ) ;
}
}
private static JmeContext newContextLwjgl ( AppSettings settings , JmeContext . Type type ) {
try {
private static JmeContext newContextLwjgl ( AppSettings settings , JmeContext . Type type ) {
try {
Class < ? extends JmeContext > ctxClazz = null ;
switch ( type ) {
switch ( type ) {
case Canvas :
ctxClazz = ( Class < ? extends JmeContext > ) Class . forName ( "com.jme3.system.lwjgl.LwjglCanvas" ) ;
break ;
@ -221,22 +217,22 @@ public class JmeSystem {
}
return ctxClazz . newInstance ( ) ;
} catch ( InstantiationException ex ) {
} catch ( InstantiationException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( IllegalAccessException ex ) {
} catch ( IllegalAccessException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( ClassNotFoundException ex ) {
logger . log ( Level . SEVERE , "CRITICAL ERROR: Context class is missing!\n" +
"Make sure jme3_lwjgl-ogl is on the classpath." , ex ) ;
} catch ( ClassNotFoundException ex ) {
logger . log ( Level . SEVERE , "CRITICAL ERROR: Context class is missing!\n"
+ "Make sure jme3_lwjgl-ogl is on the classpath." , ex ) ;
}
return null ;
}
private static JmeContext newContextJogl ( AppSettings settings , JmeContext . Type type ) {
try {
private static JmeContext newContextJogl ( AppSettings settings , JmeContext . Type type ) {
try {
Class < ? extends JmeContext > ctxClazz = null ;
switch ( type ) {
switch ( type ) {
case Display :
ctxClazz = ( Class < ? extends JmeContext > ) Class . forName ( "com.jme3.system.jogl.JoglDisplay" ) ;
break ;
@ -248,30 +244,30 @@ public class JmeSystem {
}
return ctxClazz . newInstance ( ) ;
} catch ( InstantiationException ex ) {
} catch ( InstantiationException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( IllegalAccessException ex ) {
} catch ( IllegalAccessException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( ClassNotFoundException ex ) {
logger . log ( Level . SEVERE , "CRITICAL ERROR: Context class is missing!\n" +
"Make sure jme3_jogl is on the classpath." , ex ) ;
} catch ( ClassNotFoundException ex ) {
logger . log ( Level . SEVERE , "CRITICAL ERROR: Context class is missing!\n"
+ "Make sure jme3_jogl is on the classpath." , ex ) ;
}
return null ;
}
private static JmeContext newContextCustom ( AppSettings settings , JmeContext . Type type ) {
try {
private static JmeContext newContextCustom ( AppSettings settings , JmeContext . Type type ) {
try {
String className = settings . getRenderer ( ) . substring ( "CUSTOM" . length ( ) ) ;
Class < ? extends JmeContext > ctxClazz = null ;
ctxClazz = ( Class < ? extends JmeContext > ) Class . forName ( className ) ;
return ctxClazz . newInstance ( ) ;
} catch ( InstantiationException ex ) {
} catch ( InstantiationException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( IllegalAccessException ex ) {
} catch ( IllegalAccessException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( ClassNotFoundException ex ) {
} catch ( ClassNotFoundException ex ) {
logger . log ( Level . SEVERE , "CRITICAL ERROR: Context class is missing!" , ex ) ;
}
@ -282,84 +278,82 @@ public class JmeSystem {
initialize ( settings ) ;
JmeContext ctx ;
if ( settings . getRenderer ( ) = = null
| | settings . getRenderer ( ) . equals ( "NULL" )
| | contextType = = JmeContext . Type . Headless ) {
| | settings . getRenderer ( ) . equals ( "NULL" )
| | contextType = = JmeContext . Type . Headless ) {
ctx = new NullContext ( ) ;
ctx . setSettings ( settings ) ;
} else if ( settings . getRenderer ( ) . startsWith ( "LWJGL" ) ) {
} else if ( settings . getRenderer ( ) . startsWith ( "LWJGL" ) ) {
ctx = newContextLwjgl ( settings , contextType ) ;
ctx . setSettings ( settings ) ;
} else if ( settings . getRenderer ( ) . startsWith ( "JOGL" ) ) {
} else if ( settings . getRenderer ( ) . startsWith ( "JOGL" ) ) {
ctx = newContextJogl ( settings , contextType ) ;
ctx . setSettings ( settings ) ;
} else if ( settings . getRenderer ( ) . startsWith ( "CUSTOM" ) ) {
} else if ( settings . getRenderer ( ) . startsWith ( "CUSTOM" ) ) {
ctx = newContextCustom ( settings , contextType ) ;
ctx . setSettings ( settings ) ;
} else {
} else {
throw new UnsupportedOperationException (
"Unrecognizable renderer specified: " +
settings . getRenderer ( ) ) ;
"Unrecognizable renderer specified: "
+ settings . getRenderer ( ) ) ;
}
return ctx ;
}
public static AudioRenderer newAudioRenderer ( AppSettings settings ) {
public static AudioRenderer newAudioRenderer ( AppSettings settings ) {
initialize ( settings ) ;
Class < ? extends AudioRenderer > clazz = null ;
try {
if ( settings . getAudioRenderer ( ) . startsWith ( "LWJGL" ) ) {
if ( settings . getAudioRenderer ( ) . startsWith ( "LWJGL" ) ) {
clazz = ( Class < ? extends AudioRenderer > ) Class . forName ( "com.jme3.audio.lwjgl.LwjglAudioRenderer" ) ;
} else if ( settings . getAudioRenderer ( ) . startsWith ( "JOAL" ) ) {
} else if ( settings . getAudioRenderer ( ) . startsWith ( "JOAL" ) ) {
clazz = ( Class < ? extends AudioRenderer > ) Class . forName ( "com.jme3.audio.joal.JoalAudioRenderer" ) ;
} else {
} else {
throw new UnsupportedOperationException (
"Unrecognizable audio renderer specified: " +
settings . getAudioRenderer ( ) ) ;
"Unrecognizable audio renderer specified: "
+ settings . getAudioRenderer ( ) ) ;
}
AudioRenderer ar = clazz . newInstance ( ) ;
return ar ;
} catch ( InstantiationException ex ) {
} catch ( InstantiationException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( IllegalAccessException ex ) {
} catch ( IllegalAccessException ex ) {
logger . log ( Level . SEVERE , "Failed to create context" , ex ) ;
} catch ( ClassNotFoundException ex ) {
logger . log ( Level . SEVERE , "CRITICAL ERROR: Audio implementation class is missing!\n" +
"Make sure jme3_lwjgl-oal or jm3_joal is on the classpath." , ex ) ;
} catch ( ClassNotFoundException ex ) {
logger . log ( Level . SEVERE , "CRITICAL ERROR: Audio implementation class is missing!\n"
+ "Make sure jme3_lwjgl-oal or jm3_joal is on the classpath." , ex ) ;
}
return null ;
}
public static void initialize ( AppSettings settings ) {
if ( initialized )
public static void initialize ( AppSettings settings ) {
if ( initialized ) {
return ;
}
initialized = true ;
try {
if ( ! lowPermissions ) {
if ( ! lowPermissions ) {
// can only modify logging settings
// if permissions are available
// JmeFormatter formatter = new JmeFormatter();
// Handler fileHandler = new FileHandler("jme.log");
// fileHandler.setFormatter(formatter);
// Logger.getLogger("").addHandler(fileHandler);
// Handler consoleHandler = new ConsoleHandler();
// consoleHandler.setFormatter(formatter);
// Logger.getLogger("").removeHandler(Logger.getLogger("").getHandlers()[0]);
// Logger.getLogger("").addHandler(consoleHandler);
}
// } catch (IOException ex){
// logger.log(Level.SEVERE, "I/O Error while creating log file", ex);
} catch ( SecurityException ex ) {
} catch ( SecurityException ex ) {
logger . log ( Level . SEVERE , "Security error in creating log file" , ex ) ;
}
logger . log ( Level . INFO , "Running on {0}" , getFullName ( ) ) ;
if ( ! lowPermissions ) {
if ( ! lowPermissions ) {
try {
Natives . extractNativeLibs ( getPlatform ( ) , settings ) ;
} catch ( IOException ex ) {
@ -368,15 +362,15 @@ public class JmeSystem {
}
}
public static String getFullName ( ) {
public static String getFullName ( ) {
return "jMonkey Engine 3 Alpha 0.6" ;
}
public static InputStream getResourceAsStream ( String name ) {
public static InputStream getResourceAsStream ( String name ) {
return JmeSystem . class . getResourceAsStream ( name ) ;
}
public static URL getResource ( String name ) {
public static URL getResource ( String name ) {
return JmeSystem . class . getResource ( name ) ;
}
}