diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/1.jpg b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/1.jpg new file mode 100644 index 000000000..7886f41fc Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/1.jpg differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/2.jpg b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/2.jpg new file mode 100644 index 000000000..0fc95724d Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/2.jpg differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/3.jpg b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/3.jpg new file mode 100644 index 000000000..e966d4faf Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/3.jpg differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/3d_models.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/3d_models.html index 695e39682..5e929f3d4 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/3d_models.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/3d_models.html @@ -40,14 +40,20 @@ To create 3D models and scenes, you need a 3D Mesh Editor such as

-Tip: Consider creating for more complex models, it looks more professional. +Tip: Learn how to create for more complex models, it looks more professional.

-3D mesh editors are third-party products, so please consult their documentation for instructions how to use them. Here is an example workflow for Blender users: +3D model editors are third-party products, so please consult their documentation for instructions how to use them. Here is an example workflow for Blender users: +

+

+ To export your models as Ogre XML meshes with materials:

    diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/4.jpg b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/4.jpg new file mode 100644 index 000000000..913e1c5a0 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/4.jpg differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/5.jpg b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/5.jpg new file mode 100644 index 000000000..3fe9f2499 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/5.jpg differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/6.jpg b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/6.jpg new file mode 100644 index 000000000..c2fc1a6cc Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/6.jpg differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/application_states.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/application_states.html index 6ba77b41e..d97b4765c 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/application_states.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/application_states.html @@ -156,7 +156,7 @@ this.app = (SimpleApplication) app; - cleanup()This methid is executed after you remove the AppState from the game. Here you implement clean-up code for when this state is detached. You can modify the scene graph from here (e.g. detach nodes). + cleanup()This method is executed after you remove the AppState from the game. Here you implement clean-up code for when this state is detached. You can modify the scene graph from here (e.g. detach nodes). update(float tpf)Here you implement the behaviour that you want to hook into the simpleUpdate() loop while this state is attached to the game. You can modify the scene graph from here. diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/asset_manager.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/asset_manager.html index 72e71ffa3..07bfb1ebb 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/asset_manager.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/asset_manager.html @@ -272,6 +272,11 @@ Convert assets as described above.

    +

    If you don't use the SDK for some reason, you can still convert models to j3o format: Load any model in Ogre3D or Wavefront format with the AssetManager.loadModel() as a spatial. Then save the spatial as j3o file using BinaryExporter. +

    +

    + +

    Use file version control and let team members check out the project. Your developers open the project in Eclipse (etc) as they are used to. Additionally to their graphic tools, ask your graphic designers to install the jMonkeyEngine SDK, and to check out the codeless project that you just prepared. This makes it easy for non-coding team member to browse and preview game assets, to arrange scenes, and to convert files. At the same time, non-coders don't accidentally mess with code, and developers don't accidentally mess with assets. :)

    diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio_environment_presets.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio_environment_presets.html index 717a4ea77..060daae11 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio_environment_presets.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio_environment_presets.html @@ -14,200 +14,200 @@ Usage:
    Environment Generic = new Environment(
         new float[]{ 0, 7.5f, 1f, -1000, -100, 0, 1.49f, 0.83f, 1f, -2602,
                      0.007f, 0f, 0f, 0f, 200, 0.011f, 0f, 0f, 0f, 0.250f,
    -                 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    +                 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
     audioRenderer.setEnvironment(myEnvironment);
    - +

    Castle

    -
    CastleSmallRoom    = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -800, -2000, 1.22f, 0.83f, 0.31f, -100, 0.022f, 0f, 0f, 0f, 600, 0.011f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    -CastleShortPassage = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -1000, -2000, 2.32f, 0.83f, 0.31f, -100, 0.007f, 0f, 0f, 0f, 200, 0.023f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    -CastleMediumroom   = new Environment ( new float[]{ 26, 8.3f, 0.930f, -1000, -1100, -2000, 2.04f, 0.83f, 0.46f, -400, 0.022f, 0f, 0f, 0f, 400, 0.011f, 0f, 0f, 0f, 0.155f, 0.030f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    -CastleLongpassage  = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -800, -2000, 3.42f, 0.83f, 0.31f, -100, 0.007f, 0f, 0f, 0f, 300, 0.023f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    -CastleLargeroom    = new Environment ( new float[]{ 26, 8.3f, 0.820f, -1000, -1100, -1800, 2.53f, 0.83f, 0.50f, -700, 0.034f, 0f, 0f, 0f, 200, 0.016f, 0f, 0f, 0f, 0.185f, 0.070f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    -CastleHall         = new Environment ( new float[]{ 26, 8.3f, 0.810f, -1000, -1100, -1500, 3.14f, 0.79f, 0.62f, -1500, 0.056f, 0f, 0f, 0f, 100, 0.024f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    -CastleCupboard     = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -1100, -2000, 0.67f, 0.87f, 0.31f, 300, 0.010f, 0f, 0f, 0f, 1100, 0.007f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    -CastleCourtyard    = new Environment ( new float[]{ 26, 8.3f, 0.420f, -1000, -700, -1400, 2.13f, 0.61f, 0.23f, -1300, 0.160f, 0f, 0f, 0f, -300, 0.036f, 0f, 0f, 0f, 0.250f, 0.370f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    -CastleAlcove       = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -600, -2000, 1.64f, 0.87f, 0.31f, 00, 0.007f, 0f, 0f, 0f, 300, 0.034f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} ) );
    +
    CastleSmallRoom    = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -800, -2000, 1.22f, 0.83f, 0.31f, -100, 0.022f, 0f, 0f, 0f, 600, 0.011f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    +CastleShortPassage = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -1000, -2000, 2.32f, 0.83f, 0.31f, -100, 0.007f, 0f, 0f, 0f, 200, 0.023f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    +CastleMediumroom   = new Environment ( new float[]{ 26, 8.3f, 0.930f, -1000, -1100, -2000, 2.04f, 0.83f, 0.46f, -400, 0.022f, 0f, 0f, 0f, 400, 0.011f, 0f, 0f, 0f, 0.155f, 0.030f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    +CastleLongpassage  = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -800, -2000, 3.42f, 0.83f, 0.31f, -100, 0.007f, 0f, 0f, 0f, 300, 0.023f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    +CastleLargeroom    = new Environment ( new float[]{ 26, 8.3f, 0.820f, -1000, -1100, -1800, 2.53f, 0.83f, 0.50f, -700, 0.034f, 0f, 0f, 0f, 200, 0.016f, 0f, 0f, 0f, 0.185f, 0.070f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    +CastleHall         = new Environment ( new float[]{ 26, 8.3f, 0.810f, -1000, -1100, -1500, 3.14f, 0.79f, 0.62f, -1500, 0.056f, 0f, 0f, 0f, 100, 0.024f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    +CastleCupboard     = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -1100, -2000, 0.67f, 0.87f, 0.31f, 300, 0.010f, 0f, 0f, 0f, 1100, 0.007f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    +CastleCourtyard    = new Environment ( new float[]{ 26, 8.3f, 0.420f, -1000, -700, -1400, 2.13f, 0.61f, 0.23f, -1300, 0.160f, 0f, 0f, 0f, -300, 0.036f, 0f, 0f, 0f, 0.250f, 0.370f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} );
    +CastleAlcove       = new Environment ( new float[]{ 26, 8.3f, 0.890f, -1000, -600, -2000, 1.64f, 0.87f, 0.31f, 00, 0.007f, 0f, 0f, 0f, 300, 0.034f, 0f, 0f, 0f, 0.138f, 0.080f, 0.250f, 0f, -5f, 5168.6f, 139.5f, 0f, 0x20} );
    - +

    Warehouse, Factory

    -
    FactoryAlcove       = new Environment ( new float[]{ 26, 1.8f, 0.590f, -1200, -200, -600, 3.14f, 0.65f, 1.31f, 300, 0.010f, 0f, 0f, 0f, 000, 0.038f, 0f, 0f, 0f, 0.114f, 0.100f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    +
    FactoryAlcove       = new Environment ( new float[]{ 26, 1.8f, 0.590f, -1200, -200, -600, 3.14f, 0.65f, 1.31f, 300, 0.010f, 0f, 0f, 0f, 000, 0.038f, 0f, 0f, 0f, 0.114f, 0.100f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} );
     FactoryShortpassage = new Environment ( new float[]{ 26, 1.8f, 0.640f, -1200, -200, -600, 2.53f, 0.65f, 1.31f, 0, 0.010f, 0f, 0f, 0f, 200, 0.038f, 0f, 0f, 0f, 0.135f, 0.230f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    -FactoryMediumroom   = new Environment ( new float[]{ 26, 1.9f, 0.820f, -1200, -200, -600, 2.76f, 0.65f, 1.31f, -1100, 0.022f, 0f, 0f, 0f, 300, 0.023f, 0f, 0f, 0f, 0.174f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    -FactoryLongpassage  = new Environment ( new float[]{ 26, 1.8f, 0.640f, -1200, -200, -600, 4.06f, 0.65f, 1.31f, 0, 0.020f, 0f, 0f, 0f, 200, 0.037f, 0f, 0f, 0f, 0.135f, 0.230f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    -FactoryLargeroom    = new Environment ( new float[]{ 26, 1.9f, 0.750f, -1200, -300, -400, 4.24f, 0.51f, 1.31f, -1500, 0.039f, 0f, 0f, 0f, 100, 0.023f, 0f, 0f, 0f, 0.231f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    -FactoryHall         = new Environment ( new float[]{ 26, 1.9f, 0.750f, -1000, -300, -400, 7.43f, 0.51f, 1.31f, -2400, 0.073f, 0f, 0f, 0f, -100, 0.027f, 0f, 0f, 0f, 0.250f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    -FactoryCupboard     = new Environment ( new float[]{ 26, 1.7f, 0.630f, -1200, -200, -600, 0.49f, 0.65f, 1.31f, 200, 0.010f, 0f, 0f, 0f, 600, 0.032f, 0f, 0f, 0f, 0.107f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    -FactoryCourtyard    = new Environment ( new float[]{ 26, 1.7f, 0.570f, -1000, -1000, -400, 2.32f, 0.29f, 0.56f, -1300, 0.140f, 0f, 0f, 0f, -800, 0.039f, 0f, 0f, 0f, 0.250f, 0.290f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    -FactorySmallroom    = new Environment ( new float[]{ 26, 1.8f, 0.820f, -1000, -200, -600, 1.72f, 0.65f, 1.31f, -300, 0.010f, 0f, 0f, 0f, 500, 0.024f, 0f, 0f, 0f, 0.119f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ) );
    +FactoryMediumroom = new Environment ( new float[]{ 26, 1.9f, 0.820f, -1200, -200, -600, 2.76f, 0.65f, 1.31f, -1100, 0.022f, 0f, 0f, 0f, 300, 0.023f, 0f, 0f, 0f, 0.174f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ); +FactoryLongpassage = new Environment ( new float[]{ 26, 1.8f, 0.640f, -1200, -200, -600, 4.06f, 0.65f, 1.31f, 0, 0.020f, 0f, 0f, 0f, 200, 0.037f, 0f, 0f, 0f, 0.135f, 0.230f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ); +FactoryLargeroom = new Environment ( new float[]{ 26, 1.9f, 0.750f, -1200, -300, -400, 4.24f, 0.51f, 1.31f, -1500, 0.039f, 0f, 0f, 0f, 100, 0.023f, 0f, 0f, 0f, 0.231f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ); +FactoryHall = new Environment ( new float[]{ 26, 1.9f, 0.750f, -1000, -300, -400, 7.43f, 0.51f, 1.31f, -2400, 0.073f, 0f, 0f, 0f, -100, 0.027f, 0f, 0f, 0f, 0.250f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ); +FactoryCupboard = new Environment ( new float[]{ 26, 1.7f, 0.630f, -1200, -200, -600, 0.49f, 0.65f, 1.31f, 200, 0.010f, 0f, 0f, 0f, 600, 0.032f, 0f, 0f, 0f, 0.107f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ); +FactoryCourtyard = new Environment ( new float[]{ 26, 1.7f, 0.570f, -1000, -1000, -400, 2.32f, 0.29f, 0.56f, -1300, 0.140f, 0f, 0f, 0f, -800, 0.039f, 0f, 0f, 0f, 0.250f, 0.290f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} ); +FactorySmallroom = new Environment ( new float[]{ 26, 1.8f, 0.820f, -1000, -200, -600, 1.72f, 0.65f, 1.31f, -300, 0.010f, 0f, 0f, 0f, 500, 0.024f, 0f, 0f, 0f, 0.119f, 0.070f, 0.250f, 0f, -5f, 3762.6f, 362.5f, 0f, 0x20} );
    - +

    Ice Palace

    -
    IcepalaceAlcove       = new Environment ( new float[]{ 26, 2.7f, 0.840f, -1000, -500, -1100, 2.76f, 1.46f, 0.28f, 100, 0.010f, 0f, 0f, 0f, -100, 0.030f, 0f, 0f, 0f, 0.161f, 0.090f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    +
    IcepalaceAlcove       = new Environment ( new float[]{ 26, 2.7f, 0.840f, -1000, -500, -1100, 2.76f, 1.46f, 0.28f, 100, 0.010f, 0f, 0f, 0f, -100, 0.030f, 0f, 0f, 0f, 0.161f, 0.090f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} );
     IcepalaceShortpassage = new Environment ( new float[]{ 26, 2.7f, 0.750f, -1000, -500, -1100, 1.79f, 1.46f, 0.28f, -600, 0.010f, 0f, 0f, 0f, 100, 0.019f, 0f, 0f, 0f, 0.177f, 0.090f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    -IcepalaceMediumroom   = new Environment ( new float[]{ 26, 2.7f, 0.870f, -1000, -500, -700, 2.22f, 1.53f, 0.32f, -800, 0.039f, 0f, 0f, 0f, 100, 0.027f, 0f, 0f, 0f, 0.186f, 0.120f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    -IcepalaceLongpassage  = new Environment ( new float[]{ 26, 2.7f, 0.770f, -1000, -500, -800, 3.01f, 1.46f, 0.28f, -200, 0.012f, 0f, 0f, 0f, 200, 0.025f, 0f, 0f, 0f, 0.186f, 0.040f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    -IcepalaceLargeroom    = new Environment ( new float[]{ 26, 2.9f, 0.810f, -1000, -500, -700, 3.14f, 1.53f, 0.32f, -1200, 0.039f, 0f, 0f, 0f, 000, 0.027f, 0f, 0f, 0f, 0.214f, 0.110f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    -IcepalaceHall         = new Environment ( new float[]{ 26, 2.9f, 0.760f, -1000, -700, -500, 5.49f, 1.53f, 0.38f, -1900, 0.054f, 0f, 0f, 0f, -400, 0.052f, 0f, 0f, 0f, 0.226f, 0.110f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    -IcepalaceCupboard     = new Environment ( new float[]{ 26, 2.7f, 0.830f, -1000, -600, -1300, 0.76f, 1.53f, 0.26f, 100, 0.012f, 0f, 0f, 0f, 600, 0.016f, 0f, 0f, 0f, 0.143f, 0.080f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    -IcepalaceCourtyard    = new Environment ( new float[]{ 26, 2.9f, 0.590f, -1000, -1100, -1000, 2.04f, 1.20f, 0.38f, -1000, 0.173f, 0f, 0f, 0f, -1000, 0.043f, 0f, 0f, 0f, 0.235f, 0.480f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    -IcepalaceSmallroom    = new Environment ( new float[]{ 26, 2.7f, 0.840f, -1000, -500, -1100, 1.51f, 1.53f, 0.27f, -100, 0.010f, 0f, 0f, 0f, 300, 0.011f, 0f, 0f, 0f, 0.164f, 0.140f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ) );
    +IcepalaceMediumroom = new Environment ( new float[]{ 26, 2.7f, 0.870f, -1000, -500, -700, 2.22f, 1.53f, 0.32f, -800, 0.039f, 0f, 0f, 0f, 100, 0.027f, 0f, 0f, 0f, 0.186f, 0.120f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ); +IcepalaceLongpassage = new Environment ( new float[]{ 26, 2.7f, 0.770f, -1000, -500, -800, 3.01f, 1.46f, 0.28f, -200, 0.012f, 0f, 0f, 0f, 200, 0.025f, 0f, 0f, 0f, 0.186f, 0.040f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ); +IcepalaceLargeroom = new Environment ( new float[]{ 26, 2.9f, 0.810f, -1000, -500, -700, 3.14f, 1.53f, 0.32f, -1200, 0.039f, 0f, 0f, 0f, 000, 0.027f, 0f, 0f, 0f, 0.214f, 0.110f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ); +IcepalaceHall = new Environment ( new float[]{ 26, 2.9f, 0.760f, -1000, -700, -500, 5.49f, 1.53f, 0.38f, -1900, 0.054f, 0f, 0f, 0f, -400, 0.052f, 0f, 0f, 0f, 0.226f, 0.110f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ); +IcepalaceCupboard = new Environment ( new float[]{ 26, 2.7f, 0.830f, -1000, -600, -1300, 0.76f, 1.53f, 0.26f, 100, 0.012f, 0f, 0f, 0f, 600, 0.016f, 0f, 0f, 0f, 0.143f, 0.080f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ); +IcepalaceCourtyard = new Environment ( new float[]{ 26, 2.9f, 0.590f, -1000, -1100, -1000, 2.04f, 1.20f, 0.38f, -1000, 0.173f, 0f, 0f, 0f, -1000, 0.043f, 0f, 0f, 0f, 0.235f, 0.480f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} ); +IcepalaceSmallroom = new Environment ( new float[]{ 26, 2.7f, 0.840f, -1000, -500, -1100, 1.51f, 1.53f, 0.27f, -100, 0.010f, 0f, 0f, 0f, 300, 0.011f, 0f, 0f, 0f, 0.164f, 0.140f, 0.250f, 0f, -5f, 12428.5f, 99.6f, 0f, 0x20} );
    - +

    Space Station

    -
    SpacestationAlcove       = new Environment ( new float[]{ 26, 1.5f, 0.780f, -1000, -300, -100, 1.16f, 0.81f, 0.55f, 300, 0.007f, 0f, 0f, 0f, 000, 0.018f, 0f, 0f, 0f, 0.192f, 0.210f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    -SpacestationMediumroom   = new Environment ( new float[]{ 26, 1.5f, 0.750f, -1000, -400, -100, 3.01f, 0.50f, 0.55f, -800, 0.034f, 0f, 0f, 0f, 100, 0.035f, 0f, 0f, 0f, 0.209f, 0.310f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    -SpacestationShortpassage = new Environment ( new float[]{ 26, 1.5f, 0.870f, -1000, -400, -100, 3.57f, 0.50f, 0.55f, 0, 0.012f, 0f, 0f, 0f, 100, 0.016f, 0f, 0f, 0f, 0.172f, 0.200f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    -SpacestationLongpassage  = new Environment ( new float[]{ 26, 1.9f, 0.820f, -1000, -400, -100, 4.62f, 0.62f, 0.55f, 0, 0.012f, 0f, 0f, 0f, 200, 0.031f, 0f, 0f, 0f, 0.250f, 0.230f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    -SpacestationLargeroom    = new Environment ( new float[]{ 26, 1.8f, 0.810f, -1000, -400, -100, 3.89f, 0.38f, 0.61f, -1000, 0.056f, 0f, 0f, 0f, -100, 0.035f, 0f, 0f, 0f, 0.233f, 0.280f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    -SpacestationHall         = new Environment ( new float[]{ 26, 1.9f, 0.870f, -1000, -400, -100, 7.11f, 0.38f, 0.61f, -1500, 0.100f, 0f, 0f, 0f, -400, 0.047f, 0f, 0f, 0f, 0.250f, 0.250f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    -SpacestationCupboard     = new Environment ( new float[]{ 26, 1.4f, 0.560f, -1000, -300, -100, 0.79f, 0.81f, 0.55f, 300, 0.007f, 0f, 0f, 0f, 500, 0.018f, 0f, 0f, 0f, 0.181f, 0.310f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    -SpacestationSmallroom    = new Environment ( new float[]{ 26, 1.5f, 0.700f, -1000, -300, -100, 1.72f, 0.82f, 0.55f, -200, 0.007f, 0f, 0f, 0f, 300, 0.013f, 0f, 0f, 0f, 0.188f, 0.260f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} ) );
    +
    SpacestationAlcove       = new Environment ( new float[]{ 26, 1.5f, 0.780f, -1000, -300, -100, 1.16f, 0.81f, 0.55f, 300, 0.007f, 0f, 0f, 0f, 000, 0.018f, 0f, 0f, 0f, 0.192f, 0.210f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    +SpacestationMediumroom   = new Environment ( new float[]{ 26, 1.5f, 0.750f, -1000, -400, -100, 3.01f, 0.50f, 0.55f, -800, 0.034f, 0f, 0f, 0f, 100, 0.035f, 0f, 0f, 0f, 0.209f, 0.310f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    +SpacestationShortpassage = new Environment ( new float[]{ 26, 1.5f, 0.870f, -1000, -400, -100, 3.57f, 0.50f, 0.55f, 0, 0.012f, 0f, 0f, 0f, 100, 0.016f, 0f, 0f, 0f, 0.172f, 0.200f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    +SpacestationLongpassage  = new Environment ( new float[]{ 26, 1.9f, 0.820f, -1000, -400, -100, 4.62f, 0.62f, 0.55f, 0, 0.012f, 0f, 0f, 0f, 200, 0.031f, 0f, 0f, 0f, 0.250f, 0.230f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    +SpacestationLargeroom    = new Environment ( new float[]{ 26, 1.8f, 0.810f, -1000, -400, -100, 3.89f, 0.38f, 0.61f, -1000, 0.056f, 0f, 0f, 0f, -100, 0.035f, 0f, 0f, 0f, 0.233f, 0.280f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    +SpacestationHall         = new Environment ( new float[]{ 26, 1.9f, 0.870f, -1000, -400, -100, 7.11f, 0.38f, 0.61f, -1500, 0.100f, 0f, 0f, 0f, -400, 0.047f, 0f, 0f, 0f, 0.250f, 0.250f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    +SpacestationCupboard     = new Environment ( new float[]{ 26, 1.4f, 0.560f, -1000, -300, -100, 0.79f, 0.81f, 0.55f, 300, 0.007f, 0f, 0f, 0f, 500, 0.018f, 0f, 0f, 0f, 0.181f, 0.310f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    +SpacestationSmallroom    = new Environment ( new float[]{ 26, 1.5f, 0.700f, -1000, -300, -100, 1.72f, 0.82f, 0.55f, -200, 0.007f, 0f, 0f, 0f, 300, 0.013f, 0f, 0f, 0f, 0.188f, 0.260f, 0.250f, 0f, -5f, 3316.1f, 458.2f, 0f, 0x20} );
    - +

    Wooden Hut or Ship

    -
    WoodenAlcove           = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1800, -1000, 1.22f, 0.62f, 0.91f, 100, 0.012f, 0f, 0f, 0f, -300, 0.024f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenShortpassage     = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1800, -1000, 1.75f, 0.50f, 0.87f, -100, 0.012f, 0f, 0f, 0f, -400, 0.024f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenMediumroom       = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2000, -1100, 1.47f, 0.42f, 0.82f, -100, 0.049f, 0f, 0f, 0f, -100, 0.029f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenLongpassage      = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2000, -1000, 1.99f, 0.40f, 0.79f, 000, 0.020f, 0f, 0f, 0f, -700, 0.036f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenLargeroom        = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2100, -1100, 2.65f, 0.33f, 0.82f, -100, 0.066f, 0f, 0f, 0f, -200, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenHall             = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2200, -1100, 3.45f, 0.30f, 0.82f, -100, 0.088f, 0f, 0f, 0f, -200, 0.063f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenCupboard         = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1700, -1000, 0.56f, 0.46f, 0.91f, 100, 0.012f, 0f, 0f, 0f, 100, 0.028f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenSmallroom        = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1900, -1000, 0.79f, 0.32f, 0.87f, 00, 0.032f, 0f, 0f, 0f, -100, 0.029f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    -WoodenCourtyard        = new Environment ( new float[]{ 26, 7.5f, 0.650f, -1000, -2200, -1000, 1.79f, 0.35f, 0.79f, -500, 0.123f, 0f, 0f, 0f, -2000, 0.032f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} ) );
    +
    WoodenAlcove           = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1800, -1000, 1.22f, 0.62f, 0.91f, 100, 0.012f, 0f, 0f, 0f, -300, 0.024f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenShortpassage     = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1800, -1000, 1.75f, 0.50f, 0.87f, -100, 0.012f, 0f, 0f, 0f, -400, 0.024f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenMediumroom       = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2000, -1100, 1.47f, 0.42f, 0.82f, -100, 0.049f, 0f, 0f, 0f, -100, 0.029f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenLongpassage      = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2000, -1000, 1.99f, 0.40f, 0.79f, 000, 0.020f, 0f, 0f, 0f, -700, 0.036f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenLargeroom        = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2100, -1100, 2.65f, 0.33f, 0.82f, -100, 0.066f, 0f, 0f, 0f, -200, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenHall             = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -2200, -1100, 3.45f, 0.30f, 0.82f, -100, 0.088f, 0f, 0f, 0f, -200, 0.063f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenCupboard         = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1700, -1000, 0.56f, 0.46f, 0.91f, 100, 0.012f, 0f, 0f, 0f, 100, 0.028f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenSmallroom        = new Environment ( new float[]{ 26, 7.5f, 1f, -1000, -1900, -1000, 0.79f, 0.32f, 0.87f, 00, 0.032f, 0f, 0f, 0f, -100, 0.029f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    +WoodenCourtyard        = new Environment ( new float[]{ 26, 7.5f, 0.650f, -1000, -2200, -1000, 1.79f, 0.35f, 0.79f, -500, 0.123f, 0f, 0f, 0f, -2000, 0.032f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 4705f, 99.6f, 0f, 0x3f} );
    - +

    Sport

    -
    SportEmptystadium      = new Environment ( new float[]{ 26, 7.2f, 1f, -1000, -700, -200, 6.26f, 0.51f, 1.10f, -2400, 0.183f, 0f, 0f, 0f, -800, 0.038f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} ) );
    -SportSquashcourt       = new Environment ( new float[]{ 26, 7.5f, 0.750f, -1000, -1000, -200, 2.22f, 0.91f, 1.16f, -700, 0.007f, 0f, 0f, 0f, -200, 0.011f, 0f, 0f, 0f, 0.126f, 0.190f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} ) );
    -SportSmallswimmingpool = new Environment ( new float[]{ 26, 36.2f, 0.700f, -1000, -200, -100, 2.76f, 1.25f, 1.14f, -400, 0.020f, 0f, 0f, 0f, -200, 0.030f, 0f, 0f, 0f, 0.179f, 0.150f, 0.895f, 0.190f, -5f, 5000f, 250f, 0f, 0x0} ) );
    -SportLargeswimmingpool = new Environment ( new float[]{ 26, 36.2f, 0.820f, -1000, -200, 0, 5.49f, 1.31f, 1.14f, -700, 0.039f, 0f, 0f, 0f, -600, 0.049f, 0f, 0f, 0f, 0.222f, 0.550f, 1.159f, 0.210f, -5f, 5000f, 250f, 0f, 0x0} ) );
    -SportGymnasium         = new Environment ( new float[]{ 26, 7.5f, 0.810f, -1000, -700, -100, 3.14f, 1.06f, 1.35f, -800, 0.029f, 0f, 0f, 0f, -500, 0.045f, 0f, 0f, 0f, 0.146f, 0.140f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} ) );
    -SportFullstadium       = new Environment ( new float[]{ 26, 7.2f, 1f, -1000, -2300, -200, 5.25f, 0.17f, 0.80f, -2000, 0.188f, 0f, 0f, 0f, -1100, 0.038f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} ) );
    +
    SportEmptystadium      = new Environment ( new float[]{ 26, 7.2f, 1f, -1000, -700, -200, 6.26f, 0.51f, 1.10f, -2400, 0.183f, 0f, 0f, 0f, -800, 0.038f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} );
    +SportSquashcourt       = new Environment ( new float[]{ 26, 7.5f, 0.750f, -1000, -1000, -200, 2.22f, 0.91f, 1.16f, -700, 0.007f, 0f, 0f, 0f, -200, 0.011f, 0f, 0f, 0f, 0.126f, 0.190f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} );
    +SportSmallswimmingpool = new Environment ( new float[]{ 26, 36.2f, 0.700f, -1000, -200, -100, 2.76f, 1.25f, 1.14f, -400, 0.020f, 0f, 0f, 0f, -200, 0.030f, 0f, 0f, 0f, 0.179f, 0.150f, 0.895f, 0.190f, -5f, 5000f, 250f, 0f, 0x0} );
    +SportLargeswimmingpool = new Environment ( new float[]{ 26, 36.2f, 0.820f, -1000, -200, 0, 5.49f, 1.31f, 1.14f, -700, 0.039f, 0f, 0f, 0f, -600, 0.049f, 0f, 0f, 0f, 0.222f, 0.550f, 1.159f, 0.210f, -5f, 5000f, 250f, 0f, 0x0} );
    +SportGymnasium         = new Environment ( new float[]{ 26, 7.5f, 0.810f, -1000, -700, -100, 3.14f, 1.06f, 1.35f, -800, 0.029f, 0f, 0f, 0f, -500, 0.045f, 0f, 0f, 0f, 0.146f, 0.140f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} );
    +SportFullstadium       = new Environment ( new float[]{ 26, 7.2f, 1f, -1000, -2300, -200, 5.25f, 0.17f, 0.80f, -2000, 0.188f, 0f, 0f, 0f, -1100, 0.038f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} );
    - +

    Pipes

    -
    Sewerpipe    = new Environment ( new float[]{ 21, 1.7f, 0.800f, -1000, -1000, 0, 2.81f, 0.14f, 1f, 429, 0.014f, 0f, 0f, 0f, 1023, 0.021f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -PipeSmall    = new Environment ( new float[]{ 26, 50.3f, 1f, -1000, -900, -1300, 5.04f, 0.10f, 0.10f, -600, 0.032f, 0f, 0f, 0f, 800, 0.015f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x3f} ) );
    -PipeLongthin = new Environment ( new float[]{ 26, 1.6f, 0.910f, -1000, -700, -1100, 9.21f, 0.18f, 0.10f, -300, 0.010f, 0f, 0f, 0f, -300, 0.022f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x0} ) );
    -PipeLarge    = new Environment ( new float[]{ 26, 50.3f, 1f, -1000, -900, -1300, 8.45f, 0.10f, 0.10f, -800, 0.046f, 0f, 0f, 0f, 400, 0.032f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x3f} ) );
    -PipeResonant = new Environment ( new float[]{ 26, 1.3f, 0.910f, -1000, -700, -1100, 6.81f, 0.18f, 0.10f, -300, 0.010f, 0f, 0f, 0f, 00, 0.022f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x0} ) );
    +
    Sewerpipe    = new Environment ( new float[]{ 21, 1.7f, 0.800f, -1000, -1000, 0, 2.81f, 0.14f, 1f, 429, 0.014f, 0f, 0f, 0f, 1023, 0.021f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +PipeSmall    = new Environment ( new float[]{ 26, 50.3f, 1f, -1000, -900, -1300, 5.04f, 0.10f, 0.10f, -600, 0.032f, 0f, 0f, 0f, 800, 0.015f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x3f} );
    +PipeLongthin = new Environment ( new float[]{ 26, 1.6f, 0.910f, -1000, -700, -1100, 9.21f, 0.18f, 0.10f, -300, 0.010f, 0f, 0f, 0f, -300, 0.022f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x0} );
    +PipeLarge    = new Environment ( new float[]{ 26, 50.3f, 1f, -1000, -900, -1300, 8.45f, 0.10f, 0.10f, -800, 0.046f, 0f, 0f, 0f, 400, 0.032f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x3f} );
    +PipeResonant = new Environment ( new float[]{ 26, 1.3f, 0.910f, -1000, -700, -1100, 6.81f, 0.18f, 0.10f, -300, 0.010f, 0f, 0f, 0f, 00, 0.022f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x0} );
    - +

    Moods

    -
    Heaven    = new Environment ( new float[]{ 26, 19.6f, 0.940f, -1000, -200, -700, 5.04f, 1.12f, 0.56f, -1230, 0.020f, 0f, 0f, 0f, 200, 0.029f, 0f, 0f, 0f, 0.250f, 0.080f, 2.742f, 0.050f, -2f, 5000f, 250f, 0f, 0x3f} ) );
    -Hell      = new Environment ( new float[]{ 26, 100f, 0.570f, -1000, -900, -700, 3.57f, 0.49f, 2f, -10000, 0.020f, 0f, 0f, 0f, 300, 0.030f, 0f, 0f, 0f, 0.110f, 0.040f, 2.109f, 0.520f, -5f, 5000f, 139.5f, 0f, 0x40} ) );
    -Memory    = new Environment ( new float[]{ 26, 8f, 0.850f, -1000, -400, -900, 4.06f, 0.82f, 0.56f, -2800, 0f, 0f, 0f, 0f, 100, 0f, 0f, 0f, 0f, 0.250f, 0f, 0.474f, 0.450f, -10f, 5000f, 250f, 0f, 0x0} ) );
    -Drugged   = new Environment ( new float[]{ 23, 1.9f, 0.500f, -1000, 0, 0, 8.39f, 1.39f, 1f, -115, 0.002f, 0f, 0f, 0f, 985, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 1f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    -Dizzy     = new Environment ( new float[]{ 24, 1.8f, 0.600f, -1000, -400, 0, 17.23f, 0.56f, 1f, -1713, 0.020f, 0f, 0f, 0f, -613, 0.030f, 0f, 0f, 0f, 0.250f, 1f, 0.810f, 0.310f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    -Psychotic = new Environment ( new float[]{ 25, 1f, 0.500f, -1000, -151, 0, 7.56f, 0.91f, 1f, -626, 0.020f, 0f, 0f, 0f, 774, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 4f, 1f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    +
    Heaven    = new Environment ( new float[]{ 26, 19.6f, 0.940f, -1000, -200, -700, 5.04f, 1.12f, 0.56f, -1230, 0.020f, 0f, 0f, 0f, 200, 0.029f, 0f, 0f, 0f, 0.250f, 0.080f, 2.742f, 0.050f, -2f, 5000f, 250f, 0f, 0x3f} );
    +Hell      = new Environment ( new float[]{ 26, 100f, 0.570f, -1000, -900, -700, 3.57f, 0.49f, 2f, -10000, 0.020f, 0f, 0f, 0f, 300, 0.030f, 0f, 0f, 0f, 0.110f, 0.040f, 2.109f, 0.520f, -5f, 5000f, 139.5f, 0f, 0x40} );
    +Memory    = new Environment ( new float[]{ 26, 8f, 0.850f, -1000, -400, -900, 4.06f, 0.82f, 0.56f, -2800, 0f, 0f, 0f, 0f, 100, 0f, 0f, 0f, 0f, 0.250f, 0f, 0.474f, 0.450f, -10f, 5000f, 250f, 0f, 0x0} );
    +Drugged   = new Environment ( new float[]{ 23, 1.9f, 0.500f, -1000, 0, 0, 8.39f, 1.39f, 1f, -115, 0.002f, 0f, 0f, 0f, 985, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 1f, -5f, 5000f, 250f, 0f, 0x1f} );
    +Dizzy     = new Environment ( new float[]{ 24, 1.8f, 0.600f, -1000, -400, 0, 17.23f, 0.56f, 1f, -1713, 0.020f, 0f, 0f, 0f, -613, 0.030f, 0f, 0f, 0f, 0.250f, 1f, 0.810f, 0.310f, -5f, 5000f, 250f, 0f, 0x1f} );
    +Psychotic = new Environment ( new float[]{ 25, 1f, 0.500f, -1000, -151, 0, 7.56f, 0.91f, 1f, -626, 0.020f, 0f, 0f, 0f, 774, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 4f, 1f, -5f, 5000f, 250f, 0f, 0x1f} );
    - +

    Car Racing

    -
    DrivingCommentator    = new Environment ( new float[]{ 26, 3f, 0f, 1000, -500, -600, 2.42f, 0.88f, 0.68f, -1400, 0.093f, 0f, 0f, 0f, -1200, 0.017f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -10f, 5000f, 250f, 0f, 0x20} ) );
    -DrivingPitgarage       = new Environment ( new float[]{ 26, 1.9f, 0.590f, -1000, -300, -500, 1.72f, 0.93f, 0.87f, -500, 0f, 0f, 0f, 0f, 200, 0.016f, 0f, 0f, 0f, 0.250f, 0.110f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x0} ) );
    -DrivingIncarRacer      = new Environment ( new float[]{ 26, 1.1f, 0.800f, -1000, 0, -200, 0.17f, 2f, 0.41f, 500, 0.007f, 0f, 0f, 0f, -300, 0.015f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10268.2f, 251f, 0f, 0x20} ) );
    -DrivingIncarSports     = new Environment ( new float[]{ 26, 1.1f, 0.800f, -1000, -400, 0, 0.17f, 0.75f, 0.41f, 0, 0.010f, 0f, 0f, 0f, -500, 0f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10268.2f, 251f, 0f, 0x20} ) );
    -DrivingIncarLuxury     = new Environment ( new float[]{ 26, 1.6f, 1f, -1000, -2000, -600, 0.13f, 0.41f, 0.46f, -200, 0.010f, 0f, 0f, 0f, 400, 0.010f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10268.2f, 251f, 0f, 0x20} ) );
    -DrivingFullgrandstand  = new Environment ( new float[]{ 26, 8.3f, 1f, -1000, -1100, -400, 3.01f, 1.37f, 1.28f, -900, 0.090f, 0f, 0f, 0f, -1500, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10420.2f, 250f, 0f, 0x1f} ) );
    -DrivingEmptygrandstand = new Environment ( new float[]{ 26, 8.3f, 1f, -1000, 0, -200, 4.62f, 1.75f, 1.40f, -1363, 0.090f, 0f, 0f, 0f, -1200, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10420.2f, 250f, 0f, 0x1f} ) );
    -DrivingTunnel          = new Environment ( new float[]{ 26, 3.1f, 0.810f, -1000, -800, -100, 3.42f, 0.94f, 1.31f, -300, 0.051f, 0f, 0f, 0f, -300, 0.047f, 0f, 0f, 0f, 0.214f, 0.050f, 0.250f, 0f, -5f, 5000f, 155.3f, 0f, 0x20} ) );
    +
    DrivingCommentator    = new Environment ( new float[]{ 26, 3f, 0f, 1000, -500, -600, 2.42f, 0.88f, 0.68f, -1400, 0.093f, 0f, 0f, 0f, -1200, 0.017f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -10f, 5000f, 250f, 0f, 0x20} );
    +DrivingPitgarage       = new Environment ( new float[]{ 26, 1.9f, 0.590f, -1000, -300, -500, 1.72f, 0.93f, 0.87f, -500, 0f, 0f, 0f, 0f, 200, 0.016f, 0f, 0f, 0f, 0.250f, 0.110f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x0} );
    +DrivingIncarRacer      = new Environment ( new float[]{ 26, 1.1f, 0.800f, -1000, 0, -200, 0.17f, 2f, 0.41f, 500, 0.007f, 0f, 0f, 0f, -300, 0.015f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10268.2f, 251f, 0f, 0x20} );
    +DrivingIncarSports     = new Environment ( new float[]{ 26, 1.1f, 0.800f, -1000, -400, 0, 0.17f, 0.75f, 0.41f, 0, 0.010f, 0f, 0f, 0f, -500, 0f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10268.2f, 251f, 0f, 0x20} );
    +DrivingIncarLuxury     = new Environment ( new float[]{ 26, 1.6f, 1f, -1000, -2000, -600, 0.13f, 0.41f, 0.46f, -200, 0.010f, 0f, 0f, 0f, 400, 0.010f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10268.2f, 251f, 0f, 0x20} );
    +DrivingFullgrandstand  = new Environment ( new float[]{ 26, 8.3f, 1f, -1000, -1100, -400, 3.01f, 1.37f, 1.28f, -900, 0.090f, 0f, 0f, 0f, -1500, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10420.2f, 250f, 0f, 0x1f} );
    +DrivingEmptygrandstand = new Environment ( new float[]{ 26, 8.3f, 1f, -1000, 0, -200, 4.62f, 1.75f, 1.40f, -1363, 0.090f, 0f, 0f, 0f, -1200, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 10420.2f, 250f, 0f, 0x1f} );
    +DrivingTunnel          = new Environment ( new float[]{ 26, 3.1f, 0.810f, -1000, -800, -100, 3.42f, 0.94f, 1.31f, -300, 0.051f, 0f, 0f, 0f, -300, 0.047f, 0f, 0f, 0f, 0.214f, 0.050f, 0.250f, 0f, -5f, 5000f, 155.3f, 0f, 0x20} );
    - +

    City

    -
    CityIndoors   = new Environment ( new float[]{ 16, 7.5f, 0.500f, -1000, -800, 0, 1.49f, 0.67f, 1f, -2273, 0.007f, 0f, 0f, 0f, -1691, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -CityStreets   = new Environment ( new float[]{ 26, 3f, 0.780f, -1000, -300, -100, 1.79f, 1.12f, 0.91f, -1100, 0.046f, 0f, 0f, 0f, -1400, 0.028f, 0f, 0f, 0f, 0.250f, 0.200f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} ) );
    -CitySubway    = new Environment ( new float[]{ 26, 3f, 0.740f, -1000, -300, -100, 3.01f, 1.23f, 0.91f, -300, 0.046f, 0f, 0f, 0f, 200, 0.028f, 0f, 0f, 0f, 0.125f, 0.210f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} ) );
    -CityMuseum    = new Environment ( new float[]{ 26, 80.3f, 0.820f, -1000, -1500, -1500, 3.28f, 1.40f, 0.57f, -1200, 0.039f, 0f, 0f, -0f, -100, 0.034f, 0f, 0f, 0f, 0.130f, 0.170f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} ) );
    -CityLibrary   = new Environment ( new float[]{ 26, 80.3f, 0.820f, -1000, -1100, -2100, 2.76f, 0.89f, 0.41f, -900, 0.029f, 0f, 0f, -0f, -100, 0.020f, 0f, 0f, 0f, 0.130f, 0.170f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} ) );
    -CityUnderpass = new Environment ( new float[]{ 26, 3f, 0.820f, -1000, -700, -100, 3.57f, 1.12f, 0.91f, -800, 0.059f, 0f, 0f, 0f, -100, 0.037f, 0f, 0f, 0f, 0.250f, 0.140f, 0.250f, 0f, -7f, 5000f, 250f, 0f, 0x20} ) );
    -CityAbandoned = new Environment ( new float[]{ 26, 3f, 0.690f, -1000, -200, -100, 3.28f, 1.17f, 0.91f, -700, 0.044f, 0f, 0f, 0f, -1100, 0.024f, 0f, 0f, 0f, 0.250f, 0.200f, 0.250f, 0f, -3f, 5000f, 250f, 0f, 0x20} ) );
    +
    CityIndoors   = new Environment ( new float[]{ 16, 7.5f, 0.500f, -1000, -800, 0, 1.49f, 0.67f, 1f, -2273, 0.007f, 0f, 0f, 0f, -1691, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +CityStreets   = new Environment ( new float[]{ 26, 3f, 0.780f, -1000, -300, -100, 1.79f, 1.12f, 0.91f, -1100, 0.046f, 0f, 0f, 0f, -1400, 0.028f, 0f, 0f, 0f, 0.250f, 0.200f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} );
    +CitySubway    = new Environment ( new float[]{ 26, 3f, 0.740f, -1000, -300, -100, 3.01f, 1.23f, 0.91f, -300, 0.046f, 0f, 0f, 0f, 200, 0.028f, 0f, 0f, 0f, 0.125f, 0.210f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x20} );
    +CityMuseum    = new Environment ( new float[]{ 26, 80.3f, 0.820f, -1000, -1500, -1500, 3.28f, 1.40f, 0.57f, -1200, 0.039f, 0f, 0f, -0f, -100, 0.034f, 0f, 0f, 0f, 0.130f, 0.170f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} );
    +CityLibrary   = new Environment ( new float[]{ 26, 80.3f, 0.820f, -1000, -1100, -2100, 2.76f, 0.89f, 0.41f, -900, 0.029f, 0f, 0f, -0f, -100, 0.020f, 0f, 0f, 0f, 0.130f, 0.170f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} );
    +CityUnderpass = new Environment ( new float[]{ 26, 3f, 0.820f, -1000, -700, -100, 3.57f, 1.12f, 0.91f, -800, 0.059f, 0f, 0f, 0f, -100, 0.037f, 0f, 0f, 0f, 0.250f, 0.140f, 0.250f, 0f, -7f, 5000f, 250f, 0f, 0x20} );
    +CityAbandoned = new Environment ( new float[]{ 26, 3f, 0.690f, -1000, -200, -100, 3.28f, 1.17f, 0.91f, -700, 0.044f, 0f, 0f, 0f, -1100, 0.024f, 0f, 0f, 0f, 0.250f, 0.200f, 0.250f, 0f, -3f, 5000f, 250f, 0f, 0x20} );
    - +

    Small Indoor Rooms

    -
    Room         = new Environment ( new float[]{ 2, 1.9f, 1f, -1000, -454, 0, 0.40f, 0.83f, 1f, -1646, 0.002f, 0f, 0f, 0f, 53, 0.003f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Bathroom     = new Environment ( new float[]{ 3, 1.4f, 1f, -1000, -1200, 0, 1.49f, 0.54f, 1f, -370, 0.007f, 0f, 0f, 0f, 1030, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Livingroom   = new Environment ( new float[]{ 4, 2.5f, 1f, -1000, -6000, 0, 0.50f, 0.10f, 1f, -1376, 0.003f, 0f, 0f, 0f, -1104, 0.004f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Paddedcell   = new Environment ( new float[]{ 1, 1.4f, 1f, -1000, -6000, 0, 0.17f, 0.10f, 1f, -1204, 0.001f, 0f, 0f, 0f, 207, 0.002f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Stoneroom    = new Environment ( new float[]{ 5, 11.6f, 1f, -1000, -300, 0, 2.31f, 0.64f, 1f, -711, 0.012f, 0f, 0f, 0f, 83, 0.017f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    +
    Room         = new Environment ( new float[]{ 2, 1.9f, 1f, -1000, -454, 0, 0.40f, 0.83f, 1f, -1646, 0.002f, 0f, 0f, 0f, 53, 0.003f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Bathroom     = new Environment ( new float[]{ 3, 1.4f, 1f, -1000, -1200, 0, 1.49f, 0.54f, 1f, -370, 0.007f, 0f, 0f, 0f, 1030, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Livingroom   = new Environment ( new float[]{ 4, 2.5f, 1f, -1000, -6000, 0, 0.50f, 0.10f, 1f, -1376, 0.003f, 0f, 0f, 0f, -1104, 0.004f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Paddedcell   = new Environment ( new float[]{ 1, 1.4f, 1f, -1000, -6000, 0, 0.17f, 0.10f, 1f, -1204, 0.001f, 0f, 0f, 0f, 207, 0.002f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Stoneroom    = new Environment ( new float[]{ 5, 11.6f, 1f, -1000, -300, 0, 2.31f, 0.64f, 1f, -711, 0.012f, 0f, 0f, 0f, 83, 0.017f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    - +

    Medium-Sized Indoor Rooms

    -
    Workshop     = new Environment ( new float[]{ 26, 1.9f, 1f, -1000, -1700, -800, 0.76f, 1f, 1f, 0, 0.012f, 0f, 0f, 0f, 100, 0.012f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x0} ) );
    -Schoolroom   = new Environment ( new float[]{ 26, 1.86f, 0.690f, -1000, -400, -600, 0.98f, 0.45f, 0.18f, 300, 0.017f, 0f, 0f, 0f, 300, 0.015f, 0f, 0f, 0f, 0.095f, 0.140f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} ) );
    -Practiseroom = new Environment ( new float[]{ 26, 1.86f, 0.870f, -1000, -800, -600, 1.12f, 0.56f, 0.18f, 200, 0.010f, 0f, 0f, 0f, 300, 0.011f, 0f, 0f, 0f, 0.095f, 0.140f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} ) );
    -Outhouse     = new Environment ( new float[]{ 26, 80.3f, 0.820f, -1000, -1900, -1600, 1.38f, 0.38f, 0.35f, -100, 0.024f, 0f, 0f, -0f, -400, 0.044f, 0f, 0f, 0f, 0.121f, 0.170f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} ) );
    -Caravan      = new Environment ( new float[]{ 26, 8.3f, 1f, -1000, -2100, -1800, 0.43f, 1.50f, 1f, 0, 0.012f, 0f, 0f, 0f, 600, 0.012f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    -Dustyroom    = new Environment ( new float[]{ 26, 1.8f, 0.560f, -1000, -200, -300, 1.79f, 0.38f, 0.21f, -600, 0.002f, 0f, 0f, 0f, 200, 0.006f, 0f, 0f, 0f, 0.202f, 0.050f, 0.250f, 0f, -10f, 13046f, 163.3f, 0f, 0x20} ) );
    -Chapel       = new Environment ( new float[]{ 26, 19.6f, 0.840f, -1000, -500, 0, 4.62f, 0.64f, 1.23f, -700, 0.032f, 0f, 0f, 0f, -200, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0.110f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    +
    Workshop     = new Environment ( new float[]{ 26, 1.9f, 1f, -1000, -1700, -800, 0.76f, 1f, 1f, 0, 0.012f, 0f, 0f, 0f, 100, 0.012f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x0} );
    +Schoolroom   = new Environment ( new float[]{ 26, 1.86f, 0.690f, -1000, -400, -600, 0.98f, 0.45f, 0.18f, 300, 0.017f, 0f, 0f, 0f, 300, 0.015f, 0f, 0f, 0f, 0.095f, 0.140f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} );
    +Practiseroom = new Environment ( new float[]{ 26, 1.86f, 0.870f, -1000, -800, -600, 1.12f, 0.56f, 0.18f, 200, 0.010f, 0f, 0f, 0f, 300, 0.011f, 0f, 0f, 0f, 0.095f, 0.140f, 0.250f, 0f, -5f, 7176.9f, 211.2f, 0f, 0x20} );
    +Outhouse     = new Environment ( new float[]{ 26, 80.3f, 0.820f, -1000, -1900, -1600, 1.38f, 0.38f, 0.35f, -100, 0.024f, 0f, 0f, -0f, -400, 0.044f, 0f, 0f, 0f, 0.121f, 0.170f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} );
    +Caravan      = new Environment ( new float[]{ 26, 8.3f, 1f, -1000, -2100, -1800, 0.43f, 1.50f, 1f, 0, 0.012f, 0f, 0f, 0f, 600, 0.012f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} );
    +Dustyroom    = new Environment ( new float[]{ 26, 1.8f, 0.560f, -1000, -200, -300, 1.79f, 0.38f, 0.21f, -600, 0.002f, 0f, 0f, 0f, 200, 0.006f, 0f, 0f, 0f, 0.202f, 0.050f, 0.250f, 0f, -10f, 13046f, 163.3f, 0f, 0x20} );
    +Chapel       = new Environment ( new float[]{ 26, 19.6f, 0.840f, -1000, -500, 0, 4.62f, 0.64f, 1.23f, -700, 0.032f, 0f, 0f, 0f, -200, 0.049f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0.110f, -5f, 5000f, 250f, 0f, 0x3f} );
    - +

    Large Indoor Rooms

    -
    Auditorium     = new Environment ( new float[]{ 6, 21.6f, 1f, -1000, -476, 0, 4.32f, 0.59f, 1f, -789, 0.020f, 0f, 0f, 0f, -289, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Concerthall    = new Environment ( new float[]{ 7, 19.6f, 1f, -1000, -500, 0, 3.92f, 0.70f, 1f, -1230, 0.020f, 0f, 0f, 0f, -02, 0.029f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Cave           = new Environment ( new float[]{ 8, 14.6f, 1f, -1000, 0, 0, 2.91f, 1.30f, 1f, -602, 0.015f, 0f, 0f, 0f, -302, 0.022f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    -Arena          = new Environment ( new float[]{ 9, 36.2f, 1f, -1000, -698, 0, 7.24f, 0.33f, 1f, -1166, 0.020f, 0f, 0f, 0f, 16, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Hangar         = new Environment ( new float[]{ 10, 50.3f, 1f, -1000, -1000, 0, 10.05f, 0.23f, 1f, -602, 0.020f, 0f, 0f, 0f, 198, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -DomeTomb       = new Environment ( new float[]{ 26, 51.8f, 0.790f, -1000, -900, -1300, 4.18f, 0.21f, 0.10f, -825, 0.030f, 0f, 0f, 0f, 450, 0.022f, 0f, 0f, 0f, 0.177f, 0.190f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x0} ) );
    -DomeSaintPauls = new Environment ( new float[]{ 26, 50.3f, 0.870f, -1000, -900, -1300, 10.48f, 0.19f, 0.10f, -1500, 0.090f, 0f, 0f, 0f, 200, 0.042f, 0f, 0f, 0f, 0.250f, 0.120f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x3f} ) );
    +
    Auditorium     = new Environment ( new float[]{ 6, 21.6f, 1f, -1000, -476, 0, 4.32f, 0.59f, 1f, -789, 0.020f, 0f, 0f, 0f, -289, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Concerthall    = new Environment ( new float[]{ 7, 19.6f, 1f, -1000, -500, 0, 3.92f, 0.70f, 1f, -1230, 0.020f, 0f, 0f, 0f, -02, 0.029f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Cave           = new Environment ( new float[]{ 8, 14.6f, 1f, -1000, 0, 0, 2.91f, 1.30f, 1f, -602, 0.015f, 0f, 0f, 0f, -302, 0.022f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} );
    +Arena          = new Environment ( new float[]{ 9, 36.2f, 1f, -1000, -698, 0, 7.24f, 0.33f, 1f, -1166, 0.020f, 0f, 0f, 0f, 16, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Hangar         = new Environment ( new float[]{ 10, 50.3f, 1f, -1000, -1000, 0, 10.05f, 0.23f, 1f, -602, 0.020f, 0f, 0f, 0f, 198, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +DomeTomb       = new Environment ( new float[]{ 26, 51.8f, 0.790f, -1000, -900, -1300, 4.18f, 0.21f, 0.10f, -825, 0.030f, 0f, 0f, 0f, 450, 0.022f, 0f, 0f, 0f, 0.177f, 0.190f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x0} );
    +DomeSaintPauls = new Environment ( new float[]{ 26, 50.3f, 0.870f, -1000, -900, -1300, 10.48f, 0.19f, 0.10f, -1500, 0.090f, 0f, 0f, 0f, 200, 0.042f, 0f, 0f, 0f, 0.250f, 0.120f, 0.250f, 0f, -5f, 2854.4f, 20f, 0f, 0x3f} );
    - +

    Hallways, Alleys

    -
    Carpettedhallway = new Environment ( new float[]{ 11, 1.9f, 1f, -1000, -4000, 0, 0.30f, 0.10f, 1f, -1831, 0.002f, 0f, 0f, 0f, -1630, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Hallway          = new Environment ( new float[]{ 12, 1.8f, 1f, -1000, -300, 0, 1.49f, 0.59f, 1f, -1219, 0.007f, 0f, 0f, 0f, 441, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Stonecorridor    = new Environment ( new float[]{ 13, 13.5f, 1f, -1000, -237, 0, 2.70f, 0.79f, 1f, -1214, 0.013f, 0f, 0f, 0f, 395, 0.020f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Alley            = new Environment ( new float[]{ 14, 7.5f, 0.300f, -1000, -270, 0, 1.49f, 0.86f, 1f, -1204, 0.007f, 0f, 0f, 0f, -4, 0.011f, 0f, 0f, 0f, 0.125f, 0.950f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    +
    Carpettedhallway = new Environment ( new float[]{ 11, 1.9f, 1f, -1000, -4000, 0, 0.30f, 0.10f, 1f, -1831, 0.002f, 0f, 0f, 0f, -1630, 0.030f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Hallway          = new Environment ( new float[]{ 12, 1.8f, 1f, -1000, -300, 0, 1.49f, 0.59f, 1f, -1219, 0.007f, 0f, 0f, 0f, 441, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Stonecorridor    = new Environment ( new float[]{ 13, 13.5f, 1f, -1000, -237, 0, 2.70f, 0.79f, 1f, -1214, 0.013f, 0f, 0f, 0f, 395, 0.020f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Alley            = new Environment ( new float[]{ 14, 7.5f, 0.300f, -1000, -270, 0, 1.49f, 0.86f, 1f, -1204, 0.007f, 0f, 0f, 0f, -4, 0.011f, 0f, 0f, 0f, 0.125f, 0.950f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    - +

    Outdoors

    -
    Backyard      = new Environment ( new float[]{ 26, 80.3f, 0.450f, -1000, -1200, -600, 1.12f, 0.34f, 0.46f, -700, 0.069f, 0f, 0f, -0f, -300, 0.023f, 0f, 0f, 0f, 0.218f, 0.340f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} ) );
    -Plain         = new Environment ( new float[]{ 19, 42.5f, 0.210f, -1000, -2000, 0, 1.49f, 0.50f, 1f, -2466, 0.179f, 0f, 0f, 0f, -1926, 0.100f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Rollingplains = new Environment ( new float[]{ 26, 80.3f, 0f, -1000, -3900, -400, 2.13f, 0.21f, 0.46f, -1500, 0.300f, 0f, 0f, -0f, -700, 0.019f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} ) );
    -Deepcanyon    = new Environment ( new float[]{ 26, 80.3f, 0.740f, -1000, -1500, -400, 3.89f, 0.21f, 0.46f, -1000, 0.223f, 0f, 0f, -0f, -900, 0.019f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} ) );
    -Creek         = new Environment ( new float[]{ 26, 80.3f, 0.350f, -1000, -1500, -600, 2.13f, 0.21f, 0.46f, -800, 0.115f, 0f, 0f, -0f, -1400, 0.031f, 0f, 0f, 0f, 0.218f, 0.340f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} ) );
    -Valley        = new Environment ( new float[]{ 26, 80.3f, 0.280f, -1000, -3100, -1600, 2.88f, 0.26f, 0.35f, -1700, 0.263f, 0f, 0f, -0f, -800, 0.100f, 0f, 0f, 0f, 0.250f, 0.340f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} ) );
    -Forest        = new Environment ( new float[]{ 15, 38f, 0.300f, -1000, -3300, 0, 1.49f, 0.54f, 1f, -2560, 0.162f, 0f, 0f, 0f, -229, 0.088f, 0f, 0f, 0f, 0.125f, 1f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Mountains     = new Environment ( new float[]{ 17, 100f, 0.270f, -1000, -2500, 0, 1.49f, 0.21f, 1f, -2780, 0.300f, 0f, 0f, 0f, -1434, 0.100f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    -Quarry        = new Environment ( new float[]{ 18, 17.5f, 1f, -1000, -1000, 0, 1.49f, 0.83f, 1f, -10000, 0.061f, 0f, 0f, 0f, 500, 0.025f, 0f, 0f, 0f, 0.125f, 0.700f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Parkinglot    = new Environment ( new float[]{ 20, 8.3f, 1f, -1000, 0, 0, 1.65f, 1.50f, 1f, -1363, 0.008f, 0f, 0f, 0f, -1153, 0.012f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} ) );
    +
    Backyard      = new Environment ( new float[]{ 26, 80.3f, 0.450f, -1000, -1200, -600, 1.12f, 0.34f, 0.46f, -700, 0.069f, 0f, 0f, -0f, -300, 0.023f, 0f, 0f, 0f, 0.218f, 0.340f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} );
    +Plain         = new Environment ( new float[]{ 19, 42.5f, 0.210f, -1000, -2000, 0, 1.49f, 0.50f, 1f, -2466, 0.179f, 0f, 0f, 0f, -1926, 0.100f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Rollingplains = new Environment ( new float[]{ 26, 80.3f, 0f, -1000, -3900, -400, 2.13f, 0.21f, 0.46f, -1500, 0.300f, 0f, 0f, -0f, -700, 0.019f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} );
    +Deepcanyon    = new Environment ( new float[]{ 26, 80.3f, 0.740f, -1000, -1500, -400, 3.89f, 0.21f, 0.46f, -1000, 0.223f, 0f, 0f, -0f, -900, 0.019f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} );
    +Creek         = new Environment ( new float[]{ 26, 80.3f, 0.350f, -1000, -1500, -600, 2.13f, 0.21f, 0.46f, -800, 0.115f, 0f, 0f, -0f, -1400, 0.031f, 0f, 0f, 0f, 0.218f, 0.340f, 0.250f, 0f, -5f, 4399.1f, 242.9f, 0f, 0x0} );
    +Valley        = new Environment ( new float[]{ 26, 80.3f, 0.280f, -1000, -3100, -1600, 2.88f, 0.26f, 0.35f, -1700, 0.263f, 0f, 0f, -0f, -800, 0.100f, 0f, 0f, 0f, 0.250f, 0.340f, 0.250f, 0f, -5f, 2854.4f, 107.5f, 0f, 0x0} );
    +Forest        = new Environment ( new float[]{ 15, 38f, 0.300f, -1000, -3300, 0, 1.49f, 0.54f, 1f, -2560, 0.162f, 0f, 0f, 0f, -229, 0.088f, 0f, 0f, 0f, 0.125f, 1f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Mountains     = new Environment ( new float[]{ 17, 100f, 0.270f, -1000, -2500, 0, 1.49f, 0.21f, 1f, -2780, 0.300f, 0f, 0f, 0f, -1434, 0.100f, 0f, 0f, 0f, 0.250f, 1f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} );
    +Quarry        = new Environment ( new float[]{ 18, 17.5f, 1f, -1000, -1000, 0, 1.49f, 0.83f, 1f, -10000, 0.061f, 0f, 0f, 0f, 500, 0.025f, 0f, 0f, 0f, 0.125f, 0.700f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Parkinglot    = new Environment ( new float[]{ 20, 8.3f, 1f, -1000, 0, 0, 1.65f, 1.50f, 1f, -1363, 0.008f, 0f, 0f, 0f, -1153, 0.012f, 0f, 0f, 0f, 0.250f, 0f, 0.250f, 0f, -5f, 5000f, 250f, 0f, 0x1f} );
    - +

    Water

    -
    Underwater     = new Environment ( new float[]{ 22, 1.8f, 1f, -1000, -4000, 0, 1.49f, 0.10f, 1f, -449, 0.007f, 0f, 0f, 0f, 1700, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 1.180f, 0.348f, -5f, 5000f, 250f, 0f, 0x3f} ) );
    -Smallwaterroom = new Environment ( new float[]{ 26, 36.2f, 0.700f, -1000, -698, 0, 1.51f, 1.25f, 1.14f, -100, 0.020f, 0f, 0f, 0f, 300, 0.030f, 0f, 0f, 0f, 0.179f, 0.150f, 0.895f, 0.190f, -7f, 5000f, 250f, 0f, 0x0} ) );
    +
    Underwater     = new Environment ( new float[]{ 22, 1.8f, 1f, -1000, -4000, 0, 1.49f, 0.10f, 1f, -449, 0.007f, 0f, 0f, 0f, 1700, 0.011f, 0f, 0f, 0f, 0.250f, 0f, 1.180f, 0.348f, -5f, 5000f, 250f, 0f, 0x3f} );
    +Smallwaterroom = new Environment ( new float[]{ 26, 36.2f, 0.700f, -1000, -698, 0, 1.51f, 1.25f, 1.14f, -100, 0.020f, 0f, 0f, 0f, 300, 0.030f, 0f, 0f, 0f, 0.179f, 0.150f, 0.895f, 0.190f, -7f, 5000f, 250f, 0f, 0x0} );
    - +

    view online version

    \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/camera.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/camera.html index db649b288..8d5c7ed67 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/camera.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/camera.html @@ -64,7 +64,7 @@ The camera object is created with the following defaults: cam.resize(width, height, fixAspect)Resize an existing camera object while keeping all other settings. Set fixAspect to true to adjust the aspect ratio (?) - cam.setFrustum( near, far, left, right, top, bottom )The frustum is defined by the near/far plane, left/rught plane, top/bottom plane (all distances as float values) + cam.setFrustum( near, far, left, right, top, bottom )The frustum is defined by the near/far plane, left/right plane, top/bottom plane (all distances as float values) cam.setFrustumPerspective( fovY, aspect ratio, near, far)The frustum is defined by view angle along the Y axis (in degrees), aspect ratio, and the near/far plane. diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/capture_audio_video_to_a_file.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/capture_audio_video_to_a_file.html index 2304220d4..3f974f1dd 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/capture_audio_video_to_a_file.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/capture_audio_video_to_a_file.html @@ -28,7 +28,7 @@ feature to record high-quality game trailers!

    First off, if all you need is to record video at 30fps with no sound, then look -no further then jMonkeyEngine3's built in VideoRecorderAppState +no further than jMonkeyEngine 3's built in VideoRecorderAppState class.

    @@ -50,7 +50,7 @@ That's all!

    - +

    Advanced Way

    @@ -153,7 +153,7 @@ a file.

    - +

    Basic Example

    @@ -201,7 +201,7 @@ public class Basic { }
    - +

    How it works

    @@ -242,7 +242,7 @@ would be useless.

    - +

    Advanced Example

    @@ -596,7 +596,7 @@ The - +

    Using Advanced features to Record from more than one perspective at once

    @@ -617,7 +617,7 @@ The - +

    More Information

    @@ -649,5 +649,5 @@ listeners can be found here.

    - +

    view online version

    \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_controls.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_controls.html index 26dcb63fc..da5541501 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_controls.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_controls.html @@ -52,7 +52,7 @@ To implement game logic for a type of spatial, you will either extend AbstractCo Use Controls to implement the behaviour of types of game entities.

      -
    • Use Controls add a type of behaviour (that is, methods and fields) to individual Spatials.
      +
    • Use Controls to add a type of behaviour (that is, methods and fields) to individual Spatials.
    • Each Control has its own update() loop that hooks into simpleUpdate(). Use Controls to move blocks of code out of the simpleUpdate() loop.
    • @@ -91,7 +91,7 @@ The possibilities are endless. +

      Example Code

      @@ -115,7 +115,7 @@ Existing examples in the code base include:
    - +

    AbstractControl Class

    @@ -214,7 +214,7 @@ See also:
    - +

    The Control Interface

    @@ -321,7 +321,7 @@ Usage example: }
    - +

    Best Practices

    @@ -387,5 +387,5 @@ vehicleSpatial.addControl(new ManualVehicleControl()); c.steerX(steerX);
    - +

    view online version

    \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_meshes.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_meshes.html index 83d109dfa..6fa671e9a 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_meshes.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/custom_meshes.html @@ -284,7 +284,7 @@ In case that your use case requires the backfaces to be visible, you have two op

    • If you have a very simple scene, you can just deactivate backface culling for this one mesh's material.
      -mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off));
      +mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off);
    • The recommended solution is to specify each triangle twice, the second time with the opposite order of vertices. The second, reversed triangle makes up the backface.
      int[] indexes = { 2,0,1, 1,3,2, 2,3,1, 1,0,2 };
      diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/j3m_material_files.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/j3m_material_files.html index 795f78d61..08411f4e0 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/j3m_material_files.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/j3m_material_files.html @@ -339,6 +339,15 @@ The file assets/Models/Tree/Leaves.j3m contains:

      The PNG file is in the same directory, assets/Models/Tree/…

      + + + +

      Related Links

      +
      +
      material, texture, @@ -349,5 +358,5 @@ The PNG file is in the same
      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/jme3_shaders.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/jme3_shaders.html index 20997f9da..4ddc1fcbb 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/jme3_shaders.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/jme3_shaders.html @@ -58,7 +58,7 @@ There are different types of scope for variables in a shader :
    • attribute : Per-vertex variables passed by the engine to the shader, like position, normal, etc (Mesh data in the graphic)
    • -
    • varrying : Variables passed from the vertex shader to the fragment shader.
      +
    • varying : Variables passed from the vertex shader to the fragment shader.
    @@ -71,7 +71,7 @@ There is a large panel of variable types to be used, for more information about

    - +

    Spaces and Matrices

    @@ -88,7 +88,7 @@ The engine passes the object space coordinates to the vertex shader. We need to

    - +

    Simple example : rendering a solid color on an object

    @@ -138,7 +138,7 @@ For example applying this shader to a sphere would render a solid blue sphere on

    - +

    How to use shaders in JME3

    @@ -184,7 +184,7 @@ For more information on JME3 material system, i suggest you read this - +

    JME3 Global uniforms

    @@ -203,7 +203,7 @@ The complete list of global uniforms that can be used in JME3 can be found
    - +

    JME3 Lighting Global uniforms

    @@ -241,7 +241,7 @@ these uniforms are passed to the shader without having to declare them in the j3

    - +

    JME3 attributes

    @@ -258,7 +258,7 @@ Note that in the shader the attributes names will be prefixed by a “in”.
    - +

    User's uniforms

    @@ -320,7 +320,7 @@ The uniforms will be populated at runtime with the value you sent.

    - +

    Example: Adding Color Keying to the Lighting.j3md Material Definition

    @@ -384,7 +384,7 @@ A result preview can be seen here: +

    Step by step

      @@ -414,12 +414,12 @@ A result preview can be seen here: +

      JME3 and OpenGL 3 & 4 compatibility

      -GLSL 1.0 to 1.2 comes with build in attributes and uniforms (ie, gl_Vertex, gl_ModelViewMatrix, etc…).
      +GLSL 1.0 to 1.2 comes with built in attributes and uniforms (ie, gl_Vertex, gl_ModelViewMatrix, etc…).
      Those attributes are deprecated since GLSL 1.3 (opengl 3), hence JME3 global uniforms and attributes. Here is a list of deprecated attributes and their equivalent in JME3

      @@ -452,9 +452,9 @@ Those attributes are deprecated since GLSL 1.3 (opengl 3), hence JME3 global uni gl_NormalMatrix g_NormalMatrix
      - + - +

      Useful links

      @@ -463,5 +463,5 @@ Those attributes are deprecated since GLSL 1.3 (opengl 3), hence JME3 global uni

      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/light_and_shadow.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/light_and_shadow.html index 2c4e11864..6de569383 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/light_and_shadow.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/light_and_shadow.html @@ -366,7 +366,7 @@ Full sample code Ambient Occlusion refers to the shadows that nearby objects cast on each other under an ambient lighting. It‘s an approximation of how light radiates in a real life scene. To activate Ambient Occlusion shadows, add a jME SceneProcessor named com.jme3.post.SSAOFilter to the viewPort. SSAO stands for the Screen Space Ambient Occlusion technique.

      FilterPostProcessor fpp = new FilterPostProcessor(assetManager);
      -SSAOFilter ssaoFilter = new SSAOFilter(12.94f, 43.92f, 0.33f, 0.61);
      +SSAOFilter ssaoFilter = new SSAOFilter(12.94f, 43.92f, 0.33f, 0.61f);
       fpp.addFilter(ssaoFilter);
       viewPort.addProcessor(fpp);
      diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/loading_screen.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/loading_screen.html index 1cdc62859..a1715e0d2 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/loading_screen.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/loading_screen.html @@ -257,8 +257,7 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro } else if (frameCount == 5) { AbstractHeightMap heightmap = null; Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png"); - heightmap = new ImageBasedHeightMap( - ImageToAwt.convert(heightMapImage.getImage(), false, true, 0)); + heightmap = new ImageBasedHeightMap(heightMapImage.getImage());   heightmap.load(); terrain = new TerrainQuad("my terrain", 65, 513, heightmap.getHeightMap()); @@ -479,8 +478,7 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr   AbstractHeightMap heightmap = null; Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png"); - heightmap = new ImageBasedHeightMap( - ImageToAwt.convert(heightMapImage.getImage(), false, true, 0)); + heightmap = new ImageBasedHeightMap(heightMapImage.getImage());   heightmap.load(); terrain = new TerrainQuad("my terrain", 65, 513, heightmap.getHeightMap()); diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/localization.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/localization.html index c55f0a6cd..de4bb918f 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/localization.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/localization.html @@ -151,18 +151,20 @@ Only localize messages and UI text! Typical problems include:

        -
      • Localized strings will be of vastly different lengths and will totally break your UI layout. ⇒ Test every localization
        +
      • Localized strings will be of vastly different lengths and will totally break your UI layout. ⇒ Test every localization.
      • -
      • Strings with variable text or numbers don't work the same in different languages. ⇒ Either work in grammatical cases/numbers/gender for each language, or find a work-around.
        +
      • Strings with variable text or numbers don't work the same in different languages. ⇒ Either work in grammatical cases/numbers/gender for each language, or use or .
      • -
      • The localizer only sees the strings, without any context. E.g. does "Search History" mean "display the history of searches", or "search through the history"? ⇒ Use clear key labels and work closely with the localizers if they require extra info.
        +
      • The localizer only sees the strings, without any context. E.g. does "Search History" mean "display the history of searches", or "search through the history"? ⇒ Use clear key labels. Work closely with the localizers if they require extra info, and add that info as comments to the translation file.
      • -
      • Broken international characters ⇒ Make sure the files are saved with the right character encoding for the language.
        +
      • Broken international characters ⇒ Make sure the files are saved with the same character encoding as the font file(s) you're using. Nowadays, that usually means UTF-8 since font files tend to come for Unicode.
        +
      • +
      • Missing international characters ⇒ Make sure that there's a glyph for every needed character in your font, either by using more complete font files or by having the translation changed.
      - +

      More Documentation

      @@ -177,5 +179,5 @@ Typical problems include:

      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/material_definitions.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/material_definitions.html index 69aa90679..980a0206a 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/material_definitions.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/material_definitions.html @@ -4,7 +4,16 @@

      -All Geometries need a Materual. Every Material is based on a Material Definition. The most common Material Definitions are included in the engine, advanced users can create custom ones. +All Geometries need a Material to be visible. Every Material is based on a Material Definition. Material definitions provide the "logic" for the material, and a shader draws the material according to the parameters specified in the definition. The J3MD file abstracts the shader and its configuration away from the user, allowing a simple interface where the user can simply set a few parameters on the material to change its appearance and the way its handled by the shaders. +

      + +

      +The most common Material Definitions are included in the engine, advanced users can create custom ones. In this case you will also be interested in the in-depth developer specification of the jME3 material system. +

      + +

      +Example: +

      Spatial myGeometry = assetManager.loadModel("Models/Teapot/Teapot.j3o");
       Material mat = new Material(assetManager,  // Create new material and...
      @@ -13,44 +22,44 @@ mat.setColor("Color", ColorRGBA.Blue);     // Set one or more
       myGeometry.setMaterial(mat);               // Use material on this Geometry.

      -

      If you use one custom material very often, read about storing material configurations in user-friendly j3m Material Files. Either use the jMonkeyEngine SDK to create .j3m files (easier), or write .j3m files in a text editor. +

      If you use one custom material with certain settings very often, learn about storing material settings in j3m Material Files. You either use the jMonkeyEngine SDK to create .j3m files (user-friendly), or you write .j3m files in a text editor (IDE-independent).

      - +

      Preparing a Material

      -In the Materials Overview list, +In the Materials Overview list:

      1. Choose a Material Definition that has the features that you need.
          -
        • Tip: If you don't know, you can always start with Unshaded.j3md.
          +
        • Tip: If you don't know, start with Unshaded.j3md or Lighting.j3md.
      2. -
      3. Look at the applicable parameters of the Material Definition and determine which parameters you need to achieve the desired effect (e.g. "glow" or "color"). Most parameters are optional.
        +
      4. Look at the applicable parameters of the Material Definition and determine which parameters you need to achieve the desired effect (e.g. "glow" or "color"). Most parameters are optional!
      5. -
      6. Create and save the necessary Texture files to your assets directory.
        +
      7. Create and save the necessary Texture files to your assets/Textures directory.
          -
        • E.g. ColorMap; DiffuseMap, NormalMap, AlphaMap, etc…
          +
        • E.g. mytex_diffuse.png as ColorMap / DiffuseMap, mytex_normal.png as NormalMap, mytex_alpha.png as AlphaMap, etc…
      8. Determine the required values to achieve the effect that you want.
          -
        • E.g. Colors, floats, booleans, etc…
          +
        • E.g. set colors, floats, booleans, etc…
      - +

      Using a Material

      @@ -68,7 +77,7 @@ In your Java code,
    • Apply your prepared Material to a Geometry:
      myGeometry.setMaterial(mat);
    • -
    • (Optional) Adjust the texture scale:
      geometry.scaleTextureCoordinates(new Vector2f(1f, .5f));
      +
    • (Optional) Adjust the texture scale of the mesh:
      myGeometryMesh.scaleTextureCoordinates(new Vector2f(2f, 2f));
    • @@ -79,7 +88,7 @@ For details see also: +

      Examples

      @@ -135,19 +144,23 @@ rootNode.attachChild(geom);

      - +

      Creating a Custom Material Definition

      -Check out the engine source code and have a look at how Material Definitions are implemented. You can create your own Material Definitions and place them in your projects MatDefs directory. +First read the developer specification of the jME3 material system (.j3md,.j3m). Also check out the engine source code and have a look at how some Material Definitions are implemented. +

      + +

      +You can create your own Material Definitions and place them in your project's assets/MatDefs directory.

        -
      1. Find the existing MatDefs are in engine/src/core-data/Common/MatDefs/.
        +
      2. Find the existing MatDefs in engine/src/core-data/Common/MatDefs/.
      3. -
      4. Open a Something.j3md file in a text editor. You see that this jme3 file defines Material Parameters and Techniques.
        +
      5. Open a Something.j3md file in a text editor. You see that this .j3md file defines Material Parameters and Techniques.
        • Material Parameters are the ones that you set in Materials, as shown in the examples above.
        • @@ -155,11 +168,20 @@ Check out the eng
      6. -
      7. Learn about GLSL (OpenGL Shading Language) to understand the .vert and .frag syntax, and write your own.
        +
      8. Learn about GLSL (OpenGL Shading Language) to understand the .vert and .frag syntax, then write your own.
      + +
      + +

      Related Links

      + - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/materials_overview.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/materials_overview.html index 90b041cb3..92c700e12 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/materials_overview.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/materials_overview.html @@ -368,7 +368,17 @@ Later, put the Geometry (not the Material!) in the appropriate render queue getAdditionalRenderState().setPolyOffset();Enable polygon offset.Use this when you have meshes that have triangles really close to each over (e.g. ), it will shift the depth values to prevent .
      -
      + +

      + +Related Links + +

      + +
      material, texture, MatDefs, diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multiple_camera_views.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multiple_camera_views.html index f13411275..c3c265d01 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multiple_camera_views.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multiple_camera_views.html @@ -4,7 +4,7 @@

      -You can split the screen and look into the 3D scene from different camera angles at the same time. +You can split the screen and look into the 3D scene from different camera angles at the same time. E.g. you can have two rootnodes with different scene graphs, and two viewPorts, each of which can only see its own subset of the scene with its own subset of port-processing filters, so you get two very different views of the scene.

      @@ -12,13 +12,13 @@ The packages used in this example are com.jme3.renderer.Camera and

      - +

      How to resize and Position ViewPorts

      -The default viewPort is as big as the window. If you have several, the must be of different sizes, either overlapping or adjacent to one another. How do you tell jME which of the ViewPorts should appear where on the screen, and how big it should be? +The default viewPort is as big as the window. If you have several, they must be of different sizes, either overlapping or adjacent to one another. How do you tell jME which of the ViewPorts should appear where on the screen, and how big they should be?

      @@ -74,7 +74,7 @@ Example: Cam2's rectangle is int he bottom right: It extends from mid (x1=0

      - +

      Four-Time Split Screen

      @@ -84,7 +84,7 @@ In this example, you create four views (2x2) with the same aspect ratio as the w

      - +

      Set up the First View

      @@ -104,7 +104,7 @@ Optionally, place the main camera in the scene and rotate it in its start positi cam.setRotation(new Quaternion (-0.07f, 0.92f, -0.25f, -0.27f));
      - +

      Set Up Three More Views

      @@ -169,7 +169,7 @@ cam3.setViewPort( 0.0f , 0.5f , 0.5f , 1.0f); cam4.setViewPort( 0.5f , 1.0f , 0.5f , 1.0f);
      - +

      Picture in Picture

      @@ -199,8 +199,8 @@ viewPort2.setClearFlags(true, true, true); viewPort2.attachScene(rootNode);
      - -

      Settings

      + +

      ViewPort Settings

      @@ -229,5 +229,5 @@ You have full control to determine which Nodes the camera can see! It can see th

      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/networking.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/networking.html index 29847a3e4..4e93b1c92 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/networking.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/networking.html @@ -10,17 +10,17 @@ This document introduces you to the SpiderMonkey networking +

      SpiderMonkey API Overview

      @@ -41,7 +41,7 @@ The SpiderMonkey API com.jme3.network.Client == com.jme3.network.HostedConnection
      - +

      You can register several types of listeners to be notified of changes. @@ -56,12 +56,12 @@ You can register several types of listeners to be notified of changes. - +

      Client and Server

      - +

      Creating a Server

      @@ -96,7 +96,7 @@ When you run this app on a host, the server is ready to accept clients. Let'

      - +

      Creating a Client

      @@ -135,7 +135,7 @@ When you run this client, it connects to the server.

      - +

      Getting Info About a Client

      @@ -158,7 +158,7 @@ The server refers to a connected client as com.jme3.network.HostedConnection obj myServer.getConnection(0)Server gets the first (0), second (1), etc, connected HostedConnection object (one client).
      - +

      Your game can define its own game data based on whatever criteria you want, typically these include player ID and state. If the server needs to look up player/client-specific information, you can store this information directly on the HostedConnection object. The following examples read and write a custom Java object MyState in the HostedConnection object conn: @@ -175,14 +175,14 @@ Your game can define its own game data based on whatever criteria you want, typi MyState state = conn.getAttribute("MyState") Server can read an attribute of the HostedConnection. - + - +

      Messaging

      - +

      Creating Message Types

      @@ -203,7 +203,7 @@ You must register each message type to the com.jme3.network.serializing.Serializ
      Serializer.registerClass(HelloMessage.class);
      - +

      Responding to Messages

      @@ -260,7 +260,7 @@ For each message type, register a server listener to the server:
      myServer.addMessageListener(new ServerListener(), HelloMessage.class);
      - +

      Creating and Sending Messages

      @@ -293,11 +293,11 @@ Or the server can send the message to all but a few selected clients (e.g. to al
      myServer.broadcast( Filters.notEqualTo( conn4 ), message );

      -The last two broadcasting methods use com.jme3.network.Filters to select a subset of recipients. If you know the exact list of recipients, always send the messages directly to them using the Filters; avoid floodig the network with unnessary broadcasts to all. +The last two broadcasting methods use com.jme3.network.Filters to select a subset of recipients. If you know the exact list of recipients, always send the messages directly to them using the Filters; avoid flooding the network with unnecessary broadcasts to all.

      - +

      Identification and Rejection

      @@ -328,7 +328,7 @@ A server has a game version and game name property. Each client expects to commu myClient.getVersion() Client queries the version of the server it is connected to.
      - +

      Typically, your networked game defines its own attributes (such as player ID) based on whatever criteria you want. If you want to look up player/client-specific information beyond the game version, you can set this information directly on the Client/HostedConnection object (see Getting Info About a Client). @@ -336,12 +336,12 @@ A server has a game version and game name property. Each client expects to commu

      - +

      Closing Clients and Server Cleanly

      - +

      Closing a Client

      @@ -357,7 +357,7 @@ You must override the client's destroy() method to close the connection cle }
      - +

      Closing a Server

      @@ -373,7 +373,7 @@ You must override the server's destroy() method to close the connection whe }
      - +

      Kicking a Client

      @@ -384,7 +384,7 @@ The server can kick a HostedConnection to make it disconnect. You should provide
      conn.close("We kick cheaters.");
      - +

      Listening to Connection Notification

      @@ -394,7 +394,7 @@ The server and clients are notified about connection changes.

      - +

      ClientStateListener

      @@ -408,21 +408,21 @@ The com.jme3.network.ClientStateListener notifies the Client when the Client has ClientStateListener interface method Purpose - public void clientConnected(Client c){} Implement here what happens as soon as this clients has fully connected to the server. + public void clientConnected(Client c){} Implement here what happens as soon as this client has fully connected to the server. public void clientDisconnected(Client c, DisconnectInfo info){} Implement here what happens after the server kicks this client. For example, display the DisconnectInfo to the user.
      - +

      -First implement the ClientStateListener interface in the Client class. Then register it to myClient in MyGameClient's simeplInitApp() method: +First implement the ClientStateListener interface in the Client class. Then register it to myClient in MyGameClient's simpleInitApp() method:

      myClient.addClientStateListener(this);
      - +

      ConnectionListener

      diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_scenarios.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_scenarios.html index c8d1f634b..14ede8906 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_scenarios.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_scenarios.html @@ -275,6 +275,25 @@ guiViewPort.addProcessor(niftyDisplay);
      +

      Register additional explicit screen controllers

      +
      + +

      + +In addition to the nifty.addXml() methods to attach many nifty XML files, there exists a nifty.registerScreenController() method to explicitly attach more screen controllers. +

      + +

      +The following code sample shows how you can explicitly attach several screen controllers before adding the XML file to nifty, which would otherwise cause nifty to implicitly instantiate the screen controller class. +

      +
      NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(assetManager, inputManager, audioRenderer, viewPort);
      +Nifty nifty = niftyDisplay.getNifty();
      + 
      +nifty.registerScreenController(new OptionsScreenController(randomConstructorArgument));
      +nifty.addXml("Interface/Screens/OptionsScreen.xml");
      + +
      +

      Design Your Own Styles

      @@ -326,5 +345,5 @@ Learn more from the NiftyGUI page:
      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogre_solved.jpg b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogre_solved.jpg new file mode 100644 index 000000000..53e69c31a Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogre_solved.jpg differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogre_solved2.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogre_solved2.png new file mode 100644 index 000000000..cf2f87355 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogre_solved2.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogrecompatibility.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogrecompatibility.html new file mode 100644 index 000000000..a2ccc023d --- /dev/null +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ogrecompatibility.html @@ -0,0 +1,72 @@ + +

      Working Blender and OgreXML Versions

      +
      + +

      +Here you can find working combinations of Blender and the OgreXML exporter, with any tips or bugs associated with each. + +

      +
      + + + + + + + + + + + + +
      Blender Version OgreXML Exporter Version Notes
      2.6.2 Root bone, no transforms on object, no envelopes
      2.6.1 ?
      2.6.0 ?
      + +
      + +

      Tips

      +
      + +

      + +Tips for exporting animations through OgreXML correctly: +

      +
        +
      • apply all transformations
        +
      • +
      • armature should have 0,0,0 transformation (loc,rot,scale)
        +
      • +
      • model object should have 0,0,0 transformation (loc,rot,scale)
        +
      • +
      • root bone should have 0,0,0 transformation (loc,rot,scale)
        +
      • +
      • no envelopes
        +
      • +
      + +

      + +Test Character - +

      + +

      + + +

      + +
      + +

      Troubleshooting

      +
      + +

      + +Q: My animation is stretched. +

      + +

      +A: Use the exporting tips provided above +

      + +
      + +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/physics.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/physics.html index 328aa39f6..d2056e8df 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/physics.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/physics.html @@ -196,7 +196,7 @@ All non-mesh CollisionShapes can be used for dynamic, kinematic, as well as stat Limitations: CPU intensive, use sparingly! We recommend using HullCollisionShape (or CompoundShape) instead to improve performance. Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape. Complex dynamic objects (like spiders) in Virtual Reality or scientific simulations. - HeightFieldCollisionShape A mesh-accurate shape optimized for static terrains. This shape is much faster than other mesh-accurate shapes.
      + HeightfieldCollisionShape A mesh-accurate shape optimized for static terrains. This shape is much faster than other mesh-accurate shapes.
      Limitations: Requires heightmap data. Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape.Static terrains. @@ -380,23 +380,33 @@ myThing_geo.removeFromParent();

      -The PhysicsSpace also manages global physics settings. Typically, you can leave the defaults, and you don't need to change the following settings: -

      -
        -
      • Specify physics accuracy.
        bulletAppState.getPhysicsSpace().setAccuracy(1f/60f;);
        -
        -
      • -
      • Specify global gravity.
        bulletAppState.getPhysicsSpace().setGravity(new Vector3f(0, -9.81f, 0));
        -
        -
      • -
      • Specify the size of the physics space as two opposite corners (only applies to AXIS_SWEEP broadphase).
        bulletAppState.getPhysicsSpace().setWorldMax(new Vector3f(10000f, 10000f, 10000f));
        -bulletAppState.getPhysicsSpace().setWorldMin(new Vector3f(-10000f, -10000f, -10000f));
        -
        -
      • -
      +The PhysicsSpace also manages global physics settings. Typically, you can leave the defaults, and you don't need to change the following settings, but it's good to know what they are for: +

      +
      + + + + + + + + + + + + + + + + + + +
      bulletAppState.getPhysicsSpace() MethodUsage
      setGravity(new Vector3f(0, -9.81f, 0));Specifies the global gravity.
      setAccuracy(1f/60f);Specifies physics accuracy. The higher the accuracy, the slower the game. Increase value if objects are passing through one another, or bounce oddly.
      setMaxSubSteps(4);Compensates low FPS: Specifies the maximum amount of extra steps that will be used to step the physics when the game fps is below the physics fps. This maintains determinism in physics in slow (low-fps) games. For example a maximum number of 2 can compensate for framerates as low as 30 fps (physics has a default accuracy of 60 fps). Note that setting this value too high can make the physics drive down its own fps in case its overloaded.
      setWorldMax(new Vector3f(10000f, 10000f, 10000f));
      +setWorldMin(new Vector3f(-10000f, -10000f, -10000f));
      Specifies the size of the physics space as two opposite corners (only applies to AXIS_SWEEP broadphase).
      setCcdMotionThreshold()The amount of motion in 1 physics tick to trigger the continuous motion detection in moving objects that push one another. Rarely used, but necessary if your moving objects get stuck or roll through one another.
      + - +

      Specify Physical Properties

      @@ -431,11 +441,12 @@ Soil, concrete, rock: 1.0f setRestitution(0.0f) Bounciness. By default objects are not bouncy (0.0f). For a bouncy rubber object set this > 0.0f.
      +Both the object and the surface must have non-zero restitution for bouncing to occur.
      This setting has an impact on performance, so use it sparingly. Brick: 0.0f
      Rubber ball: 1.0f
      - +

      On a RigidBodyControl, you can apply the following physical forces: @@ -451,17 +462,14 @@ On a RigidBodyControl, you can apply the following physical forces: setPhysicsRotation()Rotates the object. Do not use setLocalRotate() for physical objects. - - setCcdMotionThreshold(0.1f) The amount of motion in 1 physics tick to trigger the continuous motion detection. Rarely used, but necessary if you need to fiddle with details. - setKinematic(true) By default, RigidBodyControls are dynamic (kinematic=false) and are affected by forces. If you set kinematic=true, the object is no longer affected by forces, but it still affects others. A kinematic is solid, and must have a mass.
      (See detailed explanation below.) - + - +

      Kinematic vs Dynamic vs Static

      @@ -511,7 +519,7 @@ setKinematic(true);setMass(1f);
      setKinematic(false);
      - +

      When Do I Use Kinematic Objects?

      @@ -534,7 +542,7 @@ setKinematic(false);

      - +

      Forces: Moving Dynamic Objects

      @@ -572,7 +580,7 @@ Use the following methods to move dynamic physical objects. clearForces()Cancels out all forces (force, torque) etc and stops the motion.
      - +

      It is technically possible to position PhysicsControls using setLocalTranslation(), e.g. to place them in their start position in the scene. However you must be very careful not to cause an "impossible state" where one physical object overlaps with another! Within the game, you typically use the setters shown here exclusively. @@ -606,13 +614,13 @@ removeCollideWithGroup(COLLISION_GROUP_01)Collision Groups are integer setSleepingThreshold(float,float)Sets the sleeping thresholds which define when the object gets deactivated to save resources. The first value is the linear threshold and the second the angular. Low values keep the object active when it barely moves (slow precise performance), high values put the object to sleep immediately (imprecise fast performance). (?) - setCcdMotionThreshold(0f) Sets the amount of motion that has to happen in one physics tick to trigger the continuous motion detection. This avoids the problem of fast objects moving through other objects. Set to zero to disable (default). + setCcdMotionThreshold(0f) Sets the amount of motion that has to happen in one physics tick to trigger the continuous motion detection in movign obejcts that push one another. This avoids the problem of fast objects moving through other objects. Set to zero to disable (default). - setCcdSweptSphereRadius(.5f)Bullet does not use the full collision shape for continuous collision detection, insteadit uses a "swept sphere" shape to approximate a motion. Only relevant for fast moving dynamic bodies. (?) + setCcdSweptSphereRadius(.5f)Bullet does not use the full collision shape for continuous collision detection, instead it uses a "swept sphere" shape to approximate a motion, which can be imprecise and cause strange behaviours such as objects passign through one another or getting stuck. Only relevant for fast moving dynamic bodies.
      - +

      You can setApplyPhysicsLocal(true) for an object to make it move relatively to its local physics space. You would do that if you need a physics space that moves with a node (e.g. a spaceship with artificial gravity surrounded by zero-g space). By default, it's set to false, and all movement is relative to the world. @@ -620,7 +628,7 @@ removeCollideWithGroup(COLLISION_GROUP_01)Collision Groups are integer

      - +

      Best Practices

        @@ -634,12 +642,17 @@ removeCollideWithGroup(COLLISION_GROUP_01)Collision Groups are integer
        -
      • Buggy? If you get weird behaviour, such as physical nodes jittering wildy and being ejected "for no apparent reason", it means you have created an impossible state – solid objects overlapping. This can happen when you position solid spatials too close to other solid spatials, e.g. when moving them with setLocalTranslation().
        +
      • Eject? If you have physical nodes jittering wildy and being ejected "for no apparent reason", it means you have created an impossible state – solid objects overlapping. This can happen when you position solid spatials too close to other solid spatials, e.g. when moving them with setLocalTranslation().
        Solution: Use the debug mode to make CollisionShapes visible and verify that CollisionShapes do not overlap.
        bulletAppState.getPhysicsSpace().enableDebug(assetManager);
        +
      • Buggy? If you get weird behaviour, such as physical nodes passing through one another, or getting stuck for no reason.
        +Solution: Look at the physics space accessors and change the acuracy and other parameters.
        +
      • +
      +
      • Need more interactivity? You can actively control a physical game by triggering forces. You may also want to be able respond to collisions, e.g. by substracting health, awarding points, or by playing a sound.
        Solution: To specify how the game responds to collisions, you use Physics Listeners.
      • @@ -651,7 +664,7 @@ removeCollideWithGroup(COLLISION_GROUP_01)Collision Groups are integer
      -
      +
      1) Inertia is calculated for kinematic objects, and you need mass to do that.
      diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/post-processor_water.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/post-processor_water.html index 6fbb8a285..8c7cdf654 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/post-processor_water.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/post-processor_water.html @@ -4,7 +4,7 @@

      -The awesome SeaMonkey water Filter is highly configurable. It can render any type of water and also simulates the underwater part of the effect, including "caustics". It is is based on published on gamedev.net. Here's a video: +The awesome SeaMonkey WaterFilter is highly configurable. It can render any type of water and also simulates the underwater part of the effect, including light effects called caustics. The effect is based on published on gamedev.net. Here's a video:

      @@ -12,11 +12,12 @@ The awesome SeaMonkey water Filter is highly configurable. It can render any typ

      -Need simpler water? +

      The SeaMonkey WaterFilter is ideal for oceans and lakes, and expecially for under-water scenes. If you only need a small simple water surface, such as a water trough or a shallow fountain, the SimpleWaterProcessor may already be all you need. +

      - +

      The Theory

      @@ -34,7 +35,7 @@ The GameDev.net article describes how those effects are achieved, but the main i

      - +

      How Did We Implement it in jME3?

      @@ -56,7 +57,7 @@ Now we have the rendered scene in a texture, and we can reconstruct the position

      - +

      Sample Code

      @@ -68,20 +69,20 @@ There are two test cases in the jME3 repository:
      • (ocean island)
      • -
      -
      • (calm and muddy water pond)
      • +
      • (several ponds of different sizes at different heights etc)
        +
      - +

      Using the Water Filter

      -In the simpleInitApp() method, you attach your scene to the rootNode, typically a terrain with a sky. Remember to add a directional light, since the water relies on the light direction vector. The WaterFilter constrcutor expects a node with the scene attached that should be reflected in the water, and vector information from the light source's direction. +In the simpleInitApp() method, you attach your scene to the rootNode, typically a terrain with a sky. Remember to add a directional light, since the water relies on the light direction vector. The WaterFilter constructor expects a node with the scene attached that should be reflected in the water, and vector information from the light source's direction.

      @@ -108,7 +109,7 @@ Usually you make the water reflect everything attached to the rootNode. But you

      - +

      Optional: Waves

      @@ -128,7 +129,7 @@ public void simpleUpdate(float tpf) { }
      - +

      Optional: Water Wave and Color Effects

      @@ -175,7 +176,7 @@ manager.loadTexture("Textures/wavenormals.png") )This normal water.setNormalScale(0.5f)Sets the normal scaling factors to apply to the normal map. The higher the value, the more small ripples will be visible on the waves.1.0f
      -
      +
      @@ -200,10 +201,14 @@ Vector3f(0.0f, 0.0f,0.2f,1.0f)
      Water method example Effects: ColorDefault
      water.setColorExtinction(new Vector3f(10f,20f,30f));Sets At what depth the refraction color extincts. The three values are RGB (red, green, blue) in this order. Play with these parameters to "muddy" the water.Vector3f(5f,20f,30f)
      -
      +
      + + + @@ -211,7 +216,7 @@ Vector3f(0.0f, 0.0f,0.2f,1.0f)
      Water method example Effects: ShoreDefault
      water.setCenter(Vector3f.ZERO);
      +water.setRadius(260);
      Limit the water filter to a semisphere with the given center and radius. Use this for lakes and smaller bodies of water. Skip this for oceans.unused
      water.setShoreHardness(1.0f);Sets how soft the transition between shore and water should be. High values mean a harder transition between shore and water.0.1f
      water.setUseHQShoreline(false);Renders shoreline with better quality ?true
      -
      +
      @@ -229,7 +234,7 @@ Vector3f(0.0f, 0.0f,0.2f,1.0f) manager.loadTexture("Textures/foam.png") )
      Water method example Effects: FoamDefault
      This foam texture will be used with WrapMode.Repeat"Common/MatDefs/Water/Textures/foam.jpg"
      -
      +
      @@ -255,9 +260,9 @@ manager.loadTexture("Textures/foam.png") )
      Water method example Effects: LightDefault
      This foam texture w water.setReflectionMapSize(256)Sets the size of the reflection map. The higher, the better the quality, but the slower the effect.512
      - + - +

      Sound Effects

      @@ -268,6 +273,11 @@ You should also add audio nodes with water sounds to complete the effect.
      AudioNode waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", false);
       waves.setLooping(true);
       audioRenderer.playSource(waves);
      + +

      + +See also: audio. +


      @@ -281,5 +291,5 @@ See also:

      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/save_and_load.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/save_and_load.html index 675b13ba3..02153ea17 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/save_and_load.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/save_and_load.html @@ -1,19 +1,27 @@ -

      Saving and Loading Games

      +

      Saving and Loading Games (.j3o)

      -Spatials can contain Nodes, Geometries, and user data (player score, health, inventory, etc). You can save and load individual Nodes or Geometries, as well as whole scenes using com.jme3.export.binary.BinaryExporter and com.jme3.export.binary.BinaryImporter. The jMonkeyEngine's serialization system is the com.jme3.export.Savable interface; the jMonkeyEngine's binary file format is called .j3o. You can open, view, and edit .j3o files in the jMonkeyEngine SDK. +Spatials (that is Nodes and Geometries) can contain audio and light nodes, particle emitters, controls, and user data (player score, health, inventory, etc). For your game distribution, you must convert all original models to a faster binary format. You save individual Spatials as well as scenes using com.jme3.export.binary.BinaryExporter.

      -

      JME's BinaryExporter/BinaryImporter can read and write standard Java objects, JME objects, and primitive data types that are included in a spatial's user data. See below how to make additional custom classes "Savable". +The jMonkeyEngine's binary file format is called .j3o. You can convert, view and edit .j3o files and their materials in the jMonkeyEngine SDK and compose scenes (this does not include editing meshes). For the conversion, you can either use the BinaryExporters, or a context menu in the SDK. +

      + +

      +

      The jMonkeyEngine's serialization system is the com.jme3.export.Savable interface. JME3's BinaryExporter can write standard Java objects, JME3 objects, and primitive data types that are included in a spatial's user data. If you use custom game data classes, see below how to make them "Savable".

      +

      +There is also a com.jme3.export.xml.XMLExporter and com.jme3.export.xml.XMLImporter that similarly converts jme3 spatials to an XML format. But you wouldn't use that to load models at runtime (quite slow). +

      +
      - +

      Sample Code

        @@ -22,70 +30,50 @@ Spatials can contain Nodes, Geometries, and user data (player score, health, inv
      - +

      Saving a Node

      -The following example overrides destroy() to save the rootNode to a file when the user quits the application. The saved rootNode is a normal .j3o binary file that you open in the SDK. +The following example overrides stop() in SimpleApplication to save the rootNode to a file when the user quits the application. The saved rootNode is a normal .j3o binary file that you can open in the SDK.

      -

      Note that when you save a model that has textures the textures are references to those textures are stored as absolute paths, so when loading the j3o file they have to be accessible at the exact location (relative to the assetmanager root) they were loaded from. This is why the SDK manages the conversion on the project level. +

      Note that when you save a model that has textures, the references to those textures are stored as absolute paths, so when loading the j3o file again, the textures have to be accessible at the exact location (relative to the assetmanager root, by default the assets directory) they were loaded from. This is why the SDK manages the conversion on the project level.

        /* This is called when the user quits the app. */
         @Override
      -  public void destroy() {
      +  public void stop() {
           String userHome = System.getProperty("user.home");
           BinaryExporter exporter = BinaryExporter.getInstance();
      -    File file = new File(userHome+"/MySuperGame/"+"LastSavedGame.j3o");
      +    File file = new File(userHome+"/Models/"+"MyModel.j3o");
           try {
             exporter.save(rootNode, file);
           } catch (IOException ex) {
             Logger.getLogger(Main.class.getName()).log(Level.SEVERE, "Error: Failed to save game!", ex);
           }
      -    super.destroy(); // continue quitting the game
      +    super.stop(); // continue quitting the game
         }
      -

      -

      You can add a timestamp to your saved files: -

      -
      long timestamp = System.currentTimeMillis()/1000;
      -File file = new File(userHome+"/MySuperGame/"+"/SavedGame-"+timestamp+".j3o");
      - -

      - -

      -

      -
      - +

      Loading a Node

      -The following example uses simpleInitApp() to load the last saved game when the game is initialized. +The following example overrides simpleInitApp() in SimpleApplication to load Models/MyModel.j3o when the game is initialized.

        @Override
         public void simpleInitApp() {
      -    String userHome = System.getProperty("user.home");
      -    BinaryImporter importer = BinaryImporter.getInstance();
      -    importer.setAssetManager(assetManager);
      -    File file = new File(userHome+"/MySuperGame/"+"LastSavedGame.j3o");
      -    if(file.exists()){
      -      try {
      -        Node loadedNode = (Node)importer.load(file);
      -        loadedNode.setName("loaded node");
      -        rootNode.attachChild(loadedNode);
      -      } catch (IOException ex) {
      -        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, "Could not load saved game.", ex);
      -      }
      -    else {
      -      // No previous game. Create new game, or let user browse to file, etc...    
      -    }
      +     String userHome = System.getProperty("user.home");
      +     assetManager.registerLocator(userHome, FileLocator.class);
      +     Node loadedNode = (Node)assetManager.loadModel("Models/MyModel.j3o");
      +     loadedNode.setName("loaded node");
      +     rootNode.attachChild(loadedNode);
      +  }
        

      @@ -94,13 +82,13 @@ The following example uses simpleInitApp() to load the last saved game when the

      - +

      Custom Savable Class

      -JME's BinaryExporter/BinaryImporter can read and write standard Java objects (String, ArrayList, buffers, etc), JME objects (Savables, such as Material), and primitive data types (int, float, etc). If you are using any custom class together with a Spatial, then the custom class must implement the com.jme3.export.Savable interface. There are two common cases where this is relevant: +JME's BinaryExporter can write standard Java objects (String, ArrayList, buffers, etc), JME objects (Savables, such as Material), and primitive data types (int, float, etc). If you are using any custom class together with a Spatial, then the custom class must implement the com.jme3.export.Savable interface. There are two common cases where this is relevant:

        @@ -182,7 +170,18 @@ To make a custom class savable:

        As with all serialization, remember that if you ever change data types in custom classes, the updated read() methods will no longer be able to read your old files.

        +
      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/screenshots.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/screenshots.html index 3b6ec010e..3261f3ba7 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/screenshots.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/screenshots.html @@ -8,14 +8,18 @@ The com.jme3.app.state.ScreenshotAppState enables your users to take screenshots

      -You activate it as follows in your simpleInitApp() method: +You activate this feature as follows in your simpleInitApp() method:

      -
      ScreenshotAppState state = new ScreenshotAppState();
      -this.stateManager.attach(state);
      +
      ScreenshotAppState screenShotState = new ScreenshotAppState();
      +this.stateManager.attach(screenShotState);

      -The default screenshot key is KeyInput.KEY_SYSRQ, alos known as "System Request / Print Screen" key. On Mac OS, you can take screenshots using Command+Shift+3 (fullscreen) or Command+Shift+4, and then press space to select a window. +The default screenshot key is KeyInput.KEY_SYSRQ, alos known as "System Request / Print Screen" key. On Mac keyboards, this key does not exist, so on Mac OS you take screenshots using Command+Shift+3 (fullscreen) or Command+Shift+4 (windowed: press space to select a window and then click). +

      + +

      +The screenshot is saved to the user directory.

      diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/shape.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/shape.html index 01d992918..1fb7ba1cf 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/shape.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/shape.html @@ -101,12 +101,13 @@ These maths objects are invisible and are used for collision testing (ray castin

      + To add a shape to the scene:

      1. Create the base mesh shape.
      2. -
      3. Wrap it into a Geometry.
        +
      4. Wrap the mesh into a Geometry.
      5. Assign a Material to the Geometry.
      6. @@ -114,6 +115,12 @@ To add a shape to the scene:
      +

      + +

      Create one static shape as mesh and use it in several geometries, or clone() the geometries. +

      +

      +

      Complex Shapes

      @@ -141,7 +148,7 @@ The order is important: First arrange around origin, then transform. Otherwise,

      - +

      Code Examples

      @@ -171,5 +178,15 @@ geom.setMaterial(mat); // assign material to geo rootNode.attachChild(geom); // attach geometry to a node
      - + +

      See also

      +
      + +

      + +* Optimization – The GeometryBatchFactory class combines several of your shapes with the same texture into one mesh with one texture. +

      + +
      +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/spatial.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/spatial.html index 008ad78c7..dd202740f 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/spatial.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/spatial.html @@ -22,7 +22,7 @@ If you think you need to understand the scene graph concept better, please read

      -In your Java code, a Spatial is either a com.jme3.scene.Node or a com.jme3.scene.Geometry. You use the two for different purposes: +In your Java code, a Spatial is either a com.jme3.scene.Node or a com.jme3.scene.Geometry instance. You use the two types of Spatials for different purposes:

      @@ -34,7 +34,7 @@ In your Java code, a Spatial is either a com.jme3.scene.Node or a < com.jme3.scene.Spatial - Purpose: A Spatial is an abstract data structure that stores transformations (translation, rotation, scale) of elements of the 3D scene graph. Spatials can be saved and loaded using the Asset Manager. + Purpose: A Spatial is an abstract data structure that stores transformations (= translation, rotation, scale) of elements of the 3D scene graph. Spatials can be saved and loaded using the Asset Manager. com.jme3.scene.Geometry com.jme3.scene.Node @@ -44,27 +44,27 @@ In your Java code, a Spatial is either a com.jme3.scene.Node or a < Purpose: Use Geometries to represent an object's looks: Every Geometry contains a polygon mesh and a material, specifying its shape, color, texture, and opacity/transparency.
      -You can attach a Geometry to a Node. Use Nodes to structure and group Geometries and other Nodes. Every Node is attached to one parent node, and each node can have zero or more children attached to itself.
      +You attach Geometries to Nodes. Use Nodes to structure and group Geometries and other Nodes. Every Node is attached to one parent node, and each node can have zero or more children (Nodes or Geometries) attached to itself.
      When you transform (move, rotate, etc) a parent node, all its children are transformed (moved, rotated, etc). Content: Transformations; custom user data;
      -mesh, material; Transformations; custom user data;
      +mesh and material; Transformations; custom user data;
      no mesh, no material. - Examples: Box, sphere, player, building, terrain, vehicle, missiles, NPCs, etc… rootNode, guiNode, audioNode, a custom vehicleNode or shipNode with passengers attached, etc. + Examples: Box, sphere, player, building, terrain, vehicle, missiles, NPCs, etc… rootNode, guiNode, audioNode, a custom grouping node such as vehicleNode or shipNode with passengers attached, etc.

      - +

      -

      You never create a Spatial with Spatial s = new Spatial();! A Spatial is an abstract concept, like a mammal (there is no actual creature called "mammal" walking around here). You either create a Node or a Geometry object. Some methods however require a Spatial argument: This is because they are able to accept both Nodes and Geometries as arguments. In this case, you must cast a Node or Geometry to Spatial. +

      You never create a Spatial with Spatial s = new Spatial();! A Spatial is an abstract concept, like a mammal (there is no actual creature called "mammal" walking around here). You create either a com.jme3.scene.Node, or a com.jme3.scene.Geometry object. Some methods, however, require a spatial as argument: This is because they are able to accept both Nodes and Geometries as arguments. In this case, you simply cast a Node or Geometry to Spatial.

      - +

      Mesh

      @@ -83,7 +83,36 @@ The polygon Mesh i
      - + +

      What is a Clone?

      +
      + +

      + +Cloned spatials share the same mesh, while each cloned spatial can have its own local transformation (translation, rotation, and scale) in the scene. This means you only use clone() on spatials whose meshes never change. The most common use case for cloning is when you use several Spatials that are based on the same Shapes. +

      + +

      +The second use case is: When you load a model using loadModel() from the AssetManager, you may get a clone()ed object. In particular: +

      +
        +
      • If the model is not animated (it has no AnimControl), you get a clone. All clones share one mesh object. (Uses less memory)
        +
      • +
      • If the model is animated (it has a AnimControl), then loadModel() duplicates the mesh for each loaded instance. (Uses more memory)
        +
      • +
      + +

      +Usually there is no need to manually use any of the clone() methods on models. Using the Asset Manager's loadModel() method will automatically do the right thing for your models. +

      + +

      +

      "Box worlds" are not made up of statically cloned Box() shapes, this would still be too slow for large worlds. To learn how to make real fast box worlds, search the web for voxelization techniques. +

      +

      + +
      +

      How to Add Fields and Methods to a Spatial

      @@ -93,24 +122,23 @@ You can include custom user data –that is, custom Java objects and methods–

      -

      Neither do you need to ever extend Node to be able to add custom accessor methods to a spatial – use Custom Controls instead. There is no need to create a custom class that extends Node or Geometry to be able to add custom fields – use the provided setUserData() method instead. Where ever the Spatial is accessible, you can easily access the object's game data and accessors this way. +

      You want to add custom accessor methods to a spatial? Do not extend Node or Geometry, use Custom Controls instead. You want to add custom fields to a spatial? Do not extend Node or Geometry, use the built-in setUserData() method instead. Where ever the Spatial is accessible, you can easily access the object's class fields (user data) and accessors (control methods) this way.

      -The following example adds an integer field named health to the Spatil player_node, and initializes it to 100. +This first example adds an integer field named health to the Spatial player_node, and initializes it to 100.

      player_node.setUserData("health", 100);

      -To be able to add accessors to the player, you create a custom PlayerControl class and add it to the Spatial. - +The second example adds a set of custom accessor methods to the player object. You create a custom PlayerControl() class and you add this control to the Spatial:

      -
      player_node.addControl(PlayerControl.class);
      +
      player_node.addControl(new PlayerControl());

      -In PlayerControl you define methods that set and get your users data in the spatial object. +In your PlayerControl() class, you define custom methods that set and get your user data in the spatial object. For example, the control could add accessors that set and get the player's health:

      public int getHealth() {
         return (Integer)spatial.getUserData("health");
      @@ -126,11 +154,11 @@ Elsewhere in your code, you can access this data wherever you have access to the
       ...
       player_node.getControl(PlayerControl.class).setHealth(99);
        -
      • You can add as many data objects (including Strings, Integers, Floats, Arrays,) to a Spatial as you want. Just make sure to label them with unique Strings (health, inventory, equipment, etc).
        +
      • You can add as many data objects (of String, Boolean, Integer, Float, Array types) to a Spatial as you want. Just make sure to label them with unique case-sensitive strings (health, Inventory, equipment, etc).
      • -
      • The saved data can be custom Java objects if you make the custom Java class implement the Savable interface.
        +
      • The saved data can even be a custom Java object if you make the custom Java class implement the Savable interface!
      • -
      • When you save a Spatial as a .j3o file, the custom data is saved, too, and it will be restored the next time you load the .j3o!
        +
      • When you save a Spatial as a .j3o file, the custom data is saved, too, and all Savables are restored the next time you load the .j3o!
      @@ -143,7 +171,7 @@ This is how you list all data keys that are already defined for one Spatial: }
      - +

      How to Access a Named Sub-Mesh

      @@ -168,5 +196,15 @@ In the following example, the Node house is the loaded model. The s
      Geometry submesh = (Geometry) houseScene.getChild("door 12");
      - + +

      See also

      +
      + +

      + +* Optimization – The GeometryBatchFactory class batches several Geometries into meshes with each their own texture. +

      + +
      +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain_collision.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain_collision.html index 8d7338d1e..62d5caf5e 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain_collision.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain_collision.html @@ -101,8 +101,7 @@ public class HelloTerrainCollision extends SimpleApplication AbstractHeightMap heightmap = null; Texture heightMapImage = assetManager.loadTexture( "Textures/Terrain/splat/mountains512.png"); - heightmap = new ImageBasedHeightMap( - ImageToAwt.convert(heightMapImage.getImage(), false, true, 0)); + heightmap = new ImageBasedHeightMap(heightMapImage.getImage()); heightmap.load();   /** 3. We have prepared material and heightmap. @@ -145,7 +144,7 @@ public class HelloTerrainCollision extends SimpleApplication player.setJumpSpeed(20); player.setFallSpeed(30); player.setGravity(30); - player.setPhysicsLocation(new Vector3f(0, 10, 0)); + player.setPhysicsLocation(new Vector3f(-10, 10, 10));   // We attach the scene and the player to the rootnode and the physics space, // to make them appear in the game world. @@ -214,12 +213,12 @@ Compile and run the code. You should see a terrain. You can use the WASD keys an

      - +

      Understanding the Code

      - +

      The Terrain Code

      @@ -237,7 +236,7 @@ Read Hello Te
      - +

      The Collision Detection Code

      @@ -261,7 +260,7 @@ Read Hello
      - +

      Combining the Two

      @@ -291,7 +290,7 @@ You attach the terrain and the first-person player to bulletAppState.getPhysicsSpace().add(player);
      - +

      Conclusion

      @@ -321,5 +320,5 @@ See also:
      - +

      view online version

      \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/water.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/water.html index 4d3087f4e..11f064e5c 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/water.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/water.html @@ -4,6 +4,10 @@

      +jMonkeyEngine offers a SimpleWaterProcessor that turns any quad (flat rectangle) into a reflective water surface with waves. You can use this quad for simple limited water surfaces such as water troughs, shallow fountains, puddles, shallow water in channels. The SimpleWaterProcessor has less performance impact on your game than the full featured SeaMonkey WaterFilter; the main difference is that the SimpleWaterProcessor does not include under-water effects. +

      + +

      Here is some background info for JME3's basic water implementation:

        @@ -21,7 +25,7 @@ Here is some background info for JME3's basic water implementation:

        - +

        SimpleWaterProcessor

        @@ -60,7 +64,7 @@ To achieve a water effect, JME3 uses shaders and a special material, Commo
        - +

        Usage

        @@ -121,7 +125,7 @@ To achieve a water effect, JME3 uses shaders and a special material, Commo
        - +

        Sample Code

        @@ -160,7 +164,7 @@ water.setMaterial(waterProcessor.getMaterial()); rootNode.attachChild(water);
        - +

        Settings

        @@ -209,5 +213,5 @@ You can offer a switch to set the water Material to a static texture – for use

        - +

        view online version

        \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_animation.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_animation.html index c856f73af..4e94750b6 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_animation.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_animation.html @@ -16,8 +16,14 @@ This tutorial shows how to add an animation controller and channels, and how to

        +

        +

        To use the example assets in a new jMonkeyEngine SDK project, right-click your project, select "Properties", go to "Libraries", press "Add Library" and add the "jme3-test-data" library. +

        + +

        + - +

        Sample Code

        package jme3test.helloworld;
        @@ -93,7 +99,7 @@ public class HelloAnimation extends SimpleApplication
         }
        - +

        Creating and Loading Animated Models

        @@ -122,7 +128,7 @@ Don't forget to add a light source to make the material visible.

        - +

        Animation Controler and Channel

        @@ -151,8 +157,27 @@ After you load the animated model, you register it to the Animation Controller. channel.setAnim("stand"); ... +

        +

        In response to a question about animations on different channels interefering with each other, Nehon on the jME forum , +

        + +

        +"You have to consider channels as part of the skeleton that are animated. The default behavior is to use the whole skeleton for a channel. +In your example the first channel plays the walk anim, then the second channel plays the dodge animation. +Arms and feet are probably not affected by the doge animation so you can see the walk anim for them, but the rest of the body plays the dodge animation. +

        + +

        +Usually multiple channels are used to animate different part of the body. For example you create one channel for the lower part of the body and one for the upper part. This allow you to play a walk animation with the lower part and for example a shoot animation with the upper part. This way your character can walk while shooting. +

        + +

        +In your case, where you want animations to chain for the whole skeleton, you just have to use one channel." +

        +

        +
        - +

        Responding to Animation Events

        @@ -177,7 +202,7 @@ Add implements AnimEventListener to the class declaration. This int }
        - +

        Trigger Animations After User Input

        @@ -233,7 +258,7 @@ Test for each action by name, and set the channel to the corresponding animation };
        - +

        Exercises

        @@ -302,7 +327,7 @@ Can you identify individual bones in the skeleton?

        - +

        Conclusion

        @@ -332,5 +357,5 @@ See also: - +

        view online version

        \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_audio.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_audio.html index 7aa8bf012..f18bf9511 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_audio.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_audio.html @@ -10,8 +10,14 @@ Previous: Hel This tutorial explains how to add 3D sound to a game, and how make sounds play together with events, such as clicking. You learn how to use an Audio Listener and Audio Nodes. You also make use of an Action Listener and a MouseButtonTrigger from the previous Hello Input tutorial to make a mouse click trigger a gun shot sound.

        +

        +

        To use the example assets in a new jMonkeyEngine SDK project, right-click your project, select "Properties", go to "Libraries", press "Add Library" and add the "jme3-test-data" library. +

        + +

        + - +

        Sample Code

        package jme3test.helloworld;
        @@ -104,7 +110,7 @@ When you run the sample, you should see a blue cube. You should hear a nature-li
         

        - +

        Understanding the Code Sample

        @@ -122,7 +128,7 @@ Let's have a closer look at initAudio() to learn how to use
        - +

        AudioNodes

        @@ -178,7 +184,7 @@ Here you make audio_nature a positional sound that comes from a certain place. F

        - +

        Triggering Sound

        @@ -210,7 +216,7 @@ Since you want to be able to shoot fast repeatedly, so you do not want to wait f

        - +

        Ambient or Situational?

        @@ -239,7 +245,7 @@ Now every sound knows whether it should loop or not.

        -Apart from the looping boolean, another difference is where play() (playInstace()) is called on those nodes: +Apart from the looping boolean, another difference is where play().playInstance() is called on those nodes:

        • You start playing the background nature sound right after you have created it, in the initAudio() method.
              audio_nature.play(); // play continuously!
          @@ -259,7 +265,7 @@ Apart from the looping boolean, another difference is where play()
        - +

        Buffered or Streaming?

        @@ -282,7 +288,7 @@ Note that streamed sounds can not loop (i.e. setLooping will not work as you exp

        - +

        Play() or PlayInstance()?

        @@ -299,9 +305,9 @@ Note that streamed sounds can not loop (i.e. setLooping will not work as you exp
        The same sound cannot play twice at the same time.The same sounds can play multiple times and overlap.
        - +
        - +

        Your Ear in the Scene

        @@ -323,7 +329,7 @@ If you don't do that, the results of 3D audio will be quite random.

        - +

        Global, Directional, Positional?

        @@ -350,7 +356,7 @@ In short, you must choose in every situation whether it makes sense for a sound

        - +

        Conclusion

        @@ -385,5 +391,5 @@ See also:
        - +

        view online version

        \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_effects.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_effects.html index cb9be34aa..fe0960b03 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_effects.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_effects.html @@ -46,8 +46,13 @@ These scene elements cannot be modeled by meshes. In very simple terms: Particle effects can be animated (e.g. sparks, drops) and static (strands of grass, hair). Non-particle effects include bloom/glow, and motion blur/afterimage. In this tutorial you learn how to make animated particles (com.jme3.effect).

        +

        +

        To use the example assets in a new jMonkeyEngine SDK project, right-click your project, select "Properties", go to "Libraries", press "Add Library" and add the "jme3-test-data" library. +

        +

        + - +

        Sample Code

        package jme3test.helloworld;
        @@ -116,7 +121,7 @@ You should see an explosion that sends debris flying, and a fire.
         

        - +

        Texture Animation and Variation

        @@ -164,7 +169,7 @@ The fire material is created the same way, just using "Effects/Explosion/fl

        - +

        Default Particle Textures

        @@ -193,14 +198,14 @@ The following particle textures included in test-data.jar. You can Effects/Smoke/Smoke.png 1*15
        - +

        Copy them into you assets/Effects directory to use them.

        - +

        Creating Custom Textures

        @@ -246,7 +251,7 @@ Create a grayscale texture in a graphic editor, and save it to your assets

        - +

        Emitter Parameters

        @@ -318,7 +323,7 @@ Vector3f.NAN
        gravity setGravity() 0,1,0 Whether particles fall down (positive) or fly up (negative). Set to 0f for a zero-g effect where particles keep flying.
        - +

        You can find details about effect parameters here. @@ -331,7 +336,7 @@ Add and modify one parameter at a time, and try different values until you get t

        - +

        Exercise

        @@ -351,7 +356,7 @@ Can you "invert" the fire effect into a small waterfall? Here some tip
        - +

        Conclusion

        @@ -374,5 +379,5 @@ Now you move on to another exciting chapter – the simulation of - +

        view online version

        \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_input_system.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_input_system.html index 216b95b64..aec5c578c 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_input_system.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_input_system.html @@ -284,16 +284,22 @@ Mappings registered to the AnalogListener are triggered repeate
        1. JME gives you access to the name of the triggered action.
        2. -
        3. JME gives you access to a gradual value how long the key has been pressed.
          +
        4. JME gives you access to a gradual value showing the strength of that input. In the case of a keypress that will be the tpf value for which it was pressed since the last frame. For other inputs such as a joystick which give analogue control though then the value will also indicate the strength of the input premultiplied by tpf. For an example on this go to jMonkeyEngine 3 Tutorial (5) - Hello Input System - Variation over time key is pressed
        + + +

        + +In order to see the total time that a key has been pressed for then the incoming value can be accumulated. The analogue listener may also need to be combined with an action listener so that you are notified when they key is released. +

        +
        • Example: Navigational events (e.g. Left, Right, Rotate, Run, Strafe), situations where you interact continuously.

        - Mappings registered to the ActionListener are digital either-or actions – "Pressed or released? On or off?"

          @@ -318,7 +324,7 @@ Mappings registered to the ActionListener are digital either-or } - +

          Table of Triggers

          @@ -354,14 +360,14 @@ You can find the list of input constants in the files src/core/com/jme3/in KeyTrigger(KeyInput.KEY_LEFT), KeyTrigger(KeyInput.KEY_RIGHT)
          - +

          Tip: If you don't recall an input constant during development, you benefit from an IDE's code completion functionality: Place the caret after e.g. KeyInput.| and trigger code completion to select possible input identifiers.

          - +

          Exercises

            @@ -380,8 +386,16 @@ inputManager.addMapping("Pause", new KeyTrigger(usersPauseKey
          +

          + +

          Link to user-proposed solutions: +Be sure to try to solve them for yourself first! +

          + +

          +
          - +

          Conclusion

          @@ -403,5 +417,5 @@ Now you can already write a little interactive game! But wouldn't it be coo
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_main_event_loop.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_main_event_loop.html index d8084eeef..e9d707fd9 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_main_event_loop.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_main_event_loop.html @@ -181,8 +181,15 @@ Here are some fun things to try: Look back at the Hello Node tutorial if you do not remember the transformation methods for scaling, translating, and rotating.

          +

          +

          Link to user-proposed solutions: +Be sure to try to solve them for yourself first! +

          + +

          + - +

          Conclusion

          @@ -214,5 +221,5 @@ See also:
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_material.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_material.html index 3bfcd67c4..8ef63cfb5 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_material.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_material.html @@ -13,8 +13,14 @@ The term Material includes everything that influences what the surface of a 3D m

          +

          +

          To use the example assets in a new jMonkeyEngine SDK project, right-click your project, select "Properties", go to "Libraries", press "Add Library" and add the "jme3-test-data" library. +

          + +

          + - +

          Sample Code

          package jme3test.helloworld;
          @@ -116,7 +122,7 @@ Move around with the WASD keys to have a closer look at the translucency, and th
           

          - +

          Simple Unshaded Texture

          @@ -150,7 +156,7 @@ The ColorMap is the typical material layer where textures go.
          - +

          Transparent Unshaded Texture

          @@ -207,7 +213,7 @@ The ColorMap is the material layer where textures go. This +

          Shininess and Bumpiness

          @@ -274,7 +280,7 @@ Remember that any Lighting.j3md-based material requires a light source, as shown

          - +

          Default Material Definitions

          @@ -299,19 +305,19 @@ DiffuseMap, NormalMap, SpecularMap : Texture2D
          Shininess : Float
          - +

          For a game, you create custom Materials based on these existing MaterialDefintions – as you have just seen in the example with the shiny rock's material.

          - +

          Exercises

          - +

          Exercise 1: Custom .j3m Material

          @@ -364,7 +370,7 @@ Using this new custom material LeakThrough.j3m only takes one line.

          - +

          Exercise 2: Bumpiness and Shininess

          @@ -394,7 +400,7 @@ Go back to the bumpy rock sample above:
          - +

          Conclusion

          @@ -444,5 +450,5 @@ See also
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_physics.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_physics.html index c3b8ed4cb..b19f1ba67 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_physics.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_physics.html @@ -38,8 +38,13 @@ All these physical properties can be simulated in JME3. Let's have a look a

          +

          +

          To use the example assets in a new jMonkeyEngine SDK project, right-click your project, select "Properties", go to "Libraries", press "Add Library" and add the "jme3-test-data" library. +

          +

          + - +

          Sample Code

          @@ -246,7 +251,7 @@ You should see a brick wall. Click to shoot cannon balls. Watch the bricks fall

          - +

          A Basic Physics Application

          @@ -274,12 +279,12 @@ The BulletAppState gives the game access to a PhysicsSpace. The PhysicsSpace let

          - +

          Creating Bricks and Cannon Balls

          - +

          Geometries

          @@ -308,7 +313,7 @@ In this "shoot at the wall" example, you use Geometries such as cannon }
          - +

          RigidBodyControl: Brick

          @@ -370,7 +375,7 @@ This code sample does the following:
          - +

          RigidBodyControl: Cannonball

          @@ -433,7 +438,7 @@ Since you are shooting cannon balls, the last line accelerates the ball in the d

          - +

          RigidBodyControl: Floor

          @@ -488,7 +493,7 @@ This code sample does the following:
          - +

          Creating the Scene

          @@ -513,7 +518,7 @@ These methods are each called once from the simpleInitApp() method

          - +

          The Cannon Ball Shooting Action

          @@ -543,7 +548,7 @@ In the moment the cannonball appears in the scene, it flies off with the velocit

          - +

          Moving a Physical Spatial

          @@ -570,12 +575,12 @@ Learn more about static versus kinematic versus dynamic in the +

          Excercises

          - +

          Exercise 1: Debug Shapes

          @@ -592,7 +597,7 @@ Now you see the collisionShapes of the bricks and spheres, and the floor highlig

          - +

          Exercise 2: No Mo' Static

          @@ -602,7 +607,7 @@ What happens if you give a static node, such as the floor, a mass of more than 0

          - +

          Exercise 3: Behind the Curtain

          @@ -620,7 +625,7 @@ Using physics everywhere in a game sounds like a cool idea, but it is easily ove

          - +

          Conclusion

          @@ -644,5 +649,5 @@ You have learned how to activate the jBullet PhysicsSpace in an application by a
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_picking.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_picking.html index 92123e620..422ab451f 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_picking.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_picking.html @@ -39,14 +39,12 @@ import com.jme3.input.MouseInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.input.controls.MouseButtonTrigger; -import com.jme3.light.DirectionalLight; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; import com.jme3.math.Ray; import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.Node; -import com.jme3.scene.Spatial; import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Sphere;   @@ -75,7 +73,6 @@ public class HelloPicking extends SimpleApplication { shootables.attachChild(makeCube("the Sheriff", 0f, 1f, -2f)); shootables.attachChild(makeCube("the Deputy", 1f, 0f, -4f)); shootables.attachChild(makeFloor()); - shootables.attachChild(makeCharacter()); }   /** Declaring the "Shoot" action and mapping to its triggers. */ @@ -162,19 +159,6 @@ public class HelloPicking extends SimpleApplication { settings.getHeight() / 2 + ch.getLineHeight() / 2, 0); guiNode.attachChild(ch); } -  - protected Spatial makeCharacter() { - // load a character from jme3test-test-data - Spatial golem = assetManager.loadModel("Models/Oto/Oto.mesh.xml"); - golem.scale(0.5f); - golem.setLocalTranslation(-1.0f, -1.5f, -0.6f); -  - // We must add a light to make the model visible - DirectionalLight sun = new DirectionalLight(); - sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f)); - golem.addLight(sun); - return golem; - } }

          @@ -186,7 +170,7 @@ Keep an eye on the application's output stream, it will give you more detai

          - +

          Understanding the Helper Methods

          @@ -220,7 +204,7 @@ In this example, we attached all "shootable" objects to one custom nod

          - +

          Understanding Ray Casting for Hit Testing

          @@ -252,12 +236,12 @@ Here is our simple ray casting algorithm for picking objects:
          - +

          Implementing Hit Testing

          - +

          Loading the scene

          @@ -285,7 +269,7 @@ First initialize some shootable nodes and attach them to the scene. You will use }
          - +

          Setting Up the Input Listener

          @@ -303,7 +287,7 @@ Next you declare the shooting action. It can be triggered either by clicking, or }
          - +

          Picking Action Using Crosshairs

          @@ -369,7 +353,7 @@ Note how it prints a lot of output to show you which hits were registered.

          - +

          Picking Action Using Mouse Pointer

          @@ -410,7 +394,7 @@ Note that since you now use the mouse for picking, you can no longer use it to r

          - +

          Exercises

          @@ -421,7 +405,7 @@ Modify the code sample to solve these exercises:

          - +

          Exercise 1: Magic Spell

          @@ -448,7 +432,7 @@ Here are some tips:
          - +

          Exercise 2: Shoot a Character

          @@ -459,10 +443,12 @@ Shooting boxes isn't very exciting – can you add code that loads and posi
          • Tip: You can use Spatial golem = assetManager.loadModel("Models/Oto/Oto.mesh.xml"); from the engine's jme3-test-data.jar.
          • +
          • Tip: Models are shaded! You need some light!
            +
          - +

          Exercise 3: Pick up into Inventory

          @@ -487,8 +473,16 @@ Change the code as follows to simulate the player picking up objects into the in +

          + +

          Link to user-proposed solutions: +Be sure to try to solve them for yourself first! +

          + +

          +
          - +

          Conclusion

          @@ -539,5 +533,5 @@ See also:
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_terrain.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_terrain.html index f3f74196e..7c6a26cf3 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_terrain.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_terrain.html @@ -19,8 +19,13 @@ One way to create a 3D landscape is to sculpt a huge terrain model. This gives y Note: If you get an error when trying to create your ImageBasedHeightMap object, you may need to update the SDK, click on "Help" / "Check for updates"

          +

          +

          To use the example assets in a new jMonkeyEngine SDK project, right-click your project, select "Properties", go to "Libraries", press "Add Library" and add the "jme3-test-data" library. +

          +

          + - +

          Sample Code

          package jme3test.helloworld;
          @@ -39,6 +44,8 @@ import com.jme3.texture.Texture.WrapMode;
           import java.util.ArrayList;
           import java.util.List;
            
          +/** Sample 10 - How to create fast-rendering terrains from heightmaps,
          +and how to use texture splatting to make the terrain look good.  */
           public class HelloTerrain extends SimpleApplication {
            
             private TerrainQuad terrain;
          @@ -117,7 +124,7 @@ When you run this sample you should see a landscape with dirt mountains, grass p
           

          - +

          What is a Heightmap?

          @@ -171,7 +178,7 @@ In a real game, you will want to use more complex and smoother terrains than the

          - +

          Looking at the Heightmap Code

          @@ -226,7 +233,7 @@ It requires an image from a JME Texture.
          heightmap.load(); - +

          What is Texture Splatting?

          @@ -294,7 +301,7 @@ Now you start painting the texture:

          - +

          Looking at the Texturing Code

          @@ -350,7 +357,7 @@ Use setWrap(WrapMode.Repeat) to make the small texture fill the wid

          - +

          What is a Terrain?

          @@ -388,7 +395,7 @@ Create a TerrainQuad with the following arguments:
          - +

          Looking at the Terrain Code

          @@ -423,7 +430,7 @@ You have created the terrain object.

          - +

          What is LOD (Level of Detail)?

          @@ -439,12 +446,12 @@ Close parts of the terrain are rendered in full detail. Terrain parts that are f

          - +

          Exercises

          - +

          Exercise 1: Texture Layers

          @@ -463,7 +470,7 @@ You see it's easier to swap layers in the code, than to change the colors i

          - +

          Exercise 2: Randomized Terrains

          @@ -480,14 +487,15 @@ Instead, you can also let JME3 generate a random landscape for you:

          1. What result do you get when you replace the above two heightmap lines by the following lines and run the sample?
            HillHeightMap heightmap = null;
            +HillHeightMap.NORMALIZE_RANGE = 100; // optional
             try {
            -    heightmap = new HillHeightMap(513, 1000, 50, 100, (byte) 3);
            +    heightmap = new HillHeightMap(513, 1000, 50, 100, (byte) 3); // byte 3 is a random seed
             } catch (Exception ex) {
                 ex.printStackTrace();
             }
          2. -
          3. Change one parameter at a time, and the run the sample again. Note the differences. Can you find out which of the values has which effect on the generated terrain?
            +
          4. Change one parameter at a time, and the run the sample again. Note the differences. Can you find out which of the values has which effect on the generated terrain (look at the javadoc also)?
            • Which value controls the size?
                @@ -497,15 +505,15 @@ try {
              • Which value controls the number of hills generated?
              • -
              • Which values control the minimum and maximum radius of the hills?
                +
              • Which values control the size and steepness of the hills?
                  -
                • What happens if the minimum is bigger than the maximum?
                  +
                • What happens if the min is bigger than or equal to max?
                • -
                +
              • What happens if both min and max are small values (e.g. 10/20)?
              • -
              • Which value controls the flattening of the hills?
                -
                  -
                • What happens if this value is 1 ?
                  +
                • What happens if both min and max are large values (e.g. 1000/1500)?
                  +
                • +
                • What happens if min and max are very close(e.g. 1000/1001, 20/21)? Very far apart (e.g. 10/1000)?
              • @@ -514,12 +522,16 @@ try {

          +You see the variety of hilly landscapes that can be generated using this method. +

          -Tip: For this exercise, you can keep using the splat Material from the sample code above. Just don't be surprised that the Material does not match the shape of the newly randomized landscape. If you want to generate real matching splat textures for randomized heightmaps, you need to write a custom method that, for example, creates an alphamap from the heightmap by replacing certain grayscales with certain RGB values. +

          +

          For this exercise, you can keep using the splat Material from the sample code above. Just don't be surprised that the Material does not match the shape of the newly randomized landscape. If you want to generate real matching splat textures for randomized heightmaps, you need to write a custom method that, for example, creates an alphamap from the heightmap by replacing certain grayscales with certain RGB values. +

          - +

          Exercise 3: Solid Terrains

          @@ -529,13 +541,13 @@ Can you combine what you learned here and in +

          Conclusion

          -You have learned how to create terrains that are more efficient as loading one giant model. You know how to create generate random or handmade heightmaps. You can add a LOD control to render large terrains faster. You are aware that you can combine what you learned about collison detection to make the terrain solid to a physical player. You are also able to texture a terrain "like a boss" using layered Materials and texture splatting. You are aware that the jMonkeyEngine SDK provides a TerrainEditor that helps with most of these manual tasks. +You have learned how to create terrains that are more efficient than loading one giant model. You know how to create generate random or handmade heightmaps. You can add a LOD control to render large terrains faster. You are aware that you can combine what you learned about collison detection to make the terrain solid to a physical player. You are also able to texture a terrain "like a boss" using layered Materials and texture splatting. You are aware that the jMonkeyEngine SDK provides a TerrainEditor that helps with most of these manual tasks.

          @@ -560,5 +572,5 @@ See also:

          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/1.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/1.gif new file mode 100644 index 000000000..e2f97aab0 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/1.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/2.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/2.gif new file mode 100644 index 000000000..96d619d50 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/2.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/3.1.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/3.1.gif new file mode 100644 index 000000000..d91744836 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/3.1.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/3.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/3.gif new file mode 100644 index 000000000..cffb99759 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/3.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/4.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/4.gif new file mode 100644 index 000000000..224207012 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/4.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/5.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/5.gif new file mode 100644 index 000000000..ebf57f48f Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/5.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/6.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/6.gif new file mode 100644 index 000000000..8c3f029b2 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/6.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/7.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/7.gif new file mode 100644 index 000000000..d4d352ebc Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/7.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/8.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/8.gif new file mode 100644 index 000000000..fb0f71db7 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/8.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-1.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-1.png index a6224accb..0a000cc7d 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-1.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-1.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-2.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-2.png index e4b6b3796..e89a9693b 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-2.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-2.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-3.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-3.png index e66880f13..d357b5a45 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-3.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-3.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-4.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-4.png index 33f8f9069..e30d88cd8 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-4.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender-material-4.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender.html index a9e2a75ea..2e0488d6d 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender.html @@ -1,13 +1,13 @@ -

          Creating jME3 models in Blender3D

          +

          Creating assets in Blender3D

          -This section discusses how to create and import models from Blender3D (2.62+, see bottom of page for Blender 2.49 and before) to jME3. +This section discusses how to create and import models from Blender3D (2.62+, see bottom of page for Blender 2.49 and before) to jME3. Furthermore it explains how you can create various typical game-related assets like normal maps of high-poly models and baked lighting maps.

          - +

          Asset Management

          @@ -16,8 +16,42 @@ For the managing of assets in general, be sure to read the -

          Creation Process

          + +

          Creating Models

          +
          + +

          +Game-compatible models are models that basically only consist of a mesh and UV-mapped textures, in some cases animations. All other material parameters or effects (like particles etc.) can not be expected to be transferred properly and probably would not translate to live rendering very well anyway. +

          + +

          +Note that BMeshes are not yet supported by the importers and exporters so please use the "legacy mesh format" for now in blender 2.63+ +

          + +
          + +

          UV Mapped Textures

          +
          + +

          +To successfully import a texture, the texture has to be UV-mapped to the model. Heres how to assign diffuse, normal and specular maps: +

          + +

          + + + + +

          + +

          +Its important to note that each used texture will create one separate geometry. So its best to either combine the UV maps or use a premade atlas with different texture types from the start and then map the uv coords of the models to the atlas instead of painting on the texture. This works best for large models like cities and space ships. + +

          + +
          + +

          Animations

          @@ -25,25 +59,37 @@ To export an animated model in Blender make sure the following conditions are me

            +
          1. The animation bas to be a bone animation
            +
          2. Apply Location, Rotation and Scate to the mesh on Blender: On 3D View editor on Blender, select the mesh in Object Mode and go to the 3D View Editor’s header → Object Menu → Apply → Location / Rotation / Scale.
          3. Apply Location, Rotation and Scate to the armature on Blender: On 3D View editor on Blender, select the armature in Object Mode and go to the 3D View Editor’s header → Object Menu → Apply → Location / Rotation / Scale.
          4. -
          5. Set the mesh’s origin point in the bottom of the mesh (see the images bellow).
            -
          6. -
          7. Set the armature’s origin point in the bottom of the armature (see the images bellow).
            +
          8. Set the mesh’s origin point in the bottom of the mesh (see the images below).
          9. -
          10. Armature’s origin point and mesh’s origin point must be in the same location(see the images bellow).
            +
          11. Set the armature’s origin point in the bottom of the armature (see the images below).
          12. -
          13. Use a root bone located in the armature’s origin. This root bone must be in vertical position (see the images bellow) and it is the root bone of the armature. If you rotate the root bone, the the entire armature might be rotate when you import the model into jMonkey (I’m just mentioning the result, I don’t know where is the problem (jmonkey importer or blender’s ogre exporter plugin)).
            +
          14. Armature’s origin point and mesh’s origin point must be in the same location(see the images below).
          15. -
          16. Uncheck “Bone Envelopes” checkbox on the Armature modifier for the mesh (see the images bellow).
            +
          17. Use a root bone located in the armature’s origin. This root bone must be in vertical position (see the images below) and it is the root bone of the armature. If you rotate the root bone, the the entire armature might be rotate when you import the model into jMonkey (I’m just mentioning the result, I don’t know where is the problem (jmonkey importer or blender’s ogre exporter plugin)).
          18. -
          19. Uncheck “Envelopes” checkbox on the armature (see the images bellow).
            +
          20. Uncheck “Bone Envelopes” checkbox on the Armature modifier for the mesh (see the images below).
          21. -
          22. Use SkeletonDebugger to show the skeleton on your game in order to check if the mesh and the skeleton are loaded correctly:
            +
          23. Uncheck “Envelopes” checkbox on the armature (see the images below).
          + +

          + + + + +

          + +

          +You can use SkeletonDebugger to show the skeleton on your game in order to check if the mesh and the skeleton are loaded correctly: + +

              final Material soldier2Mat = assetManager.loadMaterial("Materials/soldier2/soldier2.j3m");
               final Spatial soldier2 = assetManager.loadModel("Models/soldier2/soldier2.j3o");
               TangentBinormalGenerator.generate(soldier2);
          @@ -67,20 +113,9 @@ To export an animated model in Blender make sure the following conditions are me
           
           

          - - - -

          -

          - - - - -

          -

          Also check out these videos and resources: @@ -95,5 +130,343 @@ Also check out these videos and resources:

        - + +

        NormalMap baking

        +
        + +

        + +Models for live rendering should have a low polygon count. To increase the perceived detail of a model normal maps are commonly used in games. This tutorial will show how to create a normalmap from a highpoly version of your model that you can apply to a lowpoly version of the model in your game. +

        + +
        + +

        Blender modeling lowPoly & highPoly

        +
        + +

        + +If you use the multiresolution modifier you only need one object. Lets look at this example: +

        + +

        + +

        + +

        +Add a multiresolution modifier: +

        + +

        + +

        + +

        +There are two types of modifiers: Catmull-Clark and Simple. +- Simple is better for things like walls or floors. +- Catmull-Clark is better for objects like spheres. +

        + +

        +When using Catmull-Clark with a higher "subdivide" value (more than 3) its good to have the "preview" value above 0 and less than the subdivide level. This is because Catmull-Clark smoothes the vertices, so the normalMap is not so precise. +

        + +

        +Here is an example of Prewiew 1, it's more smooth than the original mesh: +

        + +

        + +

        + +

        +Enable "Sculpt Mode" in blender and design the highPoly version of your model like here: +

        + +

        + +

        + +

        +Now go into Render Tab, and bake a normalMap using same configuration as here: +

        + +

        + +

        Remember! The actual preview affects the baking output and mesh export! +

        +

        + +
        + +

        Fixing the normal colors in Blender

        +
        + +

        + +Blender has its own normal colors standard. We need to fix the colors to prepare the normalmap for using it with the JME Lighting Material. +

        + +

        +To do this, go to the Blender Node Window +

        + +

        +Here is Blender Node example. It fixes the normal colors: +

        + +

        + +

        + +

        +Here is the colors configuration: +

        + +

        + + + +

        + +

        +

        Sometimes it will be needed to change R and G scale and add some blur for better effect. Do it like on image below +

        +

        + +

        + +

        + +

        +After rendering, save the file to a destination you want and use it with the JME Lighting Material and the lowpoly version of the model. +

        + +

        + +

        + +
        + +

        LightMap baking

        +
        + +

        + +The goal of this tutorial is to explain briefly how to bake light map in blender with a separate set of texture coordinates and then export a model using this map in jME3. +

        + +
        + +

        Blender modeling + texturing

        +
        + +

        +create a mesh in blender and unwrap it to create uvs +

        + +

        + +

        + +

        +In the mesh tab you can see the sets of Uvs, it will create the first one.
        + +You can assign w/e texture on it, i used the built in checker of blender for the example.
        + +Then in this list, create a new one and click on the camera icon so that baking is made with this set. Name it LightUvMap.
        + +Then in the 3D view in edit mode select all your mesh vertice and hit 'U'/LightMap pack then ok it will unfold the mesh for light map.
        + +Then create a new image, go to the render tab an all at the end check the "Bake" section and select shadows. Then click bake.
        + +If all went ok it will create a light map like this.
        + + +

        + +

        +Then go to the material tab, create a new one for your model and go to the Texture Tab.
        + +Create 2 textures one for the color map, and one for the light map.
        + +In the Mapping section be sure to select coordinates : UV and select the good set of coordinates.
        + + +

        + +

        + +then the light map
        + + +

        + +
        + +

        Importing the model in the SDK and creating the appropriate material

        +
        + +

        +Once this is done, export your model with the ogre exporter, and turn it into J3o with the SDK.
        + +Create material for it using the lighting definition.
        + +Add the colorMap in the diffuse map slot and the lightMap in the light map slot.
        + +Make sure you check "SeparateTexCoords"
        + + +

        + +

        +It should roughly result in something like that :
        + + +

        + +

        +The blend file, the ogre xml files and the textures can be found in the download section of the google code repo
        + + +

        + +
        + +

        SkyBox baking

        +
        + +

        +There are several ways to create static images to use for a sky in your game. This will describe the concepts used in blender and create an ugly sky :-) Check the links below for other ways and prettier skies. +

        + +

        +A sky box is a texture mapped cube, it can also, loosely, be called en EnvMap or a CubeMap. The camera is inside the cube and the clever thing that jME does is to draw the sky so it is always behind whatever else is in your scene. Imagine the monkey is the camera in the picture. +

        + +

        + +

        + +

        +But a real sky is not a box around our heads, it is more like a sphere. So if we put any old image in the sky it will look strange and might even look like a box. This is not what we want. The trick is to distort the image so that it will look like a sphere even if it in fact is a picture pasted on a box. Luckily blender can do that tricky distortion for us. +

        + +

        +The screenshots are from Blender 2.63 but the equivalent operations have been in blender for years so with minor tweaks should work for almost any version. +

        + +

        +So let's get started, fire up blender and you'll see something like this. +

        + +

        + +

        + +

        +The cube in the start scene is perfect for us. What we'll do is have Blender render the scene onto that cube. The resulting image is what we'll use for our sky box. So our jME sky will look like we stood inside the blender box and looked out on the scene in blender. +

        + +

        +Start by selecting the box and set its material to shadeless. +

        + +

        + +

        + +

        +Now we will create a texture for the box. Make sure the texture is an Environment Map, that the Viewpoint Object is set to the cube. The resolution is how large the resulting image will be. More pixels makes the sky look better but comes at the cost of texture memory. You'll have to trim the resolution to what works in your application. +

        + +

        + +

        + +

        +Next up is the fun part, create the sky scene in blender. You can do whatever fits your application, include models for a city landscape, set up a texture mapped sphere in blender with a nice photographed sky, whatever you can think will make a good sky. +I am not so creative so I created this scene: +

        + +

        + +

        + +

        +Now render the scene (press F12). It doesn't actually matter where the camera is in blender but you might see something similar to this: +

        + +

        + +

        + +

        +You can see that Blender has actually drawn the scene onto the cube. This is exactly what we want. Now to save the image. +

        + +

        +Select the texture of the cube and select save environment map. +

        + +

        + +

        + +

        +That is it for Blender. Open the saved image in some image editor (I use the Gimp from here). +

        The SDK also contains an image editor, right-click the image and select "edit image" to open it. +

        +You will notice that Blender has taken the 6 sides of the cube and pasted together into one image (3x2). So now we need to cut it up again into 6 separate images. In gimp I usually set the guides to where I want to cut and then go into Filters→Web→Slice and let gimp cut it up for me. +

        + +

        + +

        + +

        +Next up is to move the image files into your assets directory and create the sky in jME. You can do that in the Scene Composer by right clicking the scene node, select Add Spatial and then select Skybox. +If you want to do it from code, here is an example: +

        +
        public void simpleInitApp() {
        + 
        +    Texture westTex = assetManager.loadTexture("Textures/west.png");
        +    Texture eastTex = assetManager.loadTexture("Textures/east.png");
        +    Texture northTex = assetManager.loadTexture("Textures/north.png");
        +    Texture southTex = assetManager.loadTexture("Textures/south.png");
        +    Texture upTex = assetManager.loadTexture("Textures/top.png");
        +    Texture downTex = assetManager.loadTexture("Textures/bottom.png");
        + 
        +    final Vector3f normalScale = new Vector3f(-1, 1, 1);
        +    Spatial skySpatial = SkyFactory.createSky(
        +                        assetManager,
        +                        westTex,
        +                        eastTex,
        +                        northTex,
        +                        southTex,
        +                        upTex,
        +                        downTex,
        +                        normalScale);
        +    rootNode.attachChild(skySpatial);
        +}
        + +

        +

        This example uses a strange normalScale, this is to flip the image on the X-axis and might not be needed in your case. Hint: the texture is applied on the outside of the cube but we are inside so what do we see? +

        + +

        + +
        + +

        Further reading

        +
        +
          +
        • +
        • +
        • +
        • +
        + +
        +

        view online version

        \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_bones.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_bones.png index 617454726..8040bc887 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_bones.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_bones.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_mesh.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_mesh.png index c063a8d1b..285d40c30 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_mesh.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_apply_mesh.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_envelopes.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_envelopes.png index eee1b7aaf..4f8ecfa50 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_envelopes.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_envelopes.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_finished.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_finished.png index 006f4cb21..95da95bf5 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_finished.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_finished.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_rootbone.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_rootbone.png index 9bb251d2a..5fa522745 100644 Binary files a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_rootbone.png and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/blender_rootbone.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/exception2.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/exception2.gif new file mode 100644 index 000000000..33ae2834b Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/exception2.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/post-slice.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/post-slice.png new file mode 100644 index 000000000..8b531700b Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/post-slice.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/ready_normal.gif b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/ready_normal.gif new file mode 100644 index 000000000..bacec1605 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/ready_normal.gif differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/render.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/render.png new file mode 100644 index 000000000..9430652a2 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/render.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/saveenvmap.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/saveenvmap.png new file mode 100644 index 000000000..a7436867a Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/saveenvmap.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/scene.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/scene.png new file mode 100644 index 000000000..03fac4a57 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/scene.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/shadeless.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/shadeless.png new file mode 100644 index 000000000..a282df212 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/shadeless.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/skybox-concept.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/skybox-concept.png new file mode 100644 index 000000000..c51e5e4f5 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/skybox-concept.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/start-screen2.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/start-screen2.png new file mode 100644 index 000000000..eeadda404 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/start-screen2.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/texture.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/texture.png new file mode 100644 index 000000000..dce99a568 Binary files /dev/null and b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/texture.png differ diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/faq.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/faq.html index eebc1c900..2c5df4dd7 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/faq.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/faq.html @@ -161,15 +161,16 @@ this.assetManager.registerLocator("town.zip", ZipLocator.class)

        Follow our best practices for the multi-media asset pipeline.
        -You create 3-D models in a 3-D mesh editor, for example Blender, and export it in Ogre Mesh XML or Wavefront OBJ format. +You create 3-D models in a 3-D mesh editor, for example Blender, and export it in Ogre Mesh XML (animated objects, scenes) or Wavefront OBJ format (static objects, scenes). You create textures in a graphic editor, for exmaple Gimp, and export them as PNG or JPG. You create sounds in an audio editor, for example, Audacity, and export them as WAVE or OGG.
        -Learn more: 3D Models, , , , Multi-Media Asset Pipeline. +Learn more: 3D Models, Multi-Media Asset Pipeline, JME3's blend-to-j3o importer;
        +, , , .

        - +

        How do I load a 3-D model into the scene?

        @@ -189,7 +190,7 @@ Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.j3o"

        - +

        How do initialize the scene?

        @@ -200,12 +201,12 @@ Use the simpleInitApp() method in SimpleApplication (or initApp() in Application

        - +

        I want to transform objects in the scene

        - +

        How do I move or turn or resize a spatial?

        @@ -221,7 +222,7 @@ To move or turn or resize a spatial you use transformations. You can concatenate

        - +

        How do I make a spatial move by itself?

        @@ -234,7 +235,7 @@ Change the geometry's translation (position) live in the update loop using

        - +

        How do I access a named sub-mesh in Model?

        Geometry result = spatial.getName().startsWith(name);
        @@ -245,7 +246,7 @@ Change the geometry's translation (position) live in the update loop using

        - +

        How do I make procedural or custom shapes?

        @@ -256,12 +257,12 @@ You can programmatically create com.jme3.scene.Mesh'es.

        - +

        I want to change the surface of objects in the scene

        - +

        Why is my UV wrapping / texture appearance all wrong?

        @@ -279,7 +280,7 @@ You can set the boolean value in the constructor of TextureKey to flipped or not
          material.setTexture("ColorMap", this.assetManager.loadTexture(new TextureKey("myTexture.jpg", false)));
        - +

        How do I scale, mirror, or wrap a texture?

        @@ -297,7 +298,7 @@ You can choose among various com.jme3.texture.Texture.WrapModes for
        material.getTextureParam("DiffuseMap").getTextureValue().setWrap(WrapMode.Repeat);
        - +

        How do I change color or shininess of an material?

        @@ -310,7 +311,7 @@ Use the AssetManager to load Materials, and change material settings.

        - +

        How do I make a surface wood, stone, metal, etc?

        @@ -323,7 +324,7 @@ Create Textures as image files. Use the AssetManager to load a Material and use

        - +

        Why are materials too bright, too dark, or flickering?

        @@ -332,7 +333,7 @@ If you use a lit material (based on Lighting.j3md) then you must attach a light

        - +

        How do I make geometries cast a shadow?

        @@ -345,7 +346,7 @@ Use com.jme3.shadow.BasicShadowRenderer together with com.jme3.light.Directional

        - +

        How do I make materials transparent?

        @@ -361,7 +362,7 @@ Assign a texture with an alpha channel to a Material and set the Material's

        - +

        How do I force or disable backface culling?

        @@ -372,7 +373,7 @@ You can switch the com.jme3.material.RenderState.FaceCullMode to Back, Front, Fr
        material.getAdditionalRenderState().setFaceCullMode(FaceCullMode.FrontAndBack);
        - +

        Can I draw only an outline of the scene?

        @@ -388,12 +389,12 @@ Create a material and switch its renders state to wireframe.

        - +

        I want to control the camera

        - +

        How do I switch between third-person and first-person view ?

        @@ -415,18 +416,18 @@ chaseCam = new ChaseCamera(cam, spatial, inputManager);
        - +

        How do I increase camera speed?

        flyCam.setMoveSpeed(50f);
        - +

        Actions, Interactions, Physics

        - +

        How do I implement game logic / game mechanics?

        @@ -437,7 +438,7 @@ Use Controls to define the behaviour of types of Spatials. Use Application State

        - +

        How do I let players interact via keyboard?

        @@ -448,7 +449,7 @@ Use com.jme3.input.KeyInput and a Input Listener.

        - +

        How do I let players interact by clicking?

        @@ -461,7 +462,7 @@ Players typically click the mouse to pick up objects, to open doors, to shoot a

        - +

        How do I animate characters?

        @@ -474,7 +475,7 @@ Create an animated OgreMesh model with bones in a 3-D mesh editor (e.g. Blender)

        - +

        How do I keep players from falling through walls and floors?

        @@ -485,7 +486,7 @@ Use collision detection. The most common solution is to use jme's physics i

        - +

        How do I make balls/wheels/etc bounce and roll?

        @@ -498,7 +499,7 @@ Add physics controls to Spatials and give them spherical or cylindrical bounding

        - +

        How do I debug weird Physics behaviour?

        @@ -508,7 +509,7 @@ Maybe your collision shapes overlap – or they are not where you think they are
        bulletAppState.getPhysicsSpace().enableDebug(assetManager);
        - +

        How do I make a walking character?

        @@ -521,7 +522,7 @@ Code samples: +

        How do I steer vehicles?

        @@ -534,7 +535,7 @@ Code samples: +

        Can objects swing like a pendulums, chains, ropebridges?

        @@ -546,12 +547,12 @@ Use a PhysicsControl's hinges and joints.

        - +

        Default GUI Display

        - +

        What are these FPS/Objects/Vertices/Triangles statistics?

        @@ -563,7 +564,7 @@ At the bottom left of every default SimpleGame, you see the +

        How do I get rid of the FPS/Objects statistics?

        @@ -582,7 +583,7 @@ setDisplayStatView(false); // to hide the statistics

        - +

        How do I display score, health, mini-maps, status icons?

        @@ -595,7 +596,7 @@ Attach text and pictures to the orthogonal guiNode to create a head

        - +

        How do I display buttons and UI controls?

        @@ -608,7 +609,7 @@ Sample Code: +

        How do i display a loading screen?

        @@ -619,12 +620,12 @@ Instead of having a frozen frame while your games loads, you can have a loading

        - +

        Nifty GUI

        - +

        I get NoSuchElementException when adding controls (buttons etc)!

        @@ -635,7 +636,7 @@ Verify that you include a controls definition file link in your +

        Where can I find example code of Nifty GUI's XML and Java classes?

        @@ -644,7 +645,7 @@ Verify that you include a controls definition file link in your +

        Is there Java Doc for Nifty GUI?

        @@ -653,12 +654,12 @@ Verify that you include a controls definition file link in your +

        I want to create an environment with sounds, effects, and landscapes

        - +

        How do I play sounds and noises?

        @@ -671,7 +672,7 @@ Use AudioRenderer, Listener, and AudioNode from com.jme3.audio.*.

        - +

        How do I make fire, smoke, explosions, swarms, magic spells?

        @@ -684,7 +685,7 @@ For swarm like effects you use particle emitters.

        - +

        How do I make water, waves, reflections?

        @@ -697,7 +698,7 @@ Use a special post-processor renderer from com.jme3.water.*.

        - +

        How do I make fog, bloom, blur, light scrattering?

        @@ -708,7 +709,7 @@ Use special post-processor renderers from com.jme3.post.*.

        - +

        How do I generate a terrain?

        @@ -721,7 +722,7 @@ Use com.jme3.terrain.*. The JMonkeyEngine also provides you with a Terrain Edito

        - +

        How do I make a sky?

        @@ -739,12 +740,12 @@ skyGeo.setQueueBucket(Bucket.Sky)

        - +

        I want to access to back-end properties

        - +

        How do I read out graphic card capabilities?

        @@ -801,7 +802,7 @@ FloatColorBuffer, FloatDepthBuffer, PackedFloatTexture, SharedExponentTexture, P TextureCompressionLATC, NonPowerOfTwoTextures, MeshInstancing]
        - +

        How do I optimize the heck out of the Scene Graph?

        @@ -818,7 +819,7 @@ Batching means that all Geometries with the same Material are combined into one

        - +

        How do I prevent users from unzipping my JAR?

        @@ -828,12 +829,12 @@ Add an - +

        I want to do maths

        - +

        What does addLocal() / multLocal() etc mean?

        @@ -886,7 +887,7 @@ Many maths functions (mult(), add(), subtract(), etc) come as local and a non-lo
        - +

        What is the difference between World and Local coordinates?

        @@ -896,7 +897,7 @@ World coordinates of a Spatial are its absolute coordinates in the 3D scene (thi

        - +

        How do I convert Degrees to Radians?

        @@ -910,5 +911,5 @@ Multiply degree value by FastMath.DEG_TO_RAD to convert it to radians.
        - +

        view online version

        \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/best_practices.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/best_practices.html index 3b9590339..f374c36f3 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/best_practices.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/best_practices.html @@ -91,39 +91,46 @@ E.g. models, terrains; materials, textures; noises, music, voices; video, cutsce Use an to outline what features you want and what components are needed.

          -
        1. Pre-Alpha
          +
        2. Pre-Alpha Development
          • Artwork: Test asset loading and saving with mock-ups and stock art.
          • Lay out the overall application flow, i.e. switching between intro / options / game screen, etc.
          • -
          • Get one typical level working. E.g. if the game is a "Jump'n'Run", jumping and running must work before you can announce Alpha.
            +
          • Get one typical level working before you can announce the Alpha Release.
            +E.g. if the game is a "Jump'n'Run", jumping and running must work.
        3. Alpha Release
          +
        4. +
        5. Pre-Beta Development
          • Artwork: Replace all mock-ups with first drafts of real media and level maps.
          • -
          • Run alpha tests, track bugs, debug, optimize.
            +
          • Have your team members review and "alpha test" it on various systems, track bugs, debug, optimize.
          • -
          • Declare before you announce Beta. This prevents a bottomless pit of new bugs.
            +
          • Declare before you announce the Beta Release to prevent a bottomless pit of new bugs.
        6. Beta Release
          +
        7. +
        8. Post-Beta Development
          • Artwork: Fill in the final media and level maps.
          • -
          • Have external people review and "beta test" it (track bugs).
            +
          • Have external people review and "beta test" it, make it easy to report bugs.
          • -
          • Even out the kinks in code and gameplay – don't add any more new features.
            +
          • Fix high-priority bugs, even out the kinks in code and gameplay, don't add new features for now!
        9. -
        10. Gamma, Delta = Release Candidates
          +
        11. Gamma Release, Delta Release… = Release Candidates
            -
          • Test the heck out of it. Last chance to find a horrible bug.
            +
          • Think you're done? Make test runs incl. packaging and distribution. (Order form? download?)
            +
          • +
          • Test the heck out of it. Last chance to find and fix a horrible bug.
        12. @@ -137,7 +144,7 @@ How you name or number these stages is fully up to your team. Development teams

          - +

          Use File Version Control

          @@ -156,7 +163,7 @@ If you don't know which to choose, Subversion is a good choice for starters
          - +

          Multi-Media Asset Pipeline

          @@ -182,14 +189,14 @@ If you don't know which to choose, Subversion is a good choice for starters
          Convert Models to j3o format. Move j3o files into assets/Models. Don't reference Blender/Ogre/OBJ files in your load() code, because these unoptimized files are not packaged into the JAR.
          - +

          Learn details about the Multi-Media Asset Pipeline here.

          - +

          Development Phase

          @@ -201,7 +208,7 @@ Even for large experienced game producers, the creation of such a complex game i

          - +

          Extend SimpleApplication

          @@ -220,7 +227,7 @@ For your future game releases, you will want to rely on your own base framework:

          - +

          Where to Start?

          @@ -229,26 +236,26 @@ For your future game releases, you will want to rely on your own base framework: You have a list of features that you want in game, but which one do you implement first? You will keep adding features to a project that grows more and more complex, how can you minimize the amount of rewriting required?

            -
          1. Make sure the game's high-level frame (screen switching, networking, loading/saving) is sound and solid.
            +
          2. Make sure the game's high-level frame (screen switching, network sync, loading/saving) is sound and solid.
          3. -
          4. Start with implementing the most complex game feature first – the one that imposes most constraints on the structure of your project (for example: networking or physics.)
            +
          5. Start with implementing the most complex game feature first – the one that imposes most constraints on the structure of your project (for example: multi-player networking, or physics.)
          6. -
          7. Add only one larger feature at a time. If there are complex interactions (such as "networking + physics"), start with a small test case ("one cube") and work your way up, don't start with a whole scene.
            +
          8. Add only one larger feature at a time. If there are complex interactions (such as "networking + physics"), start with a small test case ("one shared cube") and work your way up. Starting with a whole scene introduces too many extra soruces of error.
          9. Implement low-complexity decorations (audio and visual effects) last.
          10. -
          11. Test for side-effects on existing code after you add a feature.
            +
          12. Test for side-effects on existing code after you add a new feature (regression test).

          -

          Acknowledge whether you want a feature because it is necessary for gameplay, or simply because "everyone else has it". Your goal should be to bring out the essence of your game idea. Don't water down gameplay but attempting to make it "do everything, but better". Successful high-performance games are the ones where someone made smart decisions what to keep and what to drop. +

          Acknowledge whether you want a feature because it is necessary for gameplay, or simply because "everyone else has it". Your goal should be to bring out the essence of your game idea. Don't water down gameplay by attempting to make it "do everything, but better". Successful high-performance games are the ones where someone made smart decisions what to keep and what to drop.

          - +

          The Smart Way to Add Custom Methods and Fields

          @@ -272,28 +279,25 @@ Game entities (Nodes and Geometrys) often carry custom
          - +

          The Smart Way to Access Game Features

          -SimpleApplication gives you access to game features such as a the rootNode, assetManager, guiNode, inputManager, audioManager, physicsSpace, viewPort, and the camera. But what if you need access to the assetManager or rootNode etc from another class? Don't pass around lots of object references in constructors. This is a sign that this class should be designed as an AppState (read details there). -

          - -

          -An AppState has access to all game features in the SimpleApplication via the this.app and this.stateManager objects. +SimpleApplication gives you access to game features such as a the rootNode, assetManager, guiNode, inputManager, audioManager, physicsSpace, viewPort, and the camera. But what if you need this access also from another class? Don't extend SimpleApplication a second time, and don't pass around tons of object references in constructors! Needing access to application level objects is a sign that this class should be designed as an AppState (read details there).

          -Examples: +An AppState has access to all game features in the SimpleApplication via the this.app and this.stateManager objects. Examples:

          Spatial sky = SkyFactory.createSky(this.app.getAssetManager(), "sky.dds", false);
          +...
           this.app.getRootNode().attachChild( sky );
          - +

          The Smart Way to Implement Game Logic

          @@ -355,38 +359,38 @@ Read all about +

          Optimize Application Performance

            -
          • Optimization – how to avoid wasting cycles
            +
          • Optimization – How to avoid wasting cycles
          • -
          • Multithreading – use concurrency, and don't change the scene graph from outside the update loop.
            +
          • Multithreading – Use concurrency for long-running backgroudn tasks, but don't manipulate the scene graph from outside the main thread (update loop)!
          • You can add a Java Profiler to the jMonkeyEngine SDK via Tools → Plugins → Available. The profiler presents statistics on the lifecycle of methods and objects. Performance problems may be caused by just a few methods that take long, or are called too often (try to cache values to avoid this). If object creation and garbage collection counts keep increasing, you are looking at a memory leak.
          - +

          Don't Mess With Geometric State

          -These tips are especially for users who already know jME2. Automatic handling of the Geometric State has improved in jME3, and it is now a best practice to not mess with it. +These tips are especially important for users who already know jME2. Automatic handling of the Geometric State has improved in jME3, and it is now a best practice to not mess with it.

            -
          • Do not call updateGeometricState() on anything but the root node!
            +
          • Do not call updateGeometricState() on anything but the root node!
          • -
          • Do not override or mess with updateGeometricState() at all.
            +
          • Do not override or mess with updateGeometricState() at all.
          • -
          • Do not use getLocalTranslation().set() to move a spatial, always use setLocalTranslation().
            +
          • Do not use getLocalTranslation().set() to move a spatial in jME3, always use setLocalTranslation().
          - +

          Maintain Internal Documentation

          @@ -397,7 +401,7 @@ It's unlikely you will fully document every class you write, we he
          • What is this? How does it solve its task (input, algorithm used, output, side-effects)?
          • -
          • Write down limits (e.g. min/max values) and defaults while you still remember.
            +
          • Write down implicit limits (e.g. min/max values) and defaults while you still remember.
          • In which situation do I want to use this, is this part of a larger process? Is this step required, or what are the alternatives?
          • @@ -409,13 +413,13 @@ Treat javadoc as messages to your future self. "genNextVal() generates the

          - +

          Debugging and Test Phase

          -A Java Debugger is included in the jMonkeyEngine SDK. It allows you to set a break point in your code near the point where an exception happens. Then you step through the execution line by line and watch object and variable states to detect where the bug starts. +A Java Debugger is included in the jMonkeyEngine SDK. It allows you to set a break point in your code near the line of code where an exception happens. Then you step through the execution line by line and watch object and variable states live, to detect where the bug starts.

          @@ -423,7 +427,7 @@ Treat javadoc as messages to your future self. "genNextVal() generates the

          -Unit Testing () has a different status in 3D graphics development than in other types of software. You cannot write assertions that automatically test whether the rendered image looks correct, or whether interactions are intuitive. Still you should create simple test cases for individual game features such as loaders, content generators, effects. Run the test cases now and then to see whether they still work as intended – or whether they are suffering from side-effects. Keep the test classes in a test directory in the project, don't include them in the distribution. +Unit Testing () has a different status in 3D graphics development than in other types of software. You cannot write assertions that automatically test whether the rendered image looks correct, or whether interactions are intuitive. Still you should create simple test cases for individual game features such as loaders, content generators, effects. Run the test cases now and then to see whether they still work as intended – or whether they are suffering from regressions or side-effects. Keep the test classes in the test directory of your project, don't include them in the distribution.

          @@ -431,20 +435,20 @@ Treat javadoc as messages to your future self. "genNextVal() generates the

          -Alpha and Beta Testing means that you ask someone to try to install and run your game. It should be a real user situation, where they are left to figure the gameplay out by themselves (you only can include the usual read-me and help docs). Provide the testers with an easy method to report back problems, or why they gave up. Evaluate whether these problems are exceptions or must be fixed for the game to be playable. +Alpha and Beta Testing means that you ask someone to try to install and run your game. It should be a real user situation, where they are left to figure out the installation and gameplay by themselves–you only can include the usual read-me and help docs. Provide the testers with an easy method to report back what problems they encountered, what they liked best, or why they gave up. Evaluate whether reported problems are one-off glitches, or whether they must be fixed for the game to be playable for everyone.

          - +

          Release Phase

          - +

          Pre-Release To-Do List

            -
          • Prepare a web page, advertise, etc
            +
          • Prepare a web page, a cool slogan, advertisements, etc
          • Verify that all assets are up-to-date and converted to .j3o.
          • @@ -454,28 +458,28 @@ Treat javadoc as messages to your future self. "genNextVal() generates the
          • Switch off fine logging output.
          • -
          • Prepare promotional art: Cool screenshots (in thumbnail, square, vertical, horizontal, and fullscreen formats) and video clips. Include name, contact info, slogan, etc., so future customers can find you.
            +
          • Prepare promotional art: The most awesome screenshots (in thumbnail, square, vertical, horizontal, and fullscreen formats) and video clips. Include name, contact info, slogan, etc., so future customers can find you.
          • Prepare a readme.txt file, or installation guide, or handbook – if applicable.
          • -
          • Get a certificate if it is required for your distribution method (see below).
            +
          • Get a certificate if one is required for your distribution method (see below).
          • -
          • Specify a classification rating.
            +
          • Specify a (needed for e.g. app stores).
          - +

          Distributing the Executables

          -The jMonkeyEngine SDK helps you with deployment: You specify your branding and deployment options in the Project Properties dialog, and then choose Clean and Build from the context menu. If you use another IDE, then consult the IDE's documentation. +The jMonkeyEngine SDK helps you with deployment: You specify your branding and deployment options in the Project Properties dialog, and then choose Clean and Build from the context menu. If you use another IDE, consult this IDE's documentation.

          -Decide whether you want to release your game as WebStart, Desktop JAR, or Applet – Each has its pros and cons. +Decide whether you want to release your game as WebStart, desktop JAR, mobile APK, or browser Applet – Each has its pros and cons.

          @@ -503,7 +507,7 @@ Decide whether you want to release your game as WebStart, Desktop JAR, or Applet (.APK)
          Game runs on Android devices.Android devices do not support post-procesor effects.
          - +

          Which ever method you choose, a Java-Application works on the main operating systems: Windows, Mac OS, Linux, Android. @@ -515,5 +519,5 @@ The distribution appears in a newly generated dist directory inside

          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/how_to_use_materials.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/how_to_use_materials.html index 6abb26463..2cd9a979e 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/how_to_use_materials.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/how_to_use_materials.html @@ -26,7 +26,7 @@ You want to make the most of your 3D models by specifying good looking material

          -If you want more advanced background info: You can learn more about Material Definitions in general here. You can find the full list of Material Parameters in the Material Definitions Properties overview. The following sections introduce you to the most commonly used cases. You typically initialize Material objects in the initSimpleApp() method, and configure them using the setters described here. Then load the Materials using myGeometry.setMaterial(mat). +If you want more advanced background info: You can learn more about Material Definitions in general here. You can find the full list of Material Parameters in the Material Definitions Properties overview. The following sections introduce you to the most commonly used cases. You typically initialize Material objects in the simpleInitApp() method, and configure them using the setters described here. Then load the Materials using myGeometry.setMaterial(mat).

          @@ -230,7 +230,7 @@ viewPort.addProcessor(fpp);
        13. Specify a Glow color.
          -A ColorRGBA value of your choice, e.g. choose a warm or cold color for different effects, or white for a neutral glow.
          mat.setColor("Glow",ColorRGBA.White);
          +A ColorRGBA value of your choice, e.g. choose a warm or cold color for different effects, or white for a neutral glow.
          mat.setColor("GlowColor",ColorRGBA.White);
        14. (Optional) Specify a GlowMap texture.
          @@ -244,7 +244,7 @@ This texture outlines in detail where the DiffuseMap texture glows. If you don&# To deactivate glow:

            -
          • Set the Glow color to ColorRGBA.Black.
            mat.setFloat("Glow", ColorRGBA.Black);
            +
          • Set the Glow color to ColorRGBA.Black.
            mat.setColor("GlowColor", ColorRGBA.Black);
          @@ -255,7 +255,7 @@ Learn more about +

          (Optional) Transparent

          @@ -293,12 +293,13 @@ To make a Geometry transparent or translucent:
        15. Specify BlendMode Alpha for the Material.
          mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
        16. -
        17. Put the Geometry (not the Material!) in the appropriate render queue
          +
        18. Put the Geometry (not the Material!) in the appropriate render queue bucket.
          +Objects in the translucent bucket (e.g. particles) are not affected by SceneProcessors (e.g. shadows). Obejcts in the transparent bucket (e.g. foliage) are affected by SceneProcessors (e.g. shadows).
            -
          • geo.setQueueBucket(Bucket.Translucent);
            +
          • geo.setQueueBucket(Bucket.Translucent); 
          • -
          • geo.setQueueBucket(Bucket.Transparent);
            +
          • geo.setQueueBucket(Bucket.Transparent); 
          @@ -325,7 +326,7 @@ getAdditionalRenderState().setAlphaFallOff(0.5f);Enables Alpha Testing Deactivate Alpha Testing for gradually translucent objects, such as colored glass, smoked glass, ghosts. - +

          It is possible to load a DiffuseMap texture that has an Alpha channel, and combine it with an underlying Material Color. @@ -338,7 +339,7 @@ Deactivate Alpha Testing for gradually translucent objects, suc

          - +

          (Optional) Wireframe

          @@ -355,7 +356,7 @@ Additionally to the above settings, you can switch off and on a wireframe render getAdditionalRenderState().setWireframe(true);Switch to showing the (textured) Material in wireframe mode. The wireframe optionally uses the Material's Color value.Use wireframes to debug meshes, or for a "matrix" or "holodeck" effect.
          -
          +
          material, texture, effect, @@ -365,5 +366,5 @@ Additionally to the above settings, you can switch off and on a wireframe render
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/optimization.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/optimization.html index 5e99f434e..82207e01a 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/optimization.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/intermediate/optimization.html @@ -14,7 +14,7 @@ This page is intended as a reference collection of optimization tricks that can

          The more Geometry objects are added to the scene, the harder it gets to handle them in a speedy fashion. -The reason for this is, that for every object a render command must be done, here is a bottleneck between the CPU and the graphics card. +The reason for this is that a render command must be done for every object, potentially creating a bottleneck between the CPU and the graphics card.

          @@ -32,80 +32,65 @@ You can optimize nodes using the SceneComposer in the Texture Atlas provides limited individual texturing of batched geometries.

        19. - +

          Avoid creating new objects

          -When you use math operations like vectorA.mult(vectorB); new objects are created that have to be garbage collected when you don't use them anymore. Check your math operations for opportunities to use the local version of the math operations, e.g. vectorA.multLocal(vectorB). This way the result is stored in vectorA and no new object needs to be created. +When you use math operations like vectorA.mult(vectorB);, they create new objects for the result. These objects have to be garbage collected when you don't use them anymore. +

          + +

          +Check your math operations for opportunities to use the local version of the math operations, e.g. vectorA.multLocal(vectorB). Local methods store the result in vectorA and do not create a new object. Use local methods if you do not need to keep the previous vectorA.

          - +

          Avoid large objects in physics

          -To offload much computation to the less CPU intense physics broadphase collision check, avoid having large meshes that cover e.g. the whole map of your level. Instead separate the collision shapes into multiple smaller parts. Obviously this can also be overdone as excessive amounts of physics objects can bring other performance problems. +To offload much computation to the less CPU intense physics broadphase collision check, avoid having large meshes that cover e.g. the whole map of your level. Instead, separate the collision shapes into multiple smaller chunks. Obviously, don't exaggerate the chunking, because having excessive amounts of physics objects similarly cause performance problems.

          - +

          Check the Statistics

          -SimpleApplication displays a HUD with statistics. Use app.setDisplayStatView(true); to activate it, and false to deactivate it. -It counts how many FrameBuffers, Textures, or Shaders… + +SimpleApplication displays a HUD with statistics. Use app.setDisplayStatView(true); to activate it, and false to deactivate it. +The StatsView counts Objects,Uniforms,Triangles,Vertices are in the scene, and it counts how many FrameBuffers, Textures, or Shaders:

          • … were switched in the last frame (S)
          • … were used during the last frame (F)
          • -
          • … exist in memory (M)
            +
          • … exist in OpenGL memory (M)

          -Example: + +For example, Textures (M) tells you how many textures are currently in OpenGL memory.

          -
            -
          • Textures (M) = how many textures are currently in the OpenGL driver
            -
          • -
          • Textures(F) = how many textures were used in the last frame
            -
          • -
          • Textures(S) = how many texture switches were done in the last frame.
            -
          • -

          -Genereally jME3 is well optimized and optimizes these things correctly. The normal state is that the (S/F/M) values should be in the same order of magnitude; (S) values can be lower than (F). +Generally jME3 is well optimized and optimizes these things correctly. Read statsview to learn the details about how to interpret the statistics, how to tell whether your values are off, or whether they point out a problem.

          -
            -
          • If the (S) values are significantly higher than the (F) values, that means there are a lot of extra switches happening which can cause a performance loss. Switches happen for instance if you have many transparent materials in your scene. In that case this tells you that you should use fewer transparent materials.
            -
          • -
          • If the (M) values are much higher than the (F) values, that means a lot more GL objects are in memory than are actually used. This can happen in rare cases, such as extremely large scenes (> 2000 wu) with lots of spatials or lots of different materials. In this case, you should can optimize performance by identifying spatials to cull or detach.
            -
          • -
          • The Object Count (Batch Count) is a very important value that indicates how many geometries were rendered in the last frame. In general, try to keep the object count around 100-200 to keep your game fast and responsive. If the count is permanently higher, hand-code rules that detach remote objects, or optimize a complex multi-material scene using:
            GeometryBatchFactory.optimize(complexNode, true);
            -
            -
          • -
          • Same for Triangle Counts. If your game runs sluggishly and triangle (polygon) count is high, then you are rendering too many too detailed meshes. Tell your graphic designers to create models with lower polygon counts.
            -
          • -
          • FrameBuffers: If you don't use any post-processing effects (FilterPostProcessor), this count should be zero. The more effects you use, the more FrameBuffers are in use. If this value is high while others are normal, you can speed up the application by using fewer post-processing effects.
            -
          • -
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/application_deployment.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/application_deployment.html index f9abb24d2..bc009c810 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/application_deployment.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/application_deployment.html @@ -187,7 +187,7 @@ A browser Applet is a Java application that runs in the web browser while the us

          -These instrcutions assume that you have already written a game that you want to turn into an Applet. As opposed to other jME3 games, Applets cannot capture the mouse for navigation, so the camera will be switched to dragToRotate mode. The jMonkeyEngine SDK and the included build script already contain what you need. +These instructions assume that you have already written a game that you want to turn into an Applet. As opposed to other jME3 games, Applets cannot capture the mouse for navigation, so the camera will be switched to dragToRotate mode. The jMonkeyEngine SDK and the included build script already contain what you need.

          diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/blender.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/blender.html index debbc7a4c..93234ce7e 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/blender.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/blender.html @@ -16,8 +16,13 @@ It was important to have always the lates version of the script that is compatib Now we have an opportunity to simplify the import process by loading data directly from blender binary files: *.blend.

          +

          +

          Before you try to import models, make sure you created them properly. +

          +

          + - +

          Usage

          @@ -27,7 +32,7 @@ By default a BlenderModelLoader is registered with your assetManager to load ble

          - +

          Currently supported features

            @@ -43,6 +48,8 @@ By default a BlenderModelLoader is registered with your assetManager to load ble
          1. User defined UV coordinates are read.
          2. +
          3. Loading BMesh is supported.
            +
          4. Loading textures.
            @@ -73,6 +80,8 @@ By default a BlenderModelLoader is registered with your assetManager to load ble
          5. Generated textures are 'baked' into 2D textures and merged to create one flat texture. They can be freely merged with image textures.
          6. +
          7. Generated textures can be used as normal maps (but this looks poor when large amount of small triangles is used; incleasing generated texture ppu in blender key might help a little)
            +
          8. Loading materials.
            @@ -152,12 +161,10 @@ By default a BlenderModelLoader is registered with your assetManager to load ble
          - +

          Planned features.

            -
          1. Loading BMesh.
            -
          2. Loading sky.
          3. Full support for scale and offset in texture input mapping.
            @@ -173,7 +180,7 @@ By default a BlenderModelLoader is registered with your assetManager to load ble
          - +

          Known bugs/problems.

            @@ -184,7 +191,7 @@ By default a BlenderModelLoader is registered with your assetManager to load ble
          - +

          Using BlenderLoader instead of BlenderModelLoader

          @@ -245,7 +252,7 @@ You can use ModelKey as well. This will give the same result as using default Bl

          - +

          How does it work?

          @@ -291,7 +298,7 @@ Here is the list of how blender features are mapped into jme. Surface Node The surface is transformed to the proper mesh
          - +

          Using BlenderLoader can allow you to use blend file as your local assets repository. @@ -301,7 +308,7 @@ Probably versions before 2.49 will work pretty well too, but I never checked tha

          - +

          Notes

          @@ -342,5 +349,5 @@ See also:
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/material_editing.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/material_editing.html index 4b3671d37..3bfb567e0 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/material_editing.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/material_editing.html @@ -116,9 +116,12 @@ Or in your Java code

          -See also +See also: +

            +
          • +
          • diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/project_creation.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/project_creation.html index db688dd61..c3ad71cd9 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/project_creation.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/project_creation.html @@ -96,13 +96,25 @@ Now let's have a look at the project's file structure in the File Expl
          - - -

          Working With Your Game Project

          -
          +

          + +Project Configuration +

          + +

          +Right-Click the project to open the Project properties. +

          + +

          +In the Run section, specify the main class of your project. (Pressing F6 runs this main class.) +In the Run section, you can optionally configure JVM options and command line parameters (in most cases set the-Xms VMOption [NUMBER] m for the memory usage. for example (-Xms500m). see ). +In the Application section, specify the game title (by default the game will be named BasicGame). +In the Application section, specify the vendor name (your name), a short description, your project's homepage, and a splash screen. + +

          - +

          Project Configuration

          @@ -122,7 +134,7 @@ Right-Click the project to open the Project properties.
          - +

          Clean, Build and Run Cycle

          @@ -157,7 +169,7 @@ To build and run the main() of any file that is open in the editor, pre
          ant clean; ant jar; ant run;
          - +

          Development Process

            @@ -180,7 +192,7 @@ To build and run the main() of any file that is open in the editor, pre
          - +

          Adding external jar libraries

          @@ -226,7 +238,7 @@ That's it, your project can now use the external library. If you also linke

          - +

          Application Deployment

            @@ -235,7 +247,7 @@ That's it, your project can now use the external library. If you also linke
          - +

          Running Sample Projects

          @@ -264,5 +276,5 @@ Choose samples from the TestChooser and try out the included demos.
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/troubleshooting.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/troubleshooting.html index a7d4838a3..246da1a75 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/troubleshooting.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/troubleshooting.html @@ -3,7 +3,7 @@
          - +

          Specifying the JDK location

          @@ -27,7 +27,7 @@ Mac users navigate to Contents/Resources/jmonkeyplatform/etc/.
          - +

          Preferences and Settings

          @@ -46,7 +46,7 @@ To completely remove and/or reinstall the +

          Stability / Graphics issues

          @@ -98,7 +98,7 @@ Compiz on Linux might cause issues, if you set its rendering quality to "me

          - +

          Updating problems

          @@ -107,12 +107,20 @@ If you have problems updating the SDK<

          - -

          Known Issues

          + +

          Getting error messages and reporting issues

          +When an exception happens in the SDK, a small warning sign appears in the lower right corner of the main window. Double-click it to open a window that allows you to see the exception stack trace. When posting about issues in the forum, always post the stack trace along with a description of what happens and how it can be reproduced. +

          +
          + +

          Known Issues

          +
          + +

          For a list of known issues and possible workarounds see the following link:

          @@ -124,5 +132,5 @@ For a list of known issues and possible workarounds see the following link:
          - +

          view online version

          \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/version_control.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/version_control.html index 7d4ae0369..fdc710e0b 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/version_control.html +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/sdk/version_control.html @@ -8,11 +8,24 @@ Whether you work in a development team or alone: File versioning is a handy meth

          +For every team member, the file versioning workflow is as follows: +

          +
            +
          1. Once: Download a working copy of the project from the repository ("checkout").
            +
          2. +
          3. Regularly: Upload your own changes to the repository ("commit").
            +
          4. +
          5. Regularly: Download updates by others from the repository ("update").
            +
          6. +
          + +

          + Note: Since the jMonkeyEngine SDK is based on the NetBeans Platform framework, you can learn about certain jMonkeyEngine SDK features by reading the corresponding NetBeans IDE tutorials (in the "see also links").

          - +

          Version Control Systems

          @@ -26,7 +39,7 @@ You can use file versioning alone or in a team. The advantages are that you can

          - +

          Creating a Repository (Upload)

          @@ -39,11 +52,11 @@ Requirements:
        20. You must have version control software installed (Subversion, Mercurial, or CVS) and have initialized a repository.
            -
          • Tip: For Subversion, the init command looks like this example: svnadmin create /home/joe/mysvnrepo
            +
          • Tip: For Subversion, for example, the init command looks like this example: svnadmin create /home/joe/jMonkeyProjects/MyGame
        21. -
        22. The computer where the repository is to be hosted must be available in your network, or you will only be able to use your repo locally.
          +
        23. The computer where the repository is to be hosted must be available in your team's network, or you will only be able to use your repo locally.
          • Tip: Hosts such as SourceForge, GoogleCode, dev.java.net offer free version control services for open-source projects.
          • @@ -68,7 +81,7 @@ Now you create a repository to store your project's files.
        - +

        Checking Out a Repository (Download)

        @@ -104,7 +117,7 @@ Of course you can also check out existing repositories and access code from othe

        - +

        Updating and Committing Changes (Send and Receive)

        @@ -143,7 +156,7 @@ Receiving the latest changes from the team's repository is referred to as <
        - +

        Comparing and Reverting Changes

          @@ -174,7 +187,7 @@ Receiving the latest changes from the team's repository is referred to as <
        - +

        No Version Control? Local History!

        @@ -208,5 +221,5 @@ See also:
        - +

        view online version

        \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/wiki-map.xml b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/wiki-map.xml index 4bbf1160d..e0d3596f9 100644 --- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/wiki-map.xml +++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/wiki-map.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/sdk/jme3-core/javahelp/wiki_help.properties b/sdk/jme3-core/javahelp/wiki_help.properties index 45dd34379..ee9f78c1f 100644 --- a/sdk/jme3-core/javahelp/wiki_help.properties +++ b/sdk/jme3-core/javahelp/wiki_help.properties @@ -94,6 +94,7 @@ jme3:advanced:nifty_gui_popup_menu,\ jme3:advanced:nifty_gui_projection,\ jme3:advanced:nifty_gui_scenarios,\ jme3:advanced:nifty_gui_xml_layout,\ +jme3:advanced:ogrecompatibility,\ jme3:advanced:open_game_finder,\ jme3:advanced:particle_emitters,\ jme3:advanced:physics,\