diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/3d_models.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/3d_models.html
index d4c5c8df5..150ba0bc7 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/3d_models.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/3d_models.html
@@ -83,7 +83,7 @@ To export your models as Ogre XML
-You can now use the jMonkeyEngine SDK to load and view models. You can create scenes from them and write cde that loads them into your application.
+You can now use the jMonkeyEngine SDK to load and view models. You can create scenes from them and write code that loads them into your application.
-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.)
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/audio.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/audio.html
index cff5fee85..2cab347f4 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/audio.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/audio.html
@@ -50,7 +50,7 @@ AudioNode boom = new AudioNode(assetManager, "Sound/boom.wav", fal
AudioNode Method
Usage
-
getStatus()
Returns either Status.Playing, Status.Stopped, or Status.Paused.
+
getStatus()
Returns either AudioSource.Status.Playing, AudioSource.Status.Stopped, or AudioSource.Status.Paused.
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.
-
+
Positional 3D sounds require an AudioListener object in the scene (representing the player's ears).
@@ -135,7 +134,7 @@ setLocalTranslation(???)
Activates 3D audio: The sound appears to come f
-
+
Activates 3D audio: This sound can only be heard from
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!
-
+
Directional 3D sounds require an AudioListener object in the scene (representing the player's ears).
@@ -159,7 +158,7 @@ setOuterAngle()
Set the angle in degrees for the directional audio. The
-
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/capture_audio_video_to_a_file.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/capture_audio_video_to_a_file.html
index 321422f5b..3b6e7638c 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/capture_audio_video_to_a_file.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/capture_audio_video_to_a_file.html
@@ -571,7 +571,7 @@ public class Advanced extends SimpleApplication {
public void simpleUpdate(float tpf) {
motionTimer.update();
- if (music.getStatus() != AudioNode.Status.Playing){
+ if (music.getStatus() != AudioSource.Status.Playing){
music.play();
}
Vector3f loc = cam.getLocation();
@@ -600,7 +600,7 @@ The
ConnectionListeners inform the Server about HostedConnection arrivals and removals, e.g. if a client joins or quits.
+
ErrorListeners inform the Client about network exceptions that have happened, e.g. if the server crashes, the client throws a ConnectorException, this can be picked up so that the application can do something about it.
@@ -158,7 +160,7 @@ The server refers to a connected client as com.jme3.network.HostedConnection obj
myServer.getConnection(0)
Server gets the first (0), second (1), etc, connected HostedConnection object (one client).
-
+
Your game can define its own game data based on whatever criteria you want, typically these include player ID and state. If the server needs to look up player/client-specific information, you can store this information directly on the HostedConnection object. The following examples read and write a custom Java object MyState in the HostedConnection object conn:
@@ -175,14 +177,14 @@ Your game can define its own game data based on whatever criteria you want, typi
MyState state = conn.getAttribute("MyState")
Server can read an attribute of the HostedConnection.
@@ -308,21 +310,22 @@ The ID of the Client and HostedConnection are the same at both ends of a connect
... myClient.getId() ...
-A server has a game version and game name property. Each client expects to communicate with a server with a certain game name and version. Test first whether the game name matches, and then whether game version matches, before sending any messages! If they do not match, you should refuse to connect, because unmatched clients and servers will likely miscommunicate.
+A server has a game version and game name property. Each client expects to communicate with a server with a certain game name and version. Test first whether the game name matches, and then whether game version matches, before sending any messages! If they do not match, SpiderMoney will reject it for you, you have no choice in the mater. This is so the client and server can avoid miscommunication.
Typically, your networked game defines its own attributes (such as player ID) based on whatever criteria you want. If you want to look up player/client-specific information beyond the game version, you can set this information directly on the Client/HostedConnection object (see Getting Info About a Client).
The com.jme3.network.ClientStateListener notifies the Client when the Client has fully connected to the server (including any internal handshaking), and when the Client is kicked (disconnected) from the server.
+
+
+
+
The ClientStateListener when it receives a network exception applies the default close action. This just stops the client and you'll have to build around it so your application knows what to do. If you need more control when a network exception happens and the client closes, you may want to investigate in a ErrorListener.
+
@@ -395,7 +403,7 @@ The com.jme3.network.ClientStateListener notifies the Client when the Client has
public void clientDisconnected(Client c, DisconnectInfo info){}
Implement here what happens after the server kicks this client. For example, display the DisconnectInfo to the user.
-
+
First implement the ClientStateListener interface in the Client class. Then register it to myClient in MyGameClient's simpleInitApp() method:
@@ -403,7 +411,7 @@ First implement the ClientStateListener interface in the Client class. Then regi
@@ -423,7 +431,7 @@ The com.jme3.network.ConnectionListener notifies the Server whenever new HostedC
public void connectionRemoved(Server s, HostedConnection c){}
Implement here what happens after a HostedConnection has left. E.g. a player has quit the game and the server removes his character.
-
+
First implement the ConnectionListener interface in the Server class. Then register it to myServer in MyGameServer's simpleInitApp() method.
@@ -432,7 +440,55 @@ First implement the ConnectionListener interface in the Server class. Then regis
+
+The com.jme3.network.ErrorListener is a listener for when network exception happens. This listener is built so that you can override the default actions when a network exception happens.
+
+
+
+
If you intend on using the default network mechanics, don't use this!
+If you do override this, make sure you add a mechanic that can close the client otherwise your client will get stuck open and cause errors.
+
+
+
+
+
+
ErrorListener interface method
Purpose
+
+
+
public void handleError(Client c, Throwable t){}
Implemenent here what happens after a exception affects the network .
+
+
+
+
+
+
This interface was built for the client and server, but the code has never been put on the server to handle this listener.
+
+
+
+
+First implement the ErrorListener interface in the client class. Then you need to register it to myClient in MyGameClients's simpleInitApp() method.
+
+
myClient.addErrorListener(this);
+
+
+In the class that implements the ErrorListener, a method would of been added call handleError(Client s, Throwable t). Inside this method to get you started, you going to want to listen for an error. To do this you're going to want a bit of code like this.
+
+
if(t instanceof exception) {
+ //Add your own code here
+}
+
+
+Replace exception part in the if statement for the type of exception that you would like it to handle.
+
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui.html
index 4a9fdd813..52a536314 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui.html
@@ -154,10 +154,16 @@ Learn more from the NiftyGUI page:
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_java_interaction.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_java_interaction.html
index 65166b537..d2ad0dba8 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_java_interaction.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_java_interaction.html
@@ -26,7 +26,7 @@ In the previous parts of the tutorial, you created a two-screen user interface.
-To let a Nifty screen communicate with the Java application, you register a ScreenController to every NiftyGUI screen. You create a ScreenController by creating a Java class that implements the de.lessvoid.nifty.screen.ScreenController interface and its abtract methods.
+To let a Nifty screen communicate with the Java application, you register a ScreenController to every NiftyGUI screen. You create a ScreenController by creating a Java class that implements the de.lessvoid.nifty.screen.ScreenController interface and its abstract methods.
@@ -100,7 +100,7 @@ Now the Java class MyStartScreen and this
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_scenarios.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_scenarios.html
index ca47d84bf..d6ec99bd6 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_scenarios.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_scenarios.html
@@ -104,8 +104,22 @@ public StartScreenState(SimpleApplication app){
}
+
+
+
It is not sufficient to just inherit from AbstractAppState. You need to instantiate your controller class, register it with app's stateManager and then pass it to nifty. See code sample below.
+
+
+
public class TestNiftyGui extends SimpleApplication {
+ public void simpleInitApp() {
+ StartScreenState startScreenState = new StartScreenState(this);
+ stateManager.attach(startScreenState);
+ // [...] boilerplate init nifty omitted
+ nifty.fromXml("Interface/myGui.xml", "start", startScreenState); //one of the XML screen elements needs to reference StartScreenState controller class
+ }
+}
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_xml_layout.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_xml_layout.html
index 5450391f5..81fa57af9 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_xml_layout.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/nifty_gui_xml_layout.html
@@ -100,7 +100,7 @@ The following minimal XML
<?xml version="1.0" encoding="UTF-8"?><nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd">
+ xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd"><screen id="start">
<!-- ... -->
</screen>
@@ -118,7 +118,7 @@ Every Nifty GUI must have a
-
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/physics.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/physics.html
index 4da7e2e78..d2af4ff00 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/physics.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/physics.html
@@ -360,12 +360,12 @@ Click the links for details on the special PhysicsControls. This article is abou
-
-The PhysicsControl constructors expect a Collision Shape and a mass (a float in kilogram). The most commonly used PhysicsControl is the RigidBodyControl:
+The most commonly used physics control is RigidBodyControl. The RigidBodyControl constructor takes up to two parameters: a collision shape and a mass (a float in kilograms). The mass parameter also determines whether the object is dynamic (movable) or static (fixed). For a static object such as a floor or wall, specify zero mass.
@@ -373,7 +373,7 @@ The PhysicsControl constructors expect a Collision Shape and a mass (a float in
new RigidBodyControl( myDungeon_shape , 0.0f ); // static
-
When you create the PhysicsControl, the mass value makes an important distinction: Set the mass to a non-zero value to create a dynamic object that can fall or roll, etc. Set the mass value to zero to create a static object, such as floor, wall, etc. If you give your floor a mass, it will fall out of the scene!
+
If you give your floor a non-zero mass, it will fall out of the scene!
@@ -395,10 +395,11 @@ gameLevel.addControl(new RigidBodyControl(0.0f)); // explicit ze
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
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.
@@ -553,7 +554,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:
@@ -574,9 +575,9 @@ On a RigidBodyControl, you can apply the following physical forces:
(See detailed explanation below.)
-
+
-
+
@@ -687,7 +688,7 @@ Use the following methods to move dynamic physical objects.
clearForces()
Cancels out all forces (force, torque) etc and stops the motion.
-
+
It is technically possible to position PhysicsControls using setLocalTranslation(), e.g. to place them in their start position in the scene. However you must be very careful not to cause an "impossible state" where one physical object overlaps with another! Within the game, you typically use the setters shown here exclusively.
@@ -727,7 +728,7 @@ removeCollideWithGroup(COLLISION_GROUP_01)
Collision Groups are integer
setCcdSweptSphereRadius(.5f)
Bullet does not use the full collision shape for continuous collision detection, instead it uses a "swept sphere" shape to approximate a motion, which can be imprecise and cause strange behaviors such as objects passing 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.
@@ -735,7 +736,7 @@ removeCollideWithGroup(COLLISION_GROUP_01)
Sets At what depth the refraction color extincts. The three values are RGB (red, green, blue) in this order. Play with these parameters to "muddy" the water.
Vector3f(5f,20f,30f)
-
+
Water method example
Effects: Shore
Default
@@ -216,7 +216,7 @@ water.setRadius(260);
Limit the water filter to a semisphere with the gi
water.setUseHQShoreline(false);
Renders shoreline with better quality ?
true
-
+
Water method example
Effects: Foam
Default
@@ -234,7 +234,7 @@ water.setRadius(260);
Limit the water filter to a semisphere with the gi
manager.loadTexture("Textures/foam.png") )
This foam texture will be used with WrapMode.Repeat
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/terrain.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/terrain.html
index c092e2096..28a753092 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/terrain.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/terrain.html
@@ -7,14 +7,14 @@
The goal of TerraMonkey is to provide a base implementation that will be usable for 80% of people's goals, while providing tools and a good foundation for the other 20% to build off of. Check out the videos in the following announcements:
@@ -185,7 +185,7 @@ Here are the names of TerrainLighting.j3md's material properties:
-Video cards support a maximum of 16 Splat textures total. This means you can only use a subset of material properties at the same time!
+OpenGL supports a maximum of 16 samplers in any given shader. This means you can only use a subset of material properties at the same time if you use the terrain's default lighting shader (TerrainLighting.j3md)!
@@ -237,7 +237,7 @@ You can hand-paint Alpha, Diffuse, Glow, and Specular maps in a drawing program,
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/walking_character.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/walking_character.html
index 80bebd27d..362551789 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/walking_character.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/advanced/walking_character.html
@@ -419,6 +419,15 @@ This method resets the walk animation.
}
public void onAnimChange(AnimControl control, AnimChannel channel, String animName) { }
+
+
+
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/beginner-materials.png b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/beginner-materials.png
index fb9a2ce59..b98e4f987 100644
Binary files a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/beginner-materials.png and b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/beginner-materials.png differ
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_asset.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_asset.html
index 07f98cf87..db71a3421 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_asset.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_asset.html
@@ -55,7 +55,7 @@ public class HelloAssets extends SimpleApplication {
rootNode.attachChild(teapot);
// Create a wall with a simple texture from test_data
- Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f);
+ Box box = new Box(2.5f,2.5f,1.0f);
Spatial wall = new Geometry("Box", box );
Material mat_brick = new Material(
assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
@@ -93,7 +93,7 @@ Build and run the code sample. You should see a green Ninja with a colorful teap
-
+
@@ -115,16 +115,17 @@ The AssetManager can load files from:
The following is the recommended directory structure for storing assets in your project directoy:
-
MyGame/assets/Interface/
+
MyGame/assets/
+MyGame/assets/Interface/
MyGame/assets/MatDefs/
MyGame/assets/Materials/
-MyGame/assets/Models/
+MyGame/assets/Models/ <-- your .j3o models go here
MyGame/assets/Scenes/
MyGame/assets/Shaders/
-MyGame/assets/Sounds/
-MyGame/assets/Textures/
-MyGame/build.xml <-- Ant build script
-MyGame/src/... <-- Java sources go here
+MyGame/assets/Sounds/ <-- your audio files go here
+MyGame/assets/Textures/ <-- your textures go here
+MyGame/build.xml <-- Default Ant build script
+MyGame/src/... <-- your Java sources go here
MyGame/...
@@ -132,7 +133,7 @@ This is just a suggested best practice, and it's what you get by default wh
@@ -141,7 +142,7 @@ This is just a suggested best practice, and it's what you get by default wh
Place your textures in a subdirectory of assets/Textures/. Load the texture into the material before you set the Material. The following code sample is from the simpleInitApp() method and loads a simple wall model:
// Create a wall with a simple texture from test_data
-Box box = new Box(Vector3f.ZERO, 2.5f,2.5f,1.0f);
+Box box = new Box(2.5f,2.5f,1.0f);
Spatial wall = new Geometry("Box", box );
Material mat_brick = new Material(
assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
@@ -156,7 +157,7 @@ In this case, you
-To create 3D models and scenes, you need a 3D Mesh Editor with an OgreXML Exporter plugin. For example, you can .
-You use the SDK to load models, convert models and create scenes from them.
+To create 3D models and scenes, you need a 3D Mesh Editor. If you don't have any tools, install Blender and the OgreXML Exporter plugin.
+Then you and export them to your project.
+Then you use the SDK to load models, convert models, and create 3D scenes from them.
-If you use Blender, export your models as Ogre XML meshes with materials as follows:
+Example: From Blender, you export your models as Ogre XML meshes with materials as follows:
Open the menu File > Export > OgreXML Exporter to open the exporter dialog.
@@ -272,17 +274,28 @@ If you use Blender, export your models as Ogre
+
-JME3 can load Ogre XML models + materials, Ogre DotScenes, as well as Wavefront OBJ+MTL models. The loadModel() code works with these files when you run the code directly from the jMonkeyEngine SDK.
+JME3 can convert and load
+
+
Ogre XML models + materials,
+
+
Ogre DotScenes,
+
+
Wavefront OBJ + MTL models,
+
+
.Blend files.
+
+
-If you build the executables using the default build script, then the original model files (XML, OBJ, etc) are not included. When you run the executable, you get an error message if you try to load any models directly:
+
+The loadModel() method loads these original file formats when you run your code directly from the SDK. If you however build the executables using the default build script, then the original model files (XML, OBJ, etc) are not included. This means, when you run the executable outside the SDK, and load any original models directly, you get the following error message:
-Loading the XML/OBJ files directly is only acceptable during the development phase. If your graphic designer pushes updated files to the asset directory, you can quickly review the latest version in your development environment.
+You see that loading the XML/OBJ/Blend files directly is only acceptable during the development phase in the SDK. For example, every time your graphic designer pushes updated files to the asset directory, you can quickly review the latest version in your development environment.
-For testing and for the final release build, you use .j3o files exclusively. J3o is an optimized binary format for jME3 applications, and .j3o files are automatically included in the distributable JAR file by the build script. When you do QA test builds or are ready to release, use the SDK to convert all .obj/.scene/.xml/.blend files to .j3o files, and only load the .j3o versions.
+But for QA test builds and for the final release build, you use .j3o files exclusively. J3o is an optimized binary format for jME3 applications. When you do QA test builds, or are ready to release, use the SDK to convert all .obj/.scene/.xml/.blend files to .j3o files, and update all code to load the .j3o files. The default build script automatically packages .j3o files in the executables.
@@ -306,18 +319,20 @@ Open your JME3 Project in the jMonkeyEngine
+
@@ -435,7 +450,7 @@ Here is a third method you must know, loading a scene/model from a .j3o file:
In the projects window, browse to the assets/Scenes/town directory.
-
Right-click the main.scene and convert the scene to binary: The jMoneyPlatform generates a main.j3o file.
+
Right-click the main.scene and convert the scene to binary: The jMonkeyPlatform generates a main.j3o file.
Add the following code under simpleInitApp() {
Spatial gameLevel = assetManager.loadModel("Scenes/town/main.j3o");
gameLevel.setLocalTranslation(0, -5.2f, 0);
@@ -453,7 +468,7 @@ Again, you should see the Ninja+wall+teapot standing in a town.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_audio.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_audio.html
index e3dc9130b..64c73b799 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_audio.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_audio.html
@@ -24,11 +24,11 @@ This tutorial explains how to add 3D sound to a game, and how to make sounds pla
import com.jme3.app.SimpleApplication;
import com.jme3.audio.AudioNode;
+import com.jme3.input.MouseInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
-import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
@@ -49,10 +49,9 @@ public class HelloAudio extends SimpleApplication {
flyCam.setMoveSpeed(40);
/** just a blue box floating in space */
- Box box1 = new Box(Vector3f.ZERO, 1, 1, 1);
+ Box box1 = new Box(1, 1, 1);
player = new Geometry("Player", box1);
- Material mat1 = new Material(assetManager,
- "Common/MatDefs/Misc/Unshaded.j3md");
+ Material mat1 = new Material(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.Blue);
player.setMaterial(mat1);
rootNode.attachChild(player);
@@ -66,23 +65,23 @@ public class HelloAudio extends SimpleApplication {
private void initAudio() {
/* gun shot sound is to be triggered by a mouse click. */
audio_gun = new AudioNode(assetManager, "Sound/Effects/Gun.wav", false);
+ audio_gun.setPositional(false);
audio_gun.setLooping(false);
audio_gun.setVolume(2);
rootNode.attachChild(audio_gun);
/* nature sound - keeps playing in a loop. */
- audio_nature = new AudioNode(assetManager, "Sound/Environment/Nature.ogg", false);
+ audio_nature = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", true);
audio_nature.setLooping(true); // activate continuous playing
- audio_nature.setPositional(true);
- audio_nature.setLocalTranslation(Vector3f.ZERO.clone());
+ audio_nature.setPositional(true);
audio_nature.setVolume(3);
rootNode.attachChild(audio_nature);
audio_nature.play(); // play continuously!
}
- /** Declaring "Shoot" action, mapping it to a trigger (mouse click). */
+ /** Declaring "Shoot" action, mapping it to a trigger (mouse left click). */
private void initKeys() {
- inputManager.addMapping("Shoot", new MouseButtonTrigger(0));
+ inputManager.addMapping("Shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
inputManager.addListener(actionListener, "Shoot");
}
@@ -110,7 +109,7 @@ When you run the sample, you should see a blue cube. You should hear a nature-li
@@ -153,10 +152,17 @@ These two lines create new sound nodes from the given audio files in the AssetMa
You want the gunshot sound to play once (you don't want it to loop). You also specify its volume as gain factor (at 0, sound is muted, at 2, it is twice as loud, etc.).
Note that setPositional(false) is pretty important when you use stereo sounds. Positional sounds must always be mono audio files, otherwise the engine will remind it to you with a crash.
+
+
+
The nature sound is different: You want it to loop continuously as background sound. This is why you set looping to true, and immediately call the play() method on the node. You also choose to set its volume to 3.
@@ -184,7 +190,7 @@ Here you make audio_nature a positional sound that comes from a certain place. F
@@ -192,9 +198,9 @@ Here you make audio_nature a positional sound that comes from a certain place. F
Let's have a closer look at initKeys(): As you learned in previous tutorials, you use the inputManager to respond to user input. Here you add a mapping for a left mouse button click, and name this new action Shoot.
-
/** Declaring "Shoot" action, mapping it to a trigger (mouse click). */
+
/** Declaring "Shoot" action, mapping it to a trigger (mouse left click). */
private void initKeys() {
- inputManager.addMapping("Shoot", new MouseButtonTrigger(0));
+ inputManager.addMapping("Shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
inputManager.addListener(actionListener, "Shoot");
}
@@ -213,10 +219,11 @@ Setting up the ActionListener should also be familiar from previous tutorials. Y
Since you want to be able to shoot fast repeatedly, so you do not want to wait for the previous gunshot sound to end before the next one can start. This is why you play this sound using the playInstance() method. This means that every click starts a new instance of the sound, so two instances can overlap. You set this sound not to loop, so each instance only plays once. As you would expect it of a gunshot.
+
@@ -274,7 +281,7 @@ Apart from the looping boolean, another difference is where play().playIns
The Boolean in the AudioNode constructor defines whether the audio is buffered (false) or streamed (true). For example:
-
audio_nature = new AudioNode(assetManager, "Sound/Effects/Gun.wav", false); // buffered
+
audio_gunshot = new AudioNode(assetManager, "Sound/Effects/Gun.wav", false); // buffered
...
audio_nature = new AudioNode(assetManager, "Sound/Environment/Nature.ogg", true); // streamed
@@ -288,7 +295,7 @@ Note that streamed sounds can not loop (i.e. setLooping will not work as you exp
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_collision.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_collision.html
index e6082fed4..7b4661f34 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_collision.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_collision.html
@@ -69,6 +69,11 @@ public class HelloCollision extends SimpleApplication
private CharacterControl player;
private Vector3f walkDirection = new Vector3f();
private boolean left = false, right = false, up = false, down = false;
+
+ //Temporary vectors used on each frame.
+ //They here to avoid instanciating new vectors on each frame
+ private Vector3f camDir = new Vector3f();
+ private Vector3f camLeft = new Vector3f();
public static void main(String[] args) {
HelloCollision app = new HelloCollision();
@@ -111,7 +116,7 @@ public class HelloCollision extends SimpleApplication
player.setGravity(30);
player.setPhysicsLocation(new Vector3f(0, 10, 0));
- // We attach the scene and the player to the rootNode and the physics space,
+ // We attach the scene and the player to the rootnode and the physics space,
// to make them appear in the game world.
rootNode.attachChild(sceneModel);
bulletAppState.getPhysicsSpace().add(landscape);
@@ -147,17 +152,17 @@ public class HelloCollision extends SimpleApplication
/** These are our custom actions triggered by key presses.
* We do not walk yet, we just keep track of the direction the user pressed. */
- public void onAction(String binding, boolean value, float tpf) {
+ public void onAction(String binding, boolean isPressed, float tpf) {
if (binding.equals("Left")) {
- left = value;
+ left = isPressed;
} else if (binding.equals("Right")) {
- right = value;
+ right= isPressed;
} else if (binding.equals("Up")) {
- up = value;
+ up = isPressed;
} else if (binding.equals("Down")) {
- down = value;
+ down = isPressed;
} else if (binding.equals("Jump")) {
- player.jump();
+ if (isPressed) { player.jump(); }
}
}
@@ -169,25 +174,34 @@ public class HelloCollision extends SimpleApplication
* We also make sure here that the camera moves with player.
*/
@Override
- public void simpleUpdate(float tpf) {
- Vector3f camDir = cam.getDirection().clone().multLocal(0.6f);
- Vector3f camLeft = cam.getLeft().clone().multLocal(0.4f);
- walkDirection.set(0, 0, 0);
- if (left) { walkDirection.addLocal(camLeft); }
- if (right) { walkDirection.addLocal(camLeft.negate()); }
- if (up) { walkDirection.addLocal(camDir); }
- if (down) { walkDirection.addLocal(camDir.negate()); }
- player.setWalkDirection(walkDirection);
- cam.setLocation(player.getPhysicsLocation());
- }
+ public void simpleUpdate(float tpf) {
+ camDir.set(cam.getDirection()).multLocal(0.6f);
+ camLeft.set(cam.getLeft()).multLocal(0.4f);
+ walkDirection.set(0, 0, 0);
+ if (left) {
+ walkDirection.addLocal(camLeft);
+ }
+ if (right) {
+ walkDirection.addLocal(camLeft.negate());
+ }
+ if (up) {
+ walkDirection.addLocal(camDir);
+ }
+ if (down) {
+ walkDirection.addLocal(camDir.negate());
+ }
+ player.setWalkDirection(walkDirection);
+ cam.setLocation(player.getPhysicsLocation());
+ }
}
Run the sample. You should see a town square with houses and a monument. Use the WASD keys and the mouse to navigate around with a first-person perspective. Run forward and jump by pressing W and Space. Note how you step over the sidewalk, and up the steps to the monument. You can walk in the alleys between the houses, but the walls are solid. Don't walk over the edge of the world!
+
@@ -206,7 +220,12 @@ You already know that SimpleApplication is the base class for all jME3 games. Yo
private RigidBodyControl landscape;
private CharacterControl player;
private Vector3f walkDirection = new Vector3f();
- private boolean left = false, right = false, up = false, down = false;
+ private boolean left = false, right = false, up = false, down = false;
+
+ //Temporary vectors used on each frame.
+ //They here to avoid instanciating new vectors on each frame
+ private Vector3f camDir = new Vector3f();
+ private Vector3f camLeft = new Vector3f();
You initialize a few private fields:
@@ -222,15 +241,18 @@ You initialize a few private fields:
The fields walkDirection and the four Booleans are used for physics-controlled navigation.
+
camDir and camLeft are temporary vectors used later when computing the walkingDirection from the cam position and rotation
This is how the walking is triggered:
@@ -491,10 +521,11 @@ This is how the walking is triggered:
Important: Again, do not use setLocalTranslation() to walk the player around. You will get it stuck by overlapping with another physical object. You can put the player in a start position with setPhysicalLocation() if you make sure to place it a bit above the floor and away from obstacles.
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_input_system.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_input_system.html
index 8fcecd1da..4f7c5e1f5 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_input_system.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_input_system.html
@@ -65,8 +65,8 @@ public class HelloInput extends SimpleApplication {
inputManager.addMapping("Rotate", new KeyTrigger(KeyInput.KEY_SPACE),
new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
// Add the names to the action listener.
- inputManager.addListener(actionListener, new String[]{"Pause"});
- inputManager.addListener(analogListener, new String[]{"Left", "Right", "Rotate"});
+ inputManager.addListener(actionListener,"Pause");
+ inputManager.addListener(analogListener,"Left", "Right", "Rotate");
}
@@ -112,7 +112,7 @@ Build and run the example.
-
+
@@ -164,15 +164,16 @@ Now you need to register your trigger mappings.
// Add the names to the action listener.
- inputManager.addListener(actionListener, new String[]{"Pause"});
- 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.
+
@@ -361,14 +362,14 @@ You can find the list of input constants in the files src/core/com/jme3/in
KeyTrigger(KeyInput.KEY_LEFT), KeyTrigger(KeyInput.KEY_RIGHT)
-
+
Tip: If you don't recall an input constant during development, you benefit from an IDE's code completion functionality: Place the caret after e.g. KeyInput.| and trigger code completion to select possible input identifiers.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_main_event_loop.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_main_event_loop.html
index 348012f9f..782b4d97e 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_main_event_loop.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_main_event_loop.html
@@ -21,12 +21,12 @@ Now that you know how to load assets, such as 3D models, you want to implement s
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
-import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
-/** Sample 4 - how to trigger repeating actions from the main update loop.
- * In this example, we make the player character rotate. */
+/** Sample 4 - how to trigger repeating actions from the main event loop.
+ * In this example, you use the loop to make the player character
+ * rotate continuously. */
public class HelloLoop extends SimpleApplication {
public static void main(String[] args){
@@ -38,8 +38,8 @@ public class HelloLoop extends SimpleApplication {
@Override
public void simpleInitApp() {
-
- Box b = new Box(Vector3f.ZERO, 1, 1, 1);
+ /** this blue box is our player character */
+ Box b = new Box(1, 1, 1);
player = new Geometry("blue cube", b);
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
@@ -48,20 +48,21 @@ public class HelloLoop extends SimpleApplication {
rootNode.attachChild(player);
}
- /* This is the update loop */
+ /* Use the main event loop to trigger repeating actions. */
@Override
public void simpleUpdate(float tpf) {
- // make the player rotate
+ // make the player rotate:
player.rotate(0, 2*tpf, 0);
}
}
Build and run the file: You see a constantly rotating cube.
+
-Note the contrast:
+Note the the three phases of every game:
-
The simpleInitApp() method is executed only once, right at the beginning;
+
Init: The simpleInitApp() method is executed only once, right at the beginning;
-
The simpleUpdate() method runs repeatedly, during the game.
+
Update: The simpleUpdate() method runs repeatedly, during the game.
-
After every update, the jMonkeyEngine automatically redraws (renders) the screen for you!
+
Render: After every update, the jMonkeyEngine automatically redraws (renders) the screen for you.
-Since rendering is automatic, initialization and updating are the two most important concepts in a SimpleApplication for you right now. These methods are where you load and create game data (once), and (repeatedly) change their properties to update the game state:
+Since rendering is automatic, initialization and updating are the two most important concepts in a SimpleApplication-based game for you:
-
simpleInitApp() is the application's "first breath".
+
The simpleInitApp() method is the application's "first breath".
+Here you load and create game data (once).
-
simpleUpdate() is the application's heartbeat.
-The update time unit is called ticks.
+
The simpleUpdate() method is the application's "heartbeat" (the time unit is called ticks).
+Here you change their properties to update the game state (repeatedly).
-
Everything in a game happens either during initialization or during the update loop. This means that these two methods grow very long over time. There are two strategies how experienced developers spread out their init and update code over several Java classes:
+
Everything in a game happens either during initialization, or during the update loop. This means that these two methods grow very long over time. Follwo these two strategies to spread out init and update code over several modular Java classes:
Move code blocks from the simpleInitApp() method to AppStates.
@@ -155,7 +157,7 @@ Keep this in mind for later when your application grows.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_material.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_material.html
index 127db9b2c..628a9fb06 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_material.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_material.html
@@ -14,13 +14,13 @@ The term Material includes everything that influences what the surface of a 3D m
+
To use the example assets in a new jMonkeyEngine SDK project, right-click your project, select "Properties", go to "Libraries", press "Add Library" and add the "jme3-test-data" library.
package jme3test.helloworld;
@@ -31,18 +31,17 @@ import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
+import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Sphere;
import com.jme3.texture.Texture;
import com.jme3.util.TangentBinormalGenerator;
-import com.jme3.renderer.queue.RenderQueue.Bucket;
/** Sample 6 - how to give an object's surface a material and texture.
- * How to make objects transparent, or let colors "leak" through partially
- * transparent textures. How to make bumpy and shiny surfaces. */
-
+ * How to make objects transparent. How to make bumpy and shiny surfaces. */
public class HelloMaterial extends SimpleApplication {
+
public static void main(String[] args) {
HelloMaterial app = new HelloMaterial();
app.start();
@@ -50,58 +49,57 @@ public class HelloMaterial extends SimpleApplication {
@Override
public void simpleInitApp() {
+
/** A simple textured cube -- in good MIP map quality. */
- Box boxshape1 = new Box(new Vector3f(-3f,1.1f,0f), 1f,1f,1f);
- Geometry cube = new Geometry("My Textured Box", boxshape1);
- Material mat_stl = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- Texture tex_ml = assetManager.loadTexture("Interface/Logo/Monkey.jpg");
- mat_stl.setTexture("ColorMap", tex_ml);
- cube.setMaterial(mat_stl);
- rootNode.attachChild(cube);
+ Box cube1Mesh = new Box( 1f,1f,1f);
+ Geometry cube1Geo = new Geometry("My Textured Box", cube1Mesh);
+ cube1Geo.setLocalTranslation(new Vector3f(-3f,1.1f,0f));
+ Material cube1Mat = new Material(assetManager,
+ "Common/MatDefs/Misc/Unshaded.j3md");
+ Texture cube1Tex = assetManager.loadTexture(
+ "Interface/Logo/Monkey.jpg");
+ cube1Mat.setTexture("ColorMap", cube1Tex);
+ cube1Geo.setMaterial(cube1Mat);
+ rootNode.attachChild(cube1Geo);
/** A translucent/transparent texture, similar to a window frame. */
- Box boxshape3 = new Box(new Vector3f(0f,0f,0f), 1f,1f,0.01f);
- Geometry window_frame = new Geometry("window frame", boxshape3);
- Material mat_tt = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- mat_tt.setTexture("ColorMap", assetManager.loadTexture("Textures/ColoredTex/Monkey.png"));
- mat_tt.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
- window_frame.setMaterial(mat_tt);
-
- /** Objects with transparency need to be in the render bucket for transparent objects: */
- window_frame.setQueueBucket(Bucket.Transparent);
- rootNode.attachChild(window_frame);
-
- /** A cube with base color "leaking" through a partially transparent texture */
- Box boxshape4 = new Box(new Vector3f(3f,-1f,0f), 1f,1f,1f);
- Geometry cube_leak = new Geometry("Leak-through color cube", boxshape4);
- Material mat_tl = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- mat_tl.setTexture("ColorMap", assetManager.loadTexture("Textures/ColoredTex/Monkey.png"));
- mat_tl.setColor("Color", new ColorRGBA(1f,0f,1f, 1f)); // purple
- cube_leak.setMaterial(mat_tl);
- rootNode.attachChild(cube_leak);
+ Box cube2Mesh = new Box( 1f,1f,0.01f);
+ Geometry cube2Geo = new Geometry("window frame", cube2Mesh);
+ Material cube2Mat = new Material(assetManager,
+ "Common/MatDefs/Misc/Unshaded.j3md");
+ cube2Mat.setTexture("ColorMap",
+ assetManager.loadTexture("Textures/ColoredTex/Monkey.png"));
+ cube2Mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
+ cube2Geo.setQueueBucket(Bucket.Transparent);
+ cube2Geo.setMaterial(cube2Mat);
+ rootNode.attachChild(cube2Geo);
- /** A bumpy rock with a shiny light effect */
- Sphere rock = new Sphere(32,32, 2f);
- Geometry shiny_rock = new Geometry("Shiny rock", rock);
- rock.setTextureMode(Sphere.TextureMode.Projected); // better quality on spheres
- TangentBinormalGenerator.generate(rock); // for lighting effect
- Material mat_lit = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
- mat_lit.setTexture("DiffuseMap", assetManager.loadTexture("Textures/Terrain/Pond/Pond.jpg"));
- mat_lit.setTexture("NormalMap", assetManager.loadTexture("Textures/Terrain/Pond/Pond_normal.png"));
- mat_lit.setBoolean("UseMaterialColors",true);
- mat_lit.setColor("Specular",ColorRGBA.White);
- mat_lit.setColor("Diffuse",ColorRGBA.White);
- mat_lit.setFloat("Shininess", 5f); // [1,128]
- shiny_rock.setMaterial(mat_lit);
- shiny_rock.setLocalTranslation(0,2,-2); // Move it a bit
- shiny_rock.rotate(1.6f, 0, 0); // Rotate it a bit
- rootNode.attachChild(shiny_rock);
+ /** A bumpy rock with a shiny light effect.*/
+ Sphere sphereMesh = new Sphere(32,32, 2f);
+ Geometry sphereGeo = new Geometry("Shiny rock", sphereMesh);
+ sphereMesh.setTextureMode(Sphere.TextureMode.Projected); // better quality on spheres
+ TangentBinormalGenerator.generate(sphereMesh); // for lighting effect
+ Material sphereMat = new Material(assetManager,
+ "Common/MatDefs/Light/Lighting.j3md");
+ sphereMat.setTexture("DiffuseMap",
+ assetManager.loadTexture("Textures/Terrain/Pond/Pond.jpg"));
+ sphereMat.setTexture("NormalMap",
+ assetManager.loadTexture("Textures/Terrain/Pond/Pond_normal.png"));
+ sphereMat.setBoolean("UseMaterialColors",true);
+ sphereMat.setColor("Diffuse",ColorRGBA.White);
+ sphereMat.setColor("Specular",ColorRGBA.White);
+ sphereMat.setFloat("Shininess", 64f); // [0,128]
+ sphereGeo.setMaterial(sphereMat);
+ sphereGeo.setLocalTranslation(0,2,-2); // Move it a bit
+ sphereGeo.rotate(1.6f, 0, 0); // Rotate it a bit
+ rootNode.attachChild(sphereGeo);
/** Must add a light to make the lit object visible! */
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(1,0,-2).normalizeLocal());
sun.setColor(ColorRGBA.White);
rootNode.addLight(sun);
+
}
}
@@ -111,9 +109,7 @@ You should see
Left ??? A cube with a brown monkey texture.
-
Middle ??? A translucent monkey picture in front of a shiny rock.
-
-
Right ??? A cube with a purple monkey texture.
+
Right ??? A translucent monkey picture in front of a shiny bumpy rock.
@@ -122,7 +118,7 @@ Move around with the WASD keys to have a closer look at the translucency, and th
@@ -130,80 +126,89 @@ 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.
-
/** A simple textured cube. */
- Box boxshape1 = new Box(new Vector3f(-3f,1.1f,0f), 1f,1f,1f);
- Geometry cube = new Geometry("My Textured Box", boxshape1);
- Material mat_stl = new Material(assetManager,
+
/** A simple textured cube -- in good MIP map quality. */
+ Box cube1Mesh = new Box( 1f,1f,1f);
+ Geometry cube1Geo = new Geometry("My Textured Box", cube1Mesh);
+ cube1Geo.setLocalTranslation(new Vector3f(-3f,1.1f,0f));
+ Material cube1Mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
- Texture tex_ml = assetManager.loadTexture("Interface/Logo/Monkey.jpg");
- mat_stl.setTexture("ColorMap", tex_ml);
- cube.setMaterial(mat_stl);
- rootNode.attachChild(cube);
-Monkey.png is the same texture as Monkey.jpg, but with an added alpha channel. The alpha channel allows you to specify which areas of the texture you want to be opaque or transparent: Black areas remain opaque, gray areas become translucent, and white areas become transparent.
+Monkey.png is the same texture as Monkey.jpg, but with an added alpha channel. The alpha channel allows you to specify which areas of the texture you want to be opaque or transparent: Black areas of the alpha channel remain opaque, gray areas become translucent, and white areas become transparent.
For a partially translucent/transparent texture, you need:
-
A texture with alpha channel
+
A Texture with alpha channel
-
A Texture blend mode of BlendMode.Alpha
+
A Texture with blend mode of BlendMode.Alpha
-
A geometry in the Bucket.Transparent render bucket. This bucket ensures that the translucent object is drawn on top of objects behind it, and they show up correctly under the translucent parts. (For non-translucent objects the drawing order is not so important, because the z-buffer keeps track of whether a pixel is behind something else or not, and the color of a pixel doesn't depend on the pixels under it, this is why opaque Geometries can be drawn in any order.)
+
A Geometry in the Bucket.Transparent render bucket.
+This bucket ensures that the transparent object is drawn on top of objects behind it, and they show up correctly under the transparent parts.
-
/** A translucent/transparent texture. */
- Box boxshape3 = new Box(new Vector3f(0f,0f,0f), 1f,1f,0.01f);
- Geometry seethrough = new Geometry("see-through box", boxshape3);
- Material mat_tt = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- mat_tt.setTexture("ColorMap", assetManager.loadTexture("Textures/ColoredTex/Monkey.png"));
- mat_tt.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); // activate transparency
- seethrough.setMaterial(mat_tt);
- seethrough.setQueueBucket(Bucket.Transparent);
- rootNode.attachChild(seethrough);
+
/** A translucent/transparent texture, similar to a window frame. */
+ Box cube2Mesh = new Box( 1f,1f,0.01f);
+ Geometry cube2Geo = new Geometry("window frame", cube2Mesh);
+ Material cube2Mat = new Material(assetManager,
+ "Common/MatDefs/Misc/Unshaded.j3md");
+ cube2Mat.setTexture("ColorMap",
+ assetManager.loadTexture("Textures/ColoredTex/Monkey.png"));
+ cube2Mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); // !
+ cube2Geo.setQueueBucket(Bucket.Transparent); // !
+ cube2Geo.setMaterial(cube2Mat);
+ rootNode.attachChild(cube2Geo);
+
+
+For non-transparent objects, the drawing order is not so important, because the z-buffer already keeps track of whether a pixel is behind something else or not, and the color of an opaque pixel doesn't depend on the pixels under it, this is why opaque Geometries can be drawn in any order.
+
-What you did is the same as before, with only one added step for the transparency.
+What you did for the transparent texture is the same as before, with only one added step for the transparency.
-
Create a Geometry from a mesh. This Geometry is flat upright box.
+
Create a Geometry cube2Geo from a Box mesh cube2Mesh. This Box Geometry is flat upright box (because z=0.01f).
-
Create a Material based on jME3's default Unshaded.j3md material definition.
+
Create a Material cube2Mat based on jME3's default Unshaded.j3md material definition.
-
Create a texture from the Monkey.png file and load it into the material.
-The ColorMap is the material layer where textures go. This PNG file must have an alpha layer.
+
Create a texture cube2Tex from the Monkey.png file in the assets/Textures/ColoredTex/ directory of the project. This PNG file must have an alpha layer.
-
Activate transparency in the material by setting the blend mode to Alpha!
+
Activate transparency in the material by setting the blend mode to Alpha.
-
Apply the material to the Geometry.
+
Set the QueueBucket of the Geometry to Bucket.Transparent.
-
Set the QueueBucket of the Geometry to Bucket.Transparent.
+
Load the texture cube2Tex into the ColorMap layer of the material cube2Mat.
-
Attach the cube to the rootnode.
+
Apply the material to the cube, and attach the cube to the rootnode.
@@ -213,59 +218,62 @@ The ColorMap is the material layer where textures go. This
+
-But textures are not all. Have a close look at the shiny sphere ??? you cannot get such a nice bumpy material with just a texture. JME3 also supports so-called Phong-illuminated materials:
+But textures are not all. Have a close look at the shiny sphere ??? you cannot get such a nice bumpy material with just a plain texture. You see that JME3 also supports so-called Phong-illuminated materials:
-In a lit material, the standard texture layer is refered to as Diffuse Map, any material can use this layer. A lit material can additionally have lighting effects such as Shininess used together with the Specular Map layer, and even a realistically bumpy or cracked surface with help of the Normal Map layer.
+In a lit material, the standard texture layer is refered to as DiffuseMap, any material can use this layer. A lit material can additionally have lighting effects such as Shininess used together with the SpecularMap layer and Specular color. And you can even get a realistically bumpy or cracked surface with help of the NormalMap layer.
Let's have a look at the part of the code example where you create the shiny bumpy rock.
-
Create a Geometry from a Sphere shape. Note that this shape is a normal smooth sphere mesh.
Sphere rock = new Sphere(32,32, 2f);
- Geometry shiny_rock = new Geometry("Shiny rock", rock);
+
Create a Geometry from a Sphere shape. Note that this shape is a normal smooth sphere mesh.
Sphere sphereMesh = new Sphere(32,32, 2f);
+ Geometry sphereGeo = new Geometry("Shiny rock", sphereMesh);
-
(Only for Spheres) Change the sphere's TextureMode to make the square texture project better onto the sphere.
Set the Material's Shininess to a value between 1 and 128. For a rock, a low fuzzy shininess is appropriate.
mat_lit.setFloat("Shininess", 5f); // [1,128]
+
Set the Material's Shininess to a value between 1 and 128. For a rock, a low fuzzy shininess is appropriate. Use material colors to define the shiny Specular color.
sphereMat.setBoolean("UseMaterialColors",true);
+ sphereMat.setColor("Diffuse",ColorRGBA.White); // minimum material color
+ sphereMat.setColor("Specular",ColorRGBA.White); // for shininess
+ sphereMat.setFloat("Shininess", 64f); // [1,128] for shininess
-
Assign your newly created material to the Geometry.
shiny_rock.setMaterial(mat_lit);
+
Assign your newly created material to the Geometry.
sphereGeo.setMaterial(sphereMat);
-
Let's move and rotate the geometry a bit to position it better.
shiny_rock.setLocalTranslation(0,2,-2); // Move it a bit
- shiny_rock.rotate(1.6f, 0, 0); // Rotate it a bit
- rootNode.attachChild(shiny_rock);
+
Let's move and rotate the geometry a bit to position it better.
sphereGeo.setLocalTranslation(0,2,-2); // Move it a bit
+ sphereGeo.rotate(1.6f, 0, 0); // Rotate it a bit
+ rootNode.attachChild(sphereGeo);
@@ -280,7 +288,7 @@ Remember that any Lighting.j3md-based material requires a light source, as shown
For a game, you create custom Materials based on these existing MaterialDefintions ??? as you have just seen in the example with the shiny rock's material.
-Look at the purple leak-through sample above again. It takes four lines to create and set the Material.
+Look at the shiny rocky sphere above again. It takes several lines to create and set the Material.
-
Note how it loads the Unshaded.j3md Material definition.
+
Note how it loads the Lighting.j3md Material definition.
-
Note how it sets the Color parameter to purple (new ColorRGBA(1f,0f,1f,1f)).
+
Note how it sets the DiffuseMap and NormalMap to a texture path.
-
Note how it sets the ColorMap to a texture path.
+
Note how it activates UseMaterialColors and sets Specular and Diffuse to 4 float values (RGBA color).
+
+
Note how it sets Shininess to 64.
+
If you want to use one custom material for several models, you can store it in a .j3m file, and save a few lines of code every time.
+
+
+
You create a j3m file as follows:
-
Create a file assets/Materials/LeakThrough.j3m in your project directory, with the following content:
Material Leak Through : Common/MatDefs/Misc/Unshaded.j3md {
+
Create a plain text file assets/Materials/MyCustomMaterial.j3m in your project directory, with the following content:
@@ -366,11 +385,11 @@ You create a j3m file as follows:
-Using this new custom material LeakThrough.j3m only takes one line. You have replaced the three lines of an on-the-fly material definition with one line that loads a custom material from a file. This method is very handy if you use the same material often.
+Using this new custom material MyCustomMaterial.j3m only takes one line. You have replaced the eight lines of an on-the-fly material definition with one line that loads a custom material from a file. Using .j3m files is very handy if you use the same material often.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_node.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_node.html
index 275a16653..1f8dd4dc3 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_node.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_node.html
@@ -44,16 +44,15 @@ You will learn that the scene graph represents the 3D world, and why the rootNod
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
-import com.jme3.scene.shape.Box;
-import com.jme3.math.ColorRGBA;
import com.jme3.scene.Node;
+import com.jme3.scene.shape.Box;
/** Sample 2 - How to use nodes as handles to manipulate objects in the scene.
* You can rotate, translate, and scale objects by manipulating their parent nodes.
* The Root Node is special: Only what is attached to the Root Node appears in the scene. */
-
public class HelloNode extends SimpleApplication {
public static void main(String[] args){
@@ -65,28 +64,28 @@ public class HelloNode extends SimpleApplication {
public void simpleInitApp() {
/** create a blue box at coordinates (1,-1,1) */
- Box box1 = new Box( Vector3f.ZERO, 1,1,1);
+ Box box1 = new Box(1,1,1);
Geometry blue = new Geometry("Box", box1);
+ blue.setLocalTranslation(new Vector3f(1,-1,1));
Material mat1 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.Blue);
blue.setMaterial(mat1);
- blue.move(1,-1,1);
/** create a red box straight above the blue one at (1,3,1) */
- Box box2 = new Box( Vector3f.ZERO, 1,1,1);
+ Box box2 = new Box(1,1,1);
Geometry red = new Geometry("Box", box2);
+ red.setLocalTranslation(new Vector3f(1,3,1));
Material mat2 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color", ColorRGBA.Red);
red.setMaterial(mat2);
- red.move(1,3,1);
/** Create a pivot node at (0,0,0) and attach it to the root node */
Node pivot = new Node("pivot");
rootNode.attachChild(pivot); // put this node in the scene
- /** Attach the two boxes to the *pivot* node. */
+ /** Attach the two boxes to the *pivot* node. (And transitively to the root node.) */
pivot.attachChild(blue);
pivot.attachChild(red);
/** Rotate the pivot node: Note that both boxes have rotated! */
@@ -99,7 +98,7 @@ Build and run the code sample. You should see two colored boxes tilted at the sa
@@ -128,7 +127,7 @@ In this tutorial, you learn some new terms:
Position/move, turn, or resize an object
Translate, or rotate, or scale an object = transform an object.
-
+
Every JME3 application has a rootNode: Your game automatically inherits the rootNode object from SimpleApplication. Everything attached to the rootNode is part of the scene graph. The elements of the scene graph are Spatials.
@@ -155,9 +154,9 @@ Every JME3 application has a rootNode: Your game automatically inherits the 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???
@@ -171,19 +170,18 @@ What happens in the code snippet? You use the simpleInitApp() metho
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)
+
Position the box at (1,-1,1) using the setLocalTranslation() method.
Wrap the Box shape into a Geometry.
Create a blue material.
-
Apply the blue material to the Box Geometry.
Box box1 = new Box( Vector3f.ZERO, 1,1,1);
+
Apply the blue material to the Box Geometry.
Box box1 = new Box(1,1,1);
Geometry blue = new Geometry("Box", box1);
- Material mat1 = new Material(assetManager,
- "Common/MatDefs/Misc/Unshaded.j3md");
+ blue.setLocalTranslation(new Vector3f(1,-1,1));
+ Material mat1 = new Material(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.Blue);
- blue.setMaterial(mat1);
- blue.move(1,-1,1);
+ blue.setMaterial(mat1);
@@ -198,13 +196,13 @@ What happens in the code snippet? You use the simpleInitApp() metho
Create a red material.
-
Apply the red material to the Box Geometry.
Box box2 = new Box( Vector3f.ZERO, 1,1,1);
+
Apply the red material to the Box Geometry.
Box box2 = new Box(1,1,1);
Geometry red = new Geometry("Box", box2);
+ red.setLocalTranslation(new Vector3f(1,3,1));
Material mat2 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color", ColorRGBA.Red);
- red.setMaterial(mat2);
- red.move(1,3,1);
+ red.setMaterial(mat2);
@@ -245,7 +243,7 @@ If you run the app with only the code up to here, you see two cubes: A red cube
@@ -371,7 +369,7 @@ If you get unexpected results, check whether you made the following common mista
A created Geometry does not appear in the scene.
Have you attached it to (a node that is attached to) the rootNode?
Does it have a Material?
What is its translation (position)? Is it behind the camera or covered up by another Geometry?
-Is it to tiny or too gigantic to see?
+Is it too tiny or too gigantic to see?
Is it too far from the camera? (Try (111111f); to see further)
@@ -384,9 +382,9 @@ Did you rotate around the right axis?
A Geometry has an unexpected Color or Material.
Did you reuse a Material from another Geometry and have inadvertently changed its properties? (If so, consider cloning it: mat2 = mat.clone(); )
@@ -305,15 +305,15 @@ In this "shoot at the wall" example, you use Geometries such as cannon
sphere = new Sphere(32, 32, 0.4f, true, false);
sphere.setTextureMode(TextureMode.Projected);
/** Initialize the brick geometry */
- box = new Box(Vector3f.ZERO, brickLength, brickHeight, brickWidth);
+ box = new Box(brickLength, brickHeight, brickWidth);
box.scaleTextureCoordinates(new Vector2f(1f, .5f));
/** Initialize the floor geometry */
- floor = new Box(Vector3f.ZERO, 10f, 0.1f, 5f);
+ floor = new Box(10f, 0.1f, 5f);
floor.scaleTextureCoordinates(new Vector2f(3, 6));
}
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_picking.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_picking.html
index b0090df45..b678e91c6 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_picking.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_picking.html
@@ -39,12 +39,14 @@ import com.jme3.input.MouseInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.MouseButtonTrigger;
+import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Ray;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Sphere;
@@ -56,8 +58,8 @@ public class HelloPicking extends SimpleApplication {
HelloPicking app = new HelloPicking();
app.start();
}
- Node shootables;
- Geometry mark;
+ private Node shootables;
+ private Geometry mark;
@Override
public void simpleInitApp() {
@@ -73,6 +75,7 @@ public class HelloPicking extends SimpleApplication {
shootables.attachChild(makeCube("the Sheriff", 0f, 1f, -2f));
shootables.attachChild(makeCube("the Deputy", 1f, 0f, -4f));
shootables.attachChild(makeFloor());
+ shootables.attachChild(makeCharacter());
}
/** Declaring the "Shoot" action and mapping to its triggers. */
@@ -120,8 +123,9 @@ public class HelloPicking extends SimpleApplication {
/** A cube object for target practice */
protected Geometry makeCube(String name, float x, float y, float z) {
- Box box = new Box(new Vector3f(x, y, z), 1, 1, 1);
+ Box box = new Box(1, 1, 1);
Geometry cube = new Geometry(name, box);
+ cube.setLocalTranslation(x, y, z);
Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.randomColor());
cube.setMaterial(mat1);
@@ -130,8 +134,9 @@ public class HelloPicking extends SimpleApplication {
/** A floor to show that the "shot" can go through several objects. */
protected Geometry makeFloor() {
- Box box = new Box(new Vector3f(0, -4, -5), 15, .2f, 15);
+ Box box = new Box(15, .2f, 15);
Geometry floor = new Geometry("the Floor", box);
+ floor.setLocalTranslation(0, -4, -5);
Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat1.setColor("Color", ColorRGBA.Gray);
floor.setMaterial(mat1);
@@ -149,16 +154,28 @@ public class HelloPicking extends SimpleApplication {
/** A centred plus sign to help the player aim. */
protected void initCrossHairs() {
- guiNode.detachAllChildren();
+ setDisplayStatView(false);
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
BitmapText ch = new BitmapText(guiFont, false);
ch.setSize(guiFont.getCharSet().getRenderedSize() * 2);
ch.setText("+"); // crosshairs
ch.setLocalTranslation( // center
- settings.getWidth() / 2 - guiFont.getCharSet().getRenderedSize() / 3 * 2,
- settings.getHeight() / 2 + ch.getLineHeight() / 2, 0);
+ settings.getWidth() / 2 - ch.getLineWidth()/2, settings.getHeight() / 2 + ch.getLineHeight()/2, 0);
guiNode.attachChild(ch);
}
+
+ protected Spatial makeCharacter() {
+ // load a character from jme3test-test-data
+ Spatial golem = assetManager.loadModel("Models/Oto/Oto.mesh.xml");
+ golem.scale(0.5f);
+ golem.setLocalTranslation(-1.0f, -1.5f, -0.6f);
+
+ // We must add a light to make the model visible
+ DirectionalLight sun = new DirectionalLight();
+ sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f));
+ golem.addLight(sun);
+ return golem;
+ }
}
@@ -167,10 +184,11 @@ You should see four colored cubes floating over a gray floor, and cross-hairs. A
Keep an eye on the application's output stream, it will give you more details: The name of the mesh that was hit, the coordinates of the hit, and the distance.
+
@@ -282,12 +300,12 @@ Next you declare the shooting action. It can be triggered either by clicking, or
private void initKeys() {
inputManager.addMapping("Shoot", // Declare...
new KeyTrigger(KeyInput.KEY_SPACE), // trigger 1: spacebar, or
- new MouseButtonTrigger(0)); // trigger 2: left-button click
+ new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); // trigger 2: left-button click
inputManager.addListener(actionListener, "Shoot"); // ... and add.
}
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_simpleapplication.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_simpleapplication.html
index 3e18d7e6c..0a0c3589f 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_simpleapplication.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/beginner/hello_simpleapplication.html
@@ -56,7 +56,7 @@ If you have questions, read more about
-
@@ -114,7 +114,7 @@ public class HelloJME3 extends SimpleApplication {
@Override
public void simpleInitApp() {
- Box b = new Box(Vector3f.ZERO, 1, 1, 1); // create cube shape at the origin
+ Box b = new Box(1, 1, 1); // create cube shape
Geometry geom = new Geometry("Box", b); // create cube geometry from the shape
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md"); // create a simple material
@@ -143,7 +143,7 @@ Congratulations! Now let's find out how it works!
-Look at the first line. The HelloJME3.java class extends com.jme3.app.SimpleApplication.
+Look at the first line. Your HelloJME3.java class extends com.jme3.app.SimpleApplication.
public class HelloJME3 extends SimpleApplication {
// your code...
}
-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 the com.jme3.app.SimpleApplication class. The SimpleApplication class is the simplest example of an application: It manages a 3D scene graph, checks for user input, updates the game state, and automatically draws the scene to the screen. These are the core features of a game engine. You extend this simple application and customize it to create your game.
@@ -184,11 +184,11 @@ You start every JME3 game from the main() method, as every standard Java applica
}
-This code opens your application window. Let's learn how you put something into the window next.
+The app.start(); line opens the application window. Let's learn how you put something into this window (the scene) next.
@@ -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(1, 1, 1); // create a 1x1x1 box shape
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
@@ -288,7 +288,7 @@ A typical JME3 game has the following initialization process:
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/build_jme3_sources_with_netbeans.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/build_jme3_sources_with_netbeans.html
index c5268f50c..37b9f2148 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/build_jme3_sources_with_netbeans.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/build_jme3_sources_with_netbeans.html
@@ -4,7 +4,7 @@
-You are welcome to try out the new jME3, and contribute patches and features! This document shows how to download, set up, build, and run the latest development version from the sources. (As of Spring 2010, we are in alpha.) These instructions work in NetBeans IDE 6 or better.
+You are welcome to try out the new jME3, and contribute patches and features! This document shows how to download, set up, build, and run the latest development version from the sources. These instructions work in NetBeans IDE 6 or better.
@@ -12,7 +12,7 @@ Note: In the following, always replace "~" with the path to your home
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/external/blender.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/external/blender.html
index 7a29a58bf..abb8c1b9d 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/external/blender.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/external/blender.html
@@ -282,8 +282,54 @@ Models for live rendering should have a low polygon count. To increase the perce
+
+
Be careful: The steps above lead to terrible normal maps - use this procedure instead:
+
+
+
+
uncheck "[ ] Bake from Multires"
+
+
switch to object mode
+
+
make a copy of your mesh (SHIFT+D)
+
+
remove the Multires modifier from the copied model
+
+
remove any materials from the copied model
+
+
remove the armature modifier from the copied model
+
+
select the original (highres) model
+
+
go into pose mode, clear any pose transformations
+
+
the highres and lowres models should be on top of each other now
+
+
select the original (highres) model
+
+
hold SHIFT and select the copied (lowres) model
+
+
in the properties menu go to render
+
+
use Bake > Normal
+
+
check "[x] Selected to Active"
+
+
use a reasonably high value for "Margin" (4+ pixels at least for 1024x1024 maps)
+
+
don't forget to safe the normal map image
+
+
+
+
+
+
Be careful: in the Outliner the camera symbol (Restrict Render) must be on!
+
+Follow the link below to a pdf tutorial by rhymez where I guide you to modelling a car and importing it to the jMonkeyengine correctly and edit it in the vehicle editor.Plus how to model a simple racing track.
+
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/faq.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/faq.html
index df52ea0e5..f7f7c8768 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/faq.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/faq.html
@@ -43,14 +43,14 @@ Yes! Actually, you MUST customize it! For your own games, you always create a cu
-You should break app your application logic into components by spreading it out over individual AppStates. AppStates can be attached to and detached from the game. AppStates have access to all objects (rootNode, PhysicsSpace, inputManager, etc) and methods in your main application. So each AppState can bring its own subset of input handlers, GUI nodes, spatial nodes, and even its own subset of game mechanics in the update() loop.
+You should break down your application logic into components by spreading it out over individual AppStates. AppStates can be attached to and detached from the game. AppStates have access to all objects (rootNode, PhysicsSpace, inputManager, etc) and methods in your main application. So each AppState can bring its own subset of input handlers, GUI nodes, spatial nodes, and even its own subset of game mechanics in the update() loop.
Learn more:Application States.
-Make sure to only load() models converted to .j3o binary format, not the original Ogre or Wavefront formats. If you load assets from zip files, make sure to ammend the build script to copy them ito the build.
+Make sure to only load() models converted to .j3o binary format, not the original Ogre or Wavefront formats. If you load assets from zip files, make sure to ammend the build script to copy them to the build directory.
Learn more:Asset Manager
-You can use jBullet's CharacterControl that locks a physical object upright, so it does not tip over when moving/walking (as tall physical objects are wont to do).
+You can use jBullet's CharacterControl that locks a physical object upright, so it does not tip over when moving/walking (as tall physical objects are typically wanted to).
Learn more: CharacterControl
@@ -540,7 +540,7 @@ Code samples:
+
@@ -775,12 +775,12 @@ If your game is heavily using features that older cards do not support, you can
Logger.getLogger(HelloJME3.class.getName()).log(Level.INFO, "Capabilities: {0}", caps.toString());
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/appsettings.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/appsettings.html
index b6df625f4..6ee0d853a 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/appsettings.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/appsettings.html
@@ -8,7 +8,7 @@ Every class that extends jme3.app.SimpleApplication has properties that can be c
-
Configure application settings in main(), before you call app.start() on the application object. If you change display settings during runtime, for eyample in simpleInitApp(), you must call app.restart() to make them take effect.
+
Configure application settings in main(), before you call app.start() on the application object. If you change display settings during runtime, for example in simpleInitApp(), you must call app.restart() to make them take effect.
@@ -47,14 +47,14 @@ This example toggles the settings to fullscreen while the game is already runnin
int i=0; // note: there are usually several, let's pick the first
settings.setResolution(modes[i].getWidth(),modes[i].getHeight());
settings.setFrequency(modes[i].getRefreshRate());
- settings.setDepthBits(modes[i].getBitDepth());
+ settings.setBitsPerPixel(modes[i].getBitDepth());
settings.setFullscreen(device.isFullScreenSupported());
app.setSettings(settings);
app.restart(); // restart the context to apply changes
}
@@ -94,7 +94,7 @@ Set VSync to false to deactivate vertical syncing (faster, but possible page tea
60 fps
-
+
Settings Property (Input)
Description
Default
@@ -111,7 +111,7 @@ Set VSync to false to deactivate vertical syncing (faster, but possible page tea
setEmulateMouseFlipAxis(true,true)
Flips the X or Y (or both) axes for the emulated mouse. Set the first parameter to true to flip the x axis, and the second to flip the y axis.
false,false
-
+
Settings Property (Audio)
Description
Default
@@ -122,7 +122,7 @@ Set VSync to false to deactivate vertical syncing (faster, but possible page tea
setStereo3D(true)
Enable 3D stereo. This feature requires hardware support from the GPU driver. See . Currently, your everday user's hardware does not support this, so you can ignore it for now.
A custom splashscreen image in the assets/Interface directory which is displayed when the settings dialog is shown.
"/com/jme3/app/Monkey.png"
-
+
You can use app.setShowSettings(true); and setSettingsDialogImage("Interface/mysplashscreen.png") to present the user with jme3's default display settings dialog when starting the game. Use app.setShowSettings(false); to hide the default settings screen. Set this boolean before calling app.start() on the SimpleApplication.
@@ -145,7 +145,7 @@ ImageIO.read(new File("")), ???});
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/best_practices.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/best_practices.html
index b45f8f268..fe1b95cb3 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/best_practices.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/best_practices.html
@@ -158,7 +158,7 @@ Whether you work in a team or alone, keeping a version controlled repository of
Treat commit messages as messages to your future self. "Made some changes" is not a commit message.
-
The jMonkeyEngine SDK supports Subversion, Mercurial, and CVS.
+
The jMonkeyEngine SDK supports Subversion, Mercurial, and Git.
If you don't know which to choose, Subversion is a good choice for starters.
Set up your own local server, or get free remote hosting space from various open-source dev portals like , , (supports private projects), , ???
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/how_to_use_materials.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/how_to_use_materials.html
index 6f8f200d0..d13cdda5a 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/how_to_use_materials.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/how_to_use_materials.html
@@ -294,7 +294,7 @@ To make a Geometry transparent or translucent:
Put the Geometry (not the Material!) in the appropriate render queue bucket.
-Objects in the translucent bucket (e.g. particles) are not affected by SceneProcessors (e.g. shadows). Obejcts in the transparent bucket (e.g. foliage) are affected by SceneProcessors (e.g. shadows).
+Objects in the translucent bucket (e.g. particles) are not affected by SceneProcessors (e.g. shadows). Objects in the transparent bucket (e.g. foliage) are affected by SceneProcessors (e.g. shadows).
geo.setQueueBucket(Bucket.Translucent);
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/math.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/math.html
index a66f936a6..f788b083d 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/math.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/math.html
@@ -109,7 +109,7 @@ float z = FastMath.sin(phi)*r;
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/multi-media_asset_pipeline.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/multi-media_asset_pipeline.html
index 144caf8de..38830a730 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/multi-media_asset_pipeline.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/multi-media_asset_pipeline.html
@@ -20,7 +20,7 @@ Assets are files that are not code. Your multi-media assets includes, for exampl
DO
DON'T
-
Save original models plus textures into assets/Textures.
Don't leave textures or models in a folder outside your JME project: The game cannot load or reference them from there.
+
Import original models plus textures into assets/Textures.
Don't leave textures or models in a folder outside your JME project: The game cannot load or reference them from there.
Save sounds into assets/Sounds.
Don't leave audio files in a folder outside your JME project: The game cannot load or reference them from there.
@@ -41,14 +41,14 @@ Assets are files that are not code. Your multi-media assets includes, for exampl
Agree on naming schemes and folder schemes with your artists early on to avoid confusion. E.g. keep naming schemes for bones and certain model parts. Try to keep your assets folder clean, its like your codes class structure.
Don't mindlessly import downloaded models and other assets into your project without keeping a structure and knowing the files work. You can reimport, delete junk.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/optimization.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/optimization.html
index 1dbc1539b..54c573de9 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/optimization.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/intermediate/optimization.html
@@ -45,15 +45,41 @@ You can optimize nodes using the SceneComposer in the
+
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/ios.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/ios.html
index 0e2ab365d..169d5e89b 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/ios.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/ios.html
@@ -6,17 +6,23 @@
To use iOS deployment you need a computer running MacOSX and a version of Xcode 4.0+ installed. To deploy to a device or the Apple App Store, you need an Apple developer account.
+
+
Note that at the moment iOS deployment is in alpha state.
+
+
+
iOS deployment works via cross-compilation to native iOS ARM code, there is no virtual machine running on the device. The Avian JVM supports this feature while maintaining general compatibility to OpenJDK and JNI for native access. The minimum compatible iOS deployment target is 4.3.
-
Note that at the moment this option is in pre-alpha state and the system runs on a null renderer. This means there is no visual or audio output. You can however use the current system to explore the options and test cross-compiling your applications.
+
To install the iOS deployment plugin, go to Tools???Plugins and under "Available plugins" select the "iOS Support" plugin.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/math.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/math.html
index 305bd481f..414cd9af1 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/math.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/math.html
@@ -44,6 +44,30 @@ The definition of a coordinate system is defined in jME by the properties sent t
+
+
+Homogenous coordinates have an additional W value tacked on to the end. The XYZ values are to be divided by W to give the true coordinates.
+
+
+
+This has several advantages, one technical, some relevant to application programmers:
+
+
+
+Technically, it simplifies some formulae used inside the vector math. For example, some operations need to apply the same factor to the XYZ coordinates. Chain multiple operations of that kind (and vector math tends to do that), and you can save a lot of multiplications by simply keeping the scaling factor around and doing the multiplication to XYZ at the end of the pipeline, in the 3D card (which does accept homogenous coordinates).
+It also simplifies some formulae, in particular anything that is related to rotations.
+
+
+
+For application programmers, this means you can express infinitely long vectors that still have a direction - these tend to be used in lighting. Just use a W value of 0.0.
+
+
@@ -148,7 +172,7 @@ There are a few special matrices:
0
0
0
-
+
The Identity Matrix is the matrix with 1 on the diagonal entries and 0 for all other entries.
@@ -164,7 +188,7 @@ The Identity Matrix is the matrix with 1 on the diagonal entries and 0
0
0
1
-
+
A Matrix is invertible if there is a matrix M-1 where MM-1 = M-1M = I.
@@ -185,7 +209,7 @@ The transpose of a matrix M = [mij] is MT<
3
3
3
1
2
3
-
+
A Matrix is symmetric if M = MT.
@@ -201,7 +225,7 @@ A Matrix is symmetric if M = MT.
B
C
X
-
+
Where X, A, B, and C equal numbers
@@ -211,7 +235,7 @@ jME includes two types of Matrix classes: Matrix3f and Matrix4f. Matrix3f is a 3
@@ -270,14 +294,14 @@ Translation requires a 4x4 matrix, where the vector (x,y,z) is mapped to (x,y,z,
ST
1
-
+
where M is the 3x3 matrix (containing any rotation/scale information), T is the translation vector and ST is the transpose Vector of T. 1 is just a constant.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/terminology.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/terminology.html
index 05bc67ef1..20b48a131 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/terminology.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/jme3/terminology.html
@@ -352,11 +352,11 @@ See also: Water.
-MIP Map means that you provide one texture in two or three resolutions in one file (MIP = "multum in parvo" = "many in one"). Depending on how close (or far) the camera is, the engine automatically renders a more (or less) detailed texture for the object. Thus objects look smooth from close up, but don't waste resources with unspottable details when far away. Good for everything, but requires more time to create and more space to store textures. If you don't provide custom ones, the jMonkeyEngine creates basic MIP maps automatically as an optimization.
+MIP Map means that you provide one texture in two or three resolutions in one file (MIP = "multum in parvo" = "many in one"). Depending on how close (or far) the camera is, the engine automatically renders a more (or less) detailed texture for the object. Thus objects look detailed at close up, but also look good when viewed from far away. Good for everything, but requires more time to create and more space to store textures. If you don't provide custom ones, the jMonkeyEngine creates basic MIP maps automatically as an optimization.
@@ -579,7 +579,7 @@ A vector has a length and a direction, like an arrow in 3D space. A vector start
Vector3f v = new Vector3f( 8f , 0f , 33f ).add(new Vector3f( 0f , -2f , -2f )); // starts at (8,-2,31)
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/application_deployment.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/application_deployment.html
index 796bf7b5f..caa515174 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/application_deployment.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/application_deployment.html
@@ -15,10 +15,12 @@ After you have written and tested your game, you want to brand it and distribute
-You can set the jMonkeyEngine SDK to build an executable for iOS platforms. Mac support is work in progress.
+You can set the jMonkeyEngine SDK to build an executable for iOS platforms. A Mac with XCode installed is needed.
@@ -274,7 +276,7 @@ Learn more about iOS Support here
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/blender.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/blender.html
index e390c43bf..c8503d79e 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/blender.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/blender.html
@@ -158,15 +158,23 @@ By default a BlenderModelLoader is registered with your assetManager to load ble
+
Importing sky
+
+
loading world's horizon color as a background color if no sky type is used
+
+
loading sky without the texture
+
+
loading textured sky (including both generated and normal textures)
@@ -298,7 +306,7 @@ Here is the list of how blender features are mapped into jme.
Surface
Node
The surface is transformed to the proper mesh
-
+
Using BlenderLoader can allow you to use blend file as your local assets repository.
@@ -308,7 +316,7 @@ Probably versions before 2.49 will work pretty well too, but I never checked tha
@@ -321,6 +329,15 @@ Hope I will meet your expectations.
Be mindful of the result model vertices amount. The best results are achieved when the model is smooth and has no texture. Then the vertex amount is equal to the vertex amount in blender. If the model is not smooth or has a generated texture applied then the amount of vertices is 3 times larger than mesh's triangles amount. If a 2d texture is applied with UV mapping then the vertex count will vary depending on how much the UV map is fragmented.
+
+When using polygon meshes in blender 2.5 and newer, better add and apply the triangulation modifier (if available in your version) or save the file with convertion from polygons to triangles.
+Even though the importer supports loading of polygons as the mesh faces, if your face isn't convex, the results might contain errors.
+
+
+
+Not all modifiers are supported. If your model has modifiers and looks not the way you want in the jme scene - try to apply them and load again.
+
+
Cheers,
Marcin Roguski (Kaelthas)
@@ -349,5 +366,5 @@ See also:
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/development.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/development.html
index 5fd7aeb9a..ff5463bd0 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/development.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/development.html
@@ -78,6 +78,26 @@ If you feel like you want to make an addition to jMonkeyEngine SDK. It can contain editors, simple ???Java SE Libraries??? that you can add to your projects as jar files and other things like project templates etc.
+
+
A ???module??? is the project type that allows you to create plugins, strictly speaking all plugins are modules but there can be modules that are never shown in the plugin list and only exist as dependencies of other modules.
+
+
A ???library??? is an entry for a jar file (and optionally sources and javadocs) which can be added to a SDK project to be used and distributed with it
+
+
An ???extension??? is a generic name for stuff that extends the jME engine, like pathfinding algorithms or anything that can be used at the game runtime..
+
+
+
+
+
+So if you have some cool code that others can use in their games too, you would make your extension a library by creating a module that the users can download as a plugin :)
+
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/material_editing.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/material_editing.html
index 0f88f5927..be7f4b7ab 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/material_editing.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/material_editing.html
@@ -112,7 +112,7 @@ Or in your Java code
Use a loader and a setter to assign the material to a Geometry
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/scene_explorer.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/scene_explorer.html
index a6c55aff1..0761cae9e 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/scene_explorer.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/scene_explorer.html
@@ -30,11 +30,11 @@ The SceneExplorer displays Nodes in a tree that represents the tree of Spatials
-You open the SceneExplorer by viewing a model (j3o file or other) in the jMonkeyEngine SDK.
+SceneExplorer works in conjunction with SceneComposer, the default editor for J3O files in the jMonkeyEngine IDE. If SceneExplorer doesn't appear when you select "Edit in SceneComposer", choose Window ??? SceneExplorer from the menu bar to reveal the window.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/troubleshooting.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/troubleshooting.html
index 981fbef5d..1dc4e395b 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/troubleshooting.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/troubleshooting.html
@@ -4,30 +4,6 @@
-
-
-You should install the JDK (the one from Oracle, not OpenJDK) first, and then the jMonkey SDK. If jMonkeyEngine SDK cannot find a valid JDK although you have it installed, then you have to specify the location manually.
-
-
-
-
Go to your jMonkeyEngine SDK installation directory.
-Mac users right-click jMonkeyApplication.app (which actually is a directory) in the Finder and select "Show package contents".
-
-
Navigate to the etc directory.
-Mac users navigate to Contents/Resources/jmonkeyplatform/etc/.
-
-
Open the file jmonkeyplatform.conf in a text editor.
-
-
Uncomment the following line and enter the path to the JDK:
+
+You can install another JDK for use with the jMonkey SDK. You then have to specify the location manually.
+
+
+
+
Go to your jMonkeyEngine SDK installation directory.
+Mac users right-click jMonkeyApplication.app (which actually is a directory) in the Finder and select "Show package contents".
+
+
Navigate to the etc directory.
+Mac users navigate to Contents/Resources/jmonkeyplatform/etc/.
+
+
Open the file jmonkeyplatform.conf in a text editor.
+
+
Uncomment the following line and enter the path to the JDK:
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/version_control.html b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/version_control.html
index b929ecc6d..8ac499545 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/version_control.html
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/sdk/version_control.html
@@ -4,7 +4,7 @@
-Whether you work in a development team or alone: File versioning is a handy method to keep your code consistent, compare files line-by-line, and even roll back unwanted changes. This documentation shows you how to make the most of the SDK's integrated version control features for Subversion, Mercurial, and CVS.
+Whether you work in a development team or alone: File versioning is a handy method to keep your code consistent, compare files line-by-line, and even roll back unwanted changes. This documentation shows you how to make the most of the SDK's integrated version control features for Subversion, Mercurial, and Git.
@@ -31,7 +31,7 @@ Note: Since the jMonkeyEngine SDK
-The jMonkeyEngine SDK supports various Version Control Systems such as Subversion, Mercurial, and CVS. No matter which of them you use, they all share a common user interface.
+The jMonkeyEngine SDK supports various Version Control Systems such as Subversion, Mercurial, and Git. No matter which of them you use, they all share a common user interface.
@@ -50,7 +50,7 @@ Requirements:
You must have a project that you want to version.
-
You must have version control software installed (Subversion, Mercurial, or CVS) and have initialized a repository.
+
You must have version control software installed (Subversion, Mercurial, or Git) and have initialized a repository.
Tip: For Subversion, for example, the init command looks like this example: svnadmin create /home/joe/jMonkeyProjects/MyGame
@@ -70,7 +70,7 @@ Now you create a repository to store your project's files.
-
In the jMonkeyEngine SDK, right-click the project in the Projects window and choose Versioning > Import Into CVS/Subversion Repository (or initialize Mercurial Project, respectively).
+
In the jMonkeyEngine SDK, right-click the project in the Projects window and choose Versioning > Import Into Subversion Repository (or initialize Mercurial Project, etc, respectively).
Tip: If you haven't evaluated yet which system to choose, start with Subversion for now.
@@ -81,7 +81,7 @@ Now you create a repository to store your project's files.
\ No newline at end of file
diff --git a/sdk/jme3-documentation/src/com/jme3/gde/docs/wiki-map.xml b/sdk/jme3-documentation/src/com/jme3/gde/docs/wiki-map.xml
index 501eeb9fc..f4fb29835 100644
--- a/sdk/jme3-documentation/src/com/jme3/gde/docs/wiki-map.xml
+++ b/sdk/jme3-documentation/src/com/jme3/gde/docs/wiki-map.xml
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file