-The com.jme3.app.state.AppState class is a customizable jME3 interface that allows you to control the global game logic – the overall game mechanics. (To control the behaviour of a Spatial, see Custom Controls instead. Controls and AppStates can be used together.)
+The com.jme3.app.state.AppState class is a customizable jME3 interface that allows you to control the global game logic ??? the overall game mechanics. (To control the behaviour of a Spatial, see Custom Controls instead. Controls and AppStates can be used together.)
@@ -51,7 +51,7 @@ You can! This is what AppStates are there for. An AppState class is subset of (o
a subset of other AppStates and Controls
-
… or combinations thereof.
+
??? or combinations thereof.
@@ -190,7 +190,7 @@ stateDetached(asm)
The AppState knows when it is attached to, or detache
-The AbstractAppState class already implements some common methods (isInitialized(), setActive(), isActive()) and makes creation of custom AppStates a bit easier. We recommend you extend AbstractAppState and override the remaining AppState methods: initialize(), setEnabled(), cleanUp().
+The AbstractAppState class already implements some common methods (isInitialized(), setActive(), isActive()) and makes creation of custom AppStates a bit easier. We recommend you extend AbstractAppState and override the remaining AppState methods: initialize(), setEnabled(), cleanup().
@@ -263,7 +263,7 @@ You define what an AppState does when Paused or Unpaused, in the setEnable
-The com.jme3.app.state.AppStateManager holds the list of AppStates for an application. AppStateManager ensures that activate AppStates can modify the scene graph, and that the update() loops of active AppStates is executed. There is one AppStateManager per application. You typically attach several AppStates to one AppStateManager, but the same state can only be attached once.
+The com.jme3.app.state.AppStateManager holds the list of AppStates for an application. AppStateManager ensures that active AppStates can modify the scene graph, and that the update() loops of active AppStates is executed. There is one AppStateManager per application. You typically attach several AppStates to one AppStateManager, but the same state can only be attached once.
@@ -277,19 +277,32 @@ The com.jme3.app.state.AppStateManager holds the list of AppStates for an applic
getState(MyAppState.class)
Returns the first attached state that is an instance of a subclass of MyAppState.class.
-
+
-The AppStateManager's render(), postRender(), cleanUp() methods are internal, ignore them, users never call them directly.
+The AppStateManager's render(), postRender(), cleanup() methods are internal, ignore them, users never call them directly.
+
+
+
If a detached AppState is attached then initialize() will be called on the following render pass.
+
+
If an attached AppState is detached then cleanup() will be called on the following render pass.
+
+
If you attach an already-attached AppState then the second attach is a no-op and will return false.
+
+
If you both attach and detach an AppState within one frame then neither initialize() or cleanup() will be called, although if either is called both will be.
+
+
If you both detach and then re-attach an AppState within one frame then on the next update pass its cleanup() and initialize() methods will be called in that order.
\ No newline at end of file
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 81fae5c5c..c85e215de 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
@@ -4,7 +4,25 @@
-JME3 has an integrated an asset manager that helps you keep your project assets organized. By assets we mean media files, such as 3D models, materials, textures, scenes, shaders, sounds, and fonts. Think of the asset manager as the filesystem of your game, independent of the actual deployment platform. It also manages the appropriate managing of OpenGL objects like textures so that they are e.g. not uploaded to the graphics card multiple times when multiple models use them.
+By assets we mean multi-media files, such as 3D models, materials, textures, scenes, custom shaders, music and sound files, and custom fonts. JME3 has an integrated asset manager that helps you keep your project assets organized. Think of the asset manager as the filesystem of your game, independent of the actual deployment platform. By default, store your assets in the MyGame/assets/ directory of your project.
+
+
+
+Advantages of the AssetManager:
+
+
+
The paths stay the same, no matter whether the game runs on Windows, Mac, Linux, etc!
+
+
The AssetManager automatically optimizes the handling of OpenGL objects.
+For example, the same textures are not uploaded to the graphics card multiple times when multiple models use them.
+
+
The default build script automatically bundles the contents of the assets directory into the executable.
+
+
+
+
+
+Advanced users can write a custom build and packaging script, and can register custom paths to the AssetManager, but this is up to you then.
@@ -45,7 +63,7 @@ Here is an example how you load assets using the AssetManager. This lines loads
new AssetKey("Common/Materials/RedColor.j3m"));
-This Material is "somewhere" in the jME3 JAR; the default Asset Manager is configured to handle a Common/… path correctly, so you don't have to specify the whole path when referring to built-in assets (such as default Materials).
+This Material is "somewhere" in the jME3 JAR; the default Asset Manager is configured to handle a Common/??? path correctly, so you don't have to specify the whole path when referring to built-in assets (such as default Materials).
@@ -53,31 +71,41 @@ Additionally, you can configure the Asset Manager and add any path to its root.
-By default, jME3 searches for models in a directory named assets. In Java projects created with the jMonkeyEngine SDK, an assets folder is created by default. Using any other IDE or the command line, you have to create this assets directory as an extra step (see the Codeless Project tip below).
+By default, jME3 searches for models in a directory named assets.
+
+
+
+
In Java projects created with the jMonkeyEngine SDK, an assets folder is created by default in your project directory. If you are using any other IDE, or the command line, you simply create an assets directory manually (see the Codeless Project tip below).
+
This is our recommended directory structure for storing assets:
-These are just the most common examples. You can rename/delete/add directories and subdirectories inside the assets directory in any way you like. Note however that there is no automatic refactoring for asset paths in the SDK, so if you modify them late in the development process, you have to refactor all paths manually.
+These subdirectories are just the most common examples.
+
+
+
+
You can rename/delete/add (sub)directories inside the assets directory in any way you like. Note however that there is no automatic refactoring for asset paths in the SDK, so if you modify them late in the development process, you have to refactor all paths manually.
+
@@ -91,7 +119,7 @@ After the conversion, you move the .j3o file into the assets/Models/
-If you use the default build script, original models and scenes, and ZIP files, are excluded from the distribution automatically. A stand-alone executable includes converted .j3o models and scenes only. The default build script makes sure to include existing .j3o files in the distribution, but you need to convert the models manually.
+If you use the default build script, original models and scenes (.mesh.xml, .obj, .blend, .zip), are excluded from the distribution automatically. A stand-alone executable includes converted .j3o files (models and scenes) only. The default build script makes sure to bundle existing .j3o files in the distribution, but you need to remember to convert the models (from mesh.xml???>.j3o, or .obj???>.j3o, etc) yourself.
@@ -211,28 +239,34 @@ If you use the default build script, original models and scenes, and ZIP
Before building the executable, you must use the jMonkeyEngine SDK's context menu action to convert 3D models to .j3o binary format.
-
Open the jME3 Project in the jMonkeyEngine SDK.
+
Save your original models (.mesh.xml, .scene, .blend, or .obj files, plus textures) into assets/Textures/. (!)
+
+
Open the jME3 project in the jMonkeyEngine SDK.
Browse to the assets directory in the Projects window.
-
Right-click a .mesh.xml/.scene/.obj file, and choose "convert to JME3 binary".
+
Right-click an original model in assets/Textures/, and choose "Convert to JME3 binary".
-
The converted file appears in the same directory as the .mesh.xml file. It has the same name and a .j3o suffix.
+
The converted file appears in the same directory as the original file. It has the same name and a .j3o suffix.
-
Move the .j3o file into the assets/Models/ or assets/Scenes/ directories.
+
Move the .j3o file into the assets/Models/ or assets/Scenes/ directory.
-
Update the file name in the load() code to access the .j3o file.
+
Use the assetManager's load() method to load the .j3o file.
-
If you load the scene from a non-.j3o ZIP file, ammend the default_build_script manully to copy the ZIP files into the distribution.
+This ensures that the model's Texture paths keep working between your 3D mesh editor and JME3.
+
+
+
+
If you must load custom assets from a non-.j3o ZIP file, you must manually ammend the default build script to copy ZIP files into your distribution. ZIPs are skipped by default.
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio.html
index 4f87adbc6..b51e3749e 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/audio.html
@@ -36,13 +36,13 @@ The main jME audio class to look at is com.jme3.audio.AudioNode. Wh
AudioNode boom = new AudioNode(assetManager, "Sound/boom.wav", false);
-
Streamed: If it is a long file such as music or a dialog, you stream the audio. Streaming means, you load and play in parallel until the sound is done. You create a streamed sound by setting the boolean to true:
AudioNode music = new AudioNode(assetManager, "Sound/music.wav", true);
+
Streamed: If it is a long file such as music or a dialog, you stream the audio. Streaming means, you load and play in parallel until the sound is done. You cannot loop streams. You create a streamed sound by setting the boolean to true:
AudioNode music = new AudioNode(assetManager, "Sound/music.wav", true);
@@ -74,24 +74,27 @@ Note: There are other obvious getters to poll the status of all corresponding se
AudioNode Method
Usage
-
setVolume(1)
Sets the volume gain. 1 is the default volume, 2 is twice as loud, etc. 0 is silent/mute.
+
setTimeOffset(0.5f)
Play the sound starting at a 0.5 second offset from the beginning. Default is 0.
setPitch(1)
Makes the sound play in a higher or lower pitch. Default is 1. 2 is twice as high, .5f is half as high.
-
setTimeOffset(0.5f)
Play the sound starting at a 0.5 second offset from the beginning. Default is 0.
+
setVolume(1)
Sets the volume gain. 1 is the default volume, 2 is twice as loud, etc. 0 is silent/mute.
+
+
+
setRefDistance(50f)
The reference distance controls how far a sound can still be heard at 50% of its original volume (this is assuming an exponential fall-off!). A sound with a high RefDist can be heard loud over wide distances; a sound with a low refDist can only be heard when the listener is close by. Default is 10 world units.
-
setMaxDistance(100f)
Maximum distance the sound can be heard, in world units. Default is 20.
+
setMaxDistance(100f)
The 'maximum attenuation distance' specifies how far from the source the sound stops growing more quiet (sounds in nature don't do that). Set this to a smaller value to keep the sound loud even at a distance; set this to higher value to let the sound fade out quickly. Default is 20 world units.
-
setLooping(false)
Configures the sound so that, if it is played, it plays once and stops. This is the default.
+
setLooping(false)
Configures the sound so that, if it is played, it plays once and stops. No looping is the default.
@@ -100,16 +103,16 @@ Note: There are other obvious getters to poll the status of all corresponding se
setPositional(false)
-setDirectional(false)
All 3D effects switched off. This sound is global and comes from everywhere. Good for environmental ambient sounds and background music.
+setDirectional(false)
All 3D effects switched off. This sound is global and plays in headspace (it appears to come from everywhere). Good for environmental ambient sounds and background music.
-
setLooping(true)
Configures the sound to be a loop: When it is played, it repeats from the beginning, until stop() or pause() are called. Good for music and ambient background noises.
-Looping does not work on streamed sounds!
+
setLooping(true)
Configures the sound to be a loop: After the sound plays, it repeats from the beginning, until you call stop() or pause(). Good for music and ambient background noises.
+Looping does not work on streamed sounds.
@@ -118,20 +121,21 @@ Looping does not work on streamed sounds!
setPositional(true)
-setLocalTranslation(…)
Activates 3D audio: The sound appears to come from a certain position, where it is loudest. Position the AudioNode in the 3D scene, or move it with mobile players or NPCs.
+setLocalTranslation(???)
Activates 3D audio: The sound appears to come from a certain position, where it is loudest. Position the AudioNode in the 3D scene, or move it with mobile players or NPCs.
-
setReverbEnabled(true)
A 3D echo effect that only makes sense to use with positional AudioNodes. The reverb effect is influenced by the environment that the audio renderer is in. See "Setting Environment Properties" below.
+
setReverbEnabled(true)
Reverb is a 3D echo effect that only makes sense with positional AudioNodes. Use Audio Environments to make scenes sound as if they were "outdoors", or "indoors" in a large or small room, etc. The reverb effect is defined by the com.jme3.audio.Environment that the audioRenderer is in. See "Setting Audio Environment Properties" below.
-
+
-Note: 3D sounds require an audio listener.
+
Positional 3D sounds require an AudioListener object in the scene (representing the player's ears).
+
@@ -140,21 +144,22 @@ Note: 3D sounds require an audio listener.
setDirectional(true)
-setDirection(…)
Activates 3D audio: This sound can only be heard from a certain direction. Specify the direction and angle in the 3D scene if you have setDirectional() true. Use this to restrict noises that should not be heard, for example, through a wall.
+setDirection(???)
Activates 3D audio: This sound can only be heard from a certain direction. Specify the direction and angle in the 3D scene if you have setDirectional() true. Use this to restrict noises that should not be heard, for example, through a wall.
setInnerAngle()
-setOuterAngle()
Set the angle in degrees for the directional audio. The angle is relative to the direction. Note: By default, both angles are 360° and the sound can be heard from all directions!
+setOuterAngle()
Set the angle in degrees for the directional audio. The angle is relative to the direction. Note: By default, both angles are 360?? and the sound can be heard from all directions!
-
+
-Note: 3D sounds require an audio listener.
+
Directional 3D sounds require an AudioListener object in the scene (representing the player's ears).
+
-The default listener object is the user's ear in the scene. If you use 3d audio (positional and directional sounds), you have to move the listener with the player: For example, for a first-person player, you move the listener with the camera. For a third-person player, you move the listener with the player avatar Geometry.
+The default AudioListener object listener in SimpleApplication is the user's ear in the scene. If you use 3D audio (positional or directional sounds), you must move the AudioListener with the player: For example, for a first-person player, you move the listener with the camera. For a third-person player, you move the listener with the player avatar Geometry.
@Override
public void simpleUpdate(float tpf) {
- // keep the audio listener moving with the camera
+ // first-person: keep the audio listener moving with the camera
listener.setLocation(cam.getLocation());
listener.setRotation(cam.getRotation());
}
-Optionally, You can choose from the following environmental presets from com.jme3.audio.Environment. This presets influence subtle echo effects that evoke associations of different environments in your users. You use it together with setReverbEnabled(true) mentioned above.
+Optionally, You can choose from the following environmental presets from com.jme3.audio.Environment. This presets influence subtle echo effects (reverb) that evoke associations of different environments in your users. That is, it makes you scene sound "indoors" or "outdoors" etc. You use Audio Environments together with setReverbEnabled(true) on positional AudioNodes (see above).
@@ -221,22 +226,38 @@ Optionally, You can choose from the following environmental presets from c
Closet
1.00f
1.0f
1.0f
1.00f
0.15f
1.0f
0.600f
0.0025f
0.500f
0.0006f
-
+
+
Activate a Environment preset
+
+
Either use a default, e.g. make you scene sounds like a dungeon environment:
-Activate the preset with setEnvironment(). E.g. in a dungeon environment:
+
A sound engineer can create a custom com.???jme3.???audio.Environment object and specify custom environment values such as density, diffusion, gain, decay, delay??? You can find many examples of custom audio environment presets here.
+
-A sound engineer can create a custom com.jme3.audio.Environment object and specify custom environment factors. You can find many examples of audio environment presets here. Activate your custom environment settings in the Environment constructor:
+Advanced users find more info about OpenAL and its features here: .
-
audioRenderer.setEnvironment(
- new Environment( density, diffusion, gain, gainHf, decayTime, decayHf,
- reflGain, reflDelay, lateGain, lateDelay ) );
-You can find more info about OpenAL and its advanced features here: . It depends on the hardware whether audio effects are supported (if not, you get the message OpenAL EFX not available! Audio effects won't work.)
+
It depends on the hardware whether audio effects are supported (if not, you get the message OpenAL EFX not available! Audio effects won't work.)
+
sound,
@@ -245,5 +266,5 @@ You can find more info about OpenAL and its advanced features here:
\ 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 8d5c7ed67..3a5c04a2c 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
@@ -20,7 +20,7 @@ The camera object is created with the following defaults:
This way of A/V recording is still in development.
It works for all of jMonkeyEngine's test cases.
If you experience any problems or
-if something isn't clear, please . – bortreb
+if something isn't clear, please . ??? bortreb
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/cinematics.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/cinematics.html
index dbba350ce..97af239ef 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/cinematics.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/cinematics.html
@@ -384,7 +384,7 @@ You can extend individual CinematicEvents. The . An AbstractCinematicEvent implements the CinematicEvent interface and provides duration, time, speed, etc… management. Look at the is to use this for a custom fadeIn/fadeOut effect in combination with a com.jme3.post.filters.FadeFilter.
+You can also create new CinematicEvent by extending . An AbstractCinematicEvent implements the CinematicEvent interface and provides duration, time, speed, etc??? management. Look at the is to use this for a custom fadeIn/fadeOut effect in combination with a com.jme3.post.filters.FadeFilter.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/collision_and_intersection.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/collision_and_intersection.html
index 02790237b..e60ce64e5 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/collision_and_intersection.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/collision_and_intersection.html
@@ -12,7 +12,7 @@ Non-physical collision detection is interesting because it uses less computing r
-Example: One example for an optimization is a physical vehicle's wheels. You could make the wheels fully physical disks, and have jME calculate every tiny force – sounds very accurate? It's total overkill and too slow for a racing game. A more performant solution is to cast four invisible rays down from the vehicle and calculate the intersections with the floor. These non-physical wheels require (in the simplest case) only four calculations per tick to achieve an effect that players can hardly distinguish from the real thing.
+Example: One example for an optimization is a physical vehicle's wheels. You could make the wheels fully physical disks, and have jME calculate every tiny force ??? sounds very accurate? It's total overkill and too slow for a racing game. A more performant solution is to cast four invisible rays down from the vehicle and calculate the intersections with the floor. These non-physical wheels require (in the simplest case) only four calculations per tick to achieve an effect that players can hardly distinguish from the real thing.
@@ -93,7 +93,7 @@ The following code snippet can be triggered by listeners (e.g. after an input ac
CollisionResults results = new CollisionResults();
a.collideWith(b, results);
System.out.println("Number of Collisions between" +
- a.getName()+ " and " + b.getName() ": " + results.size());
+ a.getName()+ " and " + b.getName() + ": " + results.size());
// Use the results
if (results.size() > 0) {
// how to react when a collision was detected
@@ -133,7 +133,7 @@ Knowing the distance of the collisions is useful for example when you intersect
-
+
@@ -147,7 +147,7 @@ jME3 computes bounding volumes for all objects. These bounding volumes are later
-All fast-paced action and shooter games use BoundingVolumes as an optimization. Wrap all complex models into simpler shapes – in the end, you get equally useful collision detection results, but faster.
+All fast-paced action and shooter games use BoundingVolumes as an optimization. Wrap all complex models into simpler shapes ??? in the end, you get equally useful collision detection results, but faster.
@@ -217,7 +217,7 @@ Rays are used to perform line-of-sight calculations. This means you can detect w
-
These simple but powerful ray-surface intersection tests are called Ray Casting. As opposed to the more advanced Ray Tracing technique, Ray Casting does not follow the ray's reflection after the first hit – the ray just goes straight on.
+
These simple but powerful ray-surface intersection tests are called Ray Casting. As opposed to the more advanced Ray Tracing technique, Ray Casting does not follow the ray's reflection after the first hit ??? the ray just goes straight on.
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/combo_moves.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/combo_moves.html
index 46daaaa65..ff182f85e 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/combo_moves.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/combo_moves.html
@@ -36,9 +36,9 @@ Copy the two classes ComboMoveExecution.java and ComboMove.java into your applic
-
← required
+
??? required
-
← required
+
??? required
@@ -117,7 +117,7 @@ Combo step is recorded if A and B are both released.
Combo step is recorded a certain time after A and not B is entered.
-etc, etc …
+etc, etc ???
setPriority(0.5f);
If there is an ambiguity, a high-priority combo will trigger instead of a low-priority combo. This prevents that a similar looking combo step "hijacks" another Combo. Use only once per ComboMove.
-A com.jme3.scene.control.Control is a customizable jME3 interface that allows you to cleanly steer the behaviour of game entities (Spatials), such as artificially intelligent behaviour in NPCs, traps, automatic alarms and doors, animals and pets, self-steering vehicles or platforms – anything that moves and interacts. Several instances of customs Controls together implement the behaviours of a type of Spatial.
+A com.jme3.scene.control.Control is a customizable jME3 interface that allows you to cleanly steer the behaviour of game entities (Spatials), such as artificially intelligent behaviour in NPCs, traps, automatic alarms and doors, animals and pets, self-steering vehicles or platforms ??? anything that moves and interacts. Several instances of customs Controls together implement the behaviours of a type of Spatial.
-To control global game behaviour see Application States – you often use AppStates and Control together.
+To control global game behaviour see Application States ??? you often use AppStates and Control together.
Use the Mesh class to create custom shapes that go beyond Quad, Box, Cylinder, and Sphere, even procedural shapes are possible. Thank you to KayTrance for providing the sample code!
-In this tutorial, we (re)create a very simple rectangular mesh, and we have a look at different ways of coloring it. A flat rectangle may not look useful because it's exactly the same as a com.jme3.scene.shape.Quad. We choose this simple example in order to show you how to build any shape out of triangles – without the distractions of more complex shapes.
+In this tutorial, we (re)create a very simple rectangular mesh, and we have a look at different ways of coloring it. A flat rectangle may not look useful because it's exactly the same as a com.jme3.scene.shape.Quad. We choose this simple example in order to show you how to build any shape out of triangles ??? without the distractions of more complex shapes.
Full code sample:
@@ -20,7 +20,7 @@ In this tutorial, we (re)create a very simple rectangular mesh, and we have a lo
Polygon meshes are made up of triangles. The corners of the triangles are vertices. So, when ever you create a new shape, you break it down into triangles.
Let's look at a cube. A cube is made up of 6 rectangles. Each rectangle can be broken down into two triangles. This means you need 12 triangles to create a cube mesh. You also need to know the 8 corner coordinates (vertices). The trick is that you have to specify the vertices in a certain order: Each triangle separately, counter-clockwise.
-Sounds worse than it is – here is an example:
+Sounds worse than it is ??? here is an example:
@@ -79,7 +79,7 @@ texCoord[3] = new Vector2f(1,1);
-Next we turn the unrelated coordinates into triangles – We define the order in which the mesh is constructed. Think of these indexes as coming in groups of three. Each group of indexes describes one triangle. Note that you must specify the vertices counter-clockwise!
+Next we turn the unrelated coordinates into triangles ??? We define the order in which the mesh is constructed. Think of these indexes as coming in groups of three. Each group of indexes describes one triangle. Note that you must specify the vertices counter-clockwise!
int [] indexes = { 2,0,1, 1,3,2 };
@@ -308,7 +308,7 @@ In case however that your usecase requires the backfaces to be visible, you have
-See also: Spatial – contains more info about how to debug custom meshes (that do not render as expected) by changing the default culling behaviour.
+See also: Spatial ??? contains more info about how to debug custom meshes (that do not render as expected) by changing the default culling behaviour.
spatial,
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/debugging.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/debugging.html
index 90c05744d..277121c67 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/debugging.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/debugging.html
@@ -12,7 +12,7 @@ What if you just want to quickly write code that loads models and brings them in
-If you ever have problems with objects appearing in the wrong spot, with the wrong scale, or wrong orientation, simply attach debug shapes to your scene to have a point of reference in 3D space – just like a giant ruler. If your code positions the debug shapes correctly, but models remain invisible when you apply the same code to them, you know that the problem must be either the model (where is its origin coordinate?), or the light (too dark? too bright? missing?), or the model's material (missing?) – and not the positioning code.
+If you ever have problems with objects appearing in the wrong spot, with the wrong scale, or wrong orientation, simply attach debug shapes to your scene to have a point of reference in 3D space ??? just like a giant ruler. If your code positions the debug shapes correctly, but models remain invisible when you apply the same code to them, you know that the problem must be either the model (where is its origin coordinate?), or the light (too dark? too bright? missing?), or the model's material (missing?) ??? and not the positioning code.
@@ -181,15 +181,34 @@ Then you can add a switch to toggle the model's wireframe on and off, like
};
+
Alternatively you could traverse over the whole scene and toggle for all Geometry objects in there if you don't want to create a new SceneProcessor
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/effects_overview.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/effects_overview.html
index 6c802666b..eaa86a300 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/effects_overview.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/effects_overview.html
@@ -81,9 +81,9 @@ Use the SimpleWaterProcessor (SceneProcessor) for small, limited bodies of water
See also the announcement with video.
-
– SimpleWaterProcessor (SceneProcessor)
+
??? SimpleWaterProcessor (SceneProcessor)
-
– SimpleWaterProcessor (SceneProcessor)
+
??? SimpleWaterProcessor (SceneProcessor)
@@ -91,9 +91,9 @@ See also the
+
??? FogFilter
@@ -130,7 +130,7 @@ See also the – LightScatteringFilter
+
@@ -286,14 +286,14 @@ Thanks for your awesome contributions! Keep them coming!
-Particle emitter effects are highly configurable and can have any texture. They can simulate smoke, dust, leaves, meteors, snowflakes, mosquitos, fire, explosions, clusters, embers, sparks…
+Particle emitter effects are highly configurable and can have any texture. They can simulate smoke, dust, leaves, meteors, snowflakes, mosquitos, fire, explosions, clusters, embers, sparks???
TerrainGrid is an extension built on top of the TerraMonkey tools like TerrainQuad and HeightMap, that provides "infinite" Terrain paging routines.
-Thanks to Gábor (@anthyon) and Brent (@sploreg) for this contribution!
+Thanks to G??bor (@anthyon) and Brent (@sploreg) for this contribution!
@@ -50,10 +50,10 @@ TerrainGrid is made up of the TerrainGrid class, and the HeightMapGrid and Terra
-Multiple listeners can be added to the TerrainGrid, they will be called in the order of addition, so it’s possible to have multiple changes to the material before completing the load of the tile.
+Multiple listeners can be added to the TerrainGrid, they will be called in the order of addition, so it???s possible to have multiple changes to the material before completing the load of the tile.
-HeightMapGrid adds the possibility of loading terrain tiles on demand instead of having a simple height array. There’s no predefined way of how to store these tiles, it only takes care of loading one HeightMap object at given location at a time.
+HeightMapGrid adds the possibility of loading terrain tiles on demand instead of having a simple height array. There???s no predefined way of how to store these tiles, it only takes care of loading one HeightMap object at given location at a time.
@@ -63,7 +63,7 @@ HeightMapGrid adds the possibility of loading terrain tiles on demand instead of
-After playing around with the terrain in jME3, soon comes the requirement of having larger explorable lands. Increasing the size of one TerrainQuad leads to more memory usage, while it will still be easy to reach the worlds boundaries. That’s why TerrainGrid was designed. It extends the TerraindQuad class and uses 4 HeightMaps (dark blue) as the four sub-quad. This means that a terrain of size 513 will use tiles of 257. Also an LRUCache is built into the terrain package, so surrounding tiles (green) can be pre-cached on a different thread, lowering the loading time. The quads are updated as the camera approaches the boundary of the light blue section.
+After playing around with the terrain in jME3, soon comes the requirement of having larger explorable lands. Increasing the size of one TerrainQuad leads to more memory usage, while it will still be easy to reach the worlds boundaries. That???s why TerrainGrid was designed. It extends the TerraindQuad class and uses 4 HeightMaps (dark blue) as the four sub-quad. This means that a terrain of size 513 will use tiles of 257. Also an LRUCache is built into the terrain package, so surrounding tiles (green) can be pre-cached on a different thread, lowering the loading time. The quads are updated as the camera approaches the boundary of the light blue section.
@@ -79,7 +79,7 @@ There exist also two basic HeightMapGrid implementations:
ImageBasedHeightMapGrid: uses a sequentially numbered, 16 bit grayscale heightmaps. The physical filename of these files can be generated through the Namer interface. When a tile cannot be found by the assetManager, an empty (all-zero) heightmap is created, and a warning is added to the log.
-
FractalHeightMapGrid: uses a noise library to create a landscape on the fly. The shape of the terrain can be controlled by the various parameters and postfilters of the fractals. With the help of this grid implementation there’s no limitation – above of floating point precision limits – how far the camera can get. The tiles generated this way can be cached to the filesystem, for later modification. The FractalHeightMapGrid will always load from cache if a tile exists there!
+
FractalHeightMapGrid: uses a noise library to create a landscape on the fly. The shape of the terrain can be controlled by the various parameters and postfilters of the fractals. With the help of this grid implementation there???s no limitation ??? above of floating point precision limits ??? how far the camera can get. The tiles generated this way can be cached to the filesystem, for later modification. The FractalHeightMapGrid will always load from cache if a tile exists there!
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/headless_server.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/headless_server.html
index fde98eac5..662bcc8cc 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/headless_server.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/headless_server.html
@@ -18,16 +18,16 @@ It's very easy to change your current (client) game to function as a server
-A headless server…
+A headless server???
-
does not display any output – no window opens, no audio plays, no graphics are rendered.
+
does not display any output ??? no window opens, no audio plays, no graphics are rendered.
-
ignores all input – no input handling.
+
ignores all input ??? no input handling.
-
keeps game state – you can attach to, transform, and save the rootNode, although the scene is not displayed.
+
keeps game state ??? you can attach to, transform, and save the rootNode, although the scene is not displayed.
-
calls the simpleUpdate() loop – you can run tests and trigger events as usual.
+
calls the simpleUpdate() loop ??? you can run tests and trigger events as usual.
@@ -73,7 +73,7 @@ Okay, so you can now start your game in a headless 'server mode', wher
-
Parse String[] args from the main-method to enable server mode on demand (e.g. start your server like java -jar mygame.jar –server.
+
Parse String[] args from the main-method to enable server mode on demand (e.g. start your server like java -jar mygame.jar ???server.
Integrate SpiderMonkey, to provide game updates to the server over a network.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hinges_and_joints.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hinges_and_joints.html
index b89c25d1c..91a746d13 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hinges_and_joints.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hinges_and_joints.html
@@ -97,7 +97,7 @@ For a rope bridge, each set of planks would be one dynamic node.
-A PhysicsHingeJoint is an invisible connection between two nodes – here between the pendulum body and the hook. Why are hinges and joints represented by the same class? Hinges and joints have something in common: They constrain the mechanical degree of freedom (DOF) of another object.
+A PhysicsHingeJoint is an invisible connection between two nodes ??? here between the pendulum body and the hook. Why are hinges and joints represented by the same class? Hinges and joints have something in common: They constrain the mechanical degree of freedom (DOF) of another object.
@@ -135,7 +135,7 @@ You'll understand that, when creating any type of joint, it is important to
-You create the HingeJoint after you have created the nodes that are to be chained together. In the code snippet you see that the HingeJoint constructor requires the two node objects. You also have to specify axes and pivots – they are the degrees of freedom that you just heard about.
+You create the HingeJoint after you have created the nodes that are to be chained together. In the code snippet you see that the HingeJoint constructor requires the two node objects. You also have to specify axes and pivots ??? they are the degrees of freedom that you just heard about.
private HingeJoint joint;
...
@@ -160,15 +160,15 @@ The pivot point's position will be at (0,0,0) in the global 3D
Specify the following parameters for each joint:
-
PhysicsControl A and B – the two nodes that are to be joined
+
PhysicsControl A and B ??? the two nodes that are to be joined
-
Vector3f pivot A and pivot B – coordinates of the attachment point relative to A and B
+
Vector3f pivot A and pivot B ??? coordinates of the attachment point relative to A and B
The points typically lie on the surface of the PhysicsControl's Spatials, rarely in the middle.
-
Vector3f axisA and axisB – around which axes each node is allowed to spin.
+
Vector3f axisA and axisB ??? around which axes each node is allowed to spin.
In our example, we constrain the pendulum to swing only along the Z axis.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hud.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hud.html
index 6b1a30e09..66103b07b 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hud.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/hud.html
@@ -15,13 +15,13 @@ A HUD (Head-Up Display) is part of a game's visual user interface. It'
HUDs are used to supply players with essential information about the game state.
-
Status: Score, minimap, points, stealth mode, …
+
Status: Score, minimap, points, stealth mode, ???
-
Resources: Ammunition, lives/health, time, …
+
Resources: Ammunition, lives/health, time, ???
-
Vehicle instruments: Cockpit, speedometer, …
+
Vehicle instruments: Cockpit, speedometer, ???
-
Navigational aides: Crosshairs, mouse pointer or hand, …
+
Navigational aides: Crosshairs, mouse pointer or hand, ???
-Users interact with your jME3 application with different input devices – the mouse, the keyboard, or a joystick. To respond to inputs we use the inputManager object in SimpleApplication.
+Users interact with your jME3 application with different input devices ??? the mouse, the keyboard, or a joystick. To respond to inputs we use the inputManager object in SimpleApplication.
@@ -81,13 +81,13 @@ Choose one or several key/mouse events for the interaction. We use KeyTrig
Mouse wheel: Down
MouseAxisTrigger(MouseInput.AXIS_WHEEL,true)
-
NumPad: 1, 2, 3, …
KeyTrigger(KeyInput.KEY_NUMPAD1) …
+
NumPad: 1, 2, 3, ???
KeyTrigger(KeyInput.KEY_NUMPAD1) ???
-
Keyboard: 1, 2 , 3, …
KeyTrigger(KeyInput.KEY_1) …
+
Keyboard: 1, 2 , 3, ???
KeyTrigger(KeyInput.KEY_1) ???
-
Keyboard: A, B, C, …
KeyTrigger(KeyInput.KEY_A) …
+
Keyboard: A, B, C, ???
KeyTrigger(KeyInput.KEY_A) ???
Keyboard: Spacebar
KeyTrigger(KeyInput.KEY_SPACE)
@@ -97,7 +97,7 @@ Choose one or several key/mouse events for the interaction. We use KeyTrig
KeyTrigger(KeyInput.KEY_LSHIFT)
-
Keyboard: F1, F2, …
KeyTrigger(KeyInput.KEY_F1) …
+
Keyboard: F1, F2, ???
KeyTrigger(KeyInput.KEY_F1) ???
Keyboard: Return, Enter
KeyTrigger(KeyInput.KEY_RETURN),
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 08411f4e0..54842c328 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
@@ -61,7 +61,7 @@ How to this file is structured:
-
In the jMonkeyEngine SDK, use File→New File→Material→Empty Material File to create .j3m files. You can edit .j3m files directly in the SDK. On the other hand, they are plain text files, so you can also create them in any plain text editor.
+
In the jMonkeyEngine SDK, use File???New File???Material???Empty Material File to create .j3m files. You can edit .j3m files directly in the SDK. On the other hand, they are plain text files, so you can also create them in any plain text editor.
@@ -72,7 +72,7 @@ How to this file is structured:
-This is how you use the prepared .j3m Material on a Spatial. Since you have saved the .j3m file to your project's Assets directory, the .j3m path is relative to MyGame/src/assets/….
+This is how you use the prepared .j3m Material on a Spatial. Since you have saved the .j3m file to your project's Assets directory, the .j3m path is relative to MyGame/src/assets/???.
Shaders are sets of instructions that are executed on the GPU. They are used to take advantage of hardware acceleration available on the GPU for rendering purposes.
-This paper only covers Vertex and Fragment shaders because they are the only ones supported by JME3 for the moment. But be aware that there are some other types of shaders (geometry, tessellation,…).
+This paper only covers Vertex and Fragment shaders because they are the only ones supported by JME3 for the moment. But be aware that there are some other types of shaders (geometry, tessellation,???).
There are multiple frequently used languages that you may encounter to code shaders but as JME3 is based on OpenGL, shaders in JME use GLSL and any example in this paper will be written in GLSL.
@@ -143,13 +143,13 @@ For example applying this shader to a sphere would render a solid blue sphere on
-You probably heard that JME3 is “shader oriented”, but what does that mean?
+You probably heard that JME3 is ???shader oriented???, but what does that mean?
Usually to use shaders you must create what is called a program. This program specify the vertex shader and the fragment shader to use.
JME3 encloses this in the material system. Every material in JME3 uses shaders.
-For example let’s have a look at the SolidColor.j3md file :
+For example let???s have a look at the SolidColor.j3md file :
@@ -191,7 +191,7 @@ For more information on JME3 material system, i suggest you read this
JME3 can expose pre-computed global uniforms to your shaders. You must specify the one that are required for your shader in the WorldParameters section of the material definition file (.j3md).
-Note that in the shader the uniform names will be prefixed by a “g_”.
+Note that in the shader the uniform names will be prefixed by a ???g_???.
In the example above, WorldViewProjectionMatrix is declared as uniform mat4 g_WorldViewProjectionMatrix in the shader.
@@ -225,7 +225,7 @@ JME3 uses some global uniforms for lighting :
use for PointLight : x,y,z contain the world position of the light, the w component contains 1/lightRadius
-
use for DirectionalLight : strangely enough it's used for the direction of the light…this might change though. The fourth component contains -1 and it's used in the lighting shader to know if it's a directionalLight or not.
+
use for DirectionalLight : strangely enough it's used for the direction of the light???this might change though. The fourth component contains -1 and it's used in the lighting shader to know if it's a directionalLight or not.
@@ -250,7 +250,7 @@ Those are different attributes that are always passed to your shader.
You can find a complete list of those attribute in the Type enum of the VertexBuffer .
-Note that in the shader the attributes names will be prefixed by an “in”.
+Note that in the shader the attributes names will be prefixed by an ???in???.
@@ -396,7 +396,7 @@ A result preview can be seen here:
-GLSL 1.0 to 1.2 comes with built 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
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 6de569383..f9898f915 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
@@ -38,7 +38,7 @@ You can add several types of light sources to a scene using rootNode.addLi
-The available light sources in com.jme3.light are:
+The available light sources in com.???jme3.???light are:
-If you want the spotlight to follow the flycam, repeat the setDirection(…) and setPosition(…) calls in the update loop, and kee syncing them with the camera position and direction.
+If you want the spotlight to follow the flycam, repeat the setDirection(???) and setPosition(???) calls in the update loop, and kee syncing them with the camera position and direction.
@@ -315,7 +315,7 @@ The constructor expects the following values:
Your assetManager object
-
The size of the rendered shadowmaps (512, 1024, 2048, etc…)
+
The size of the rendered shadowmaps (512, 1024, 2048, etc???)
The number of shadow maps rendered (the more shadow maps, the more quality, the less FPS).
@@ -326,13 +326,13 @@ The constructor expects the following values:
You can set the following properties on the pssmRenderer object:
-
setDirection(Vector3f) – the direction of the light
+
setDirection(Vector3f) ??? the direction of the light
-
setLambda(0.65f) – Factor to use to reduce the split size
+
setLambda(0.65f) ??? Factor to use to reduce the split size
setShadowZextend() – distance how far away from camera shadows will still be computed
+
setShadowZextend() ??? distance how far away from camera shadows will still be computed
@@ -353,9 +353,9 @@ terrain.setShadowMode(ShadowMode.Receive);
Full sample code
-
, – Screen-Space Ambient Occlusion shadows
+
, ??? Screen-Space Ambient Occlusion shadows
-
– Screen-Space Ambient Occlusion shadows plus transparancy
+
??? Screen-Space Ambient Occlusion shadows plus transparancy
@@ -363,7 +363,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.
+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.61f);
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 f5c9c0828..f63248c7f 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
@@ -139,7 +139,7 @@ update_bar(100%);
-If you do all of this in a single frame, then it is sent to the graphics card only after the whole code block has executed. By this time the bar has reached 100% and the game has already begun – for the user, the progressbar on the screen would not have visibly changed.
+If you do all of this in a single frame, then it is sent to the graphics card only after the whole code block has executed. By this time the bar has reached 100% and the game has already begun ??? for the user, the progressbar on the screen would not have visibly changed.
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 de4bb918f..66b9b2b7c 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,15 +151,15 @@ 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 use or .
+
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. Work closely with the localizers if they require extra info, and add that info as comments to the translation file.
+
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 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.
+
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.
+
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.
-Many developers just use System.out.println() to print diagnostic strings to the terminal. The problem with that is that before the release, you'd have to go through all your code and make certain you removed all these println() calls. You do not want your users to see them and worry about ominous strings babbling about old development diagnostics.
+Many developers just use System.out.println() to print diagnostic strings to the terminal. The problem with that is that before the release, you have to go through all your code and make certain you removed all these println() calls. You do not want your customers to see them, and needlessly worry about ominous outdated debugging diagnostics.
-Instead of println(), you use the standard Java logger from java.util.logging. It has many advantages for professional game development:
+Instead of println(), use the standard Java logger from java.util.logging. It has many advantages for professional game development:
-
You "tag" each message with a log level: Severe error, informative warning, etc.
+
You tag each message with its log level: Severe error, informative warning, etc.
-
You can switch off printing of all messages up to certain log level with just one line of code.
+
You can switch off or on printing of log messages up to certain log level with just one line of code.
-
During development, you would set the log level to fine, because you want all warnings printed.
+
During development, you would set the log level to fine, because you want all warnings printed.
-
For the release, you set the log level to only report severe errors, and no informative diagnostics.
+
For the release, you set the log level to only report severe errors, and never print informative diagnostics.
-
The logger string is localizable, since it contains variables. You may want to localize all errors.
+
The logger message string is localizable and can use variables. Optimally, you localize all error messages.
-So to print comments like a pro, you use the following logger syntax. The variables a, b, c, can be any printable Java object, e.g. Vector3f a = cam.getLocation(). They are numbered {0},{1},{2},etc for use in the string, in the order you put them in the Object array.
+To print comments like a pro, you use the following logger syntax.
-
private static final Logger logger = Logger.getLogger(HelloWorld.class.getName());
-
-
-
-Replace HelloWorld by the name of the class where you are using this line.
-
-
Declare the logger object once per file. In the following code, replace HelloWorld by the name of the class where you are using this line.
private static final Logger logger = Logger.getLogger(HelloWorld.class.getName());
+
+
+
Declare the info that you want to include in the message. The variables (here a, b, c) can be any printable Java object.
+Example: Vector3f a = cam.getLocation();
+
+
Put the variables in a new Object array. Refer to the variables as {0},{1},{2} etc in the message string. Variables are numbered in the order you put them into the Object array.
+
+
Add the logger line and specify the log level:
+
+
Usecase 1: During debugging, a developer uses a warning to remind himself of a bug:
logger.log(Level.WARNING, "why is {0} set to {1} again?!",
new Object[]{a , b});
-
-
-
-or
-
-
-
logger.log(Level.SEVERE, "Game error: {0} must not be {1} after {2}! Please check your flux generator.",
+
+
+
Usecase 2: For the release, you inform the customer of a problem and how to solve it.
logger.log(Level.SEVERE, "MyGame error: {0} must not be {1} after {2}! Adjust flux generator settings.",
new Object[]{a , b , c});
+
+
+
+
+
-As you see in the example, you should phrase potentially "customer facing" errors in a neutral way and offer a reason and a solution. If you use WARNINGs as replacement for casual printlns, make sure you deactivate them for the release.
+
+
As you see in the examples, you should phrase potentially "customer facing" errors in a neutral way and offer a reason and a solution for the error (if you don't, it has no value to your customer). If your deveopment team uses WARNINGs as replacement for casual printlns, make sure you deactivate them for the release.
+
@@ -77,23 +84,37 @@ In the release version you will deactivate the logging output to the terminal.
-To deactivate the default logger for a release, you set the log level to only report severe messages:
+To deactivate the default logger for a release, you set the log level to only report severe messages:
+
+
+
Logger.getLogger(??????).setLevel(Level.SEVERE);
+
+
+During development or a beta test, you can tune down the default logger, and set the log level to only report warnings:
-
Logger.getLogger(””).setLevel(Level.SEVERE);
+
Logger.getLogger(??????).setLevel(Level.WARNING);
-During development, you can tune down the default logger, and set the log level to only report warnings:
+To activate full logging, e.g. for debugging and testing, use the fine level:
-To reactivate full logging, e.g. for debugging and testing:
+When an uncaught exception reaches certain parts of the jME3 system then the default response is to log the error and then exit the application. This is because an error happening every frame will rapidly fill logs with repeated failings and potentially mask or over-write the original cause of the problem or even the application may continue for a while and then suffer other errors caused by the first and make the root cause hard to determine.
+
+
+
+This behaviour can be partially modified by overriding the method handleError in SimpleApplication, for example to display a custom message to users, or to provide users with information on how to report a bug or even to change the way that the error is logged.
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/making_the_camera_follow_a_character.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/making_the_camera_follow_a_character.html
index 8f1119c7a..51e94608d 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/making_the_camera_follow_a_character.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/making_the_camera_follow_a_character.html
@@ -82,7 +82,7 @@ The camera's transformation is copied over the spatial's transformatio
Code sample:
-
– Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
+
??? Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
@@ -143,7 +143,7 @@ new KeyTrigger(KeyInput.KEY_SPACE))
Activate mutiple triggers for the ro
Code sample:
-
– Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
+
??? Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
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 980a0206a..288bd8fe3 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
@@ -46,13 +46,13 @@ In the M
Use this as an efficient way to make an object temporarily invisible, while keeping all its other in-game properties (such as node attachment, collision shapes, interactions, etc) active.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mesh.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mesh.html
index bf0be94a9..d7ce6c612 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mesh.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mesh.html
@@ -13,7 +13,7 @@ All visible game elements in a scene, whether it is a Model or a Shape, are made
Meshes are made up of triangles.
-getTriangleCount(…) and getTriangle(…)
+getTriangleCount(???) and getTriangle(???)
Each mesh has a unique ID getId()
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/monkey_zone.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/monkey_zone.html
index 65fd74c14..0b6762225 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/monkey_zone.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/monkey_zone.html
@@ -10,7 +10,7 @@ MonkeyZone is an multi-player demo game provided by the jME core developer team.
(YouTube Video)
-
(news article)
+
(news article)
@@ -27,9 +27,9 @@ This open-source demo:
-The game idea is based on “BattleZone” arcade game from the 1980s, a first-person shooter the with real-time strategy elements.
+The game idea is based on ???BattleZone??? arcade game from the 1980s, a first-person shooter the with real-time strategy elements.
The game was written using the jMonkeyEngine SDK, and it's based off the BasicGame project template. It took us one week to create a playable pre-alpha, including networking.
-The project design follows best practices that make it possible to edit maps, vehicles, etc, in jMonkeyEngine SDK without having to change the code – This allows 3D graphic designers to contribute models more easily. (If you feel like contributing assets or working on parts of the game code, drop us a note!)
+The project design follows best practices that make it possible to edit maps, vehicles, etc, in jMonkeyEngine SDK without having to change the code ??? This allows 3D graphic designers to contribute models more easily. (If you feel like contributing assets or working on parts of the game code, drop us a note!)
@@ -57,15 +57,15 @@ When a human user or an AI performs an action (presses a button), the actual log
The game uses certain terms that might be familiar to you but maybe used in another way, so heres a quick rundown on the terms being used.
-
Player – Logical human or AI player that can enter entities and generally act, only exists as PlayerData “database” with an id.
+
Player ??? Logical human or AI player that can enter entities and generally act, only exists as PlayerData ???database??? with an id.
-
Entity – Spatial with UserData, a world object like character, vehicle, box or factory. The base form is defined only by a String pointing to the j3o which already has all userdata like hitpoints, speed etc.
+
Entity ??? Spatial with UserData, a world object like character, vehicle, box or factory. The base form is defined only by a String pointing to the j3o which already has all userdata like hitpoints, speed etc.
-
User – Human player using a client
+
User ??? Human player using a client
-
Player Group – Group of players that play together (e.g. one human player and one AI companion per client). For now that's the same as client_id of human player for all AIControl’ed players originating from that client.
+
Player Group ??? Group of players that play together (e.g. one human player and one AI companion per client). For now that's the same as client_id of human player for all AIControl???ed players originating from that client.
-
Client – Computer connected to server
+
Client ??? Computer connected to server
@@ -96,7 +96,7 @@ The gameplay is largely controlled by the ServerGameManager which does gameplay
-Controls attached to Spatials are generally used like an “array of capabilities” that the entity posesses. So when an entity has a VehicleControl its expected to be a vehicle, when its got a CharacterControl its expected to be a character.
+Controls attached to Spatials are generally used like an ???array of capabilities??? that the entity posesses. So when an entity has a VehicleControl its expected to be a vehicle, when its got a CharacterControl its expected to be a character.
Other Controls work completely on their own, like CharacterAnimControl which just uses the CharacterControl of the entity to check if the character is running, jumping etc. and then animates the entity if it has an AnimControl.
@@ -168,7 +168,7 @@ To implement autonomous AI players MonkeyZone uses a system of Commands that are
-The SphereTrigger is a TriggerControl that is also attached to each AI players current entity. It consists of a GhostControl that checks the overlapping entities around the entity its attached to. It can be assigned a command that is checked with every entity entering the SphereTrigger and executed if applicable (e.g. normal “attack enemy” mode).
+The SphereTrigger is a TriggerControl that is also attached to each AI players current entity. It consists of a GhostControl that checks the overlapping entities around the entity its attached to. It can be assigned a command that is checked with every entity entering the SphereTrigger and executed if applicable (e.g. normal ???attack enemy??? mode).
@@ -189,7 +189,7 @@ For each map a navigation mesh is generated that allows the entities to navigate
Networking is realized in the PhysicsSyncManager which we hope to extend to a state where it can serve as a general sync system for physics based network games.
-The sync manager basically puts a timestamp on every message sent from the server and then buffers all arriving messages on the client within a certain time window. This allows to compensate for messages arriving too soon or too late within the constraints of the buffer, a future version might step the clients physics space different to compensate for network delays without “snapping”.
+The sync manager basically puts a timestamp on every message sent from the server and then buffers all arriving messages on the client within a certain time window. This allows to compensate for messages arriving too soon or too late within the constraints of the buffer, a future version might step the clients physics space different to compensate for network delays without ???snapping???.
@@ -310,7 +310,7 @@ Have a look at the code and feel free to ask about it, if you want any new featu
MonkeyZone is hosted at GoogleCode, where you can check out the jMonkeyEngine SDK-ready project via svn:
-
jMonkeyEngine SDK→Team→Subversion→Checkout,
+
jMonkeyEngine SDK???Team???Subversion???Checkout,
Enter the SVN URL
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mouse_picking.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mouse_picking.html
index e3eca7c56..d3b2bd4bb 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mouse_picking.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/mouse_picking.html
@@ -51,7 +51,7 @@ The following example rotates Spatials named "Red Box" or "Blue B
rootNode.collideWith(ray, results);
// Print the results so we see what is going on
for (int i = 0; i < results.size(); i++) {
- // For each “hit”, we know distance, impact point, geometry.
+ // For each ???hit???, we know distance, impact point, geometry.
float dist = results.getCollision(i).getDistance();
Vector3f pt = results.getCollision(i).getContactPoint();
String target = results.getCollision(i).getGeometry().getName();
@@ -115,7 +115,7 @@ The following example rotates Spatials named "Red Box" or "Blue B
rootNode.collideWith(ray, results);
// (Print the results so we see what is going on:)
for (int i = 0; i < results.size(); i++) {
- // (For each “hit”, we know distance, impact point, geometry.)
+ // (For each ???hit???, we know distance, impact point, geometry.)
float dist = results.getCollision(i).getDistance();
Vector3f pt = results.getCollision(i).getContactPoint();
String target = results.getCollision(i).getGeometry().getName();
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 c3c265d01..363a81b6f 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
@@ -212,14 +212,14 @@ You can customize the camera and the viewPort of each view individually. For exa
-You have full control to determine which Nodes the camera can see! It can see the full rootNode…
+You have full control to determine which Nodes the camera can see! It can see the full rootNode???
viewPort1.attachScene(rootNode);
-… or you can give each camera a special node whose content it can see:
+??? or you can give each camera a special node whose content it can see:
viewPort2.attachScene(spookyGhostDetectorNode);
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multithreading.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multithreading.html
index f0bc7e896..e6470e7d9 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multithreading.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/multithreading.html
@@ -215,10 +215,10 @@ private Callable<MyWayList> findWay = new Callable<MyWayList>(
//Read or write data from the scene graph -- via the execution queue:
Vector3f location = application.enqueue(new Callable<Vector3f>() {
- public Vector3f call() throws Exception {
- //we clone the location so we can use the variable safely on our thread
- return mySpatial.getLocalTranslation().clone();
- }
+ ????????public Vector3f call() throws Exception {
+ ????????????????//we clone the location so we can use the variable safely on our thread
+ ????????????????return mySpatial.getLocalTranslation().clone();
+ ????????}
}).get();
// This world class allows safe access via synchronized methods
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 bcf18af60..1330e0eba 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
@@ -127,7 +127,7 @@ Create a com.jme3.network.Client in the simpleInitApp() method and
...
-The server address can be in the format "localhost" or "127.0.0.1" (for local testing), or an IP address of a remote host in the format “123.456.78.9”. In this example, we assume the server is running on the localhost.
+The server address can be in the format "localhost" or "127.0.0.1" (for local testing), or an IP address of a remote host in the format ???123.456.78.9???. In this example, we assume the server is running on the localhost.
@@ -209,7 +209,7 @@ You must register each message type to the com.jme3.network.serializing.Serializ
-After a Message was received, a Listener responds to it. The listener can access fields of the message, and send messages back, start new threads, etc. There are two listeners, one on the server, one on the client. For each message type, you implement the responses in either Listeners’ messageReceived() method.
+After a Message was received, a Listener responds to it. The listener can access fields of the message, and send messages back, start new threads, etc. There are two listeners, one on the server, one on the client. For each message type, you implement the responses in either Listeners??? messageReceived() method.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui.html
index 8599ca8b4..bc738b00b 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui.html
@@ -35,7 +35,7 @@ Learn to add a Nifty GUI to
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_java_interaction.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_java_interaction.html
index 6e06f3e38..7d62673ae 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_java_interaction.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/nifty_gui_java_interaction.html
@@ -139,7 +139,7 @@ Or this is how you respond to an GUI
Add visibleToMouse(true); to the parent element!
-
Embed one of the interact…() elements into the parent element
+
Embed one of the interact???() elements into the parent element
Specify the Java method that you want to call after the interaction.
Example: interactOnClick("startGame(hud)");
@@ -206,7 +206,7 @@ Back in the MyStartScreen class, you specify what the startGame() a
}
-The startGame() example simply switches the GUI to the hud screen when the user clicks Start. Of course, in a real game, you would perform more steps here: Load the game level, switch to in-game input and navigation handling, set a custom running boolean to true, attach custom in-game AppStates – and lots more.
+The startGame() example simply switches the GUI to the hud screen when the user clicks Start. Of course, in a real game, you would perform more steps here: Load the game level, switch to in-game input and navigation handling, set a custom running boolean to true, attach custom in-game AppStates ??? and lots more.
-Work in progress You can "draw" the GUI to the screen by writing Java code – alternatively to using XML. Typically you lay out the static base GUI in XML, and use Java commands if you need to change the GUI dynamically at runtime. In theory, you can also lay out the whole GUI in Java (but we don't cover that here).
+Work in progress You can "draw" the GUI to the screen by writing Java code ??? alternatively to using XML. Typically you lay out the static base GUI in XML, and use Java commands if you need to change the GUI dynamically at runtime. In theory, you can also lay out the whole GUI in Java (but we don't cover that here).
@@ -548,7 +548,7 @@ Our GUI plan asks for two bu
}});
-Note that these controls don't do anything yet – we'll get to that soon.
+Note that these controls don't do anything yet ??? we'll get to that soon.
@@ -558,7 +558,7 @@ Note that these controls don't do anything yet – we'll get to that s
-Nifty additionally offers many customizable controls such as check boxes, text fields, menus, chats, tabs, … See also on the Nifty GUI site.
+Nifty additionally offers many customizable controls such as check boxes, text fields, menus, chats, tabs, ??? See also on the Nifty GUI site.
-Currently you do not have a ScreenController – we will create one in the next exercise. As soon as you have a screen controller, you will use the commented variant of the XML loading method:
+Currently you do not have a ScreenController ??? we will create one in the next exercise. As soon as you have a screen controller, you will use the commented variant of the XML loading method:
nifty.fromXml("Interface/helloworld.xml", "start", new MySettingsScreen());
@@ -332,7 +333,7 @@ Our GUI plan asks for two bu
</panel>
-Note that these controls don't do anything yet – we'll get to that soon.
+Note that these controls don't do anything yet ??? we'll get to that soon.
@@ -342,11 +343,11 @@ Note that these controls don't do anything yet – we'll get to that s
-Nifty additionally offers many customizable controls such as check boxes, text fields, menus, chats, tabs, … See also on the Nifty GUI site.
+Nifty additionally offers many customizable controls such as check boxes, text fields, menus, chats, tabs, ??? See also on the Nifty GUI site.
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/particle_emitters.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/particle_emitters.html
index fb12f109d..2412f7d27 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/particle_emitters.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/particle_emitters.html
@@ -82,8 +82,8 @@ Set both to different colors for a gradient effect (e.g. fire).
How much the direction (setInitialVelocity()) can vary among particles. Use a value between 1 and 0 to create a directed swarm-like cloud of particles.
-1 = Maximum variation, particles emit in random 360° directions (e.g. explosion, butterflies).
-0.5f = particles are emitted within 180° of the initial direction.
+1 = Maximum variation, particles emit in random 360?? directions (e.g. explosion, butterflies).
+0.5f = particles are emitted within 180?? of the initial direction.
0 = No variation, particles fly in a straight line in direction of start velocity (e.g. lasergun blasts).
@@ -131,7 +131,7 @@ Build up you effect by specifying one parameter after the other. If you change s
-Use the common Particle.j3md Material Definition and a texture to specify the shape of the particles. The shape is defined by the texture you provide and can be anything – debris, flames, smoke, mosquitoes, leaves, butterflies… be creative.
+Use the common Particle.j3md Material Definition and a texture to specify the shape of the particles. The shape is defined by the texture you provide and can be anything ??? debris, flames, smoke, mosquitoes, leaves, butterflies??? be creative.
Material flash_mat = new Material(
assetManager, "Common/MatDefs/Misc/Particle.j3md");
@@ -143,7 +143,7 @@ Use the common Particle.j3md Material Definition and a texture to specify the sh
flash.setSelectRandomImage(true);
-The effect texture can be one image, or contain a sprite animation – a series of slightly different pictures in equally spaced rows and columns. If you choose the sprite animation:
+The effect texture can be one image, or contain a sprite animation ??? a series of slightly different pictures in equally spaced rows and columns. If you choose the sprite animation:
Specify the number of rows and columns using setImagesX(2) and setImagesY().
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 d2056e8df..62a690cb4 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
@@ -203,6 +203,20 @@ All non-mesh CollisionShapes can be used for dynamic, kinematic, as well as stat
+On a CollisionShape, you can apply a few properties
+
+
+
+
CollisionShape Method
Property
Examples
+
+
+
setScale(new Vector3f(2f,2f,2f))
You can change the scale of collisionshapes (whether it be, Simple or Mesh). You cannot change the scale of a CompoundCollisionShape however. A sphere collision shape, will change its radius based on the X component of the vector passed in. You must scale a collision shape before attaching it to the physicsSpace, or you must readd it to the physicsSpace each time the scale changes.
Scale a player in the Y axis by 2:
+new Vector3f(1f,2f,1f)
+
+
+
+
+
The mesh-accurate shapes can use a CollisionShapeFactory as constructor (code samples see below).
@@ -217,7 +231,7 @@ The mesh-accurate shapes can use a CollisionShapeFactory as constructor (code sa
-
+
Use for collision and intersection detection between physical objects. A GhostControl itself is non-solid and invisible. GhostControl moves with the Spatial it is attached to. Use GhostControls to implement custom game interactions by adding it to a visible Geometry.
A monster's "aggro radius", CharacterControl collisions, motion detectors, photo-electric alarm sensors, poisonous or radioactive perimeters, life-draining ghosts, etc.
@@ -325,12 +339,12 @@ The following creates a MeshCollisionShape for a whole loaded (static) scene:
gameLevel.addControl(new RigidBodyControl(0.0f)); // explicit zero mass, implicit MeshCollisionShape
-
Spheres and Boxes automatically fall back on the correct default CollisionShape if you do not specify a CollisionShape in the RigidBodyControl constructor. Complex static objects can fall back on MeshCollisionShapes.
+
Spheres and Boxes automatically fall back on the correct default CollisionShape if you do not specify a CollisionShape in the RigidBodyControl constructor. Complex static objects can fall back on MeshCollisionShapes, unless it is a Node, in which case it will become a CompoundCollisionShape containing a MeshCollisionShape
+To change the scale of a PhysicsControl you must change the scale of the collisionshape which belongs to it.
+
+
+
+MeshCollisionShapes can have a scale correctly set, but it only works when being constructed on a geometry (not a node). CompoundCollisionShapes cannot be scaled at this time(the type obtained when creating a CollisionShape from a Node i.e using imported models).
+
+
+
+When you import a model from blender, it often comes as a Node (even if it only contains 1 mesh), which is by de-facto automatically converted to a CompoundCollisionShape. So when you try to scale this it won't work! Below illustrates an example, of how to scale an imported model:
+
+
// Doesn't scale
+// This modified version contains Node -> Geometry (name = "MonkeyHeadGeom")
+Spatial model = assetManager.loadModel("Models/MonkeyHead.j3o"); model.addControl(new RigidBodyControl(0));
+// Won't work as this is now a CompoundCollisionShape containing a MeshCollisionShape
+model.getControl(RigidBodyControl.class).getCollisionShape().setScale(new Vector3f(2, 2, 2));
+bulletAppState.getPhysicsSpace().add(model);
+
+// Works fine
+Spatial model = assetManager.loadModel("Models/MonkeyHead.j3o"); // Same Model
+ // IMPORTANT : You must navigate to the Geometry for this to work
+Geometry geom = ((Geometry) ((Node) model).getChild("MonkeyHeadGeom"));
+geom.addControl(new RigidBodyControl(0));
+// Works great (scaling of a MeshCollisionShape)
+geom.getControl(RigidBodyControl.class).getCollisionShape().setScale(new Vector3f(2, 2, 2));
+bulletAppState.getPhysicsSpace().add(geom);
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.
@@ -446,7 +499,7 @@ This setting has an impact on performance, so use it sparingly.
Brick:
Rubber ball: 1.0f
-
+
On a RigidBodyControl, you can apply the following physical forces:
@@ -467,15 +520,15 @@ On a RigidBodyControl, you can apply the following physical forces:
(See detailed explanation below.)
-
+
-
+
When they collide, Kinematics push dynamic objects, but a dynamic object never pushes a Kinematic.
-
You can hang kinematics up "in mid-air" and attach other PhysicsControls to them using hinges and joints. Picture them as "air hooks" for flying aircraft carriers, floating islands in the clouds, suspension bridges, swings, chains…
+
You can hang kinematics up "in mid-air" and attach other PhysicsControls to them using hinges and joints. Picture them as "air hooks" for flying aircraft carriers, floating islands in the clouds, suspension bridges, swings, chains???
You can use Kinematics to create mobile remote-controlled physical objects, such as moving elevator platforms, flying blimps/airships. You have full control how Kinematics move, they never "fall" or "topple over".
@@ -562,25 +615,25 @@ Use the following methods to move dynamic physical objects.
setAngularVelocity(new Vector3f(0f,0f,1f))
Set the rotational speed of the object; the x, y and z component are the speed of rotation around that axis.
-
applyCentralForce(…)
Move (push) the object once with a certain moment, expressed as a Vector3f.
+
applyCentralForce(???)
Move (push) the object once with a certain moment, expressed as a Vector3f.
-
applyForce(…)
Move (push) the object once with a certain moment, expressed as a Vector3f. Optionally, you can specify where on the object the pushing force hits.
+
applyForce(???)
Move (push) the object once with a certain moment, expressed as a Vector3f. Optionally, you can specify where on the object the pushing force hits.
-
applyTorque(…)
Rotate (twist) the object once around its axes, expressed as a Vector3f.
+
applyTorque(???)
Rotate (twist) the object once around its axes, expressed as a Vector3f.
-
applyImpulse(…)
An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball.
+
applyImpulse(???)
An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball.
-
applyTorqueImpulse(…)
An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball.
+
applyTorqueImpulse(???)
An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball.
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.
@@ -602,7 +655,7 @@ PhysicsControls also support the following advanced features:
Collision Groups are integer bit masks – enums are available in the CollisionObject. All physics objects are by default in COLLISION_GROUP_01. Two objects collide when the collideWithGroups set of one contains the Collision Group of the other. Use this to improve performance by grouping objects that will never collide in different groups (the the engine saves times because it does not need to check on them).
+removeCollideWithGroup(COLLISION_GROUP_01)
Collision Groups are integer bit masks ??? enums are available in the CollisionObject. All physics objects are by default in COLLISION_GROUP_01. Two objects collide when the collideWithGroups set of one contains the Collision Group of the other. Use this to improve performance by grouping objects that will never collide in different groups (the the engine saves times because it does not need to check on them).
setDamping(float, float)
The first value is the linear threshold and the second the angular. This simulates dampening of forces, for example for underwater scenes.
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.
@@ -628,12 +681,12 @@ removeCollideWithGroup(COLLISION_GROUP_01)
Multiple Objects Too Slow? Do not overuse PhysicsControls. Although PhysicsControls are put to “sleep” when they are not moving, creating a world solely out of dynamic physics objects will quickly bring you to the limits of your computer's capabilities.
-Solution: Improve performance by replacing some physical Spatials with non-physical Spatials. Use the non-physical ones for non-solid things for which you do not need to detect collisions – foliage, plants, effects, ghosts, all remote or unreachable objects.
+
Multiple Objects Too Slow? Do not overuse PhysicsControls. Although PhysicsControls are put to ???sleep??? when they are not moving, creating a world solely out of dynamic physics objects will quickly bring you to the limits of your computer's capabilities.
+Solution: Improve performance by replacing some physical Spatials with non-physical Spatials. Use the non-physical ones for non-solid things for which you do not need to detect collisions ??? foliage, plants, effects, ghosts, all remote or unreachable objects.
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().
+
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.
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/physics_listeners.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/physics_listeners.html
index 5e11134f0..31bdbe1fb 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/physics_listeners.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/physics_listeners.html
@@ -150,7 +150,7 @@ If however you want to respond to a collision event (com.jme3.bullet.collision.P
-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:
+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:
@@ -23,11 +23,11 @@ The awesome SeaMonkey WaterFilter is highly configurable. It can render any type
-The effect is part of a deferred rendering process, taking advantage of the pre-computed position buffer and back buffer (a texture representing the screen’s pixels position in view space, and a texture of the rendered scene).
+The effect is part of a deferred rendering process, taking advantage of the pre-computed position buffer and back buffer (a texture representing the screen???s pixels position in view space, and a texture of the rendered scene).
-After some calculation, this allows to reconstruct the position in world space for each pixel on the screen. "If a pixel is under a given water height, let’s render it as a blue pixel!" Blue pixel? Not exactly, we want waves, we want ripples, we want foam, we want reflection and refraction.
+After some calculation, this allows to reconstruct the position in world space for each pixel on the screen. "If a pixel is under a given water height, let???s render it as a blue pixel!" Blue pixel? Not exactly, we want waves, we want ripples, we want foam, we want reflection and refraction.
@@ -49,11 +49,11 @@ There are several ways of reconstructing the world space position of a pixel fro
-Now we have the rendered scene in a texture, and we can reconstruct the position in world space of each pixel. We’re good to go!
+Now we have the rendered scene in a texture, and we can reconstruct the position in world space of each pixel. We???re good to go!
-– Nehon
+??? Nehon
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ragdoll.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ragdoll.html
index f0caa1a92..41518bcb7 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ragdoll.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/ragdoll.html
@@ -18,7 +18,7 @@ The jMonkeyEngine3 has built-in support for (Tip: Click to pull the ragdoll up)
-
– This ragdoll replaces a rigged model of a character in the moment it is "shot" to simulate a collapsing person. (Also note DoF of the limbs.)
+
??? This ragdoll replaces a rigged model of a character in the moment it is "shot" to simulate a collapsing person. (Also note DoF of the limbs.)
-You now have the outline of a person. But if you ran the application now, the individual limbs would fall down independently of one another – the ragdoll is still lacking joints.
+You now have the outline of a person. But if you ran the application now, the individual limbs would fall down independently of one another ??? the ragdoll is still lacking joints.
@@ -201,7 +201,7 @@ Read the documentation,
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/read_graphic_card_capabilites.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/read_graphic_card_capabilites.html
index 31d88acb3..75115007e 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/read_graphic_card_capabilites.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/read_graphic_card_capabilites.html
@@ -11,7 +11,7 @@ When different people test your new game, you may get feedback that the game doe
You can read (and print) the capabilities of the user's graphic card using the com.jme3.renderer.Caps class:
Note: Replace HelloWorld by the name of the class where you are using this line.
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 11a57b759..db3908ca3 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
@@ -77,7 +77,7 @@ The following example overrides simpleInitApp() in SimpleApplicatio
-
Here you see why we save user data inside spatials – so it can be saved and loaded together with the .j3o file. If you have game data outside Spatials, you have to remember to save() and load(), and get() and set() it yourself.
+
Here you see why we save user data inside spatials ??? so it can be saved and loaded together with the .j3o file. If you have game data outside Spatials, you have to remember to save() and load(), and get() and set() it yourself.
@@ -153,11 +153,11 @@ To make a custom class savable:
-
Add one line that read…()s the data to the JmeImport input capsule.
+
Add one line that read???()s the data to the JmeImport input capsule.
On the left side of the assignment, specify the class field that you are restoring
-
On the right side, use the appropriate capsule.read…() method for the data type. Specify the String name of the variable (must be the same as you used in the write() method), and again specify a default value.
+
On the right side, use the appropriate capsule.read???() method for the data type. Specify the String name of the variable (must be the same as you used in the write() method), and again specify a default value.
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 b97f88c63..382fd9846 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
@@ -17,15 +17,15 @@ The simplest type of Meshes are the built-in JME Shapes. You can create Shapes w
-
com.jme3.scene.shape.Box – A cube or cuboid. Single-sided Quad faces (outside only).
+
com.jme3.scene.shape.Box ??? A cube or cuboid. Single-sided Quad faces (outside only).
-
com.jme3.scene.shape.StripBox – A cube or cuboid. Solid filled faces (inside and outside).
+
com.jme3.scene.shape.StripBox ??? A cube or cuboid. Solid filled faces (inside and outside).
-
com.jme3.scene.shape.Cylinder – A disk or pillar.
+
com.jme3.scene.shape.Cylinder ??? A disk or pillar.
-
com.jme3.scene.shape.Sphere – A ball or elipsoid.
+
com.jme3.scene.shape.Sphere ??? A ball or elipsoid.
@@ -35,7 +35,7 @@ The simplest type of Meshes are the built-in JME Shapes. You can create Shapes w
-
com.jme3.scene.shape.Dome – A semi-sphere, e.g. SkyDome.
+
com.jme3.scene.shape.Dome ??? A semi-sphere, e.g. SkyDome.
For a cone, set the Dome's radialSamples>4 and planes=2.
@@ -45,11 +45,11 @@ The simplest type of Meshes are the built-in JME Shapes. You can create Shapes w
-
com.jme3.scene.shape.Torus – An single-holed torus or "donut".
+
com.jme3.scene.shape.Torus ??? An single-holed torus or "donut".
-
com.jme3.scene.shape.PQTorus – A parameterized torus. A PQ-Torus looks like a .
+
com.jme3.scene.shape.PQTorus ??? A parameterized torus. A PQ-Torus looks like a .
-
com.jme3.scene.shape.Surface – A curved surface (called ) described by knots, weights and control points. Compare with shape.Curve.
+
com.jme3.scene.shape.Surface ??? A curved surface (called ) described by knots, weights and control points. Compare with shape.Curve.
@@ -58,11 +58,11 @@ The simplest type of Meshes are the built-in JME Shapes. You can create Shapes w
com.jme3.scene.shape.Quad – A flat 2D rectangle (single-sided, center is in bottom-left corner)
+
com.jme3.scene.shape.Quad ??? A flat 2D rectangle (single-sided, center is in bottom-left corner)
-
com.jme3.scene.shape.Line – A straight 1D line defined by a start and end point.
+
com.jme3.scene.shape.Line ??? A straight 1D line defined by a start and end point.
-
com.jme3.scene.shape.Curve – A curved 1D spline. Compare with shape.Surface.
+
com.jme3.scene.shape.Curve ??? A curved 1D spline. Compare with shape.Surface.
@@ -76,11 +76,11 @@ The simplest type of Meshes are the built-in JME Shapes. You can create Shapes w
Do not mix up these visible com.jme3.shapes with similarly named classes from the com.jme3.math package. Choose the right package when letting your IDE fill in the import statements!
-
com.jme3.math.Line – is invisible, has a direction, goes through a point, infinite length.
+
com.jme3.math.Line ??? is invisible, has a direction, goes through a point, infinite length.
-
com.jme3.math.Ray – is invisible, has a direction and start point, but no end.
+
com.jme3.math.Ray ??? is invisible, has a direction and start point, but no end.
-
com.jme3.math.Spline – is an invisible curve.
+
com.jme3.math.Spline ??? is an invisible curve.
etc
@@ -131,7 +131,7 @@ To add a shape to the scene:
You can compose more complex custom Geometries out of simple Shapes. Think of the buildings in games like Angry Birds, or the building blocks in Second Life ("prims") and in Tetris ("Tetrominos").
-
Create a Node. By default it is located at the origin (0/0/0) – leave the Node there for now.
+
Create a Node. By default it is located at the origin (0/0/0) ??? leave the Node there for now.
Create your shapes and wrap each into a Geometry, as just described.
@@ -144,7 +144,7 @@ You can compose more complex custom Geometries out of simple Shapes. Think of th
-The order is important: First arrange around origin, then transform. Otherwise, transformations are applied around the wrong center (pivot). Of course, you can attach your constellation to other pivot Nodes to create even more complex shapes (a chair, a furnished room, a house, a city, …), but again, arrange them around the origin first before you transform them. Obviously, such composed Geometries are simpler than hand-sculpted meshes from a mesh editor.
+The order is important: First arrange around origin, then transform. Otherwise, transformations are applied around the wrong center (pivot). Of course, you can attach your constellation to other pivot Nodes to create even more complex shapes (a chair, a furnished room, a house, a city, ???), but again, arrange them around the origin first before you transform them. Obviously, such composed Geometries are simpler than hand-sculpted meshes from a mesh editor.
@@ -184,7 +184,7 @@ rootNode.attachChild(geom); // attach geometry to a n
-* Optimization – The GeometryBatchFactory class combines several of your shapes with the same texture into one mesh with one texture.
+* Optimization ??? The GeometryBatchFactory class combines several of your shapes with the same texture into one mesh with one texture.
spatial,
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/sky.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/sky.html
index 7f34dbf27..d968832ca 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/sky.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/sky.html
@@ -89,7 +89,7 @@ Box or Sphere?
-
If you have access to sphere map textures – specially projected sky images that fit inside a sphere – then you use a SkySphere or SkyDome.
+
If you have access to sphere map textures ??? specially projected sky images that fit inside a sphere ??? then you use a SkySphere or SkyDome.
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 2eaec2e26..86d022c69 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
@@ -43,7 +43,7 @@ In your Java code, a Spatial is either an instance of com.jme3.scene.Node<
Visibility:
A Geometry represents a visible 3D object in the scene graph.
A Node is an invisible "handle" for a group of Spatials in the scene graph.
-
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.
+
Purpose:
Use Geometries to represent an object's look: Every Geometry contains a polygon mesh and a material, specifying its shape, color, texture, and opacity/transparency.
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).
@@ -53,10 +53,10 @@ mesh and material;
Transformations; custom user data;
no mesh, no material.
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 create either a com.jme3.scene.Node or com.jme3.scene.Geometry instance. Some methods, however, require a Spatial type 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.
@@ -64,7 +64,7 @@ no mesh, no material.
-You can include custom user data –that is, custom Java objects and methods– in Nodes and Geometries. This is very useful for maintaining information about a game element, such as health, budget, ammunition, inventory, equipment, etc for players, or landmark locations for terrains, and much more.
+You can include custom user data ???that is, custom Java objects and methods??? in Nodes and Geometries. This is very useful for maintaining information about a game element, such as health, budget, ammunition, inventory, equipment, etc for players, or landmark locations for terrains, and much more.
@@ -171,7 +171,7 @@ This is how you list all data keys that are already defined for one Spatial:
}
-There are two types of colling: Face culling, and view frustrum culling.
+There are two types of culling: Face culling, and view frustrum culling.
@@ -212,13 +212,13 @@ There are two types of colling: Face culling, and view frustrum culling.
You can switch the com.jme3.material.RenderState.FaceCullMode to
-
FaceCullMode.Back (default) – only the frontsides of a mesh are drawn. This is the normal behaviour.
+
FaceCullMode.Back (default) ??? only the frontsides of a mesh are drawn. This is the normal behaviour.
-
FaceCullMode.Front – only the backsides of meshes are drawn. The mesh will probably turn invisible. Useful if you are debugging a hand-made mesh and try to identify accidental inside-out faces.
+
FaceCullMode.Front ??? only the backsides of meshes are drawn. The mesh will probably turn invisible. Useful if you are debugging a hand-made mesh and try to identify accidental inside-out faces.
-
FaceCullMode.FrontAndBack – The mesh becomes invisible.
+
FaceCullMode.FrontAndBack ??? The mesh becomes invisible.
-
FaceCullMode.Off – Every side of the mesh is drawn. Looks normal, but slows down large scenes.
+
FaceCullMode.Off ??? Every side of the mesh is drawn. Looks normal, but slows down large scenes.
-View frustum culling refers to not drawing (and not even calculating) certain whole models in the scene. At any given moment, half of the scene is behind the player and out of sight anyway. View frustum culling is an optimization to not calculate scene elements that are not visible – elements that are "outside the view frustrum".
+View frustum culling refers to not drawing (and not even calculating) certain whole models in the scene. At any given moment, half of the scene is behind the player and out of sight anyway. View frustum culling is an optimization to not calculate scene elements that are not visible ??? elements that are "outside the view frustrum".
The decision what is visible and what not, is done automatically by the engine (CullHint.Dynamic). Optionally, you can manually control whether the engine culls individual spatials (and children) from the scene graph:
-
CullHint.Dynamic – Default, faster because it doesn't waste time with objects that are out of view.
+
CullHint.Dynamic ??? Default, faster because it doesn't waste time with objects that are out of view.
-
CullHint.Never – Calculate and draw everything always (even if it does not end up on the user's screen because it's out of sight). Slower, but can be used while debugging custom meshes.
+
CullHint.Never ??? Calculate and draw everything always (even if it does not end up on the user's screen because it's out of sight). Slower, but can be used while debugging custom meshes.
-
CullHint.Always – The whole spatial is culled and is not visible. A fast way to hide a Spatial temporarily. Culling a Spatial is faster then detaching it, but it uses more memory.
+
CullHint.Always ??? The whole spatial is culled and is not visible. A fast way to hide a Spatial temporarily. Culling a Spatial is faster then detaching it, but it uses more memory.
-
CullHint.Inherit – Inherit culling behaviour from parent node.
+
CullHint.Inherit ??? Inherit culling behaviour from parent node.
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/swing_canvas.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/swing_canvas.html
index a8a423336..46c7f135d 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/swing_canvas.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/swing_canvas.html
@@ -15,7 +15,7 @@ This can be useful when you create some sort of interactive 3D viewer with a use
You can use Swing components (frame, panels, menus, controls) next to your jME3 game.
-
The NetBeans GUI builder is compatible with the jMonkeyEngine; you can use it it to lay out the Swing GUI frame, and then add() the jME canvas into it. Install the GUI builder via Tools → Plugins → Available Plugins.
+
The NetBeans GUI builder is compatible with the jMonkeyEngine; you can use it it to lay out the Swing GUI frame, and then add() the jME canvas into it. Install the GUI builder via Tools ??? Plugins ??? Available Plugins.
@@ -79,7 +79,7 @@ In the SwingCanvasTest's main() method, create a queued runnable(). It will
-
Note that you have to use app.enqueue() when modifying objects in the scene from the AWT Event Queue like you have to use java.awt.EventQueue.invokeLater() from other threads (e.g. the update loop) when changing swing elements. This can get hairy quickly if you don’t have a proper threading model planned so you might want to use NiftyGUI as it is embedded in the update loop thread and is also cross-platform compatible (e.g. android etc.).
+
Note that you have to use app.enqueue() when modifying objects in the scene from the AWT Event Queue like you have to use java.awt.EventQueue.invokeLater() from other threads (e.g. the update loop) when changing swing elements. This can get hairy quickly if you don???t have a proper threading model planned so you might want to use NiftyGUI as it is embedded in the update loop thread and is also cross-platform compatible (e.g. android etc.).
-We create a standard JPanel inside the JFrame. Give it any Layout you wish – here we use a simple Flow Layout. Where the code sample says "Some Swing Component", this is where you add your buttons and controls.
+We create a standard JPanel inside the JFrame. Give it any Layout you wish ??? here we use a simple Flow Layout. Where the code sample says "Some Swing Component", this is where you add your buttons and controls.
The important step is to add() the canvas component into the panel, like all the other Swing components.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain.html
index 84487f420..2868d86aa 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/terrain.html
@@ -125,7 +125,7 @@ When you "slap" a texture on a mesh, the whole mesh looks the same. Fo
-The default material for TerraMonkey is TerrainLighting.j3md. This material combines several texture maps to produce the final custom texture. Remember, Diffuse Maps are the main textures that define the look; optionally, each Diffuse Map can be enhanced with a Normal Map; Alpha Maps describe the opacity of each Diffuse Map used (one color –red, green, blue, or alpha– stands for one Diffuse Map's opacity); Glow and Specular Maps define optional effects.
+The default material for TerraMonkey is TerrainLighting.j3md. This material combines several texture maps to produce the final custom texture. Remember, Diffuse Maps are the main textures that define the look; optionally, each Diffuse Map can be enhanced with a Normal Map; Alpha Maps describe the opacity of each Diffuse Map used (one color ???red, green, blue, or alpha??? stands for one Diffuse Map's opacity); Glow and Specular Maps define optional effects.
@@ -163,7 +163,7 @@ Here are the names of TerrainLighting.j3md's material properties:
DiffuseMap_4, DiffuseMap_4_scale, NormalMap_4
-
…
+
???
DiffuseMap_11, DiffuseMap_11_scale, NormalMap_11
@@ -243,7 +243,7 @@ You can hand-paint Alpha, Diffuse, Glow, and Specular maps in a drawing program,
-This example shows the simpler material definition Terrain.j3md, which only supports 1 Alpha Map, 3 Diffuse Maps, 3 Normal Maps, and does not support Phong illumination. It makes the exmaple shorter – TerrainLighting.j3md works accordingly (The list of material properties see above. Links to extended sample code see above.)
+This example shows the simpler material definition Terrain.j3md, which only supports 1 Alpha Map, 3 Diffuse Maps, 3 Normal Maps, and does not support Phong illumination. It makes the exmaple shorter ??? TerrainLighting.j3md works accordingly (The list of material properties see above. Links to extended sample code see above.)
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 96e65c45a..fbcc2f406 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
@@ -205,7 +205,7 @@ public class HelloTerrainCollision extends SimpleApplication
}
-To try this code, create a New Project → JME3 → BasicGame using the default settings. Paste the sample code over the pregenerated Main.java class. Chnage the package to "mygame" if necessary. Open the Project Properties, Libraries, and add the jme3-test-data library to make certain you have all the files.
+To try this code, create a New Project ??? JME3 ??? BasicGame using the default settings. Paste the sample code over the pregenerated Main.java class. Chnage the package to "mygame" if necessary. Open the Project Properties, Libraries, and add the jme3-test-data library to make certain you have all the files.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/update_loop.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/update_loop.html
index bda54b91d..8a002ac6e 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/update_loop.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/update_loop.html
@@ -15,19 +15,19 @@ Some usage examples: Here you remote-control NPCs (computer controlled character
To let you see the main update loop in context, understand that the SimpleApplication does the following:
@@ -37,7 +37,7 @@ To let you see the main update loop in context, understand that the SimpleApplic
Scene rendering.
-
User code rendering – Execute simpleRender() method.
+
User code rendering ??? Execute simpleRender() method.
@@ -45,7 +45,7 @@ To let you see the main update loop in context, understand that the SimpleApplic
-
Quit – If user requests exit(), execute cleanup() and destroy().
+
Quit ??? If user requests exit(), execute cleanup() and destroy().
The jME window closes and the loop ends.
@@ -57,7 +57,7 @@ The jME window closes and the loop ends.
-In a trivial SimpleApplication (such as a Hello World tutorial), all code is either in the simpleInitApp() (initialization) or simpleUpdate() (behaviour) method – or in a helper method/class that is called from one of these two. This trivial approach will make your main class very long, hard to read, and hard to maintain. You don't need to load the whole scene at once, and you don't need to run all conditionals tests all the time.
+In a trivial SimpleApplication (such as a Hello World tutorial), all code is either in the simpleInitApp() (initialization) or simpleUpdate() (behaviour) method ??? or in a helper method/class that is called from one of these two. This trivial approach will make your main class very long, hard to read, and hard to maintain. You don't need to load the whole scene at once, and you don't need to run all conditionals tests all the time.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/vehicles.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/vehicles.html
index b70f7b472..3cc321bb0 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/vehicles.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/vehicles.html
@@ -126,7 +126,7 @@ Finally we add the behaviour (VehicleControl) to the visible Geometry (node).
vehicleNode.addControl(vehicle);
-We configure the physical properties of the vehicle's suspension: Compresion, Damping, Stiffness, and MaxSuspenionForce. Picking workable values for the wheel suspension can be tricky – for background info have a look at these . For now, let's work with the following values:
+We configure the physical properties of the vehicle's suspension: Compresion, Damping, Stiffness, and MaxSuspenionForce. Picking workable values for the wheel suspension can be tricky ??? for background info have a look at these . For now, let's work with the following values:
float stiffness = 60.0f;//200=f1 car
float compValue = .3f; //(should be lower than damp)
@@ -154,17 +154,17 @@ We create four wheel Geometries and add them to the vehicle. Our wheel geometrie
The addWheel() method sets following properties:
-
Vector3f connectionPoint – Coordinate where the suspension connects to the chassis (internally, this is where the Ray is casted downwards).
+
Vector3f connectionPoint ??? Coordinate where the suspension connects to the chassis (internally, this is where the Ray is casted downwards).
-
Vector3f direction – Wheel direction is typically a (0,-1,0) vector.
+
Vector3f direction ??? Wheel direction is typically a (0,-1,0) vector.
-
Vector3f axle – Axle direction is typically a (-1,0,0) vector.
+
Vector3f axle ??? Axle direction is typically a (-1,0,0) vector.
-
float suspensionRestLength – Suspension rest length in world units
+
float suspensionRestLength ??? Suspension rest length in world units
-
float wheelRadius – Wheel radius in world units
+
float wheelRadius ??? Wheel radius in world units
-
boolean isFrontWheel – Whether this wheel is one of the steering wheels.
+
boolean isFrontWheel ??? Whether this wheel is one of the steering wheels.
Front wheels are the ones that rotate visibly when the vehicle turns.
@@ -187,7 +187,7 @@ We create a Cylinder mesh shape that we use to create the four visible wheel geo
-For each wheel, we create a Node and a Geometry. We attach the Cylinder Geometry to the Node. We rotate the wheel by 90° around the Y axis. We set a material to make it visible. Finally we add the wheel (plus its properties) to the vehicle.
+For each wheel, we create a Node and a Geometry. We attach the Cylinder Geometry to the Node. We rotate the wheel by 90?? around the Y axis. We set a material to make it visible. Finally we add the wheel (plus its properties) to the vehicle.
Node node1 = new Node("wheel 1 node");
Geometry wheels1 = new Geometry("wheel 1", wheelMesh);
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/walking_character.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/walking_character.html
index c8f25ac78..5829390ba 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/walking_character.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/advanced/walking_character.html
@@ -21,11 +21,7 @@ Other games however require a third-person perspective of the character: In thes
Several related code samples can be found here:
-
(third-person view)
-
-
Uses also
-
-
+
(third-person view)
(third-person view)
@@ -42,10 +38,11 @@ Several related code samples can be found here:
The code in this tutorial is a combination of these samples.
+
@@ -101,19 +98,19 @@ Default: 1, because for characters and vehicles, up is typically along the Y axi
Use setWalkDirection(Vector3f.ZERO) to stop a directional motion.
-
+
For best practices on how to use setWalkDirection(), see the Navigation Inputs example below.
public class WalkingCharacterDemo extends SimpleApplication
@@ -135,7 +132,7 @@ For best practices on how to use setWalkDirection(), see the Naviga
public void onAnimChange(AnimControl control, AnimChannel channel, String animName) { }
\ 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 11f064e5c..49d68d1cf 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
@@ -59,7 +59,7 @@ To achieve a water effect, JME3 uses shaders and a special material, Commo
-
(For the underwater caustics effect, we use splatted textures. – WIP/TODO)
+
(For the underwater caustics effect, we use splatted textures. ??? WIP/TODO)
-You can offer a switch to set the water Material to a static texture – for users with slow PCs.
+You can offer a switch to set the water Material to a static texture ??? for users with slow PCs.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/android.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/android.html
index 4939f7679..5e73690f2 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/android.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/android.html
@@ -23,7 +23,7 @@ This is a draft of a feature that is work in progress. If you have questions or
(Optional) Install NBAndroid in the jMonkeyEngine SDK:
-
Go to Tools→Plugins→Available Plugins.
+
Go to Tools???Plugins???Available Plugins.
Install the "Android" plugin.
@@ -199,9 +199,9 @@ During build, the libraries and main jar file from the main project are copied t
Activating the nbandroid plugin in the jMonkeyEngine SDK is optional, but recommended. You do not need the nbandroid plugin for Android support to work, however nbandroid will not interfere and will in fact allow you to edit the android source files and project more conveniently. To be able to edit, extend and code android-specific code in Android projects, install NBAndroid from the update center:
-
Open Tools→Plugins→Settings
+
Open Tools???Plugins???Settings
-
Go to Tools→Plugins→Available Plugins.
+
Go to Tools???Plugins???Available Plugins.
Install the NbAndroid plugin. (Will show up as Android)
@@ -220,7 +220,7 @@ Activating the nbandroid plugin in the jMonkeyEngine SDK
Inputs: Devise an alternate control scheme that works for Android users (e.g. using com.jme3.input.controls.TouchListener). This mobile scheme is likely quite different from the desktop scheme.
-
Effects: Android devices do no support 3D features as well as PCs – or even not at all. This restriction includes post-processor filters (depth-of-field blur, bloom, light scattering, cartoon, etc), drop shadows, water effects, 3D Audio. Be prepared that these effects will (at best) slow down the application or (in the worst case) not work at all. Provide the option to switch to a low-fi equivalent!
+
Effects: Android devices do no support 3D features as well as PCs ??? or even not at all. This restriction includes post-processor filters (depth-of-field blur, bloom, light scattering, cartoon, etc), drop shadows, water effects, 3D Audio. Be prepared that these effects will (at best) slow down the application or (in the worst case) not work at all. Provide the option to switch to a low-fi equivalent!
Nifty GUI: Use different base UI layout XML files for the mobile version of your app to account for a different screen resolution.
@@ -280,11 +280,13 @@ Note that you have to build the whole project once to make (new) classes in the
-
+There be no proper guidanceof runing on androidf
The SDK will later provide tools to adapt the material and other graphics settings of the Android deployment version automatically.
+
+
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 7cf686bd2..05454e969 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
@@ -288,7 +288,7 @@ Make a mouse click trigger another animation sequence!
-Open the skeleton.xml file in a text editor of your choice. You don't have to be able to read or write these xml files (Blender does that for you) – but it is good to know how skeletons work. "There's no magic to it!"
+Open the skeleton.xml file in a text editor of your choice. You don't have to be able to read or write these xml files (Blender does that for you) ??? but it is good to know how skeletons work. "There's no magic to it!"
Note how the bones are numbered and named. All names of animated models follow a naming scheme.
@@ -17,12 +17,12 @@ In this tutorial we will learn to load 3-D models and text into the scene graph,
-
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.
+
Trouble finding the files to run this sample? To get the assets (3D models) used in this example, add the included jme3-test-data.jar to your classpath. In project created with the jMonkeyEngine SDK (recommended), simply right-click your project, choose "Properties", go to "Libraries", press "Add Library" and add the preconfigured "jme3-test-data" library.
-JME3 comes with a handy asset manager that helps you keep your assets organized. Project assets are media files such as models, materials, textures, scenes, shaders, sounds, and fonts.
-The Asset manager can load files from:
+By game assets we mean all multi-media files, such as models, materials, textures, whole scenes, custom shaders, music and sound files, and custom fonts. JME3 comes with a handy AssetManager object that helps you access your assets.
+The AssetManager can load files from:
the current classpath (the top level of your project directory),
the assets directory of your project, and
-
optionally, custom paths.
+
optionally, custom paths that you register.
-This is our recommended directory structure for storing assets:
+The following is the recommended directory structure for storing assets in your project directoy:
MyGame/assets/Interface/
MyGame/assets/MatDefs/
@@ -123,16 +123,16 @@ MyGame/assets/Scenes/
MyGame/assets/Shaders/
MyGame/assets/Sounds/
MyGame/assets/Textures/
-MyGame/build.xml
-MyGame/src/...
+MyGame/build.xml <-- Ant build script
+MyGame/src/... <-- Java sources go here
MyGame/...
-This is just a suggested best practice, you can name the directories in the assets directory what ever you like.
+This is just a suggested best practice, and it's what you get by default when creating a new Java project in the jMokeyEngine SDK. You can create an assets directory and technically name the subdirectories whatever you like.
-This example displays the text "Hello World" in the default font at the bottom edge of the window. You attach text to the guiNode – this is a special node for flat (orthogonal) display elements. You display text to show the game score, player health, etc.
+This example displays the text "Hello World" in the default font at the bottom edge of the window. You attach text to the guiNode ??? this is a special node for flat (orthogonal) display elements. You display text to show the game score, player health, etc.
The following code sample goes into the simpleInitApp() method.
// Display a line of text with a default font
@@ -179,7 +179,7 @@ guiNode.attachChild(helloText);
-Note that you do no need to create a Material if you exported the model with a material. Remember to add a light source, as shown, otherwise the material (and the whole model) is not visible!
+Note that you do not need to create a Material if you exported the model with a material. Remember to add a light source, as shown, otherwise the material (and the whole model) is not visible!
\ 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 fd70259d3..2528d898a 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
@@ -116,7 +116,7 @@ When you run the sample, you should see a blue cube. You should hear a nature-li
-In the initSimpleApp() method, you create a simple blue cube geometry called player and attach it to the scene – this just arbitrary sample content, so you see something when running the audio sample.
+In the initSimpleApp() method, you create a simple blue cube geometry called player and attach it to the scene ??? this just arbitrary sample content, so you see something when running the audio sample.
@@ -176,11 +176,15 @@ Here you make audio_nature a positional sound that comes from a certain place. F
...
-Tip: Attach AudioNodes to the rootNode like all nodes, to make certain moving nodes stay up-to-date. If you don't attach them, they are still audible and you don't get an error message. But 3D sound will not work as expected if the nodes are not updated regularly.
+Tip: Attach AudioNodes into the scene graph like all nodes, to make certain moving nodes stay up-to-date. If you don't attach them, they are still audible and you don't get an error message but 3D sound will not work as expected. AudioNodes can be attached directly to the root node or they can be attached inside a node that is moving through the scene and both the AudioNode and the 3d position of the sound it is generating will move accordingly.
+
+
+
+Tip: playInstance always plays the sound from the position of the AudioNode so multiple gunshots from one gun (for example) can be generated this way, however if multiple guns are firing at once then an AudioNode is needed for each one.
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_collision.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_collision.html
index 3df89f1e4..4909f341d 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_collision.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_collision.html
@@ -249,7 +249,7 @@ As usual, you initialize the game in the simpleInitApp() method.
The auxiliary method setUpLights() adds your light sources.
-
The auxiliary method setUpKeys() configures input mappings–we will look at it later.
+
The auxiliary method setUpKeys() configures input mappings???we will look at it later.
@@ -273,7 +273,7 @@ For the scene, you load the sceneModel from a zip file, and adjust
sceneModel.setLocalScale(2f);
-The file town.zip is included as a sample model in the JME3 sources – you can . (Optionally, use any OgreXML scene of your own.) For this sample, place the zip file in the application's top level directory (that is, next to src/, assets/, build.xml).
+The file town.zip is included as a sample model in the JME3 sources ??? you can . (Optionally, use any OgreXML scene of your own.) For this sample, place the zip file in the application's top level directory (that is, next to src/, assets/, build.xml).
CollisionShape sceneShape =
CollisionShapeFactory.createMeshShape((Node) sceneModel);
@@ -307,7 +307,7 @@ To use collision detection, you add a RigidBodyControl to the sceneModel
-A first-person player is typically invisible. When you use the default flyCam as first-person cam, it does not even test for collisons and runs through walls. This is because the flyCam control does not have any physical shape assigned. In this code sample, you represent the first-person player as an (invisible) physical shape. You use the WASD keys to steer this physical shape around, while the physics engine manages for you how it walks along solid walls and on solid floors and jumps over solid obstacles. Then you simply make the camera follow the walking shape's location – and you get the illusion of being a physical body in a solid environment seeing through the camera.
+A first-person player is typically invisible. When you use the default flyCam as first-person cam, it does not even test for collisons and runs through walls. This is because the flyCam control does not have any physical shape assigned. In this code sample, you represent the first-person player as an (invisible) physical shape. You use the WASD keys to steer this physical shape around, while the physics engine manages for you how it walks along solid walls and on solid floors and jumps over solid obstacles. Then you simply make the camera follow the walking shape's location ??? and you get the illusion of being a physical body in a solid environment seeing through the camera.
@@ -349,7 +349,7 @@ Apart from step height and character size, the CharacterControl let
-Finally we put the player in its starting position and update its state – remember to use setPhysicsLocation() instead of setLocalTranslation() now, since you are dealing with a physical object.
+Finally we put the player in its starting position and update its state ??? remember to use setPhysicsLocation() instead of setLocalTranslation() now, since you are dealing with a physical object.
@@ -365,7 +365,7 @@ Remember, in physical games, you must register all solid objects (usually the ch
bulletAppState.getPhysicsSpace().add(player);
-The invisible body of the character just sits there on the physical floor. It cannot walk yet – you will deal with that next.
+The invisible body of the character just sits there on the physical floor. It cannot walk yet ??? you will deal with that next.
@@ -379,7 +379,7 @@ The default camera controller cam is a third-person camera. JME3 al
-However, you must redefine how walking (camera movement) is handled for physics-controlled objects: When you navigate a non-physical node (e.g. the default flyCam), you simply specify the target location. There are no tests that prevent the flyCam from getting stuck in a wall! When you move a PhysicsControl, you want to specify a walk direction instead. Then the PhysicsSpace can calculate for you how far the character can actually move in the desired direction – or whether an obstacle prevents it from going any further.
+However, you must redefine how walking (camera movement) is handled for physics-controlled objects: When you navigate a non-physical node (e.g. the default flyCam), you simply specify the target location. There are no tests that prevent the flyCam from getting stuck in a wall! When you move a PhysicsControl, you want to specify a walk direction instead. Then the PhysicsSpace can calculate for you how far the character can actually move in the desired direction ??? or whether an obstacle prevents it from going any further.
@@ -409,7 +409,7 @@ In the simpleInitApp() method, you re-configure the familiar WASD i
}
-You can move this block of code into an auxiliary method setupKeys() and call this method from simpleInitApp()– to keep the code more readable.
+You can move this block of code into an auxiliary method setupKeys() and call this method from simpleInitApp()??? to keep the code more readable.
@@ -521,7 +521,7 @@ Related info:
To learn more about complex physics scenes, where several mobile physical objects bump into each other, read Hello Physics.
-
FYI, there are simpler collision detection solutions without physics, too. Have a look at (and SphereMotionAllowedListener.java).
+
FYI, there are simpler collision detection solutions without physics, too. Have a look at .
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 d7d9ade58..d4f45fae6 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
@@ -247,7 +247,7 @@ For fire, is's a gradient from yellow to red.
-Create a grayscale texture in a graphic editor, and save it to your assets/Effects directory. If you split up one image file into x*y animation steps, make sure each square is of equal size–just as you see in the examples here.
+Create a grayscale texture in a graphic editor, and save it to your assets/Effects directory. If you split up one image file into x*y animation steps, make sure each square is of equal size???just as you see in the examples here.
@@ -264,11 +264,11 @@ A particle system is always centered around an emitter.
Use the setShape() method to change the EmitterShape:
-
EmitterPointShape(Vector3f.ZERO) – particles emit from a point (default)
+
EmitterPointShape(Vector3f.ZERO) ??? particles emit from a point (default)
-
EmitterSphereShape(Vector3f.ZERO,2f) – particles emit from a sphere-sized area
+
EmitterSphereShape(Vector3f.ZERO,2f) ??? particles emit from a sphere-sized area
-
EmitterBoxShape(new Vector3f(-1f,-1f,-1f),new Vector3f(1f,1f,1f)) – particles emit from a box-sized area
+
EmitterBoxShape(new Vector3f(-1f,-1f,-1f),new Vector3f(1f,1f,1f)) ??? particles emit from a box-sized area
@@ -366,7 +366,7 @@ You have learned that many different effects can be created by changing the para
-Now you move on to another exciting chapter – the simulation of . Let's shoot some cannon balls at a brick wall!
+Now you move on to another exciting chapter ??? the simulation of . Let's shoot some cannon balls at a brick wall!
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 65dc18e69..3d03393b5 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
@@ -168,7 +168,7 @@ Now you need to register your trigger mappings.
inputManager.addListener(analogListener, new String[]{"Left", "Right", "Rotate"});
-This code goes into the simpleInitApp() method. But since we will likely add many keybindings, we extract these lines and wrap them in an auxiliary method, initKeys(). The initKeys() method is not part of the Input Controls interface – you can name it whatever you like. Just don't forget to call your method from the initSimpleApp() method.
+This code goes into the simpleInitApp() method. But since we will likely add many keybindings, we extract these lines and wrap them in an auxiliary method, initKeys(). The initKeys() method is not part of the Input Controls interface ??? you can name it whatever you like. Just don't forget to call your method from the initSimpleApp() method.
@@ -301,7 +301,7 @@ In order to see the total time that a key has been pressed for then the incoming
-Mappings registered to the ActionListener are digital either-or actions – "Pressed or released? On or off?"
+Mappings registered to the ActionListener are digital either-or actions ??? "Pressed or released? On or off?"
Parameters:
@@ -318,7 +318,7 @@ Mappings registered to the ActionListener are digital either-or
-Tip: It's very common that you want an action to be only triggered once, in the moment when the key is released. For instance when opening a door, flipping a boolean state, or picking up an item. To achieve that, you use an ActionListener and test for … && !keyPressed. For an example, look at the Pause button code:
+Tip: It's very common that you want an action to be only triggered once, in the moment when the key is released. For instance when opening a door, flipping a boolean state, or picking up an item. To achieve that, you use an ActionListener and test for ??? && !keyPressed. For an example, look at the Pause button code:
if (name.equals("Pause") && !keyPressed) {
isRunning = !isRunning;
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 61e73f22a..d764d91b2 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
@@ -71,7 +71,7 @@ Compared to our previous code samples you note that the player Geometry is now a
-Now have a closer look at the simpleUpdate() method – this is the update loop.
+Now have a closer look at the simpleUpdate() method ??? this is the update loop.
The player.rotate(0, 2*tpf, 0); line changes the rotation of the player object.
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 c7c926770..97a15a51e 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
@@ -109,11 +109,11 @@ public class HelloMaterial extends SimpleApplication {
You should see
-
Left – A cube with a brown monkey texture.
+
Left ??? A cube with a brown monkey texture.
-
Middle – A translucent monkey picture in front of a shiny rock.
+
Middle ??? A translucent monkey picture in front of a shiny rock.
-
Right – A cube with a purple monkey texture.
+
Right ??? A cube with a purple monkey texture.
@@ -128,7 +128,7 @@ Move around with the WASD keys to have a closer look at the translucency, and th
-Typically you want to give objects in your scene textures: It can be rock, grass, brick, wood, water, metal, paper… A texture is a normal image file in JPG or PNG format. In this example, you create a box with a simple unshaded Monkey texture as material.
+Typically you want to give objects in your scene textures: It can be rock, grass, brick, wood, water, metal, paper??? A texture is a normal image file in JPG or PNG format. In this example, you create a box with a simple unshaded Monkey texture as material.
/** A simple textured cube. */
Box boxshape1 = new Box(new Vector3f(-3f,1.1f,0f), 1f,1f,1f);
@@ -219,7 +219,7 @@ The ColorMap is the material layer where textures go. This
+
\ No newline at end of file
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_node.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_node.html
index 8822a7ae0..3e8a482db 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_node.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_node.html
@@ -152,7 +152,7 @@ Every JME3 application has a rootNode: Your game automatically inherits the Purpose:
A Geometry stores an object's looks.
A Node groups Geometries and other Nodes together.
-
Examples:
A box, a sphere, a player, a building, a piece of terrain, a vehicle, missiles, NPCs, etc…
The rootNode, a floor node grouping several terrains, a custom vehicle-with-passengers node, a player-with-weapon node, an audio node, etc…
+
Examples:
A box, a sphere, a player, a building, a piece of terrain, a vehicle, missiles, NPCs, etc???
The rootNode, a floor node grouping several terrains, a custom vehicle-with-passengers node, a player-with-weapon node, an audio node, etc???
@@ -169,7 +169,7 @@ What happens in the code snippet? You use the simpleInitApp() metho
You create the first box Geometry.
-
Create a Box shape with a radius of (1,1,1), that makes the box 2x2x2 world units big.
+
Create a Box shape with extents of (1,1,1), that makes the box 2x2x2 world units big.
Position the box at (1,-1,1) using the move() method. (Don't change the Vector3f.ZERO unless you want to change the center of rotation)
@@ -238,14 +238,14 @@ If you run the app with only the code up to here, you see two cubes: A red cube
Rotate the pivot node.
pivot.rotate( 0.4f , 0.4f , 0.0f );
- If you run the app now, you see two boxes on top of each other – both tilted at the same angle.
+ If you run the app now, you see two boxes on top of each other ??? both tilted at the same angle.
@@ -324,7 +324,7 @@ To move a Spatial to specific coordinates, such as (0,40.2f,-2), use: <
+right -left
+up -down
+forward -backward
-
+
Scaling resizes Spatials
X-axis
Y-axis
Z-axis
@@ -336,13 +336,13 @@ To scale a Spatial 10 times longer, one tenth the height, and keep the same widt
length
height
width
-
+
Rotation turns Spatials
X-axis
Y-axis
Z-axis
3-D rotation is a bit tricky (learn details here). In short: You can rotate around three axes: Pitch, yaw, and roll. You can specify angles in degrees by multiplying the degrees value with FastMath.DEG_TO_RAD.
-To roll an object 180° around the z axis:
Tip: If your game idea calls for a serious amount of rotations, it is worth looking into quaternions, a data structure that can combine and store rotations efficiently.
@@ -352,9 +352,9 @@ To roll an object 180° around the z axis:
@@ -415,11 +415,11 @@ To read this Node's id number elsewhere, you would use:
-By using different Strings keys (here the key is pivot id), you can get and set several values for whatever data the Spatial needs to carry. When you start writing your game, you might add a fuel value to a car node, speed value to an airplane node, or number of gold coins to a player node, and much more.
+By using different Strings keys (here the key is pivot id), you can get and set several values for whatever data the Spatial needs to carry. When you start writing your game, you might add a fuel value to a car node, speed value to an airplane node, or number of gold coins to a player node, and much more. However, one should note that only custom objects that implements Savable can be passed.
\ 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 1f506ffe3..081384713 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
@@ -15,17 +15,17 @@ Do you remember the
+
@@ -502,13 +502,13 @@ This code sample does the following:
Let's have a quick look at the custom helper methods:
-
initMaterial() – This method initializes all the materials we use in this demo.
+
initMaterial() ??? This method initializes all the materials we use in this demo.
-
initWall() – A double loop that generates a wall by positioning brick objects: 15 rows high with 6 bricks per row. It's important to space the physical bricks so they do not overlap.
+
initWall() ??? A double loop that generates a wall by positioning brick objects: 15 rows high with 6 bricks per row. It's important to space the physical bricks so they do not overlap.
-
initCrossHairs() – This method simply displays a plus sign that you use as crosshairs for aiming. Note that screen elements such as crosshairs are attached to the guiNode, not the rootNode!
+
initCrossHairs() ??? This method simply displays a plus sign that you use as crosshairs for aiming. Note that screen elements such as crosshairs are attached to the guiNode, not the rootNode!
-
initInputs() – This method sets up the click-to-shoot action.
+
initInputs() ??? This method sets up the click-to-shoot action.
@@ -518,7 +518,7 @@ These methods are each called once from the simpleInitApp() method
@@ -617,7 +617,7 @@ Fill your scene with walls, bricks, and cannon balls. When do you begin to see a
-Popular AAA games use a clever mix of physics, animation and prerendered graphics to give you the illusion of a real, "physical" world. Think of your favorite video games and try to spot where and how the game designers trick you into believing that the whole scene is physical. For example, think of a building "breaking" into 4-8 parts after an explosion. The pieces most likely fly on predefined (so called kinematic) paths and are only replaced by dynamic Spatials after they touch the ground… Now that you start to implement game physics yourself, look behind the curtain!
+Popular AAA games use a clever mix of physics, animation and prerendered graphics to give you the illusion of a real, "physical" world. Think of your favorite video games and try to spot where and how the game designers trick you into believing that the whole scene is physical. For example, think of a building "breaking" into 4-8 parts after an explosion. The pieces most likely fly on predefined (so called kinematic) paths and are only replaced by dynamic Spatials after they touch the ground??? Now that you start to implement game physics yourself, look behind the curtain!
@@ -625,7 +625,7 @@ Using physics everywhere in a game sounds like a cool idea, but it is easily ove
@@ -635,7 +635,7 @@ You have learned how to activate the jBullet PhysicsSpace in an application by a
-
Congratulations! – You have completed the last beginner tutorial. Now you are ready to start combining what you have learned, to create a cool 3D game of your own. Show us what you can do, and feel free to share your demos, game videos, and screenshots on the !
+
Congratulations! ??? You have completed the last beginner tutorial. Now you are ready to start combining what you have learned, to create a cool 3D game of your own. Show us what you can do, and feel free to share your demos, game videos, and screenshots on the !
@@ -649,5 +649,5 @@ You have learned how to activate the jBullet PhysicsSpace in an application by a
\ 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 9dbc42916..54032b8ed 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
@@ -13,7 +13,7 @@ Typical interactions in games include shooting, picking up objects, and opening
-You can pick something by either pressing a key on the keyboard, or by clicking with the mouse. In either case, you identify the target by aiming a ray –a straight line– into the scene. This method to implement picking is called ray casting (which is not the same as ray tracing).
+You can pick something by either pressing a key on the keyboard, or by clicking with the mouse. In either case, you identify the target by aiming a ray ???a straight line??? into the scene. This method to implement picking is called ray casting (which is not the same as ray tracing).
@@ -438,7 +438,7 @@ Here are some tips:
-Shooting boxes isn't very exciting – can you add code that loads and positions a model in the scene, and shoot at it?
+Shooting boxes isn't very exciting ??? can you add code that loads and positions a model in the scene, and shoot at it?
Tip: You can use Spatial golem = assetManager.loadModel("Models/Oto/Oto.mesh.xml"); from the engine's jme3-test-data.jar.
@@ -465,7 +465,7 @@ Change the code as follows to simulate the player picking up objects into the in
If your nodes use a lit Material (not "Unshaded.j3md"), also add a light to the guiNode.
-
Size units are pixels in the HUD, therefor a 2-wu cube is displayed only 2 pixels wide in the HUD. – Scale it bigger!
+
Size units are pixels in the HUD, therefor a 2-wu cube is displayed only 2 pixels wide in the HUD. ??? Scale it bigger!
Position the nodes: The bottom left corner of the HUD is (0f,0f), and the top right corner is at (settings.getWidth(),settings.getHeight()).
@@ -495,9 +495,9 @@ You have learned how to use ray casting to solve the task of determining what ob
Use your imagination from here:
-
In your game, the click can trigger any action on the identified Geometry: Detach it and put it into the inventory, attach something to it, trigger an animation or effect, open a door or crate, – etc.
+
In your game, the click can trigger any action on the identified Geometry: Detach it and put it into the inventory, attach something to it, trigger an animation or effect, open a door or crate, ??? etc.
-
In your game, you could replace the red mark with a particle emitter, add an explosion effect, play a sound, calculate the new score after each hit depending on what was hit – etc.
+
In your game, you could replace the red mark with a particle emitter, add an explosion effect, play a sound, calculate the new score after each hit depending on what was hit ??? etc.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_simpleapplication.html b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_simpleapplication.html
index 267e051fe..48d9ef7d7 100644
--- a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_simpleapplication.html
+++ b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/beginner/hello_simpleapplication.html
@@ -30,9 +30,9 @@ OK, let's get ready to create our first jMonkeyEngine3 application.
In the jMonkeyEngine SDK:
-
Choose File→New Project… from the main menu.
+
Choose File???New Project??? from the main menu.
-
In the New Project wizard, select the template JME3→Basic Game. Click Next.
+
In the New Project wizard, select the template JME3???Basic Game. Click Next.
Specify a project name, e.g. "HelloWorldTutorial"
@@ -70,7 +70,7 @@ In the jMonkeyEngine SDK:
Right-click the Source Packages node of your project.
-
Choose New…→Java Class to create a new file.
+
Choose New??????Java Class to create a new file.
Enter the class name: HelloJME3
@@ -166,7 +166,7 @@ Look at the first line. The HelloJME3.java class extends com.jme3.app.Simp
}
-Every JME3 game is an instance of com.jme3.app.SimpleApplication. The SimpleApplication class manages your 3D scene graph and automatically draws it to the screen – that is, in short, what a game engine does for you!
+Every JME3 game is an instance of com.jme3.app.SimpleApplication. The SimpleApplication class manages your 3D scene graph and automatically draws it to the screen ??? that is, in short, what a game engine does for you!
@@ -234,7 +234,7 @@ Look at rest of the code sample. The simpleInitApp() method is auto
The initialization code of a blue cube looks as follows:
public void simpleInitApp() {
- Box b = new Box(Vector3f.ZERO, 1, 1, 1); // create a 1x1x1 box shape at the origin
+ Box b = new Box(Vector3f.ZERO, 1, 1, 1); // create a 2x2x2 box shape at the origin
Geometry geom = new Geometry("Box", b); // create a cube geometry from the box shape
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md"); // create a simple material
@@ -253,7 +253,7 @@ A typical JME3 game has the following initialization process:
You make objects appear in the scene by attaching them to the rootNode.
-
Examples: Load player, terrain, sky, enemies, obstacles, …, and place them in their start positions.
+
Examples: Load player, terrain, sky, enemies, obstacles, ???, and place them in their start positions.
@@ -263,7 +263,7 @@ A typical JME3 game has the following initialization process:
You set variables to their start values.
-
Examples: Set the score to 0, set health to 100%, …
+
Examples: Set the score to 0, set health to 100%, ???
@@ -271,17 +271,17 @@ A typical JME3 game has the following initialization process:
The following input bindings are pre-configured:
-
W,A,S,D keys – Move around in the scene
+
W,A,S,D keys ??? Move around in the scene
-
Mouse movement and arrow keys – Turn the camera
+
Mouse movement and arrow keys ??? Turn the camera
-
Escape key – Quit the game
+
Escape key ??? Quit the game
Define your own additional keys and mouse click actions.
-
Examples: Click to shoot, press Space to jump, …
+
Examples: Click to shoot, press Space to jump, ???
@@ -363,7 +363,7 @@ Use setWrap(WrapMode.Repeat) to make the small texture fill the wid
-Internally, the generated terrain mesh is broken down into tiles and blocks. This is an optimization to make culling easier. You do not need to worry about "tiles and blocks" too much, just use recommended values for now – 64 is a good start.
+Internally, the generated terrain mesh is broken down into tiles and blocks. This is an optimization to make culling easier. You do not need to worry about "tiles and blocks" too much, just use recommended values for now ??? 64 is a good start.
diff --git a/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/1.png b/sdk/jme3-core/javahelp/com/jme3/gde/core/docs/jme3/external/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..8462c8d0868c3f49047d00abe1f693b8b93a75c9
GIT binary patch
literal 169497
zcmXt918`(bxQ#a4*mgGD*!IM>H@0ot$;P&AZjy~N+1R#iz4_m(SA(wpZq?kWJ9qkg
z2OX&>FNp|`2M-1YhA0IPQw9TrP5=Xge20YwRfHKnBtZl8FBwTOu&@6f`8{RHpbDG=
zK+72n3<3SW7dTjEHV&u=<02&|4zmFckA;P*PfPU+R3fxg)pQZHx3x93a{*1kz(k!)
zja*DkNZc)5EJ!4!