Pārlūkot izejas kodu

Merge pull request #1 from jMonkeyEngine/master

update wiki
Yan 8 gadi atpakaļ
vecāks
revīzija
33cebec7e4
100 mainītis faili ar 3371 papildinājumiem un 1715 dzēšanām
  1. 1 1
      src/docs/asciidoc/documentacao.adoc
  2. 11 10
      src/docs/asciidoc/documentation.adoc
  3. 2 2
      src/docs/asciidoc/documentation_de.adoc
  4. 1 1
      src/docs/asciidoc/documentation_zh.adoc
  5. 1 1
      src/docs/asciidoc/gsoc/ideas.adoc
  6. 1 1
      src/docs/asciidoc/gsoc/students_handbook.adoc
  7. 1 1
      src/docs/asciidoc/jm3/solutions.adoc
  8. 97 78
      src/docs/asciidoc/jme3.adoc
  9. 61 18
      src/docs/asciidoc/jme3/advanced/3d_models.adoc
  10. 19 7
      src/docs/asciidoc/jme3/advanced/animation.adoc
  11. 5 5
      src/docs/asciidoc/jme3/advanced/anisotropic_filtering.adoc
  12. 10 6
      src/docs/asciidoc/jme3/advanced/application_states.adoc
  13. 1 1
      src/docs/asciidoc/jme3/advanced/appstatesdemo.adoc
  14. 12 7
      src/docs/asciidoc/jme3/advanced/asset_manager.adoc
  15. 18 18
      src/docs/asciidoc/jme3/advanced/atom_framework/ai.adoc
  16. 1 1
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore.adoc
  17. 1 1
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/entitysystem.adoc
  18. 8 8
      src/docs/asciidoc/jme3/advanced/atom_framework/atomexasset.adoc
  19. 11 11
      src/docs/asciidoc/jme3/advanced/atom_framework/cc.adoc
  20. 8 8
      src/docs/asciidoc/jme3/advanced/atom_framework/design/patterns.adoc
  21. 2 2
      src/docs/asciidoc/jme3/advanced/atom_framework/docs.adoc
  22. 6 6
      src/docs/asciidoc/jme3/advanced/atom_framework/facial.adoc
  23. 29 8
      src/docs/asciidoc/jme3/advanced/audio.adoc
  24. 6 9
      src/docs/asciidoc/jme3/advanced/bloom_and_glow.adoc
  25. 9 2
      src/docs/asciidoc/jme3/advanced/camera.adoc
  26. 38 38
      src/docs/asciidoc/jme3/advanced/capture_audio_video_to_a_file.adoc
  27. 12 5
      src/docs/asciidoc/jme3/advanced/cinematics.adoc
  28. 15 12
      src/docs/asciidoc/jme3/advanced/collision_and_intersection.adoc
  29. 183 179
      src/docs/asciidoc/jme3/advanced/custom_controls.adoc
  30. 30 25
      src/docs/asciidoc/jme3/advanced/custom_meshes.adoc
  31. 19 19
      src/docs/asciidoc/jme3/advanced/debugging.adoc
  32. 101 80
      src/docs/asciidoc/jme3/advanced/effects_overview.adoc
  33. 10 12
      src/docs/asciidoc/jme3/advanced/endless_terraingrid.adoc
  34. 142 0
      src/docs/asciidoc/jme3/advanced/free_skymaps.adoc
  35. 21 17
      src/docs/asciidoc/jme3/advanced/hud.adoc
  36. 23 10
      src/docs/asciidoc/jme3/advanced/input_handling.adoc
  37. 19 14
      src/docs/asciidoc/jme3/advanced/j3m_material_files.adoc
  38. 41 0
      src/docs/asciidoc/jme3/advanced/jme3_ai.adoc
  39. 86 71
      src/docs/asciidoc/jme3/advanced/jme3_shadernodes.adoc
  40. 102 88
      src/docs/asciidoc/jme3/advanced/jme3_shaders.adoc
  41. 44 42
      src/docs/asciidoc/jme3/advanced/jme3_srgbpipeline.adoc
  42. 45 30
      src/docs/asciidoc/jme3/advanced/level_of_detail.adoc
  43. 16 14
      src/docs/asciidoc/jme3/advanced/light_and_shadow.adoc
  44. 21 21
      src/docs/asciidoc/jme3/advanced/loading_screen.adoc
  45. 32 11
      src/docs/asciidoc/jme3/advanced/localization.adoc
  46. 10 9
      src/docs/asciidoc/jme3/advanced/logging.adoc
  47. 1 1
      src/docs/asciidoc/jme3/advanced/makehuman_blender_ogrexml_toolchain.adoc
  48. 17 8
      src/docs/asciidoc/jme3/advanced/making_the_camera_follow_a_character.adoc
  49. 4 0
      src/docs/asciidoc/jme3/advanced/material_definitions.adoc
  50. 1 2
      src/docs/asciidoc/jme3/advanced/material_specification.adoc
  51. 229 67
      src/docs/asciidoc/jme3/advanced/materials_overview.adoc
  52. 35 32
      src/docs/asciidoc/jme3/advanced/mesh.adoc
  53. 377 0
      src/docs/asciidoc/jme3/advanced/mixamo.adoc
  54. 3 3
      src/docs/asciidoc/jme3/advanced/monkey_zone.adoc
  55. 8 4
      src/docs/asciidoc/jme3/advanced/motionpath.adoc
  56. 8 8
      src/docs/asciidoc/jme3/advanced/mouse_picking.adoc
  57. 1 1
      src/docs/asciidoc/jme3/advanced/multiple_camera_views.adoc
  58. 16 5
      src/docs/asciidoc/jme3/advanced/multithreading.adoc
  59. 11 11
      src/docs/asciidoc/jme3/advanced/nifty_gui.adoc
  60. 59 59
      src/docs/asciidoc/jme3/advanced/nifty_gui_java_layout.adoc
  61. 12 5
      src/docs/asciidoc/jme3/advanced/nifty_gui_overlay.adoc
  62. 6 6
      src/docs/asciidoc/jme3/advanced/nifty_gui_projection.adoc
  63. 35 35
      src/docs/asciidoc/jme3/advanced/nifty_gui_xml_layout.adoc
  64. 23 19
      src/docs/asciidoc/jme3/advanced/ogrecompatibility.adoc
  65. 3 3
      src/docs/asciidoc/jme3/advanced/open_game_finder.adoc
  66. 130 104
      src/docs/asciidoc/jme3/advanced/particle_emitters.adoc
  67. 128 0
      src/docs/asciidoc/jme3/advanced/pbr_part1.adoc
  68. 172 0
      src/docs/asciidoc/jme3/advanced/pbr_part2.adoc
  69. 189 0
      src/docs/asciidoc/jme3/advanced/pbr_part3.adoc
  70. 96 55
      src/docs/asciidoc/jme3/advanced/physics.adoc
  71. 5 4
      src/docs/asciidoc/jme3/advanced/physics_listeners.adoc
  72. 35 22
      src/docs/asciidoc/jme3/advanced/post-processor_water.adoc
  73. 3 3
      src/docs/asciidoc/jme3/advanced/ragdoll.adoc
  74. 4 1
      src/docs/asciidoc/jme3/advanced/read_graphic_card_capabilites.adoc
  75. 3 1
      src/docs/asciidoc/jme3/advanced/remote-controlling_the_camera.adoc
  76. 7 5
      src/docs/asciidoc/jme3/advanced/save_and_load.adoc
  77. 54 26
      src/docs/asciidoc/jme3/advanced/shape.adoc
  78. 10 8
      src/docs/asciidoc/jme3/advanced/sky.adoc
  79. 15 0
      src/docs/asciidoc/jme3/advanced/sourcecode.adoc
  80. 42 38
      src/docs/asciidoc/jme3/advanced/spatial.adoc
  81. 32 25
      src/docs/asciidoc/jme3/advanced/steer_behaviours.adoc
  82. 6 6
      src/docs/asciidoc/jme3/advanced/swing_canvas.adoc
  83. 43 38
      src/docs/asciidoc/jme3/advanced/terrain.adoc
  84. 6 2
      src/docs/asciidoc/jme3/advanced/terrain_collision.adoc
  85. 4 2
      src/docs/asciidoc/jme3/advanced/traverse_scenegraph.adoc
  86. 6 3
      src/docs/asciidoc/jme3/advanced/update_loop.adoc
  87. 20 15
      src/docs/asciidoc/jme3/advanced/vehicles.adoc
  88. 11 9
      src/docs/asciidoc/jme3/advanced/walking_character.adoc
  89. 12 15
      src/docs/asciidoc/jme3/advanced/water.adoc
  90. 20 17
      src/docs/asciidoc/jme3/android.adoc
  91. 11 11
      src/docs/asciidoc/jme3/atomixtuts.adoc
  92. 20 20
      src/docs/asciidoc/jme3/atomixtuts/bladegame.adoc
  93. 10 10
      src/docs/asciidoc/jme3/atomixtuts/cardsgame.adoc
  94. 4 4
      src/docs/asciidoc/jme3/atomixtuts/cardsgame/adtechs.adoc
  95. 6 6
      src/docs/asciidoc/jme3/atomixtuts/cardsgame/assets.adoc
  96. 32 32
      src/docs/asciidoc/jme3/atomixtuts/design.adoc
  97. 7 7
      src/docs/asciidoc/jme3/atomixtuts/heavenrtsgame.adoc
  98. 18 18
      src/docs/asciidoc/jme3/atomixtuts/kickgame.adoc
  99. 6 6
      src/docs/asciidoc/jme3/atomixtuts/kickgame/assets.adoc
  100. 23 23
      src/docs/asciidoc/jme3/atomixtuts/mmorpg.adoc

+ 1 - 1
src/docs/asciidoc/documentacao.adoc

@@ -39,7 +39,7 @@ a| Fontes
 
 a| Aprenda mais…
 a| <<sdk#,Utilizando o SDK>> +<<sdk/project_creation#,Criação de Projeto>> +
-image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,with="144",height="90",align="center"]
+image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,width="144",height="90",align="center"]
 
 a| <<jme3/maven#,Configurando o JME3 com IDE compatívels com maven>> * +<<jme3/setting_up_netbeans_and_jme3#,Configurando o JME3 no NetBeans IDE>> * +<<jme3/setting_up_jme3_in_eclipse#,Configurando o JME3 no Eclipse IDE>> * +<<jme3/eclipse_jme3_android_jnindk#,Configurando o JME3 no Eclipse IDE (com Android e/ou JNI/NDK)>> *
 a| <<jme3/build_from_sources#,Compilando JME3 a partir dos Fontes>> +<<jme3/build_jme3_sources_with_netbeans#,Compilando jME3 a partir dos Fontes com NetBeans>> +<<jme3/simpleapplication_from_the_commandline#,Configurando o jME3 na linha de comando>>

+ 11 - 10
src/docs/asciidoc/documentation.adoc

@@ -2,6 +2,7 @@
 :author:
 :revnumber:
 :revdate: 2016/03/17 20:48
+:experimental:
 :keywords: documentation, sdk, install
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
@@ -28,9 +29,9 @@ a| Use jMonkeyEngine in another IDE
 a| Build custom engine from sources
 
 a| Then download…
-a| link:https://github.com/jMonkeyEngine/sdk/releases/tag/stable[jMonkeyEngine SDK]
-a| link:https://github.com/jMonkeyEngine/sdk/releases[Binaries]
-a| link:https://github.com/jMonkeyEngine/jmonkeyengine[Sources]
+a| link:https://github.com/jMonkeyEngine/sdk/releases[jMonkeyEngine SDK]
+a| link:https://github.com/jMonkeyEngine/jmonkeyengine/releases[Binaries]
+a| link:https://github.com/jMonkeyEngine/jmonkeyengine[Engine Sources]
 
 a| You receive…
 a| SDK, binaries, javadoc, sources
@@ -52,7 +53,7 @@ a|
 * <<jme3/simpleapplication_from_the_commandline#,Setting up JME3 on the commandline>>
 |===
 
-(*) The SDK creates Ant-based projects that any Java IDE can import. We recommend users of other IDEs to also download the jMonkeyEngine SDK and choose “File→Import Project→External Project Assets to create a codeless project for managing assets only. This way you can code in the IDE of your choice, and use the SDK to convert your models to .j3o format.
+pass:[*] The SDK creates Ant-based projects that any Java IDE can import. We recommend users of other IDEs to also download the jMonkeyEngine SDK and choose `menu:File[Import Project > External Project Assets]` to create a codeless project for managing assets only. This way you can code in the IDE of your choice, and use the SDK to convert your models to .j3o format.
 
 
 == Create
@@ -65,15 +66,15 @@ a| Tutorials
 a| jMonkeyEngine SDK
 a| Other Documentation
 
-a| <<jme3#tutorials_for_beginners,jME3 beginner tutorials>>
+a| <<jme3#tutorials-for-beginners,jME3 beginner tutorials>>
 a| <<sdk#,jMonkeyEngine SDK Documentation and Video Tutorials>>
 a| link:http://javadoc.jmonkeyengine.org/[Full API JavaDoc]
 
-a| <<jme3#documentation_for_intermediate_users,jME3 intermediate articles>>
+a| <<jme3#documentation-for-intermediate-users,jME3 intermediate articles>>
 a| <<sdk/comic#,jMonkeyEngine SDK - the Comic :-)>>
 a| <<jme3/external/blender#,Blender Modeling Guide>>
 
-a| <<jme3#documentation_for_advanced_users,jME3 advanced documentation>>
+a| <<jme3#documentation-for-advanced-users,jME3 advanced documentation>>
 <a|
 a| <<jme3/faq#,Answers to Frequently Asked Questions>>
 
@@ -94,10 +95,10 @@ Are you an experienced Java developer who wants to add new features or contribut
 
 == Contact
 
-You are welcome to contribute and inquire about the project: Please mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[contact] the link:http://jmonkeyengine.org/team/[developers] or ask on the link:http://hub.jmonkeyengine.org/[forums].
+You are welcome to contribute and inquire about the project: Please contact the link:https://hub.jmonkeyengine.org/badges/103/core-developer[developers] or ask on the link:http://hub.jmonkeyengine.org/[forums].
 
-*  mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[Contact the jME team]
-**  link:http://jmonkeyengine.org/team/[Core team - Who are we?]
+*  link:https://hub.jmonkeyengine.org/badges/103/core-developer[Contact the jME team]
+**  <<team#,[Core team - Who are we?]>>
 
 *  <<report_bugs#,Report a bug>>
 *  link:http://hub.jmonkeyengine.org/c/documentation-jme3[Report unclear or missing documentation]

+ 2 - 2
src/docs/asciidoc/documentation_de.adoc

@@ -46,7 +46,7 @@ a| Quellcodes
 
 a| Erfahre mehr …
 a| <<sdk#,Benutzung des SDK>> +<<sdk/project_creation#,Projekte erstellen>> +
-image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,with="144",height="90",align="center"]
+image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,width="144",height="90",align="center"]
 
 a| <<jme3/setting_up_netbeans_and_jme3#,Nutzung der jME3 in NetBeans>> * +<<jme3/setting_up_jme3_in_eclipse#,Nutzung der jME3 in Eclipse>> *
 a| <<jme3/build_from_sources#,Kompilieren der jME3 aus den Quellcodes>> +<<jme3/build_jme3_sources_with_netbeans#,Kompilieren der jME3 aus den Quellcodes mit NetBeans>> +<<jme3/simpleapplication_from_the_commandline#,Einrichtung der jME3 über die Kommandozeileneingabe>>
@@ -100,5 +100,5 @@ Gerne darfst du unser Projekt unterstützen, oder Fragen dazu stellen: Bitte mai
 **  link:http://jmonkeyengine.org/team/[Das Kern-Team - Wer sind wir?]
 **  link:http://jmonkeyengine.org/groups/contributor/members/[Mitarbeiter - Wer sind wir?]
 
-*  link:http://jmonkeyengine.org/wiki/doku.php/report_bugs[Du hast einen Fehler gefunden? Hier kannst du ihn melden!]
+*  <<report_bugs#,Du hast einen Fehler gefunden? Hier kannst du ihn melden!>>
 *  link:http://code.google.com/p/jmonkeyengine/issues/list?can=2&q=label:Component-Docs[Es fehlt etwas in der Doku? Bitte gib uns bescheid!]

+ 1 - 1
src/docs/asciidoc/documentation_zh.adoc

@@ -39,7 +39,7 @@ a| Sources
 
 a| 更多学习内容…
 a| <<sdk_zh#,学习使用SDK>> +<<sdk/project_creation_zh#,使用SDK创建工程>> +
-image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,with="144",height="90",align="center"]
+image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,width="144",height="90",align="center"]
 
 a| <<jme3/maven_zh#,在任何兼容maven的IDE中集成JME3>> * +<<jme3/setting_up_netbeans_and_jme3_zh#,在NetBeans中集成JME3>> * +<<jme3/setting_up_jme3_in_eclipse_zh#,在Eclipse中集成JME3>> * +<<jme3/eclipse_jme3_android_jnindk_zh#,在Eclipse(含Android及JNI/NDK)中集成JME3>> *
 a| <<jme3/build_from_sources_zh#,编译JME3源码>> +<<jme3/build_jme3_sources_with_netbeans_zh#,在NetBeans中编译JME3源码>> +<<jme3/simpleapplication_from_the_commandline_zh#,在(Linux)命令行下开发JME3>>

+ 1 - 1
src/docs/asciidoc/gsoc/ideas.adoc

@@ -32,7 +32,7 @@ jME's sound engine is almost complete, but lacks more extensive testing and has
 
 === New terrain system
 
-One of the most sought after features for jME is a complete terrain system, topped off with a user-friendly visual editor. → link:http://jmonkeyengine.com/wiki/doku.php/terrain_systems[Terrain Systems]
+One of the most sought after features for jME is a complete terrain system, topped off with a user-friendly visual editor. → <<terrain_systems#,Terrain Systems>>
 
 
 === Basic AI system

+ 1 - 1
src/docs/asciidoc/gsoc/students_handbook.adoc

@@ -8,6 +8,6 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-This page is an extension of the link:http://www.jmonkeyengine.com/wiki/doku.php/contributors_handbook[contributor's handbook].
+This page is an extension of the <<contributors_handbook#,contributor's handbook>>.
 
 *  link:http://www.ogre3d.org/wiki/index.php/GSoC_Development_Advices[http://www.ogre3d.org/wiki/index.php/GSoC_Development_Advices]

+ 1 - 1
src/docs/asciidoc/jm3/solutions.adoc

@@ -7,7 +7,7 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-This is a user-proposed group of solutions for some or all of the exercises presented throughout the beginner tutorials (link:http://jmonkeyengine.org/wiki/doku.php/jme3#tutorials_for_beginners[http://jmonkeyengine.org/wiki/doku.php/jme3#tutorials_for_beginners]). 
+This is a user-proposed group of solutions for some or all of the exercises presented throughout the beginner tutorials (<<jme3#tutorials_for_beginners#,jme3#tutorials_for_beginners>>). 
 There are several ways to do them, so take what you see with a grain of salt, and actually try to do them yourself instead of jumping to the solution, for it is the best way to learn!
 
 

+ 97 - 78
src/docs/asciidoc/jme3.adoc

@@ -1,15 +1,46 @@
 = jMonkeyEngine Tutorials and Documentation
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, intro, intermediate, about
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
+== Installation
+
+*  <<bsd_license#,Use jMonkeyEngine 3 for free under the BSD License>>
+*  <<jme3/requirements#,Software and hardware requirements>>
+*  <<jme3/features#,All Supported Features>>
+*  link:https://github.com/jMonkeyEngine/sdk#jmonkeyengine-software-development-kit-sdk-[Download jMonkeyEngine 3 SDK]
+
+== SDK Documentation
+
+[.right]
+image::sdk/jmonkeyplatform-docu-2.png[jmonkeyplatform-docu-2.png,width="420",height="300"]
+
+
+The <<sdk#,jMonkeyEngine SDK>> is our recommended game development environment.
+
+*  <<sdk/comic#,jMonkeyEngine SDK - the Comic>>
+*  <<sdk#,SDK Documentation (All editors, plugins, etc)>>
+
+Here are some videos of how the jMonkeyEngine SDK makes your development team's life easier:
+
+*  link:http://www.youtube.com/watch?v=nL7woH40i5c[Video: Importing Models]
+*  link:http://www.youtube.com/watch?v=ntPAmtsQ6eM[Video: Scene Composing]
+*  link:http://www.youtube.com/watch?v=DUmgAjiNzhY[Video: Dragging&amp;Dropping Nodes]
+*  link:http://www.youtube.com/watch?v=Feu3-mrpolc[Video: Working with Materials]
+*  link:http://www.youtube.com/watch?v=oZnssg8TBWQ[Video: WebStart Deployment]
+*  link:http://www.youtube.com/watch?v=MNDiZ9YHIpM[Video: Custom Controls]
+*  Read the <<sdk#,SDK documentation>> for details.
+
+
 == Tutorials for Beginners
 
 The beginner tutorials demonstrate the most common use cases and explain basic concepts. We encourage you to run the sample codes and experiment with them. link:https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-examples/src/main/java/jme3test[All example code] is included in the jMonkeyEngine SDK: Simply create a new project from the `JmeTests` template. To start writing your own projects, create a new file from the `BasicGame` template.
+Note that Test apps in this example project are not necessarily the recommended way to build an app with JME, they are just simple one class test case that showcase a feature.
 
 
 [IMPORTANT]
@@ -18,8 +49,8 @@ The beginner tutorials demonstrate the most common use cases and explain basic c
 ====
 
 
-
-image::jme3/beginner/beginner-physics.png[beginner-physics.png,with="360",height="291",align="right"]
+[.right]
+image::jme3/beginner/beginner-physics.png[beginner-physics.png,width="360",height="291"]
 
 
 *  Make sure you are familiar with basic <<jme3/terminology#,3D game development concepts>> such as <<jme3/the_scene_graph#,the scene graph>>.
@@ -40,14 +71,13 @@ image::jme3/beginner/beginner-physics.png[beginner-physics.png,with="360",height
 
 See also: <<sdk/sample_code#,Trouble running the samples>>?
 
-For more help getting started, check out this tuts+ guide on “link:http://gamedevelopment.tutsplus.com/articles/how-to-learn-jmonkeyengine-3--gamedev-10479[ How to learn jMonkeyEngine 3].
 
 
 == Documentation for Intermediate Users
 
 Now that you understood the basics, let's put it all together. The following intermediate articles help you to understand how to use these concepts in context.
 
-*jMonkeyEngine3 Concepts*
+=== jMonkeyEngine3 Concepts
 
 *  <<jme3/intermediate/best_practices#,Best Practices>>
 *  <<jme3/intermediate/simpleapplication#,SimpleApplication>>
@@ -56,52 +86,59 @@ Now that you understood the basics, let's put it all together. The following int
 *  <<jme3/intermediate/optimization#,Optimization>>
 *  <<jme3/faq#,Frequently Asked Questions (FAQ)>>
 
-*Maths Concepts*
+=== Maths Concepts
 
 *  <<jme3/math_for_dummies#,jME3 Math for Dummies>>
 *  <<jme3/intermediate/math#,Short 3D math &quot;cheat sheet&quot;>>
 *  <<jme3/math#,jME3 math overview>>
 *  <<jme3/math_video_tutorials#,Videos: jME3 math video tutorial series>>
 
-*3D Graphics Concepts*
+=== 3D Graphics Concepts
 
 *  <<jme3/intermediate/multi-media_asset_pipeline#,Multi-Media Asset Pipeline>>
 *  <<jme3/scenegraph_for_dummies#,3D Scene Graph for Dummies>>
-**  <<jme3/beginner/hellovector#,Vector visualization &amp; vector operations>> – 
+**  <<jme3/beginner/hellovector#,Vector visualization &amp; vector operations>> –
 *  <<jme3/terminology#,3D Graphics Terminology>>
 *  <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>
 *  <<jme3/intermediate/transparency_sorting#,Transparency Sorting>>
 *  <<jme3/external/blender#,Creating compatible models in blender>>
 *  <<jme3/external/3dsmax#,Creating compatible models in 3dsmax>>
 
-*Game Tutorials*
+=== Game Tutorials
+
+*  link:https://gamedevelopment.tutsplus.com/series/cross-platform-vector-shooter-jmonkeyengine--gamedev-13757[Neon Vector Shooter tutorial on Tuts+]
 
-*  link:http://gamedevelopment.tutsplus.com/series/cross-platform-vector-shooter-jmonkeyengine--gamedev-13757[Neon Vector Shooter tutorial on Tuts+]
+=== Video Use Case Tutorials
 
-*Video Use Case Tutorials*
-- Note these videos use alpha features only available in the next release
+[NOTE]
+====
+These videos use alpha features only available in the next release.
+====
 
 *  link:http://www.youtube.com/watch?v=-OzRZscLlHY[Video: jMonkeyEngine SDK Use Case Demo 1 (Quixote)]
+**  <<jme3/advanced/sourcecode#,Source Code>>     
 *  link:http://www.youtube.com/watch?v=6-YWxD3JByE[Video: jMonkeyEngine SDK Use Case Demo 2 (Models and Materials)]
 
-Learn from sample code in link:https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-examples/src/main/java/jme3test[src/main/java/jme3test] (also available in the sdk by File &gt; New Project &gt; JME3 Tests) and the example games provided by the community!
+Learn from sample code in link:https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-examples/src/main/java/jme3test[src/main/java/jme3test] (also available in the sdk by `menu:File[New Project>JME3 Tests]`) and the example games provided by the community!
 
 
 == Documentation for Advanced Users
 
 Now that you understand the concepts, it's time to make the most of the jMonkeyEngine. Deep-dive into the +++<abbr title="Application Programming Interface">API</abbr>+++ and learn about all options, including less commonly used advanced methods. Don't over-extend yourself, developing a good game requires time and dedication. One step at a time, champ! :)
 
-*Controlling Game Logic*
+=== Controlling Game Logic
 
 *  <<jme3/advanced/update_loop#,Update Loop>>
 *  <<jme3/advanced/application_states#,Application States>>
 *  <<jme3/advanced/custom_controls#,Custom Controls>>
 **  link:http://www.youtube.com/watch?v=MNDiZ9YHIpM[Video: How to control any scene node]
+***  <<jme3/advanced/sourcecode#,Source Code>>     
 **  link:http://www.youtube.com/watch?v=-OzRZscLlHY[Video: How to remote control a character in a scene]
+***  <<jme3/advanced/sourcecode#how-to-control-a-character-in-a-scene-source-code#,Source Code>>     
 
 *  <<jme3/advanced/multithreading#,Multithreading>>
 
-*Managing Objects in the 3D Scene Graph*
+=== Managing Objects in the 3D Scene Graph
 
 *  <<jme3/advanced/traverse_scenegraph#,Traverse SceneGraph>>
 *  <<jme3/advanced/spatial#,Spatial: Node versus Geometry>>
@@ -115,7 +152,7 @@ Now that you understand the concepts, it's time to make the most of the jMonkeyE
 *  <<jme3/advanced/collision_and_intersection#,Collision and Intersection>>
 *  <<jme3/advanced/level_of_detail#,Level of Detail>>
 
-*Animations and Scenes*
+=== Animations and Scenes
 
 *  <<jme3/advanced/animation#,Animation>>
 *  <<jme3/advanced/cinematics#,Cinematics (cutscenes, fake destruction physics)>>
@@ -128,16 +165,24 @@ Now that you understand the concepts, it's time to make the most of the jMonkeyE
 **  link:https://docs.google.com/fileview?id=0B9hhZie2D-fENDBlZDU5MzgtNzlkYi00YmQzLTliNTQtNzZhYTJhYjEzNWNk&hl=en[Scene Workflow:]
 
 
-Create jme3 compatible racing tracks in blender
-* link:http://www.youtube.com/watch?v=3481ueuDJwQ&feature=youtu.be[Video: Create jme3 compatible models in blender]
+*  Create jme3 compatible racing tracks in blender
+**  link:http://www.youtube.com/watch?v=3481ueuDJwQ&feature=youtu.be[Video: Create jme3 compatible models in blender]
 
-Exporting OgreXML scenes from Blender to JME3
+*  Exporting OgreXML scenes from Blender to JME3
+**  link:https://docs.google.com/leaf?id=0B9hhZie2D-fEYmRkMTYwN2YtMzQ0My00NTM4LThhOTYtZTk1MTRlYTNjYTc3&hl=en[Animation Workflow: Create Animated UV-Mapped OgreXML Models in Blender, and use them in JME3]
+***  link:http://www.youtube.com/watch?v=IDHMWsu_PqA[Video: Creating Worlds with Instances in Blender]
+***  <<jme3/advanced/ogrecompatibility#,OgreCompatibility>>
 
-*  link:https://docs.google.com/leaf?id=0B9hhZie2D-fEYmRkMTYwN2YtMzQ0My00NTM4LThhOTYtZTk1MTRlYTNjYTc3&hl=en[Animation Workflow: Create Animated UV-Mapped OgreXML Models in Blender, and use them in JME3]
-**  link:http://www.youtube.com/watch?v=IDHMWsu_PqA[Video: Creating Worlds with Instances in Blender]
-**  <<jme3/advanced/ogrecompatibility#,OgreCompatibility>>
+*  CadNav -> Mixamo -> JME Workflow [Video]
+** link:https://youtu.be/jHgAgTWIers?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS[Part1- Download Free Human 3D Model From CadNav.com]
+** link:https://youtu.be/GQJSrOpNQwI?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS[Part 2- Rig and Animate Model in Mixamo]
+** link:https://youtu.be/JzRe2Dxbcmc?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS[Part 3- Import Model to JME]
+** link:https://youtu.be/8wwDRDJop7k?list=PLv6qR9TGkz8RcUr-fOHI2SksWA4BAU9TS[Part 4- Play Animation (Final Result)]
 
-*Materials, Light, Shadow*
+*  <<jme3/advanced/mixamo#,Animating Blender Models With Mixamo>>
+
+
+=== Materials, Light, Shadow
 
 *  <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>
 *  <<jme3/advanced/j3m_material_files#,Creating .j3m Materials>>
@@ -150,8 +195,12 @@ Exporting OgreXML scenes from Blender to JME3
 *  <<jme3/advanced/jme3_srgbpipeline#,Gamma correction or sRGB pipeline>>
 *  <<jme3/shader_video_tutorials#,Videos: jME3 introduction to shaders video tutorial series>>
 *  link:http://www.youtube.com/watch?v=IuEMUFwdheE[Video: jME3 Material with Alpha Channel]
+*  Article: Physically Based Rendering (PBR)
+**  <<jme3/advanced/pbr_part1#,Physically Based Rendering – Part one>>
+**  <<jme3/advanced/pbr_part2#,Physically Based Rendering – Part two>>
+**  <<jme3/advanced/pbr_part3#,Physically Based Rendering – Part three>>
 
-*Physics Integration*
+=== Physics Integration
 
 *  <<jme3/advanced/physics#,Physics: Gravity, Collisions, Forces>>
 *  <<jme3/advanced/bullet_multithreading#,Multi-Threaded Physics>>
@@ -163,7 +212,7 @@ Exporting OgreXML scenes from Blender to JME3
 *  <<jme3/advanced/ray_and_sweep_tests#,Physics Rays and Sweep Tests>>
 *  link:http://www.youtube.com/watch?v=yS9a9o4WzL8[Video: Mesh Tool &amp; Physics Editor]
 
-*Audio and Video*
+=== Audio and Video
 
 *  <<jme3/advanced/audio#,Audio: Playing Sounds>>
 *  <<jme3/advanced/audio_environment_presets#,Audio Environment Presets>>
@@ -171,13 +220,13 @@ Exporting OgreXML scenes from Blender to JME3
 *  <<jme3/advanced/screenshots#,Capture Screenshots>>
 *  <<jme3/advanced/capture_audio_video_to_a_file#,Capture Audio/Video to a File>>
 
-*Post-Processor Filters and Effects*
+=== Post-Processor Filters and Effects
 
 *  <<jme3/advanced/effects_overview#,Effects and Filters Overview>>
 *  <<jme3/advanced/bloom_and_glow#,Bloom and Glow>>
 *  <<jme3/advanced/particle_emitters#,Particle Emitters>>
 
-*Landscapes*
+=== Landscapes
 
 *  <<jme3/advanced/sky#,Sky>>
 *  <<jme3/advanced/terrain#,Terrain (TerraMonkey)>>
@@ -188,34 +237,35 @@ Exporting OgreXML scenes from Blender to JME3
 *  <<jme3/advanced/post-processor_water#,Post-Processor Water (SeaMonkey)>>
 *  <<jme3/contributions/vegetationsystem#,Vegetation System>>
 
-*Artificial Intelligence (AI)*
+=== Artificial Intelligence (AI)
 
 *  <<jme3/advanced/recast#,Recast Navigation>>
 *  <<jme3/advanced/building_recast#,Updating and building Recast Native Bindings>>
 *  <<jme3/advanced/monkey_brains#,Monkey Brains>>
 *  <<jme3/advanced/steer_behaviours#,Steer Behaviours>>
+*  <<jme3/advanced/jme3_ai#,jME3 Artificial Intelligence>>
 
-*Multiplayer Networking*
+=== Multiplayer Networking
 
 *  <<jme3/advanced/networking#,Multiplayer Networking (SpiderMonkey)>>
 *  <<jme3/advanced/headless_server#,Headless Server>>
 *  <<jme3/advanced/monkey_zone#,Monkey Zone: Multi-Player Demo Code>>
 *  <<jme3/advanced/open_game_finder#,Open Game Finder>>
-*  <<jme3/advanced/networking_video_tutorials#,Videos: jME3 networking video tutorial series>> 
+*  <<jme3/advanced/networking_video_tutorials#,Videos: jME3 networking video tutorial series>>
 
-*Entity Systems*
+=== Entity Systems
 
 *  <<jme3/contributions/entitysystem#, The Zay-ES Entity System>>
 
-*Camera*
+=== Camera
 
 *  <<jme3/advanced/camera#,Camera>>
 *  <<jme3/advanced/making_the_camera_follow_a_character#,Making the Camera Follow a Character>>
 *  <<jme3/advanced/remote-controlling_the_camera#,Remote-Controlling the Camera>>
-*  <<jme3/advanced/multiple_camera_views#,Multiple Camera Views>> 
+*  <<jme3/advanced/multiple_camera_views#,Multiple Camera Views>>
 *  <<jme3/beginner/hellochasecam#,Chase camera (aka 3rd person camera) example>>
 
-*User Interaction*
+=== User Interaction
 
 *  <<jme3/advanced/input_handling#,Input Handling>>
 **  link:https://github.com/jMonkeyEngine-Contributions/Lemur/wiki/Modules[Lemur Scene Graph Tools]
@@ -227,7 +277,7 @@ Exporting OgreXML scenes from Blender to JME3
 *  <<jme3/advanced/combo_moves#,Combo Moves>>
 *  <<jme3/advanced/mouse_picking#,Mouse Picking: Click to Select>>
 
-*Graphical User Interface*
+=== Graphical User Interface
 
 *  link:https://github.com/jMonkeyEngine-Contributions/Lemur[Lemur - a native jME3 GUI library with scene graph tools]
 *  <<jme3/contributions/tonegodgui#,tonegodGUI - a native jME3 GUI library>>
@@ -238,47 +288,47 @@ Exporting OgreXML scenes from Blender to JME3
 *  <<jme3/advanced/localization#,Localization>>
 *  <<jme3/advanced/swing_canvas#,Swing Canvas>>
 
-*Custom Rendering*
+=== Custom Rendering
 
 *  <<jme3/advanced/jme3_forwardrendering#,Forward Rendering process>>
 *  <<jme3/advanced/jme3_renderbuckets#,Render Buckets>>
 
-*Custom Tools*
+=== Custom Tools
 
 *  <<jme3/tools/navigation#,Mercator Projection Tool (Marine Navigation)>>
 *  <<jme3/tools/charts#,Visualizing Maps in JME3 (Marine Charts)>>
 *  <<jme3/advanced/atom_framework#,Atom framework. Mash-up of other plugins>>
 
-*Logging and Debugging*
+=== Logging and Debugging
 
 *  <<jme3/advanced/logging#,Logging>>
 *  <<sdk/log_files#,Log Files>>
 *  <<jme3/advanced/read_graphic_card_capabilites#,Read Graphic Card Capabilites>>
 *  <<jme3/advanced/debugging#,Debugging with Wireframes>>
 
-*Android specific development*
+=== Android specific development
 
 *  <<jme3/advanced/android#,Android Project Cheat Sheet>>
 
-*Deployment*
+=== Deployment
 
 *  <<jme3/android#,Android>>
 *  <<sdk/application_deployment#,Application Deployment (using jMonkeyEngine SDK)>>
 *  <<jme3/webstart#,WebStart Deployment (without jMonkeyEngine SDK)>>
 
-*Scripting*
+=== Scripting
 
 *  <<jme3/scripting#, Groovy scripting>>
 
-*Virtual Reality &amp; Simulation*
+=== Virtual Reality &amp; Simulation
 
 *  <<jme3/virtualreality#, Virtual Reality. OpenCV &amp; JavaCV>>
 
-*jMonkey User Contributions*
+=== jMonkey User Contributions
 
 *  <<jme3/contributions#, Contributions - User made utilities to add functionality to the engine.>>
 
-*Sample Projects*
+=== Sample Projects
 
 *  <<sdk/sample_code#,JmeTests>> – The “official sample project JmeTests.
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/BookSamples/#BookSamples%2Fsrc[BookSamples] – Some more jME3 code samples
@@ -292,40 +342,9 @@ These code examples are not supported by the core team and we cannot guarantee t
 *  link:http://code.google.com/p/street-rally-3d/source/browse/#svn%2Ftrunk%2Fsrc%2Fsr3d[Street rally 3d source code] – A racing game programmed by rhymez.
 
 
-== SDK Documentation
-
-
-image::sdk/jmonkeyplatform-docu-2.png[jmonkeyplatform-docu-2.png,with="420",height="300",align="right"]
-
-
-The <<sdk#,jMonkeyEngine SDK>> is our recommended game development environment.
-
-*  <<sdk/comic#,jMonkeyEngine SDK - the Comic>>
-*  <<sdk#,SDK Documentation (All editors, plugins, etc)>>
-
-Here are some videos of how the jMonkeyEngine SDK makes your development team's life easier:
-
-*  link:http://www.youtube.com/watch?v=nL7woH40i5c[Video: Importing Models]
-*  link:http://www.youtube.com/watch?v=ntPAmtsQ6eM[Video: Scene Composing]
-*  link:http://www.youtube.com/watch?v=DUmgAjiNzhY[Video: Dragging&amp;Dropping Nodes]
-*  link:http://www.youtube.com/watch?v=Feu3-mrpolc[Video: Working with Materials]
-*  link:http://www.youtube.com/watch?v=oZnssg8TBWQ[Video: WebStart Deployment]
-*  link:http://www.youtube.com/watch?v=MNDiZ9YHIpM[Video: Custom Controls]
-*  Read the <<sdk#,SDK documentation>> for details.
-
-
-== Installation
-
-*  <<bsd_license#,Use jMonkeyEngine 3 for free under the BSD License>>
-*  <<jme3/requirements#,Software and hardware requirements>>
-*  <<jme3/features#,All Supported Features>>
-*  link:http://jmonkeyengine.org/wiki/doku.php#Installation[Download jMonkeyEngine 3 SDK]
-
-
 == Feedback
 
 jME3 is in development; if a tutorial doesn't work as expected, try using the latest daily build. If that doesn't “fix it then:
 
-*  link:http://code.google.com/p/jmonkeyengine/issues/list?can=2&q=label:Component-Docs[Report a Documentation Task]
-*  link:http://jmonkeyengine.org/wiki/doku.php/report_bugs[Report a Bug]
-*  link:http://jmonkeyengine.org/forums[Ask (and Answer!) Questions on the Forum]
+*  <<report_bugs#,Report bugs or issues>>
+*  link:https://hub.jmonkeyengine.org/[Ask (and Answer!) Questions on the Forum]

+ 61 - 18
src/docs/asciidoc/jme3/advanced/3d_models.adoc

@@ -4,6 +4,7 @@
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
@@ -15,22 +16,29 @@ Like <<jme3/advanced/shape#,Shape>>s, 3D models are also made up of <<jme3/advan
 To use 3D models in a jME3 application:
 
 .  Export the 3D model in Ogre XML or Wavefront OBJ format. Export Scenes as Ogre DotScene format.
-.  Save the files into a subdirectory of your jME3 project's `assets` directory.
-.  In your code, you use the <<jme3/advanced/asset_manager#,Asset Manager>> to load models as <<jme3/advanced/spatial#,Spatial>>s into a jME application. 
+.  Save the files into a sub-directory of your jME3 `Assets` directory.
+.  In your code, you use the <<jme3/advanced/asset_manager#,Asset Manager>> to load models as <<jme3/advanced/spatial#,Spatial>>s into a jME application.
++
 [source,java]
 ----
 Spatial model = assetManager.loadModel(
     "Models/MonkeyHead/MonkeyHead.mesh.xml" );
 ----
 
-.  (For the release build:) Use the jMonkeyEngine SDK to convert models to .j3o format. You don't need this step as long you still develop and test the aplication within the jMonkeyEngine SDK.
+[NOTE]
+====
+(For the release build:) Use the jMonkeyEngine SDK to convert models to .j3o format. You don't need this step as long you still develop and test the application within the jMonkeyEngine SDK.
+====
 
 
 == Creating Models and Scenes
 
-To create 3D models and scenes, you need a 3D Mesh Editor such as link:http://www.blender.org/[Blender], with an OgreXML Exporter plugin. 
+To create 3D models and scenes, you need a 3D Mesh Editor such as link:http://www.blender.org/[Blender], with an <<jme3/advanced/ogrecompatibility#,OgreXML Exporter>> plugin. 
 
-*Tip:* Learn how to create link:http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/UV_Map_Basics[UV textures] for more complex models, it looks more professional. 
+[TIP]
+====
+Learn how to create link:http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/UV_Map_Basics[UV textures] for more complex models, it looks more professional. 
+====
 
 3D model editors are third-party products, so please consult their documentation for instructions how to use them. Here is an example workflow for Blender users:
 
@@ -38,16 +46,51 @@ To create 3D models and scenes, you need a 3D Mesh Editor such as link:http://ww
 
 To export your models as Ogre XML meshes with materials:
 
-.  Open the menu File &gt; Export &gt; OgreXML Exporter to open the exporter dialog.
-.  In the Export Materials field: Give the material the same name as the model. For example, the model `something.mesh.xml` goes with `something.material`, plus (optionally) `something.skeleton.xml`, and some JPG files.
-.  In the Export Meshes field: Select a target subdirectory of your `assets/Models/` directory. E.g. `assets/Models/something/`.
-.  Activate the following exporter settings: 
-**  Copy Textures: YES
-**  Rendering Materials: YES
-**  Flip Axis: YES
-**  Require Materials: YES
-**  Skeleton name follows mesh: YES
-
-.  Click export.
-
-You can now use the <<sdk#,jMonkeyEngine SDK>> to <<sdk/model_loader_and_viewer#,load and view models>>. You can <<sdk/scene_composer#,create scenes>> from them and write code that loads them into your application. 
+. jMonkeyEngine requires a material file to be named the same name as the model so prior to opening the export dialog make it so. The model will export files named `ModelName.mesh.xml` with a `ModelName.material`, plus (optionally) `ModelName.skeleton.xml`, and some JPG files.
+.  Open the menu `menu:File[Export > Ogre3D]` to open the exporter dialog.
+.  In the `File Path` field: Select a target sub-directory of your `Project Assets/Textures/` directory. E.g. `Project Assets/Textures/ModelName/`. See <<jme3/intermediate/best_practices#multi-media-asset-pipeline#,Best Practices>>.
+.  In the panel at the bottom left of the export window toggle the following export settings: 
+-  Swap Axis: xz-y
+- [*] Separate materials
+- [ ] Only Deformable Bones footnote:[Optional: If selected, and you have an Armature with the model, only the deform bones are exported.]
+- [ ] Export Scene footnote:[Toggle this to export your model in DotScene format]
+- [ ] Export Selected Only footnote:[Optional: If selected, you manually choose each object you want exported prior to opening the export dialog.]
+- [*] Export Meshes
+- [ ] Export Meshes Overwrite footnote:[Optional: If selected, it will overwrite the existing files in the target directory] 
+- [ ] Armature Animation footnote:[Optional: Only used if the model contains an armature.]
+-  Trim Weights footnote:[Occasionally when exporting you may get a warning complaining about vertices weighted to too many bones. You are then asked to try increasing the trim weights option. Slightly increase this spinner and try exporting again. Repeat the process until the warning goes away.]
+- [*] Export Materials
+.  Click Export Ogre.
+
+You can now use the <<sdk#,jMonkeyEngine SDK>> to <<sdk/model_loader_and_viewer#,load and view models>>. You can <<sdk/scene_composer#,create scenes>> from them and write code that loads them into your application.
+
+
+== Blender Buffer Clearing
+
+
+Before exporting your Blender models, its is recommended that you clean the buffers of any unneeded `Action`, `Material`, `Texture` or `UV Image`. This is a straight forward process that only takes a few minutes. Failure to do so can lead you into a morass of problems, like having more than one AnimControl, duplicate materials and textures, wasted space from worthless images, just to mention a few potential troubles.
+
+Clearing Blender Material, Texture, UV Image Buffers::
+.  Open the `UV Image Editor`, `Material Tab` or `Texture Tab`.
+.  Select the btn:[Browse] button located next to the material, texture or UV Image name to load the item to be cleared.
+.  While holding kbd:[Shift] down, click the btn:[X] button, also known as the btn:[Unlink datablock] button, located next to the loaded item. An item that is unlinked will show a `0` before it when viewed by selecting the btn:[Browse] button and will not be saved if you exit Blender.
+.  Save your file.
+.  From the `Info` header select `menu:File[Open Recent > Your Saved File]`, to close and re-open your file.
+
+The exception to this rule is the `Linked Action` buffer, for animations, located in the `Dope Sheet Editor`. 
+
+Clearing The Linked Action Buffer::
+.  In the `Dope Sheet Editor`, change the context to `Action Editor`.
+.  Click the `Action to be linked` button and select the action you want cleared.
+.  Deselect the btn:[F] button to prevent it from saving.
+.  Change the editor type from `Dope Sheet` to `NLA Editor`. You will see the action listed.
+.  Click the btn:[Double Down Arrow] button next to the action to push it into the stack.
+.  Click the small start next to the track name.
+.  With the mouse inside the `NLA Track List`,  press kbd:[X] to delete both the track and strip.
+.  Save your file.
+.  From the `Info` header, select `menu:File[Open Recent > Your Saved File]`.
+.  Save your file again.
+.  From the `Info` header, select `menu:File[Open Recent > Your Saved File]` again.
+.  Change back to the `Dope Sheet Editor`.
+.  Click the btn:[Browse Action to be linked] button and you will see only the baked action remains and the buffer is now clear of unwanted actions. Select your action.
+.  Save your file.

+ 19 - 7
src/docs/asciidoc/jme3/advanced/animation.adoc

@@ -103,10 +103,13 @@ a|Gets individual channels by index number. At most `getNumChannels()`.
 a|clearChannels()
 a|Clear all channels in this control.
 
-a|addListener(animEventListener) +removeListener(animEventListener) +clearListeners() 
+a|addListener(animEventListener) +
+removeListener(animEventListener) +
+clearListeners() 
 a|Adds or removes listeners to receive animation related events.
 
 |===
+
 [cols="2", options="header"]
 |===
 
@@ -116,7 +119,8 @@ a|Usage
 a|setAnimations(aniHashMap)
 a|Sets the animations that this AnimControl is capable of playing. The animations must be compatible with the skeleton given in the constructor.
 
-a|addAnim(boneAnim) +removeAnim(boneAnim)
+a|addAnim(boneAnim) +
+removeAnim(boneAnim)
 a|Adds or removes an animation from this Control.
 
 a|getAnimationNames()
@@ -129,6 +133,7 @@ a|getAnimationLength(“anim)
 a|Returns the length of the given named animation in seconds
 
 |===
+
 [cols="2", options="header"]
 |===
 
@@ -207,13 +212,16 @@ a|Usage
 a|addAllBones()
 a|Add all the bones of the model's skeleton to be influenced by this animation channel. (default)
 
-a|addBone(“bone1) +addBone(bone1)
+a|addBone(“bone1) +
+addBone(bone1)
 a|Add a single bone to be influenced by this animation channel.
 
-a|addToRootBone(“bone1) +addToRootBone(bone1) 
+a|addToRootBone(“bone1) +
+addToRootBone(bone1) 
 a|Add a series of bones to be influenced by this animation channel: Add all bones, starting from the given bone, to the root bone.
 
-a|addFromRootBone(“bone1) +addFromRootBone(bone1) 
+a|addFromRootBone(“bone1) +
+addFromRootBone(bone1) 
 a|Add a series of bones to be influenced by this animation channel: Add all bones, starting from the given root bone, going towards the children bones.
 
 |===
@@ -229,11 +237,15 @@ a|Channel Method
 a|Usage
 
 a|channel_walk.setAnim(“Walk,0.50f); 
-a| Start the animation named “Walk on channel channel_walk. +The float value specifies the time how long the animation should overlap with the previous one on this channel. If set to 0f, then no blending will occur and the new animation will be applied instantly.
+a| Start the animation named “Walk on channel channel_walk. +
+The float value specifies the time how long the animation should overlap with the previous one on this channel. If set to 0f, then no blending will occur and the new animation will be applied instantly.
 
 |===
 
-*Tip:* Use the AnimEventLister below to react at the end or start of an animation cycle.
+[TIP]
+====
+Use the AnimEventLister below to react at the end or start of an animation cycle.
+====
 
 
 === Usage Example

+ 5 - 5
src/docs/asciidoc/jme3/advanced/anisotropic_filtering.adoc

@@ -1,6 +1,6 @@
 = anisotropic_filtering
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -10,12 +10,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == Anisotropic Filtering for Textures
 
-Anisotropic Filtering is very important for Desktop Games and their textures. Most games use AnisotropicFiltering = 4/8/16. It sharpens your textures under different Angle View. 
+Anisotropic Filtering is very important for Desktop Games and their textures. Most games use AnisotropicFiltering = 4/8/16. It sharpens your textures under different Angle View.
 Anisotropy makes a performance draw back about 10-40 fps, but the result looks much better.
 
 See Example: link:http://i.imgur.com/0yiv9.jpg[http://i.imgur.com/0yiv9.jpg]
 
-image::jme3/advanced/anisotropy_example_mifth_01.jpg[anisotropy_example_mifth_01.jpg,with="360",height="900",align="right"]
+image::jme3/advanced/anisotropy_example_mifth_01.jpg[anisotropy_example_mifth_01.jpg,width="360",height="900",align="right"]
 
 
 JME has DEFAULT AnisotropicFiltering = 0. So, if you make a game for Windows/Linux/Mac.. you need to set the Anisotropic Filtering more than 0.
@@ -42,7 +42,7 @@ Example how to set AnisotropicFiltering = 4 for all textures:
 //                throw new UnsupportedOperationException("Not supported yet.");
             }
         };
-        
+
         assetManager.addAssetEventListener(asl);
 
 ----

+ 10 - 6
src/docs/asciidoc/jme3/advanced/application_states.adoc

@@ -38,16 +38,18 @@ You can! This is what AppStates are there for. An AppState class is subset of (o
 
 Each AppState lets you define what happens to it in the following situations:
 
-*  *The AppState is initialized:* You load and initialize game data, InputHandlers, AppStates and Controls and attach nodes. +The AppState executes its own simpleInitApp() method when it is attached, so to speak.
+*  *The AppState is initialized:* You load and initialize game data, InputHandlers, AppStates and Controls and attach nodes. +
+The AppState executes its own simpleInitApp() method when it is attached, so to speak.
 *  *The AppState has been enabled (unpaused):* This toggles a boolean isEnabled() to true. Here you attach nodes and listeners that should become active while it's running. 
-*  *While the AppState is running/paused:* You can poll isEnabled() to define paused and unpaused game behaviour in the update() loop. In update(), you poll and modify the game state, modify the scene graph, and trigger events. Test if `!isEnabled()`, and write code that skips the running sections of this AppState's `update()` loop. +Each AppState has its own update loop, which hooks into the main simpleUpdate() loop (callback). 
+*  *While the AppState is running/paused:* You can poll isEnabled() to define paused and unpaused game behaviour in the update() loop. In update(), you poll and modify the game state, modify the scene graph, and trigger events. Test if `!isEnabled()`, and write code that skips the running sections of this AppState's `update()` loop. +
+Each AppState has its own update loop, which hooks into the main simpleUpdate() loop (callback). 
 *  *The AppState has been disabled (paused):* This toggles a boolean isEnabled() to false. Here you switch all objects to their specific “paused behaviour. 
 *  *The AppState is cleaned up:* Here you decide what happens when the AppState is detached. Save this AppState's game state, unregister Controls and InputHandlers, detach related AppStates, detach nodes from the rootNode, etc.
 
 
 [TIP]
 ====
-Tip: AppStates are extremely handy to swap out, or pause/unpause whole sets of other AppStates. For example, an InGameState (loads in-game +++<abbr title="Graphical User Interface">GUI</abbr>+++, activates click-to-shoot input mappings, inits game content, starts game loop) versus MainScreenState (stops game loop, saves and detaches game content, switches to menu screen +++<abbr title="Graphical User Interface">GUI</abbr>+++, switches to click-to-select input mappings).
+AppStates are extremely handy to swap out, or pause/unpause whole sets of other AppStates. For example, an InGameState (loads in-game +++<abbr title="Graphical User Interface">GUI</abbr>+++, activates click-to-shoot input mappings, inits game content, starts game loop) versus MainScreenState (stops game loop, saves and detaches game content, switches to menu screen +++<abbr title="Graphical User Interface">GUI</abbr>+++, switches to click-to-select input mappings).
 ====
 
 
@@ -81,7 +83,7 @@ JME3 comes with a BulletAppState that implements Physical behaviour (using the j
 == AppState
 
 The AppState interface lets you initialize sets of objects, and hook a set of continuously executing code into the main loop.
-[cols="2", options="header"]
+[cols="25,75", options="header"]
 |===
 
 a|AppState Method
@@ -105,13 +107,15 @@ a|Here you implement the behaviour that you want to hook into the simpleUpdate()
 a|isInitialized()
 a|Your implementations of this interface should return the correct respective boolean value. (See AbstractAppState)
 
-a|setEnabled(true) +setEnabled(false)
+a|setEnabled(true) +
+setEnabled(false)
 a|Temporarily enables or disables an AppState. (See AbstractAppState) 
 
 a|isEnabled()
 a|Test whether AppState is enabled or disabled. Your implementation should consider the boolean. (See AbstractAppState)
 
-a|stateAttached(asm) +stateDetached(asm)
+a|stateAttached(asm) +
+stateDetached(asm)
 a|The AppState knows when it is attached to, or detached from, the AppStateManager, and triggers these two methods. Don't modify the scene graph from here! (Typically not used.) 
 
 a|render(RenderManager rm)

+ 1 - 1
src/docs/asciidoc/jme3/advanced/appstatesdemo.adoc

@@ -19,7 +19,7 @@ THIS DEMO IS OUT OF DATE AND NEEDS CORRECTING
 
 == THIS DEMO IS OUT OF DATE AND NEEDS CORRECTING FOR NOW PLEASE SEE
 
- link:http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:application_states[http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:application_states]
+ <<jme3/advanced/application_states#,jme3:advanced:application_states>>
 
 Note: this tutorial needs to be fixed and is currently not correct.  One should almost never override stateDetached and stateAttached… and should certainly never do anything scene related in them.
 

+ 12 - 7
src/docs/asciidoc/jme3/advanced/asset_manager.adoc

@@ -12,7 +12,8 @@ By assets we mean multi-media files, such as 3D models, materials, textures, sce
 Advantages of the AssetManager:
 
 *  The paths stay the same, no matter whether the game runs on Windows, Mac, Linux, etc!
-*  The AssetManager automatically caches and optimizes the handling of OpenGL objects. +For example, the same textures are not uploaded to the graphics card multiple times when multiple models use them.
+*  The AssetManager automatically caches and optimizes the handling of OpenGL objects. +
+For example, the same textures are not uploaded to the graphics card multiple times when multiple models use them.
 *  The <<sdk/default_build_script#,default build script>> automatically bundles the contents of the `assets` directory into the executable. 
 
 Advanced users can write a custom build and packaging script, and can register custom paths to the AssetManager, but this is up to you then. 
@@ -99,7 +100,8 @@ You can rename/delete/add (sub)directories inside the `assets` directory in any
 
 [IMPORTANT]
 ====
-Store textures in `assets/Textures/` before you work with them in a mesh editor! Export and save 3D model files (.mesh.xml+.material, .mtl+.obj, .blend) into the `assets/Textures/` (!) before you convert the model to binary format (.j3o)! This ensures that texture paths correctly point to the `assets/Textures` directory. +After the conversion, you move the .j3o file into the `assets/Models/` or `assets/Scenes/` directories. This way, you can reuse textures, your binaries consistently link the correct textures, and the `assets/Models` and `assets/Scenes` directories don't become cluttered.
+Store textures in `assets/Textures/` before you work with them in a mesh editor! Export and save 3D model files (.mesh.xml+.material, .mtl+.obj, .blend) into the `assets/Textures/` (!) before you convert the model to binary format (.j3o)! This ensures that texture paths correctly point to the `assets/Textures` directory. +
+After the conversion, you move the .j3o file into the `assets/Models/` or `assets/Scenes/` directories. This way, you can reuse textures, your binaries consistently link the correct textures, and the `assets/Models` and `assets/Scenes` directories don't become cluttered.
 ====
 
 
@@ -160,8 +162,9 @@ Alternatively to ZipLocator, there is also a HttpZipLocator that can stream mode
 [source,java]
 ----
 
-assetManager.registerLocator("http://jmonkeyengine.googlecode.com/files/wildhouse.zip", 
-                             HttpZipLocator.class);
+assetManager.registerLocator("https://storage.googleapis.com/"
+    + "google-code-archive-downloads/v2/code.google.com/"
+    + "jmonkeyengine/wildhouse.zip", HttpZipLocator.class);
 Spatial scene = assetManager.loadModel("main.scene");
 rootNode.attachChild(scene);
 
@@ -178,7 +181,7 @@ The custom build script does not automatically include all ZIP files in the exec
 
 
 === Common AssetManager Tasks
-[cols="2", options="header"]
+[cols="15,85", options="header"]
 |===
 
 a| Task? 
@@ -275,11 +278,13 @@ I use another IDE than jMonkeyEngine SDK for coding (Eclipse, IntelliJ, text edi
 You can code in any IDE, but you must create a so-called codeless project in the jMonkeyEngine SDK to maintain assets. *A code-less jMonkeyEngine project does not meddle with your sources or custom build scripts.* You merely use it to convert models to .j3o binaries. 
 
 .  Create your (Eclipse or whatever) project as you like.
-.  Create a directory in your project folder and name it, for example, `assets`. +Store your assets there as described above.
+.  Create a directory in your project folder and name it, for example, `assets`. +
+Store your assets there as described above.
 .  Download and install the jMonkeyEngine SDK.
 .  In the SDK, go to File → Import Projects → External Project Assets.
 .  Select your (Eclipse or whatever) project and your assets folder in the Import Wizard.
-.  You can now open this (Eclipse or whatever) project in the jMonkeyEngine SDK. +Convert assets as described above.
+.  You can now open this (Eclipse or whatever) project in the jMonkeyEngine SDK. +
+Convert assets as described above.
 
 
 [IMPORTANT]

+ 18 - 18
src/docs/asciidoc/jme3/advanced/atom_framework/ai.adoc

@@ -1,6 +1,6 @@
 = ai
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -15,7 +15,7 @@ Hi,
 This is the wiki for Atom AI framework.
 
 
-image::http://blogs.ifsworld.com/wp-content/uploads/2012/11/AI-lowres.jpg[AI-lowres.jpg,with="200",height="",align="right"]
+image::http://blogs.ifsworld.com/wp-content/uploads/2012/11/AI-lowres.jpg[AI-lowres.jpg,width="200",height="",align="right"]
 
 
 
@@ -29,12 +29,12 @@ image::http://blogs.ifsworld.com/wp-content/uploads/2012/11/AI-lowres.jpg[AI-low
 
 *Answer:* Everything… You can use this lib to:
 
-*   solve the common path finding, 
-*  let your creature know how to think and learn, 
-*  direct your vehicle the way to move, 
-*  your camera to interact with the screen, 
-*  teach your characters to walk/ talk/ shoot/ trading… 
-*  You can also use it in various type of simulations and 
+*   solve the common path finding,
+*  let your creature know how to think and learn,
+*  direct your vehicle the way to move,
+*  your camera to interact with the screen,
+*  teach your characters to walk/ talk/ shoot/ trading…
+*  You can also use it in various type of simulations and
 *  even try to solve a mathematic problem.
 
 *Question:* Sound wonderful…? But wait… It should be soooooooo freaking big and heavy, is it *real-time* shit?
@@ -58,15 +58,15 @@ This Atom AI framework are more or less a “framework to bring AI to jME3 game
 
 [TIP]
 ====
-Here is my picked list of <<jme3/advanced/atom_framework/ai/researches#,researches>> and articles you can read in AI field (game and none-game) 
+Here is my picked list of <<jme3/advanced/atom_framework/ai/researches#,researches>> and articles you can read in AI field (game and none-game)
 ====
 
 
 
 === Idea & Buzz
 
-*  It contains warpers for various java AI libraries build on top of light-weight, configable module architecture and provide the way to hook seamlessly to jME3 games. 
-*  It's also come up with a lot of working examples in several game genre (RTS, RPG, FPS, Sport,…). 
+*  It contains warpers for various java AI libraries build on top of light-weight, configable module architecture and provide the way to hook seamlessly to jME3 games.
+*  It's also come up with a lot of working examples in several game genre (RTS, RPG, FPS, Sport,…).
 *  40% of components, AI algorimth are rewritten by the author (@atomix) to be light-weight and usable in real-time application.
 *  Tend to be used in production application and games and suppose to support broadest cases it can.
 *  Users can use the pieces to build up their own AI part of their games and apps
@@ -79,12 +79,12 @@ Here is my picked list of <<jme3/advanced/atom_framework/ai/researches#,research
 
 (C) means with examples cases
 
-(E) means use| depend on external libs 
+(E) means use| depend on external libs
 
 
 [IMPORTANT]
 ====
-Note that: despite of the fact, the lib has a lot of dependencies, the author always try have simple fallback - homegrown implemention.  Of course, support a fewer use cases, mainly for specific game genres, but it's better than nothing, that's the bright side 
+Note that: despite of the fact, the lib has a lot of dependencies, the author always try have simple fallback - homegrown implemention.  Of course, support a fewer use cases, mainly for specific game genres, but it's better than nothing, that's the bright side
 ====
 
 
@@ -137,8 +137,8 @@ Read alternatives and searches if you want to go further than Atom!
 
 *  FSM , HFSM , FFSM for AI (T)
 *  Searching
-**  Path finding 
-***  algorimth: A Star, theta Star 
+**  Path finding
+***  algorimth: A Star, theta Star
 ***  space: Grid, Hex, Tris, Polys, 3D Block, 3D Terrain, NavMesh, points cloud/, graphs… [more]
 ***  generate methods: navmesh gen,jump points, choke points, viewset points, … [more]
 ***  re-touch methods: smooth, reduce, prunning, time-wise, cahing, progessive
@@ -150,7 +150,7 @@ Read alternatives and searches if you want to go further than Atom!
 
 
 *  Reasoning
-**  Decision Tree 
+**  Decision Tree
 **  Minimax
 **  Some academic stuffs …
 
@@ -191,7 +191,7 @@ iframe::http://bubbl.us/view/1860d6/2fd76d/15vmlQSf.3GMg/[width="98%", height="4
 
 As the framework grown up, I will bring more unit tests and example cases.
 
-Also it should has even better integration with the JME SDK and other Netbean's plugins like (weka, neuphons…). Corporate with Code gen, it's can easily replace Alice, Manson,etc…  as much better 3D non-coding enviroment and one day maybe become the most advanced AI simulation enviroment on earth! 
+Also it should has even better integration with the JME SDK and other Netbean's plugins like (weka, neuphons…). Corporate with Code gen, it's can easily replace Alice, Manson,etc…  as much better 3D non-coding enviroment and one day maybe become the most advanced AI simulation enviroment on earth!
 
 
 === FAQ

+ 1 - 1
src/docs/asciidoc/jme3/advanced/atom_framework/atomcore.adoc

@@ -111,7 +111,7 @@ In <<jme3/advanced/atom_framework/atomcore/beans#,AtomCore Bean>> are leverage i
 
 In JME3 we almost see the things work like this, the “almighty” Cycle:
 
-link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:update_loop[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:update_loop]
+<<jme3/advanced/update_loop#,jme3:advanced:update_loop>>
 
 .  Input listeners respond to mouse clicks and keyboard presses – Input handling
 .  Update game state:

+ 1 - 1
src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/entitysystem.adoc

@@ -23,7 +23,7 @@ Read: link:http://qi4j.org/[http://qi4j.org/]
 
 Read: link:http://hub.jmonkeyengine.org/forum/topic/entity-system-topic-united/[http://hub.jmonkeyengine.org/forum/topic/entity-system-topic-united/]
 
-link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:contributions:entitysystem:detailed[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:contributions:entitysystem:detailed]
+<<jme3/contributions/entitysystem/detailed#,jme3:contributions:entitysystem:detailed>>
 
 iframe::https://docs.google.com/presentation/d/1R5ovJi67i9ml6zAcmQPlSe9ZNem1Fuo14hoJZi3iRaY/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
 

+ 8 - 8
src/docs/asciidoc/jme3/advanced/atom_framework/atomexasset.adoc

@@ -1,6 +1,6 @@
 = atomexasset
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -23,9 +23,9 @@ The future assets pipeline for JME3 games!
 
 Pipeline is a common term in computing and also asset making. From sattelite view, pipeline is progresses between input and output.
 
-image:http://storm.incubator.apache.org/images/topology.png[400px,with="",height=""]
+image:http://storm.incubator.apache.org/images/topology.png[400px,width="",height=""]
 
-Here in game we talking about Assets aspect, mostly! 
+Here in game we talking about Assets aspect, mostly!
 
 In real world, converting-processing data and assets also require amount of times, efforts and cause headaches, almost comparable to making data and assets.
 
@@ -41,7 +41,7 @@ Some of the problems and solutions here can also be applied to other situation a
 
 Converting between things is a hard problem:
 
-*  Semantic: “things are different “in contexts. 
+*  Semantic: “things are different “in contexts.
 *  Incompatible: Converting almost one-direction only. Converter programs sometime not reliable and not support your data
 *  Hidden: Some format is unknown. Some require commercial and $$$
 *  Fault-tolerant: Currently almost asset pipeline is easy to fail and do not support recovery.
@@ -163,7 +163,7 @@ is equal with:
 
 but the later has extra effects:
 
-*  It put a update watcher over the entry point 
+*  It put a update watcher over the entry point
 **  the file in filesystem
 **  if you has config for that entry to “link to another remote point (git, remote asset central), it actually manage the linkage for you
 
@@ -171,7 +171,7 @@ but the later has extra effects:
 *  It manage the avaiablility, validation, necessarility of that entry if you are in a streaming scenario
 *  It let the assets pipeline fault tolerant.
 **  So if the entry point is not available yet, you has a place holder util the file is available. The “holding back effect also can be set if need
-**  If the request to the entry point actually timeouted, cached assets are used 
+**  If the request to the entry point actually timeouted, cached assets are used
 
 
 
@@ -228,4 +228,4 @@ Beside of Defacto of the building tools: Ant &amp; Maven, the new rising star Gr
 
 link:http://www.go.cd/[http://www.go.cd/]
 
-image:http://www.go.cd/images/home-image1.png[home-image1.png,with="",height=""]
+image:http://www.go.cd/images/home-image1.png[home-image1.png,width="",height=""]

+ 11 - 11
src/docs/asciidoc/jme3/advanced/atom_framework/cc.adoc

@@ -1,6 +1,6 @@
 = cc
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -25,7 +25,7 @@ Go to <<jme3/advanced/atom_framework/quickstart#,quickstart>> if you on a rush!
 
 ==== Ideas
 
-The initial idea of Character customization is: We (human) are soooo *similiar*!! 
+The initial idea of Character customization is: We (human) are soooo *similiar*!!
 
 The second idea: *resuable* and *composable*!
 
@@ -71,31 +71,31 @@ Try some example in Football game's character cusomization <<jme3/atomixtuts/kic
 
 === Screenshots & Video
 
-image:jme3/advanced/atom_framework/youtube_fcf6grenolg[youtube_fcf6grenolg,with="",height=""]
+image:jme3/advanced/atom_framework/youtube_fcf6grenolg[youtube_fcf6grenolg,width="",height=""]
 
 
 === Techniques
 
-*1) Blend shape* : 
+*1) Blend shape* :
 
-*2) Bone* : 
+*2) Bone* :
 
-*3) Free form deformation*: 
+*3) Free form deformation*:
 
 
 === Problems
 
-*1) Blend shape* : 
+*1) Blend shape* :
 
 I saw that going to be added into the core soon. So exciting, that will help a tons, as soon as finish, I will make a patch to help import blend shape from blender too. One thing I still have to consider is: Can we make a type of Mesh that save a whole topology from Blender or other CAD and then become the base mesh for futher manipulate?
 
-*2) Bone* : 
+*2) Bone* :
 
 I saw the current behavior of Bone, SkeletonControl are quite limited. I remember once @nehon explain that we don’t save the Length of the bone, but the trans/rot/scale just like a mat4… In fact, we can save more information in a Bone, and it will help tons when it come to a situation that someone want to manipulate the bone his self.
 
 _setUserControl_ didn’t sastify me cause I force me to patch the whole animation system just because I want to scale a bone up and down (ex: bigger nose for a character), and sync that with the existed animation. You can say it’s just my very own problem but …
 
-*3) Free form deformation*: 
+*3) Free form deformation*:
 
 For the need of cloth customization, I made my self a quick FFD system, in fact, it works extactly like a set of bones still have lengths and envelops on them. But in the end, once again I have to hack into the Mesh class and other things, just because a lot of private and final methods… It’s kind of sad that it should not be that hard for the engine users to add more features to the engine if the user want to.
 
@@ -114,7 +114,7 @@ At the end, I just want what I want, that mean I just want things work if it’s
 
 == Manuals
 
-Go Quick 
+Go Quick
 
 Go in depth
 

+ 8 - 8
src/docs/asciidoc/jme3/advanced/atom_framework/design/patterns.adoc

@@ -1,6 +1,6 @@
 = patterns
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../../
 :imagesdir: ../../../..
@@ -31,14 +31,14 @@ link:http://en.wikipedia.org/wiki/Comparison_of_programming_paradigms[http://en.
 ==== Java programming language
 
 
-image::http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Java_logo_and_wordmark.svg/150px-Java_logo_and_wordmark.svg.png[200,with="",height="",align="left"]
+image::http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Java_logo_and_wordmark.svg/150px-Java_logo_and_wordmark.svg.png[200,width="",height="",align="left"]
  *Java* is a computer programming language that is concurrent, class-based, object-oriented, (mostly) imperative, structured (also referred as strictly typed)
 
 emoji:sunglasses Suppose that when you read this wiki you already know what Java is (partly)
 
-*Groovy*… 
+*Groovy*…
 
-image::wiki/groovy-logo.png[200,with="",height="",align="right"]
+image::wiki/groovy-logo.png[200,width="",height="",align="right"]
 
 
 is an agile and dynamic language for the Java Virtual Machine
@@ -49,7 +49,7 @@ link:http://groovy.codehaus.org/[http://groovy.codehaus.org/]
 
 [TIP]
 ====
-Learn groovy: link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting]
+Learn groovy: <<jme3/scripting#,jme3:scripting>>
 ====
 
 
@@ -118,7 +118,7 @@ MVC Push was born in the world of “none frequent” and not suite well for kin
 
 MVC Pull in another hand, suite better for “frequent update” and assume that View is the one trigger the update call.
 
-Back to real-time game, if you not making a chess game, almost you “are doing” a pull based MVC, or apply this pattern privately. 
+Back to real-time game, if you not making a chess game, almost you “are doing” a pull based MVC, or apply this pattern privately.
 
 
 == Design patterns in JME3
@@ -139,7 +139,7 @@ Here is the twist: Actually in JME3, you are doing both, that’s why it look li
 ====
 
 
-because of this cycle 
+because of this cycle
 
 
 == Design patterns in Atom

+ 2 - 2
src/docs/asciidoc/jme3/advanced/atom_framework/docs.adoc

@@ -150,9 +150,9 @@ You can also do scripting in other Java scripting frameworks like BeanScript or
 
 Scripting leverage game programming a lot. You can stay inside the running game and make changes into the game enviroment (is just one small advantage aside of other super cool features!). So read about how to do scripting here:
 
-link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:atom_framework:atomscripting[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:atom_framework:atomscripting]
+<<jme3/advanced/atom_framework/atomscripting#,jme3:advanced:atom_framework:atomscripting>>
 
-link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting]
+<<jme3/scripting#,jme3:scripting>>
 
 
 == The Project

+ 6 - 6
src/docs/asciidoc/jme3/advanced/atom_framework/facial.adoc

@@ -1,6 +1,6 @@
 = facial
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -24,11 +24,11 @@ Let see how can we do it in JME3, shall we?
 === Ideas
 
 *  Customize the face with animations, emotions: ( eyes, nose, mouth ) with (smile, angry …)
-*  User friendly. 
-**  For newbies 
+*  User friendly.
+**  For newbies
 **  but also for professinal. especially with those who use FaceFx and UDK
 
-*  Rooms for extends and usecases ( changing art-style, more specialize for simulations…) 
+*  Rooms for extends and usecases ( changing art-style, more specialize for simulations…)
 
 
 [IMPORTANT]
@@ -41,7 +41,7 @@ Go to <<Researches & Papers,alternatives and researches>> if you want to go furt
 
 == AtomFacial framework
 
-image:jme3/advanced/atom_framework/youtube_fcf6grenolg[youtube_fcf6grenolg,with="",height=""]
+image:jme3/advanced/atom_framework/youtube_fcf6grenolg[youtube_fcf6grenolg,width="",height=""]
 
 
 === Architecture

+ 29 - 8
src/docs/asciidoc/jme3/advanced/audio.adoc

@@ -14,7 +14,8 @@ Place audio files in the `assets/Sound/` directory of your project. jME3 support
 == Audio Terminology
 
 *  *Streaming:* There are two ways to load audio data: Short audio files are to be stored entirely in memory (prebuffered), while long audio files, such as music, are streamed from the hard drive as it is played.
-*  *Looping:* You can play a sound either once and then stop, or repeatedly (continuously) in a loop. +You cannot loop streamed sounds.
+*  *Looping:* You can play a sound either once and then stop, or repeatedly (continuously) in a loop. +
+You cannot loop streamed sounds.
 *  *Instance:* If you play the same audio twice, the playing is queued up and jME plays one after the other. If you play instances of sounds, several instances of the same sound can play at the same time.
 
 
@@ -38,6 +39,7 @@ AudioNode music = new AudioNode(assetManager, "Sound/music.wav", DataType.Stream
 
 
 == Getting AudioNode Properties
+
 [cols="2", options="header"]
 |===
 
@@ -55,10 +57,14 @@ a|Returns the pitch.
 
 |===
 
-Note: There are other obvious getters to poll the status of all corresponding setters listed here.
+[NOTE]
+====
+There are other obvious getters to poll the status of all corresponding setters listed here.
+====
 
 
 == Setting AudioNode Properties
+
 [cols="2", options="header"]
 |===
 
@@ -87,29 +93,34 @@ a|Configures the sound so that, if it is played, it plays once and stops. No loo
 
 
 === Looping & Ambient Sounds
+
 [cols="2", options="header"]
 |===
 
 a|AudioNode Method
 a|Usage
 
-a|setPositional(false) +setDirectional(false)
+a|setPositional(false) +
+setDirectional(false)
 a|All 3D effects switched off. This sound is global and plays in headspace (it appears to come from everywhere). Good for environmental ambient sounds and background music.
 
 a|setLooping(true)
-a|Configures the sound to be a loop: After the sound plays, it repeats from the beginning, until you call stop() or pause(). Good for music and ambient background noises. +*Before 3.1-alpha2, Looping does not work on streamed sounds.* 
+a|Configures the sound to be a loop: After the sound plays, it repeats from the beginning, until you call stop() or pause(). Good for music and ambient background noises. +
+*Before 3.1-alpha2, Looping does not work on streamed sounds.* 
 
 |===
 
 
 === Positional 3D Sounds
+
 [cols="2", options="header"]
 |===
 
 a|AudioNode Method
 a|Usage
 
-a|setPositional(true) +setLocalTranslation(…)
+a|setPositional(true) +
+setLocalTranslation(…)
 a|Activates 3D audio: The sound appears to come from a certain position, where it is loudest. Position the AudioNode in the 3D scene, or move it with mobile players or NPCs.
 
 a|setReverbEnabled(true)
@@ -126,16 +137,19 @@ Positional 3D sounds require an `AudioListener` object in the scene (representin
 
 
 === Directional 3D Sounds
+
 [cols="2", options="header"]
 |===
 
 a|AudioNode Method
 a|Usage
 
-a|setDirectional(true) +setDirection(…) 
+a|setDirectional(true) +
+setDirection(…) 
 a|Activates 3D audio: This sound can only be heard from a certain direction. Specify the direction and angle in the 3D scene if you have setDirectional() true. Use this to restrict noises that should not be heard, for example, through a wall.
 
-a|setInnerAngle() +setOuterAngle()
+a|setInnerAngle() +
+setOuterAngle()
 a|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!
 
 |===
@@ -167,7 +181,10 @@ myAudioNode.pause();
 myAudioNode.stop();
 ----
 
-*Note:* Whether an Audio Node plays continuously or only once, depends on the Loop properties you have set above!
+[NOTE]
+====
+Whether an Audio Node plays continuously or only once, depends on the Loop properties you have set above!
+====
 
 You can also start playing instances of an AudioNode. Use the `playInstance()` method if you need to play the same AudioNode multiple times, possibly simulatenously. Note that changes to the parameters of the original AudioNode do not affect the instances that are already playing!
 
@@ -197,6 +214,7 @@ The default AudioListener object `listener` in `SimpleApplication` is the user's
 == Setting Audio Environment Properties
 
 Optionally, You can choose from the following environmental presets from `com.jme3.audio.Environment`. This presets influence subtle echo effects (reverb) that evoke associations of different environments in your users. That is, it makes you scene sound “indoors or “outdoors etc. You use Audio Environments together with `setReverbEnabled(true)` on positional AudioNodes (see above).
+
 [cols="11", options="header"]
 |===
 
@@ -276,12 +294,14 @@ a|0.0006f
 
 .  Activate a Environment preset
 **  Either use a default, e.g. make you scene sounds like a dungeon environment: 
++
 [source,java]
 ----
 audioRenderer.setEnvironment(new Environment(Environment.Dungeon));
 ----
 
 **  Or activate <<jme3/advanced/audio_environment_presets#,custom environment settings>> in the Environment constructor:
++
 [source,java]
 ----
 audioRenderer.setEnvironment(
@@ -291,6 +311,7 @@ audioRenderer.setEnvironment(
 
 
 .  Activate 3D audio for certain sounds: 
++
 [source,java]
 ----
 footstepsAudio.setPositional(true);

+ 6 - 9
src/docs/asciidoc/jme3/advanced/bloom_and_glow.adoc

@@ -12,7 +12,7 @@ Bloom is a popular shader effect in 3D games industry. It usually consist in dis
 In practice, the bright areas are extracted from the rendered scene, blurred and finally added up to the render.
 
 Those images gives an idea of what bloom does. The left image has no bloom effect, the right image does. +
-image:jme3/advanced/nobloomsky.png[No bloom,with="",height=""]image:jme3/advanced/blomsky.png[Bloom,with="",height=""]
+image:jme3/advanced/nobloomsky.png[No bloom,width="",height=""]image:jme3/advanced/blomsky.png[Bloom,width="",height=""]
 
 
 == Bloom Usage
@@ -74,10 +74,10 @@ The bloom filter supports a glow map or a glow color.
 
 === Creating a glow-map
 
-Let's take the hover tank example bundled with JME3 test data.+
+Let's take the hover tank example bundled with JME3 test data. +
 Here you can see the diffuse map of the tank, and the associated glow map that only contains the parts of the texture that will glow and their glowing color: +
-image:jme3/advanced/tank_diffuse_ss.png[Tank diffuse map,with="",height=""]
-image:jme3/advanced/tank_glow_map_ss.png[Tank glow map,with="",height=""]
+image:jme3/advanced/tank_diffuse_ss.png[Tank diffuse map,width="",height=""]
+image:jme3/advanced/tank_glow_map_ss.png[Tank glow map,width="",height=""]
 
 Glow maps work with Lighting.j3md, Particles.j3md and SolidColor.j3md material definitions.
 The tank material looks like this : 
@@ -122,7 +122,7 @@ The glow map is defined here : *GlowMap : Models/HoverTank/tank_glow_map_highres
 ----
 
 Here is the result : +
-image:jme3/advanced/tanlglow1.png[Glowing hover tank,with="",height=""]
+image:jme3/advanced/tanlglow1.png[Glowing hover tank,width="",height=""]
 
 
 == Bloom with a glow color
@@ -154,10 +154,7 @@ In this case you'll need to use the glow color parameter.
 
 Here is the result on Oto's plasma ball (before and after) : +
 
-image::jme3/advanced/otonobloom.png[Oto's plasma ball is just a big pea,with="400",height="",align="left"]
-
-
-image::jme3/advanced/otoglow.png[Oto's plasma ball radiates incredible power!!!,with="400",height="",align="left"]
+image:jme3/advanced/otonobloom.png[Oto's plasma ball is just a big pea,width="400",height="",align="left"]image:jme3/advanced/otoglow.png[Oto's plasma ball radiates incredible power!!!,width="400",height="",align="left"]
 
 
 

+ 9 - 2
src/docs/asciidoc/jme3/advanced/camera.adoc

@@ -8,7 +8,10 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-Note that by default, the mouse pointer is invisible, and the mouse is set up to control the camera rotation.
+[NOTE]
+====
+By default, the mouse pointer is invisible, and the mouse is set up to control the camera rotation.
+====
 
 
 == Default Camera
@@ -26,6 +29,7 @@ The camera object is created with the following defaults:
 
 *  Start location at (0f, 0f, 10f).
 *  Start direction is looking at the origin.
+
 [cols="2", options="header"]
 |===
 
@@ -76,7 +80,10 @@ a|?
 
 |===
 
-*Tip:* After you change view port, frustum, or frame, call `cam.update();`
+[TIP]
+====
+After you change view port, frustum, or frame, call `cam.update();`
+====
 
 
 == FlyBy Camera

+ 38 - 38
src/docs/asciidoc/jme3/advanced/capture_audio_video_to_a_file.adoc

@@ -1,6 +1,6 @@
 = Capture Audio/Video to a File
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -18,7 +18,7 @@ from the game while it is running using VideoRecorderAppState.
 
 [TIP]
 ====
-Combine this method with jMonkeyEngine's 
+Combine this method with jMonkeyEngine's
 <<jme3/advanced/cinematics#,Cinematics>>
 feature to record high-quality game trailers!
 ====
@@ -31,7 +31,7 @@ First off, if all you need is to record video at 30fps with no sound, then look
 no further than jMonkeyEngine 3's built in `VideoRecorderAppState`
 class.
 
-Add the following code to your `simpleInitApp()` method. 
+Add the following code to your `simpleInitApp()` method.
 
 [source,java]
 ----
@@ -44,9 +44,9 @@ The game will run slow, but the recording will be in high-quality and
 normal speed. Recording starts when the state is
 attached, and ends when the application quits or the state is detached.
 
-The video files will be stored in your *user home directory*. 
+The video files will be stored in your *user home directory*.
 If you want to save to another path, specify a File object in the
-VideoRecorderAppState constructor. 
+VideoRecorderAppState constructor.
 
 That's all!
 
@@ -56,8 +56,8 @@ That's all!
 
 [NOTE]
 ====
-This way of A/V recording is still in development.  
-It works for all of jMonkeyEngine's test cases. 
+This way of A/V recording is still in development.
+It works for all of jMonkeyEngine's test cases.
 If you experience any problems or
 if something isn't clear, please link:http://jmonkeyengine.org/members/bortreb/[let me know]. – bortreb
 ====
@@ -125,7 +125,7 @@ your preferred container/codec format.  Be advised that some
 video payers cannot process AVI with a RAW stream, and that AVI
 1.0 files generated by this method that exceed 2.0GB are invalid
 according to the AVI 1.0 +++<abbr title="specification">spec</abbr>+++ (but many programs can still deal
-with them.)  Thanks to 
+with them.)  Thanks to
 link:http://www.randelshofer.ch/blog/2008/08/writing-avi-videos-in-pure-java/[Werner Randelshofer]
 for his excellent work which made the AVI file writer option possible.
 
@@ -161,25 +161,25 @@ import com.jme3.app.SimpleApplication;
  * Demonstrates how to use basic Audio/Video capture with a
  * jMonkeyEngine application. You can use these techniques to make
  * high quality cutscenes or demo videos, even on very slow laptops.
- * 
+ *
  * @author Robert McIntyre
  */
 
 public class Basic {
-	
+
     public static void main(String[] ignore) throws IOException{
 	File video = File.createTempFile("JME-water-video", ".avi");
 	File audio = File.createTempFile("JME-water-audio", ".wav");
-		
+
 	SimpleApplication app = new TestPostWater();
 	app.setTimer(new IsoTimer(60));
 	app.setShowSettings(false);
-		
+
 	Capture.captureVideo(app, video);
 	Capture.captureAudio(app, audio);
-		
+
 	app.start();
-		
+
 	System.out.println(video.getCanonicalPath());
 	System.out.println(audio.getCanonicalPath());
     }
@@ -277,20 +277,20 @@ import com.jme3.system.AppSettings;
 import com.jme3.system.JmeSystem;
 
 /**
- * 
+ *
  * Demonstrates advanced use of the audio capture and recording
  * features.  Multiple perspectives of the same scene are
  * simultaneously rendered to different sound files.
- * 
+ *
  * A key limitation of the way multiple listeners are implemented is
  * that only 3D positioning effects are realized for listeners other
  * than the main LWJGL listener.  This means that audio effects such
  * as environment settings will *not* be heard on any auxiliary
  * listeners, though sound attenuation will work correctly.
- * 
+ *
  * Multiple listeners as realized here might be used to make AI
  * entities that can each hear the world from their own perspective.
- * 
+ *
  * @author Robert McIntyre
  */
 
@@ -303,7 +303,7 @@ public class Advanced extends SimpleApplication {
 	 * listening for sound; when a cube hears sound whose intensity is
 	 * greater than a certain threshold, it changes its color from
 	 * grey to green.
-	 * 
+	 *
 	 *  Each cube is also saving whatever it hears to a file.  The
 	 *  scene from the perspective of the viewer is also saved to a
 	 *  video file.  When you listen to each of the sound files
@@ -311,7 +311,7 @@ public class Advanced extends SimpleApplication {
 	 *  approaches the cube that generated that sound file.  This
 	 *  shows that each listener is hearing the world from its own
 	 *  perspective.
-	 * 
+	 *
 	 */
 	public static void main(String[] args) {
 		Advanced app = new Advanced();
@@ -349,7 +349,7 @@ public class Advanced extends SimpleApplication {
 		ear.setMaterial(mat);
 		root.attachChild(ear);
 		return ear;
-	} 
+	}
 
 	private Vector3f[] path = new Vector3f[]{
 			// loop 1
@@ -419,18 +419,18 @@ public class Advanced extends SimpleApplication {
 		track.setCurveTension(0.80f);
 
 		motionControl = new MotionTrack(bell,track);
-		// for now, use reflection to change the timer... 
+		// for now, use reflection to change the timer...
 		// motionControl.setTimer(new IsoTimer(60));
-		
+
 		try {
 			Field timerField;
 			timerField = AbstractCinematicEvent.class.getDeclaredField("timer");
 			timerField.setAccessible(true);
-			try {timerField.set(motionControl, motionTimer);} 
-			catch (IllegalArgumentException e) {e.printStackTrace();} 
+			try {timerField.set(motionControl, motionTimer);}
+			catch (IllegalArgumentException e) {e.printStackTrace();}
 			catch (IllegalAccessException e) {e.printStackTrace();}
-		} 
-		catch (SecurityException e) {e.printStackTrace();} 
+		}
+		catch (SecurityException e) {e.printStackTrace();}
 		catch (NoSuchFieldException e) {e.printStackTrace();}
 
 
@@ -450,7 +450,7 @@ public class Advanced extends SimpleApplication {
 	}
 
 	private void initAudio() {
-		org.lwjgl.input.Mouse.setGrabbed(false);	
+		org.lwjgl.input.Mouse.setGrabbed(false);
 		music = new AudioNode(assetManager, "Sound/Effects/Beep.ogg", false);
 
 		rootNode.attachChild(music);
@@ -463,7 +463,7 @@ public class Advanced extends SimpleApplication {
 		music.setRefDistance(1f);
 		//music.setRolloffFactor(1f);
 		music.setLooping(false);
-		audioRenderer.pauseSource(music); 
+		audioRenderer.pauseSource(music);
 	}
 
 	public class Dancer implements SoundProcessor {
@@ -480,7 +480,7 @@ public class Advanced extends SimpleApplication {
 
 
 		/**
-		 * Respond to sound!  This is the brain of an AI entity that 
+		 * Respond to sound!  This is the brain of an AI entity that
 		 * hears its surroundings and reacts to them.
 		 */
 		public void process(ByteBuffer audioSamples, int numSamples, AudioFormat format) {
@@ -488,7 +488,7 @@ public class Advanced extends SimpleApplication {
 			byte[] data = new byte[numSamples];
 			float[] out = new float[numSamples];
 			audioSamples.get(data);
-			FloatSampleTools.byte2floatInterleaved(data, 0, out, 0, 
+			FloatSampleTools.byte2floatInterleaved(data, 0, out, 0,
 					numSamples/format.getFrameSize(), format);
 
 			float max = Float.NEGATIVE_INFINITY;
@@ -510,13 +510,13 @@ public class Advanced extends SimpleApplication {
 			rf.addListener(auxListener);
 			WaveFileWriter aux = null;
 
-			try {aux = new WaveFileWriter(File.createTempFile("advanced-audio-" + n, ".wav"));} 
+			try {aux = new WaveFileWriter(File.createTempFile("advanced-audio-" + n, ".wav"));}
 			catch (IOException e) {e.printStackTrace();}
 
-			rf.registerSoundProcessor(auxListener, 
+			rf.registerSoundProcessor(auxListener,
 					new CompositeSoundProcessor(new Dancer(ear), aux));
-					
-		}   
+
+		}
 	}
 
 
@@ -550,12 +550,12 @@ public class Advanced extends SimpleApplication {
 
 ----
 
-image:http://www.youtube.com/v/oCEfK0yhDrY?.swf[oCEfK0yhDrY?.swf,with="400",height=""]
+image:http://www.youtube.com/v/oCEfK0yhDrY?.swf[oCEfK0yhDrY?.swf,width="400",height=""]
 
 
 === Using Advanced features to Record from more than one perspective at once
 
-image:http://www.youtube.com/v/WIJt9aRGusc?.swf[WIJt9aRGusc?.swf,with="400",height=""]
+image:http://www.youtube.com/v/WIJt9aRGusc?.swf[WIJt9aRGusc?.swf,width="400",height=""]
 
 
 == More Information

+ 12 - 5
src/docs/asciidoc/jme3/advanced/cinematics.adoc

@@ -13,8 +13,10 @@ Internally, Cinematics are implemented as <<jme3/advanced/application_states#,Ap
 
 Short overview of the cinematic process:
 
-.  Plan the script of your movie. +Write down a timeline (e.g. on paper) of which character should be at which spot at which time.
-.  Attach the scene objects that you want to remote-control to one Node. +This Node can be the rootNode, or a Node that is attached to the rootNode. 
+.  Plan the script of your movie. +
+Write down a timeline (e.g. on paper) of which character should be at which spot at which time.
+.  Attach the scene objects that you want to remote-control to one Node. +
+This Node can be the rootNode, or a Node that is attached to the rootNode. 
 .  Create a Cinematic object for this movie scene. The Cinematic will contain and manage the movie script.
 .  For each line in your script (for each keyframe in your timeline), add a CinematicEvent to the Cinematic. 
 
@@ -50,6 +52,7 @@ stateManager.attach(cinematic);
 
 .  Attach the Cinematic to the SimpleApplication's stateManager. 
 .  Play, stop and pause the Cinematic from your code.
+
 [cols="2", options="header"]
 |===
 
@@ -73,7 +76,7 @@ a|Pauses the cinematic.
 Just like a movie script consists of lines with instructions to the actors, each Cinematic consists of a series of events.
 
 Here is the list of available CinematicEvents that you use as events. Each track remote-controls scene objects in a different way:
-[cols="2", options="header"]
+[cols="20,80", options="header"]
 |===
 
 a|Events(CinematicEvents)
@@ -112,10 +115,11 @@ Details of the constructor:
 
 To create a MotionEvent, do the following:
 
-.  <<jme3/advanced/motiontrack#,Create a MotionEvent>>
+.  Create a MotinPath.
 .  Create a MotionEvent based on the MotionPath.
 .  Configure your MotionEvent (see below).
 .  Add the MotionEvent to a Cinematic.
+
 [cols="2", options="header"]
 |===
 
@@ -148,7 +152,10 @@ a|Sets the rotation. Use together with `MotionEvent.Direction.Rotation` or `Moti
 
 |===
 
-*Tip:* Most likely you remote-control more than one object in your scene. Give the events and paths useful names such as `dragonEvent`, `dragonPath`, `heroEvent`, `heroPath`, etc.
+[TIP]
+====
+Most likely you remote-control more than one object in your scene. Give the events and paths useful names such as `dragonEvent`, `dragonPath`, `heroEvent`, `heroPath`, etc.
+====
 
 
 === SoundEvent

+ 15 - 12
src/docs/asciidoc/jme3/advanced/collision_and_intersection.adoc

@@ -1,6 +1,6 @@
 = Collision and Intersection
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -9,7 +9,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 The term collision can be used to refer to <<jme3/advanced/physics_listeners#,physical interactions>> (where <<jme3/advanced/physics#,physical objects>> collide, push and bump off one another), and also to non-physical _intersections_ in 3D space. This article is about the non-physical (mathematical) collisions.
 
-Non-physical collision detection is interesting because it uses less computing resources than physical collision detection. The non-physical calculations are faster because they do not have any side effects such as pushing other objects or bumping off of them. Tasks such as <<jme3/advanced/mouse_picking#,mouse picking>> are easily implemented using mathematical techniques such as ray casting and intersections.  Experienced developers optimize their games by finding ways to simulate certain (otherwise expensive physical) interactions in a non-physical way. 
+Non-physical collision detection is interesting because it uses less computing resources than physical collision detection. The non-physical calculations are faster because they do not have any side effects such as pushing other objects or bumping off of them. Tasks such as <<jme3/advanced/mouse_picking#,mouse picking>> are easily implemented using mathematical techniques such as ray casting and intersections.  Experienced developers optimize their games by finding ways to simulate certain (otherwise expensive physical) interactions in a non-physical way.
 
 *Example:* One example for an optimization is a physical vehicle's wheels. You could make the wheels fully physical disks, and have jME calculate every tiny force – sounds very accurate? It's total overkill and too slow for a racing game. A more performant solution is to cast four invisible rays down from the vehicle and calculate the intersections with the floor. These non-physical wheels require (in the simplest case) only four calculations per tick to achieve an effect that players can hardly distinguish from the real thing.
 
@@ -19,23 +19,25 @@ Non-physical collision detection is interesting because it uses less computing r
 The interface com.jme3.collision.Collidable declares one method that returns how many collisions were found between two Collidables: `collideWith(Collidable other, CollisionResults results)`.
 
 *  A `com.jme3.collision.CollisionResults` object is an ArrayList of comparable `com.jme3.collision.CollisionResult` objects.
-*  You can iterate over the CollisionResults to identify the other parties involved in the collision. +Note that jME counts _all_ collisions, this means a ray intersecting a box will be counted as two hits, one on the front where the ray enters, and one on the back where the ray exits.
+*  You can iterate over the CollisionResults to identify the other parties involved in the collision. +
+Note that jME counts _all_ collisions, this means a ray intersecting a box will be counted as two hits, one on the front where the ray enters, and one on the back where the ray exits.
+
 [cols="2", options="header"]
 |===
 
 a|CollisionResults Method
 a|Usage
 
-<a|size()                
+<a|size()
 a|Returns the number of CollisionResult objects.
 
-a|getClosestCollision() 
+a|getClosestCollision()
 a|Returns the CollisionResult with the lowest distance.
 
 a|getFarthestCollision()
 a|Returns the CollisionResult with the farthest distance.
 
-<a|getCollision(i)       
+<a|getCollision(i)
 a|Returns the CollisionResult at index i.
 
 |===
@@ -80,7 +82,7 @@ The following code snippet can be triggered by listeners (e.g. after an input ac
   // Calculate detection results
   CollisionResults results = new CollisionResults();
   a.collideWith(b, results);
-  System.out.println("Number of Collisions between" + 
+  System.out.println("Number of Collisions between" +
       a.getName()+ " and " + b.getName() + ": " + results.size());
   // Use the results
   if (results.size() > 0) {
@@ -125,15 +127,15 @@ Knowing the distance of the collisions is useful for example when you intersect
 
 == Bounding Volumes
 
-A `com.jme3.bounding.BoundingVolume` is an interface for dealing with containment of a collection of points. All BoundingVolumes are `Collidable` and are used as optimization to calculate non-physical collisions more quickly: It's always faster to calculate an intersection between simple shapes like spheres and boxes than between complex shapes like models. 
+A `com.jme3.bounding.BoundingVolume` is an interface for dealing with containment of a collection of points. All BoundingVolumes are `Collidable` and are used as optimization to calculate non-physical collisions more quickly: It's always faster to calculate an intersection between simple shapes like spheres and boxes than between complex shapes like models.
 
-jME3 computes bounding volumes for all objects. These bounding volumes are later used for frustum culling, which is making sure only objects visible on-screen are actually sent for rendering. 
+jME3 computes bounding volumes for all objects. These bounding volumes are later used for frustum culling, which is making sure only objects visible on-screen are actually sent for rendering.
 
 All fast-paced action and shooter games use BoundingVolumes as an optimization. Wrap all complex models into simpler shapes – in the end, you get equally useful collision detection results, but faster. link:http://en.wikipedia.org/wiki/Bounding_volume[More about bounding volumes...]
 
 Supported types:
 
-image::http://www.jmonkeyengine.com/jme/wiki-data/userref/capsule.png[Capsule,with="150",height="110",align="right"]
+// image::http://www.jmonkeyengine.com/jme/wiki-data/userref/capsule.png[Capsule,width="150",height="110",align="right"]
 
 
 *  Type.AABB = Axis-aligned bounding box, that means it doesn't rotate, which makes it less precise. A `com.jme3.bounding.BoundingBox` is an axis-aligned cuboid used as a container for a group of vertices of a piece of geometry. A BoundingBox has a center and extents from that center along the x, y and z axis. This is the default bounding volume, since it is fairly fast to generate and gives better accuracy than the bounding sphere.
@@ -162,7 +164,7 @@ mesh.updateBound();
 
 == Mesh and Scene Graph Collision
 
-One of the supported `Collidable`s are meshes and scene graph objects. To execute a collision detection query against a scene graph, use `Spatial.collideWith()`. This will traverse the scene graph and return any mesh collisions that were detected. Note that the first collision against a particular scene graph may take a long time, this is because a special data structure called link:http://en.wikipedia.org/wiki/Bounding_interval_hierarchy[|Bounding Interval Hierarchy (BIH)] needs to be generated for the meshes. At a later point, the mesh could change and the BIH tree would become out of date, in that case, call link:http://jmonkeyengine.org/javadoc/com/jme3/scene/Mesh.html#createCollisionData()[Mesh.createCollisionData()] on the changed mesh to update the BIH tree.
+One of the supported `Collidable`s are meshes and scene graph objects. To execute a collision detection query against a scene graph, use `Spatial.collideWith()`. This will traverse the scene graph and return any mesh collisions that were detected. Note that the first collision against a particular scene graph may take a long time, this is because a special data structure called link:http://en.wikipedia.org/wiki/Bounding_interval_hierarchy[|Bounding Interval Hierarchy (BIH)] needs to be generated for the meshes. At a later point, the mesh could change and the BIH tree would become out of date, in that case, call link:http://javadoc.jmonkeyengine.org/com/jme3/scene/Mesh.html#createCollisionData--[Mesh.createCollisionData()] on the changed mesh to update the BIH tree.
 
 
 == Intersection
@@ -182,6 +184,7 @@ These simple but powerful ray-surface intersection tests are called Ray Casting.
 
 
 Learn the details of how to implement <<jme3/advanced/mouse_picking#,Mouse Picking>> here.
+
 '''
 
 TODO:

+ 183 - 179
src/docs/asciidoc/jme3/advanced/custom_controls.adoc

@@ -11,17 +11,18 @@ A `com.jme3.scene.control.Control` is a customizable jME3 interface that allows
 
 To control global game behaviour see <<jme3/advanced/application_states#,Application States>> – you often use AppStates and Control together.
 
-*  link:http://www.youtube.com/watch?v=MNDiZ9YHIpM[Quick video introduction to Custom Controls]
+*  link:http://www.youtube.com/watch?v=MNDiZ9YHIpM[Quick video introduction to Custom Controls]
 
 To control the behaviour of spatials:
 
-.  Create one control for each _type of behavior_. When you add several controls to one spatial, they will be executed in the order they were added. +For example, one NPC can be controlled by a PhysicsControl instance and an AIControl instance.
-.  Define the custom control and implement its behaviour in the Control's update method:
-**  You can pass arguments into your custom control.
-**  In the control class, the object `spatial` gives you access to the spatial and subspatials that the control is attached to.
-**  Here you modify the `spatial`'s transformation (move, scale, rotate), play animations, check its environement, define how it acts and reacts. 
+.  Create one control for each _type of behavior_. When you add several controls to one spatial, they will be executed in the order they were added. +
+For example, one NPC can be controlled by a PhysicsControl instance and an AIControl instance.
+.  Define the custom control and implement its behaviour in the Control's update method:
+**  You can pass arguments into your custom control.
+**  In the control class, the object `spatial` gives you access to the spatial and subspatials that the control is attached to.
+**  Here you modify the `spatial`'s transformation (move, scale, rotate), play animations, check its environement, define how it acts and reacts. 
 
-.  Add an instance of the Control to a spatial to give it this behavior. The spatial's game state is updated automatically from now on. 
+.  Add an instance of the Control to a spatial to give it this behavior. The spatial's game state is updated automatically from now on. +
 [source,java]
 ----
 spatial.addControl(myControl);
@@ -35,21 +36,21 @@ To implement game logic for a type of spatial, you will either extend AbstractCo
 
 Use <<jme3/advanced/custom_controls#,Controls>> to implement the _behaviour of types of game entities_.
 
-*  Use Controls to add a type of behaviour (that is, methods and fields) to individual Spatials. 
-*  Each Control has its own `update()` loop that hooks into `simpleUpdate()`. Use Controls to move blocks of code out of the `simpleUpdate()` loop.
-*  One Spatial can be influenced by several Controls. (Very powerful and modular!) 
-*  Each Spatial needs its own instance of the Control. 
-*  A Control only has access to and control over the Spatial it is attached to.
-*  Controls can be saved as .j3o file together with a Spatial. 
+*  Use Controls to add a type of behaviour (that is, methods and fields) to individual Spatials. 
+*  Each Control has its own `update()` loop that hooks into `simpleUpdate()`. Use Controls to move blocks of code out of the `simpleUpdate()` loop.
+*  One Spatial can be influenced by several Controls. (Very powerful and modular!) 
+*  Each Spatial needs its own instance of the Control. 
+*  A Control only has access to and control over the Spatial it is attached to.
+*  Controls can be saved as .j3o file together with a Spatial. 
 
 Examples: You can write
 
-*  A WalkerNavControl, SwimmerNavControl, FlyerNavControl… that defines how a type of NPC finds their way around. All NPCs can walk, some can fly, others can swim, and some can all three, etc.
-*  A PlayerNavControl that is steered by user-configurable keyboard and mouse input.
-*  A generic animation control that acts as a common interface that triggers animations (walk, stand, attack, defend) for various entities.
-*  A DefensiveBehaviourControl that remote-controls NPC behaviour in fight situations. 
-*  An IdleBehaviourControl that remote-controls NPC behaviour in neutral situations. 
-*  A DestructionControl that automatically replaces a structure with an appropriate piece of debris after collision with a projectile… 
+*  A WalkerNavControl, SwimmerNavControl, FlyerNavControl… that defines how a type of NPC finds their way around. All NPCs can walk, some can fly, others can swim, and some can all three, etc.
+*  A PlayerNavControl that is steered by user-configurable keyboard and mouse input.
+*  A generic animation control that acts as a common interface that triggers animations (walk, stand, attack, defend) for various entities.
+*  A DefensiveBehaviourControl that remote-controls NPC behaviour in fight situations. 
+*  An IdleBehaviourControl that remote-controls NPC behaviour in neutral situations. 
+*  A DestructionControl that automatically replaces a structure with an appropriate piece of debris after collision with a projectile… 
 
 The possibilities are endless. emoji:smiley
 
@@ -60,10 +61,10 @@ Other examples include the built-in RigidBodyControl in JME's physics integratio
 
 Existing examples in the code base include:
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/animation/AnimControl.java[AnimControl.java] allows manipulation of skeletal animation, including blending and multiple channels.
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/control/CameraControl.java[CameraControl.java] allows you to sync the camera position with the position of a given spatial.
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/control/BillboardControl.java[BillboardControl.java] displays a flat picture orthogonally, e.g. a speech bubble or informational dialog.
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/#src%2Fjbullet%2Fcom%2Fjme3%2Fbullet%2Fcontrol[PhysicsControl] subclasses (such as CharacterControl, RigidBodyControl, VehicleControl) allow you to add physical properties to any spatial. PhysicsControls tie into capabilities provided by the BulletAppState.
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/animation/AnimControl.java[AnimControl.java] allows manipulation of skeletal animation, including blending and multiple channels.
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/scene/control/CameraControl.java[CameraControl.java] allows you to sync the camera position with the position of a given spatial.
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/scene/control/BillboardControl.java[BillboardControl.java] displays a flat picture orthogonally, e.g. a speech bubble or informational dialog.
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-bullet/src/common/java/com/jme3/bullet/control[PhysicsControl] subclasses (such as CharacterControl, RigidBodyControl, VehicleControl) allow you to add physical properties to any spatial. PhysicsControls tie into capabilities provided by the BulletAppState.
 
 
 == AbstractControl Class
@@ -77,87 +78,85 @@ The most common way to create a Control is to create a class that extends Abstra
 
 The AbstractControl can be found under `com.jme3.scene.control.AbstractControl`. This is a default abstract class that implements the Control interface.
 
-*  You have access to a boolean `isEnabled()`.
-*  You have access to the Spatial object `spatial`. 
-*  You override the `controlUpdate()` method to implement the Spatial's behaviour. 
-*  You have access to a `setEnabled(boolean)` method. This activates or deactivates this Control's behaviour in this spatial temporarily. While the AbstractControl is toggled to be disabled, the `controlUpdate()` loop is no longer executed. +For example, you disable your IdleBehaviourControl when you enable your DefensiveBehaviourControl in a spatial.
+*  You have access to a boolean `isEnabled()`.
+*  You have access to the Spatial object `spatial`. 
+*  You override the `controlUpdate()` method to implement the Spatial's behaviour. 
+*  You have access to a `setEnabled(boolean)` method. This activates or deactivates this Control's behaviour in this spatial temporarily. While the AbstractControl is toggled to be disabled, the `controlUpdate()` loop is no longer executed. +
+For example, you disable your IdleBehaviourControl when you enable your DefensiveBehaviourControl in a spatial.
 
 Usage: Your custom subclass implements the three methods `controlUpdate()`, `controlRender()`, `setSpatial()`, and `cloneForSpatial()` as shown here:
 
 [source,java]
 ----
-
-public class MyControl extends AbstractControl implements Savable, Cloneable {
-  private int index; // can have custom fields -- example 
-  
-  public MyControl(){} // empty serialization constructor
-  
-  /** Optional custom constructor with arguments that can init custom fields.
-    * Note: you cannot modify the spatial here yet! */
-  public MyControl(int i){ 
-    // index=i; // example 
-  } 
-  
-  /** This method is called when the control is added to the spatial,
-    * and when the control is removed from the spatial (setting a null value).
-    * It can be used for both initialization and cleanup. */    
-  @Override
-  public void setSpatial(Spatial spatial) {
-    super.setSpatial(spatial);
-    /* Example:
-    if (spatial != null){
-        // initialize
-    }else{
-        // cleanup
-    }
-    */
-  }
-
-
-  /** Implement your spatial's behaviour here.
-    * From here you can modify the scene graph and the spatial
-    * (transform them, get and set userdata, etc).
-    * This loop controls the spatial while the Control is enabled. */
-  @Override
-  protected void controlUpdate(float tpf){
-    if(spatial != null) {
-      // spatial.rotate(tpf,tpf,tpf); // example behaviour
+public class MyControl extends AbstractControl implements Savable, Cloneable {  
+    private int index; // can have custom fields -- example     
+    
+    public MyControl(){} // empty serialization constructor    
+    
+    /** Optional custom constructor with arguments that can init custom fields.    
+      * Note: you cannot modify the spatial here yet! */  
+    public MyControl(int i){     
+        // index=i; // example   
+    }     
+    
+    /** This method is called when the control is added to the spatial,    
+      * and when the control is removed from the spatial (setting a null value).    
+      * It can be used for both initialization and cleanup. */      
+    @Override  
+    public void setSpatial(Spatial spatial) {    
+        super.setSpatial(spatial);    
+        /* Example:    
+        if (spatial != null){        
+            // initialize    
+        }else{        
+            // cleanup    
+        }    
+        */  
     }
-  }
-  
-  @Override
-  public Control cloneForSpatial(Spatial spatial){
-    final MyControl control = new MyControl();
-    /* Optional: use setters to copy userdata into the cloned control */
-    // control.setIndex(i); // example
-    control.setSpatial(spatial);
-    return control;
-  }
-  
-  @Override
-  protected void controlRender(RenderManager rm, ViewPort vp){
-     /* Optional: rendering manipulation (for advanced users) */
-  }
-  
-  @Override
-  public void read(JmeImporter im) throws IOException {
-      super.read(im);
-      // im.getCapsule(this).read(...);
-  }
-  
-  @Override
-  public void write(JmeExporter ex) throws IOException {
-      super.write(ex);
-      // ex.getCapsule(this).write(...);
-  }
-  
+    /** Implement your spatial's behaviour here.    
+      * From here you can modify the scene graph and the spatial    
+      * (transform them, get and set userdata, etc).    
+      * This loop controls the spatial while the Control is enabled. */  
+    @Override  
+    protected void controlUpdate(float tpf){    
+        if(spatial != null) {      
+            // spatial.rotate(tpf,tpf,tpf); // example behaviour    
+        }  
+    }    
+    
+    @Override  
+    public Control cloneForSpatial(Spatial spatial){    
+        final MyControl control = new MyControl();    
+        /* Optional: use setters to copy userdata into the cloned control */    
+        // control.setIndex(i); // example    
+        control.setSpatial(spatial);    
+        return control;  
+    }    
+    
+    @Override  
+    protected void controlRender(RenderManager rm, ViewPort vp){     
+        /* Optional: rendering manipulation (for advanced users) */  
+    }    
+    
+    @Override  
+    public void read(JmeImporter im) throws IOException {      
+        super.read(im);      
+        // im.getCapsule(this).read(...);  
+    }    
+    
+    @Override  
+    public void write(JmeExporter ex) throws IOException {      
+        super.write(ex);      
+        // ex.getCapsule(this).write(...);  
+    }  
 }
 ----
 
 See also:
 
-*  To learn more about `write()` and `read()`, see <<jme3/advanced/save_and_load#,Save and Load>>
-*  To learn more about `setUserData()`, see <<jme3/advanced/spatial#,Spatial>>.
+*  To learn more about `write()` and `read()`, see <<jme3/advanced/save_and_load#,Save and Load>>
+*  To learn more about `setUserData()`, see <<jme3/advanced/spatial#,Spatial>>.
 
 
 == The Control Interface
@@ -165,94 +164,97 @@ See also:
 
 [TIP]
 ====
-In the less common case that you want to create a Control that also extends another class, create a custom interface that  extends jME3's Control interface. Your class can become a Control by implementing the Control interface, and at the same time extending another class.
+In the less common case that you want to create a Control that also extends another class, create a custom interface that  extends jME3's Control interface. Your class can become a Control by implementing the Control interface, and at the same time extending another class.
 ====
 
 
 The Control interface can be found under `com.jme3.scene.control.Control`. It has the following method signatures:
 
-*  `cloneForSpatial(Spatial)`: Clones the Control and attaches it to a clone of the given Spatial. +Implement this method to be able to <<jme3/advanced/save_and_load#,save() and load()>> Spatials carrying this Control. +The AssetManager also uses this method if the same spatial is loaded twice. You can specify which fields you want your object to reuse (e.g. collisionshapes) in this case. 
-*  `setEnabled(boolean)`: Toggles a boolean that enables or disables the Control. Goes with accessor `isEnabled();`. You test for it in the `update(float tpf)` loop before you execute anything.
-*  There are also some internal methods that you do not call from user code: `setSpatial(Spatial s)`, `update(float tpf);`, `render(RenderManager rm, ViewPort vp)`.
+*  `cloneForSpatial(Spatial)`: Clones the Control and attaches it to a clone of the given Spatial. +
+Implement this method to be able to <<jme3/advanced/save_and_load#,save() and load()>> Spatials carrying this Control. +
+The AssetManager also uses this method if the same spatial is loaded twice. You can specify which fields you want your object to reuse (e.g. collisionshapes) in this case. 
+*  `setEnabled(boolean)`: Toggles a boolean that enables or disables the Control. Goes with accessor `isEnabled();`. You test for it in the `update(float tpf)` loop before you execute anything.
+*  There are also some internal methods that you do not call from user code: `setSpatial(Spatial s)`, `update(float tpf);`, `render(RenderManager rm, ViewPort vp)`.
 
 Usage example:
-1. Create a custom control interface
 
+. Create a custom control interface.
++
 [source,java]
 ----
-public interface MyControlInterface extends Control {
+public interface MyControlInterface extends Control {    
     public void setSomething(int x); // optionally, add custom methods
 }
 ----
 
-2. Create custom Controls implementing your Control interface.
-
+. Create custom Controls implementing your Control interface.
++
 [source,java]
 ----
 public class MyControl extends MyCustomClass implements MyControlInterface {
-
-    protected Spatial spatial;
-
-    protected boolean enabled = true;
-
-    public MyControl() { } // empty serialization constructor
-
-    public MyControl(int x) { // custom constructor
-        super(x);
-    }
-
-    @Override
-    public void update(float tpf) {
-        if (enabled && spatial != null) {
-            // Write custom code to control the spatial here!
-        }
-    }
+    protected Spatial spatial;
     
-    @Override
-    public void render(RenderManager rm, ViewPort vp) {
-        // optional for advanced users, e.g. to display a debug shape
-    }
+    protected boolean enabled = true;
     
-    @Override
-    public Control cloneForSpatial(Spatial spatial) {
-        MyControl control = new MyControl();
-        // set custom properties
-        control.setSpatial(spatial);
-        control.setEnabled(isEnabled()); 
-        // set some more properties here...
-        return control;
+    public MyControl() { } // empty serialization constructor
+    
+    public MyControl(int x) { // custom constructor        
+        super(x);    
     }
     
-    @Override
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
+    @Override    
+    public void update(float tpf) {        
+        if (enabled && spatial != null) {            
+            // Write custom code to control the spatial here!        
+        }    
+    }        
     
-    @Override
-    public boolean isEnabled() {
-        return enabled;
-    }
+    @Override    
+    public void render(RenderManager rm, ViewPort vp) {        
+        // optional for advanced users, e.g. to display a debug shape    
+    }        
     
-    @Override
-    public void setSomething(int z) {
-        // You can add custom methods ...
-    }
+    @Override    
+    public Control cloneForSpatial(Spatial spatial) {        
+        MyControl control = new MyControl();        
+        // set custom properties        
+        control.setSpatial(spatial);        
+        control.setEnabled(isEnabled());         
+        // set some more properties here...        
+        return control;    
+    }        
     
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule oc = ex.getCapsule(this);
-        oc.write(enabled, "enabled", true);
-        oc.write(spatial, "spatial", null);
-        // write custom variables ....
-    }
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule ic = im.getCapsule(this);
-        enabled = ic.readBoolean("enabled", true);
-        spatial = (Spatial) ic.readSavable("spatial", null);
-        // read custom variables ....
+    @Override    
+    public void setEnabled(boolean enabled) {        
+        this.enabled = enabled;    
+    }        
+    
+    @Override    
+    public boolean isEnabled() {        
+        return enabled;    
+    }        
+    
+    @Override    
+    public void setSomething(int z) {        
+        // You can add custom methods ...    
+    }        
+    
+    @Override    
+    public void write(JmeExporter ex) throws IOException {        
+        super.write(ex);        
+        OutputCapsule oc = ex.getCapsule(this);        
+        oc.write(enabled, "enabled", true);        
+        oc.write(spatial, "spatial", null);        
+        // write custom variables ....    
+    }    
+    
+    @Override    
+    public void read(JmeImporter im) throws IOException {        
+        super.read(im);        
+        InputCapsule ic = im.getCapsule(this);        
+        enabled = ic.readBoolean("enabled", true);        
+        spatial = (Spatial) ic.readSavable("spatial", null);        
+        // read custom variables ....    
     }
 }
 ----
@@ -260,34 +262,33 @@ public class MyControl extends MyCustomClass implements MyControlInterface {
 
 == Best Practices
 
-*Tip:* Use the getControl() accessor to get Control objects from Spatials. No need to pass around lots of object references.
-Here an example from the link:http://code.google.com/p/monkeyzone/[MonkeyZone] code:
+
+Use the getControl() accessor to get Control objects from Spatials. No need to pass around lots of object references.Here an example from the link:http://code.google.com/p/monkeyzone/[MonkeyZone] code:
 
 [source,java]
 ----
-
-public class CharacterAnimControl implements Control {
-  ...
-  public void setSpatial(Spatial spatial) {
-    ...
-    animControl      = spatial.getControl(AnimControl.class);
-    characterControl = spatial.getControl(CharacterControl.class);
-    ...
-  }
+public class CharacterAnimControl implements Control {  
+    ...  
+    public void setSpatial(Spatial spatial) {    
+        ...    
+        animControl      = spatial.getControl(AnimControl.class);    
+        characterControl = spatial.getControl(CharacterControl.class);    
+        ...  
+    }
 }
 ----
 
-*Tip:* You can create custom Control interfaces so a set of different Controls provide the same methods and can be accessed with the interface class type.
+You can create custom Control interfaces so a set of different Controls provide the same methods and can be accessed with the interface class type.
 
 [source,java]
 ----
-public interface ManualControl extends Control {
-    public void steerX(float value);
-    public void steerY(float value);
-    public void moveX(float value);
-    public void moveY(float value);
-    public void moveZ(float value);
-   ...
+public interface ManualControl extends Control {    
+    public void steerX(float value);    
+    public void steerY(float value);    
+    public void moveX(float value);    
+    public void moveY(float value);    
+    public void moveZ(float value);   
+    ...
 }
 ----
 
@@ -295,10 +296,10 @@ Then you create custom sub-Controls and implement the methods accordingly to the
 
 [source,java]
 ----
-public class ManualVehicleControl   extends ManualControl {...}
+public class ManualVehicleControl   extends ManualControl {...}
 ----
 
- and
+and
 
 [source,java]
 ----
@@ -316,10 +317,13 @@ vehicleSpatial.addControl(new ManualVehicleControl());
 ...
 ----
 
-*Tip:* Use the getControl() method on a Spatial to get a specific Control object, and activate its behaviour!
+[TIP]
+====
+Use the getControl() method on a Spatial to get a specific Control object, and activate its behaviour!
 
 [source,java]
 ----
 ManualControl c = mySpatial.getControl(ManualControl.class);
 c.steerX(steerX);
 ----
+====

+ 30 - 25
src/docs/asciidoc/jme3/advanced/custom_meshes.adoc

@@ -1,6 +1,6 @@
 = Custom Mesh Shapes
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: spatial, node, mesh, geometry, scenegraph
 :relfileprefix: ../../
@@ -9,11 +9,14 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-image::http://wiki.jmonkeyengine.org/lib/exe/fetch.php/jme3:advanced:custom_mesh.png[custom_mesh.png,with="150",height="150",align="left"]
+image::jme3/advanced/custom_mesh.png[custom_mesh.png,width="150",height="150",align="left"]
 
 Use the Mesh class to create custom shapes that go beyond Quad, Box, Cylinder, and Sphere, even procedural shapes are possible. Thank you to KayTrance for providing the sample code!
 
-*Note:* In this tutorial, we (re)create a very simple rectangular mesh (a quad), and we have a look at different ways of coloring it. Coding a custom quad may not be very useful because it's exactly the same as the built-in `com.jme3.scene.shape.Quad`. We chose a simple quad to teach you how to build any shape out of triangles, without the distractions of more complex shapes.
+[NOTE]
+====
+In this tutorial, we (re)create a very simple rectangular mesh (a quad), and we have a look at different ways of coloring it. Coding a custom quad may not be very useful because it's exactly the same as the built-in `com.jme3.scene.shape.Quad`. We chose a simple quad to teach you how to build any shape out of triangles, without the distractions of more complex shapes.
+====
 
 *  Full code sample: link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/shape/TestCustomMesh.java[TestCustomMesh.java]
 
@@ -22,16 +25,16 @@ Use the Mesh class to create custom shapes that go beyond Quad, Box, Cylinder, a
 
 Polygon <<jme3/advanced/mesh#,mesh>>es are made up of triangles. The corners of the triangles are called vertices. When ever you create any new shape, you break it down into triangles.
 
-*Example:* Let's look at a cube. A cube is made up of 6 rectangles. Each rectangle can be broken down into two triangles. This means you need 12 triangles to describe a cube mesh. Therefor you must provide the coordinates of the triangles' 8 corners (called vertices). 
+*Example:* Let's look at a cube. A cube is made up of 6 rectangles. Each rectangle can be broken down into two triangles. This means you need 12 triangles to describe a cube mesh. Therefor you must provide the coordinates of the triangles' 8 corners (called vertices).
 
-The important thing is that you have to specify the vertices of each triangle in the right order: Each triangle separately, counter-clockwise. 
+The important thing is that you have to specify the vertices of each triangle in the right order: Each triangle separately, counter-clockwise.
 
 Sounds harder than it is – let's create a simple custom mesh, a quad.
 
 
 == Creating a Quad Mesh
 
-In this tutorial we want to create a 3x3 Quad. The quad has four vertices, and is made up of two triangles. In our example, we decide that the bottom left corner is at 0/0/0 and the top right is at 3/3/0. 
+In this tutorial we want to create a 3x3 Quad. The quad has four vertices, and is made up of two triangles. In our example, we decide that the bottom left corner is at 0/0/0 and the top right is at 3/3/0.
 
 [source]
 ----
@@ -54,7 +57,10 @@ The base class for creating meshes is `com.jme3.scene.Mesh`.
 Mesh mesh = new Mesh();
 ----
 
-Tip: If you create your own Mesh-based class (`public class MyMesh extends Mesh {  }`), replace the variable `mesh` by `this` in the following examples.
+[TIP]
+====
+If you create your own Mesh-based class (`public class MyMesh extends Mesh {  }`), replace the variable `mesh` by `this` in the following examples.
+====
 
 
 === Vertex Coordinates
@@ -93,9 +99,9 @@ This syntax means, when you apply a texture to this mesh, the texture will fill
 
 === Connecting the Dots
 
-Next we turn these unrelated coordinates into *triangles*: We define the order in which each triangle is constructed. Think of these indexes as coming in groups of three. Each group of indexes describes one triangle. If the corners are identical, you can (and should!) reuse an index for several triangles. 
+Next we turn these unrelated coordinates into *triangles*: We define the order in which each triangle is constructed. Think of these indexes as coming in groups of three. Each group of indexes describes one triangle. If the corners are identical, you can (and should!) reuse an index for several triangles.
 
-Remember that you must specify the vertices counter-clockwise. 
+Remember that you must specify the vertices counter-clockwise.
 
 [source,java]
 ----
@@ -120,7 +126,7 @@ This syntax means:
 
 ----
 
-If the shape is more complex, it has more triangles, and therefor also more vertices/indices. Just continue expanding the list by adding groups of three indices for each triangle. (For example a three-triangle “house shape has 5 vertices/indices and you'd specify three groups: `int [] indexes = { 2,0,1, 1,3,2, 2,3,4 };`.) 
+If the shape is more complex, it has more triangles, and therefor also more vertices/indices. Just continue expanding the list by adding groups of three indices for each triangle. (For example a three-triangle “house shape has 5 vertices/indices and you'd specify three groups: `int [] indexes = { 2,0,1, 1,3,2, 2,3,4 };`.)
 
 
 [TIP]
@@ -158,13 +164,13 @@ Our Mesh is ready! Now we want to see it.
 
 == Using the Mesh in a Scene
 
-We create a `com.jme3.scene.Geometry` and `com.jme3.material.Material`from our `mesh`, apply a simple color material to it, and attach it to the rootNode to make it appear in the scene.
+We create a `com.jme3.scene.Geometry` and `com.jme3.material.Material` from our `mesh`, apply a simple color material to it, and attach it to the rootNode to make it appear in the scene.
 
 [source,java]
 ----
 
 Geometry geo = new Geometry("OurMesh", mesh); // using our custom mesh object
-Material mat = new Material(assetManager, 
+Material mat = new Material(assetManager,
     "Common/MatDefs/Misc/Unshaded.j3md");
 mat.setColor("Color", ColorRGBA.Blue);
 geo.setMaterial(mat);
@@ -185,7 +191,7 @@ We created a quad Mesh it can be replace by a Quad such as :
 
 Quad quad = new Quad(1,1); // replace the definition of Vertex and Textures Coordinates plus indexes
 Geometry geo = new Geometry("OurQuad", quad); // using Quad object
-Material mat = new Material(assetManager, 
+Material mat = new Material(assetManager,
     "Common/MatDefs/Misc/Unshaded.j3md");
 mat.setColor("Color", ColorRGBA.Blue);
 geo.setMaterial(mat);
@@ -209,11 +215,11 @@ quad.scaleTextureCoordinates(new Vector2f(width , height));
 If you are modifying a mesh dynamically in a way which changes the model's bounds, you need to update it:
 
 .  Call `updateBound()` on the mesh object, or
-.  Call `updateModelBound()` on the Geometry object containing the mesh - which in turns calls `updateBound()` on the mesh. 
+.  Call `updateModelBound()` on the Geometry object containing the mesh - which in turns calls `updateBound()` on the mesh.
 
 The updateModelBound() method warns you about not usually needing to use it, but that can be ignored in this special case.
 
-_N.B.: This does not work on TerrainQuad.  Please use the TerrainQuad.adjustHeight() function to edit the TerrainQuad mesh instead.  Additionally, if you want to use collisions on them afterwards, you need to call TerrainPatch.getMesh().createCollisionData(); to update the collision data, else it will collide with what seems to be the old mesh. _
+__N.B.: This does not work on TerrainQuad.  Please use the TerrainQuad.adjustHeight() function to edit the TerrainQuad mesh instead.  Additionally, if you want to use collisions on them afterwards, you need to call TerrainPatch.getMesh().createCollisionData(); to update the collision data, else it will collide with what seems to be the old mesh.__
 
 
 == Optional Mesh Features
@@ -235,7 +241,7 @@ matVC.setBoolean("VertexColor", true);
 You create a float array color buffer:
 
 *  Assign 4 color values, RGBA, to each vertex.
-**  To loop over the 4 color values, use a color index 
+**  To loop over the 4 color values, use a color index
 [source,java]
 ----
 int colorIndex = 0;
@@ -243,14 +249,14 @@ int colorIndex = 0;
 
 
 *  The color buffer contains four color values for each vertex.
-**  The Quad in this example has 4 vertices. 
+**  The Quad in this example has 4 vertices.
 [source,java]
 ----
 float[] colorArray = new float[4*4];
 
 ----
 
-**  Tip: If your mesh has a different number of vertices, you would write: 
+**  Tip: If your mesh has a different number of vertices, you would write:
 [source,java]
 ----
 float[] colorArray = new float[yourVertexCount * 4]
@@ -301,21 +307,20 @@ mesh.setBuffer(Type.Normal, 3, BufferUtils.createFloatBuffer(normals));
 
 ----
 
-You need to specify as many normals as the polygon has vertices. For a flat quad, the four normals point in the same direction. In this case, the direction is the Z unit vector (0,0,1), this means our quad is facing the camera. 
+You need to specify as many normals as the polygon has vertices. For a flat quad, the four normals point in the same direction. In this case, the direction is the Z unit vector (0,0,1), this means our quad is facing the camera.
 
 If the mesh is more complex or rounded, calculate cross products of neighbouring vertices to identify normal vectors!
 
 
 === Example: Point Mode
 
-Additionally to coloring the faces as just described, you can hide the faces and show only the vertices as colored corner points. 
+Additionally to coloring the faces as just described, you can hide the faces and show only the vertices as colored corner points.
 
 [source,java]
 ----
 Geometry coloredMesh = new Geometry ("ColoredMesh", cMesh);
 ...
 mesh.setMode(Mesh.Mode.Points);
-mesh.setPointSize(10f);
 mesh.updateBound();
 mesh.setStatic();
 Geometry points = new Geometry("Points", mesh);
@@ -336,13 +341,13 @@ This means for you that, by default, your custom mesh is invisible when seen fro
 
 In case however that your usecase requires the backfaces be visible, you have two options:
 
-*  If you have a very simple scene, you can simply deactivate backface culling for this one mesh's material. 
+*  If you have a very simple scene, you can simply deactivate backface culling for this one mesh's material.
 [source]
 ----
 mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off);
 ----
 
-*  Another solution for truly double-sided meshes is to specify each triangle twice, the second time with the opposite order of vertices. The second (reversed) triangle is a second frontface that covers up the culled backface. 
+*  Another solution for truly double-sided meshes is to specify each triangle twice, the second time with the opposite order of vertices. The second (reversed) triangle is a second frontface that covers up the culled backface.
 [source]
 ----
 int[] indexes = { 2,0,1, 1,3,2, 2,3,1, 1,0,2 };
@@ -350,7 +355,7 @@ int[] indexes = { 2,0,1, 1,3,2, 2,3,1, 1,0,2 };
 
 '''
 
-See also: 
+See also:
 
 *  <<jme3/advanced/spatial#,Spatial>> – contains more info about how to debug custom meshes (that do not render as expected) by changing the default culling behaviour.
 *  <<jme3/advanced/mesh#,Mesh>> – more details about advanced Mesh properties

+ 19 - 19
src/docs/asciidoc/jme3/advanced/debugging.adoc

@@ -1,6 +1,6 @@
 = Debugging
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -9,14 +9,14 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 When you deal with complex game engine features like animations or physics it is handy to get feedback from the engine how it interpreted the current state. Is the physical object's collision shape really where you think it is? Is the skeleton of the animated character moving like you think it should? This document shows you how to activate visual debug aides.
 
-What if you just want to quickly write code that loads models and brings them in their start position? You may not want to hunt for a sample model, convert it, add lights, and load materials. Instead you use “hasslefree simple shapes, and a “hasslefree unshaded material or wireframe: No model, no light source, no materials are needed to see them in your test scene. 
+What if you just want to quickly write code that loads models and brings them in their start position? You may not want to hunt for a sample model, convert it, add lights, and load materials. Instead you use “hasslefree simple shapes, and a “hasslefree unshaded material or wireframe: No model, no light source, no materials are needed to see them in your test scene.
 
 If you ever have problems with objects appearing in the wrong spot, with the wrong scale, or wrong orientation, simply attach debug shapes to your scene to have a point of reference in 3D space – just like a giant ruler. If your code positions the debug shapes correctly, but models remain invisible when you apply the same code to them, you know that the problem must be either the model (where is its origin coordinate?), or the light (too dark? too bright? missing?), or the model's material (missing?) – and not the positioning code.
 
-Here are some different debug shapes: 
+Here are some different debug shapes:
 
 
-image::jme3/advanced/debug-shapes.png[debug-shapes.png,with="600",height="220",align="center"]
+image::jme3/advanced/debug-shapes.png[debug-shapes.png,width="600",height="220",align="center"]
 
 
 
@@ -25,7 +25,7 @@ image::jme3/advanced/debug-shapes.png[debug-shapes.png,with="600",height="220",a
 
 === Coordinate Axes
 
-The coordinate axes (com.jme3.scene.debug.Arrow) help you see the cardinal directions (X,Y,Z) from their center point. Scale the arrows to use them as a “ruler for a certain length. 
+The coordinate axes (com.jme3.scene.debug.Arrow) help you see the cardinal directions (X,Y,Z) from their center point. Scale the arrows to use them as a “ruler for a certain length.
 
 [source,java]
 ----
@@ -141,7 +141,7 @@ Making the skeleton visible inside animated models can be handy for debugging an
 [source,java]
 ----
 
-     SkeletonDebugger skeletonDebug = 
+     SkeletonDebugger skeletonDebug =
          new SkeletonDebugger("skeleton", control.getSkeleton());
      Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
      mat.setColor("Color", ColorRGBA.Green);
@@ -157,14 +157,14 @@ We assume that you have loaded a model with a material `mat`.
 
 Then you can add a switch to toggle the model's wireframe on and off, like this:
 
-.  Create a key input trigger that switches between the two materials: E.g. we toggle when the T key is pressed: 
+.  Create a key input trigger that switches between the two materials: E.g. we toggle when the T key is pressed:
 [source,java]
 ----
     inputManager.addMapping("toggle wireframe", new KeyTrigger(KeyInput.KEY_T));
     inputManager.addListener(actionListener, "toggle wireframe");
 ----
 
-.  Now add the toggle action to the action listener 
+.  Now add the toggle action to the action listener
 [source,java]
 ----
 
@@ -174,20 +174,20 @@ Then you can add a switch to toggle the model's wireframe on and off, like this:
       // toggle wireframe
       if (name.equals("toggle wireframe") && !pressed) {
         wireframe = !wireframe; // toggle boolean
-        mat.getAdditionalRenderState().setWireframe(wireframe); 
+        mat.getAdditionalRenderState().setWireframe(wireframe);
       }
       // else ... other input tests.
     }
   };
 ----
 
-.  Alternatively you could traverse over the whole scene and toggle for all Geometry objects in there if you don't want to create a new SceneProcessor 
+.  Alternatively you could traverse over the whole scene and toggle for all Geometry objects in there if you don't want to create a new SceneProcessor
 [source,java]
 ----
 
   private ActionListener actionListener = new ActionListener() {
-    boolean wireframe = false; 
-    
+    boolean wireframe = false;
+
     @Override
     public void onAction(String name, boolean pressed, float tpf) {
       // toggle wireframe
@@ -198,7 +198,7 @@ Then you can add a switch to toggle the model's wireframe on and off, like this:
             if (spatial instanceof Geometry)
               ((Geometry)spatial).getMaterial().getAdditionalRenderState().setWireframe(wireframe);
           }
-        }); 
+        });
       }
       // else ... other input tests.
     }
@@ -215,8 +215,8 @@ To display the wireframe of the entire scene instead on one material at a time,
 
 [source,java]
 ----
-public class WireProcessor implements SceneProcessor {    
-    
+public class WireProcessor implements SceneProcessor {
+
     RenderManager renderManager;
     Material wireMaterial;
 
@@ -225,7 +225,7 @@ public class WireProcessor implements SceneProcessor {
         wireMaterial.setColor("Color", ColorRGBA.Blue);
         wireMaterial.getAdditionalRenderState().setWireframe(true);
     }
-    
+
     public void initialize(RenderManager rm, ViewPort vp) {
         renderManager = rm;
     }
@@ -238,7 +238,7 @@ public class WireProcessor implements SceneProcessor {
         return renderManager != null;
     }
 
-    public void preFrame(float tpf) {        
+    public void preFrame(float tpf) {
     }
 
     public void postQueue(RenderQueue rq) {
@@ -252,7 +252,7 @@ public class WireProcessor implements SceneProcessor {
     public void cleanup() {
         renderManager.setForcedMaterial(null);
     }
-    
+
 }
 ----
 

+ 101 - 80
src/docs/asciidoc/jme3/advanced/effects_overview.adoc

@@ -1,21 +1,28 @@
 = jME3 Special Effects Overview
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, effect, light, water
 :relfileprefix: ../../
 :imagesdir: ../..
+:uri-jmonkeyengine: https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/
+:img-jmonkeyengine: https://github.com/jMonkeyEngine/jmonkeyengine/raw/master/
+:uri-forum: https://hub.jmonkeyengine.org/
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
+
 jME3 supports several types of special effects: Post-Processor Filters, SceneProcessors, and Particle Emitters (also known as particle systems). This list contains screenshots and links to sample code that demonstrates how to add the effect to a scene.
 
 
+
 == Sample Code
 
-*  There is one `com.jme3.effect.ParticleEmitter` class for all Particle Systems. 
-*  There is one `com.jme3.post.FilterPostProcessor` class and several `com.jme3.post.filters.*` classes (all Filters have `*Filter` in their names). 
-*  There are several `SceneProcessor` classes in various packages, including e.g. `com.jme3.shadow.*` and `com.jme3.water.*` (SceneProcessor have `*Processor` or `*Renderer` in their names).
+*  There is one `com.jme3.effect.ParticleEmitter` class for all Particle Systems.
+*  There is one `com.jme3.post.FilterPostProcessor` class and several `com.jme3.post.filters.` (all Filters have `Filter` in their names).
+*  There are several `SceneProcessor` classes in various packages, including e.g. `com.jme3.shadow.` and `com.jme3.water.` (SceneProcessor have `Processor` or `Renderer` in their names).
+
+
 
 
 === Particle Emitter
@@ -38,6 +45,7 @@ public class MyGame extends SimpleApplication {
 ----
 
 
+
 === Scene Processor
 
 [source,java]
@@ -45,7 +53,7 @@ public class MyGame extends SimpleApplication {
 
 public class MyGame extends SimpleApplication {
     private BasicShadowRenderer bsr;
-    
+
     public void simpleInitApp() {
         bsr = new BasicShadowRenderer(assetManager, 1024);
         bsr.setDirection(new Vector3f(.3f, -0.5f, -0.5f));
@@ -55,6 +63,7 @@ public class MyGame extends SimpleApplication {
 ----
 
 
+
 === Post-Processor Filter
 
 [source,java]
@@ -63,7 +72,7 @@ public class MyGame extends SimpleApplication {
 public class MyGame extends SimpleApplication {
     private FilterPostProcessor fpp; // one FilterPostProcessor per app
     private SomeFilter sf;           // one or more Filters per app
-    
+
     public void simpleInitApp() {
         fpp = new FilterPostProcessor(assetManager);
         viewPort.addProcessor(fpp); // add one FilterPostProcessor to viewPort
@@ -75,110 +84,119 @@ public class MyGame extends SimpleApplication {
 ----
 
 
-== Water
 
+== Water
 
-image::jme3/advanced/water-post.png[water-post.png,with="150",height="100",align="right"]
-
-image::jme3/advanced/water.png[water.png,with="150",height="100",align="right"]
+[.float-group]
+--
+[.right.text-left]
+image:jme3/advanced/water-post.png[water-post.png,width="150",height="100",] +
+image:jme3/advanced/water.png[water.png,width="150",height="100",align="right"]
 
-The jMonkeyEngine's <<jme3/advanced/water#,&quot;SeaMonkey&quot; WaterFilter>> simulates ocean waves, foam, including cool underwater caustics. 
+The jMonkeyEngine's <<jme3/advanced/water#,"`SeaMonkey WaterFilter`">> simulates ocean waves, foam, including cool underwater caustics. +
 Use the SimpleWaterProcessor (SceneProcessor) for small, limited bodies of water, such as puddles, drinking troughs, pools, fountains.
 
-See also the link:http://jmonkeyengine.org/2011/01/15/new-advanced-water-effect-for-jmonkeyengine-3[Rendering Water as Post-Process Effect] announcement with video.
+See also: 
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestSceneWater.java[jme3/src/test/jme3test/water/TestSceneWater.java] – SimpleWaterProcessor (SceneProcessor)
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestSimpleWater.java[jme3/src/test/jme3test/water/TestSimpleWater.java] – SimpleWaterProcessor (SceneProcessor)
+*  link:{uri-forum}t/monkeys-at-the-beach/15000[Rendering Water as Post-Process Effect] announcement with video.
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/water/TestSceneWater.java[TestSceneWater.java] – SimpleWaterProcessor. (SceneProcessor)
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/water/TestSimpleWater.java[TestSimpleWater.java] – SimpleWaterProcessor. (SceneProcessor)
+--
 
+[.float-group]
+--
+[.right]
+image:jme3/advanced/water-reflection-muddy.png[water-reflection-muddy.png,width="150",height="100"] +
+image:jme3/advanced/underwater2.jpg[underwater2.jpg,width="150",height="100",align="right"]
 
-image::jme3/advanced/water-reflection-muddy.png[water-reflection-muddy.png,with="150",height="100",align="right"]
-
-image::jme3/advanced/underwater2.jpg[underwater2.jpg,with="150",height="100",align="right"]
-
-
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWater.java[jme3/src/test/jme3test/water/TestPostWater.java] – WaterFilter
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWaterLake.java[jme3/src/test/jme3test/water/TestPostWaterLake.java] – WaterFilter
-
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/water/TestPostWater.java[TestPostWater.java] – WaterFilter.
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/water/TestPostWaterLake.java[TestPostWaterLake.java] – WaterFilter.
+--
 
 == Environment Effects
 
 
-=== Depth of Field Blur
-
 
-image::jme3/advanced/dof-blur.png[dof-blur.png,with="150",height="100",align="right"]
+=== Depth of Field Blur
 
-image::jme3/advanced/light-scattering-filter.png[light-scattering-filter.png,with="150",height="100",align="right"]
+[.right]
+image:jme3/advanced/dof-blur.png[dof-blur.png,width="150",height="100"] +
+image:jme3/advanced/light-scattering-filter.png[light-scattering-filter.png,width="150",height="100",align="right"]
 
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestDepthOfField.java[TestDepthOfField.java] – DepthOfFieldFilter.
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestDepthOfField.java[jme3/src/test/jme3test/post/TestDepthOfField.java] – DepthOfFieldFilter
 
 
 === Fog
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestFog.java[jme3/src/test/jme3test/post/TestFog.java] – FogFilter
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestFog.java[TestFog.java] – FogFilter.
+
 
 
 === Light Scattering
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestLightScattering.java[jme3/src/test/jme3test/post/TestLightScattering.java] – LightScatteringFilter
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestLightScattering.java[TestLightScattering.java] – LightScatteringFilter.
+
 
 
 === Vegetation
 
 *  Contribution: <<jme3/contributions/vegetationsystem/grass#,Grass System>>
-*  Contribution: link:http://jmonkeyengine.org/groups/user-code-projects/forum/topic/generating-vegetation-paged-geometry-style/[Trees (WIP)]
+*  Contribution: {uri-forum}t/generating-vegetation-paged-geometry-style/18928[Trees (WIP)]
 
 
-== Light and Shadows
 
+== Light and Shadows
 
-image::jme3/advanced/tanlglow1.png[tanlglow1.png,with="150",height="100",align="right"]
 
-image::jme3/advanced/shadow-sponza-ssao.png[shadow-sponza-ssao.png,with="150",height="100",align="right"]
 
+=== Bloom and Glow
 
+[.right]
+image:jme3/advanced/tanlglow1.png[tanlglow1.png,width="150",height="100"] +
+image:jme3/advanced/shadow-sponza-ssao.png[shadow-sponza-ssao.png,width="150",height="100",align="right"]
 
-=== Bloom and Glow
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestBloom.java[TestBloom.java]
+*  More details: <<jme3/advanced/bloom_and_glow#,Bloom and Glow>> – BloomFilter.
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestBloom.java[jme3/src/test/jme3test/post/TestBloom.java]
-*  More details: <<jme3/advanced/bloom_and_glow#,Bloom and Glow>> – BloomFilter
 
 
 === Light
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestSimpleLighting.java[jme3/src/test/jme3test/light/TestSimpleLighting.java] – DirectionalLight, PointLight
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestLightRadius.java[jme3/src/test/jme3test/light/TestLightRadius.java] – DirectionalLight, PointLight
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestManyLights.java[jme3/src/test/jme3test/light/TestManyLights.java] – .j3o scene
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/light/TestSimpleLighting.java[TestSimpleLighting.java] – DirectionalLight, PointLight.
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/light/TestLightRadius.java[TestLightRadius.java] – DirectionalLight, PointLight.
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/light/TestManyLights.java[TestManyLights.java] – .j3o scene.
 *  More details: <<jme3/advanced/light_and_shadow#,Light and Shadow>>
 
 
-image::jme3/advanced/shadow.png[shadow.png,with="150",height="100",align="right"]
-
-image::jme3/advanced/light-sources.png[light-sources.png,with="150",height="100",align="right"]
-
-
 
 === Shadow
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestShadow.java[jme3/src/test/jme3test/light/TestShadow.java] – BasicShadowRenderer (SceneProcessor)
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestPssmShadow.java[jme3/src/test/jme3test/light/TestPssmShadow.java] – PssmShadowRenderer (SceneProcessor), also known as Parallel-Split Shadow Mapping (PSSM).
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestSSAO.java[jme3/src/test/jme3test/post/TestSSAO.java], link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestSSAO2.java[jme3/src/test/jme3test/post/TestSSAO2.java] – SSAOFilter, also known as Screen-Space Ambient Occlusion shadows (SSOA).
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestTransparentSSAO.java[jme3/src/test/jme3test/post/TestTransparentSSAO.java] – SSAOFilter, also known as Screen-Space Ambient Occlusion shadows (SSOA), plus transparancy
+[.right]
+image:jme3/advanced/shadow.png[shadow.png,width="150",height="100"] +
+image:jme3/advanced/light-sources.png[light-sources.png,width="150",height="100",align="right"]
+
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/light/TestShadow.java[TestShadow.java] – BasicShadowRenderer. (SceneProcessor)
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/light/TestPssmShadow.java[TestPssmShadow.java] – PssmShadowRenderer (SceneProcessor), also known as Parallel-Split Shadow Mapping (PSSM).
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestSSAO.java[TestSSAO.java] +
+link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestSSAO2.java[TestSSAO2.java] – SSAOFilter, also known as Screen-Space Ambient Occlusion shadows (SSOA).
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestTransparentSSAO.java[TestTransparentSSAO.java] – SSAOFilter, also known as Screen-Space Ambient Occlusion shadows (SSOA), plus transparancy.
 *  More details: <<jme3/advanced/light_and_shadow#,Light and Shadow>>
 
 
+
 == Special: Glass, Metal, Dissolve, Toon
 
 
-image::jme3/advanced/toon-dino.png[toon-dino.png,with="150",height="100",align="right"]
 
+=== Toon Effect
 
+[.right]
+image::jme3/advanced/toon-dino.png[toon-dino.png,width="150",height="100"]
 
-=== Toon Effect
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestCartoonEdge.java[TestCartoonEdge.java] – CartoonEdgeFilter.
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/post/TestTransparentCartoonEdge.java[TestTransparentCartoonEdge.java] – CartoonEdgeFilter.
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestCartoonEdge.java[jme3/src/test/jme3test/post/TestCartoonEdge.java] – CartoonEdgeFilter
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestTransparentCartoonEdge.java[jme3/src/test/jme3test/post/TestTransparentCartoonEdge.java] – CartoonEdgeFilter
 
 
 === Fade in / Fade out
@@ -186,54 +204,56 @@ image::jme3/advanced/toon-dino.png[toon-dino.png,with="150",height="100",align="
 *  <<jme3/advanced/fade#,Fade>> – FadeFilter
 
 
-=== User Contributed
-
 
-image::jme3/advanced/shaderblow_light1.jpg[shaderblow_light1.jpg,with="78",height="150",align="right"]
-
-image::jme3/advanced/shaderblow_glass.jpg[shaderblow_glass.jpg,with="80",height="150",align="right"]
-
-image::jme3/advanced/shaderblow_matcap.jpg[shaderblow_matcap.jpg,with="150",height="150",align="right"]
-
-image::jme3/advanced/shaderblow_light2.jpg[shaderblow_light2.jpg,with="66",height="150",align="right"]
+=== User Contributed
 
+[.float-group]
+--
+[.right]
+image:jme3/advanced/shaderblow_light1.jpg[shaderblow_light1.jpg,width="78",height="150"] +
+image:jme3/advanced/shaderblow_glass.jpg[shaderblow_glass.jpg,width="80",height="150",align="right"] +
+image:jme3/advanced/shaderblow_matcap.jpg[shaderblow_matcap.jpg,width="150",height="150",align="right"] +
+image:jme3/advanced/shaderblow_light2.jpg[shaderblow_light2.jpg,width="66",height="150",align="right"]
 
 <<sdk/plugin/shaderblow#,ShaderBlow - GLSL Shader Library>>
 
-*  LightBlow Shader – blend material texture maps
-*  FakeParticleBlow Shader – jet, fire effect
-*  ToonBlow Shader – Toon Shading, toon edges 
-*  Dissolve Shader – Scifi teleportation/dissolve effect
+*  LightBlow Shader – blend material texture maps.
+*  FakeParticleBlow Shader – jet, fire effect.
+*  ToonBlow Shader – Toon Shading, toon edges.
+*  Dissolve Shader – Scifi teleportation/dissolve effect.
 *  MatCap Shader – Gold, metals, glass, toons…!
-*  Glass Shader – Glass
-*  Force Shield Shader – Scifi impact-on-force-field effect
-*  SimpleSprite Shader – Animated textures
-*  SimpleSpriteParticle Shader – Sprite library
-*  MovingTexture Shader – Animated cloud/mist texture
-*  SoftParticles Shader – Fire, clouds, smoke etc
+*  Glass Shader – Glass.
+*  Force Shield Shader – Scifi impact-on-force-field effect.
+*  SimpleSprite Shader – Animated textures.
+*  SimpleSpriteParticle Shader – Sprite library.
+*  MovingTexture Shader – Animated cloud/mist texture.
+*  SoftParticles Shader – Fire, clouds, smoke etc.
 *  Displace Shader – Deformation effect: Ripple, wave, pulse, swell!
 
 Thanks for your awesome contributions! Keep them coming!
+--
 
 
-== Particle Emitters: Explosions, Fire, Smoke
-
 
-image::jme3/advanced/explosion-5.png[explosion-5.png,with="150",height="100",align="right"]
+== Particle Emitters: Explosions, Fire, Smoke
 
-image::jme3/advanced/particle.png[particle.png,with="150",height="100",align="right"]
+[.right]
+image:jme3/advanced/explosion-5.png[explosion-5.png,width="150",height="100"] +
+image:jme3/advanced/particle.png[particle.png,width="150",height="100",align="right"]
 
 <<jme3/advanced/particle_emitters#,Particle emitter effects>> are highly configurable and can have any texture. They can simulate smoke, dust, leaves, meteors, snowflakes, mosquitos, fire, explosions, clusters, embers, sparks…
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/effect/TestExplosionEffect.java[jme3/src/test/jme3test/effect/TestExplosionEffect.java] – debris, flame, flash, shockwave, smoke, sparks
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/effect/TestPointSprite.java[jme3/src/test/jme3test/effect/TestPointSprite.java] – cluster of points 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/effect/TestMovingParticle.java[jme3/src/test/jme3test/effect/TestMovingParticle.java] – dust, smoke
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/effect/TestExplosionEffect.java[TestExplosionEffect.java] – debris, flame, flash, shockwave, smoke, sparks.
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/effect/TestPointSprite.java[TestPointSprite.java] – cluster of points.
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/effect/TestMovingParticle.java[TestMovingParticle.java] – dust, smoke.
+
 '''
 
 
+
 === Creating your own Filters
 
-Here is an extract taken from @nehon in the forum thread (link:http://hub.jmonkeyengine.org/forum/topic/how-exactly-do-filters-work/[http://hub.jmonkeyengine.org/forum/topic/how-exactly-do-filters-work/])
+Here is an extract taken from @nehon in the forum thread (link:{uri-forum}t/how-exactly-do-filters-work/26871[http://hub.jmonkeyengine.org/forum/topic/how-exactly-do-filters-work/])
 
 The methods are called in this order (pretty much the same flow as processors):
 - initFilter() is called once when the FilterPostPorcessor is initialized or when the filter is added to the processor and this one as already been initialized.
@@ -257,6 +277,7 @@ It can be a post pass to do after the main filter has been rendered to screen (f
 The bloom Filter does an intensive use of passes.
 
 Filters in a nutshell.
+
 '''
 
 See also:

+ 10 - 12
src/docs/asciidoc/jme3/advanced/endless_terraingrid.adoc

@@ -1,6 +1,6 @@
 = Endless Terrain
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -10,7 +10,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 [NOTE]
 ====
-Deprecated. Look at link:http://hub.jmonkeyengine.org/forum/topic/design-question-terrain/#post-262072[http://hub.jmonkeyengine.org/forum/topic/design-question-terrain/#post-262072] instead
+Deprecated. Look at link:https://hub.jmonkeyengine.org/t/design-question-terrain/28771[https://hub.jmonkeyengine.org/t/design-question-terrain/28771] instead.
 ====
 
 
@@ -24,9 +24,9 @@ Thanks to Gábor (@anthyon) and Brent (@sploreg) for this contribution!
 
 The classes with source code can be found in the org.jme3.terrain.geomipmapping and org.jme3.terrain.heightmap packages. Also there are 3 tests prepared in the jme3test.terrain package:
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainGridTest.java[TerrainGridTest.java]: uses an ImageBasedHeightMapGrid instance to load the tiles
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainFractalGridTest.java[TerrainFractalGridTest.java]: makes use of the FractalHeightMapGrid class, and generates a terrain from noise
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainGridAlphaMapTest.java[TerrainGridAlphaMapTest.java]: shows how to use TerrainGridListener to change the material of the tiles
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainGridTest.java[TerrainGridTest.java]: uses an ImageBasedHeightMapGrid instance to load the tiles
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainFractalGridTest.java[TerrainFractalGridTest.java]: makes use of the FractalHeightMapGrid class, and generates a terrain from noise
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainGridAlphaMapTest.java[TerrainGridAlphaMapTest.java]: shows how to use TerrainGridListener to change the material of the tiles
 
 
 == Specification
@@ -38,17 +38,15 @@ TerrainGrid is made up of the TerrainGrid class, and the HeightMapGrid and Terra
 **  gridMoved(Vector3f):  gets the new center as parameter after terrain update, so any objects can be added or removed as needed.
 **  Material tileLoaded(Material material, Vector3f cell): notifies the system about a tile being loaded. Parameters are a cloned value of the material added to the TerrainGrid, and the cell of the new tile. The system can change the material according to this information (eg. load required alphamaps, etc).
 
-
-+
 Multiple listeners can be added to the TerrainGrid, they will be called in the order of addition, so it’s possible to have multiple changes to the material before completing the load of the tile.
-+
+
 HeightMapGrid adds the possibility of loading terrain tiles on demand instead of having a simple height array. There’s no predefined way of how to store these tiles, it only takes care of loading one HeightMap object at given location at a time.
 
 
 == Motivation
 
 
-image::wp-uploads/2011/06/grid-tiles.jpg[grid-tiles.jpg,with="130",height="130",align="right"]
+//image::wp-uploads/2011/06/grid-tiles.jpg[grid-tiles.jpg,width="130",height="130",align="right"]
 
 After playing around with the terrain in jME3, soon comes the requirement of having larger explorable lands. Increasing the size of one TerrainQuad leads to more memory usage, while it will still be easy to reach the worlds boundaries. That’s why TerrainGrid was designed. It extends the TerraindQuad class and uses 4 HeightMaps (dark blue) as the four sub-quad. This means that a terrain of size 513 will use tiles of 257. Also an LRUCache is built into the terrain package, so surrounding tiles (green) can be pre-cached on a different thread, lowering the loading time. The quads are updated as the camera approaches the boundary of the light blue section.
 
@@ -72,5 +70,5 @@ There exist also two basic HeightMapGrid implementations:
 
 Further information about terrain and TerrainQuad can be found in the wiki at:
 
-*  link:http://jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_terrain[http://jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_terrain] and
-*  link:http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:terrain[http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:terrain]
+*  <<jme3/beginner/hello_terrain#,jme3:beginner:hello_terrain>>
+*  <<jme3/advanced/terrain#,jme3:advanced:terrain>>

+ 142 - 0
src/docs/asciidoc/jme3/advanced/free_skymaps.adoc

@@ -0,0 +1,142 @@
+= How to create free SkyMaps
+:author: 
+:revnumber: 
+:revdate: 2017/04/4 10:23
+:relfileprefix: ../../
+:imagesdir: ../..
+:experimental: 
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+There are a plethora of ways to create skymaps with varying levels of difficulty and expense. The link:http://planetside.co.uk/[Terragen] program has been mentioned as one way to do so but it is now limited in its use and for commercial purposes is not free. Another program, link:https://www.daz3d.com/bryce-7-pro[Bryce], is also not free and seems to of stalled in development based off there only being a 32bit version available. Maybe they are doing things behind the scenes but its still not a free program. This articles intent is to give the JME3 user other options for the creation of skymaps using the free programs Blender and Gimp. It is not the be all, end all of skymap creation. If you know of better methods or tools please feel free to share your wisdom on the link:https://hub.jmonkeyengine.org/[forums].
+
+
+== Blender
+
+
+Using Blender you can create your skymaps for free. Once link:https://www.blender.org/[Blender] is setup, your skymaps creation can be done easily. For this article I will go into detail on how to setup Blender to create Angular maps based off a video produced by jMonkey contributor glaucomardano and mentioned in this link:https://hub.jmonkeyengine.org/t/jmonkeyengine-tutorial-how-to-create-skymaps-using-blender/19313[forum post]. Contributor glaucomardano did a good job on the video but it requires previous knowledge of Blender to be able to easily follow along. As such, I will translate it to paper for you. You can view his video by following this link: link:https://youtu.be/z38Aikz5nE8[jMonkeyEngine Tutorial - How to create skymaps using blender].
+
+[NOTE]
+====
+This tutorial is an adaptation of contributor glaucomardanos production, not an exact duplicate. +
+These steps assume you're using the default blender setup and apply to vers 2.78c+. +
+The tutorial is in checklist format so you can mark items as you go to keep your place.
+====
+
+[%interactive]
+.Blender Skybox Checklist
+- [ ] Start with a new file in blender.
+- [ ] Select the lamp and the default cube in the 3d view or in the Outliner panel (top-right panel) and delete them: kbd:[X]. They are not needed for this procedure.
+- [ ] Select the camera object in the 3d view or in the Outliner panel then clear its location and rotation by using keyboard shortcuts kbd:[Alt]+kbd:[G] and kbd:[Alt]+kbd:[R].
+- [ ] In the properties panel (lower-right panel) select the Object tab (orange box). This will give you a visual perspective of the camera changes you are about to make.
+- [ ] Rename the Camera to Camera-north.
+- [ ] With your cursor inside the 3d view, change to top-ortho view by pressing kbd:[NumPad 7] followed by kbd:[NumPad 5].
+- [ ] With the camera still selected, press kbd:[R] immediately followed by kbd:[X] immediately followed by 90 immediately followed by kbd:[Enter] to rotate the camera 90 degrees around the X axis.
+- [ ] With the camera still selected, press kbd:[Shift]+kbd:[D]. This will duplicate the camera. Next press kbd:[Enter] to set the selection.
+- [ ] Press kbd:[R] immediately followed by 180 immediately followed by kbd:[Enter]. This will rotate the camera 180 degrees around the Z axis. Rename this camera to Camera-south.
+- [ ] With the camera still selected, press kbd:[Shift]+kbd:[D]. This will duplicate the camera. Next press kbd:[Enter] to set the selection.
+- [ ] With the camera still selected, press kbd:[R] immediately followed by 90 immediately followed by kbd:[Enter]. This will rotate the camera another 90 degrees around the Z axis. Rename this camera to Camera-west.
+- [ ] With the camera still selected, press kbd:[Shift]+kbd:[D]. This will duplicate the camera. Next press kbd:[Enter] to set the selection.   
+- [ ] With the camera still selected, press kbd:[R] immediately followed by -180 immediately followed by kbd:[Enter]. This will rotate the camera -180 degrees around the Z axis. Rename this camera to Camera-east.
+- [ ] With your mouse inside the 3d view change your view to right-ortho by entering kbd:[NumPad 3].
+- [ ] Select Camera-south in 3d view or in the Outliner panel (top-right panel) and press kbd:[Shift]+kbd:[D]. This will duplicate the camera. Next press kbd:[Enter] to set the selection.
+- [ ] With the camera still selected, press kbd:[R] immediately followed by 90 immediately followed by kbd:[Enter]. This will rotate the camera 90 degrees around the X axis. The camera should now be pointing up. Rename this camera to Camera-up.
+- [ ] With the camera still selected, press kbd:[Shift]+kbd:[D]. This will duplicate the camera. Next press kbd:[Enter] to set the selection.
+- [ ] With the camera still selected, press kbd:[R] immediately followed by 180 immediately followed by kbd:[Enter]. This will rotate the camera 180 degrees along the X axis. The camera should now be facing down. Rename this camera to Camera-down.
+- [ ] Save your file.
+
+[%interactive]
+.Angular Map
+- [ ] Open up a web browser and search for "free high res skymap" and select a Angular map of your choice or you can find some here at link:https://blenderartists.org/forum/showthread.php?24038-Free-high-res-skymaps-%2528Massive-07-update!%2529[https://blenderartists.org/forum/showthread.php?24038-Free-high-res-skymaps-%2528Massive-07-update!%2529] instead. Remember to select an *ANGULAR* map.
+- [ ] Save a map to your pc in a place you can easily locate it from later in blender.
+
+[%interactive]
+.Textures Tab
+- [ ] From the properties panel (bottom-right panel) select the Textures tab (red-white checkerboard) then press the new button to create a new texture. Rename this texture to AngMap.
+- [ ] Under the Image panel select open and navigate to the file you saved earlier.
+- [ ] In the Mapping panel select AngMap from the drop down box.
+- [ ] In the Influence panel de-select blend (ble) and select horizon (hor).
+
+[%interactive]
+.Data Tab
+- [ ] From the properties panel select the Data tab (reel to reel camera).
+- [ ] In the lens panel change the Focal Lens value from 35 to 16. Do this for every camera.
+
+[%interactive]
+.Render Tab
+- [ ] From the properties panel select the Render tab (normal looking camera).
+- [ ] In the Dimensions panel set the resolution to any number that is a power of 2. For this example 1024 x 1024. 
+- [ ] Slide the resolution scale to 100%.
+- [ ] In the Output panel change the image type to JPEG. I have found out by trial and error that using a JPEG file has the same image quality as a PNG or DDS file but with a huge difference in image size. A single PNG image will clock in at over 8mb to the JPEG size of 325kb. Even converting to a DDS file comes in at over 3mb for comparison (using RGB888 as is recommended by Momoko_Fan/Core Developer in this link:https://hub.jmonkeyengine.org/t/best-dds-format-for-skyfactory/17668/2[forum post]) with no gain in image quality that I could see. Your welcome to experiment on your own if you wish.
+- [ ] Set the image format to RGB.
+- [ ] Setting the quality slider has the effect of reducing the image size where 0 is maximum compression and 100 is no compression. In this example, setting it to 0 reduced the image sizes to less than 125kb, once again with no discernable image degradation that I could see.
+
+[%interactive]
+.World Tab
+- [ ] In the properties panel select the World tab.
+- [ ] Check the Real Sky toggle.
+
+[%interactive]
+.Map Generator Setup 
+- [ ] From the header at the top of the 3d view click the btn:[Choose Screen Layout] button next to the word `Default` and select `Split Verticle F/R`. 
+- [ ] Click the `+` sign to create a new layout. 
+- [ ] Rename this new layout Angular Map Generator or a name of your choosing.
+- [ ] In the left side 3d view, at the bottom, next to the word view, is the btn:[Current Editor Type] button. Click it and change it to `UV/Image Editor`.
+- [ ] Place your mouse inside the right side 3d view and press kbd:[NumPad 5] to toggle ortho view. You're now setup to render your Angular map.
+- [ ] Save your file.
+
+[%interactive]
+.Rendering And Saving
+- [ ] With your first camera selected (in this case Camera-down) and your mouse inside the right side 3d view, press kbd:[Ctrl]+kbd:[NumPad 0] to set your selected camera to be the active camera. 
+- [ ] Press kbd:[F12] to render the scene. A image will appear in the left side UV/Image Editor.
+- [ ] With your mouse inside the left side UV/Image Editor you can scroll in or out to center the view.
+- [ ] With your mouse inside the left side UV/Image Editor press kbd:[F3] to save your image. Rename the image (down.jpg in this case). 
+
+Follow this same procedure for the remaining cameras. Rendering, renaming and saving each. After you have rendered all your images you can copy and paste them into your asset folder for JME3. Usually under the `Assets/Texture` directory. 
+
+To use your images in your code, in simpleInitApp(), load the Textures and use the SkyFactory to create your sky.
+
+[source,java]
+----
+Texture west = getAssetManager().loadTexture("Textures/Sky/west.jpg");
+Texture east = getAssetManager().loadTexture("Textures/Sky/east.jpg");
+Texture north = getAssetManager().loadTexture("Textures/Sky/north.jpg");
+Texture south = getAssetManager().loadTexture("Textures/Sky/south.jpg");
+Texture up = getAssetManager().loadTexture("Textures/Sky/up.jpg");
+Texture down = getAssetManager().loadTexture("Textures/Sky/down.jpg");
+getRootNode().attachChild(SkyFactory.createSky(getAssetManager(), west, east, north, south, up, down));
+----
+
+Many thanks go out to contributor glaucomardano for his video. He has excellent taste in music.
+
+Listed below are other Blender tutorials JME3 users may find valuable. 
+
+*  link:https://www.katsbits.com/tutorials/blender/cycles-skybox.php[Render a Skybox using Cycles]
+*  link:https://www.katsbits.com/tutorials/blender/render-skybox.php[Render a Skybox Environment Map]
+
+
+== Gimp
+
+
+You can use link:https://www.gimp.org/[Gimp] to create SkyMaps from a single image with the addition of 2 scripts.
+
+*  link:https://code.google.com/archive/p/gimp-dds/[Gimp-dds]
+*  link:http://registry.gimp.org/node/25532[Cubemap Layers Generator]
+
+After installing the scripts you open a image in gimp. This script works by slicing up the image into 6 layers of equal size, each by the power of 2. 
+
+.  After you open the image you select `menu:Filters[Generic > Cubemap Layers Generator]`.
+.  Fill in the details as follows. 
+**  Source: navigate to the image you are slicing.
+**  Cubemap layout: `Cross Horizontal`
+**  2 to the power of: `10` (for 1024 sized Layers) 
+.  Press btn:[OK] to slice up the image.
+.  Select `menu:File[Export As]` and change the `Name` and `File Type` to `.dds`. Choose your save location, typically `Assets/Textures`.
+.  Press btn:[Export].
+. A DDS panel will open. Apply the following settings:
+* Compression: `None`
+* Format: `RGB8`
+* Save: `As cube map`
+* MipMaps: `No mipmaps`
+. Press btn:[OK] to export.
+
+You attach the exported image to your scene as is explained in the <<jme3/advanced/sky#,How to add a Sky to your Scene>> tutorial.

+ 21 - 17
src/docs/asciidoc/jme3/advanced/hud.adoc

@@ -1,6 +1,6 @@
 = Head-Up Display (HUD)
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: gui, display, documentation, hud
 :relfileprefix: ../../
@@ -8,9 +8,9 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-
-image::http://www.jmonkeyengine.com/wp-content/uploads/2010/10/grapplinghook.jpg[grapplinghook.jpg,with="256",height="192",align="right"]
-
+////
+image::http://www.jmonkeyengine.com/wp-content/uploads/2010/10/grapplinghook.jpg[grapplinghook.jpg,width="256",height="192",align="right"]
+////
 
 A HUD (Head-Up Display) is part of a game's visual user interface. It's an overlay that displays additional information as (typically) 2-dimensional text or icons on the screen, on top of the 3D scene. Not all games have, or need a HUD. To avoid breaking the immersion and cluttering the screen, only use a HUD if it is the only way to convey certain information.
 
@@ -31,14 +31,18 @@ a|Cons
 
 a|Attach elements to default guiNode:
 a|Easy to learn. jMonkeyEngine built-in +++<abbr title="Application Programming Interface">API</abbr>+++ for attaching plain images and bitmap text.
-a|Only basic features. +You will have to write custom controls / buttons / effects if you need them.
+a|Only basic features. +
+You will have to write custom controls / buttons / effects if you need them.
 
 a|Use advanced <<jme3/advanced/nifty_gui#,Nifty GUI>> integration:
-a|Full-featured interactive user interface. +Includes buttons, effects, controls. +Supports XML and Java layouts.
+a|Full-featured interactive user interface. +
+Includes buttons, effects, controls. +Supports XML and Java layouts.
 a|Steeper learning curve.
 
 a|Use user contributed +++<abbr title="Graphical User Interface">GUI</abbr>+++ libraries such as <<jme3/contributions/tonegodgui#,tonegodgui>> or link:http://hub.jmonkeyengine.org/t/lemur-api-documentation/27209[Lemur]:
-a|Both have many features that would be difficult to do with Nifty +Includes buttons, effects, controls. +New features are still being released 
+a|Both have many features that would be difficult to do with Nifty +
+Includes buttons, effects, controls. +
+New features are still being released
 a|Are not necessarily guaranteed future updates, not as well documented
 
 |===
@@ -48,20 +52,20 @@ Using the +++<abbr title="Graphical User Interface">GUI</abbr>+++ Node is the de
 
 == Simple HUD: GUI Node
 
-You already know the `rootNode` that holds the 3-dimensional scene graph. jME3 also offers a 2-dimension (orthogonal) node, the `guiNode`. 
+You already know the `rootNode` that holds the 3-dimensional scene graph. jME3 also offers a 2-dimension (orthogonal) node, the `guiNode`.
 
 This is how you use the guiNode for HUDs:
 
 *  Create a +++<abbr title="Graphical User Interface">GUI</abbr>+++ element: a BitmapText or Picture object.
-*  Attach the element to the guiNode. 
-*  Place the element in the orthogonal render queue using `setQueueBucket(Bucket.Gui)`. 
+*  Attach the element to the guiNode.
+*  Place the element in the orthogonal render queue using `setQueueBucket(Bucket.Gui)`.
 
 The BitmapTexts and Pictures appear as 2 dimensional element on the screen.
 
 
 [TIP]
 ====
-By default, the guiNode has some scene graph statistics attached. To clear the guiNode before you attach your own +++<abbr title="Graphical User Interface">GUI</abbr>+++ elements, use the following methods: 
+By default, the guiNode has some scene graph statistics attached. To clear the guiNode before you attach your own +++<abbr title="Graphical User Interface">GUI</abbr>+++ elements, use the following methods:
 
 [source,java]
 ----
@@ -93,12 +97,12 @@ When you set the last boolean in setImage() to true, the alpha channel of your i
 
 === Displaying Text in the HUD
 
-You use `com.jme3.font.BitmapText` to display text on the screen. 
+You use `com.jme3.font.BitmapText` to display text on the screen.
 
 [source,java]
 ----
 
-BitmapText hudText = new BitmapText(guiFont, false);          
+BitmapText hudText = new BitmapText(guiFont, false);
 hudText.setSize(guiFont.getCharSet().getRenderedSize());      // font size
 hudText.setColor(ColorRGBA.Blue);                             // font color
 hudText.setText("You can write any string here");             // the text
@@ -125,7 +129,7 @@ hudText = new BitmapText(myFont, false);
 
 === Displaying Geometries in the HUD
 
-It is technically possible to attach Quads and 3D Geometries to the HUD. They show up as flat, static +++<abbr title="Graphical User Interface">GUI</abbr>+++ elements. The size unit for the guiNode is pixels, not world units. If you attach a Geometry that uses a lit Material, you must add a light to the guiNode. 
+It is technically possible to attach Quads and 3D Geometries to the HUD. They show up as flat, static +++<abbr title="Graphical User Interface">GUI</abbr>+++ elements. The size unit for the guiNode is pixels, not world units. If you attach a Geometry that uses a lit Material, you must add a light to the guiNode.
 
 
 [IMPORTANT]
@@ -155,11 +159,11 @@ public void simpleUpdate(float tpf) {
 
 The recommended approach to create HUDs is using <<jme3/advanced/nifty_gui#,Nifty GUI>>.
 
-.  Lay out the +++<abbr title="Graphical User Interface">GUI</abbr>+++ in one or several Nifty XML or Java files. 
+.  Lay out the +++<abbr title="Graphical User Interface">GUI</abbr>+++ in one or several Nifty XML or Java files.
 .  Write the controller classes in Java.
 .  Load the XML file with the controller object in your game's simpleInit() method.
 
-The advantage of Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ is that it is well integrated into jME and the jMonkeyEngine SDK, and that it offers all the features that you expect from a professional modern user interface. 
+The advantage of Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ is that it is well integrated into jME and the jMonkeyEngine SDK, and that it offers all the features that you expect from a professional modern user interface.
 
 For HUDs, you basically follow the same instructions as for creating a normal <<jme3/advanced/nifty_gui#,Nifty GUI>>, you just don't pause the game while the HUD is up.
 

+ 23 - 10
src/docs/asciidoc/jme3/advanced/input_handling.adoc

@@ -29,8 +29,13 @@ This is how you add interaction to your game:
 
 Choose one or several key/mouse events for the interaction. We use `KeyTrigger`, `MouseAxisTrigger`, `MouseButtonTrigger`, `JoyAxisTrigger` and `JoyButtonTrigger` constants from the `com.jme3.input.controls` package. 
 
-*Note:* The MouseAxis and JoyAxis triggers go along the X axis (right/left) or Y axis (up/down). These Triggers come with extra booleans for the negative half of the axis (left, down). Remember to write code that listens to the negative (true) and positive (false) axis!
+[NOTE]
+====
+The MouseAxis and JoyAxis triggers go along the X axis (right/left) or Y axis (up/down). These Triggers come with extra booleans for the negative half of the axis (left, down). Remember to write code that listens to the negative (true) and positive (false) axis!
+====
+
 [cols="2", options="header"]
+
 |===
 
 a| Trigger 
@@ -76,28 +81,35 @@ a| Keyboard: Spacebar
 a| KeyTrigger(KeyInput.KEY_SPACE) 
 
 a| Keyboard: Shift 
-a| KeyTrigger(KeyInput.KEY_RSHIFT), +KeyTrigger(KeyInput.KEY_LSHIFT) 
+a| KeyTrigger(KeyInput.KEY_RSHIFT), +
+KeyTrigger(KeyInput.KEY_LSHIFT) 
 
 a| Keyboard: F1, F2, … 
 a| KeyTrigger(KeyInput.KEY_F1) … 
 
 a| Keyboard: Return, Enter 
-<a| KeyTrigger(KeyInput.KEY_RETURN), +KeyTrigger(KeyInput.KEY_NUMPADENTER)  
+<a| KeyTrigger(KeyInput.KEY_RETURN), +
+KeyTrigger(KeyInput.KEY_NUMPADENTER)  
 
 a| Keyboard: PageUp, PageDown 
-a| KeyTrigger(KeyInput.KEY_PGUP), +KeyTrigger(KeyInput.KEY_PGDN) 
+a| KeyTrigger(KeyInput.KEY_PGUP), +
+KeyTrigger(KeyInput.KEY_PGDN) 
 
 a| Keyboard: Delete, Backspace 
-a| KeyTrigger(KeyInput.KEY_BACK), +KeyTrigger(KeyInput.KEY_DELETE) 
+a| KeyTrigger(KeyInput.KEY_BACK), +
+KeyTrigger(KeyInput.KEY_DELETE) 
 
 a| Keyboard: Escape 
 a| KeyTrigger(KeyInput.KEY_ESCAPE) 
 
 a| Keyboard: Arrows 
-a| KeyTrigger(KeyInput.KEY_DOWN), +KeyTrigger(KeyInput.KEY_UP) +KeyTrigger(KeyInput.KEY_LEFT), KeyTrigger(KeyInput.KEY_RIGHT) 
+a| KeyTrigger(KeyInput.KEY_DOWN), +
+KeyTrigger(KeyInput.KEY_UP) +
+KeyTrigger(KeyInput.KEY_LEFT), KeyTrigger(KeyInput.KEY_RIGHT) 
 
 a| Joystick Button: 
-a| JoyButtonTrigger(0, JoyInput.AXIS_POV_X), +JoyButtonTrigger(0, JoyInput.AXIS_POV_Y) ? 
+a| JoyButtonTrigger(0, JoyInput.AXIS_POV_X), +
+JoyButtonTrigger(0, JoyInput.AXIS_POV_Y) ? 
 
 a| Joystick Movement: Right 
 a| JoyAxisTrigger(0, JoyInput.AXIS_POV_X, true) 
@@ -181,7 +193,10 @@ inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_D),
 
 The jME3 input manager supports two types of event listeners for inputs: AnalogListener and ActionListener. You can use one or both listeners in the same application. Add one or both of the following code snippets to your main SimpleApplication-based class to activate the listeners.
 
-*Note:* The two input listeners do not know, and do not care, which actual key was pressed. They only know which _named input mapping_ was triggered. 
+[NOTE]
+====
+The two input listeners do not know, and do not care, which actual key was pressed. They only know which _named input mapping_ was triggered. 
+====
 
 
 === ActionListener
@@ -196,8 +211,6 @@ The jME3 input manager supports two types of event listeners for inputs: AnalogL
 **  A boolean whether the trigger is still pressed or has just been released.
 **  A float of the current time-per-frame as timing factor
 
-*  
-
 [source,java]
 ----
 

+ 19 - 14
src/docs/asciidoc/jme3/advanced/j3m_material_files.adoc

@@ -35,7 +35,7 @@ Material shiny bumpy rock : Common/MatDefs/Light/Lighting.j3md {
 ----
 
 
-How to this file is structured:
+How this file is structured:
 
 .  Header
 ..  `Material` is a fixed keyword, keep it.
@@ -64,7 +64,10 @@ This is how you use the prepared .j3m Material on a Spatial. Since you have save
 myGeometry.setMaterial(assetManager.loadMaterial("Materials/SimpleBump.j3m"));
 ----
 
-*Tip:* In the jMonkeyEngine SDK, open Windows&gt;Palette and drag the `JME Material: Set J3M` snippet into your code.
+[TIP]
+====
+In the jMonkeyEngine SDK, open Windows&gt;Palette and drag the `JME Material: Set J3M` snippet into your code.
+====
 
 
 == Syntax Reference for .j3m Files
@@ -74,8 +77,10 @@ myGeometry.setMaterial(assetManager.loadMaterial("Materials/SimpleBump.j3m"));
 
 Make sure to get the paths to the textures (.png, .jpg) and material definitions (.j3md) right. 
 
-*  The paths to the built-in .j3md files are relative to jME3's Core Data directory. Just copy the path stated in the <<jme3/advanced/materials_overview#,Material>> table. +`Common/MatDefs/Misc/Unshaded.j3md` is resolved to `jme3/src/src/core-data/Common/MatDefs/Misc/Unshaded.j3md`.
-*  The paths to your textures are relative to your project's assets directory. +`Textures/bump_rock_normal.png` is resolved to `MyGame/src/assets/Textures/bump_rock_normal.png`
+*  The paths to the built-in .j3md files are relative to jME3's Core Data directory. Just copy the path stated in the <<jme3/advanced/materials_overview#,Material>> table. +
+`Common/MatDefs/Misc/Unshaded.j3md` is resolved to `jme3/src/src/core-data/Common/MatDefs/Misc/Unshaded.j3md`.
+*  The paths to your textures are relative to your project's assets directory. +
+`Textures/bump_rock_normal.png` is resolved to `MyGame/src/assets/Textures/bump_rock_normal.png`
 
 
 === Data Types
@@ -185,7 +190,7 @@ a| (Currently not supported in J3M)
 *  Float is “123.0 etc
 *  Enum - values depend on the enum
 
-See the link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html[RenderState] javadoc for a detailed explanation of render states.
+See the link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html[RenderState] javadoc for a detailed explanation of render states.
 [cols="3", options="header"]
 |===
 
@@ -193,39 +198,39 @@ a|Name
 a|Type
 a|Purpose
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setWireframe(boolean)[Wireframe] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setWireframe(boolean)[Wireframe] 
 a|(Boolean)
 a| Enable wireframe rendering mode 
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setFaceCullMode(com.jme3.material.RenderState.FaceCullMode)[FaceCull] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setFaceCullMode(com.jme3.material.RenderState.FaceCullMode)[FaceCull] 
 a|(Enum: FaceCullMode)
 a| Set face culling mode (Off, Front, Back, FrontAndBack) 
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setDepthWrite(boolean)[DepthWrite] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setDepthWrite(boolean)[DepthWrite] 
 a|(Boolean)
 a| Enable writing depth to the depth buffer 
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setDepthTest(boolean)[DepthTest] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setDepthTest(boolean)[DepthTest] 
 a|(Boolean)
 a| Enable depth testing 
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setBlendMode(com.jme3.material.RenderState.BlendMode)[Blend] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setBlendMode(com.jme3.material.RenderState.BlendMode)[Blend] 
 a|(Enum: BlendMode)
 a| Set the blending mode 
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setAlphaFallOff(float)[AlphaTestFalloff] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setAlphaFallOff(float)[AlphaTestFalloff] 
 a|(Float)
 a| Set the alpha testing alpha falloff value (if set, it will enable alpha testing) 
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setPolyOffset(float, float)[PolyOffset] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setPolyOffset(float,float)[PolyOffset] 
 a|(Float, Float)
 a| Set the polygon offset factor and units 
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setColorWrite(boolean)[ColorWrite] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setColorWrite(boolean)[ColorWrite] 
 a|(Boolean)
 a| Enable color writing
 
-a| link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html#setPointSprite(boolean)[PointSprite] 
+a| link:http://javadoc.jmonkeyengine.org/com/jme3/material/RenderState.html#setPointSprite(boolean)[PointSprite] 
 a|(Boolean)
 a| Enable point sprite rendering for point meshes 
 

+ 41 - 0
src/docs/asciidoc/jme3/advanced/jme3_ai.adoc

@@ -0,0 +1,41 @@
+= jMonkeyEngine Artificial Intelligence
+:author: 
+:revnumber: 
+:revdate: 2017/04/15 13:30
+:relfileprefix: ../../
+:imagesdir: ../..
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+
+
+Most games written need some type of link:https://en.wikipedia.org/wiki/Artificial_intelligence_(video_games)[Artificial Intelligence] to deliver a feeling of realism, excitement or challenge to the player. AI can be as simple as having an NPC (Non Player Character) respond to some action taken by a player or as complicated as smoothly navigating your way through a scene full of obstacles without getting stuck. It's a time-consuming and significant challenge to develop these systems so its much easier to use an existing library to do the heavy lifting for you. 
+
+Unfortunately, the jMonkeyEngine comes with no official library for dealing with AI. There is, however, the jme3 Artificial Intelligence library that is probably the closest there is to an official release. Although it never made it into any official releases, it was designed, in part, by core team members. It consists of two separate AI models, a link:https://en.wikipedia.org/wiki/Navigation_mesh[Navigation Mesh] library using link:https://en.wikipedia.org/wiki/Pathfinding[path-finding], and a simple Steering Behaviours library that uses path-following. 
+
+You can read about the introduction of the library in the forum thread: link:https://hub.jmonkeyengine.org/t/ai-plugin-now-with-navmesh-pathfinding/24644[AI plugin now with NavMesh pathfinding]. 
+
+== Where to find it
+
+The library and javaDocs can be found in the link:https://github.com/jMonkeyEngine-Contributions[jMonkeyEngine-Contributions] repository on GitHub under link:https://github.com/jMonkeyEngine-Contributions/jme3-artificial-intelligence[jme3 Artificial Intelligence]. Check the `release/libs` directory for the zip files. 
+
+The jme3 Artificial Intelligence Library:
+
+*  NavMesh - A Navigation Mesh path-finding AI system using the link:https://en.wikipedia.org/wiki/A*_search_algorithm[A*] algorithm.footnote:[Path-finding means computing the shortest route between two points. Usually mazes.]
+*  Steering - Contains the foundations of an link:http://natureofcode.com/book/chapter-6-autonomous-agents/[Autonomous Agent] system that uses path-following and forces to move a character through its environment. Includes a test case as well.footnote:[Path-following is taking a path that already exists and then following that path.]  
+
+
+== Use Examples
+
+Coming at a later date.
+
+
+== Other jME3 AI Options
+
+There are other jME3 specific options available you can read about in the wiki under the topic link:https://jmonkeyengine.github.io/wiki/jme3.html#artificial-intelligence-ai[Artificial Intelligence (AI)].
+
+
+== Further Reading
+
+*  link:http://www.policyalmanac.org/games/aStarTutorial.htm[A* Pathfinding for Beginners] by Patrick Lester 
+*  link:http://natureofcode.com/book/[The Nature of Code] by Daniel Shiffman
+*  link:http://www.red3d.com/cwr/steer/gdc99/[Steering Behaviors For Autonomous Characters] by Craig W. Reynolds 

+ 86 - 71
src/docs/asciidoc/jme3/advanced/jme3_shadernodes.adoc

@@ -17,17 +17,17 @@ jME3 material system is entirely based on shaders. While it's pretty powerful, t
 *  Adding new features to those shaders decrease the ease of maintenance a lot. This point made us reluctant to do so and some feature were never added (Fog to name it, but many more).
 *  Users can't add their own feature to the shader unless they fork it, and fall back to the same issues explained in previous points.
 
-Shader Nodes were designed with this in mind and are the fruit of many long discussions in the core chat balancing the pros and cons of this or that pattern.+
-At first this system was referred to as “Shader injection. The basic idea was to allow users to inject code into shaders with a tag replacement system.+
-We finally came with a different concept called Shader Nodes, that is inspired from blender nodes system for textures and post process.+
+Shader Nodes were designed with this in mind and are the fruit of many long discussions in the core chat balancing the pros and cons of this or that pattern. +
+At first this system was referred to as “Shader injection. The basic idea was to allow users to inject code into shaders with a tag replacement system. +
+We finally came with a different concept called Shader Nodes, that is inspired from blender nodes system for textures and post process. +
 *The final shader is generated at run time by the system by assembling shader nodes together.*
 
 
 == What is a Shader Node?
 
-Conceptually, it's just a self sufficient piece of glsl code that accepts inputs and produce some outputs.+
-Inputs are glsl variables that may be fed by previous nodes output values.+
-Outputs are glsl variables fed with values computed in the shader node code.+
+Conceptually, it's just a self sufficient piece of glsl code that accepts inputs and produce some outputs. +
+Inputs are glsl variables that may be fed by previous nodes output values. +
+Outputs are glsl variables fed with values computed in the shader node code. +
 
 In practice it's a bit more than that.A shader node is declined in several parts :
 
@@ -51,13 +51,13 @@ In practice it's a bit more than that.A shader node is declined in several parts
 
 == Shader Node definition
 
-First ShaderNodes have to be defined either in a separate file (j3sn for jme3 shader node) or directly embed in the Technique block of the j3md file.+
+First ShaderNodes have to be defined either in a separate file (j3sn for jme3 shader node) or directly embed in the Technique block of the j3md file. +
 Please refer to this documentation for global structure of a j3md file 
 <<jme3/advanced/material_specification#,jMonkeyEngine3 Material Specification>>
 
-All is included in a *ShaderNodeDefinitions* bloc. This block can have several nodes defined (it's recommended to define nodes that have strong dependencies with each other in the same j3sn file).+
-A ShaderNode is declared in a *ShaderNodeDefinition* block.+
-global structure should look like this :+
+All is included in a *ShaderNodeDefinitions* bloc. This block can have several nodes defined (it's recommended to define nodes that have strong dependencies with each other in the same j3sn file). +
+A ShaderNode is declared in a *ShaderNodeDefinition* block. +
+The global structure should look like this : 
 
 [source,java]
 ----
@@ -90,7 +90,7 @@ ShaderNodeDefinitions{
 
 ----
 
-All that is not between [] is mandatory.+
+All that is not between [] is mandatory.
 
 *  +++<u>ShaderNodeDefinition</u>+++ : the definition block. You can have several definition in the same ShaderNodeDefinitions block.
 **  *NodeDefName* : The name of this ShaderNodeDefinition
@@ -114,13 +114,15 @@ All that is not between [] is mandatory.+
 **  *GlslVarType* : a valid glsl variable type that will be used in the shader for this input. see link:http://www.opengl.org/wiki/GLSL_Type[http://www.opengl.org/wiki/GLSL_Type] and the “Declare an array chapter
 **  *VarName* : the name of the variable. Note that you can't have several outputs with the same name.
 
-
-* Note that if you use the same name for an input and an ouput, the generator will consider them as the SAME variable so they should be of the same glsl type.*
+[NOTE]
+====
+If you use the same name for an input and an ouput, the generator will consider them as the SAME variable so they should be of the same glsl type.
+====
 
 
 === Example
 
-Here is a typical shader node definition
+Here is a typical shader node definition.
 
 [source,java]
 ----
@@ -152,9 +154,9 @@ ShaderNodeDefinitions{
 
 === Declare an array
 
-To declare an array you have to specify its size between square brackets.+
-*Constant size*+
-The size can be an int constant+
+To declare an array you have to specify its size between square brackets. +
+*Constant size* +
+The size can be an int constant. +
 _Example_
 
 [source]
@@ -164,11 +166,11 @@ _Example_
 
 ----
 
-this will declare a float array with 10 elements.
-Any material parameter mapped with this array should be of FloatArray type and it's size will be assumed as 10 when the shader is generated.+
+This will declare a float array with 10 elements.
+Any material parameter mapped with this array should be of FloatArray type and it's size will be assumed as 10 when the shader is generated. 
 
-*Material parameter driven size*+
-The size can be dynamic and driven by a material parameter. GLSL does not support non constant values for array declaration so this material parameter will be mapped to a define.+
+*Material parameter driven size* +
+The size can be dynamic and driven by a material parameter. GLSL does not support non constant values for array declaration so this material parameter will be mapped to a define. +
 _Example_
 
 [source]
@@ -178,18 +180,22 @@ _Example_
 
 ----
 
-This declares a float array with the size depending on the value of the NumberOfElement material parameter.+
+This declares a float array with the size depending on the value of the NumberOfElement material parameter. +
 NumberOfElement *HAS* to be declared in the material definition as a material parameter. It will be mapped to a define and used in the shader.
-Not that if this value change the shader will have to be recompiled, due to the fact that it's mapped to a define.
+
+[NOTE]
+====
+If this value change the shader will have to be recompiled, due to the fact that it's mapped to a define.
+====
 
 
 == Shader Node code
 
-The shader code associated with a Shader node is similar to any shader code.+
-the code for a Vertex shader node should be in a .vert file and the code for a Fragment shader node should be in a .frag file.
-It has a declarative part containing variable declaration, function declaration and so on… And a main part that is embed in a “void main(){} block.+
-Input and output variables declared in the shader node definition can be used *without* being declared in the shader code. ( they shouldn't even or you'll have issues).+
-Here is a the code of the LightMap.frag shader.+
+The shader code associated with a Shader node is similar to any shader code. +
+The code for a Vertex shader node should be in a .vert file and the code for a Fragment shader node should be in a .frag file.
+It has a declarative part containing variable declaration, function declaration and so on… And a main part that is embed in a “void main(){} block. +
+Input and output variables declared in the shader node definition can be used *without* being declared in the shader code. ( they shouldn't even or you'll have issues). +
+Here is a the code of the LightMap.frag shader. 
 
 [source,java]
 ----
@@ -200,16 +206,16 @@ void main(){
 
 ----
 
-Very simple, it's just a texture fetch, but of course anything can be done.+
+Very simple, it's just a texture fetch, but of course anything can be done. +
 *Do not declare uniforms, attributes or varyings in a shader node code*, the Generator will handle this, just use the inputs and outputs and optional local variables you may need.
 
 
 == Shader Node declaration
 
 To create a shader we need to plug shader nodes to each other, but also interact with built in glsl inputs and outputs.
-Shader nodes are declared inside the Technique block. The vertex nodes are declared in the VertexShaderNodes block and the fragment nodes are declared in the FragmentShaderNodes block.+
+Shader nodes are declared inside the Technique block. The vertex nodes are declared in the VertexShaderNodes block and the fragment nodes are declared in the FragmentShaderNodes block. +
 Note that if the j3md has ember shader nodes definition (in a ShaderNodesDefinitions block) it *must* be declared before the VertexShaderNodes and FragmentShaderNodes blocks.
-Of course there can be several ShaderNode declaration in those block.+
+Of course there can be several ShaderNode declaration in those block. +
 Here is how a ShaderNode declaration should look :
 
 [source,java]
@@ -231,17 +237,16 @@ ShaderNode <ShaderNodeName>{
 ----
 
 *  +++<u>ShaderNode</u>+++ the shader node block
-**  *ShaderNodeName* the name of this shader node, can be anything, but has to be *unique* in the shader scope
+**  *ShaderNodeName* the name of this shader node, can be anything, but has to be *unique* in the shader scope.
 
-*  +++<u>Definition</u>+++ : a reference to the shader node definition
+*  +++<u>Definition</u>+++ : a reference to the shader node definition.
 **  *DefinitionName* : the name of the definition this Node use. this definition can be declared in the same j3md or in its own j3sn file.
 **  *DefinitionPath* : in case the definition is declared in it's own j3sn file, you have to set the path to this file here.
 
 *  +++<u>Condition</u>+++ a condition that dictates if the node is active or not.
-**  *Activationcondition* : The condition for this node to be used. Today we use Defines to use different blocks of code used depending on the state of a Material Parameter. The condition here use the exact same paradigm. A valid condition must be the name of a material parameter or any combinations using logical operators “||,“&amp;&amp;,“! or grouping characters “( and “). The generator will create the corresponding define and the shader node code will be embed into and #ifdef statement.+
-
+**  *ActivationCondition* : The condition for this node to be used. Today we use Defines to use different blocks of code used depending on the state of a Material Parameter. The condition here use the exact same paradigm. A valid condition must be the name of a material parameter or any combinations using logical operators &#8220;||,“&amp;&amp;,“! or grouping characters “( and “). The generator will create the corresponding define and the shader node code will be embed into and #ifdef statement.
 
-    For example, let's say we have a Color and ColorMap material parameter, this condition “Color || ColorMap will generate this statement :
+For example, let's say we have a Color and ColorMap material parameter, this condition “Color || ColorMap will generate this statement :
 
 [source,java]
 ----
@@ -254,11 +259,11 @@ ShaderNode <ShaderNodeName>{
 
 *  +++<u>InputMapping</u>+++ the wiring of the inputs of this node, coming from previous node's outputs or from built in glsl inputs.
 **  *InputVariableName* : the name of the variable to map as declared in the definition.
-**  *Swizzle* : Swizling for the preceding variable. More information on glsl swizzling on this page link:http://www.opengl.org/wiki/GLSL_Type[http://www.opengl.org/wiki/GLSL_Type]
+**  *Swizzle* : Swizling for the preceding variable. More information on glsl swizzling on this page link:http://www.opengl.org/wiki/GLSL_Type[http://www.opengl.org/wiki/GLSL_Type].
 **  *NameSpace* : The generator will use variable name space to avoid collision between variable names. Name space can be one of these values : 
-***  *MatParam* : the following variable is a Material Parameter declared in the MaterialParameters block of the materialDefinition
+***  *MatParam* : the following variable is a Material Parameter declared in the MaterialParameters block of the materialDefinition.
 ***  *WorldParam* : the following variable is a World Parameter declared in the WorldParameters block of the current technique block. World parameters can be one of those declared in this file : link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/shader/UniformBinding.java[https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/shader/UniformBinding.java]
-***  *Attr* : the following variable is a shader attribute. It can be one those declared in the Type enum of the VertexBuffer class link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java[https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java]
+***  *Attr* : the following variable is a shader attribute. It can be one those declared in the Type enum of the VertexBuffer class link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java[https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java].
 ***  *Global* : the variable is a global variable to the shader. Global variables will be assign at the end of the shader to glsl built in outputs : gl_Position for the vertex shader, or to one of the possible outputs of the fragment shader (for example  gl_FragColor). The global variable can have what ever name pleases you, it will assigned in the order they've been found in the declaration to the shader output. *Global variables can be inputs of a shader node. Global variables are forced to be vec4 and are defaulted to the value of the attribute inPosition in the vertex shader and vec4(1.0)(opaque white color) in the fragment shader*.
 ***  *The name of a previous shader node* : this must be followed by and output variable of a the named shader node. This is what allows one to plug outputs from a node to inputs of another.
 
@@ -267,7 +272,7 @@ ShaderNode <ShaderNodeName>{
 
 *  +++<u>OutputMapping</u>+++ : This block is optional, as mapping of output will be done in input mapping block of following shaderNodes, ecept if you want to output a value to the Global output of the shader.
 **  *NameSpace* : the name space of the output to assign, this can only be “Global here.
-**  *VarName* : the name of a global output (can be anything, just be aware that 2 different names result in 2 different outputs)
+**  *VarName* : the name of a global output (can be anything, just be aware that 2 different names result in 2 different outputs).
 **  *OutputVariable* : Must be an output of the current node's definition.
 **  *MappingCondition* : Same as before.
 
@@ -323,10 +328,10 @@ MaterialDef Simple {
 
 ----
 
-This Material definition has one Default technique with 2 node declarations.+
-+++<u>*CommonVert Definition*</u>++++
-CommonVert is a vertex shader node that has commonly used input and outputs of a vertex shader. It also computes the position of the vertex in projection space
-here is the definition content (Common/MatDefs/ShaderNodes/Common/CommonVert.j3sn) : 
+This Material definition has one Default technique with 2 node declarations. +
+*+++<u>CommonVert Definition</u>+++* +
+CommonVert is a vertex shader node that has commonly used input and outputs of a vertex shader. It also computes the position of the vertex in projection space. +
+Here is the definition content (Common/MatDefs/ShaderNodes/Common/CommonVert.j3sn) : 
 
 [source,java]
 ----
@@ -369,10 +374,10 @@ ShaderNodesDefinitions {
 
 [TIP]
 ====
-Note that texCoord1/2 and vertColor are declared both as input and output. the generator will use the same variables for them
+Note that texCoord1/2 and vertColor are declared both as input and output. The generator will use the same variables for them.
 ====
 
-here is the shader Node code ( Common/MatDefs/ShaderNodes/Common/commonVert.vert)
+Here is the shader Node code ( Common/MatDefs/ShaderNodes/Common/commonVert.vert).
 
 [source,java]
 ----
@@ -383,10 +388,10 @@ void main(){
 
 ----
 
-As you can see all the inputs and outputs are not used. that's because most of them are attributes meant to be passed to the fragment shader as varyings. all the wiring will be handled by the generator only if those variables are used in an input or output mapping.+
+As you can see all the inputs and outputs are not used. That's because most of them are attributes meant to be passed to the fragment shader as varyings. All the wiring will be handled by the generator only if those variables are used in an input or output mapping.
 
-+++<u>*CommonVert input mapping*</u>++++
-here we have the most basic yet mandatory thing in a vertex shader, computing vertex position in projection space. for this we have 2 mapping :
+*+++<u>CommonVert input mapping</u>+++* +
+Here we have the most basic yet mandatory thing in a vertex shader, computing vertex position in projection space. For this we have 2 mappings :
 
 *  *worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix* : the input parameter worldViewProjectionMatrix is assigned with the WorldViewProjectionMatrix World parameter declared in the WorlParameters block of the technique.
 *  *modelPosition = Global.position.xyz* : the modelPosition (understand the vertex position in the model coordinate space) is assigned with the Global position variable.
@@ -394,18 +399,23 @@ here we have the most basic yet mandatory thing in a vertex shader, computing ve
 
 [TIP]
 ====
-As mentioned before Global position is initialized with the attribute inPosition, so this is equivalent to : modelPosition = Attr.inPosition.xyz
+As mentioned before Global position is initialized with the attribute inPosition, so this is equivalent to : 
+
+[source, java]
+----
+modelPosition = Attr.inPosition.xyz
+----
 ====
 
 
 [TIP]
 ====
-also note the swizzle of the Global.position variable. modelPosition is a vec3 and GlobalPosition is a vec4 so we just take the first 3 components.
+Also note the swizzle of the Global.position variable. ModelPosition is a vec3 and GlobalPosition is a vec4 so we just take the first 3 components.
 ====
 
-+++<u>*CommonVert output mapping*</u>++++
+*+++<u>CommonVert output mapping</u>+++* +
 
-*  *Global.position = projPosition* : The result of the multiplication of the worldViewProjectionMatrix  and the modelPosition is assigned to the Globale position
+*  *Global.position = projPosition* : The result of the multiplication of the worldViewProjectionMatrix and the modelPosition is assigned to the Globale position.
 
 
 [TIP]
@@ -413,9 +423,9 @@ also note the swizzle of the Global.position variable. modelPosition is a vec3 a
 The Global.position variable will be assigned to the gl_Position glsl built in output at the end of the shader.
 ====
 
-+++<u>*ColorMult Definition*</u>++++
+*+++<u>ColorMult Definition</u>+++* +
 ColorMult is a very basic Shader Node that takes two colors as input and multiply them.
-here is the definition content (Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn) : 
+Here is the definition content (Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn) : 
 
 [source,java]
 ----
@@ -442,7 +452,7 @@ ShaderNodeDefinitions{
 
 ----
 
-here is the shader Node code (Common/MatDefs/ShaderNodes/Basic/colorMult.frag)
+Here is the shader Node code (Common/MatDefs/ShaderNodes/Basic/colorMult.frag).
 
 [source,java]
 ----
@@ -453,13 +463,18 @@ void main(){
 
 ----
 
-+++<u>*ColorMult input mapping*</u>++++
+*+++<u>ColorMult input mapping</u>+++* +
 All inputs are mapped here :
 
-*  *color1 = MatParam.Color* : The first color is assigned to the Color Material parameter declared in the MaterialParameter block of the material definition  
-*  *color2 = Global.color* : The second color is assigned with the Global color variable. this is defaulted to vec4(1.0) (opaque white). Note that in a much complex material def this variable could already have been assigned with a previous Shader Node output
+*  *color1 = MatParam.Color* : The first color is assigned to the Color Material parameter declared in the MaterialParameter block of the material definition.  
+*  *color2 = Global.color* : The second color is assigned with the Global color variable. this is defaulted to vec4(1.0) (opaque white).
+
+[NOTE]
+====
+In a very complex material def this variable could already have been assigned with a previous Shader Node output.
+====
 
-+++<u>*ColorMult output mapping*</u>++++
+*+++<u>ColorMult output mapping</u>+++* +
 
 *  *Global.color = outColor* : the resulting color is assigned to the Global color variable.
 
@@ -472,15 +487,15 @@ Note that the Global.color variable will be assigned to gl_FragColor (glsl < 1.5
 
 [TIP]
 ====
-Also note that in case several Global variables are declared, the generator will assign them gl_FragData[i](glsl < 1.5) i being the order the variable has been found in the material def. For glsl >= 1.5 the veriable will just all be declared as shader output in the order they've been found in the declaration
+Also note that in case several Global variables are declared, the generator will assign them gl_FragData[i](glsl < 1.5) i being the order the variable has been found in the material def. For glsl >= 1.5 the veriable will just all be declared as shader output in the order they've been found in the declaration.
 ====
 
 
-+++<u>*Generated shader code*</u>++++
+*+++<u>Generated shader code</u>+++* 
 
 [IMPORTANT]
 ====
-Don't take this code as carved in stone, the generated code can change as optimization of the shader generator goes on
+Don't take this code as carved in stone, the generated code can change as optimization of the shader generator goes on.
 ====
 
 Vertex Shader (glsl 1.0)
@@ -512,10 +527,10 @@ void main(){
 
 ----
 
-All materials parameter, world parameters, attributes varying are declared first. then for each shader node, the declarative part is appended.+
-For the main function, for each shader node, the input mappings are declared and assigned, the output are declared.+
-Then the variable names are replaced in the sahder node code with there complete name (NameSpace_varName), material parameters are replaced in the shader code as is.+
-Then, the output are mapped.+
+All materials parameter, world parameters, attributes varying are declared first. then for each shader node, the declarative part is appended. +
+For the main function, for each shader node, the input mappings are declared and assigned, the output are declared. +
+Then the variable names are replaced in the sahder node code with there complete name (NameSpace_varName), material parameters are replaced in the shader code as is. +
+Then, the output are mapped.
 
 As you can see texCoord1/2 and vertColor are declared but never used. That's because the generator is not aware of that. By default it will declare all inputs in case they are used in the shaderNode code.
 Note that most glsl compiler will optimize this when compiling the shader on the GPU.
@@ -544,16 +559,16 @@ void main(){
 
 ----
 
-Same as for the Vertex shader. note that the color1 is not declared, because it's directly replaced by the material parameter.
+Same as for the Vertex shader. Note that the color1 is not declared, because it's directly replaced by the material parameter.
 
 
 [IMPORTANT]
 ====
-As a rule of thumb you should not assign a value to an input. input are likely to be material paramters or  outputs from other shaders and modifying them may cause unexpected behavior, even failure in your resulting shader.
+As a rule of thumb you should not assign a value to an input. Inputs are likely to be material paramters or outputs from other shaders and modifying them may cause unexpected behavior, even failure in your resulting shader.
 ====
 
 
 For more explanations and design decisions please refer to the +++<abbr title="specification">spec</abbr>+++ here 
-link:https://docs.google.com/document/d/1S6xO3d1TBz0xcKe_MPTqY9V-QI59AKdg1OGy3U-HeVY/edit?usp=sharing[https://docs.google.com/document/d/1S6xO3d1TBz0xcKe_MPTqY9V-QI59AKdg1OGy3U-HeVY/edit?usp=sharing]
+link:https://docs.google.com/document/d/1S6xO3d1TBz0xcKe_MPTqY9V-QI59AKdg1OGy3U-HeVY/edit?usp=sharing[https://docs.google.com/document/d/1S6xO3d1TBz0xcKe_MPTqY9V-QI59AKdg1OGy3U-HeVY/edit?usp=sharing].
 
-Thank you for the brave ones that came through all this reading. i'm not gonna offer you a prize in exchange of a password, because we ran out of JME thongs…
+Thank you for the brave ones that came through all this reading. I'm not gonna offer you a prize in exchange of a password, because we ran out of JME thongs…

+ 102 - 88
src/docs/asciidoc/jme3/advanced/jme3_shaders.adoc

@@ -1,57 +1,61 @@
 = JME3 and Shaders
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-+
 
 
 == Shaders Basics
 
-Shaders are sets of instructions that are executed on the GPU. They are used to take advantage of hardware acceleration available on the GPU for rendering purposes.+
-This paper only covers Vertex and Fragment shaders because they are the only ones supported by JME3 for the moment. But be aware that there are some other types of shaders (geometry, tessellation,…).+
-There are multiple frequently used languages that you may encounter to code shaders but as JME3 is based on OpenGL, shaders in JME use GLSL and any example in this paper will be written in GLSL.+
-+
+Shaders are sets of instructions that are executed on the GPU. They are used to take advantage of hardware acceleration available on the GPU for rendering purposes. 
+
+This paper only covers Vertex and Fragment shaders because they are the only ones supported by JME3 for the moment. Be aware that there are some other types of shaders (geometry, tessellation,…). 
+
+There are multiple frequently used languages that you may encounter to code shaders but as JME3 is based on OpenGL, shaders in JME use GLSL and any example in this paper will be written in GLSL.
 
 
 === How Does it work?
 
-To keep it Simple: The Vertex shader is executed once for each vertex in the view, then the Fragment shader (also called the Pixel shader) is executed once for each pixel on the screen.+
-The main purpose of the Vertex shader is to compute the screen coordinate of a vertex (where this vertex will be displayed on screen) while the main purpose of the Fragment shader is to compute the color of a pixel.+
-This is a very simplified graphic to describe the call stack: +
-image:jme3/advanced/jme3andshaders.png[jme3andshaders.png,with="",height=""]+
+To keep it Simple: The Vertex shader is executed once for each vertex in the view, then the Fragment shader (also called the Pixel shader) is executed once for each pixel on the screen. 
+
+The main purpose of the Vertex shader is to compute the screen coordinate of a vertex (where this vertex will be displayed on screen) while the main purpose of the Fragment shader is to compute the color of a pixel. 
+
+This is a very simplified graphic to describe the call stack: 
+
+image:jme3/advanced/jme3andshaders.png[jme3andshaders.png,width="",height="", align="left] 
+
 The main program sends mesh data to the vertex shader (vertex position in object space, normals, tangents, etc..). The vertex shader computes the screen position of the vertex and sends it to the Fragment shader. The fragment shader computes the color, and the result is displayed on screen or in a texture.
-+
 
 
 === Variables scope
 
-There are different types of scope for variables in a shader :
+There are different types of scope for variables in a shader:
 
-*  uniform : User defined variables that are passed by the main program to the vertex and fragment shader, these variables are global for a given execution of a shader.
-*  attribute : Per-vertex variables passed by the engine to the shader, like position, normal, etc (Mesh data in the graphic)
-*  varying : Variables passed from the vertex shader to the fragment shader.
+*  uniform: User defined variables that are passed by the main program to the vertex and fragment shader, these variables are global for a given execution of a shader.
+*  attribute: Per-vertex variables passed by the engine to the shader, like position, normal, etc (Mesh data in the graphic)
+*  varying: Variables passed from the vertex shader to the fragment shader.
 
-There is a large panel of variable types to be used, for more information about it I recommend reading the GLSL specification link:http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf[here].+
-+
+There is a large panel of variable types to be used, for more information about it I recommend reading the GLSL specification link:http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf[here]. 
 
 
 === Spaces and Matrices
 
-To understand the coming example you must know about the different spaces in 3D computer graphics, and the matrices used to translate coordinate from one space to another.+
-image:jme3/advanced/jme3andshaders-1.png[jme3andshaders-1.png,with="",height=""]+
-The engine passes the object space coordinates to the vertex shader. We need to compute its position in projection space. To do that we transform the object space position by the WorldViewProjectionMatrix which is a combination of the World, View, Projection matrices (who would have guessed?).+
-+
+To understand the coming example you must know about the different spaces in 3D computer graphics, and the matrices used to translate coordinate from one space to another. 
+
+image:jme3/advanced/jme3andshaders-1.png[jme3andshaders-1.png,width="",height="", align="left"]
 
+The engine passes the object space coordinates to the vertex shader. We need to compute its position in projection space. To do that we transform the object space position by the WorldViewProjectionMatrix, which is a combination of the World, View, Projection matrices (who would have guessed?).
 
-=== Simple example : rendering a solid color on an object
 
-Here is the simplest application to shaders, rendering a solid color.+
-Vertex Shader : +
+=== Simple example: rendering a solid color on an object
+
+Here is the simplest application to shaders, rendering a solid color. 
+
+Vertex Shader: 
 
 [source,java]
 ----
@@ -74,7 +78,7 @@ void main(){
 
 ----
 
-Fragment Shader : +
+Fragment Shader : 
 
 [source,java]
 ----
@@ -88,16 +92,16 @@ void main(){
 
 ----
 
-For example applying this shader to a sphere would render a solid blue sphere on screen.+
-+
+For example applying this shader to a sphere would render a solid blue sphere on screen.
 
 
 == How to use shaders in JME3
 
-You probably heard that JME3 is “shader oriented”, but what does that mean?+
-Usually to use shaders you must create what is called a program. This program specify the vertex shader and the fragment shader to use.+
-JME3 encloses this in the material system. Every material in JME3 uses shaders.+
-For example let’s have a look at the SolidColor.j3md file : +
+
+You probably heard that JME3 is "`shader oriented`", but what does that mean? + 
+Usually, to use shaders you must create a program. This program specifies the vertex shader and the fragment shader to use. JME3 encloses this in the material system. Every material in JME3 uses shaders. 
+
+For example let’s have a look at the SolidColor.j3md file : 
 
 [source,java]
 ----
@@ -125,51 +129,58 @@ MaterialDef Solid Color {
 
 ----
 
-For more information on JME3 material system, i suggest you read this link:http://jmonkeyengine.org/groups/development-discussion-jme3/forum/topic/jmonkeyengine3-material-system-full-explanation[topic].+
-+
+For more information on JME3 material system, I suggest you read link:https://hub.jmonkeyengine.org/t/jmonkeyengine3-material-system-full-explanation/12947[jMonkeyEngine3 material system - full explanation].
 
 
 === JME3 Global uniforms
 
-JME3 can expose pre-computed global uniforms to your shaders. You must specify the one that are required for your shader in the WorldParameters section of the material definition file (.j3md).+
-Note that in the shader the uniform names will be prefixed by a “g_”.+
-In the example above, WorldViewProjectionMatrix is declared as uniform mat4 g_WorldViewProjectionMatrix in the shader.+
-The complete list of global uniforms that can be used in JME3 can be found link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/shader/UniformBinding.java[here].+
-+
+JME3 can expose pre-computed global uniforms to your shaders. You must specify the ones that are required for your shader in the WorldParameter's section of the material definition file (.j3md).
 
+[NOTE]
+====
+In the shader, the uniform names will be prefixed by a “g_”.
+====
 
-=== JME3 Lighting Global uniforms
+In the example above, WorldViewProjectionMatrix is declared as uniform mat4 g_WorldViewProjectionMatrix in the shader.
+
+The complete list of global uniforms that can be used in JME3 can be found in link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/shader/UniformBinding.java[UniformBinding.java].
 
-JME3 uses some global uniforms for lighting :
 
-*  g_LightDirection (vec4) : the direction of the light
-**  use for SpotLight : x,y,z contain the world direction vector of the light, the w component contains the spotlight angle cosine 
+=== JME3 Lighting Global uniforms
 
-*  g_LightColor (vec4) : the color of the light
-*  g_LightPosition : the position of the light
-**  use for SpotLight : x,y,z contain the world position of the light, the w component contains 1/lightRange
-**  use for PointLight : x,y,z contain the world position of the light, the w component contains 1/lightRadius
-**  use for DirectionalLight : strangely enough it's used for the direction of the light…this might change though. The fourth component contains -1 and it's used in the lighting shader to know if it's a directionalLight or not.
+JME3 uses some global uniforms for lighting:
 
-*  g_AmbientLightColor the color of the ambient light.
+*  g_LightDirection (vec4): the direction of the light
+**  use for SpotLight: x,y,z contain the world direction vector of the light, the w component contains the spotlight angle cosine
+*  g_LightColor (vec4): the color of the light
+*  g_LightPosition: the position of the light
+**  use for SpotLight: x,y,z contain the world position of the light, the w component contains 1/lightRange
+**  use for PointLight: x,y,z contain the world position of the light, the w component contains 1/lightRadius
+**  use for DirectionalLight: strangely enough it's used for the direction of the light…this might change though. The fourth component contains -1 and it's used in the lighting shader to know if it's a directionalLight or not.
+*  g_AmbientLightColor: the color of the ambient light.
 
 These uniforms are passed to the shader without having to declare them in the j3md file, but you have to specify in the technique definition “ LightMode MultiPass see lighting.j3md for more information.
-+
 
 
 === JME3 attributes
 
-Those are different attributes that are always passed to your shader.+
-You can find a complete list of those attribute in the Type enum of the VertexBuffer link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/VertexBuffer.java[here].+
-Note that in the shader the attributes names will be prefixed by an “in”.+
-+
+Those are different attributes that are always passed to your shader. 
+
+You can find a complete list of those attribute in the Type enum of the VertexBuffer in link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java[VertexBuffer.java]. 
+
+[NOTE] 
+====
+In the shader the attributes names will be prefixed by an “in”.
+====
+
 When the enumeration lists some usual types for each attribute (for example texCoord specifies two floats) then that is the format expected by all standard JME3 shaders that use that attribute. When writing your own shaders though you can use alternative formats such as placing three floats in texCoord simply by declaring the attribute as vec3 in the shader and passing 3 as the component count into the mesh setBuffer call.
 
 
 === User's uniforms
 
-At some point when making your own shader you'll need to pass your own uniforms+
-Any uniform has to be declared in the material definition file (.j3md) in the “MaterialParameters section.+
+At some point when making your own shader you'll need to pass your own uniforms.
+
+Any uniform has to be declared in the material definition file (.j3md) in the “MaterialParameters section.
 
 [source,java]
 ----
@@ -181,8 +192,9 @@ Any uniform has to be declared in the material definition file (.j3md) in the 
 
 ----
 
-You can also pass some define to your vertex/fragment programs to know if an uniform as been declared. +
-You simply add it in the Defines section of your Technique in the definition file. +
+You can also pass some define to your vertex/fragment programs to know if an uniform as been declared. 
+
+You simply add it in the Defines section of your Technique in the definition file.
 
 [source,java]
 ----
@@ -193,12 +205,14 @@ You simply add it in the Defines section of your Technique in the definition fil
 
 ----
 
-For integer and floating point parameters, the define will contain the value that was set.+
-For all other types of parameters, the value 1 is defined.+
-If no value is set for that parameter, the define is not declared in the shader.+
+For integer and floating point parameters, the define will contain the value that was set. 
+
+For all other types of parameters, the value 1 is defined. 
 
-Those material parameters will be sent from the engine to the shader as follows, 
-there are setXXXX methods for any type of uniform you want to pass.+
+If no value is set for that parameter, the define is not declared in the shader.
+
+Those material parameters will be sent from the engine to the shader as follows,
+there are setXXXX methods for any type of uniform you want to pass.
 
 [source,java]
 ----
@@ -209,8 +223,7 @@ there are setXXXX methods for any type of uniform you want to pass.+
 ----
 
 To use this uniform in the shader, you need to declare it in the .frag or .vert files (depending on where you need it).
-You can make use of the defines here and later in the code:
-*Note that the “m_ prefix specifies that the uniform is a material parameter.*+
+You can make use of the defines here and later in the code: *Note that the “m_ prefix specifies that the uniform is a material parameter.*
 
 [source,java]
 ----
@@ -227,14 +240,14 @@ The uniforms will be populated at runtime with the value you sent.
 
 === Example: Adding Color Keying to the Lighting.j3md Material Definition
 
-Color Keying is useful in games involving many players. It consists of adding some +
-player-specific color on models textures. +
-The easiest way of doing this is to use a keyMap which will contain the amount of +
-color to add in its alpha channel. +
-Here I will use this color map: link:http://wstaw.org/m/2011/10/24/plasma-desktopxB2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopxB2787.jpg] +
-to blend color on this texture: link:http://wstaw.org/m/2011/10/24/plasma-desktopbq2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopbq2787.jpg] +
-+
-We need to pass 2 new parameters to the Lighting.j3md definition, MaterialParameters section :
+Color Keying is useful in games involving many players. It consists of adding some player-specific color on models textures. The easiest way of doing this is to use a keyMap which will contain the amount of color to add in its alpha channel. 
+
+Here I will use this color map: +
+link:http://wstaw.org/m/2011/10/24/plasma-desktopxB2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopxB2787.jpg] +
+to blend color on this texture: +
+link:http://wstaw.org/m/2011/10/24/plasma-desktopbq2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopbq2787.jpg] 
+
+We need to pass 2 new parameters to the Lighting.j3md definition, MaterialParameters section:
 
 [source,java]
 ----
@@ -242,7 +255,7 @@ We need to pass 2 new parameters to the Lighting.j3md definition, MaterialParame
 // Keying Map
 Texture2D KeyMap
 
-// Key Color 
+// Key Color
 Color KeyColor
 
 ----
@@ -281,9 +294,8 @@ if we need to blend it:
 
 ----
 
-This way, a transparent pixel in the KeyMap texture doesn't modify the color. +
-A black pixel replaces it for the m_KeyColor and values in between are blended.+
-+
+This way, a transparent pixel in the KeyMap texture doesn't modify the color. A black pixel replaces it for the m_KeyColor and values in between are blended. 
+
 A result preview can be seen here: link:http://wstaw.org/m/2011/10/24/plasma-desktopuV2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopuV2787.jpg]
 
 
@@ -307,40 +319,42 @@ A result preview can be seen here: link:http://wstaw.org/m/2011/10/24/plasma-des
 
 ----
 
-+
 
 
 === JME3 and OpenGL 3 & 4 compatibility
 
-GLSL 1.0 to 1.2 comes with built in attributes and uniforms (ie, gl_Vertex, gl_ModelViewMatrix, etc…).+Those attributes are deprecated since GLSL 1.3 (opengl 3), hence JME3 global uniforms and attributes. Here is a list of deprecated attributes and their equivalent in JME3+
+GLSL 1.0 to 1.2 comes with built in attributes and uniforms (ie, gl_Vertex, gl_ModelViewMatrix, etc…). Those attributes are deprecated since GLSL 1.3 (opengl 3), hence JME3 global uniforms and attributes. 
+
+Here is a list of deprecated attributes and their equivalent in JME3.
+
 [cols="2", options="header"]
 |===
 
 a|GLSL 1.2 attributes
 a|JME3 equivalent
 
-<a|gl_Vertex	
+<a|gl_Vertex
 a|inPosition
 
-<a|gl_Normal	
+<a|gl_Normal
 a|inNormal
 
-<a|gl_Color	
+<a|gl_Color
 a|inColor
 
-<a|gl_MultiTexCoord0	
+<a|gl_MultiTexCoord0
 a|inTexCoord
 
-<a|gl_ModelViewMatrix	
+<a|gl_ModelViewMatrix
 a|g_WorldViewMatrix
 
-<a|gl_ProjectionMatrix	
+<a|gl_ProjectionMatrix
 a|g_ProjectionMatrix
 
-<a|gl_ModelViewProjectionMatrix	
+<a|gl_ModelViewProjectionMatrix
 a|g_WorldViewProjectionMatrix
 
-<a|gl_NormalMatrix	
+<a|gl_NormalMatrix
 a|g_NormalMatrix
 
 |===
@@ -348,4 +362,4 @@ a|g_NormalMatrix
 
 === Useful links
 
-link:http://www.eng.utah.edu/~cs5610/lectures/GLSL-ATI-Intro.pdf[http://www.eng.utah.edu/~cs5610/lectures/GLSL-ATI-Intro.pdf]
+link:http://www.eng.utah.edu/~cs5610/lectures/GLSL-ATI-Intro.pdf[http://www.eng.utah.edu/pass:[~]cs5610/lectures/GLSL-ATI-Intro.pdf]

+ 44 - 42
src/docs/asciidoc/jme3/advanced/jme3_srgbpipeline.adoc

@@ -1,6 +1,6 @@
 = Gamma Correction or sRGB pipline
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -13,43 +13,38 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Here is a quick overview of what lies under the “Gamma Correction term. +
 More in depth rundowns on the matter can be found here : link:http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html[http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html] and here link:http://www.arcsynthesis.org/gltut/Texturing/Tutorial%2016.html[http://www.arcsynthesis.org/gltut/Texturing/Tutorial%2016.html]
 
-We consider color values to be linear when computing lighting. What does that means? That means that we assume that the color 0.5,0.5,0.5 is half way between black and white.+
-The problem is that it’s not the case, or at least not when you look at the color through a monitor.+
-CRT monitors had physical limitations that prevented them to have a linear way of representing colors. that means that 0.5,0.5,0.5 through a monitor is not half way between black and white (it’s darker). Note that black and white remains the same though.+
-+
-If we do not take that into account, the rendered images are overly darken and feels dull.+
-+
-LCD monitors still mimic this physical limitation (I guess for backward compatibility).+
-+
-*Output correct colors*+
-Gamma Correction is the technique that tends to correct the issue. Gamma is an power factor applied to the color by the monitor when lighting a pixel on screen (or at least a simplification of the function applied). So when we output the color, we have to apply the inverse power of this factor to nullify the effect : finalColor = pow(computedColor, 1/gamma);+
-
-*Knowing what colors we have as input*+
+We consider color values to be linear when computing lighting. What does that means? That means that we assume that the color 0.5,0.5,0.5 is half way between black and white. +
+The problem is that it’s not the case, or at least not when you look at the color through a monitor. +
+CRT monitors had physical limitations that prevented them to have a linear way of representing colors. that means that 0.5,0.5,0.5 through a monitor is not half way between black and white (it’s darker). Note that black and white remains the same though. +
+If we do not take that into account, the rendered images are overly darken and feels dull. +
+LCD monitors still mimic this physical limitation (I guess for backward compatibility). +
+*Output correct colors* +
+Gamma Correction is the technique that tends to correct the issue. Gamma is an power factor applied to the color by the monitor when lighting a pixel on screen (or at least a simplification of the function applied). So when we output the color, we have to apply the inverse power of this factor to nullify the effect : finalColor = pow(computedColor, 1/gamma); +
+
+*Knowing what colors we have as input* +
 The other aspect of gamma correction is the colors we get as input in the rendering process that are stored in textures or in ColorRGBA material params. Almost all image editors are storing color data in images already gamma corrected (so that colors are correct when you display the picture in a viewer of in a browser). Also most hand picked colors (in a color picker) can be assumed as gamma corrected as you most probably chose this color through a monitor display.
 Such images or color are said to be in sRGB color space, meaning “standard RGB” (which is not the standard one would guess).
 That means that textures and colors that we use as input in our shaders are not in a linear space. The issue is that we need them in linear space when we compute the lighting, else the lighting is wrong.
 To avoid this we need to apply some gamma correction to the colors : (pow(color, gamma);
 This only apply to textures that will render colors on screen (basically diffuse map, specular, light maps). Normal maps, height maps don’t need the correction.
 
-this is the kind of difference you can have :+
-left is non corrected output, right is gamma corrected output.+
-image:http://i.imgur.com/uNL7vw8.png[uNL7vw8.png,with="",height=""]
-+
+This is the kind of difference you can have : +
+left is non corrected output, right is gamma corrected output. +
+image:http://i.imgur.com/uNL7vw8.png[uNL7vw8.png,width="",height=""]
+
 
 
 === Implementation
 
 *  To handle proper gamma corrected ouput colors, Opengl expose an ARB extension that allows you to output a color in linear space and have the GPU automatically correct it : link:https://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt[https://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt]
-
-*  To handle the input, instead of classic RGBA8 image format, one can use SRGB8_ALPHA8_EXT which is basically RGBA in sRGB. Using this you specify the GPU that the texture is in sRGB space and when fetching  a color from it, the GPU will linearize the color value for you (for free). There are sRGB equivalent to all 8 bits formats (even compressed format like DXT).+
-
+*  To handle the input, instead of classic RGBA8 image format, one can use SRGB8_ALPHA8_EXT which is basically RGBA in sRGB. Using this you specify the GPU that the texture is in sRGB space and when fetching  a color from it, the GPU will linearize the color value for you (for free). There are sRGB equivalent to all 8 bits formats (even compressed format like DXT).
 *  But all textures don't need this. For example, normal maps, height maps colors are most probably generated and not hand picked by an artist looking through a monitor. The implementation needs to account for it and expose a way to exclude some textures from the sRGB pipeline.
 
 Gamma Correction in jME 3.0 is based on those three statements.
 
 [IMPORTANT]
 ====
-Note that Gamma Correction is only available on desktop with LWJGL or JOGL renderer. They are not yet supported on Android or iOS renderers
+Note that Gamma Correction is only available on desktop with LWJGL or JOGL renderer. They are not yet supported on Android or iOS renderers.
 ====
 
 
@@ -57,7 +52,7 @@ Note that Gamma Correction is only available on desktop with LWJGL or JOGL rende
 ==== Turning Gamma Correction on/off
 
 You can turn Gamma Correction on and off using the AppSettings. There is a method setGammaCorrection(boolean) that changes the setting.
-use this in the main() method of your application : 
+use this in the main() method of your application :
 
 [source,java]
 ----
@@ -68,13 +63,14 @@ app.setSettings(settings);
 
 ----
 
-This setting is also exposed in the Settings dialog displayed when you launch a jME application.+
-image:http://i.imgur.com/Lya1ldH.png[Lya1ldH.png,with="400",height=""]
+This setting is also exposed in the Settings dialog displayed when you launch a jME application. +
+image:http://i.imgur.com/Lya1ldH.png[Lya1ldH.png,width="400",height=""]
 
 
 [IMPORTANT]
 ====
-This is a short hand to enable both linearization of input textures and Gamma correction of the rendered output on screen.* But both can be enabled separately*.
+This is a short hand to enable both linearization of input textures and Gamma correction of the rendered output on screen. +
+*Both can be enabled separately*.
 
 ====
 
@@ -82,7 +78,7 @@ This is a short hand to enable both linearization of input textures and Gamma co
 
 ===== Enabling output Gamma Correction
 
-You can enable or disable the Gamma correction of the rendered output by using 
+You can enable or disable the Gamma correction of the rendered output by using:
 
 [source,java]
 ----
@@ -92,9 +88,13 @@ renderer.setMainFrameBufferSrgb(boolean srgb)
 This will be ignored if the hardware doesn't have the GL_ARB_framebuffer_sRGB or the GL_EXT_texture_sRGB.
 This can be toggled at run time.
 
-This uses Opengl hardware gamma correction that uses an approximated Gamma value of 2.2 and uses the following formula : color = pow(color,1/gamma)+
-Not that this will not yield exact results, as the real gamma can vary depending on the monitor. +
+This uses Opengl hardware gamma correction that uses an approximated Gamma value of 2.2 and uses the following formula : color = pow(color,1/gamma) 
+
+[NOTE]
+====
+This will not yield exact results, as the real gamma can vary depending on the monitor. +
 If this is a problem, please refer to the “handling gamma correction in a post process section.
+====
 
 
 ===== Enabling texture linearization
@@ -115,22 +115,22 @@ Toggling this setting at runtime will produce unexpected behavior for now. A cha
 
 
 All images marked as in sRGB color space will be uploaded to the GPU using a sRGB image format.
-Opengl hardware texture linearization also uses an approximated Gamma value of 2.2 and linearize the fetched texel color using the following formula : color = pow(color, gamma)+
+Opengl hardware texture linearization also uses an approximated Gamma value of 2.2 and linearize the fetched texel color using the following formula : color = pow(color, gamma) +
 As with output gamma correction this will not give exact result, but the error is less important since most image editor uses the same approximation to correct images and save them in sRGB color space.
 
 Not all image format have their sRGB equivalent, and only 8bit formats.
 Here is an exhaustive list of the supported format and there equivalent :
 
-*  RGB8 : GL_SRGB8           
+*  RGB8 : GL_SRGB8
 *  RGBA8 : GL_SRGB8_ALPHA8
-*  BGR8 : GL_SRGB8  
+*  BGR8 : GL_SRGB8
 *  ABGR8 : GL_SRGB8_ALPHA8
 *  Luminance8 : GL_SLUMINANCE8
 *  Luminance8Alpha8 : GL_SLUMINANCE8_ALPHA8
 *  DXT1 : GL_COMPRESSED_SRGB_S3TC_DXT1
 *  DXT1A : GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1
 *  DXT3 : GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3
-*  DXT5 : GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5  
+*  DXT5 : GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5
 
 
 [IMPORTANT]
@@ -145,16 +145,15 @@ Conventionally only the rgb channels are gamma corrected, as the alpha channel d
 
 [IMPORTANT]
 ====
-Only loaded images will be marked as in sRGB color space, when using assetManager.loadTexture or loadAsset.+
-The color space of an image created by code will have to be specified in the constructor or will be assumed as Linear if not specified. 
+Only loaded images will be marked as in sRGB color space, when using assetManager.loadTexture or loadAsset. +
+The color space of an image created by code will have to be specified in the constructor or will be assumed as Linear if not specified.
 ====
 
 
-Not all images need to be linearized. Some images don't represent color information that will be displayed on screen, but more different sort of data packed in a texture.+
+Not all images need to be linearized. Some images don't represent color information that will be displayed on screen, but more different sort of data packed in a texture. +
 The best example is a Normal map that will contains normal vectors for each pixel. Height maps will contain elevation values. These textures must not be linearized.
 
-There is no way to determine the real color space of an image when loading it, so we must deduce the color space from the usage it's loaded for.
-The usage is dictated by the material, those textures are used for, and by the material parameter they are assigned to.
+There is no way to determine the real color space of an image when loading it, so we must deduce the color space from the usage it's loaded for. The usage is dictated by the material, those textures are used for, and by the material parameter they are assigned to.
 One can now specify in a material definition file (j3md) if a texture parameter must be assumed as in linear color space, and thus, must not be linearized, by using the keyword -LINEAR next to the parameter (case does not matter).
 
 For example here is how the NormalMap parameter is declared in the lighting material definition.
@@ -167,8 +166,7 @@ For example here is how the NormalMap parameter is declared in the lighting mate
 
 ----
 
-When a texture is assigned to this material param by using material.setTexture(“NormalMap, myNormalTexture), the color space of this texture's image will be forced to linear. 
-So if you make your own material and want to use Gamma Correction, make sure you properly mark your textures as in the proper color space.
+When a texture is assigned to this material param by using material.setTexture(“NormalMap, myNormalTexture), the color space of this texture's image will be forced to linear. So if you make your own material and want to use Gamma Correction, make sure you properly mark your textures as in the proper color space.
 
 This can sound complicated, but you just have to answer this question :  Does my image represent color data? if the answer is no, then you have to set the -Linear flag.
 
@@ -185,8 +183,12 @@ The r, g, b attributes of a ColorRGBA object are *ALWAYS* assumed in Linear colo
 
 If you want to set a color that you hand picked in a color picker, you should use the setAsSRGB method of ColorRGBA. This will convert the given values to linear color space by using the same formula as before : color = pow (color, gamma) where gamma = 2.2;
 
-If you want to retrieve those values from a ColorRGBA, you can call the getAsSRGB method. The values will be converted back to sRGB color Space.+
-Note that the return type of that method is a Vector4f and not a ColorRGBA, because as stated before, all ColorRGBA objects r,g,b attributes are assumed in Linear color space.
+If you want to retrieve those values from a ColorRGBA, you can call the getAsSRGB method. The values will be converted back to sRGB color Space.
+
+[NOTE]
+====
+The return type of that method is a Vector4f and not a ColorRGBA, because as stated before, all ColorRGBA objects r,g,b attributes are assumed in Linear color space.
+====
 
 
 ==== Handling rendered output Gamma Correction with a post process filter

+ 45 - 30
src/docs/asciidoc/jme3/advanced/level_of_detail.adoc

@@ -1,21 +1,23 @@
 = Level of Detail (LOD) Optimization
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
+:uri-jme3: https://github.com/jMonkeyEngine/jmonkeyengine/blob/master
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-A mesh with a high level of detail has lots of polygons and looks good close up. But when the mesh is further away (and the detail is not visible), the high-polygon count slows down performance unnecessarily. 
+A mesh with a high level of detail has lots of polygons and looks good close up. But when the mesh is further away (and the detail is not visible), the high-polygon count slows down performance unnecessarily.
 
 One solution for this problem is to use high-detail meshes for objects close to the camera, and low-detail meshes for objects far from the camera. As the player moves through the scene, you must keep replacing close objects by more detailed meshes, and far objects by less detailed meshes. The goal is to keep few high-quality slow-rendering objects in the foreground, and many low-quality fast-rendering objects in the background. (Experienced users can compare this approach to <<jme3/advanced/terrain#,JME's TerraMonkey terrain system>>, which internally uses the specialized GeoMipMapping algorithm to generate a terrain's Levels of Detail.)
 
-You see now why you may want to be able to generate Levels of Detail for complex Geometries automatically. JME3 supports a Java implementation of the Ogre engine's LOD generator (originally by Péter Szücs and Stan Melax): You use link:https://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/tools/jme3tools/optimize/LodGenerator.java[jme3tools.optimize.LodGenerator] in conjunction with link:https://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/control/LodControl.java[com.jme3.scene.control.LodControl]. 
+You see now why you may want to be able to generate Levels of Detail for complex Geometries automatically. JME3 supports a Java implementation of the Ogre engine's LOD generator (originally by Péter Szücs and Stan Melax): You use link:{uri-jme3}/jme3-core/src/tools/java/jme3tools/optimize/LodGenerator.java[jme3tools.optimize.LodGenerator] in conjunction with link:{uri-jme3}/jme3-core/src/main/java/com/jme3/scene/control/LodControl.java[com.jme3.scene.control.LodControl].
 
-For a demo, run link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/stress/TestLodGeneration.java[TestLodGeneration.java] from <<sdk/sample_code#,JmeTests>>, then press +/- and spacebar to experiment. The following screenshots show a monkey model with three reduced Levels of Detail: 
+For a demo, run link:{uri-jme3}/jme3-examples/src/main/java/jme3test/stress/TestLodGeneration.java[TestLodGeneration.java] from <<sdk/sample_code#,JmeTests>>, then press +/- and spacebar to experiment. The following screenshots show a monkey model with three reduced Levels of Detail:
 
-image::jme3/advanced/jmonkey-lod.gif[jmonkey-lod.gif,with="",height="",align="center"]
+image::jme3/advanced/jmonkey-lod.gif[jmonkey-lod.gif,width="",height="",align="center"]
 
 
 
@@ -31,7 +33,7 @@ To activate this optimization:
 == Pick Reduction Methods and Values
 
 There are several reduction methods to generate a low-polygon version from a high-polygon model. Don't worry, the reduction does not modify the original model.
-[cols="3", options="header"]
+[cols="35,55,10", options="header"]
 |===
 
 a|Reduction Method
@@ -44,11 +46,11 @@ a|0.0f - 1.0f
 
 a|LodGenerator.TriangleReductionMethod.PROPORTIONAL
 a|Removes the given percentage of polygons from the mesh.
-a| 0.0f - 1.0f 
+a| 0.0f - 1.0f
 
 a|LodGenerator.TriangleReductionMethod.CONSTANT
 a|Removes the given number of polygons from the mesh.
-a| integer 
+a| integer
 
 |===
 
@@ -59,7 +61,7 @@ If you don't know which to choose, experiment. For example start by trying COLLA
 
 You must generate and cache several LODs for each mesh, ranging from many to few polygons. The LOD generator algorithm attempts to collaps vertices automatically, while avoiding ugly artifacts. The LOD generator doesn't generate new meshes, it only creates separate reduced index buffers for the more highly reduced levels.
 
-*  If you create geometries manually (3D models), use the SDK to generate LODs. 
+*  If you create geometries manually (3D models), use the SDK to generate LODs.
 *  If you create geometries programmatically, generate LODs from your Java code.
 
 
@@ -68,30 +70,38 @@ You must generate and cache several LODs for each mesh, ranging from many to few
 The SDK contains a user-friendly interface to generate LODs for a model (.j3o file).
 
 .  Open the Projects or Files window.
-.  Select the .j3o file in the Project Assets &gt; Models directory.
-.  Choose Window&gt;SceneExplorer if the SceneExplorer is not open. Info about the selected model is now displayed in the SceneExplorer.
-.  Right-click the model in SceneExplorer. Choose the “Tools &gt; Generate Levels of Detail menu. +image:jme3/advanced/jme-sdk-generate-lod-menu.png[The &quot;Tools&gt;Generate LOD&quot; context menu in the SceneExplorer,with="300",height="180"]
-.  The “Generate LOD settings wizard opens: + image:jme3/advanced/jme-sdk-generate-lod-window.png[The &quot;Generate LOD&quot; settings wizard,with="300",height="150"]
-.  Choose a reduction method and reduction values for one or more levels. +Tip: Enter higher reduction values for higher levels. 
-.  Click Finish to generate the LODs for this model.
+.  Select the .j3o file in the `Project Assets/Models` directory.
+.  Choose `menu:Window[Edit in SceneExplorer]` if the SceneExplorer is not open. Info about the selected model is now displayed in the SceneExplorer.
+.  btn:[RMB] select the model in SceneExplorer. Choose the `menu:Tools[Generate Levels of Detail]` menu. +
+image:jme3/advanced/jme-sdk-generate-lod-menu.png[The Tools Generate LOD context menu in the SceneExplorer,width="300",height="180"]
+.  The `Generate LOD` settings wizard opens: +
+image:jme3/advanced/jme-sdk-generate-lod-window.png[The Generate LOD settings wizard,width="300",height="150"]
+.  Choose a reduction method and reduction values for one or more levels. 
++
+[TIP]
+====
+Enter higher reduction values for higher levels.
+====
+
+.  Click btn:[Finish] to generate the LODs for this model.
 
 The LODs are saved in the .j3o model file.
 
 
 [TIP]
 ====
-Choose Window>Properties if the Properties window is not open. Choose the generated LODs from the dropdown in the Properties window, and verify their quality in the SceneComposer.
+Choose `menu:Window[Properties]` if the Properties window is not open. Choose the generated LODs from the dropdown in the Properties window, and verify their quality in the SceneComposer.
 ====
 
 
 
-image::jme3/advanced/jme-sdk-generate-lod-full.png[jme-sdk-generate-lod-full.png,with="",height="",align="center"]
+image::jme3/advanced/jme-sdk-generate-lod-full.png[jme-sdk-generate-lod-full.png,width="",height="",align="center"]
 
 
 
 === Generating LODs in Code
 
-The `jme3tools.optimize.LodGenerator` utility class helps you generate LODs for an arbitrary mesh (a Geometry object) programmatically from your Java code. You create and bake one LodGenerator for each Geometry. 
+The `jme3tools.optimize.LodGenerator` utility class helps you generate LODs for an arbitrary mesh (a Geometry object) programmatically from your Java code. You create and bake one LodGenerator for each Geometry.
 
 [source,java]
 ----
@@ -99,7 +109,7 @@ LodGenerator lod = new LodGenerator(geometry);
 lod.bakeLods(reductionMethod,reductionValue);
 ----
 
-The LODs are stored inside the Geometry object. 
+The LODs are stored inside the Geometry object.
 
 *Example:* How to generate an LOD of myPrettyGeo's mesh with 50% fewer polygons:
 
@@ -112,7 +122,7 @@ lod.bakeLods(LodGenerator.TriangleReductionMethod.PROPORTIONAL,0.5f);
 
 == Activate the LOD Control
 
-After generating the LODs for the geometry, you create and add a `com.jme3.scene.control.LodControl` to the geometry. Adding the LodControl activates the LOD optimizaton for this geometry. 
+After generating the LODs for the geometry, you create and add a `com.jme3.scene.control.LodControl` to the geometry. Adding the LodControl activates the LOD optimizaton for this geometry.
 
 [source,java]
 ----
@@ -121,11 +131,11 @@ myPrettyGeo.addControl(lc);
 rootNode.attachChild(myPrettyGeo);
 ----
 
-The LodControl internally gets the camera from the game's viewport to calculate the distance to this geometry. Depending on the distance, the LodControl selects an appropriate level of detail, and passes more (or less) detailed vertex data to the renderer. 
+The LodControl internally gets the camera from the game's viewport to calculate the distance to this geometry. Depending on the distance, the LodControl selects an appropriate level of detail, and passes more (or less) detailed vertex data to the renderer.
 
 
 == Impact on Quality and Speed
-[cols="5", options="header"]
+[cols="10,30,20,20,20", options="header"]
 |===
 
 a|Level number
@@ -134,25 +144,30 @@ a|Distance
 a|Rendering Speed
 a|Rendering Quality
 
-a|Level 0
+a|Level 0
 a|The original mesh is used automatically for close-ups, and it's the default if no LODs have been generated.
 a|Closest
 a|Slowest.
 a|Best.
 
-a|“Level 1 +“Level 2 +“Level 3 +…
+a|Level 1 +
+Level 2 +
+Level 3
 a|If you generated LODs, JME3 uses them automatically as soon as the object moves into the background.
-a|The higher the level, +the further away.
-a|The higher the level, +the faster.
-a|The higher the level, +the lower the quality.
+a|The higher the level, +
+the further away.
+a|The higher the level, +
+the faster.
+a|The higher the level, +
+the lower the quality.
 
 |===
 
 
 == See also
 
-*  link:http://hub.jmonkeyengine.org/forum/topic/brand-new-lod-generator/[http://hub.jmonkeyengine.org/forum/topic/brand-new-lod-generator/]
+*  link:https://hub.jmonkeyengine.org/t/brand-new-lod-generator/26341[https://hub.jmonkeyengine.org/t/brand-new-lod-generator/26341]
 *  link:https://github.com/worldforge/ember/tree/master/src/components/ogre/lod[https://github.com/worldforge/ember/tree/master/src/components/ogre/lod]
 *  link:http://www.melax.com/polychop[http://www.melax.com/polychop]
-*  link:http://sajty.elementfx.com/progressivemesh/GSoC2012.pdf[http://sajty.elementfx.com/progressivemesh/GSoC2012.pdf] 
+*  link:http://sajty.elementfx.com/progressivemesh/GSoC2012.pdf[http://sajty.elementfx.com/progressivemesh/GSoC2012.pdf]
 *  <<jme3/advanced/terrain#,JME3 TerraMonkey Terrain>>

+ 16 - 14
src/docs/asciidoc/jme3/advanced/light_and_shadow.adoc

@@ -7,7 +7,7 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-image:jme3/advanced/shading-ani.gif[Examples of shading and lighting.,with="",height=""]
+image:jme3/advanced/shading-ani.gif[Examples of shading and lighting.,width="",height=""]
 
 Light and Shadow are two separate things in 3D engines, although we percieve them together in real life:
 
@@ -25,7 +25,7 @@ A light source with a direction or location is required for all Geometries with
 == Light Sources and Colors
 
 
-image::jme3/advanced/light-sources.png[A lit scene with multiple light sources,with="300",height="200",align="right"]
+image::jme3/advanced/light-sources.png[A lit scene with multiple light sources,width="300",height="200",align="right"]
 
 
 You can add several types of light sources to a scene using `rootNode.addLight(mylight)`. 
@@ -47,7 +47,7 @@ You can get a list of all lights added to a Spatial by calling `getWorldLightLis
 === PointLight
 
 
-image::jme3/advanced/elephant-pointlights.png[An elephant model illuminated by pointlights,with="300",height="205",align="right"]
+image::jme3/advanced/elephant-pointlights.png[An elephant model illuminated by pointlights,width="300",height="205",align="right"]
 
 
 A PointLight has a location and shines from there in all directions as far as its radius reaches. The light intensity decreases with increased distance from the light source. A PointLight can be used to cast shadows along with a PointLightShadowRenderer (see the Casting Shadows section)
@@ -67,7 +67,7 @@ rootNode.addLight(lamp_light);
 === DirectionalLight
 
 
-image::jme3/advanced/house-directionallight.png[A house model illuminated with a sun-like directional light,with="300",height="210",align="right"]
+image::jme3/advanced/house-directionallight.png[A house model illuminated with a sun-like directional light,width="300",height="210",align="right"]
 
 
 A DirectionalLight has no position, only a direction. It sends out parallel beams of light and is considered “infinitely far away. You typically have one directional light per scene. A DirectionalLight can be used together with shadows. 
@@ -86,7 +86,7 @@ rootNode.addLight(sun);
 === SpotLight
 
 
-image::jme3/advanced/spotlight.png[Spotlight,with="",height="",align="right"]
+image::jme3/advanced/spotlight.png[Spotlight,width="",height="",align="right"]
 
 
 A SpotLight sends out a distinct beam or cone of light. A SpotLight has a direction, a position, distance (range) and two angles. The inner angle is the central maximum of the light cone, the outer angle the edge of the light cone. Everything outside the light cone's angles is not affected by the light.
@@ -124,7 +124,8 @@ rootNode.addLight(al);
 
 [TIP]
 ====
-You can increase the brightness of a light source gradually by multiplying the light color to values greater than 1.0f. +Example: `mylight.setColor(ColorRGBA.White.mult(1.3f));`
+You can increase the brightness of a light source gradually by multiplying the light color to values greater than 1.0f. +
+Example: `mylight.setColor(ColorRGBA.White.mult(1.3f));`
 ====
 
 
@@ -150,7 +151,7 @@ Obviously, this does not apply to AmbientLights, which have no position.
 
 Full code sample
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestShadow.java[TestShadow.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/light/TestShadow.java[TestShadow.java]
 
 
 == Casting Shadows
@@ -159,6 +160,7 @@ For each type of non-ambient light source, JME3 implements two ways to simulate
 
 *  a shadow renderer (which you apply to a viewport) and
 *  a shadow filter (which you can add to a viewport's filter post-processor).
+
 [cols="3", options="header"]
 |===
 
@@ -204,7 +206,7 @@ Both shadow renderers and shadow filters use shadow modes to determine which obj
 
 Here's a sample application which demonstrates both DirectionalLightShadowRenderer and DirectionalLightShadowFilter:
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestDirectionalLightShadow.java[TestDirectionalLightShadow.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/light/TestDirectionalLightShadow.java[TestDirectionalLightShadow.java]
 
 Here is the key code fragment:
 
@@ -247,10 +249,10 @@ Properties you can set:
 
 Full sample code
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestPssmShadow.java[TestPssmShadow.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/light/TestPssmShadow.java[TestPssmShadow.java]
 
 
-image::jme3/advanced/shadow.png[A lit scene with PSSM drop shadows,with="300",height="200",align="right"]
+image::jme3/advanced/shadow.png[A lit scene with PSSM drop shadows,width="300",height="200",align="right"]
 
 
 [source,java]
@@ -270,9 +272,9 @@ public void simpleInitApp() {
 
 Full sample code
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestSSAO.java[jme3/src/test/jme3test/post/TestSSAO.java] – Screen-Space Ambient Occlusion shadows
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestTransparentSSAO.java[jme3/src/test/jme3test/post/TestTransparentSSAO.java] – Screen-Space Ambient Occlusion shadows plus transparancy
-*  link:http://hub.jmonkeyengine.org/2010/08/screen-space-ambient-occlusion-for-jmonkeyengine-3-0/[Screen Space Ambient Occlusion for jMonkeyEngine (article)]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/post/TestSSAO.java[TestSSAO.java] – Screen-Space Ambient Occlusion shadows
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/post/TestTransparentSSAO.java[TestTransparentSSAO.java] – Screen-Space Ambient Occlusion shadows plus transparancy
+*  link:https://hub.jmonkeyengine.org/t/ssao-for-monkeys/13369[Screen Space Ambient Occlusion for jMonkeyEngine (article)]
 
 Ambient Occlusion refers to the shadows which nearby objects cast on each other under an ambient lighting. Screen Space Ambient Occlusion (SSAO) approximates how light radiates in real life.
 
@@ -288,4 +290,4 @@ viewPort.addProcessor(fpp);
 
 ----
 
-image:jme3/advanced/shading-textured-ani.gif[Shading with and without Ambient Occlusion,with="",height=""]
+image:jme3/advanced/shading-textured-ani.gif[Shading with and without Ambient Occlusion,width="",height=""]

+ 21 - 21
src/docs/asciidoc/jme3/advanced/loading_screen.adoc

@@ -1,6 +1,6 @@
 = loading_screen
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -16,12 +16,12 @@ link:http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Create_your
 This example will use the existing hello terrain as an example.
 It will require these 2 images inside Assets/Interface/ (save them as border.png and inner.png respectively)
 
-image:jme3/advanced/inner1.png[inner1.png,with="",height=""]
-image:jme3/advanced/border1.png[border1.png,with="",height=""]
+image:jme3/advanced/inner1.png[inner1.png,width="",height=""]
+image:jme3/advanced/border1.png[border1.png,width="",height=""]
 
 This is the progress bar at 90%:
 
-image:jme3/advanced/loadingscreen.png[loadingscreen.png,with="",height=""]
+image:jme3/advanced/loadingscreen.png[loadingscreen.png,width="",height=""]
 
 nifty_loading.xml
 
@@ -32,15 +32,15 @@ nifty_loading.xml
 <nifty>
     <useStyles filename="nifty-default-styles.xml" />
     <useControls filename="nifty-default-controls.xml" />
-  
+
     <controlDefinition name = "loadingbar" controller = "jme3test.TestLoadingScreen">
-        <image filename="Interface/border.png" childLayout="absolute" 
+        <image filename="Interface/border.png" childLayout="absolute"
                imageMode="resize:15,2,15,15,15,2,15,2,15,2,15,15">
             <image id="progressbar" x="0" y="0" filename="Interface/inner.png" width="32px" height="100%"
                    imageMode="resize:15,2,15,15,15,2,15,2,15,2,15,15" />
         </image>
     </controlDefinition>
-    
+
     <screen id="start" controller = "jme3test.TestLoadingScreen">
         <layer id="layer" childLayout="center">
             <panel id = "panel2" height="30%" width="50%" align="center" valign="center" childLayout="vertical"
@@ -51,20 +51,20 @@ nifty_loading.xml
             </panel>
         </layer>
     </screen>
-    
+
     <screen id="loadlevel" controller = "jme3test.TestLoadingScreen">
         <layer id="loadinglayer" childLayout="center" backgroundColor="#000000">
             <panel id = "loadingpanel" childLayout="vertical" align="center" valign="center" height="32px" width="70%">
                 <control name="loadingbar" align="center" valign="center" width="100%" height="100%" />
-                <control id="loadingtext" name="label" align="center" 
+                <control id="loadingtext" name="label" align="center"
                          text="                                                  "/>
             </panel>
         </layer>
     </screen>
-    
+
     <screen id="end" controller = "jme3test.TestLoadingScreen">
     </screen>
-    
+
 </nifty>
 
 ----
@@ -79,7 +79,7 @@ A custom control is created, which represents the progress bar.
 ----
 
     <controlDefinition name = "loadingbar" controller = "jme3test.TestLoadingScreen">
-        <image filename="Interface/border.png" childLayout="absolute" 
+        <image filename="Interface/border.png" childLayout="absolute"
                imageMode="resize:15,2,15,15,15,2,15,2,15,2,15,15">
             <image id="progressbar" x="0" y="0" filename="Interface/inner.png" width="32px" height="100%"
                    imageMode="resize:15,2,15,15,15,2,15,2,15,2,15,15"/>
@@ -126,7 +126,7 @@ This screen displays our custom progress bar control with a text control
 
 == Creating the bindings to use the Nifty XML
 
-There are 3 main ways to update a progress bar. To understand why these methods are necessary, an understanding of the graphics pipeline is needed. 
+There are 3 main ways to update a progress bar. To understand why these methods are necessary, an understanding of the graphics pipeline is needed.
 
 Something like this in a single thread will not work:
 
@@ -220,7 +220,7 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
             if (frameCount == 1) {
                 Element element = nifty.getScreen("loadlevel").findElementByName("loadingtext");
                 textRenderer = element.getRenderer(TextRenderer.class);
-                
+
                 mat_terrain = new Material(assetManager, "Common/MatDefs/Terrain/Terrain.j3md");
                 mat_terrain.setTexture("Alpha", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));
                 setProgress(0.2f, "Loading grass");
@@ -290,7 +290,7 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
         int pixelWidth = (int) (MIN_WIDTH + (progressBarElement.getParent().getWidth() - MIN_WIDTH) * progress);
         progressBarElement.setConstraintWidth(new SizeValue(pixelWidth + "px"));
         progressBarElement.getParent().layoutElements();
-        
+
         textRenderer.setText(loadingText);
     }
 
@@ -416,9 +416,9 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
             }
             //check if the execution on the other thread is done
             if (loadFuture.isDone()) {
-                //these calls have to be done on the update loop thread, 
+                //these calls have to be done on the update loop thread,
                 //especially attaching the terrain to the rootNode
-                //after it is attached, it's managed by the update loop thread 
+                //after it is attached, it's managed by the update loop thread
                 // and may not be modified from any other thread anymore!
                 nifty.gotoScreen("end");
                 nifty.exit();
@@ -485,7 +485,7 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
             TerrainLodControl control = new TerrainLodControl(terrain, cameras);
             terrain.addControl(control);
             setProgress(1f, "Loading complete");
-            
+
             return null;
         }
     };
@@ -542,8 +542,8 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
 
     public void onFocus(boolean getFocus) {
     }
-    
-    
+
+
     @Override
     public void stop() {
         super.stop();

+ 32 - 11
src/docs/asciidoc/jme3/advanced/localization.adoc

@@ -15,26 +15,32 @@ Localizing an application can mean several things:
 *  At minimum you translate all messages and dialogs in the user interface to your target languages.
 *  You should also translate the “read me, help, and other documentation.
 *  Also translating web content related to the application makes sure international users find out about your localized game.
-*  If you go the whole way of internationalization, you also “translate metaphors in icons or symbols used. +E.g. For localizations to right-to-left languages, you must also adjust the whole flow of the UI (order of menus and buttons).
+*  If you go the whole way of internationalization, you also “translate metaphors in icons or symbols used. +
+E.g. For localizations to right-to-left languages, you must also adjust the whole flow of the UI (order of menus and buttons).
 
 There are tools that assist you with localizing Java Swing GUIs. jME3 applications do not typically have a Swing +++<abbr title="Graphical User Interface">GUI</abbr>+++, so those tools are not of much help. Just stick to the normal Java rules about using Bundle Properties:
 
 
 == Preparing the Localization
 
-*Tip:* The jMonkeyEngine SDK supports opening and editing Bundle.properties files. Also note the Tools &gt; Localization menu.
+[TIP]
+====
+The jMonkeyEngine SDK supports opening and editing Bundle.properties files. Also note the Tools &gt; Localization menu.
+====
 
 To prepare the application for localization, you have to first identify all hard-coded messages.
 
-.  Find every line in your jME3 game where you hard-coded message strings, e.g. +
+.  Find every line in your jME3 game where you hard-coded message strings, e.g. 
++
 [source,java]
 ----
 System.out.print("Hello World!");
-UiText.setText("Score: "+score);
+UiText.setText("Score: " + score);
 ----
 
 .  Create one file named `Bundle.properties` in each directory where there are Java file that contain messages.
-.  For every hard-coded message, you add one line to the `Bundle.properties` file: First specify a unique key that identifies this string; then an equal sign; and the literal string itself. +
+.  For every hard-coded message, you add one line to the `Bundle.properties` file: First specify a unique key that identifies this string; then an equal sign; and the literal string itself. 
++
 [source]
 ----
 greeting=Hello World!
@@ -42,10 +48,11 @@ score.display=Score:
 ----
 
 .  In the source code, replace every occurence of a hard-coded message with the appropriate Resource Bundle call to its unique key: 
++
 [source,java]
 ----
 System.out.print(ResourceBundle.getBundle("Bundle").getString("greeting"));
-UiText.setText(ResourceBundle.getBundle("Bundle").getString("score.display")+score);
+UiText.setText(ResourceBundle.getBundle("Bundle").getString("score.display") + score);
 ----
 
 
@@ -61,17 +68,24 @@ To translate the messages to another language, for example, German:
 .  Make a copy of the `Bundle.properties` files.
 .  Name the copy `Bundle_de.properties` for German. Note the added suffix _de.
 .  Translate all strings (text on the right side of the equal sign) in the `Bundle_de.properties` to German. 
++
 [source]
 ----
 greeting=Hallo Welt!
 score.display=Spielstand: 
 ----
-
- *Important:* Do not modify any of the keys (text to the left of the equal sign)!
++
+[IMPORTANT]
+====
+Do not modify any of the keys (text to the left of the equal sign)!
+====
 
 .  To test the German localization, start the application from the command line with `-Duser.language=de`. Note the parameter `de`.
-
-*Tip:* In the jMonkeyEngine SDK, you set this VM Option in the Project properties under Run. Here you can also save individual run configuraions for each language you want to test.
++
+[TIP]
+====
+In the jMonkeyEngine SDK, you set this VM Option in the Project properties under Run. Here you can also save individual run configuraions for each language you want to test.
+====
 
 To get the full list of language suffixes use 
 
@@ -83,21 +97,27 @@ System.out.println(Arrays.toString(Locale.getISOLanguages()));
 
 == Which Strings Not to Translate
 
-*Important:* In the Bundle.properties file, do not include any strings that are asset paths, node or geometry names, input mappings, or material layers.
+[IMPORTANT]
+====
+In the Bundle.properties file, do not include any strings that are asset paths, node or geometry names, input mappings, or material layers.
+====
 
 *  Keep material layers: 
++
 [source,java]
 ----
 mat.setTexture("ColorMap", tex);
 ----
 
 *  Keep paths: 
++
 [source,java]
 ----
 teapot = assetManager.loadModel("Models/Teapot/Teapot.obj");
 ----
 
 *  Keep geometry and node names: 
++
 [source,java]
 ----
 Geometry thing=new Geometry("A thing", mesh);
@@ -105,6 +125,7 @@ Node vehicle = new Node("Vehicle");
 ----
 
 *  Keep mappings: 
++
 [source,java]
 ----
 inputManager.addMapping("Shoot", trigger);

+ 10 - 9
src/docs/asciidoc/jme3/advanced/logging.adoc

@@ -27,38 +27,39 @@ Instead of `println()`, use the standard Java logger from `java.util.logging`. I
 To print comments like a pro, you use the following logger syntax.
 
 .  Declare the logger object once per file. In the following code, replace `HelloWorld` by the name of the class where you are using this line.
++
 [source,java]
 ----
-private static final Logger logger = Logger.getLogger(HelloWorld.class.getName());
+private static final Logger LOGGER = Logger.getLogger(HelloWorld.class.getName());
 ----
 
-.  Declare the info that you want to include in the message. The variables (here `a, b, c`) can be any printable Java object. +Example: `Vector3f a = cam.getLocation();` 
+.  Declare the info that you want to include in the message. The variables (here `a, b, c`) can be any printable Java object. +
+Example: `Vector3f a = cam.getLocation();` 
 .  Put the variables in a new `Object` array. Refer to the variables as `{0},{1},{2}` etc in the message string. Variables are numbered in the order you put them into the `Object` array. 
 .  Add the logger line and specify the log level:
 **  Usecase 1: During debugging, a developer uses a warning to remind himself of a bug:
++
 [source,java]
 ----
-logger.log(Level.WARNING, "why is {0} set to {1} again?!", 
+LOGGER.log(Level.WARNING, "why is {0} set to {1} again?!", 
                       new Object[]{a , b});
 ----
 
 **  Usecase 2: For the release, you inform the customer of a problem and how to solve it. 
++
 [source,java]
 ----
-logger.log(Level.SEVERE, "MyGame error: {0} must not be {1} after {2}! Adjust flux generator settings.", 
+LOGGER.log(Level.SEVERE, "MyGame error: {0} must not be {1} after {2}! Adjust flux generator settings.", 
                       new Object[]{a , b , c});
 ----
 
-
-
-
 [IMPORTANT]
 ====
 As you see in the examples, you should phrase potentially “customer facing errors in a neutral way and offer _a reason and a solution_ for the error (if you don't, it has no value to your customer). If your deveopment team uses WARNINGs as replacement for casual printlns, make sure you deactivate them for the release.
 ====
 
 
-More details about link:http://download.oracle.com/javase/6/docs/api/java/util/logging/Level.html[Java log levels] here.
+More details about link:http://docs.oracle.com/javase/8/docs/api/java/util/logging/Level.html[Java log levels] here.
 
 
 == Switching the Logger on and off
@@ -72,7 +73,7 @@ To deactivate the default logger for a release, you set the log level to only re
 Logger.getLogger(””).setLevel(Level.SEVERE);
 ----
 
-During development or a beta test, you can tune down the default logger, and set the log level to only report `warning`s:
+During development or a beta test, you can tune down the default logger, and set the log level to only report ``warning``s:
 
 [source,java]
 ----

+ 1 - 1
src/docs/asciidoc/jme3/advanced/makehuman_blender_ogrexml_toolchain.adoc

@@ -22,7 +22,7 @@ The tools can be downloaded from the following URLs:
 
 *  MakeHuman: [link:http://www.makehuman.org/][http://www.makehuman.org/]]
 *  Blender: [link:http://www.blender.org/][http://www.blender.org/]]
-*  OgreXML exporter for Blender: [link:https://code.google.com/p/blender2ogre/downloads/list][https://code.google.com/p/blender2ogre/downloads/list]]
+*  OgreXML exporter for Blender: <<jme3/advanced/ogrecompatibility#,Working Blender and OgreXML Versions>>
 
 
 == Seed Project

+ 17 - 8
src/docs/asciidoc/jme3/advanced/making_the_camera_follow_a_character.adoc

@@ -21,8 +21,8 @@ There are two ways how the camera can do that:
 
 Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestChaseCamera.java[TestChaseCamera.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestCameraNode.java[TestCameraNode.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/input/TestChaseCamera.java[TestChaseCamera.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/input/TestCameraNode.java[TestCameraNode.java]
 
 
 == Camera Node
@@ -47,7 +47,11 @@ camNode.lookAt(target.getLocalTranslation(), Vector3f.UNIT_Y);
 
 ----
 
-*Important:* Where the example says `camNode.setLocalTranslation(new Vector3f(0, 5, -5));`, you have to supply your own start position for the camera. This depends on the size of your target (the player character) and its position in your particular scene. Optimally, you set this to a spot a bit behind and above the target.
+[IMPORTANT]
+====
+Where the example says `camNode.setLocalTranslation(new Vector3f(0, 5, -5));`, you have to supply your own start position for the camera. This depends on the size of your target (the player character) and its position in your particular scene. Optimally, you set this to a spot a bit behind and above the target.
+====
+
 [cols="2", options="header"]
 |===
 
@@ -55,16 +59,19 @@ a|Methods
 a|Description
 
 a|setControlDir(ControlDirection.SpatialToCamera)
-a|User input steers the target spatial, and the camera follows the spatial.+The spatial's transformation is copied over the camera's transformation. +Example: Use with <<jme3/advanced/physics#,CharacterControl>>led spatial.
+a|User input steers the target spatial, and the camera follows the spatial. +
+The spatial's transformation is copied over the camera's transformation. +
+Example: Use with <<jme3/advanced/physics#,CharacterControl>>led spatial.
 
 a|setControlDir(ControlDirection.CameraToSpatial)
-a|User input steers the camera, and the target spatial follows the camera. +The camera's transformation is copied over the spatial's transformation. Use with first-person flyCam.
+a|User input steers the camera, and the target spatial follows the camera. +
+The camera's transformation is copied over the spatial's transformation. Use with first-person flyCam.
 
 |===
 
 *Code sample:*
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestCameraNode.java[TestCameraNode.java] – Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/input/TestCameraNode.java[TestCameraNode.java] – Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
 
 
 == Chase Camera
@@ -111,7 +118,9 @@ a|Camera looks at a point 3 world units above the target.
 a|setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE))
 a|Enable rotation by keeping the middle mouse button pressed (like in Blender). This disables the rotation on right and left mouse button click.
 
-a|setToggleRotationTrigger(new MouseButtonTrigger(+MouseInput.BUTTON_MIDDLE),+new KeyTrigger(KeyInput.KEY_SPACE))
+a|setToggleRotationTrigger(new MouseButtonTrigger( +
+MouseInput.BUTTON_MIDDLE), +
+new KeyTrigger(KeyInput.KEY_SPACE))
 a|Activate mutiple triggers for the rotation of the camera, e.g. spacebar and middle mouse button, etc.
 
 a|setRotationSensitivity(5f)
@@ -121,7 +130,7 @@ a|How fast the camera rotates. Use values around &lt;1.0f (all bigger values are
 
 *Code sample:*
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestChaseCamera.java[TestChaseCamera.java] – Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/input/TestChaseCamera.java[TestChaseCamera.java] – Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
 
 
 == Which to Choose?

+ 4 - 0
src/docs/asciidoc/jme3/advanced/material_definitions.adoc

@@ -53,24 +53,28 @@ In the <<jme3/advanced/materials_overview#,Materials Overview>> list:
 In your Java code,
 
 .  Create a Material object based on the chosen Material Definition (.j3md file): 
++
 [source,java]
 ----
 Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
 ----
 
 .  Configure your Material by setting the appropriate values listed in the <<jme3/advanced/materials_overview#,Materials Overview>> table. 
++
 [source,java]
 ----
 mat.setColor("Color", ColorRGBA.Yellow ); // and more
 ----
 
 .  Apply your prepared Material to a Geometry: 
++
 [source,java]
 ----
 myGeometry.setMaterial(mat);
 ----
 
 .  (Optional) Adjust the texture scale of the mesh: 
++
 [source,java]
 ----
 myGeometryMesh.scaleTextureCoordinates(new Vector2f(2f, 2f));

+ 1 - 2
src/docs/asciidoc/jme3/advanced/material_specification.adoc

@@ -262,7 +262,6 @@ a|Textures/MyTex.jpg
 
 |===
 
-}
 
 The formatting of the value, depends on the type of the value that was specified in the J3MD file being extended. Examples are provided for every parameter type:
 
@@ -281,7 +280,7 @@ Material MyGrass : Common/MatDefs/Misc/TestMaterial.j3md {
 
 === Java interface for J3M
 
-It is possible to generate an identical J3M file using Java code, by using the classes in the com.jme3.material package. Specifics of the link:http://jmonkeyengine.org/javadoc/com/jme3/material/Material.html[Material API] will not be provided in this document. The J3M file above is represented by this Java code:
+It is possible to generate an identical J3M file using Java code, by using the classes in the com.jme3.material package. Specifics of the link:http://javadoc.jmonkeyengine.org/com/jme3/material/Material.html[Material API] will not be provided in this document. The J3M file above is represented by this Java code:
 
 [source,java]
 ----

+ 229 - 67
src/docs/asciidoc/jme3/advanced/materials_overview.adoc

@@ -16,7 +16,8 @@ In jMonkeyEngine 3, colors and textures are represented as Material objects.
 
 [TIP]
 ====
-Find out quickly <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>, including the most commonly used code samples and RenderStates. +Or find more background info on <<jme3/advanced/material_definitions#,How to use Material Definitions>>.
+Find out quickly <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>, including the most commonly used code samples and RenderStates. +
+Or find more background info on <<jme3/advanced/material_definitions#,How to use Material Definitions>>.
 ====
 
 
@@ -28,7 +29,10 @@ The following Materials table shows you the Material Definitions that jMonkeyEng
 
 [TIP]
 ====
-Looks confusing? +1) Start learning about `Unshaded.j3md` and `Lighting.j3md`, they cover 90% of the cases. +2) Use <<sdk/material_editing#,the SDK's visual material editor>> to try out and save material settings easily. +3) The <<sdk/code_editor#,SDK's Palette>> contains drag&drop code snippets for loading materials. 
+Looks confusing? +
+1) Start learning about `Unshaded.j3md` and `Lighting.j3md`, they cover 90% of the cases. +
+2) Use <<sdk/material_editing#,the SDK's visual material editor>> to try out and save material settings easily. +
+3) The <<sdk/code_editor#,SDK's Palette>> contains drag&drop code snippets for loading materials. 
 ====
 
 
@@ -42,43 +46,103 @@ jMonkeyEngine supports illuminated and unshaded Material Definitions.
 *  Phong Illuminated materials look more naturalistic.
 *  Unshaded materials look more abstract. 
 
-“Unshaded materials look somewhat abstract because they ignore lighting and shading. Unshaded Materials work even if the scene does not include a light source. These Materials can be single-colored or textured. For example, they are used for cards and tiles, for the sky, billboards and UI elements, for toon-style games, or for testing. 
-[cols="3", options="header"]
+“Unshaded materials look somewhat abstract because they ignore lighting and shading. Unshaded Materials work even if the scene does not include a light source. These Materials can be single-colored or textured. For example, they are used for cards and tiles, for the sky, billboards and UI elements, for toon-style games, or for testing.
+
+[cols="20,40,40", options="header"]
+.Standard Unshaded
 |===
 
-a| Standard Unshaded Material Definition 
+a| Material Definition 
 a| Usage 
 <a| Material Parameters  
 
-a| Common/MatDefs/Misc/Unshaded.j3md 
-a| Standard, non-illuminated Materials. +Use this for simple coloring and texturing, glow, and transparency. +See also: <<jme3/beginner/hello_material#,Hello Material>> 
-a| *Texture Maps* +setTexture(“ColorMap, assetManager.loadTexture(“)); + setBoolean(“SeparateTexCoord,true);  +setTexture(“LightMap, assetManager.loadTexture(“)); +*Colors* +setColor(“Color, ColorRGBA.White); +setBoolean(“VertexColor,true); +*Glow* +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); 
+a| Common/MatDefs/Misc/ +
+Unshaded.j3md 
+a| Standard, non-illuminated Materials. +
+Use this for simple coloring and texturing, glow, and transparency. +
+See also: <<jme3/beginner/hello_material#,Hello Material>> 
+a| *Texture Maps* +
+setTexture(“ColorMap, assetManager.loadTexture(“)); +
+setBoolean(“SeparateTexCoord,true); +
+setTexture(“LightMap, assetManager.loadTexture(“)); +
+*Colors* +
+setColor(“Color, ColorRGBA.White); +
+setBoolean(“VertexColor,true); +
+*Glow* +
+setTexture(“GlowMap, assetManager.loadTexture(“)); +
+setColor(“GlowColor, ColorRGBA.White); 
 
 |===
 
 Other useful, but less commonly used material definitions:
-[cols="3", options="header"]
+
+[cols="20,40,40", options="header"]
+.Special Unshaded
 |===
 
-a| Special Unshaded Material Definitions 
+a| Material Definition 
 a| Usage 
 <a| Material Parameters  
 
-<a| Common/MatDefs/Misc/Sky.j3md            
-a| A solid skyblue, or use with a custom SkyDome texture. +See also: <<jme3/advanced/sky#,Sky>> 
-a| setTexture(“TextureCubeMap, assetManager.loadTexture(“)); + setBoolean(“SphereMap,true); +setVector3(“NormalScale, new Vector3f(0,0,0)); 
-
-a| Common/MatDefs/Terrain/Terrain.j3md 
-a| Splat textures for e.g. terrains. +See also: <<jme3/beginner/hello_terrain#,Hello Terrain>> 
-a| setTexture(“Tex1, assetManager.loadTexture(“)); (red) + setFloat(“Tex1Scale,1f); + setTexture(“Tex2, assetManager.loadTexture(“)); (green) + setFloat(“Tex2Scale,1f); +setTexture(“Tex3, assetManager.loadTexture(“)); (blue)  + setFloat(“Tex3Scale,1f); +setTexture(“Alpha, assetManager.loadTexture(“)); 
-
-a|Common/MatDefs/Terrain/HeightBasedTerrain.j3md
-a|A multi-layered texture for terrains. +Specify four textures and a Vector3f describing the region in which each texture should appear: +X = start height, +Y = end height, +Z = texture scale. +Texture regions can overlap. +For example: Specify a seafloor texture for the lowest areas, +a sandy texture for the beaches, +a grassy texure for inland areas, +and a rocky texture for mountain tops.
-a| setFloat(“terrainSize,512f); +setTexture(“region1ColorMap, assetManager.loadTexture(“)); +setTexture(“region2ColorMap, assetManager.loadTexture(“)); +setTexture(“region3ColorMap, assetManager.loadTexture(“)); +setTexture(“region4ColorMap, assetManager.loadTexture(“)); +setVector3(“region1, new Vector3f(0,0,0)); + setVector3(“region2, new Vector3f(0,0,0)); + setVector3(“region3, new Vector3f(0,0,0)); + setVector3(“region4, new Vector3f(0,0,0)); +*Settings for steep areas:* +setTexture(“slopeColorMap, assetManager.loadTexture(“)); + setFloat(“slopeTileFactor,1f);
-
-<a| Common/MatDefs/Misc/Particle.j3md       
-a| Used with texture masks for particle effects, or for point sprites. +The Quadratic value scales the particle for perspective view (link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/effect/ParticleEmitter.java[formula]). +Does support an optional colored glow effect. +See also: <<jme3/beginner/hello_effects#,Hello Effects>> 
-a| setTexture(“Texture, assetManager.loadTexture(“)); +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); + setFloat(“Quadratic,1f); + setBoolean(“PointSprite,true); 
+<a| Common/MatDefs/Misc/ +
+Sky.j3md            
+a| A solid skyblue, or use with a custom SkyDome texture. +
+See also: <<jme3/advanced/sky#,Sky>> 
+a| setTexture(“TextureCubeMap, assetManager.loadTexture(“)); +
+setBoolean(“SphereMap,true); +
+setVector3(“NormalScale, new Vector3f(0,0,0)); 
+
+a| Common/MatDefs/Terrain/ +
+Terrain.j3md 
+a| Splat textures for e.g. terrains. +
+See also: <<jme3/beginner/hello_terrain#,Hello Terrain>> 
+a| setTexture(“Tex1, assetManager.loadTexture(“)); +
+(red) +
+setFloat(“Tex1Scale,1f); +
+setTexture(“Tex2, assetManager.loadTexture(“)); +
+(green) +
+setFloat(“Tex2Scale,1f); +
+setTexture(“Tex3, assetManager.loadTexture(“)); +
+(blue) +
+setFloat(“Tex3Scale,1f); +
+setTexture(“Alpha, assetManager.loadTexture(“)); 
+
+a|Common/MatDefs/Terrain/ +
+HeightBasedTerrain.j3md
+a|A multi-layered texture for terrains. +
+Specify four textures and a Vector3f describing the region in which each texture should appear: +
+X = start height, +
+Y = end height, +
+Z = texture scale. +
+Texture regions can overlap. +
+For example: Specify a seafloor texture for the lowest areas, +
+a sandy texture for the beaches, +
+a grassy texure for inland areas, +
+and a rocky texture for mountain tops.
+a| setFloat(“terrainSize,512f); +
+setTexture(“region1ColorMap, assetManager.loadTexture(“)); +
+setTexture(“region2ColorMap, assetManager.loadTexture(“)); +
+setTexture(“region3ColorMap, assetManager.loadTexture(“)); +
+setTexture(“region4ColorMap, assetManager.loadTexture(“)); +
+setVector3(“region1, new Vector3f(0,0,0)); +
+setVector3(“region2, new Vector3f(0,0,0)); +
+setVector3(“region3, new Vector3f(0,0,0)); +
+setVector3(“region4, new Vector3f(0,0,0)); +
+*Settings for steep areas:* +
+setTexture(“slopeColorMap, assetManager.loadTexture(“)); +
+setFloat(“slopeTileFactor,1f);
+
+<a| Common/MatDefs/Misc/ +
+Particle.j3md       
+a| Used with texture masks for particle effects, or for point sprites. +
+The Quadratic value scales the particle for perspective view (link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/effect/ParticleEmitter.java[formula]). +
+Does support an optional colored glow effect. +
+See also: <<jme3/beginner/hello_effects#,Hello Effects>> 
+a| setTexture(“Texture, assetManager.loadTexture(“)); +
+setTexture(“GlowMap, assetManager.loadTexture(“)); +
+setColor(“GlowColor, ColorRGBA.White); +
+setFloat(“Quadratic,1f); +
+setBoolean(“PointSprite,true); 
 
 |===
 
@@ -91,44 +155,120 @@ jMonkeyEngine supports illuminated and unshaded Material Definitions.
 *  Unshaded materials look more abstract.
 
 Illuminated materials require a <<jme3/advanced/light_and_shadow#,light source>> added to at least one of their parent nodes! (e.g. rootNode.) Illuminated materials are darker on the sides facing away from light sources. They use Phong illumination model (default), or the Ward isotropic gaussian specular shader (WardIso) which looks more like plastic. They do not cast <<jme3/advanced/light_and_shadow#,drop shadows>> unless you use a FilterPostProcessor. 
-[cols="3", options="header"]
+
+[cols="20,40,40", options="header"]
+.Standard Illuminated
 |===
 
-a|Standard Illuminated Material Definition 
+a|Material Definition 
 a| Usage 
 a| Material Parameters 
 
-<a| Common/MatDefs/Light/Lighting.j3md      
-a| Commonly used Material with Phong illumination. +Use this material together with DiffuseMap, SpecularMap, BumpMap (NormalMaps, ParalaxMap) textures. +Supports shininess, transparency, and plain material colors (Diffuse, Ambient, Specular colors). +See also: <<jme3/beginner/hello_material#,Hello Material>> 
-<a| *Texture Maps* +setTexture(“DiffuseMap, assetManager.loadTexture(“)); +setBoolean(“UseAlpha,true);footnote:[UseAlpha specifies whether DiffuseMap uses the alpha channel]  +setTexture(“NormalMap, assetManager.loadTexture(“)); +setBoolean(“LATC,true); footnote:[LATC Specifies whether NormalMap is BC5/ATI2n/LATC/3Dc-compressed]  +setTexture(“SpecularMap, assetManager.loadTexture(“)); + setFloat(“Shininess,64f); +setTexture(“ParallaxMap, assetManager.loadTexture(“)); +setTexture(“AlphaMap, assetManager.loadTexture(“)); + setFloat(“AlphaDiscardThreshold,1f); +setTexture(“ColorRamp, assetManager.loadTexture(“)); +*Glow* +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); +*Performance and quality* +setBoolean(“VertexLighting,true); +  setBoolean(“UseVertexColor,true); + setBoolean(“LowQuality,true); + setBoolean(“HighQuality,true); +*Material Colors* + setBoolean(“UseMaterialColors,true); +setColor(“Diffuse, ColorRGBA.White); + setColor(“Ambient, ColorRGBA.White); +setColor(“Specular, ColorRGBA.White); +*Tangent shading:* + setBoolean(“VTangent,true); + setBoolean(“Minnaert,true);footnote:[Minnaert is a shader type.] +setBoolean(“WardIso,true);footnote:[WardIso is a shader type.]  
+<a| Common/MatDefs/Light/ +
+Lighting.j3md      
+a| Commonly used Material with Phong illumination. +
+Use this material together with DiffuseMap, SpecularMap, BumpMap (NormalMaps, ParalaxMap) textures. +
+Supports shininess, transparency, and plain material colors (Diffuse, Ambient, Specular colors). +
+See also: <<jme3/beginner/hello_material#,Hello Material>> 
+<a| *Texture Maps* +
+setTexture(“DiffuseMap, assetManager.loadTexture(“)); +
+setBoolean(“UseAlpha,true); footnote:[UseAlpha specifies whether DiffuseMap uses the alpha channel]  +
+setTexture(“NormalMap, assetManager.loadTexture(“)); +
+setBoolean(“LATC,true); footnote:[LATC Specifies whether NormalMap is BC5/ATI2n/LATC/3Dc-compressed]  +
+setTexture(“SpecularMap, assetManager.loadTexture(“)); +
+setFloat(“Shininess,64f); +
+setTexture(“ParallaxMap, assetManager.loadTexture(“)); +
+setTexture(“AlphaMap, assetManager.loadTexture(“)); +
+setFloat(“AlphaDiscardThreshold,1f); +
+setTexture(“ColorRamp, assetManager.loadTexture(“)); +
+*Glow* +
+setTexture(“GlowMap, assetManager.loadTexture(“)); +
+setColor(“GlowColor, ColorRGBA.White); +
+*Performance and quality* +
+setBoolean(“VertexLighting,true); +
+setBoolean(“UseVertexColor,true); +
+setBoolean(“LowQuality,true); +
+setBoolean(“HighQuality,true); +
+*Material Colors* +
+setBoolean(“UseMaterialColors,true); +
+setColor(“Diffuse, ColorRGBA.White); +
+setColor(“Ambient, ColorRGBA.White); +
+setColor(“Specular, ColorRGBA.White); +
+*Tangent shading:* +
+setBoolean(“VTangent,true); +
+setBoolean(“Minnaert,true); footnote:[Minnaert is a shader type.] +
+setBoolean(“WardIso,true); footnote:[WardIso is a shader type.]  
 
 |===
-[cols="3", options="header"]
+
+[cols="20,40,40", options="header"]
+.Special Illuminated
 |===
 
-a|Special Illuminated Material Definitions 
+a|Material Definitions 
 a| Usage 
 a| Material Parameters 
 
-a|Common/MatDefs/Terrain/TerrainLighting.j3md
-a|Same kind of multi-layered splat texture as Terrain.j3md, but with illumination and shading. +Typically used for terrains, but works on any mesh. +For every 3 splat textures, you need one alpha map. +You can use a total of 11 texture maps in the terrain's splat texture: +Note that diffuse and normal maps all count against that. +For example, you can use a maximum of 9 diffuse textures, two of which can have normal maps; +or, five textures with both diffuse and normal maps.
-a|*Texture Splat Maps* + setTexture(“DiffuseMap, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_0_scale,1f); +setTexture(“NormalMap, assetManager.loadTexture(“)); +setTexture(“DiffuseMap_1, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_1_scale,1f); +setTexture(“NormalMap_1, assetManager.loadTexture(“)); +setTexture(“DiffuseMap_2, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_2_scale,1f); +setTexture(“NormalMap_2, assetManager.loadTexture(“)); +setTexture(“DiffuseMap_3, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_3_scale,1f); +setTexture(“NormalMap_3, assetManager.loadTexture(“)); +etc, up to 11. +*Alpha Maps* +setTexture(“AlphaMap, assetManager.loadTexture(“)); +setTexture(“AlphaMap_1, assetManager.loadTexture(“)); +setTexture(“AlphaMap_2, assetManager.loadTexture(“)); +*Glowing* +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); +*Miscellaneous* +setColor(“Diffuse, ColorRGBA.White); +setColor(“Ambient, ColorRGBA.White); +setFloat(“Shininess,64f); +setColor(“Specular, ColorRGBA.White); +setTexture(“SpecularMap, assetManager.loadTexture(“)); +setBoolean(“WardIso,true); + setBoolean(“useTriPlanarMapping,true); + setBoolean(“isTerrainGrid,true); 
-
-<a| Common/MatDefs/Light/Reflection.j3md    
+a|Common/MatDefs/Terrain/ +
+TerrainLighting.j3md
+a|Same kind of multi-layered splat texture as Terrain.j3md, but with illumination and shading. +
+Typically used for terrains, but works on any mesh. +
+For every 3 splat textures, you need one alpha map. +
+You can use a total of 11 texture maps in the terrain's splat texture: +
+Note that diffuse and normal maps all count against that. +
+For example, you can use a maximum of 9 diffuse textures, two of which can have normal maps; +
+or, five textures with both diffuse and normal maps.
+a|*Texture Splat Maps* +
+setTexture(“DiffuseMap, assetManager.loadTexture(“)); +
+setFloat(“DiffuseMap_0_scale,1f); +
+setTexture(“NormalMap, assetManager.loadTexture(“)); +
+setTexture(“DiffuseMap_1, assetManager.loadTexture(“)); +
+setFloat(“DiffuseMap_1_scale,1f); +
+setTexture(“NormalMap_1, assetManager.loadTexture(“)); +
+setTexture(“DiffuseMap_2, assetManager.loadTexture(“)); +
+setFloat(“DiffuseMap_2_scale,1f); +
+setTexture(“NormalMap_2, assetManager.loadTexture(“)); +
+setTexture(“DiffuseMap_3, assetManager.loadTexture(“)); +
+setFloat(“DiffuseMap_3_scale,1f); +
+setTexture(“NormalMap_3, assetManager.loadTexture(“)); +
+etc, up to 11. +
+*Alpha Maps* +
+setTexture(“AlphaMap, assetManager.loadTexture(“)); +
+setTexture(“AlphaMap_1, assetManager.loadTexture(“)); +
+setTexture(“AlphaMap_2, assetManager.loadTexture(“)); +
+*Glowing* +
+setTexture(“GlowMap, assetManager.loadTexture(“)); +
+setColor(“GlowColor, ColorRGBA.White); +
+*Miscellaneous* +
+setColor(“Diffuse, ColorRGBA.White); +
+setColor(“Ambient, ColorRGBA.White); +
+setFloat(“Shininess,64f); +
+setColor(“Specular, ColorRGBA.White); +
+setTexture(“SpecularMap, assetManager.loadTexture(“)); +
+setBoolean(“WardIso,true); +
+setBoolean(“useTriPlanarMapping,true); +
+setBoolean(“isTerrainGrid,true); 
+
+<a| Common/MatDefs/Light/ +
+Reflection.j3md    
 a| Reflective glass material with environment map (CubeMap/SphereMap). See also: link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/texture/TestCubeMap.java[TestCubeMap.java] 
-a| setTexture(“Texture, assetManager.loadTexture(“)); + setBoolean(“SphereMap,true); 
+a| setTexture(“Texture, assetManager.loadTexture(“)); +
+setBoolean(“SphereMap,true); 
 
 |===
 
 
 === Other: Test and Debug
-[cols="2", options="header"]
+
+[cols="20,80", options="header"]
+.Testing
 |===
 
 <a| Material Definition                     
 a| Usage 
 
-<a| Common/MatDefs/Misc/ShowNormals.j3md    
+<a| Common/MatDefs/Misc/ +
+ShowNormals.j3md    
 a| A color gradient calculated from the model's surface normals. You can use this built-in material to debug the generation of normals in meshes, to preview models that have no material and no lights, or as fall-back default material. This built-in material has no parameters. 
 
 |===
@@ -137,51 +277,65 @@ a| A color gradient calculated from the model's surface normals. You can use thi
 == RenderStates
 
 
-=== Transparency
 [cols="3", options="header"]
+.Transparancy
 |===
 
 a|Material Option
 a|Description
 a|Example
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.Off);
+a|getAdditionalRenderState(). +
+setBlendMode(BlendMode.Off);
 a|This is the default, no transparency.
 a|Use for all opaque objects like walls, floors, people…
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
+a|getAdditionalRenderState() +
+.setBlendMode(BlendMode.Alpha);
 a|Interpolates the background pixel with the current pixel by using the current pixel's alpha.
 a|Use this for normal every-day translucency: Frosted window panes, ice, glass, alpha-blended vegetation textures… 
 
-a|getAdditionalRenderState().setDepthWrite(false);
+a|getAdditionalRenderState() +
+.setDepthWrite(false);
 a|Disables writing of the pixel's depth value to the depth buffer.
 a|Use this on Materials if you have several transparent/translucent objects obscuring one another, but you want to see through both.
 
-a|getAdditionalRenderState().setAlphaFallOff(0.5f); +getAdditionalRenderState().setAlphaTest(true)
+a|getAdditionalRenderState() +
+.setAlphaFallOff(0.5f); +
+getAdditionalRenderState() +
+.setAlphaTest(true)
 a|Enables Alpha Testing with a “AlphaDiscardThreshold in the AlphaMap.
-a|Activate Alpha Testing for (partially) *transparent* objects such as foliage, hair, etc. +Deactivate Alpha Testing for gradually *translucent* objects, such as colored glass, smoked glass, ghosts.
+a|Activate Alpha Testing for (partially) *transparent* objects such as foliage, hair, etc. +
+Deactivate Alpha Testing for gradually *translucent* objects, such as colored glass, smoked glass, ghosts.
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.Additive);
-a|Additive alpha blending adds colors in a commutative way, i.e. the result does not depend on the order of transparent layers, since it adds the scene's background pixel color to the current pixel color. This is useful if you have lots of transparent textures overlapping and don't care about the order. +*Note:* Viewed in front of a white background, Additive textures become fully transparent! 
+a|getAdditionalRenderState() +
+.setBlendMode(BlendMode.Additive);
+a|Additive alpha blending adds colors in a commutative way, i.e. the result does not depend on the order of transparent layers, since it adds the scene's background pixel color to the current pixel color. This is useful if you have lots of transparent textures overlapping and don't care about the order. +
+*Note:* Viewed in front of a white background, Additive textures become fully transparent! 
 a| This is the default for Particle.j3md-based textures that have a black color background. 
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.AlphaAdditive);
+a|getAdditionalRenderState() +
+.setBlendMode(BlendMode.AlphaAdditive);
 a|Same as “Additive, except first it multiplies the current pixel color by the pixel alpha.
 a|This can be used for particle effects that have alpha as background. 
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.Color);
+a|getAdditionalRenderState() +
+.setBlendMode(BlendMode.Color);
 a|Blends by color.
 a|Generally useless.
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.Modulate);
+a|getAdditionalRenderState() +
+.setBlendMode(BlendMode.Modulate);
 a|Multiplies the background pixel by the current pixel.
 a|?
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.ModulateX2);
+a|getAdditionalRenderState() +
+.setBlendMode(BlendMode.ModulateX2);
 a|Same as “Modulate, except the result is doubled.
 a|?
 
-a|getAdditionalRenderState().setBlendMode(BlendMode.PremultAlpha);
+a|getAdditionalRenderState() +
+.setBlendMode(BlendMode.PremultAlpha);
 a|Pre-multiplied alpha blending. E.g. if the color of the object has already been multiplied by its alpha, this is used instead of “Alpha blend mode.
 a|For use with Premult Alpha textures.
 
@@ -194,15 +348,12 @@ If the DiffuseMap has an alpha channel, use:
 mat.setBoolean("UseAlpha",true);
 ----
 
-Later, put the Geometry (not the Material!) in the appropriate render queue
-
-*  
+Later, put the Geometry (not the Material!) in the appropriate render queue.
 [source,java]
 ----
 geo.setQueueBucket(Bucket.Translucent);
 ----
-
-*  
+or
 [source,java]
 ----
 geo.setQueueBucket(Bucket.Transparent);
@@ -210,46 +361,57 @@ geo.setQueueBucket(Bucket.Transparent);
 
 
 
-=== Culling
 [cols="3", options="header"]
+.Culling
 |===
 
 a|Material Option
 a|Usage
 a|Example
 
-a|getAdditionalRenderState().setFaceCullMode(FaceCullMode.Back); 
+a|getAdditionalRenderState() +
+.setFaceCullMode(FaceCullMode.Back); 
 a|Activates back-face culling. Mesh faces that are facing away from the camera are not rendered, which saves time. *Backface culling is activated by default as a major optimization.* 
 a|The invisible backsides and insides of models are not calculated. 
 
-a|getAdditionalRenderState().setFaceCullMode(FaceCullMode.Off); 
+a|getAdditionalRenderState() +
+.setFaceCullMode(FaceCullMode.Off); 
 a|No meshes are culled. Both mesh faces are rendered, even if they face away from the camera. Slow.
 a|Sometimes used to debug custom meshes if you messed up some of the polygon sides, or for special shadow effects.
 
-a|getAdditionalRenderState().setFaceCullMode(FaceCullMode.Front); 
+a|getAdditionalRenderState() +
+.setFaceCullMode(FaceCullMode.Front); 
 a|Activates front-face culling. Mesh faces facing the camera are not rendered.
 a|No example – Typically not used because you wouldn't see anything meaningful.
 
-a|getAdditionalRenderState().setFaceCullMode(FaceCullMode.FrontAndBack)
+a|getAdditionalRenderState() +
+.setFaceCullMode(FaceCullMode.FrontAndBack)
 a|Culls both backfaces and frontfaces.
 a|Use this as an efficient way to make an object temporarily invisible, while keeping all its other in-game properties (such as node attachment, collision shapes, interactions, etc) active.
 
 |===
 
 
-=== Miscellaneous
 [cols="3", options="header"]
+.Miscellaneous
 |===
 
-a|getAdditionalRenderState().setColorWrite(false);
+a|Material Option
+a|Useage
+a|Example
+
+a|getAdditionalRenderState() +
+.setColorWrite(false);
 a|Disable writing the color of pixels.
 a|Use this together with setDepthWrite(true) to write pixels only to the depth buffer, for example. 
 
-a|getAdditionalRenderState().setPointSprite(true);
+a|getAdditionalRenderState() +
+.setPointSprite(true);
 a|Enables point-sprite mode, e.g. meshes with “Mode.Points will be rendered as textured sprites. Note that gl_PointCoord must be set in the shader.
 a|Point sprites are used internally for hardware accelerated particle effects.
 
-a|getAdditionalRenderState().setPolyOffset();
+a|getAdditionalRenderState() +
+.setPolyOffset();
 a|Enable polygon offset.
 a|Use this when you have meshes that have triangles really close to each over (e.g. link:http://en.wikipedia.org/wiki/Coplanarity[Coplanar]), it will shift the depth values to prevent link:http://en.wikipedia.org/wiki/Z-fighting[Z-fighting].
 

+ 35 - 32
src/docs/asciidoc/jme3/advanced/mesh.adoc

@@ -1,6 +1,6 @@
 = Polygon Meshes
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: spatial, node, mesh, geometry, scenegraph
 :relfileprefix: ../../
@@ -9,25 +9,25 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-image::jme3/dolphin-mesh.png[dolphin-mesh.png,with="",height="",align="right"]
+image::jme3/dolphin-mesh.png[dolphin-mesh.png,width="",height="",align="right"]
 
 
-All visible game elements in a scene, whether it is a Model or a Shape, are made up of polygon meshes. JME3 has a com.jme3.scene.Mesh class that represents all meshes.
+All visible game elements in a scene, whether it is a Model or a Shape, are made up of polygon meshes. JME3 has a http://javadoc.jmonkeyengine.org/com/jme3/scene/Mesh.html[com.jme3.scene.Mesh] class that represents all meshes.
 
 *  Meshes are made up of triangles: `getTriangleCount(…)` and `getTriangle(…)`
 *  Each mesh has a unique ID: `getId()`
 *  Meshes have transformations: Location (local translation), rotation, scale.
 *  Meshes have a bounding volume. jME3 can detect intersections (that is, non-physical collisions) between meshes, or between meshes and 2D elements such as rays: `collideWith()`.
-*  Meshes are locked with `setStatic()` and unlocked with `setDynamic()`. 
-**  Static Meshes cannot be modified, but are more optimized and faster (they can be precalculated). 
-**  Dynamic Meshes can be modified live, but are not optimized and slower. 
+*  Meshes are locked with `setStatic()` and unlocked with `setDynamic()`.
+**  Static Meshes cannot be modified, but are more optimized and faster (they can be precalculated).
+**  Dynamic Meshes can be modified live, but are not optimized and slower.
 
 
 You have several options when <<jme3/advanced/spatial#,creating Geometries from meshes>>:
 
-*  Use built-in <<jme3/advanced/shape#,Shape>>s as meshes; 
-*  Load <<jme3/advanced/3d_models#,3D models>> (that is, meshes created in external applications); or 
-*  Create free-form <<jme3/advanced/custom_meshes#,custom meshes>> programmatically. 
+*  Use built-in <<jme3/advanced/shape#,Shape>>s as meshes;
+*  Load <<jme3/advanced/3d_models#,3D models>> (that is, meshes created in external applications); or
+*  Create free-form <<jme3/advanced/custom_meshes#,custom meshes>> programmatically.
 
 
 == Vertex Buffer
@@ -36,70 +36,70 @@ The VertexBuffer contains a particular type of geometry data used by Meshes. Eve
 
 
 === Mesh Vertex Buffers
+
+Here is the list of http://javadoc.jmonkeyengine.org/com/jme3/scene/VertexBuffer.Type.html[VertexBuffer] types.
+
 [cols="2", options="header"]
 |===
 
 a|Vertex Buffer Type
 a|Description
 
-a|Type.Position 
+a|Type.Position
 a|Position of the vertex (3 floats)
 
-a|Type.Index 
+a|Type.Index
 a| Specifies the index buffer, must contain integer data.
 
-a|Type.TexCoord 
+a|Type.TexCoord
 a| Texture coordinate
 
-a|Type.TexCoord2 
+a|Type.TexCoord2
 a| Texture coordinate #2
 
-a|Type.Normal 
+a|Type.Normal
 a| Normal vector, normalized.
 
-a|Type.Tangent 
+a|Type.Tangent
 a| Tangent vector, normalized.
 
-a|Type.Binormal 
+a|Type.Binormal
 a| Binormal vector, normalized.
 
-a|Type.Color 
+a|Type.Color
 a| Color and Alpha (4 floats)
 
-a|Type.Size 
+a|Type.Size
 a|The size of the point when using point buffers.
 
-a|Type.InterleavedData 
+a|Type.InterleavedData
 a| Specifies the source data for various vertex buffers when interleaving is used.
 
-a|Type.BindPosePosition 
+a|Type.BindPosePosition
 a| Inital vertex position, used with animation.
 
-a|Type.BindPoseNormal 
+a|Type.BindPoseNormal
 a| Inital vertex normals, used with animation
 
-a|Type.BoneWeight 
+a|Type.BoneWeight
 a| Bone weights, used with animation
 
-a|Type.BoneIndex 
+a|Type.BoneIndex
 a| Bone indices, used with animation
 
 |===
 
 
 === Mesh Properties
+
+Some Mesh properties from the http://javadoc.jmonkeyengine.org/com/jme3/scene/Mesh.html[Mesh] class.
+
 [cols="2", options="header"]
 |===
 
 a|Mesh method
 a|Description
 
-a|setLineWidth(1)
-a|the thickness of the line if using Mode.Lines
-
-a|setPointSize(4.0f)
-a|the thickness of the point when using Mode.Points
-
 a|setBound(boundingVolume)
 a|if you need to specifiy a custom optimized bounding volume
 
@@ -113,7 +113,7 @@ a|setMode(Mesh.Mode.Points)
 a|Used to set mesh rendering modes, see below.
 
 a|getId()
-a|returns the Mesh ID
+a|returns the Mesh ID, default value is -1
 
 a|getTriangle(int,tri)
 a|returns data of triangle number `int` into variable `tri`
@@ -125,6 +125,9 @@ a|How the texture will be stretched over the whole mesh.
 
 
 === Mesh Rendering Modes
+
+Here is the list of http://javadoc.jmonkeyengine.org/com/jme3/scene/Mesh.Mode.html[Mesh rendering modes].
+
 [cols="2", options="header"]
 |===
 
@@ -160,4 +163,4 @@ a|?
 
 === Level of Detail
 
-Optionally, custom meshes can have a LOD (level of detail optimization) that renders more or less detail, depending on the distance of the mesh from the camera. You have to specify several vertex buffers, one for each level of detail you want (very far away with few details, close up with all details, and something in the middle). Use `setLodLevels(VertexBuffer[] lodLevels)`. 
+Optionally, custom meshes can have a LOD (level of detail optimization) that renders more or less detail, depending on the distance of the mesh from the camera. You have to specify several vertex buffers, one for each level of detail you want (very far away with few details, close up with all details, and something in the middle). Use `setLodLevels(VertexBuffer[] lodLevels)`.

+ 377 - 0
src/docs/asciidoc/jme3/advanced/mixamo.adoc

@@ -0,0 +1,377 @@
+= Animating Blender Models With Mixamo
+:author: 
+:revnumber: 
+:revdate: 2017/05/25 13:04
+:relfileprefix: ../../
+:imagesdir: ../..
+:experimental:
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+
+[NOTE]
+====
+In the near future the Mixamo website will be undergoing some changes that will have some level of effect upon how you animate your character. The only real difference that Adobe says will happen, with respect to auto-rigging your characters, is you no longer can store the assets on the Mixamo website. See this link:http://blogs.adobe.com/adobecare/2017/05/23/download-assets-from-mixamo/[notice] for more info.
+====
+
+== Using Mixamo For Model Animation
+
+With very little effort, you can use Adobes Mixamo to fully animate your Blender models. Once you understand the process that is. 
+
+This guide requires:
+
+*  link:https://www.blender.org/download/[Blender version 2.78c] with its default settings. The exception being `Select With:`, under `menu:File[User Preferences >  Input]` is set to `Left Click`.
+*  Blender Ogre exporter 0.6.0, found <<jme3/advanced/ogrecompatibility#,here>>, enabled. 
+*  Blender FBX file Importing and Exporting, enabled.
+*  A Modest amount of Blender knowledge.
+*  A link:https://www.mixamo.com/[Mixamo] account.
+
+
+== Prepare to Export
+
+To properly animate your models there are a few rules you must follow.
+
+*  Read the link:https://community.mixamo.com/hc/en-us/articles/210310918-Auto-Rigger-Troubleshooting[Auto-Rig Error Troubleshooting] guide before you do anything else.
+*  Clean up your Blender file prior to exporting. This means you have a game ready model that will become the base for all your animations. The following checklist is provided for your convenience.
+[%interactive]
+- [ ] You have no Animations.
+- [ ] You have UV Mapped your model.
+- [ ] Your models origin is at the base of the mesh.
+- [ ] You have one Material named the same as your mesh.
+- [ ] You have baked and packed your Texture. For this tutorial we use a diffuse texture (i.e. your using a texture atlas), no normal or specular maps.
+- [ ] You have cleared the UV, Material and Texture buffers of unused images, materials and textures.
+- [ ] There are no `Actions` stored in the `Dope Sheet Editor` buffer.  Open the `Action Editor` context, select the btn:[Browse Action to be linked] button to check there are no stored actions.
+- [ ] You have applied the Location, Rotation, and Scale to your model.
+- [ ] *MOST IMPORTANT OF ALL*, in the `menu:Properties Panel[Scene Tab > Units Panel]` set the btn:[Unit of Measure] to Meters and the Length to Metric. Adobe uses centimeters for the FBX exporter and if this is not set the models scale will be unusual to say the least. Besides that, JME3 uses 1 WU = 1 Meter so this will keep things consistent. If you are doing this now, you may have to re-scale your model before proceeding.
+
+[TIP]
+====
+See <<jme3/advanced/3d_models#blender-buffer-clearing#,Blender Buffer Clearing>> if you don't already know how to clear your buffers.
+
+See <<jme3/external/blender#,Creating assets in Blender3D>> for help on creating jME3 compatible models. 
+====
+
+== Blender FBX Export
+
+
+.  In the `3d Viewport`, select your model, it will be high-lighted in orange.
+.  In the `Info` header, select `menu:File[Export > FBX]`.
+.  Enter a file path to export to, usually the same folder as your `.blend` file for simplicity.
+.  Enter a file name.
+.  In the `Export FBX` panel, located in the bottom left of the export dialog: 
+Main Tab:: 
+- [x] Selected Objects
+- Scale = 1 
++
+[IMPORTANT]
+====
+Click the button next to scale to deselect btn:[Scale all data]. Failure to do so will destroy the scale of your model. If the button is selected, it will be dark in color.
+====
+
+-  Forward = -Z Forward 
+-  Up = Y Up
+-  Which kind of object to export = Mesh 
+Geometries Tab::
+- [x] Apply Modifiers
+.  When you are done, click the btn:[Export FBX] button to export the file.
+
+[TIP]
+====
+You can save these FBX export settings by clicking the btn:[+] button next to btn:[Operator Presets].
+====
+
+
+== Mixamo FBX Import
+
+
+.  Create an link:https://www.mixamo.com/[Mixamo] account and login.
+.  Navigate to your `My Assets` folder.
+.  Select `Upload`.
+.  Navigate to the file to be uploaded or drag and drop it onto the file up-loader.
+
+[NOTE]
+====
+Generally, if at any time during the import and rigging process the model does not appear within the time specified in the dialog that is showing, something has gone wrong and you will have to restart the process over.
+====
+
+== Mixamo Auto-Rigger
+
+
+If everything went well the `Auto-Rigger` will open and your model will be facing you.  If not, fix your model in Blender before proceeding.
+
+.  If the model is facing you, click btn:[Next].
+.  In this panel you will rig your model. Place the markers as shown in the Auto-Rigger dialog image. 
++
+[NOTE]
+====
+Remember that the model is facing you so its right is on your left.
+====
+
+.  Select the LOD you are after. This is based off how many bones you want the hand of the model to have. Feel free to cycle through the options to see what each one does.
+.  When you are through click the btn:[Next] button to rig your model.
+.  When the model appears, click through to the end.
+
+
+== Mixamo Animations
+
+
+.  Navigate to your `My Assets`  folder. 
+.  Select the model to be rigged.
+.  In the far right panel select btn:[Find Animations].
+.  After deciding on an animation, click the animation to have it applied to your model.
+.  After the animation is applied to your model, toggle the btn:[In Place] checkbox.
++
+[TIP]
+====
+You can make small adjustments to the animation by using the sliders. The most common adjustment you will make is the  `Character Arm-Space`. If you find the models hands are clipping through the model then use this slider to remedy the situation.
+====
+
+.  Click the btn:[Add To My Assets] button when finished to add the animation to your `My Animations` folder.
+
+
+== Mixamo Download
+
+
+When downloading `*Animations*` from Mixamo:
+
+.  If the `Animation` is not already in your `Downloads` folder, navigate to your `My Animations` folder and select the animation to be downloaded.
+.  Make sure the btn:[In Place] checkbox is selected.
+.  Click the btn:[Queue Download] button.
+.  In the `Download Settings` dialog use the default settings.
+*  Format = FBX
+*  Skin = With Skin
+* Frames per second = 30
+*  Keyframe Reduction = none
+.  Click btn:[Queue Download] to add the animation to your `Downloads` folder on Mixamo.
+
+When downloading `*Characters*` from Mixamo:
+
+.  If the `Character` is not already in your `Downloads` folder, navigate to your `My Characters` folder and select the character to be downloaded.
+.  Select the model and then click the btn:[Queue Download] button.
+.  In the `Download Settings` dialog the `Format` is FBX and `Pose` is TPose.
+.  Click btn:[Queue Download] to add the character to your `Downloads` folder on Mixamo.
+
+In the `Downloads` folder, click the btn:[Queue Download] button under `Status`, rename the file and save it to your computer.  Preferably in the same folder as your blender file.
+
+
+== Creating Blender Animations
+
+Download your TPose model using the instructions for downloading `*Characters*` given above. We will use it as our newly rigged model for Blender. To keep things organized we will create a `.blend` file for every animation and later use a separate `.blend` file to combine all animations into one jME3 compatible animation. 
+
+The following steps apply to any animation you want to add in the future.
+
+.  In the `Info` header, at the top of the program, select `menu:File[New > Reload Startup]`.
+.  Select the default cube and delete it.
+Scene Tab::
+*  In the `Properties` panel, located at the bottom right, select the `Scene` tab. 
+*  In the `Units` panel, change the `Units of measure` to `Meters` and `Length` to `Metric`. You must *always* have these settings when importing from or exporting to Mixamo.
++
+[TIP]
+====
+You should create and save a default startup file in Blender. `menu:File[Save Startup File]`. This way you will not have to constantly redo things. Setting your `Units of measure` is the least you should do. You can always restore the default startup file by selecting `menu:File[Load Factory Settings]` at any time.
+====
+
+.  In the `Info` header, select `menu:File[Import > FBX]`.
+.  Select the FBX file you downloaded earlier.
+.  In the `Import Fbx` panel located at the bottom left of the import dialog, leave all settings at their defaults.
+Main::
+-  Scale = 1
+- [x] Import Normals
+- [x] Import Animations
+- Armature offset = 1
+- [x] Image Search
+- Decal offset = 0
+- [x] Use pre/post rotation
+Armatures::
+-  Nothing checked
+.  When ready click btn:[Import FBX].
+.  After Blender imports the file, both the armature and model are selected, in this order, select `menu:Object[Apply > Rotation]`. Repeat this for the `Location` and `Scale`. Alternatively, select the armature and model individually and repeat the process.
+.  Select the Armature. 
+.  In the `Timeline`, determine the Length of the animation by btn:[RMB] selecting the last keyframe in the timeline. +
+ Set `End:` to this value.
+.  Click the btn:[|<<] button to reset timeline back to the first frame.  
+.  In the `Info` header, change the `Default` screen layout to `Animation`.
+.  In the `Dope Sheet Editor`, change the `Dope Sheet` mode/context to `Action Editor`. The `Linked Action` will now show the action name of the animation you imported.
+.  Rename this to the name of the imported animation. In this instance it was TPose.
+.  Select the btn:[F] button to save the action. 
+.  Save your file with the same name as the action.
+
+[NOTE]
+====
+Mixamo sets the rotation mode of bones to `Quaternion` as is appropriate for preventing link:https://en.wikipedia.org/wiki/Gimbal_lock[`Gimbal Lock`]. Keep this in mind if you decide to modify your animation. Blender defaults to `XYZ Euler` so you will need to change this setting prior to inserting new keyframes.
+====
+
+
+== Action Baking
+
+
+There are many ways to export or import files for jMonkeyEngine. If you plan to use a method other than `Ogre Exporter`, you may need to bake your actions. Baking is a destructive process so it is recommended that *after* completion of <<jme3/advanced/mixamo#creating-blender-animations#, Creating Blender Animations>>, test the animation in-game.
+
+If you find yourself in need of baking, the process is as follows.
+
+.  Using the animation file you created in the previous section, from the `Info` header, select `menu:File[Save Copy]`.
+.  Save the file somewhere other than the current folder. This will save you the effort of re-creating the animation file if you need it at some other time.
+.  In the `Info` header, change the `Default` screen layout to `Animation`.
+.  In the `Dope Sheet Editor`, change the `Dope Sheet` mode/context to `Action Editor`. 
+.  Click the btn:[Action to be linked] button and select your action.
+.  In the `3d Viewport` header, with the armature selected, select `menu:Object[Animation > Bake Action]`.
+.  In the `Bake Action` dialog, deselect and set the settings as follows:
+Bake Action::
+- [ ] Selected Only
+- [x] Visual Keying
+- [x] Clear Constraints
+- [ ] Clear Parents
+- [ ] Overwrite Current
+-  Bake Data = Pose
+.  When ready click btn:[OK].
+.  The `Linked Action` in the `Dope Sheet Editor` will change to the newly baked action and is named `Action`. Rename this to the name of the imported animation.
+.  Select the btn:[F] button to save the action. 
+.  Save your file.
+.  Clear the old action from the `Linked Action` buffer. See <<jme3/advanced/3d_models#blender-buffer-clearing#,Blender Buffer Clearing>> for more information.
+
+
+== Creating The Rigged Animation File
+
+
+It's good practice to have a separate file for combining animations. Things can go wrong, animations may change, and you don't want to destroy your original model file by accident. Our plan of attack has been we create a .blend file for every animation and then use this separate rigged file to combine them into one. To keep it simple we will use a copy of the first animation we downloaded and created a `.blend` file for.
+
+You create a rigged animation file only one time per model.
+
+.  If you have closed the TPose.blend file, open it. In the `Info` header select `menu:File[Save As]` and save the file using the models name with the word `Rigged` added. This will be the only file we add animations to, for this model, from now on. It has our default TPose action which will allow us to start our animation track for `Ogre` animation exporting.
+.  Select your `Armature`.
+Object Tab::
+*  In the `Properties` panel, navigate to the `Object` tab. In the `Display` panel toggle `X-Ray` on.
+.  With your mouse inside the `3d Viewport`, press kbd:[Num Pad 1] followed by kbd:[Numpad 5].
+.  kbd:[Tab] into `Edit Mode`.
+.  Set the `3d Cursor` to the models origin.
+.  Select `menu:Add[Single Bone]`.
++
+[IMPORTANT]
+====
+The models origin and the `Root` bone origin must be at the same location.
+====
+
+. Scale the bone down or up as needed by selecting the `Tip` (ball at the narrowest part of the bone) and dragging the `Z` arrow (blue arrow) of the manipulator up or down until you are satisfied with its scale. *DO NOT CHANGE THE ANGLE OR MOVE THE BASE OF THE BONE FROM CENTER*.
+.  When satisfied with the scale, select the body of the bone to select the entire bone. 
+Bone Tab::
+*  In the `Properties` panel, navigate to the `Bone` tab. 
+*  Rename the bone to `Root`.
+*  Deselect the `Deform` panel checkbox. 
+.  In the `3d Viewport`, select the body of the armatures `Hip` bone, the lowest bone in the center of the armature, to select the entire bone.
+.  While holding kbd:[Shift] down, btn:[LMB] select the `Root` bone.
+.  Press kbd:[Ctrl] + kbd:[P].
+. In the `Make Parent` dialog choose `Keep Offset`.
+.  With the mouse inside the 3d Viewport, kbd:[Tab] out of `Edit Mode`.
+. Select your model.
+Data Tab::
+*  In the `Properties` panel, navigate to the `Data` tab and make sure the `Mesh` has the same name as your model.
+Material Tab::
+*  In the `Properties` panel, navigate to the `Material` tab and make sure there is one `Material` in the `Material List` and it is the same name as your model.
+*  In the `Transparency` panel, move the `Alpha` slider to 1. 
++
+[IMPORTANT]
+====
+There appears to be a bug where the FBX importer adds an `Alpha` map texture to your model. If the `Alpha` slider is not at one, and you use the Blender importer of the SDK, or convert a .blend file, it will be transparent. `Ogre` export is unaffected.
+====
+
+*  Deselect the checkbox of the `Transparency` panel.
+Texture Tab::
+*  In the `Properties` panel, navigate to the `Texture` tab, you will note that your texture has duplicate names in the `Texture List`. The bottom texture is actually a transparent `Alpha` texture and appears to be a bug. Select the *second* texture in the `*Texture List*` to highlight it. 
+*  While holding down the kbd:[Shift] key, press the btn:[X] button next to the `*Texture Data Block*` to delete it.
+*  Select your remaining texture in the `Texture List` to highlight it. You will note the `Texture Data Block` is now red due to no texture being assigned.
+*  Click on the btn:[Browse Texture to be linked] button next to the `Texture Data Block` and select your texture.
+*  In the `Image` panel, click the btn:[Small Box] button located next to your texture's path to pack the image file.
+.  In the `Info` header, change the layout from `Animation` to `UV Editing`.
+.  With your mouse inside the `3d Viewport` and the model still selected, kbd:[Tab] into edit mode. If your model is not completely orange press kbd:[A] untill all vertices are selected. You will see your UV Mapped mesh appear in the `UV Image Editor` window.
+.  In the `UV Image Editor`, click the btn:[Browse Image to be linked] button and select your UV image.
+.  kbd:[Tab] out of `Edit Mode`.
+.  In the `Info` header, change the layout from `UV Editing` to `Default` and then click the btn:[+] button to create a new layout.
+.  Rename this new layout `NLA Editing`.
+.  Click the `Current Editor Type` button, located at the bottom left (small box) of the `3d Viewport`, and change it from `3d View` to `NLA Editor`. Our TPose action is now visible.
+*  If the action is not visible, navigate to the `Dope Sheet Editor` and from the `Action Editor` context, select the `Action`.
+.  Click the btn:[Double Down Arrow] button to push the action down into the stack.
+.  Beneath the TPose strip you will see a slider. Drag this slider to the right until your strip is nested up against the left margin of the window.
+. Save your file.
+
+
+== Ogre Export
+
+
+Your rigged file is now `Ogre` export ready. Before we go any further, we will test our export to verify it's error free.
+
+.  In the `Info` header, change the layout to `Default`.
+.  kbd:[Shift] + btn:[LMB] select your armature and your model.  
+.  From the `Info` header, select `menu:File[Export > Ogre3d]`. 
+.  Select a destination path in your games `Assets` folder, usually the `Textures` folder. 
+.  Make sure `Selected Only` is checked and `Only Deformable Bones` is unchecked.
+.  When you're happy with your export settings click btn:[Export Ogre]. 
+
+If your file exports clean, proceed with the next steps. If not, fix any errors before continuing.
+
+[TIP]
+====
+More on the `Ogre` settings can be found in <<jme3/advanced/3d_models#creating-models-and-scenes#,creating models and scenes>>.
+====
+
+
+== Appending Blender Animations 
+
+Follow the directions for <<jme3/advanced/mixamo#mixamo-animations#,Mixamo Animations>>, <<jme3/advanced/mixamo#mixamo-download#,Mixamo Download>>, <<jme3/advanced/mixamo#creating-blender-animations#,Creating Blender Animations>> and <<jme3/advanced/mixamo#clearing-the-linked-action-buffer#,Clearing The Linked Action Buffer>> for all animations you wish to append to your *rigged* animation file.
+
+.  If your `Rigged` file is closed, open it. 
+.  From the `Info` header, change the Layout to `Default`. 
+.  In the `3d Viewport`, select the armature of the model.
+.  From the `Info` header, select `menu:File[Append]`.
+.  Navigate to, and select the `.blend` animation file you want to append.
+.  From the folders list select the `Action` folder, followed by your action.
+.  When ready, select the btn:[Append From Library] button to finalize your selection.
+.  From the `Info` header, change your layout to `Animation`.
+.  In the `Dope Sheet Editor`, change the context to `Action Editor` if not already selected. 
+.  Click the btn:[Action to be linked] button and select your append action from the list.
+.  Select the btn:[F] button to save the action.
+.  From the `Info` header, change the layout from `Animation` to the `NLA Editing` layout we created in the <<jme3/advanced/mixamo#creating-the-rigged-animation-file#,Creating The Rigged Animation File>> section of this tutorial. You will see your append `Action` at the top of the list.
+.  From the `NLA Editor` header, select `menu:Add[Add Tracks]`. A new track has now been added to the top of the list.
+.  Click the btn:[Double Down Arrow] button next to the `Action` to push it down into the stack.
+.  btn:[LMB] select the strip to make it the only strip selected.
+.  btn:[LMB] drag the selected strip to the right until there is at least a 4 keyframe gap between the furthest strip to the right in the list and the append strip you are dragging. 
++
+[TIP]
+====
+When the strip is in drag mode it will be purple. While in drag mode you do not need to keep the btn:[LMB] pressed.
+====
+
+.  When you are satisfied with the position, btn:[LMB] click the strip to finalize your selection. Your append strip should now be the furthest strip to the right in the list.
++
+[TIP]
+====
+You can use the mouse scroll wheel to shrink or expand the strip window to bring all strips into the view. 
+
+You can drag the slider, at the bottom of the strip window, to the right or left to position the strips against the side of the window.
+====  
+
+.  With the mouse inside the strip window, press the kbd:[N] key to open the properties window.
+.  In the `Active Strip` panel, under `Strip Extents`, you will see the `End Frame` number. In the `Timeline`, set `End:` to this number. Every time you append an `Action` you must increase this number to equal the total length off all strips combined, including the gaps between strips.
+.  Save your file.
+
+Your file is now ready to <<jme3/advanced/mixamo#ogre-export#,export>>. 
+
+[IMPORTANT]
+====
+Prior to export: 
+
+In the `NLA Editor` make sure no `Actions` are waiting to be pushed down into the stack. If there are, it must be removed or made into a strip prior to export.
+
+In the `Dope Sheet Editor` make sure no `Actions` are selected in the `Action Editor` context. If one is selected, it will be sitting at the top of the `NLA Editor` stack.
+
+An `Action` that has not been pushed down into the `NLA Stack` will block your `NLA Strip` from playing.
+====
+
+Your NLA strip should look something like this:
+
+image::jme3/advanced/MixamoNLA.png[MixamoNLA.png,width="",height=""]
+
+
+== Notes
+
+
+*  You can see a similar video demonstration of this entire process in <<jme3#animations-and-scenes#,Animations And Scenes>> under the CadNav → Mixamo → JME Workflow heading.
+*  See <<jme3/beginner/hello_animation#,Hello Animation>> and <<jme3/advanced/animation#,Animation in JME3>> to learn how to use your animated model.

+ 3 - 3
src/docs/asciidoc/jme3/advanced/monkey_zone.adoc

@@ -10,10 +10,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 MonkeyZone is an multi-player demo game provided by the jME core developer team.
 
-*  link:http://monkeyzone.googlecode.com/svn/trunk/[Download source code] (Subversion Repository)
+*  link:https://github.com/jMonkeyEngine/monkeyzone[Download source code] (Github Repository)
 *  link:http://www.youtube.com/watch?v=98yITEoJvqE[Watch pre-alpha video footage] (YouTube Video)
-*  link:http://jmonkeyengine.org/2011/02/13/monkeyzone-a-jme3-game-from-the-core/[Read &quot;MonkeyZone – a jME3 game from the core&quot;] (news article)
-*  link:http://jmonkeyengine.org/groups/user-code-projects/forum/topic/open-game-finder/[Related forum thread: Open Game Finder]
+*  link:http://web.archive.org/web/20121021075434/http://jmonkeyengine.org/2011/02/13/monkeyzone-a-jme3-game-from-the-core/[Read &quot;MonkeyZone – a jME3 game from the core&quot;] (news article)
+*  link:https://hub.jmonkeyengine.org/t/open-game-finder/13399/11[Related forum thread: Open Game Finder]
 
 This open-source demo:
 

+ 8 - 4
src/docs/asciidoc/jme3/advanced/motionpath.adoc

@@ -9,7 +9,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 A MotionPath describes the motion of a spatial between waypoints. The path can be linear or rounded. You use MotionPaths to remote-control a spatial, or the camera.
 
-*Tip:* If you want to remote-control a whole cutscene with several spatials moving at various times, then we recommened you use MotionPaths together with <<jme3/advanced/cinematics#,Cinematics>>.
+[TIP]
+====
+If you want to remote-control a whole cutscene with several spatials moving at various times, then we recommened you use MotionPaths together with <<jme3/advanced/cinematics#,Cinematics>>.
+====
 
 
 == Sample Code
@@ -56,7 +59,8 @@ a|Sets whether the motion along this path should be closed (true) or open-ended
 a|path.addWayPoint(vector)
 a|Adds individual waypoints to this path. The order is relevant.
 
-a|path.removeWayPoint(vector) +removeWayPoint(index)
+a|path.removeWayPoint(vector) +
+removeWayPoint(index)
 a|Removes a way point from this path. You can specify the point that you want to remove as vector or as integer index.
 
 a|path.setCurveTension(0.83f)
@@ -76,14 +80,14 @@ a|Hides the line that visualizes the path. Use this for the release build.
 
 == MotionPathListener
 
-You can hook interactions into a playing MotionPath. Register a MotionPathListener to the MotionPath to track whether way points have been reached, and then trigger a custom action. The onWayPointReach() method of the interface gives you access to the MotionTrack object `control`, and an integer value representing the current wayPointIndex.
+You can hook interactions into a playing MotionPath. Register a MotionPathListener to the MotionPath to track whether way points have been reached, and then trigger a custom action. The onWayPointReach() method of the interface gives you access to the MotionEvent object `control`, and an integer value representing the current wayPointIndex.
 
 In this example, you just print the status at every way point. In a game you could trigger actions here: Transformations, animations, sounds, game actions (attack, open door, etc).
 
 [source,java]
 ----
 path.addListener( new MotionPathListener() {
-  public void onWayPointReach(MotionTrack control, int wayPointIndex) {
+  public void onWayPointReach(MotionEvent control, int wayPointIndex) {
     if (path.getNbWayPoints() == wayPointIndex + 1) {
       println(control.getSpatial().getName() + " has finished moving. ");
     } else {

+ 8 - 8
src/docs/asciidoc/jme3/advanced/mouse_picking.adoc

@@ -1,6 +1,6 @@
 = Mouse Picking
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, node, ray, click, collision, keyinput, input
 :relfileprefix: ../../
@@ -10,18 +10,18 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Mouse picking means that the user clicks an object in the scene to select it, or to interact with it otherwise. Games use picking to implement aiming and shooting, casting spells, picking up objects, selecting targets, dragging and moving objects, etc. Mouse picking can be done using fixed crosshairs, or using the mouse pointer.
 
-image:jme3/advanced/mouse-picking.png[mouse-picking.png,with="",height=""]
+image:jme3/advanced/mouse-picking.png[mouse-picking.png,width="",height=""]
 
 See <<jme3/advanced/input_handling#,Input Handling>> for details on how to define the necessary input triggers, input mappings, and input listeners.
 
 
 == Pick a Target Using Fixed Crosshairs
 
-The following `pick target` input mapping implements an action that determines what a user clicked. It assumes that the mouse pointer is invisible and there are crosshairs painted in the center of the screen. It assumes that the user aims the crosshairs at an object in the scene and clicks. You use Ray Casting to identify the geometry that was picked by the user. Use this method together with a first-person flyCam. 
+The following `pick target` input mapping implements an action that determines what a user clicked. It assumes that the mouse pointer is invisible and there are crosshairs painted in the center of the screen. It assumes that the user aims the crosshairs at an object in the scene and clicks. You use Ray Casting to identify the geometry that was picked by the user. Use this method together with a first-person flyCam.
 
 .  Activate the first-person camera: `flyCam.setEnabled(true);`
 .  Keep mouse pointer invisible using `inputManager.setCursorVisible(false)`.
-.  Map the `pick target` action to a MouseButtonTrigger. 
+.  Map the `pick target` action to a MouseButtonTrigger.
 .  Implement the action in the Listener.
 
 The following example rotates Spatials named “Red Box or “Blue Box when they are clicked. Modify this code to do whatever your game needs to do with the identified target (shoot it, take it, move it, etc).
@@ -66,13 +66,13 @@ The following example rotates Spatials named “Red Box or “Blue Box when they
 
 == Pick a Target Using the Mouse Pointer
 
-The following `pick target` input mapping implements an action that determines what a user clicked. It assumes that the mouse pointer is visible, and the user aims the cursor at an object in the scene. You use ray casting to determine the geometry that was picked by the user. 
+The following `pick target` input mapping implements an action that determines what a user clicked. It assumes that the mouse pointer is visible, and the user aims the cursor at an object in the scene. You use ray casting to determine the geometry that was picked by the user.
 
 *Note:* Picking with a visible mouse pointer implies that your application can no longer use the default flyCam where the MouseAxisTrigger rotates the camera. You have to deactivate the flyCam mappings and provide custom mappings. Either different inputs rotate the camera, or the camera is fixed.
 
-.  Map the `pick target` action to a MouseButtonTrigger. 
+.  Map the `pick target` action to a MouseButtonTrigger.
 .  Make the mouse pointer visible using `inputManager.setCursorVisible(true)`.
-.  Remap the inputs for camera rotation, or deactivate camera rotation. 
+.  Remap the inputs for camera rotation, or deactivate camera rotation.
 .  Implement the action in the Listener.
 
 The following example rotates Spatials named “Red Box or “Blue Box when they are clicked. Modify this code to do whatever your game needs to do with the identified target (shoot it, take it, move it, etc).

+ 1 - 1
src/docs/asciidoc/jme3/advanced/multiple_camera_views.adoc

@@ -10,7 +10,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 You can split the screen and look into the 3D scene from different camera angles at the same time. E.g. you can have two rootnodes with different scene graphs, and two viewPorts, each of which can only see its own subset of the scene with its own subset of port-processing filters, so you get two very different views of the scene.
 
-The packages used in this example are `com.jme3.renderer.Camera` and `com.jme3.renderer.ViewPort`. You can get the full sample code here: link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/renderer/TestMultiViews.java[TestMultiViews.java]
+The packages used in this example are `com.jme3.renderer.Camera` and `com.jme3.renderer.ViewPort`. You can get the full sample code here: link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/renderer/TestMultiViews.java[TestMultiViews.java]
 
 
 == How to resize and Position ViewPorts

+ 16 - 5
src/docs/asciidoc/jme3/advanced/multithreading.adoc

@@ -26,9 +26,12 @@ public void rotateGeometry(final Geometry geo, final Quaternion rot) {
 
 ----
 
-Note that this example does not fetch the returned value by calling `get()` on the Future object returned from `enqueue()`. This means that the example method `rotateGeometry()` will return immediately and will not wait for the rotation to be processed before continuing.
+[NOTE]
+====
+This example does not fetch the returned value by calling `get()` on the Future object returned from `enqueue()`. This means that the example method `rotateGeometry()` will return immediately and will not wait for the rotation to be processed before continuing.
 
 If the processing thread needs to wait or needs the return value then `get()` or the other methods in the returned Future object such as `isDone()` can be used.
+====
 
 First, make sure you know what <<jme3/advanced/application_states#,Application States>> and <<jme3/advanced/custom_controls#,Custom Controls>> are.
 
@@ -71,8 +74,11 @@ ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(4);
 
 Pool size means the executor will keep four threads alive at any time. Having more threads in the pool means that more tasks can run concurrently. But a bigger pool only results in a speed gain if the PC can handle it! Allocating a pool  that is uselessly large just wastes memory, so you need to find a good compromise: About the same to double the size of the number of cores in the computer makes sense. 
 
-!!! Executor needs to be shut down when the application ends, in order to make the process die properly
+[WARNING]
+====
+Executor needs to be shut down when the application ends, in order to make the process die properly
 In your simple application you can override the destroy method and shutdown the executor: 
+====
 
 [source,java]
 ----
@@ -157,8 +163,10 @@ The task code in the Callable should be self-contained! It should not write or r
 
 In reality, you might need access to the game state. If you must read or write a current state from the scene graph, you must have a clone of the data in your thread. There are only two ways:
 
-*  Use the execution queue `application.enqueue()` to create a sub-thread that clones the info. Only disadvantage is, it may be slower. +The example below gets the `Vector3f location` from the scene object `mySpatial` using this way.
-*  Create a separate World class that allows safe access to its data via synchronized methods to access the scene graph. Alternatively it can also internally use `application.enqueue()`. +The following example gets the object `Data data = myWorld.getData();` using this way.
+*  Use the execution queue `application.enqueue()` to create a sub-thread that clones the info. Only disadvantage is, it may be slower. +
+The example below gets the `Vector3f location` from the scene object `mySpatial` using this way.
+*  Create a separate World class that allows safe access to its data via synchronized methods to access the scene graph. Alternatively it can also internally use `application.enqueue()`. +
+The following example gets the object `Data data = myWorld.getData();` using this way.
 
 These two ways are thread-safe, they don't mess up the game logic, and keep the Callable code readable.
 
@@ -192,7 +200,10 @@ private Callable<MyWayList> findWay = new Callable<MyWayList>(){
 
 === Useful Links
 
-High level description which describes how to manage the game state and the rendering in different threads: link:http://altdevblog.com/2011/07/03/threading-and-your-game-loop/[link]. A C++ example can be found at link:http://gamasutra.com/blogs/AndreaMagnorsky/20130527/193087/Multithreading_rendering_in_a_game_engine_with_CDouble_buffer_implementation.php[link]
+High level description which describes how to manage the game state and the rendering in different threads: +
+link:http://jahej.com/alt/2011_07_03_threading-and-your-game-loop.html[Threading and your game loop]. + 
+A C++ example can be found at: +
+link:http://gamasutra.com/blogs/AndreaMagnorsky/20130527/193087/Multithreading_rendering_in_a_game_engine_with_CDouble_buffer_implementation.php[Multithreading-rendering in a game engine with CDouble buffer implementation].
 
 
 === Conclusion

+ 11 - 11
src/docs/asciidoc/jme3/advanced/nifty_gui.adoc

@@ -1,6 +1,6 @@
 = Creating JME3 User Interfaces with Nifty GUI
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: gui, documentation, nifty, hud
 :relfileprefix: ../../
@@ -9,14 +9,14 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-image::jme3/advanced/nifty-gui-13.png[nifty-gui-13.png,with="276",height="217",align="left"]
+image::jme3/advanced/nifty-gui-13.png[nifty-gui-13.png,width="276",height="217",align="left"]
 
 
-You may want your players to press a button to save a game, you want a scrolling text field for highscores, a text label to display the score, drop-downs to select keymap preferences, or checkboxes to specify multi-media options. Usually you solve these tasks by using Swing controls. Although it is possible to embed a <<jme3/advanced/swing_canvas#,jME3 canvas>> in a Swing +++<abbr title="Graphical User Interface">GUI</abbr>+++, a 3D game typically runs full-screen, or in a window of its own. 
+You may want your players to press a button to save a game, you want a scrolling text field for highscores, a text label to display the score, drop-downs to select keymap preferences, or checkboxes to specify multi-media options. Usually you solve these tasks by using Swing controls. Although it is possible to embed a <<jme3/advanced/swing_canvas#,jME3 canvas>> in a Swing +++<abbr title="Graphical User Interface">GUI</abbr>+++, a 3D game typically runs full-screen, or in a window of its own.
 
 This document introduces you to link:http://nifty-gui.lessvoid.com/[Nifty GUI], a Java library for building interactive graphical user interfaces (GUIs) for games or similar applications. Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ (the `de.lessvoid.nifty` package) is well integrated with jME3 through the `com.jme3.niftygui` package. You define the base +++<abbr title="Graphical User Interface">GUI</abbr>+++ layout in XML, and control it dynamically from your Java code. The necessary JAR libraries are included in your jME3 download, you do not need to install anything extra. (Just make sure they are on the classpath.)
 
-*  link:http://vimeo.com/25637085[Video demo of Nifty GUI 1.3] 
+*  link:http://vimeo.com/25637085[Video demo of Nifty GUI 1.3]
 
 
 == Tutorial Overview
@@ -38,7 +38,7 @@ Learn to add a Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ to
 
 == Must Know: Nifty GUI Concepts
 
-image:jme3/advanced/nifty-screen-layer-panel.png[nifty-screen-layer-panel.png,with="",height=""]
+image:jme3/advanced/nifty-screen-layer-panel.png[nifty-screen-layer-panel.png,width="",height=""]
 
 Nifty GUIs are made up of the following *elements*:
 
@@ -86,9 +86,9 @@ Learn more from the NiftyGUI page:
 *  link:http://nifty-gui.sourceforge.net/projects/1.3-SNAPSHOT/nifty/apidocs/index.html[Nifty 1.3 JavaDoc]
 *  link:http://nifty-gui.sourceforge.net/projects/1.3-SNAPSHOT/nifty-default-controls/apidocs/[Nifty 1.3 Controls JavaDoc]
 *  link:http://jmonkeyengine.org/groups/gui/forum/topic/anyone-succeeded-in-changing-text-in-nifty-programatically/#post-109510[Forum post: Changing Text in Nifty GUIs programmatically]
-*  link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:nifty_gui:editor[Official Nifty GUI Editor]
-*  link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:nifty_gui:new_editor[New Nifty GUI Editor]
-*  link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:nifty_gui:groovy[Nifty GUI with Groovy]
+*  <<jme3/advanced/nifty_gui/editor#,Official Nifty GUI Editor>>
+*  <<jme3/advanced/nifty_gui/new_editor#,New Nifty GUI Editor>>
+*  <<jme3/advanced/nifty_gui/groovy#,Nifty GUI with Groovy>>
 
 
 == Next Steps
@@ -107,7 +107,7 @@ If you want to disable the nifty log lines, add this code after you created nift
 [source]
 ----
 
-Logger.getLogger("de.lessvoid.nifty").setLevel(Level.SEVERE); 
-Logger.getLogger("NiftyInputEventHandlingLog").setLevel(Level.SEVERE); 
+Logger.getLogger("de.lessvoid.nifty").setLevel(Level.SEVERE);
+Logger.getLogger("NiftyInputEventHandlingLog").setLevel(Level.SEVERE);
 
 ----

+ 59 - 59
src/docs/asciidoc/jme3/advanced/nifty_gui_java_layout.adoc

@@ -1,6 +1,6 @@
 = Laying Out the GUI in Java
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: gui, documentation, nifty, hud
 :relfileprefix: ../../
@@ -31,12 +31,12 @@ Sample project
 
 
 
-Just so you get a quick picture what Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++'s Java Syntax looks like, here is the most basic example. It creates a screen with a layer and a panel that contains a button. 
+Just so you get a quick picture what Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++'s Java Syntax looks like, here is the most basic example. It creates a screen with a layer and a panel that contains a button.
 
 [source,java]
 ----
 package mygame;
- 
+
 import com.jme3.app.SimpleApplication;
 import com.jme3.niftygui.NiftyJmeDisplay;
 import de.lessvoid.nifty.Nifty;
@@ -47,15 +47,15 @@ import de.lessvoid.nifty.controls.button.builder.ButtonBuilder;
 import de.lessvoid.nifty.screen.DefaultScreenController;
 
 /**
- * @author iamcreasy  
+ * @author iamcreasy
 */
 public class Main extends SimpleApplication {
- 
+
     public static void main(String[] args) {
         Main app = new Main();
         app.start();
     }
- 
+
     @Override
     public void simpleInitApp() {
     NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
@@ -63,22 +63,22 @@ public class Main extends SimpleApplication {
     Nifty nifty = niftyDisplay.getNifty();
     guiViewPort.addProcessor(niftyDisplay);
     flyCam.setDragToRotate(true);
- 
+
     nifty.loadStyleFile("nifty-default-styles.xml");
     nifty.loadControlFile("nifty-default-controls.xml");
- 
+
     // <screen>
     nifty.addScreen("Screen_ID", new ScreenBuilder("Hello Nifty Screen"){{
-        controller(new DefaultScreenController()); // Screen properties       
- 
+        controller(new DefaultScreenController()); // Screen properties
+
         // <layer>
         layer(new LayerBuilder("Layer_ID") {{
             childLayoutVertical(); // layer properties, add more...
- 
+
             // <panel>
             panel(new PanelBuilder("Panel_ID") {{
-               childLayoutCenter(); // panel properties, add more...               
- 
+               childLayoutCenter(); // panel properties, add more...
+
                 // GUI elements
                 control(new ButtonBuilder("Button_ID", "Hello Nifty"){{
                     alignCenter();
@@ -86,16 +86,16 @@ public class Main extends SimpleApplication {
                     height("5%");
                     width("15%");
                 }});
- 
-                //.. add more GUI elements here              
- 
+
+                //.. add more GUI elements here
+
             }});
             // </panel>
           }});
         // </layer>
       }}.build(nifty));
     // </screen>
- 
+
     nifty.gotoScreen("Screen_ID"); // start the screen
     }
 }
@@ -105,7 +105,7 @@ public class Main extends SimpleApplication {
 == Implement Your GUI Layout
 
 
-image::jme3/advanced/gui-layout-draft.png[gui-layout-draft.png,with="",height="",align="right"]
+image::jme3/advanced/gui-layout-draft.png[gui-layout-draft.png,width="",height="",align="right"]
 
 
 In this tutorial, you recreate the same screen as in the Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ XML example.
@@ -124,7 +124,7 @@ nifty.addScreen("start", new ScreenBuilder("start"){{
     controller(new DefaultScreenController());
     // <!-- ... -->
   }}.build(nifty));
- 
+
 nifty.addScreen("hud", new ScreenBuilder("hud"){{
     controller(new DefaultScreenController());
     // <!-- ... -->
@@ -132,7 +132,7 @@ nifty.addScreen("hud", new ScreenBuilder("hud"){{
 
 ----
 
-Every Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ must have a start screen. The others (in this example, the HUD screen) are optional. 
+Every Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ must have a start screen. The others (in this example, the HUD screen) are optional.
 
 
 === Make Layers
@@ -144,27 +144,27 @@ The following Java code shows how we add layers to the start screen and HUD scre
 
 nifty.addScreen("start", new ScreenBuilder("start"){{
         controller(new DefaultScreenController());
- 
+
          // layer added
          layer(new LayerBuilder("background") {{
             childLayoutCenter();
-            backgroundColor("#000f");  
- 
+            backgroundColor("#000f");
+
             // <!-- ... -->
          }});
- 
+
          layer(new LayerBuilder("foreground") {{
                 childLayoutVertical();
-                backgroundColor("#0000");        
- 
+                backgroundColor("#0000");
+
             // <!-- ... -->
          }});
          // layer added
- 
+
       }}.build(nifty));
 ----
 
-Repeat the same, but use 
+Repeat the same, but use
 
 [source]
 ----
@@ -173,7 +173,7 @@ nifty.addScreen("hud", new ScreenBuilder("hud"){{
 
  for the HUD screen.
 
-In a layer, you can now add panels and arrange them. Panels are containers that mark the areas where you want to display text, images, or controls (buttons etc) later. 
+In a layer, you can now add panels and arrange them. Panels are containers that mark the areas where you want to display text, images, or controls (buttons etc) later.
 
 
 === Make Panels
@@ -194,7 +194,7 @@ A panel is the inner-most container (that will contain the actual content: text,
         layer(new LayerBuilder("foreground") {{
                 childLayoutVertical();
                 backgroundColor("#0000");
-                
+
             // panel added
             panel(new PanelBuilder("panel_top") {{
                 childLayoutCenter();
@@ -304,7 +304,7 @@ Try the sample. Remember to activate a screen using `nifty.gotoScreen(“start);
 The result should look as follows:
 
 
-image::jme3/advanced/nifty-gui-panels.png[nifty-gui-panels.png,with="",height="",align="center"]
+image::jme3/advanced/nifty-gui-panels.png[nifty-gui-panels.png,width="",height="",align="center"]
 
 
 
@@ -325,7 +325,7 @@ The start-background.png image is a fullscreen background picture. In the `start
         layer(new LayerBuilder("background") {{
             childLayoutCenter();
             backgroundColor("#000f");
-            
+
             // add image
             image(new ImageBuilder() {{
                 filename("Interface/tutorial/start-background.png");
@@ -345,7 +345,7 @@ The hud-frame.png image is a transparent frame that we use as HUD decoration. In
         layer(new LayerBuilder("background") {{
             childLayoutCenter();
             backgroundColor("#000f");
-            
+
             // add image
             image(new ImageBuilder() {{
                 filename("Interface/tutorial/hud-frame.png");
@@ -354,7 +354,7 @@ The hud-frame.png image is a transparent frame that we use as HUD decoration. In
         }});
 ----
 
-The face1.png image is an image that you want to use as a status icon. 
+The face1.png image is an image that you want to use as a status icon.
 In the `hud` screen's `foreground` layer, add the following image element:
 
 [source,java]
@@ -364,7 +364,7 @@ In the `hud` screen's `foreground` layer, add the following image element:
                     backgroundColor("#44f8");
                     height("15%");
                     width("100%");
-                    
+
                     // add image
                     image(new ImageBuilder() {{
                         filename("Interface/tutorial/face1.png");
@@ -373,7 +373,7 @@ In the `hud` screen's `foreground` layer, add the following image element:
                         height("50%");
                         width("30%");
                     }});
-                    
+
                 }});
 ----
 
@@ -394,7 +394,7 @@ The game title is a typical example of static text. In the `start` screen, add t
                 backgroundColor("#f008");
                 height("25%");
                 width("75%");
-                
+
                 // add text
                 text(new TextBuilder() {{
                     text("My Cool Game");
@@ -402,7 +402,7 @@ The game title is a typical example of static text. In the `start` screen, add t
                     height("100%");
                     width("100%");
                 }});
-                
+
             }});
 ----
 
@@ -457,11 +457,11 @@ In the `hud` screen's `foreground` layer, add the following text element:
                     backgroundColor("#00f8");
                     height("15%");
                     width("100%");
-                    
+
                     control(new LabelBuilder(){{
-                        color("#000"); 
-                        text("123"); 
-                        width("100%"); 
+                        color("#000");
+                        text("123");
+                        width("100%");
                         height("100%");
                     }});
 ----
@@ -482,7 +482,7 @@ Our +++<abbr title="Graphical User Interface">GUI</abbr>+++ plan asks for two bu
                     backgroundColor("#44f8");
                     height("50%");
                     width("50%");
-                    
+
                     // add control
                     control(new ButtonBuilder("StartButton", "Start") {{
                       alignCenter();
@@ -490,7 +490,7 @@ Our +++<abbr title="Graphical User Interface">GUI</abbr>+++ plan asks for two bu
                       height("50%");
                       width("50%");
                     }});
-                    
+
                 }});
 
                 panel(new PanelBuilder("panel_bottom_right") {{
@@ -521,12 +521,12 @@ Nifty additionally offers many customizable controls such as check boxes, text f
 
 == Intermediate Result
 
-When you preview this code in the jMonkeyEngine SDK, our tutorial demo should looks as follows: A start screen with two buttons, and a game screen with a simple HUD frame and a blue cube (which stands for any jME3 game content). 
+When you preview this code in the jMonkeyEngine SDK, our tutorial demo should looks as follows: A start screen with two buttons, and a game screen with a simple HUD frame and a blue cube (which stands for any jME3 game content).
 
 *Tip:* Remove all lines that set background colors, you only needed them to see the arrangement.
 
 
-image::jme3/advanced/nifty-gui-simple-demo.png[nifty-gui-simple-demo.png,with="",height="",align="center"]
+image::jme3/advanced/nifty-gui-simple-demo.png[nifty-gui-simple-demo.png,width="",height="",align="center"]
 
 
 
@@ -536,27 +536,27 @@ Before initializing the nifty screens, you set up properties and register media.
 [cols="2", options="header"]
 |===
 
-a| Nifty Method 
-a| Description 
+a| Nifty Method
+a| Description
 
-a| registerSound(“mysound, “Interface/abc.wav); 
-a| 
+a| registerSound(“mysound, “Interface/abc.wav);
+a|
 
-a| registerMusic(“mymusic, “Interface/xyz.ogg); 
-a| 
+a| registerMusic(“mymusic, “Interface/xyz.ogg);
+a|
 
-a| registerMouseCursor(“mypointer, “Interface/abc.png, 5, 4); 
-a| 
+a| registerMouseCursor(“mypointer, “Interface/abc.png, 5, 4);
+a|
 
-a| registerEffect(?); 
-a| ? 
+a| registerEffect(?);
+a| ?
 
 a| setDebugOptionPanelColors(true);
-a| Highlight all panels, makes it easier to arrange them. 
+a| Highlight all panels, makes it easier to arrange them.
 
 |===
 
-Example: 
+Example:
 
 [source,java]
 ----

+ 12 - 5
src/docs/asciidoc/jme3/advanced/nifty_gui_overlay.adoc

@@ -1,10 +1,11 @@
 = Integrating Nifty GUI: Overlay
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: gui, documentation, nifty, hud
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
@@ -15,7 +16,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 .  <<jme3/advanced/nifty_gui_java_interaction#,Interact with the GUI from Java>>
 
 
-image::jme3/advanced/nifty-gui-example.png[nifty-gui-example.png,with="300",height="200",align="left"]
+image::jme3/advanced/nifty-gui-example.png[nifty-gui-example.png,width="300",height="200",align="left"]
 
 
 Typically, you define a key (for example escape) that switches the +++<abbr title="Graphical User Interface">GUI</abbr>+++ on and off. The +++<abbr title="Graphical User Interface">GUI</abbr>+++ can be a StartScreen, OptionsScreen, CharacterCreationScreen, etc. While the +++<abbr title="Graphical User Interface">GUI</abbr>+++ is up, you pause the running game, and then overlay the +++<abbr title="Graphical User Interface">GUI</abbr>+++. You also must switch to a different set of user inputs while the game is paused, so the player can use the mouse pointer and keyboard to interact with the +++<abbr title="Graphical User Interface">GUI</abbr>+++.
@@ -26,7 +27,13 @@ On this page, we look at the overlay variant, which is more commonly used in gam
 
 == Sample Code
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/niftygui/TestNiftyGui.java[TestNiftyGui.java]
+
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/niftygui/TestNiftyGui.java[TestNiftyGui.java]
+
+[TIP]
+====
+The jme3-niftygui library is included in jMonkeyEngine. If you installed jMonkeyEngine using one of the link:https://jmonkeyengine.github.io/wiki/#install[optional methods], it will be added to your projects Library folder as part of the installation. If you're using the jMonkeyEngine SDK, you add it to any project by btn:[RMB] selecting your projects `Library` folder, choosing `menu:Add Library[jme-niftygui]` followed by `Add Library`.
+====
 
 
 == Overlaying the User Interface Over the Screen
@@ -57,7 +64,7 @@ Currently you do not have a ScreenController – we will create one in the next
 nifty.fromXml("Interface/helloworld.xml", "start", new MySettingsScreen());
 ----
 
-The `MySettingsScreen` class is a custom de.lessvoid.nifty.screen.ScreenController in which you will implement your +++<abbr title="Graphical User Interface">GUI</abbr>+++ behaviour. 
+The `MySettingsScreen` class is a custom de.lessvoid.nifty.screen.ScreenController in which you will implement your +++<abbr title="Graphical User Interface">GUI</abbr>+++ behaviour.
 
 If you have many screens or you want to keep them organized in separate files there is a method available that will just load an additional XML file. The content of the files are
 simply added to whatever XML data has been loaded before.

+ 6 - 6
src/docs/asciidoc/jme3/advanced/nifty_gui_projection.adoc

@@ -1,6 +1,6 @@
 = Integrating Nifty GUI: Projection
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: gui, documentation, nifty, hud, texture
 :relfileprefix: ../../
@@ -15,12 +15,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 .  <<jme3/advanced/nifty_gui_java_interaction#,Interact with the GUI from Java>>
 
 
-image::jme3/advanced/nifty-gui.png[nifty-gui.png,with="310",height="250",align="left"]
+image::jme3/advanced/nifty-gui.png[nifty-gui.png,width="310",height="250",align="left"]
 
 
-Typically you define a key (for example escape) to switch the +++<abbr title="Graphical User Interface">GUI</abbr>+++ on and off. Then you <<jme3/advanced/nifty_gui_overlay#,overlay>> the running game with the +++<abbr title="Graphical User Interface">GUI</abbr>+++ (you will most likely pause the game then). 
+Typically you define a key (for example escape) to switch the +++<abbr title="Graphical User Interface">GUI</abbr>+++ on and off. Then you <<jme3/advanced/nifty_gui_overlay#,overlay>> the running game with the +++<abbr title="Graphical User Interface">GUI</abbr>+++ (you will most likely pause the game then).
 
-Alternatively, you can also project the +++<abbr title="Graphical User Interface">GUI</abbr>+++ as a texture onto a mesh textures inside the game. Allthough this looks cool and “immersive, this approach is rarely used since it is difficult to record clicks this way. You can only interact with this projected +++<abbr title="Graphical User Interface">GUI</abbr>+++ by keyboard, or programmatically. You can select input fields using the arrow keys, and trigger actions using the return key. 
+Alternatively, you can also project the +++<abbr title="Graphical User Interface">GUI</abbr>+++ as a texture onto a mesh textures inside the game. Allthough this looks cool and “immersive, this approach is rarely used since it is difficult to record clicks this way. You can only interact with this projected +++<abbr title="Graphical User Interface">GUI</abbr>+++ by keyboard, or programmatically. You can select input fields using the arrow keys, and trigger actions using the return key.
 
 This +++<abbr title="Graphical User Interface">GUI</abbr>+++ projection variant is less commonly used than the +++<abbr title="Graphical User Interface">GUI</abbr>+++ overlay variant. Usecases for +++<abbr title="Graphical User Interface">GUI</abbr>+++ projection are, for example, a player avatar using an in-game computer screen.
 
@@ -32,7 +32,7 @@ This +++<abbr title="Graphical User Interface">GUI</abbr>+++ projection variant
 
 == Projecting the User Interface Onto a Texture
 
-You can project the Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ onto a texture, load the texture into a material, and assign it to a Geometry (Quads or Boxes are best). 
+You can project the Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ onto a texture, load the texture into a material, and assign it to a Geometry (Quads or Boxes are best).
 
 [source,java]
 ----

+ 35 - 35
src/docs/asciidoc/jme3/advanced/nifty_gui_xml_layout.adoc

@@ -1,6 +1,6 @@
 = Laying out the GUI in XML
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: gui, documentation, nifty, hud
 :relfileprefix: ../../
@@ -20,7 +20,7 @@ You can “draw the +++<abbr title="Graphical User Interface">GUI</abbr>+++ to t
 == Plan Your GUI Layout
 
 
-image::jme3/advanced/gui-layout-draft.png[gui-layout-draft.png,with="",height="",align="right"]
+image::jme3/advanced/gui-layout-draft.png[gui-layout-draft.png,width="",height="",align="right"]
 
 
 In this tutorial, you want to create two game screens: An out-of-game StartScreen that the players see before the game starts; and an in-game link:http://en.wikipedia.org/wiki/HUD_%28video_gaming%29[HUD] that displays info during the game. Before writing code, you plan the +++<abbr title="Graphical User Interface">GUI</abbr>+++ layout, either on paper or in a graphic application.
@@ -28,9 +28,9 @@ In this tutorial, you want to create two game screens: An out-of-game StartScree
 The StartScreen contains:
 
 *  The background layer has a centered layout and contains an image.
-*  The top layer has a vertical layout, containing 3 panels: 
-**  The top panel contains a label with the game title, 
-**  The middle panel contains a text field with the game description. 
+*  The top layer has a vertical layout, containing 3 panels:
+**  The top panel contains a label with the game title,
+**  The middle panel contains a text field with the game description.
 **  The bottom panel has a horizontal layout and contains two more panels:
 ***  The left panel contains a Start button.
 ***  The right panel contains a Quit button.
@@ -40,7 +40,7 @@ The StartScreen contains:
 The HUD contains:
 
 *  The background layer has a centered layout, and contains the partially transparent HUD image.
-*  The top layer has a horizontal layout, containing 2 panels: 
+*  The top layer has a horizontal layout, containing 2 panels:
 **  The left panel as transparent spacer.
 **  The right panel has a vertical layout containing 2 panels, a label and an image.
 
@@ -49,7 +49,7 @@ The HUD contains:
 == Implement Your GUI Layout
 
 
-image::jme3/advanced/nifty-screen-layer-panel.png[nifty-screen-layer-panel.png,with="366",height="136",align="right"]
+image::jme3/advanced/nifty-screen-layer-panel.png[nifty-screen-layer-panel.png,width="366",height="136",align="right"]
 
 
 Create an empty *screen*.xml file in the `assets/Interface/` directory of your project. ( Rightclick on Interface → New → Other… → +++<abbr title="Graphical User Interface">GUI</abbr>+++ → Empty NiftyGui file)
@@ -78,7 +78,7 @@ The following minimal XML file contains a start screen and a HUD screen. (Neithe
 
 ----
 
-Every Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ must have a start screen. The others (in this example, the HUD screen) are optional. 
+Every Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ must have a start screen. The others (in this example, the HUD screen) are optional.
 
 *Note:* In the following examples, the XML schema header is abbreviated to just `&lt;nifty&gt;`.
 
@@ -112,7 +112,7 @@ Delete all from the file and add following code:
 
 ----
 
-In a layer, you can now add panels and arrange them. Panels are containers that mark the areas where you want to display text, images, or controls (buttons etc) later. 
+In a layer, you can now add panels and arrange them. Panels are containers that mark the areas where you want to display text, images, or controls (buttons etc) later.
 
 
 === Make Panels
@@ -123,18 +123,18 @@ A panel is the inner-most container (that will contain the actual content: text,
 ----
 
       <panel id="panel_top" height="25%" width="75%" align="center" childLayout="center"
-             backgroundColor="#f008">  
+             backgroundColor="#f008">
       </panel>
       <panel id="panel_mid" height="50%" width="75%" align="center" childLayout="center"
-             backgroundColor="#0f08">  
+             backgroundColor="#0f08">
       </panel>
       <panel id="panel_bottom" height="25%" width="75%" align="center" childLayout="horizontal"
-             backgroundColor="#00f8">  
-        <panel id="panel_bottom_left" height="50%" width="50%" valign="center" childLayout="center" 
-             backgroundColor="#44f8">  
+             backgroundColor="#00f8">
+        <panel id="panel_bottom_left" height="50%" width="50%" valign="center" childLayout="center"
+             backgroundColor="#44f8">
         </panel>
         <panel id="panel_bottom_right" height="50%" width="50%" valign="center" childLayout="center"
-             backgroundColor="#88f8">  
+             backgroundColor="#88f8">
         </panel>
       </panel>
 
@@ -145,20 +145,20 @@ The following panels go into in the `hud` screen's `foreground` layer:
 [source,xml]
 ----
 
-      <panel id="panel_left" width="80%" height="100%" childLayout="vertical" 
-      backgroundColor="#0f08">  
+      <panel id="panel_left" width="80%" height="100%" childLayout="vertical"
+      backgroundColor="#0f08">
         <!-- spacer -->
       </panel>
-      <panel id="panel_right" width="20%" height="100%" childLayout="vertical" 
-      backgroundColor="#00f8" >  
+      <panel id="panel_right" width="20%" height="100%" childLayout="vertical"
+      backgroundColor="#00f8" >
         <panel id="panel_top_right1" width="100%" height="15%" childLayout="center"
-             backgroundColor="#00f8">  
+             backgroundColor="#00f8">
         </panel>
         <panel id="panel_top_right2" width="100%" height="15%" childLayout="center"
-             backgroundColor="#44f8">  
+             backgroundColor="#44f8">
         </panel>
         <panel id="panel_bot_right" width="100%" height="70%" valign="center"
-             backgroundColor="#88f8">  
+             backgroundColor="#88f8">
         </panel>
       </panel>
 
@@ -167,7 +167,7 @@ The following panels go into in the `hud` screen's `foreground` layer:
 The result should look as follows:
 
 
-image::jme3/advanced/nifty-gui-panels.png[nifty-gui-panels.png,with="",height="",align="center"]
+image::jme3/advanced/nifty-gui-panels.png[nifty-gui-panels.png,width="",height="",align="center"]
 
 
 
@@ -219,7 +219,7 @@ In the `hud` screen's `foreground` layer, add the following image element:
 
         <panel id="panel_top_right2" width="100%" height="15%" childLayout="center">
             <image filename="Interface/face1.png" valign="center" align="center" height="50%" width="30%" >
-            </image>  
+            </image>
         </panel>
 
 ----
@@ -234,7 +234,7 @@ The game title is a typical example of static text. In the `start` screen, add t
 [source,xml]
 ----
 
-      <panel id="panel_top" height="25%" width="75%" align="center" childLayout="center">  
+      <panel id="panel_top" height="25%" width="75%" align="center" childLayout="center">
           <text text="My Cool Game" font="Interface/Fonts/Default.fnt" width="100%" height="100%" />
       </panel>
 
@@ -245,9 +245,9 @@ For longer pieces of static text, such as an introduction, you can use wrap=“t
 [source,xml]
 ----
 
-      <panel id="panel_mid" height="50%" width="75%" align="center" childLayout="center">       
-        <text text="Here goes some text describing the game and the rules and stuff. Incidentally, 
-         the text is quite long and needs to wrap at the end of lines. ..." 
+      <panel id="panel_mid" height="50%" width="75%" align="center" childLayout="center">
+        <text text="Here goes some text describing the game and the rules and stuff. Incidentally,
+         the text is quite long and needs to wrap at the end of lines. ..."
         font="Interface/Fonts/Default.fnt" width="100%" height="100%" wrap="true" />
       </panel>
 
@@ -280,7 +280,7 @@ In the `hud` screen's `foreground` layer, add the following text element:
 [source,xml]
 ----
 
-        <panel id="panel_top_right" height="100%" width="15%" childLayout="center">  
+        <panel id="panel_top_right" height="100%" width="15%" childLayout="center">
             <control name="label" color="#000" text="123" width="100%" height="100%" />
         </panel>
 
@@ -296,12 +296,12 @@ Our +++<abbr title="Graphical User Interface">GUI</abbr>+++ plan asks for two bu
 [source,xml]
 ----
 
-        <panel id="panel_bottom_left" height="50%" width="50%" valign="center" childLayout="center">  
-          <control name="button" label="Start" id="StartButton" align="center" valign="center"> 
+        <panel id="panel_bottom_left" height="50%" width="50%" valign="center" childLayout="center">
+          <control name="button" label="Start" id="StartButton" align="center" valign="center">
           </control>
         </panel>
-        <panel id="panel_bottom_right" height="50%" width="50%" valign="center" childLayout="center">  
-          <control name="button" label="Quit" id="QuitButton" align="center" valign="center"> 
+        <panel id="panel_bottom_right" height="50%" width="50%" valign="center" childLayout="center">
+          <control name="button" label="Quit" id="QuitButton" align="center" valign="center">
           </control>
         </panel>
 
@@ -373,7 +373,7 @@ Nifty additionally offers many customizable controls such as check boxes, text f
 When you preview this code in the jMonkeyEngine SDK, our tutorial demo should looks as follows: A start screen with two buttons, and a game screen with a simple HUD frame and a blue cube (which stands for any jME3 game content).
 
 
-image::jme3/advanced/nifty-gui-simple-demo.png[nifty-gui-simple-demo.png,with="",height="",align="center"]
+image::jme3/advanced/nifty-gui-simple-demo.png[nifty-gui-simple-demo.png,width="",height="",align="center"]
 
 
 Compare this result with the layout draft above.

+ 23 - 19
src/docs/asciidoc/jme3/advanced/ogrecompatibility.adoc

@@ -1,6 +1,6 @@
 = Working Blender and OgreXML Versions
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -11,25 +11,29 @@ Here you can find working combinations of Blender and the OgreXML exporter, with
 [cols="3", options="header"]
 |===
 
-a| Blender Version 
-a| OgreXML Exporter Version 
-a| Notes 
+a| Blender Version
+a| OgreXML Exporter Version
+a| Notes
 
-a| 2.6.3 
-a| link:http://code.google.com/p/blender2ogre/downloads/list[0.5.8] 
-a| Root bone, no transforms on object, no envelopes 
+a|2.78
+a| link:http://code.google.com/p/blender2ogre/downloads/list[0.6.0]
+a|Root bone, no transforms on object, no envelopes
 
-a| 2.6.2 
-a| link:http://code.google.com/p/blender2ogre/downloads/list[0.5.5] 
-a| Root bone, no transforms on object, no envelopes 
+a| 2.6.3
+a| link:http://code.google.com/p/blender2ogre/downloads/list[0.5.8]
+a| Root bone, no transforms on object, no envelopes
 
-a| 2.6.1 
-a| ? 
-<a|  
+a| 2.6.2
+a| link:http://code.google.com/p/blender2ogre/downloads/list[0.5.5]
+a| Root bone, no transforms on object, no envelopes
 
-a| 2.6.0 
-a| ? 
-<a|  
+a| 2.6.1
+a| ?
+<a|
+
+a| 2.6.0
+a| ?
+<a|
 
 |===
 
@@ -46,8 +50,8 @@ Tips for exporting animations through OgreXML correctly:
 
 Test Character - link:http://dl.dropbox.com/u/26887202/123/jme_blender/characterOgre26.zip[http://dl.dropbox.com/u/26887202/123/jme_blender/characterOgre26.zip]
 
-image:jme3/advanced/ogre_solved.jpg[ogre_solved.jpg,with="",height=""]
-image:jme3/advanced/ogre_solved2.png[ogre_solved2.png,with="",height=""]
+image:jme3/advanced/ogre_solved.jpg[ogre_solved.jpg,width="",height=""]
+image:jme3/advanced/ogre_solved2.png[ogre_solved2.png,width="",height=""]
 
 
 == Troubleshooting

+ 3 - 3
src/docs/asciidoc/jme3/advanced/open_game_finder.adoc

@@ -1,6 +1,6 @@
 = Open Game Finder
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: network
 :relfileprefix: ../../
@@ -52,7 +52,7 @@ The server is now running and ready to accept connections. +
 
 A client is now running, connects to the server, and displays a registration/login window.
 
-image::jme3/advanced/open-game-finder-1.png[open-game-finder-1.png,with="",height="",align="center"]
+image::jme3/advanced/open-game-finder-1.png[open-game-finder-1.png,width="",height="",align="center"]
 
 *Note:* You can run several clients on localhost for testing.
 

+ 130 - 104
src/docs/asciidoc/jme3/advanced/particle_emitters.adoc

@@ -1,15 +1,18 @@
 = Particle Emmitter Settings
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, effect
 :relfileprefix: ../../
 :imagesdir: ../..
+:uri-jmonkeyengine: https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/
+:img-jmonkeyengine: https://github.com/jMonkeyEngine/jmonkeyengine/raw/master/
+:uri-forum: https://hub.jmonkeyengine.org/
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 You cannot create a 3D model for delicate things like fire, smoke, or explosions. Particle Emitters are quite an efficient solution to create these kinds of effects: The emitter renders a series of flat orthogonal images and manipulates them in a way that creates the illusion of a anything from a delicate smoke cloud to individual flames, etc.
-Creating an effect involves some trial and error to get the settings _just right_, and it's worth exploring the expressiveness of the options described below. 
+Creating an effect involves some trial and error to get the settings _just right_, and it's worth exploring the expressiveness of the options described below.
 
 
 [TIP]
@@ -18,32 +21,36 @@ Use the <<sdk/scene_explorer#,Scene Explorer>> in the <<sdk#,SDK>> to design and
 ====
 
 
-image:jme3/advanced/explosion-5.png[explosion-5.png,with="150",height="100"]  image:jme3/advanced/particle.png[particle.png,with="150",height="100"]  image:jme3/beginner/beginner-effect-fire.png[beginner-effect-fire.png,with="150",height="100"] image:jme3/advanced/butterfly-particle-emitter.png[butterfly-particle-emitter.png,with="150",height="100"]
+image:jme3/advanced/explosion-5.png[explosion-5.png,width="150",height="100"]  image:jme3/advanced/particle.png[particle.png,width="150",height="100"]  image:jme3/beginner/beginner-effect-fire.png[beginner-effect-fire.png,width="150",height="100"] image:jme3/advanced/butterfly-particle-emitter.png[butterfly-particle-emitter.png,width="150",height="100"]
 
 
 == Create an Emitter
 
-.  Create one emitter for each effect: 
+.  Create one emitter for each effect:
++
 [source,java]
 ----
 ParticleEmitter explosion = new ParticleEmitter(
 "My explosion effect", Type.Triangle, 30);
 ----
 
-.  Attach the emitter to the rootNode and position it in the scene: 
+.  Attach the emitter to the rootNode and position it in the scene:
++
 [source,java]
 ----
 rootNode.attachChild(explosion);
 explosion.setLocalTranslation(bomb.getLocalTranslation());
 ----
 
-.  Trigger the effect by calling 
+.  Trigger the effect by calling
++
 [source,java]
 ----
 explosion.emitAllParticles()
 ----
 
-.  End the effect by calling 
+.  End the effect by calling
++
 [source,java]
 ----
 explosion.killAllParticles()
@@ -59,75 +66,90 @@ Choose one of the following mesh shapes
 == Configure Parameters
 
 Not all of these parameters are required for all kinds of effects. If you don't specify one of them, a default value will be used.
-[cols="4", options="header"]
+[cols="15,25,20,40", options="header"]
 |===
 
-<a| Parameter           
-<a| Method                
-a| Default 
-a| Description 
-
-<a| number              
-a| `setNumParticles()` 
-<a|  
-a| The maximum number of particles visible at the same time. Specified by user in constructor. 
-
-<a| emission rate       
-a| `setParticlesPerSec()` 
-a| 20 
-a| Density of the effect, how many new particles are emitted per second. +Set to zero to control the start/end of the effect. +Set to a number for a constantly running effect. 
-
-<a| size                
-a| `setStartSize()`, `setEndSize()` 
-a| 0.2f, 2f 
-a| The radius of the scaled sprite image. Set both to same value for constant size effect. +Set to different values for shrink/grow effect. 
-
-<a| color               
-a| `setStartColor()`, `setEndColor()` 
-a| gray 
-a| Controls how the opaque (non-black) parts of the texture are colorized. +Set both to the same color for single-colored effects (e.g. fog, debris). +Set both to different colors for a gradient effect (e.g. fire). 
-
-<a| direction/velocity  
-a| `getParticleInfluencer(). setInitialVelocity(initialVelocity)` 
-a| Vector3f(0,0,0) 
-a| A vector specifying the initial direction and speed of particles. The longer the vector, the faster. 
-
-<a| fanning out         
-a| `getParticleInfluencer(). setVelocityVariation(variation)` 
-a| 0.2f 
-a| How much the direction (`setInitialVelocity()`) can vary among particles. Use a value between 1 and 0 to create a directed swarm-like cloud of particles. +1 = Maximum variation, particles emit in random 360° directions (e.g. explosion, butterflies). +0.5f = particles are emitted within 180° of the initial direction. +0 = No variation, particles fly in a straight line in direction of start velocity (e.g. lasergun blasts). 
-
-a| direction +(pick one)
-a| `setFacingVelocity()` 
-a| false 
-a| true = Flying particles pitch in the direction they're flying (e.g. missiles). +false = Particles keep flying rotated the way they started (e.g. debris). 
-
-a| direction +(pick one)
-a| `setFaceNormal()` 
-a| Vector3f.NAN 
-a| Vector3f = Flying particles face in the given direction (e.g. horizontal shockwave faces up = Vector3f.UNIT_Y). +Vector3f.NAN = Flying particles face the camera. 
-
-<a| lifetime  
-a| `setLowLife()`, `setHighLife()` 
-a| 3f, 7f 
-a| The time period before a particle fades is set to a random value between minimum and maximum; minimum must be smaller than maximum. A minimum &lt; 1f makes the effect more busy, a higher minimum looks more steady. Use a maximum &lt; 1f for short bursts, and higher maxima for long lasting swarms or smoke. Set maximum and minimum to similar values to create an evenly spaced effect (e.g. fountain), set the to very different values to create a distorted effect (e.g. fire with individual long flames). 
-
-<a| spinning          
-a| `setRotateSpeed()` 
-a| 0f 
-a| 0 = Flying particles don't spin while flying (e.g. smoke, insects, controlled projectiles). +&gt; 0 = How fast particle spins while flying (e.g. debris, shuriken, missiles out of control). 
-
-<a| rotation          
-a| `setRandomAngle()` 
-a| false 
-a| true = The particle sprite is rotated at a random angle when it is emitted (e.g. explosion, debris). +false = Particles fly straight like you drew them in the sprite texture (e.g. insects). 
-
-<a| gravity           
-a| `setGravity()` 
-a| Vector3f(0.0f,0.1f,0.0f) 
-a| Particles fall in the direction of the vector (e.g. debris, sparks). +(0,0,0) = Particles keep flying in start direction (e.g. flames, zero-gravity explosion.) 
-
-<a| start area        
+<a| Parameter
+<a| Method
+a| Default
+a| Description
+
+<a| number
+a| `setNumParticles()`
+<a|
+a| The maximum number of particles visible at the same time. Specified by user in constructor.
+
+<a| emission rate
+a| `setParticlesPerSec()`
+a| 20
+a| Density of the effect, how many new particles are emitted per second. +
+Set to zero to control the start/end of the effect. +
+Set to a number for a constantly running effect.
+
+<a| size
+a| `setStartSize()`, `setEndSize()`
+a| 0.2f, 2f
+a| The radius of the scaled sprite image. Set both to same value for constant size effect. +
+Set to different values for shrink/grow effect.
+
+<a| color
+a| `setStartColor()`, `setEndColor()`
+a| gray
+a| Controls how the opaque (non-black) parts of the texture are colorized. +
+Set both to the same color for single-colored effects (e.g. fog, debris). +
+Set both to different colors for a gradient effect (e.g. fire).
+
+<a| direction/velocity
+a| `getParticleInfluencer(). setInitialVelocity(initialVelocity)`
+a| Vector3f(0,0,0)
+a| A vector specifying the initial direction and speed of particles. The longer the vector, the faster.
+
+<a| fanning out
+a| `getParticleInfluencer(). setVelocityVariation(variation)`
+a| 0.2f
+a| How much the direction (`setInitialVelocity()`) can vary among particles. Use a value between 1 and 0 to create a directed swarm-like cloud of particles. +
+1 = Maximum variation, particles emit in random 360° directions (e.g. explosion, butterflies). +
+0.5f = particles are emitted within 180° of the initial direction. +
+0 = No variation, particles fly in a straight line in direction of start velocity (e.g. lasergun blasts).
+
+a| direction +
+(pick one)
+a| `setFacingVelocity()`
+a| false
+a| true = Flying particles pitch in the direction they're flying (e.g. missiles). +
+false = Particles keep flying rotated the way they started (e.g. debris).
+
+a| direction +
+(pick one)
+a| `setFaceNormal()`
+a| Vector3f.NAN
+a| Vector3f = Flying particles face in the given direction (e.g. horizontal shockwave faces up = Vector3f.UNIT_Y). +
+Vector3f.NAN = Flying particles face the camera.
+
+<a| lifetime
+a| `setLowLife()`, `setHighLife()`
+a| 3f, 7f
+a| The time period before a particle fades is set to a random value between minimum and maximum; minimum must be smaller than maximum. A minimum &lt; 1f makes the effect more busy, a higher minimum looks more steady. Use a maximum &lt; 1f for short bursts, and higher maxima for long lasting swarms or smoke. Set maximum and minimum to similar values to create an evenly spaced effect (e.g. fountain), set the to very different values to create a distorted effect (e.g. fire with individual long flames).
+
+<a| spinning
+a| `setRotateSpeed()`
+a| 0f
+a| 0 = Flying particles don't spin while flying (e.g. smoke, insects, controlled projectiles). +
+&gt; 0 = How fast particle spins while flying (e.g. debris, shuriken, missiles out of control).
+
+<a| rotation
+a| `setRandomAngle()`
+a| false
+a| true = The particle sprite is rotated at a random angle when it is emitted (e.g. explosion, debris). +
+false = Particles fly straight like you drew them in the sprite texture (e.g. insects).
+
+<a| gravity
+a| `setGravity()`
+a| Vector3f(0.0f,0.1f,0.0f)
+a| Particles fall in the direction of the vector (e.g. debris, sparks). +
+(0,0,0) = Particles keep flying in start direction (e.g. flames, zero-gravity explosion.)
+
+<a| start area
 a|`setShape(new EmitterSphereShape( Vector3f.ZERO, 2f));`
 a|EmitterPointShape()
 a|By default, particles are emitted from the emitters location (a point). You can increase the emitter shape to occupy a sphere, so that the start point of new particles can be anywhere inside the sphere, which makes the effect a bit more irregular.
@@ -140,7 +162,7 @@ Build up you effect by specifying one parameter after the other. If you change s
 == Create an Effect Material
 
 
-image::http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/flash.png[flash.png,with="128",height="128",align="right"]
+image::{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/flash.png[flash.png,width="128",height="128",align="right"]
 
 
 Use the common Particle.j3md Material Definition and a texture to specify the shape of the particles. The shape is defined by the texture you provide and can be anything – debris, flames, smoke, mosquitoes, leaves, butterflies… be creative.
@@ -174,45 +196,48 @@ The following effect textures are available by default from `test-data.jar`. You
 [cols="3", options="header"]
 |===
 
-<a| Texture Path                     
-a| Dimension 
-a| Preview 
+<a| Texture Path
+a| Dimension
+a| Preview
 
-<a| Effects/Explosion/Debris.png     
-<a| 3*3  
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/Debris.png[Debris.png,with="32",height="32"] 
+<a| Effects/Explosion/Debris.png
+<a| 3*3
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/Debris.png[Debris.png,width="32",height="32"]
 
-<a| Effects/Explosion/flame.png      
-<a| 2*2  
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/flame.png[flame.png,with="32",height="32"] 
+<a| Effects/Explosion/flame.png
+<a| 2*2
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/flame.png[flame.png,width="32",height="32"]
 
-<a| Effects/Explosion/flash.png      
-<a| 2*2  
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/flash.png[flash.png,with="32",height="32"] 
+<a| Effects/Explosion/flash.png
+<a| 2*2
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/flash.png[flash.png,width="32",height="32"]
 
-a| Effects/Explosion/roundspark.png 
-<a| 1*1  
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/roundspark.png[roundspark.png,with="32",height="32"] 
+a| Effects/Explosion/roundspark.png
+<a| 1*1
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/roundspark.png[roundspark.png,width="32",height="32"]
 
-<a| Effects/Explosion/shockwave.png  
-<a| 1*1  
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/shockwave.png[shockwave.png,with="32",height="32"] 
+<a| Effects/Explosion/shockwave.png
+<a| 1*1
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/flame.png[shockwave.png,width="32",height="32"]
 
-a| Effects/Explosion/smoketrail.png 
-<a| 1*3  
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/smoketrail.png[smoketrail.png,with="32",height="32"] 
+a| Effects/Explosion/smoketrail.png
+<a| 1*3
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/smoketrail.png[smoketrail.png,width="32",height="32"]
 
-<a| Effects/Explosion/spark.png      
-<a| 1*1  
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Explosion/spark.png[spark.png,with="32",height="32"] 
+<a| Effects/Explosion/spark.png
+<a| 1*1
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Explosion/spark.png[spark.png,width="32",height="32"]
 
-<a| Effects/Smoke/Smoke.png          
-a| 1*15 
-a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/Smoke/Smoke.png[Smoke.png,with="96",height="32"] 
+<a| Effects/Smoke/Smoke.png
+a| 1*15
+a| image:{img-jmonkeyengine}jme3-testdata/src/main/resources/Effects/Smoke/Smoke.png[Smoke.png,width="96",height="32"] 
 
 |===
 
-*Tip:* Use the `setStartColor()`/`setEndColor()` settings described above to colorize the white and gray parts of textures.
+[TIP]
+====
+Use the `setStartColor()`/`setEndColor()` settings described above to colorize the white and gray parts of textures.
+====
 
 
 == Usage Example
@@ -239,6 +264,7 @@ a| image:http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Effects/
 ----
 
 Browse the full source code of all link:https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-examples/src/main/java/jme3test/effect[effect examples] here.
+
 '''
 
 See also: <<jme3/advanced/effects_overview#,Effects Overview>>

+ 128 - 0
src/docs/asciidoc/jme3/advanced/pbr_part1.adoc

@@ -0,0 +1,128 @@
+= Physically Based Rendering – Part one
+
+I’ve been looking at Physically Based Rendering (PBR from now on) since a few weeks, because that’s what all the cool kids are talking about these days. I read almost all the interweb about it and finally somehow wrapped my head around the mechanics behind the concept.
+
+None of the papers I read gave me the epiphany though, the understanding came little by little, literally reading some of the papers 10 times.
+
+The intent of this series of posts is first to brush up the concept of PBR from the artist point of view (the easy part :D), and then to explain the physical concepts behind it and what you have to understand as a developer.
+
+This paper aims to present PBR as I would explain it to my mother. You shouldn’t need a degree in image rendering theories, neither should you need to be a genius to understand what’s coming.
+
+There are a lot of papers out there, with a lot of complicated words and equations, that assume a solid background knowledge of image rendering, lighting, shading etc…
+
+I won’t assume this here.
+
+Of course, I’d like this to be as accurate as possible, so if you have more information, or if explanations are not clear, feel free to chime in.
+
+*I’m an artist, I want to know what PBR is :*
+
+So you’re an artist, and have some experience in making assets for games. The most commonly used model for describing a material is the Phong reflection model (from link:https://en.wikipedia.org/wiki/Bui_Tuong_Phong[Bui Tuong Phong], a clever guy that died very young).
+
+This model describes how light reflects on a material by splitting it in 3 factors: Ambient color, Diffuse color, Specular color. This should sound familiar to 3D game artists.
+
+This model is a very rough approximation of what’s really going on when light hit a surface of a real life material, but until then it was pretty much enough for a video game. Of course there are dozens of other models and even modification of Phong model, but this one is the most used, and that’s the one we use in jMonkeyEngine.
+
+The issue with this model is that it’s complicated to have a material that looks consistent under different lighting environment.
+
+   * Ambient is supposed to represent Ambient lighting, being some sort of omnipresent dim light, that tries to fake indirect lighting coming from reflection of light on the surrounding objects.
+   * Diffuse is more straightforward: it’s the actual color of the object when it’s under a white light.
+   * Specular represent the color of the reflected highlights, and the intensity is driven by a “shininess” parameter (at least in jME but that’s pretty common). The issue is that the specular color also drives the intensity because the brighter the color the more intense the specular will be.
+
+All of this leads to a lot of tweaking to look correct, and may not look as good as it should under a different lighting environment. It also relies heavily on an artist’s best guesses about the material.
+
+So here comes Physically Based Rendering. Not that the previous one was not physically based…but whatever, that sounds pretty cool.
+
+Everybody has their own way to implement PBR, but every implementation share common goals and concepts.
+
+*Goals :*
+
+   * Ease the artist’s material workflow.
+   * More “photo realistic” rendering.
+
+*Concepts :*
+
+   * Every surface has a reflection (specular); even the rougher ones at grazing angles.
+   * Energy conservation: a surface cannot reflect more light that it has received.
+
+This wraps up the entire concept but how does it translate in practice?
+
+A material can now be described with 3 parameters :
+
+*Base color :* Base color is the raw color of the material, it’s also often referred as the Albedo. It’s similar to the Diffuse color you know from Phong model, but with some crucial differences :
+
+   * It should not contain any shading information. Very often with phong model, Ambient Occlusion (AO) is baked into the diffuse map. Here Base color must be the raw color of the material
+   * It does not only influence the diffuse color, but also the specular color of the material.
+
+*Metalness :* The degree of metallicity of the material. What does that mean? is your material rather metallic or rather not (non metallic materials are called dielectric materials in the literature). Some implementation calls that parameter “specular”, but I found it pretty misleading as it’s completely different as the specular we know today. In practice, just start out with extreme values to get the feel for it: 1 for metallic, 0 for dielectric.
+
+image::metalness.png[metalness,width="320",height="250",align="center"]
+Here is the same material with metalness of 0 (dielectric) on the left and 1 (metallic) on the right.
+
+Of course there are intermediary values, but from my reading, most dielectric material should vary from 0.04 and 0.1, and metallic are usually 1. Those values are based on real life measures and you can find some references about them link:https://seblagarde.wordpress.com/2012/04/30/dontnod-specular-and-glossiness-chart/[here] and link:https://seblagarde.wordpress.com/2014/04/14/dontnod-physically-based-rendering-chart-for-unreal-engine-4/[here]. Note that those values are not subject to interpretation, and are “known” factors and artist may follow them if they want to keep realistic look.
+
+*Roughness :* The degree of roughness of the material : Is your material smooth or rough. 0 means smooth, 1 means rough. Some implementations refer to this as Smoothness or Glossiness. That’s essentially the same except it’s the other way around. 1 is smooth and 0 is rough. I find the term “Roughness” pretty much self explanatory and doesn’t leave room for misinterpretation.
+
+image::Roughness.png[Roughness,width="320",height="250",align="center"]
+Here is the same material with different level of roughness from 0 (left) to 1 (right). As opposed to metalness, this parameter is very artist driven. The roughness of a material does not really depend on physics, it’s more related to micro scratches, wearing, etc… So that’s where artists should be creative!
+
+These parameters are the basics of PBR. Of course, each of them can be stored in a texture, and more common additional parameters can be used.
+
+*For example :*
+
+   * Normal map : the same as with phong model.
+   * AO map : since we can’t bake AO in diffuse anymore, it’s now an extra channel.
+
+The nice thing is that Metalness, Roughness and AO are grey scaled textures, so basically they only use one channel of a texture. So you can pack those 3 maps in one texture.
+
+You can find an example asset that should work in a typical PBR implementation here. This page showcases pretty well what the textures should look like.
+
+That’s it for PBR from the artist point of view. Next week I’ll explain what’s under the hood for you fellow developers 😉
+
+*Updates (01/01/2015)*
+
+Since this post I had some discussions about it and it appears, it lacks some informations about the different art pipeline you may come across, the differences and what to expect from them.
+
+The post above is about the *Metalness Workflow*.
+
+The question I had frequently about it is “how one specify the specular color if you just have a black and white metalness texture?”.
+
+The answer is you do in the albedo map.
+
+In the metalness workflow the albedo map is used for both diffuse color and specular color. When the metalness is zero (dielectric material) the base color is the diffuse color of the material. When the metalness is one (metallic material), the base color is the specular color.
+
+So if you wonder what this base color should be, just look at it in the most naive way. “What color is that thing?” and don’t care if that’s diffuse or specular.
+
+The other common workflow is called the *Specular workflow* as it uses a specular color map instead of the metalness map. In this workflow, the albedo map is the diffuse color, the specular map is the specular color, and you have a gray scale gloss map that is the same as the roughness map but inverted (1 is smooth and 0 is rough).
+
+Now there are pro and cons on using one or the other. Here are the main points :
+
+== Metalness workflow :
+
+*Pros*
+
+   * Use less texture space. Albedo map is an rgba map, metal and roughness can be packed in another rgba map and you have 2 additional channels for whatever you want (AO, cavity, …w/e)
+
+   * Harder to make implausible materials (some may see this as a con thought). it’s not more physically accurate, but you’re sure to follow the energy conservation paradigm.
+   * Easier color concept : base color is the color of the material.
+
+*Cons*
+
+   * May produce some white artifacts at the junction between metal and non metal
+   * Harder to make implausible materials, not impossible though.
+
+== Specular workflow
+
+*Pros*
+
+   * Closer to the current phong workflow : diffuse map, specular map. Must be easier for seasoned artists to transition to PBR.
+
+*Cons*
+
+   * You’re in charge of the energy conservation paradigm (may be seen as a + for some).
+   * More memory used : 2 rgba textures for diffuse and specular, you may be able to pack glossiness in the alpha channel of specular map, but you have no room left for anything and you may have to use a third texture.
+
+
+
+IMO, the metalness workflow is more suited to real time 3D engine. And as an artist I find it more intuitive.
+
+That  said, as a developer making his PBR pipeline; especially for an engine mainly used by Indie devs; whatever pipeline you choose, you can’t ignore the other. Free or charged PBR ready model you can find are done with whatever workflow suited the artist. some conversion are possible, but that’s easier for user to be able to use the model as is. That’s why I decided to support both in my implementation.

+ 172 - 0
src/docs/asciidoc/jme3/advanced/pbr_part2.adoc

@@ -0,0 +1,172 @@
+= Physically Based Rendering – Part Two
+
+<<pbr_part1#,In previous post>>, I explained what you had to know about Physically Based Rendering if you were an artist. If you’re a developer, and reading this article, you may have tried, or are planning  to implement your own PBR system. If you started to read some of the available literature, you’ve probably been struck by the math complexity of it, and by the lack of explanation of the big picture. You usually see articles that focus on specifics parts of the process, and don’t talk much about other parts as they are assumed easier. At some point you have to assemble all these parts, and I had a hard time figuring out how to do it in my readings. I guess it’s considered basic stuff for other authors, but I think it deserves its proper explanation.
+
+I don’t pretend these articles will enlighten you to the point you are ready to implement your own system, but I hope they will give you solid basis and understanding to start reading the literature without saying “WTF?? on every line as I did.
+
+You can find a lexical, at the end, with all the strange words you’ll come across and their explanations.
+
+So here is what I figured out about using PBR and lighting in general in a 3D rendering pipeline.
+
+
+**Ligthing**
+
+So first, lets talk about lighting in games. It all boils down to 2 things :
+
+   * Computing *Diffuse* reflection: This represent the light that reflects off a surface in all directions
+   * Computing *Specular* reflection : This represent the light that reflects off a surface directly to your eye.
+
+This image from wikipedia is the most simple and yet the most helpful to understand this
+
+image::Lambert2.png[Lambert2,width="320",height="250",align="center"]
+By GianniG46 (Own work) [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0) or GFDL (http://www.gnu.org/copyleft/fdl.html)], via Wikimedia Commons
+
+To compute each of these factors, we’re going to use a function. This function answers to the delicate name of *Bidirectional Reflectance Distribution Function or BRDF*.
+
+Don’t be scared by this, it’s a big name for just a function really. Usually, it will be a shader function.
+
+
+
+Of course there are different BRDFs depending on what you want to compute, and on the lighting model you use. The BRDFs are usually called by the name of the guys that discovered/elaborated them.
+
+Also, most of the time, in implementations for real time rendering, those BRDFs are approximated for the sake of performance. And incidentally, those approximations also have names, that can be people names or technique names…
+
+
+== Lighting in PBR
+
+Computing lighting for PBR is exactly the same as with the current rendering ( the system we use today with ambient, diffuse, specular, sometimes called ad-hoc system in the literature) :
+
+For each light source, compute the diffuse factor and the specular factor. The main difference is that the BRDFs used are different, more physically accurate, and works predictably under different light sources with few parameter entries.
+
+
+
+So what is a light source?
+
+=== Direct light source
+
+Something that emits light. In games the most common light sources are Directional lights (think of the sun), Spot lights (think of a torch light), Point lights (think of a light bulb).
+
+That’s what is commonly used in the ad-hoc system, and PBR also handle those types of lights.
+
+
+=== Indirect light source
+
+Something that reflects light and indirectly lights its surroundings. Think for example of a red wall next to a car at daytime, the sunlight hits the wall and the wall reflects red light that, in turn, lights up the car.
+
+This is not handled by the ad-hoc system, or very poorly faked with ambient lighting.
+
+This part is optional for PBR, but that’s actually the part you really want. because that’s what make things pretty!
+
+In games, indirect lighting is done by using an environment map as a light source. This technique is called *Image Based Lighting (IBL)*.
+
+
+
+So let’s say we’re looking for the full package. we need to compute diffuse and specular contribution for each light source be it direct or indirect.
+
+To do so we need a BRDF for diffuse and a BRDF for specular, and stick to them for each light source for consistency. Also those BRDF should accept as entry the parameters we want to expose for the artists (base color, metalness, roughness), or derived parameters with minimal transformation.
+
+
+
+So the pseudo code for a complete lighting is this :
+[source]
+----
+//direct lighting
+for each directLightSource {
+    directDiffuseFactor = DiffuseBRDF(directlightSource)
+    directSpecularFactor = SpecularBRDF(directLightSource)
+    directLighting += Albedo * directDiffuseFactor + SpecColor * directSpecularFactor
+}
+
+//Indirect Lighting, done through Image Based Rendering with an environment map
+indirectDiffuseFactor = DiffuseBRDF(EnvMap)
+indirectSpecularFactor = SpecularBRDF(EnvMap)
+
+indirectLighting = Albedo * indirectDiffuseFactor + SpecColor * indirectSpecularFactor
+
+Lighting = directLighting + indirectLighting
+----
+
+I’ll go into more details, in the posts serie, on how to compute each factors, but that’s pretty much it.
+
+
+== Choosing your BRDFs
+
+There is a vast choice of BRDF, and I’m not going to talk about all of them but focus on the ones that I use in my implementation. I’ll just guide you to alternatives and provide links to relevant articles for more details.
+
+I chose to use the same BRDF as the ones used in Unreal Engine 4 from link:http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf[this article] by Brian Karis, as I completely trust his judgement. The provided code helped a great deal, but it was far from straight forward to integrate. In the end I had to fully research, and understand all the whereabouts of BRDFs.
+
+
+=== Diffuse BRDF : Lambert
+
+The most used diffuse BRDF in games. It’s very popular because it’s very cheap to compute and gives good results. This is the most simple way of computing diffuse.  link:https://en.wikipedia.org/wiki/Lambertian_reflectance[here are the details]
+
+image::DiffuseLambert.jpg[DiffuseLambert,width="320",height="250",align="center"]
+Diffuse Lambert factor for a direct light source (directional light) with a yellow surface color.
+
+Some Alternatives :
+
+*Oren-Nayar* : Gives better visual results than classic Lambert, and has the advantage of using an entry parameter called roughness…rings a bell? Unfortunately, the additional computation cost is not really worth it,IMO. link:https://en.wikipedia.org/wiki/Oren%E2%80%93Nayar_reflectance_model[Details here]
+
+*Harahan-Krueger* : Takes into consideration sub-surface scattering for diffuse lighting (every material surface has layers and light scatters into those different layers before going out of the material in a random direction). A lot of computations compared to Lambert, but may be important if you want to have a good sub surface scattering look for skin for example.  link:http://cseweb.ucsd.edu/~ravir/6998/papers/p165-hanrahan.pdf[more details in this paper]
+
+
+
+
+=== Specular BRDF : Cook-Torrance
+
+This is a bit more complicated for specular. We need a physically plausible BRDF. We use what is called a *Microfacet BRDF*. So what is it?
+
+It states that at a micro level a surface is not plane, but formed of a multitude of little randomly aligned surfaces, the microfacets. Those surfaces acts as small mirrors that reflects incoming light. The idea behind this BRDF is that only some of those facets may be oriented so that the incoming light reflects to your eye. The smoother the surface, the more all facets are aligned, and the most neat is the light reflection. In the contrary, if a surface is rough, the facets are more randomly oriented so the light reflection is scattered on the surface, and the reflection looks more blurry.
+
+image::Specular.png[Specular,width="320",height="250",align="center"]
+Microfacet specular factor for a direct light source. On the left a smooth surface, on the right a rough one. Note how the reflection is scattered on the surface when it’s rough.
+
+The microfacet BRDF we use is called Cook-Torrance. From my readings, I couldn’t find any implementation that use another specular BRDF. It seems like this is the global form of any microfacet BRDF.
+
+[source]
+----
+f = D * F * G / (4 * (N.L) * (N.V));
+----
+*N.L* is the dot product between the normal of the shaded surface and the light direction.
+
+*N.V* is the dot product between the normal of the shaded surface and the view direction.
+
+The other terms are :
+
+   * *Normal Distribution Function called D* (for distribution). You may also find some references to it as NDF. It computes the distribution of the microfacets for the shaded surface
+   * *Fresnel factor called F*. Discovered by Augustin Fresnel (frenchies are sooo clever), it describes how light reflects and refracts at the intersection of two different media (most often in computer graphics : Air and the shaded surface)
+   * *Geometry shadowing term G*. Defines the shadowing from the microfacets
+
+That’s where it gets complicated. For each of these terms, there are several models or approximations to computed them.
+
+I’ve settled to use those models and approximations :
+
+   * *D : Trowbridge-Reitz/GGX* normal Distribution function.
+   * *F : Fresnel term Schlick*’s link:http://www.cs.virginia.edu/~jdl/bib/appearance/analytic%20models/schlick94b.pdf[approximation]
+   * *G : Schlick-GGX* approximation
+
+I won’t go into the details of all the alternatives I just want to expose an overview of the whole process first.  But I’ll dive into more technical details on the terms I use, in following posts. To have a neat overview of all alternatives you can see this link:http://graphicrants.blogspot.fr/2013/08/specular-brdf-reference.html[post] on  Brian Karis’s blog.
+
+
+
+That sums up the whole process, but there is still much to explain. In next post I’ll make a focus on indirect lighting, as it’s the part that gave me the hardest time to wrap my head around. I’ll explain the Image Based Lighting technique used, and how you can compute diffuse and specular from an Environment Map.
+
+<<pbr_part3#,Next Post>>
+
+== Lexical :
+
+*Diffuse reflection :* light that reflects from a surface in every direction.
+
+*Specular reflection :* light that reflects from a surface toward the viewer.
+
+*Bidirectional Reflectance Distribution Function or BRDF :* a function to compute Diffuse or Specular reflection.
+
+*Image Based Rendering or IBL :* a technique that uses an image as a light source
+
+*Microfacet Specular BRDF :* A specular BRDF that assumes a surface is made of a multitude of very small randomly aligned surfaces: the microfacets. it depends on 3 factors called D, F and G.
+
+*Normal Distribution Function called D* (for distribution). You may also find some references to it as NDF. It computes the distribution of the microfacets for the shaded surface
+
+*Fresnel factor called F*. Discovered by Augustin Fresnel (frenchies are sooo clever), it describes how light reflects and refracts at the intersection of two different media (most often in computer graphics : Air and the shaded surface)
+
+*Geometry shadowing term G*. Defines the shadowing from the micro facets

+ 189 - 0
src/docs/asciidoc/jme3/advanced/pbr_part3.adoc

@@ -0,0 +1,189 @@
+= Physically Based Rendering – Part Three
+
+image::irradianceMap.png[irradianceMap,width="320",height="250",align="center"]
+*Note* : after several discussions in the team, I realized that some points were not clear in the  “PBR for artists” post. I’ve made an update with additional information on how to handle metalness and specular. <<pbr_part1#,I invite you to read it>>.
+
+== Image Based Lighting in PBR
+
+In the <<pbr_part2#,previous post>>, I talked about the basics of PBR for developers, and explained the different steps of the lighting process with PBR.
+
+As said before, PBR does not necessarily imply to have indirect lighting, But that’s what makes it look so good.
+
+Today I’m gonna focus on a technique called Image Based Lighting (IBL), that will allow us to cheaply compute this indirect lighting.
+
+As before you can find at the end of the article a lexical with definitions of various unusual terms you’ll come across.
+
+== Indirect Lighting for PBR with Image Based Lighting.
+
+Direct lighting is usually pretty clear for everyone as it uses common light sources (point light, directional light,…).
+
+However indirect lighting is not that obvious. First you need to understand what we want to simulate with indirect light.
+
+It is often referred as *Global Illumination (or GI)*. This represents the light bouncing on surrounding objects that is lighting the shaded surface. There are several techniques to implement global illumination, but the most common is *Image Based Lighting (IBL)*. It is very often associated with PBR pipelines.
+
+So basically, a light source in game is a color, and optionally other parameters like direction, position, radius, etc… An image has color informations, and this color can be considered as a light source.
+
+For global Illumination light is coming from everywhere. So a good way to simulate GI with IBL is to consider an environment map as a light source.
+
+=== Reminder on environment maps :
+
+Most often, in-game environment maps are cube maps.
+
+How do we fetch a pixel from an environment map? We need a vector. Often called the reflect vector (refVec), because thats the reflection vector of the view direction on the shaded surface.
+
+A picture worth thousand words
+
+image::Cube_mapped_reflection_example.jpg[Cube_mapped_reflection_example,width="320",height="250",align="center"]
+from wikipedia : TopherTH at the English language Wikipedia [GFDL (http://www.gnu.org/copyleft/fdl.html), GFDL (http://www.gnu.org/copyleft/fdl.html) or CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/)], via Wikimedia Commons Here the reflected Ray is our reflection vector.
+
+Here the reflected Ray is our reflection vector.
+
+Unfortunately we can’t take each pixel of the env map and compute light as if it was a direct light source and hope for the best.
+
+There’s crazy math around that topic, and to be honest I ddidn’tget all of it myself. So instead of explaining difficult math equations that may be confusing, I’m gonna go straight to the point : How are we going to compute lighting from the environment map?
+
+=== IBL Diffuse
+
+First we need to compute Diffuse factor from the environment map. Remember our diffuse BRDF from last post? *Lambert*.
+
+To simplify, Lambert diffuse BRDF, as it’s used in game, is the light color multiplied by a visibility factor.
+
+This visibility factor is a function of the normal of the shaded geometry and the light direction.
+
+Let’s say you have a direct light source lighting the front side of a geometry. The back side of this geometry is in the dark. Meaning the front side visibility factor is 1 and the back side visibility factor is 0.
+
+For indirect lighting, we can ditch out this visibility factor because the light is coming from everywhere. So all of this simplifies in Diffuse factor = light color.
+
+But what’s the light color for a given point?
+
+Technically, every pixel in the environment map is a light source, so a shaded point is lighten by a vast amount of pixels.
+
+image::irradiance.png[irradiance,width="320",height="250",align="center"]
+
+In this picture the orange area represent the light rays coming from the cube map to the shaded pixel, that we have to consider to properly compute the light color. So the idea would be, for each shaded pixel, to fetch all that texels and combine the colors.
+
+As you can image that’s not practical for a real time rendering pipeline. Even with a 128×128 env map that’s around 50k texture fetches per pixel.
+
+Fortunately, We can use something called an *Irradiance map*. An irradiance map is basically the afford mentioned computation…except that it’s precomputed and baked into a texture. In practice here is what it looks like.
+
+image::irradianceMap.png[irradianceMap,width="320",height="250",align="center"]
+On the left the original cube map, on the right, the pre computed irradiance map.
+
+So at run time you just have to do one texture fetch in that map with the reflection vector. Pretty cool heh?
+
+Except that to pre-compute that map we still have to sample the cube map literally billions of times, and even if it’s at design time…it’s painfully long.
+
+*Spherical Harmonics (SH) to the rescue*
+
+What’s that again? I won’t go into explaining them in details (because I can’t actually ;-P ), but just know that it’s once again some math magic with a big name on it. Here is a post where it’s explained with simple words, in terms of what you can use them for.
+
+To put it simple, SH can help us to compute the irradiance map way faster. This article explains that it all boils down to compute only 9 spherical harmonics coefficients to efficiently approximate an irradiance factor.
+
+At this point you can even skip the pre computation of the irradiance map, and use those coefficients directly in your shader for each shaded pixels. That’s fast enough to be real time, and use less memory that a cube map.
+
+But still…it’s slower than one texture fetch, so I chose to compute the Irradiance map and use it in the shader.
+
+With this technique I can compute a 128X128 irradiance cube map on the CPU in Java in about 200ms. Too slow to be done on each frame, but at design time that’s the blink of an eye.
+
+image::DiffuseIBL.png[DiffuseIBL,width="320",height="250",align="center"]
+Here is the diffuse effect of indirect lighting using an irradiance cube map
+
+=== IBL Specular
+
+Indirect diffuse is cool, but we want “shiny”!! Shiny implies specular lighting.
+
+It’s important to understand what we want as a specular reflection. We want it to be very neat when the roughness is low and very blurry when it’s high.
+
+image::Roughness.png[Roughness,width="320",height="250",align="center"]
+As roughness increase the reflection gets more blurry.
+
+To do this, we have to resolve an integral called the *radiance integral.*
+
+There is a method to do it quite fast that is called *importance sampling*. However it requires a lot of samples to get correct results, and therefore it’s pretty slow.
+
+As an example, for the previous shot, I was using this method, with 1024 samples. It was barely interactive, because it ran at 16 fps on a GTX 670.
+
+=== Thanks Epic games!
+
+Epic games came with a solution to this issue for Unreal Engine 4. Others did too, actually, but Epic games made it public in this paper, from Brian Karis. I can’t thank them enough for this.
+
+In this link:http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf[paper], they explain how they do it in UE4. They use a method they called the *Split Sum Approximation*. It doesn’t make the computation faster, but it transforms it so that it can be baked in two prefiltered textures.
+
+   * The prefiltered environment map
+
+We are going to pre process an env map on the CPU.
+
+As explained before, we need the reflection to be more blurry as the roughness increase. The main idea here is to store different levels of roughness in the env map mip maps. The first mip map level will match roughness = 0 and the last will match roughness = 1.
+
+From mip levels to mip levels we’re going to convolve (blur) the images depending on the roughness. The more the roughness increase the more samples we’re going to use, and the more spread out they will be.
+
+But that’s not all, we also want to “bake” the specular BRDF in the map, so for each pixel we are going to compute the Cook-Torrentz microfacet BRDF (remember last post).
+
+But, as we are preprocessing the map, we don’t have any information about the shaded surface normal and view direction. So we are going to assume they are all the same, and equal to the envVector we’ll use to fetch pixels from the map. Also we assume that the shading point is exactly at the center of the cube map.
+
+image::prefilteredEnvMapSampling.png[prefilteredEnvMapSampling,width="320",height="250",align="center"]
+
+This is an approximation again, and it has a cost in quality, but we’re all for approximation as long as it’s perform faster while still looking good, right?
+
+Here is what the result looks like
+
+image::PrefilteredEnvMap.png[PrefilteredEnvMap,width="320",height="250",align="center"]
+The prefiltered environment map, with the different mip levels. notice how the blur increases through them.
+
+So now we can evaluate the first sum of the split sum approximation with a single texture fetch. We are going to compute the Lod level (the mip level where to fetch the texel) according to the roughness.
+
+Note that the image needs to be set up so that textureCube interpolates linearly between mip maps so that if the roughness value is not right on the mip level, it will interpolate between the two closest mip levels.
+
+   * The BRDF integration Map
+
+Now we need the second sum of the split sum approximation.
+
+It’s an integration that has two inputs, the *roughness* that varies from 0 to 1, and the dot product between the normal and the light direction (*N.L*, read N dot L) that also varies from 0 to 1.
+
+The outputs are a *scale*, and a *bias*, also varying from 0 to 1.
+
+So basically we can bake all combinations into a 2D map. roughness and N.L will be the texture coordinate. the red channel of the map will be the scale, and the green channel will be the bias. (the blue channel is not used)
+
+Here is what it looks like :
+
+image::integrateBrdf.png[integrateBrdf,width="320",height="250",align="center"]
+
+The nice part is that this map is constant for white light. It does not depends on the environment. So you can bake it once and for all then use it as an asset in your shaders.
+
+Now we have to combine values fetched from these maps to get the specular lighting.
+
+Here is what indirect specular alone, looks like, with a roughness of 0.1.
+
+image::IndirectSpeculra.png[IndirectSpeculra,width="320",height="250",align="center"]
+
+*So in the end :*
+
+Our indirect lighting pseudo code looks like this :
+[source]
+----
+//diffuse
+indirectDiffuse = textureCube(IrradianceMap, refVec)  * diffuseColor
+
+//specular
+lod = getMipLevelFromRoughness(roughness)
+prefilteredColor =  textureCube(PrefilteredEnvMap, refVec, lod)
+envBRDF = texture2D(BRDFIntegrationMap,vec2(roughness, ndotv)).xy
+indirectSpecular = prefilteredColor * (specularColor * envBRDF.x + envBRDF.y)
+
+indirectLighting = indirectDiffuse + indirectSpecular
+----
+That concludes the post. Quite a lot of information to process. Now you should have an idea of the whole thing. Next time, we are going to go under the hood, and YOU GONNA HAZ CODE!!
+
+== Lexical :
+
+*Global Illumination (GI):* A concept that represent all the lighting of a scene that is not coming from a direct light source.
+
+*Image Based Lighting (IBL):* A technique that uses an image as a light source
+
+*Irradiance map :* Precomputed environment map that contains diffuse lighting data of the environment.
+
+*Spherical Harmonics (SH):* link:https://dickyjim.wordpress.com/2013/09/04/spherical-harmonics-for-beginners/[Read this]
+
+*Importance Sampling :* A math technique to approximate the result of an integral.
+
+*Split Sum Approximation :* A way,used in Unreal Engine 4, to transform the specular radiance integral into 2 sums that can be easily baked into prefiltered textures.

+ 96 - 55
src/docs/asciidoc/jme3/advanced/physics.adoc

@@ -78,12 +78,14 @@ Do the following once per application to gain access to the `physicsSpace` objec
 
 .  Make your application extend `com.jme3.app.SimpleApplication`.
 .  Create a BulletAppState field: 
++
 [source,java]
 ----
 private BulletAppState bulletAppState;
 ----
 
 .  Initialize your bulletAppState and attach it to the state manager: 
++
 [source,java]
 ----
 public void simpleInitApp() {
@@ -123,7 +125,7 @@ Let's look at the details:
 A CollisionShape is a simplified shape for which physics are easier to calculate than for the true shape of the model. This simplication approach speeds up the simulation greatly.
 
 Before you can create a Physics Control, you must create a CollisionShape from the `com.jme3.bullet.collision.shapes` package. (Read the tip under “PhysicsControls Code Samples how to use default CollisionShapes for Boxes and Spheres.)
-[cols="3", options="header"]
+[cols="25,40,35", options="header"]
 |===
 
 <a| Non-Mesh CollisionShape     
@@ -140,7 +142,8 @@ a| Compact objects like apples, soccer balls, cannon balls, compact spaceships.
 
 <a| CylinderCollisionShape()    
 a| Tube-shaped and disc-shaped behaviour, can roll on one side. 
-a| Oblong objects like pillars. +Disc-shaped objects like wheels, plates. 
+a| Oblong objects like pillars. +
+Disc-shaped objects like wheels, plates. 
 
 <a| CompoundCollisionShape()    
 a| A CompoundCollisionShape allows custom combinations of shapes. Use the `addChildShape()` method on the compound object to add other shapes to it and position them relative to one another. 
@@ -161,7 +164,7 @@ a| Flat solid floor or wall.
 |===
 
 All non-mesh CollisionShapes can be used for dynamic, kinematic, as well as static Spatials. (Code samples see below)
-[cols="3", options="header"]
+[cols="25,40,35", options="header"]
 |===
 
 <a| Mesh CollisionShapes   
@@ -169,25 +172,29 @@ All non-mesh CollisionShapes can be used for dynamic, kinematic, as well as stat
 a| Examples 
 
 <a| MeshCollisionShape        
-a| A mesh-accurate shape for static or kinematic Spatials. Can have complex shapes with openings and appendages. +*Limitations:* Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape. This Shape does not work with dynamic Spatials. 
+a| A mesh-accurate shape for static or kinematic Spatials. Can have complex shapes with openings and appendages. +
+*Limitations:* Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape. This Shape does not work with dynamic Spatials. 
 a| A whole static game level model. 
 
 <a| HullCollisionShape        
-a| A less accurate shape for dynamic Spatials that cannot easily be represented by a CompoundShape. +*Limitations:* The shape is convex (behaves as if you gift-wrapped the object), i.e. openings, appendages, etc, are not individually represented. 
+a| A less accurate shape for dynamic Spatials that cannot easily be represented by a CompoundShape. +
+*Limitations:* The shape is convex (behaves as if you gift-wrapped the object), i.e. openings, appendages, etc, are not individually represented. 
 a| A dynamic 3D model. 
 
 <a| GImpactCollisionShape     
-a| A mesh-accurate shape for dynamic Spatials. It uses link:http://gimpact.sourceforge.net/[http://gimpact.sourceforge.net/]. +*Limitations:* CPU intensive, use sparingly! We recommend using HullCollisionShape (or CompoundShape) instead to improve performance. Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape. 
+a| A mesh-accurate shape for dynamic Spatials. It uses link:http://gimpact.sourceforge.net/[http://gimpact.sourceforge.net/]. +
+*Limitations:* CPU intensive, use sparingly! We recommend using HullCollisionShape (or CompoundShape) instead to improve performance. Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape. 
 a| Complex dynamic objects (like spiders) in Virtual Reality or scientific simulations. 
 
 a| HeightfieldCollisionShape 
-a| A mesh-accurate shape optimized for static terrains. This shape is much faster than other mesh-accurate shapes. +*Limitations:* Requires heightmap data. Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape.
+a| A mesh-accurate shape optimized for static terrains. This shape is much faster than other mesh-accurate shapes. +
+*Limitations:* Requires heightmap data. Collisions between two mesh-accurate shapes cannot be detected, only non-mesh shapes can collide with this shape.
 a|Static terrains.
 
 |===
 
 On a CollisionShape, you can apply a few properties
-[cols="3", options="header"]
+[cols="30,45,25", options="header"]
 |===
 
 a| CollisionShape Method 
@@ -196,7 +203,8 @@ a| Examples
 
 a| setScale(new Vector3f(2f,2f,2f)) 
 a| You can change the scale of collisionshapes (whether it be, Simple or Mesh). You cannot change the scale of a CompoundCollisionShape however. A sphere collision shape, will change its radius based on the X component of the vector passed in. You must scale a collision shape before attaching it to the physicsSpace, or you must readd it to the physicsSpace each time the scale changes. 
-a| Scale a player in the Y axis by 2: +`new Vector3f(1f,2f,1f)`
+a| Scale a player in the Y axis by 2: +
+`new Vector3f(1f,2f,1f)`
 
 |===
 
@@ -209,9 +217,15 @@ Pick the simplest and most applicable shape for the mesh for what you want to do
 
 [source,java]
 ----
+// JME sdk 3.0.10  and earlier
 bulletAppState.getPhysicsSpace().enableDebug(assetManager);
 ----
-
+or
+[source,java]
+----
+// newer versions
+bulletAppState.setDebugEnabled(true);
+----
 
 ====
 
@@ -266,7 +280,7 @@ SphereCollisionShape sphereShape =
 == Create PhysicsControl
 
 BulletPhysics are available in jME3 through PhysicsControls classes from the com.jme3.bullet.control package. jME3's PhysicsControl classes directly extend BulletPhysics objects and are the recommended way to use physics in a jME3 application. PhysicsControls are flexible and can be added to any Spatial to make it act according to physical properties. 
-[cols="3", options="header"]
+[cols="20,40,40", options="header"]
 |===
 
 a|Standard PhysicsControls
@@ -275,21 +289,23 @@ a| Examples
 
 a|RigidBodyControl
 a|The most commonly used PhysicsControl. You can use it for dynamic objects (solid objects that freely affected by collisions, forces, or gravity), for static objects (solid but not affected by any forces), or kinematic objects (remote-controlled solid objects). 
-a|Impacting projectiles, moving obstacles like crates, rolling and bouncing balls, elevators, flying aircaft or space ships. +Solid immobile floors, walls, static obstacles.
+a|Impacting projectiles, moving obstacles like crates, rolling and bouncing balls, elevators, flying aircaft or space ships. +
+Solid immobile floors, walls, static obstacles.
 
 a|GhostControl
 a|Use for collision and intersection detection between physical objects. A GhostControl itself is _non-solid_ and invisible. GhostControl moves with the Spatial it is attached to. Use GhostControls to <<jme3/advanced/physics_listeners#,implement custom game interactions>> by adding it to a visible Geometry. 
 a|A monster's “aggro radius, CharacterControl collisions, motion detectors, photo-electric alarm sensors, poisonous or radioactive perimeters, life-draining ghosts, etc. 
 
 |===
-[cols="3", options="header"]
+[cols="20,40,40", options="header"]
 |===
 
 a|Special PhysicsControls
 a| Usage
 a| Examples 
 
-a|VehicleControl +PhysicsVehicleWheel
+a|VehicleControl +
+PhysicsVehicleWheel
 a| Special Control used for <<jme3/advanced/vehicles#,&quot;terrestrial&quot;  vehicles with suspension and wheels>>. 
 a|Cars, tanks, hover crafts, ships, motorcycles…
 
@@ -350,7 +366,7 @@ gameLevel.addControl(new RigidBodyControl(0.0f)); // explicit zero mass, implici
 
 [TIP]
 ====
-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
+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.
 ====
 
 
@@ -360,6 +376,7 @@ Spheres and Boxes automatically fall back on the correct default CollisionShape
 For each physical Spatial in the scene:
 
 .  Add a PhysicsControl to a Spatial. 
++
 [source,java]
 ----
 myThing_geo.addControl(myThing_phys);
@@ -408,7 +425,8 @@ When you import a model from blender, it often comes as a Node (even if it only
 
 // Doesn't scale
 // This modified version contains Node -> Geometry (name = "MonkeyHeadGeom")
-Spatial model = assetManager.loadModel("Models/MonkeyHead.j3o"); model.addControl(new RigidBodyControl(0));
+Spatial model = assetManager.loadModel("Models/MonkeyHead.j3o"); 
+model.addControl(new RigidBodyControl(0));
 // Won't work as this is now a CompoundCollisionShape containing a MeshCollisionShape
 model.getControl(RigidBodyControl.class).getCollisionShape().setScale(new Vector3f(2, 2, 2)); 
 bulletAppState.getPhysicsSpace().add(model);
@@ -447,7 +465,8 @@ a|Specifies physics accuracy. The higher the accuracy, the slower the game. Decr
 a|setMaxSubSteps(4);
 a|Compensates low FPS: Specifies the maximum amount of extra steps that will be used to step the physics when the game fps is below the physics fps. This maintains determinism in physics in slow (low-fps) games. For example a maximum number of 2 can compensate for framerates as low as 30 fps (physics has a default accuracy of 60 fps). Note that setting this value too high can make the physics drive down its own fps in case its overloaded.
 
-a|setWorldMax(new Vector3f(10000f, 10000f, 10000f)); +setWorldMin(new Vector3f(-10000f, -10000f, -10000f));
+a|setWorldMax(new Vector3f(10000f, 10000f, 10000f)); +
+setWorldMin(new Vector3f(-10000f, -10000f, -10000f));
 a|Specifies the size of the physics space as two opposite corners (only applies to AXIS_SWEEP broadphase).
 
 |===
@@ -466,20 +485,30 @@ a| Property
 a| Examples 
 
 a| setGravity(new Vector3f(0f,-9.81f,0f)) 
-a| You can change the gravity of individual physics objects after they were added to the PhysicsSpace. Gravity is a vector pointing from this Spatial towards the source of gravity. The longer the vector, the stronger is gravity. +If gravity is the same absolute direction for all objects (e.g. on a planet surface), set this vector globally on the PhysicsSpace object and not individually. +If the center of gravity is relative (e.g. towards a black hole) then setGravity() on each Spatial to constantly adjust the gravity vectors at each tick of their update() loops.
-a|For planet earth: +`new Vector3f(0f,-9.81f,0f)`
+a| You can change the gravity of individual physics objects after they were added to the PhysicsSpace. Gravity is a vector pointing from this Spatial towards the source of gravity. The longer the vector, the stronger is gravity. +
+If gravity is the same absolute direction for all objects (e.g. on a planet surface), set this vector globally on the PhysicsSpace object and not individually. +
+If the center of gravity is relative (e.g. towards a black hole) then setGravity() on each Spatial to constantly adjust the gravity vectors at each tick of their update() loops.
+a|For planet earth: +
+`new Vector3f(0f,-9.81f,0f)`
 
 a| setMass(1f) 
-a| Sets the mass in kilogram. Dynamic objects have masses &gt; 0.0f. Heavy dynamic objects need more force to be moved and light ones move with small amounts of force. +Static immobile objects (walls, floors, including buildings and terrains) must have a mass of zero! 
-a| Person: 60f, ball: 1.0f +Floor: 0.0f (!)
+a| Sets the mass in kilogram. Dynamic objects have masses &gt; 0.0f. Heavy dynamic objects need more force to be moved and light ones move with small amounts of force. +
+Static immobile objects (walls, floors, including buildings and terrains) must have a mass of zero! 
+a| Person: 60f, ball: 1.0f +
+Floor: 0.0f (!)
 
 a| setFriction(1f) 
-a| Friction. +Slippery objects have low friction. The ground has high friction. 
-a| Ice, slides: 0.0f +Soil, concrete, rock: 1.0f 
+a| Friction. +
+Slippery objects have low friction. The ground has high friction. 
+a| Ice, slides: 0.0f +
+Soil, concrete, rock: 1.0f 
 
 a| setRestitution(0.0f) 
-a| Bounciness. By default objects are not bouncy (0.0f). For a bouncy rubber object set this &gt; 0.0f. +Both the object and the surface must have non-zero restitution for bouncing to occur. +This setting has an impact on performance, so use it sparingly. 
-a| Brick: 0.0f +Rubber ball: 1.0f 
+a| Bounciness. By default objects are not bouncy (0.0f). For a bouncy rubber object set this &gt; 0.0f. +
+Both the object and the surface must have non-zero restitution for bouncing to occur. +
+This setting has an impact on performance, so use it sparingly. 
+a| Brick: 0.0f +
+Rubber ball: 1.0f 
 
 a|setCcdMotionThreshold()
 a|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.
@@ -501,7 +530,8 @@ a| setPhysicsRotation()
 a|Rotates the object. Do not use setLocalRotate() for physical objects.
 
 a| setKinematic(true) 
-a| By default, RigidBodyControls are dynamic (kinematic=false) and are affected by forces. If you set kinematic=true, the object is no longer affected by forces, but it still affects others. A kinematic is solid, and must have a mass. +(See detailed explanation below.) 
+a| By default, RigidBodyControls are dynamic (kinematic=false) and are affected by forces. If you set kinematic=true, the object is no longer affected by forces, but it still affects others. A kinematic is solid, and must have a mass. +
+(See detailed explanation below.) 
 
 |===
 
@@ -515,47 +545,50 @@ All physical objects…
 *  can respond to collisions dynamically, or statically, or kinematically.
 [cols="4", options="header"]
 |===
+|Property |Static |Kinematic |Dynamic 
 
-a| Property 
-a| Static 
-a| Kinematic 
-a| Dynamic 
-
-a| Examples
+a|Examples
 a|Immobile obstacles: Floors, walls, buildings, …
 a|Remote-controlled solid objects: Airships, meteorites, elevators, doors; networked or remote-controlled NPCs; invisible “airhooks for hinges and joints.
 a|Interactive objects: Rolling balls, movable crates, falling pillars, zero-g space ship…
 
-a| Does it have a mass?
+a|Does it have a mass?
 a|no, 0.0f
 a|yesfootnote:[Inertia is calculated for kinematic objects, and you need mass to do that.], &gt;0.0f 
 a|yes, &gt;0.0f
 
-a| How does it move?
+a|How does it move?
 a|never
 a|setLocalTranslation();
-a|setLinearVelocity(); applyForce(); +setWalkDirection(); for CharacterControl
-
-a| How to place in scene?
-a|setPhysicsLocation(); +setPhysicsRotation()
-a|setLocalTranslation(); +setLocalRotation();
-a|setPhysicsLocation(); + setPhysicsRotation()
-
-a| Can it move and push others?
+a|setLinearVelocity(); applyForce(); +
+setWalkDirection(); for CharacterControl
+
+a|How to place in scene?
+a|setPhysicsLocation(); +
+setPhysicsRotation();
+a|setLocalTranslation(); +
+setLocalRotation();
+a|setPhysicsLocation(); +
+setPhysicsRotation();
+
+a|Can it move and push others?
 a|no
 a|yes
 a|yes
 
-a| Is is affected by forces? +(Falls when it mid-air? Can be pushed by others?)
+a|Is is affected by forces? +
+(Falls when it mid-air? Can be pushed by others?)
 a|no
 a|no
 a|yes
 
-a| How to activate this behaviour? 
-a|setMass(0f); +setKinematic(false); 
-a|setMass(1f); +setKinematic(true);
-a|setMass(1f); +setKinematic(false);
-
+a|How to activate this behaviour? 
+a|setMass(0f); +
+setKinematic(false); 
+a|setMass(1f); +
+setKinematic(true);
+a|setMass(1f); +
+setKinematic(false);
 |===
 
 
@@ -626,7 +659,10 @@ a| Property
 a| setCollisionShape(collisionShape)
 a|Changes the collision shape after creation.
 
-a| setCollideWithGroups() +setCollisionGroup() +addCollideWithGroup(COLLISION_GROUP_01) +removeCollideWithGroup(COLLISION_GROUP_01)
+a| setCollideWithGroups() +
+setCollisionGroup() +
+addCollideWithGroup(COLLISION_GROUP_01) +
+removeCollideWithGroup(COLLISION_GROUP_01)
 a|Collision Groups are integer bit masks – enums are available in the CollisionObject. All physics objects are by default in COLLISION_GROUP_01. Two objects collide when the collideWithGroups set of one contains the Collision Group of the other. Use this to improve performance by grouping objects that will never collide in different groups (the the engine saves times because it does not need to check on them).
 
 a| setDamping(float, float)
@@ -649,24 +685,29 @@ a|Bullet does not use the full collision shape for continuous collision detectio
 
 [TIP]
 ====
- 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.
+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.
 ====
 
 
 
 == Best Practices
 
-*  *Multiple Objects Too Slow?* Do not overuse PhysicsControls. Although PhysicsControls are put to “sleep” when they are not moving, creating a world solely out of dynamic physics objects will quickly bring you to the limits of your computer's capabilities. +*Solution:* Improve performance by replacing some physical Spatials with non-physical Spatials. Use the non-physical ones for non-solid things for which you do not need to detect collisions – foliage, plants, effects, ghosts, all remote or unreachable objects.
+*  *Multiple Objects Too Slow?* Do not overuse PhysicsControls. Although PhysicsControls are put to “sleep” when they are not moving, creating a world solely out of dynamic physics objects will quickly bring you to the limits of your computer's capabilities. +
+*Solution:* Improve performance by replacing some physical Spatials with non-physical Spatials. Use the non-physical ones for non-solid things for which you do not need to detect collisions – foliage, plants, effects, ghosts, all remote or unreachable objects.
 
-*  *Complex Shape Too Slow?* Breaking the level into manageable pieces helps the engine improve performance: The less CPU-intensive link:http://en.wikipedia.org/wiki/Sweep_and_prune[broadphase] filters out parts of the scene that are out of reach. It only calculates the collisions for objects that are actually close to the action. +*Solution:* A huge static city or terrain model should never be loaded as one huge mesh. Divide the scene into multiple physics objects, with each its own CollisionShape. Choose the most simple CollisionShape possible; use mesh-accurate shapes only for the few cases where precision is more important than speed. For example, you can use the very fast `PlaneCollisionShape` for flat streets, floors and the outside edge of the scene, if you keep these pieces separate.
+*  *Complex Shape Too Slow?* Breaking the level into manageable pieces helps the engine improve performance: The less CPU-intensive link:http://en.wikipedia.org/wiki/Sweep_and_prune[broadphase] filters out parts of the scene that are out of reach. It only calculates the collisions for objects that are actually close to the action. +
+*Solution:* A huge static city or terrain model should never be loaded as one huge mesh. Divide the scene into multiple physics objects, with each its own CollisionShape. Choose the most simple CollisionShape possible; use mesh-accurate shapes only for the few cases where precision is more important than speed. For example, you can use the very fast `PlaneCollisionShape` for flat streets, floors and the outside edge of the scene, if you keep these pieces separate.
 
-*  *Eject?* If you have physical nodes jittering wildy and being ejected “for no apparent reason, it means you have created an impossible state – solid objects overlapping. This can happen when you position solid spatials too close to other solid spatials, e.g. when moving them with setLocalTranslation(). +*Solution:* Use the debug mode to make CollisionShapes visible and verify that CollisionShapes do not overlap. 
+*  *Eject?* If you have physical nodes jittering wildy and being ejected “for no apparent reason, it means you have created an impossible state – solid objects overlapping. This can happen when you position solid spatials too close to other solid spatials, e.g. when moving them with setLocalTranslation(). +
+*Solution:* Use the debug mode to make CollisionShapes visible and verify that CollisionShapes do not overlap. 
 [source,java]
 ----
 bulletAppState.getPhysicsSpace().enableDebug(assetManager);
 ----
 
 
-*  *Buggy?* If you get weird behaviour, such as physical nodes passing through one another, or getting stuck for no reason. +*Solution:* Look at the physics space accessors and change the acuracy and other parameters.
+*  *Buggy?* If you get weird behaviour, such as physical nodes passing through one another, or getting stuck for no reason. +
+*Solution:* Look at the physics space accessors and change the acuracy and other parameters.
 
-*  *Need more interactivity?* You can actively _control_ a physical game by triggering forces. You may also want to be able _respond_ to collisions, e.g. by substracting health, awarding points, or by playing a sound. +*Solution:* To specify how the game responds to collisions, you use <<jme3/advanced/physics_listeners#,Physics Listeners>>.
+*  *Need more interactivity?* You can actively _control_ a physical game by triggering forces. You may also want to be able _respond_ to collisions, e.g. by substracting health, awarding points, or by playing a sound. +
+*Solution:* To specify how the game responds to collisions, you use <<jme3/advanced/physics_listeners#,Physics Listeners>>.

+ 5 - 4
src/docs/asciidoc/jme3/advanced/physics_listeners.adoc

@@ -13,9 +13,9 @@ You can control physical objects (push them around) by applying physical forces
 
 == Sample Code
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/TestCollisionListener.java[TestCollisionListener.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/TestAttachGhostObject.java[TestAttachGhostObject.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/TestGhostObject.java[TestGhostObject.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestCollisionListener.java[TestCollisionListener.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestAttachGhostObject.java[TestAttachGhostObject.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestGhostObject.java[TestGhostObject.java]
 
 
 == PhysicsGhostObjects
@@ -170,7 +170,8 @@ The PhysicsCollisionEvent `event` gives you access to detailed information about
 <a|Method                        
 a|Purpose
 
-<a| getObjectA() +getObjectB()     
+<a| getObjectA() +
+getObjectB()     
 a| The two participants in the collision. You cannot know in advance whether some node will be recorded as A or B, you always have to consider both cases. 
 
 <a| getAppliedImpulse()          

+ 35 - 22
src/docs/asciidoc/jme3/advanced/post-processor_water.adoc

@@ -1,17 +1,18 @@
 = Rendering Water as Post-Process Effect
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
+:uri-jmonkeyengine: https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/
+:uri-forum: https://hub.jmonkeyengine.org/
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 The awesome SeaMonkey WaterFilter is highly configurable. It can render any type of water and also simulates the underwater part of the effect, including light effects called caustics. The effect is based on link:http://www.gamedev.net/page/reference/index.html/_//feature/fprogramming/rendering-water-as-a-post-process-effect-r2642[Wojciech Toman’s Rendering Water as a Post-process Effect] published on gamedev.net. Here's a video:
 
-link:http://www.youtube.com/watch?v=AWlUzgRN3Pc[
-image::jme3/advanced/water-post.png[water-post.png,with="",height="",align="center"]
-]
+
+image::jme3/advanced/water-post.png[water-post.png,width="",height="",align="center",link=https://youtu.be/AWlUzgRN3Pc]
 
 
 [NOTE]
@@ -43,11 +44,11 @@ Now we have the rendered scene in a texture, and we can reconstruct the position
 
 == Sample Code
 
-There are two test cases in the jME3 repository:
+These are test cases in the jME3 repository:
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWater.java[jme3/src/test/jme3test/water/TestPostWater.java] (ocean island)
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWaterLake.java[jme3/src/test/jme3test/water/TestPostWaterLake.java] (calm and muddy water pond)
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestMultiPostWater.java[jme3/src/test/jme3test/water/TestMultiPostWater.java] (several ponds of different sizes at different heights etc)
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/water/TestPostWater.java[TestPostWater.java] (ocean island)
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/water/TestPostWaterLake.java[TestPostWaterLake.java] (calm and muddy water pond)
+*  link:{uri-jmonkeyengine}jme3-examples/src/main/java/jme3test/water/TestMultiPostWater.java[TestMultiPostWater.java] (several ponds of different sizes at different heights etc)
 
 
 === Using the Water Filter
@@ -88,7 +89,7 @@ If you want waves, set the water height in the update loop. We reuse the initial
 ----
 
 private float time = 0.0f;
-private float waterHeight = 0.0f; 
+private float waterHeight = 0.0f;
 
 @Override
 public void simpleUpdate(float tpf) {
@@ -104,15 +105,16 @@ public void simpleUpdate(float tpf) {
 === Optional: Water Wave and Color Effects
 
 
-image::jme3/advanced/water-post-muddy.png[water-post-muddy.png,with="220",height="172",align="center"]
+image::jme3/advanced/water-post-muddy.png[water-post-muddy.png,width="220",height="172",align="center"]
 
 
 All these effects are optional. Every setter also has a getter.
+
 [cols="3", options="header"]
 |===
 
 a| Water method example
-a|Effects: Waves 
+a|Effects: Waves
 a|Default
 
 a|water.setWaterHeight(-6);
@@ -125,7 +127,7 @@ a|1.0f
 
 a|water.setWaveScale(0.008f);
 a|Sets the scale factor of the waves height map. The smaller the value, the bigger the waves!
-a| 0.005f 
+a| 0.005f
 
 a|water.setWindDirection(new Vector2f(0,1))
 a|Sets the wind direction, which is the direction where the waves move
@@ -135,11 +137,13 @@ a|water.setSpeed(0.7f);
 a|How fast the waves move. Set it to 0.0f for still water.
 a|1.0f
 
-a|water.setHeightTexture( (Texture2D) +manager.loadTexture(“Textures/waveheight.png) )
+a|water.setHeightTexture( (Texture2D) +
+manager.loadTexture(“Textures/waveheight.png) )
 a|This height map describes the shape of the waves
 a|“Common/MatDefs/Water/Textures/heightmap.jpg
 
-a|water.setNormalTexture( (Texture2D) +manager.loadTexture(“Textures/wavenormals.png) )
+a|water.setNormalTexture( (Texture2D) +
+manager.loadTexture(“Textures/wavenormals.png) )
 a|This normal map describes the shape of the waves
 a|“Common/MatDefs/Water/Textures/gradient_map.jpg
 
@@ -152,6 +156,7 @@ a|Sets the normal scaling factors to apply to the normal map. The higher the val
 a|1.0f
 
 |===
+
 [cols="3", options="header"]
 |===
 
@@ -169,21 +174,24 @@ a|RGBA.White
 
 a|water.setWaterColor(ColorRGBA.Brown.mult(2.0f));
 a|Sets the main water color.
-a|greenish blue +ColorRGBA(0.0f,0.5f,0.5f,1.0f)
+a|greenish blue +
+ColorRGBA(0.0f,0.5f,0.5f,1.0f)
 
 a|water.setDeepWaterColor(ColorRGBA.Brown);
 a|Sets the deep water color.
-a|dark blue +ColorRGBA(0.0f, 0.0f,0.2f,1.0f)
+a|dark blue +
+ColorRGBA(0.0f, 0.0f,0.2f,1.0f)
 
 a|water.setWaterTransparency(0.2f);
 a|Sets how fast colors fade out. use this to control how clear (e.g. 0.05f) or muddy (0.2f) water is.
-a| 0.1f 
+a| 0.1f
 
 a|water.setColorExtinction(new Vector3f(10f,20f,30f));
 a|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.
 a|Vector3f(5f,20f,30f)
 
 |===
+
 [cols="3", options="header"]
 |===
 
@@ -191,7 +199,8 @@ a| Water method example
 a| Effects: Shore
 a|Default
 
-a|water.setCenter(Vector3f.ZERO); +water.setRadius(260);
+a|water.setCenter(Vector3f.ZERO); +
+water.setRadius(260);
 a|Limit the water filter to a semisphere with the given center and radius. Use this for lakes and smaller bodies of water. Skip this for oceans.
 a|unused
 
@@ -204,6 +213,7 @@ a|Renders shoreline with better quality ?
 a|true
 
 |===
+
 [cols="3", options="header"]
 |===
 
@@ -223,11 +233,13 @@ a|water.setFoamExistence(new Vector3f(0.5f,5f,1.0f))
 a|The three values describe what depth foam starts to fade out, at what depth it is completely invisible, at what height foam for waves appears (+ waterHeight).
 a|Vector3f(0.45f,4.35f,1.0f)
 
-a|water.setFoamTexture( (Texture2D) +manager.loadTexture(“Textures/foam.png) )
+a|water.setFoamTexture( (Texture2D) +
+manager.loadTexture(“Textures/foam.png) )
 a|This foam texture will be used with WrapMode.Repeat
 a|“Common/MatDefs/Water/Textures/foam.jpg
 
 |===
+
 [cols="3", options="header"]
 |===
 
@@ -279,10 +291,11 @@ audioRenderer.playSource(waves);
 
 ----
 
-See also: <<jme3/advanced/audio#,audio>>. 
+See also: <<jme3/advanced/audio#,audio>>.
+
 '''
 
 See also:
 
-*  link:http://jmonkeyengine.org/2011/01/15/new-advanced-water-effect-for-jmonkeyengine-3/#comment-609[JME3's Water Post-Process Effect] by Nehon
+*  link:{uri-forum}t/monkeys-at-the-beach/15000[JME3's Water Post-Process Effect] by Nehon
 *  <<jme3/advanced/water#,Simple water>>

+ 3 - 3
src/docs/asciidoc/jme3/advanced/ragdoll.adoc

@@ -1,6 +1,6 @@
 = Ragdoll Physics
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, physics, character, NPC, forces, collisions
 :relfileprefix: ../../
@@ -11,7 +11,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 The jMonkeyEngine3 has built-in support for link:http://jbullet.advel.cz[jBullet physics] via the `com.jme3.bullet` package. Physics are not only responsible for handing collisions, but they also make <<jme3/advanced/hinges_and_joints#,hinges and joints>> possible. One special example of physical joints are ragdoll physics, shown here.
 
 
-image::jme3/advanced/ragdoll.png[ragdoll.png,with="",height="",align="center"]
+image::jme3/advanced/ragdoll.png[ragdoll.png,width="",height="",align="center"]
 
 
 

+ 4 - 1
src/docs/asciidoc/jme3/advanced/read_graphic_card_capabilites.adoc

@@ -18,7 +18,10 @@ Collection<Caps> caps = renderer.getCaps();
 Logger.getLogger(HelloWorld.class.getName()).log(Level.INFO, “Caps: {0}”, caps.toString());
 ----
 
-*Note:* Replace `HelloWorld` by the name of the class where you are using this line.
+[NOTE]
+====
+Replace `HelloWorld` by the name of the class where you are using this line.
+====
 
 
 == Examples

+ 3 - 1
src/docs/asciidoc/jme3/advanced/remote-controlling_the_camera.adoc

@@ -15,6 +15,7 @@ You can steer the camera using <<jme3/advanced/cinematics#,Cinematics>>:
 
 .  Create a Cinematic.
 .  Create a CameraNode and bind the camera object to the Cinematic. Note that we also give the camera node a name in this step. 
++
 [source,java]
 ----
 CameraNode camNode = cinematic.bindCamera("topView", cam);
@@ -22,6 +23,7 @@ CameraNode camNode = cinematic.bindCamera("topView", cam);
 
 .  Position the camera node in its start location.
 .  Use activateCamera() to give the control of the camera to this node. You now see the scene from this camera's point of view. For example to see through the camera node named “topView, 6 seconds after the start of the cinematic, you'd write 
++
 [source,java]
 ----
 cinematic.activateCamera(6, "topView");
@@ -50,4 +52,4 @@ camNodeSide.getControl(0).setEnabled(false);
 
 == Moving the Camera
 
-If desired, attach the camNode to a MotionTrack to let it travel along waypoints. This is demonstrated in the link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/animation/TestCinematic.java[TestCameraMotionPath.java example].
+If desired, attach the camNode to a MotionEvent to let it travel along waypoints. This is demonstrated in the link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/animation/TestCameraMotionPath.java[TestCameraMotionPath.java] example.

+ 7 - 5
src/docs/asciidoc/jme3/advanced/save_and_load.adoc

@@ -86,8 +86,10 @@ Here you see why we save user data inside spatials – so it can be saved and lo
 
 JME's BinaryExporter can write standard Java objects (String, ArrayList, buffers, etc), JME objects (Savables, such as Material), and primitive data types (int, float, etc). If you are using any custom class together with a Spatial, then the custom class must implement the `com.jme3.export.Savable` interface. There are two common cases where this is relevant:
 
-*  The Spatial is carrying any <<jme3/advanced/custom_controls#,Custom Controls>>. +Example: You used something like `mySpatial.addControl(myControl);`
-*  The Spatial's user data can contain a custom Java object. +Example: You used something like `mySpatial.setUserData(“inventory, myInventory);`
+*  The Spatial is carrying any <<jme3/advanced/custom_controls#,Custom Controls>>. +
+Example: You used something like `mySpatial.addControl(myControl);`
+*  The Spatial's user data can contain a custom Java object. +
+Example: You used something like `mySpatial.setUserData("inventory", myInventory);`
 
 If your custom classes (the user data or the Controls) do not implement Savable, then the BinaryImporter/BinaryExporter cannot save the Spatial!
 
@@ -134,12 +136,12 @@ To make a custom class savable:
 
 .  Implement `Savable` and add the `write()` and `read()` methods as shown in the example above.
 .  Do the following for each non-temporary class field: 
-**  Add one line that `write()`s the data to the JmeExport output capsule. 
+**  Add one line that ``write()``s the data to the JmeExport output capsule. 
 ***  Specify the variable to save, give it a String name (can be the same as the variable name), and specify a default value.
 
-**  Add one line that `read…()`s the data to the JmeImport input capsule. 
+**  Add one line that ``read…()``s the data to the JmeImport input capsule. 
 ***  On the left side of the assignment, specify the class field that you are restoring
-***  On the right side, use the appropriate `capsule.read…()` method for the data type. Specify the String name of the variable (must be the same as you used in the `write() method`), and again specify a default value.
+***  On the right side, use the appropriate `capsule.read…()` method for the data type. Specify the String name of the variable (must be the same as you used in the `write()` method), and again specify a default value.
 
 
 

+ 54 - 26
src/docs/asciidoc/jme3/advanced/shape.adoc

@@ -14,41 +14,69 @@ The simplest type of Meshes are the built-in JME Shapes. You can create Shapes w
 == 3D shapes
 
 
-image::http://www.jmonkeyengine.com/jme/wiki-data/userref/sphere.png[sphere.png,with="108",height="80",align="right"]
-
-image::http://www.jmonkeyengine.com/jme/wiki-data/userref/cylinder.png[cylinder.png,with="108",height="80",align="right"]
-
-image::http://www.jmonkeyengine.com/jme/wiki-data/userref/box.png[box.png,with="108",height="80",align="right"]
-
-
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/box.png[box.png,width="108",height=""]
 *  com.jme3.scene.shape.Box – A cube or cuboid. Single-sided Quad faces (outside only). 
 *  com.jme3.scene.shape.StripBox – A cube or cuboid. Solid filled faces (inside and outside).
+--
 
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/cylinder.png[cylinder.png,width="108",height=""]
 *  com.jme3.scene.shape.Cylinder – A disk or pillar.
-*  com.jme3.scene.shape.Sphere – A ball or elipsoid. 
-
-
-image::http://www.jmonkeyengine.com/jme/wiki-data/userref/pyramid.png[pyramid.png,with="108",height="80",align="right"]
-
-image::http://www.jmonkeyengine.com/jme/wiki-data/userref/cone.png[cone.png,with="108",height="80",align="right"]
-
-image::http://www.jmonkeyengine.com/jme/wiki-data/userref/dome.png[dome.png,with="108",height="80",align="right"]
+--
 
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/sphere.png[sphere.png,width="108",height=""]
+*  com.jme3.scene.shape.Sphere – A ball or elipsoid. 
+--
 
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/dome.png[dome.png,width="108",height=""]
 *  com.jme3.scene.shape.Dome – A semi-sphere, e.g. SkyDome.
-**  For a cone, set the Dome's radialSamples&gt;4 and planes=2. 
-**  For a pyramid, set the Dome's radialSamples=4 and planes=2. 
-
-
+--
+
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/cone.png[cone.png,width="108",height=""]
+*  For a cone, set the Dome's radialSamples&gt;4 and planes=2. 
+--
+
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/pyramid.png[pyramid.png,width="108",height=""]
+*  For a pyramid, set the Dome's radialSamples=4 and planes=2. 
+--
+
+[.float-group]
+--
+[.right.text-left]
+image::http://i204.photobucket.com/albums/bb19/mike_ch_1/torus.png[Torus,width="108",height="80"]
 *  com.jme3.scene.shape.Torus – An single-holed torus or “donut.
-*  com.jme3.scene.shape.PQTorus – A parameterized torus. A PQ-Torus looks like a link:http://en.wikipedia.org/wiki/Torus_knot[donut knotted into spirals]. 
-image::jme3/advanced/nurbs_3-d_surface.png[NURBS surface,with="108",height="80",align="right"]
-
-image::jme3/advanced/220px-trefoil_knot_arb.png[PQ torus knoz,with="108",height="80",align="right"]
-
-image::http://i204.photobucket.com/albums/bb19/mike_ch_1/torus.png[Torus,with="108",height="80",align="right"]
-
+--
+
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/220px-trefoil_knot_arb.png[PQ torus knoz,width="108",height="80"]
+*  com.jme3.scene.shape.PQTorus – A parameterized torus. A PQ-Torus looks like a link:http://en.wikipedia.org/wiki/Torus_knot[donut knotted into spirals].
+--
+
+[.float-group]
+--
+[.right.text-left]
+image::jme3/advanced/nurbs_3-d_surface.png[NURBS surface,width="108",height="80"]
 *  com.jme3.scene.shape.Surface – A curved surface (called link:http://en.wikipedia.org/wiki/File:NURBS_3-D_surface.gif[NURBS]) described by knots, weights and control points. Compare with shape.Curve.
+--
 
 
 == Non-3D shapes

+ 10 - 8
src/docs/asciidoc/jme3/advanced/sky.adoc

@@ -7,7 +7,6 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-+
 
 Here is an example for how you add a static horizon (a background landscape and a sky) to a scene.
 Having a discernable horizon with a suitable landscape (or space, or ocean, or whatever) in the background makes scenes look more realistic than just a single-colored “sky background.
@@ -19,17 +18,14 @@ Adding a sky is extremely easy using the `com.jme3.util.SkyFactory`.
 
 [source,java]
 ----
-
-rootNode.attachChild(SkyFactory.createSky(
-            assetManager, "Textures/Sky/Bright/BrightSky.dds", false));
-
+getRootNode().attachChild(SkyFactory.createSky(getAssetManager(), "Textures/Sky/Bright/BrightSky.dds", SkyFactory.EnvMapType.CubeMap));
 ----
 
 To add a sky you need to supply:
 
 .  The assetManager object to use
 .  A cube or sphere map texture of the sky
-.  Set the boolean to true if you are using a sphere map texture. For a cube map, use false. +Tip: Cube map is the default. You would know if you had created a sphere map.
+.  Set the map type: link:http://javadoc.jmonkeyengine.org/com/jme3/util/SkyFactory.EnvMapType.html[SkyFactory.EnvMapType]. In this instance, CubeMap. 
 
 Internally, the SkyFactory calls the following methods:
 
@@ -44,8 +40,10 @@ As the sky texture we use the sample BrightSky.dds file from jme3test-test-data.
 
 How to create a sky textures?
 
-*  There are many tools out there that generate cube and sphere maps. +Examples for landscape texture generators are Terragen or Bryce.
-*  The actual texture size does not matter, as long as you add the Sky Geometry to the Sky bucket: Everything in the sky bucket will always be infinitely far away behind everything else, and never intersect with your scene. +Of course the higher the resolution, the better it will look. On the other hand, if the graphic is too big, it will slow the game down. 
+*  There are many tools out there that generate cube and sphere maps. +
+Examples for landscape texture generators are Terragen or Bryce.
+*  The actual texture size does not matter, as long as you add the Sky Geometry to the Sky bucket: Everything in the sky bucket will always be infinitely far away behind everything else, and never intersect with your scene. +
+Of course the higher the resolution, the better it will look. On the other hand, if the graphic is too big, it will slow the game down. 
 *  A box or sphere map is the simplest solution. But you can use any Node as sky, even complex sets of geometries and quads with animated clouds, blinking stars, city skylines, etc.
 *  JME3 supports cube maps in PNG, JPG, or (compressed) DDS format.
 
@@ -57,3 +55,7 @@ Box or Sphere?
 *  If you have access to sphere map textures – specially projected sky images that fit inside a sphere – then you use a SkySphere or SkyDome. 
 **  link:http://wiki.delphigl.com/index.php/Datei:Skysphere.jpg[SkySphere example]
 
+For more information on Skymap creation see: 
+
+*  <<jme3/advanced/free_skymaps#,How to create free skymaps>>
+*  <<jme3/external/blender.html#skybox-baking#,SkyBox baking>>

+ 15 - 0
src/docs/asciidoc/jme3/advanced/sourcecode.adoc

@@ -0,0 +1,15 @@
+= Source Code
+:author: 
+:revnumber: 
+:revdate: 2016/03/17 20:48
+:relfileprefix: ../../
+:imagesdir: ../..
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+
+== Normen Hansen Videos
+
+The source code and assets for the Normen Hansen video link:http://www.youtube.com/watch?v=MNDiZ9YHIpM[How to control any scene node] and link:http://www.youtube.com/watch?v=-OzRZscLlHY[How to remote control a character in a scene] can be found in the zip archive link:https://github.com/jMonkeyEngine/wiki/raw/master/src/docs/resources/Scenes/SDK-UsecaseDemo_1.zip[SDK-UsecaseDemo_1.zip].
+
+You can read about this code on the jMonkeyEngine forum thread, link:https://hub.jmonkeyengine.org/t/new-sdk-video-tutorial-latest-vol2/25185[New Sdk Video Tutorial (Latest:Vol2)].
+

+ 42 - 38
src/docs/asciidoc/jme3/advanced/spatial.adoc

@@ -1,6 +1,6 @@
 = Spatial
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: spatial, node, mesh, geometry, scenegraph
 :relfileprefix: ../../
@@ -8,7 +8,7 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-This is an introduction to the concept of Spatials, the elements of the 3D scene graph. The scene graph is a data structure that manages all objects in your 3D world. For example, the scene graph keeps track of the 3D models that you load and position. When you extend a Java class from com.jme3.app.SimpleApplication, you automatically inherit the scene graph and its rootNode. 
+This is an introduction to the concept of Spatials, the elements of the 3D scene graph. The scene graph is a data structure that manages all objects in your 3D world. For example, the scene graph keeps track of the 3D models that you load and position. When you extend a Java class from com.jme3.app.SimpleApplication, you automatically inherit the scene graph and its rootNode.
 
 The rootNode is the central element of the scene graph. Even if the scene graph is empty, it always contains at least the rootNode. We _attach_ Spatials to the rootNode. Attached Spatials are always in a _parent-child relationship_. Every time you attach a Spatial to something, it is implicitly detached from its previous parent. A Spatial can have only one parent. A Spatial can have several children.
 
@@ -20,36 +20,40 @@ If you think you need to understand the scene graph concept better, please read
 In your Java code, a Spatial is either an instance of `com.jme3.scene.Node` or a `com.jme3.scene.Geometry` instance. You use the two types of Spatials for different purposes:
 
 
-image::jme3/intermediate/scene-graph.png[scene-graph.png,with="",height="",align="center"]
+image::jme3/intermediate/scene-graph.png[scene-graph.png,width="",height="",align="center"]
 
-[cols="3", options="header"]
+[cols="10,45,45", options="header"]
 |===
 
-a| 
-2+a|com.jme3.scene.Spatial 
+a|
+2+a|com.jme3.scene.Spatial
 
-a| Purpose: 
-2+a| A Spatial is an abstract data structure that stores user data and transformations (= translation, rotation, scale) of elements of the 3D scene graph. Spatials can be saved and loaded using the <<jme3/advanced/asset_manager#,Asset Manager>>. 
+a| Purpose:
+2+a| A Spatial is an abstract data structure that stores user data and transformations (= translation, rotation, scale) of elements of the 3D scene graph. Spatials can be saved and loaded using the <<jme3/advanced/asset_manager#,Asset Manager>>.
 
-<a|  
-a| com.jme3.scene.Geometry 
-a| com.jme3.scene.Node 
+<a|
+a| com.jme3.scene.Geometry
+a| com.jme3.scene.Node
 
-a| Visibility: 
-a| A Geometry represents a *visible* 3D object in the scene graph. 
-a| A Node is an *invisible “handle* for a group of Spatials in the scene graph. 
+a| Visibility:
+a| A Geometry represents a *visible* 3D object in the scene graph.
+a| A Node is an *invisible “handle* for a group of Spatials in the scene graph.
 
-<a| Purpose:    
-a| Use Geometries to represent an object's *look*: Every Geometry contains a polygon mesh and a material, specifying its shape, color, texture, and opacity/transparency. +You attach Geometries to Nodes. 
-a| Use Nodes to *structure and group* Geometries and other Nodes. Every Node is attached to one parent node, and each node can have zero or more children (Nodes or Geometries) attached to itself. +*When you transform (move, rotate, etc) a parent node, all its children are transformed (moved, rotated, etc).* 
+<a| Purpose:
+a| Use Geometries to represent an object's *look*: Every Geometry contains a polygon mesh and a material, specifying its shape, color, texture, and opacity/transparency. +
+You attach Geometries to Nodes.
+a| Use Nodes to *structure and group* Geometries and other Nodes. Every Node is attached to one parent node, and each node can have zero or more children (Nodes or Geometries) attached to itself. +
+*When you transform (move, rotate, etc) a parent node, all its children are transformed (moved, rotated, etc).*
 
-<a| Content:    
-<a| Transformations; custom user data; +mesh and material;  
-a| Transformations; custom user data; +no mesh, no material.
+<a| Content:
+<a| Transformations; custom user data; +
+mesh and material;
+a| Transformations; custom user data; +
+no mesh, no material.
 
-<a| Examples:   
-a| Box, sphere, player, building, terrain, vehicle, missiles, NPCs, etc… 
-a| rootNode, guiNode, audioNode, a custom grouping node such as vehicleNode or shipNode with passengers attached, etc. 
+<a| Examples:
+a| Box, sphere, player, building, terrain, vehicle, missiles, NPCs, etc…
+a| rootNode, guiNode, audioNode, a custom grouping node such as vehicleNode or shipNode with passengers attached, etc.
 
 |===
 
@@ -72,7 +76,7 @@ The polygon <<jme3/advanced/mesh#,Mesh>> inside a Geometry can be one of three t
 
 == What is a Clone?
 
-Cloned spatials share the same mesh, while each cloned spatial can have its own local transformation (translation, rotation, and scale) in the scene. This means you only use `clone()` on spatials whose meshes never change. The most common use case for cloning is when you use several Spatials that are based on the same <<jme3/advanced/shape#,Shape>>s (e.g. trees, crates). 
+Cloned spatials share the same mesh, while each cloned spatial can have its own local transformation (translation, rotation, and scale) in the scene. This means you only use `clone()` on spatials whose meshes never change. The most common use case for cloning is when you use several Spatials that are based on the same <<jme3/advanced/shape#,Shape>>s (e.g. trees, crates).
 
 The second use case is: When you load a model using `loadModel()` from the AssetManager, you may automatically get a `clone()`ed object. In particular:
 
@@ -91,12 +95,12 @@ Usually there is no need to manually use any of the `clone()` methods on models.
 
 == How to Add Fields and Methods to a Spatial
 
-You can include custom user data –that is, custom Java objects and methods– in Nodes and Geometries. This is very useful for maintaining information about a game element, such as health, budget, ammunition, inventory, equipment, etc for players, or landmark locations for terrains, and much more. 
+You can include custom user data –that is, custom Java objects and methods– in Nodes and Geometries. This is very useful for maintaining information about a game element, such as health, budget, ammunition, inventory, equipment, etc for players, or landmark locations for terrains, and much more.
 
 
 [IMPORTANT]
 ====
-You want to add custom accessor methods to a spatial? Do not extend `Node` or `Geometry`, use <<jme3/advanced/custom_controls#,Custom Controls>> instead. You want to add custom fields to a spatial? Do not extend `Node` or `Geometry`, use the built-in `setUserData()` method instead. Where ever the Spatial is accessible, you can easily access the object's class fields (user data) and accessors (control methods) this way. 
+You want to add custom accessor methods to a spatial? Do not extend `Node` or `Geometry`, use <<jme3/advanced/custom_controls#,Custom Controls>> instead. You want to add custom fields to a spatial? Do not extend `Node` or `Geometry`, use the built-in `setUserData()` method instead. Where ever the Spatial is accessible, you can easily access the object's class fields (user data) and accessors (control methods) this way.
 ====
 
 
@@ -128,7 +132,7 @@ public void setHealth(int h) {
 
 ----
 
-Elsewhere in your code, you can access this data wherever you have access to the Spatial `playerNode`. 
+Elsewhere in your code, you can access this data wherever you have access to the Spatial `playerNode`.
 
 [source,java]
 ----
@@ -139,9 +143,9 @@ playerNode.getControl(PlayerControl.class).setHealth(99);
 
 ----
 
-*  You can add as many data objects (of String, Boolean, Integer, Float, Array types) to a Spatial as you want. Just make sure to label them with unique case-sensitive strings (`health`, `Inventory`, `equipment`, etc). 
-*  The saved data can even be a custom Java object if you make the custom Java class <<jme3/advanced/save_and_load#custom_savable_class,implement the Savable interface>>! 
-*  When you save a Spatial as a .j3o file, the custom data is saved, too, and all Savables are restored the next time you load the .j3o! 
+*  You can add as many data objects (of String, Boolean, Integer, Float, Array types) to a Spatial as you want. Just make sure to label them with unique case-sensitive strings (`health`, `Inventory`, `equipment`, etc).
+*  The saved data can even be a custom Java object if you make the custom Java class <<jme3/advanced/save_and_load#custom_savable_class,implement the Savable interface>>!
+*  When you save a Spatial as a .j3o file, the custom data is saved, too, and all Savables are restored the next time you load the .j3o!
 
 This is how you list all data keys that are already defined for one Spatial:
 
@@ -157,11 +161,11 @@ for(String key : spatial.getUserDataKeys()){
 
 Often after you load a scene or model, you need to access a part of it as an individual Geometry in the scene graph. Maybe you want to swap a character's weapon, or you want to play a door-opening animation. First you need to know the unique name of the sub-mesh.
 
-.  Open the model in a 3D mesh editor, or in the jMonkeyEngine SDK's Scene Composer. 
+.  Open the model in a 3D mesh editor, or in the jMonkeyEngine SDK's Scene Composer.
 .  Find out the existing names of sub-meshes in the model.
 .  Assign unique names to sub-meshes in the model if neccessary.
 
-In the following example, the Node `house` is the loaded model. The sub-meshes in the Node are called its children. The String, here `door 12`, is the name of the mesh that you are searching. 
+In the following example, the Node `house` is the loaded model. The sub-meshes in the Node are called its children. The String, here `door 12`, is the name of the mesh that you are searching.
 
 [source,java]
 ----
@@ -177,16 +181,16 @@ There are two types of culling: Face culling, and view frustrum culling.
 
 *Face culling* means not drawing certain polygons of a mesh. Face culling behaviour is a property of the material.
 
-Usage: The “inside of a mesh (the so called backface) is typically never visible to the player, and as an optimization, the `Back` mode skips calculating all backfaces by default. Activating the `Off` or `Front` modes can be useful when you are debugging <<jme3/advanced/custom_meshes#,custom meshes>> and try to identify accidental inside-out faces. 
+Usage: The “inside of a mesh (the so called backface) is typically never visible to the player, and as an optimization, the `Back` mode skips calculating all backfaces by default. Activating the `Off` or `Front` modes can be useful when you are debugging <<jme3/advanced/custom_meshes#,custom meshes>> and try to identify accidental inside-out faces.
 
 You can switch the com.jme3.material.RenderState.FaceCullMode to either:
 
-*  `FaceCullMode.Back` (default) – Only the frontsides of a mesh are drawn. Backface culling is the default behaviour. 
+*  `FaceCullMode.Back` (default) – Only the frontsides of a mesh are drawn. Backface culling is the default behaviour.
 *  `FaceCullMode.Front` – Only the backsides of a mesh are drawn. A mesh with frontface culling will most likely be invisible. Used for debugging “inside-out custom meshes.
-*  `FaceCullMode.FrontAndBack` – Use this to make a mesh temporarily invisible. 
+*  `FaceCullMode.FrontAndBack` – Use this to make a mesh temporarily invisible.
 *  `FaceCullMode.Off` – Every side of the mesh is drawn. Looks normal, but slows down large scenes.
 
-Example: 
+Example:
 
 [source,java]
 ----
@@ -200,7 +204,7 @@ The decision what is visible and what not, is done automatically by the engine (
 *  `CullHint.Dynamic` – Default, faster because it doesn't waste time with objects that are out of view.
 *  `CullHint.Never` – Calculate and draw everything always (even if it does not end up on the user's screen because it's out of sight). Slower, but can be used while debugging custom meshes.
 *  `CullHint.Always` – The whole spatial is culled and is not visible. A fast way to hide a Spatial temporarily. Culling a Spatial is faster then detaching it, but it uses more memory.
-*  `CullHint.Inherit` – Inherit culling behaviour from parent node. 
+*  `CullHint.Inherit` – Inherit culling behaviour from parent node.
 
 Example:
 

+ 32 - 25
src/docs/asciidoc/jme3/advanced/steer_behaviours.adoc

@@ -1,6 +1,6 @@
 = Steer Behaviors
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -8,17 +8,24 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 Steer behaviors allows you to control the locomotion of “characters”, this can reduce drastically the time needed to develop a game since for almost every game we need to set how these “characters” will be moving around the scene.
-+
-+
-*Steer behaviors in action:*
-image:jme3/advanced/youtube_yyztntsgv00[youtube_yyztntsgv00,with="",height=""]
-+
-Be sure that you have checked the demos: They can be downloaded here: link:http://localhost/jmeSteerTesting/downloads.php[jmesteer.bdevel.org]
+
+[cols="2",caption=]
+.YouTube
+|===
+
+a|.Steer behaviors in action
+image:jme3/advanced/hqdefault.jpg[youtu.be/yyzTntsGV00,width="",height="",link=https://youtu.be/yyzTntsGV00]
+a|
+
+|===
+ 
+
+Be sure that you have checked the demos: They can be downloaded here: link:http://jmesteer.bdevel.org[jmesteer.bdevel.org]
 
 
 == First steps
 
-The steer behaviors AI is integrated with MonkeyBrains so before start coding be sure that you have checked the link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:monkey_brains[monkey brains documentation]
+The steer behaviors AI is integrated with MonkeyBrains so before start coding be sure that you have checked the <<jme3/advanced/monkey_brains#,monkey brains documentation>>.
 
 Be sure to create a reference to MonkeyBrains from your project.
 
@@ -40,7 +47,7 @@ Finally, do not forget to import the `com.jme3.ai.agents.behaviors.npc.steering`
 *  Alignment
 *  Obstacle Avoidance
 *  Unaligned obstacle avoidance
-*  Hide 
+*  Hide
 *  Slow
 *  Queuing
 *  Containment
@@ -58,25 +65,25 @@ All the behaviours extend from the `AbstractSteeringBehavior` class.
 
 == Adding a steer behavior
 
-Create instances from the steer behavior classes, They are located in the `com.jme3.ai.agents.behaviors.npc.steering` package. 
+Create instances from the steer behavior classes, They are located in the `com.jme3.ai.agents.behaviors.npc.steering` package.
 
-If we want to add more than one steer behavior, we need to create a container: 
+If we want to add more than one steer behavior, we need to create a container:
 [WARNING]
 ====
-If you add more than one steer behavior to a `SimpleMainBehavior` it will cause problems in the rotation of the agents. 
+If you add more than one steer behavior to a `SimpleMainBehavior` it will cause problems in the rotation of the agents.
 ====
 
 [cols="2", options="header"]
 |===
 
-a| Container 
-a| Purpose 
+a| Container
+a| Purpose
 
-a| CompoundSteeringBehavior 
-a| Contains and merges several `AbstractSteeringBehavior` instances 
+a| CompoundSteeringBehavior
+a| Contains and merges several `AbstractSteeringBehavior` instances
 
-a| BalancedCompoundSteeringBehavior 
-<a| Each force generated inside this container is reduced in relation with a proportion factor: “Partial Force / “Total container force  
+a| BalancedCompoundSteeringBehavior
+<a| Each force generated inside this container is reduced in relation with a proportion factor: “Partial Force / “Total container force
 
 |===
 
@@ -130,7 +137,7 @@ To assign priority layers add behaviors with the following function:
 
 [TIP]
 ====
-To optimize the process speed add the behaviors with the lowest priority first. 
+To optimize the process speed add the behaviors with the lowest priority first.
 ====
 
 
@@ -153,7 +160,7 @@ Example:
 ----
 
     Plane horizontalPlane = new Plane(new Vector3f(0,1,0), 0);
-    
+
     steerBehavior1.setupStrengthControl(0.5f); //Force reduced a 50%
     steerBehavior2.setupStrengthControl(horizontalPlane); //Force contained in the XZ plane
     steerContainer.setupStrengthControl(horizontalPlane, 2f); //Contained in the XZ plane and increased a 100%
@@ -173,9 +180,9 @@ The responsible for the agent's acceleration is the vector returned in the `calc
     @Override
     protected Vector3f calculateRawSteering() {
         Vector3f steerForce = Vector3f.ZERO;
-        
+
         //calculations
-        
+
         return steerForce;
     }
 
@@ -218,11 +225,11 @@ Example:
 ----
 
     public class CustomSteeringExceptions extends SteeringExceptions  {
-    
+
         public static class CustomRuntimeException extends SteeringBehaviorException {
             public CustomRuntimeException(String msg) { super(msg); }
         }
-    
+
         // ... other exceptions ...
     }
 

+ 6 - 6
src/docs/asciidoc/jme3/advanced/swing_canvas.adoc

@@ -8,8 +8,8 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-3D games are typically played full-screen, or in a window that takes over the mouse and all inputs. However it is also possible to embed a jME 3 canvas in a standard Swing application. ++
-This can be useful when you create some sort of interactive 3D viewer with a user interface that is more complex than just a HUD: For instance an interactive scientific demo, a level editor, or a game character designer. ++
+3D games are typically played full-screen, or in a window that takes over the mouse and all inputs. However it is also possible to embed a jME 3 canvas in a standard Swing application. +
+This can be useful when you create some sort of interactive 3D viewer with a user interface that is more complex than just a HUD: For instance an interactive scientific demo, a level editor, or a game character designer.
 
 *  Advantages:
 **  You can use Swing components (frame, panels, menus, controls) next to your jME3 game.
@@ -24,7 +24,7 @@ Here is the full link:http://code.google.com/p/jmonkeyengine/source/browse/trunk
 
 == Extending SimpleApplication
 
-You start out just the same as for any jME3 game: The base application, here SwingCanvasTest, extends `com.jme3.app.SimpleApplication`. As usual, you use `simpleInitApp()` to initialize the scene, and `simpleUpdate()` as event loop. ++
+You start out just the same as for any jME3 game: The base application, here SwingCanvasTest, extends `com.jme3.app.SimpleApplication`. As usual, you use `simpleInitApp()` to initialize the scene, and `simpleUpdate()` as event loop. +
 The camera's default behaviour in SimpleApplication is to capture the mouse, which doesn't make sense in a Swing window. You have to deactivate and replace this behaviour by `flyCam.setDragToRotate(true);` when you initialize the application:
 
 [source,java]
@@ -43,7 +43,7 @@ In short: The first thing that is different is the `main()` method. We don't cal
 
 == Main() and Runnable()
 
-The Swing isn't thread-safe and doesn't allow us to keep the jME3 canvas up-to-date. This is why we create a runnable for the jME canvas and queue it in the AWT event thread, so it can be invoked “later in the loop, when Swing is ready with updating its own stuff. ++
+The Swing isn't thread-safe and doesn't allow us to keep the jME3 canvas up-to-date. This is why we create a runnable for the jME canvas and queue it in the AWT event thread, so it can be invoked “later in the loop, when Swing is ready with updating its own stuff. +
 In the SwingCanvasTest's main() method, create a queued runnable(). It will contain the jME canvas and the Swing frame.
 
 [source,java]
@@ -69,7 +69,7 @@ Note that you have to use app.enqueue() when modifying objects in the scene from
 
 === Creating the Canvas
 
-Here in the `run()` method, we start the jME application, create its canvas, create a Swing frame, and add everything together. ++
+Here in the `run()` method, we start the jME application, create its canvas, create a Swing frame, and add everything together. +
 Specify the com.jme3.system.AppSettings so jME knows the size of the Swing panel that we put it into. The application will not ask the user for display settings, you have to specify them in advance.
 
 [source,java]
@@ -106,7 +106,7 @@ JFrame window = new JFrame("Swing Application");
 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 ----
 
-We create a standard JPanel inside the JFrame. Give it any Layout you wish – here we use a simple Flow Layout. Where the code sample says “Some Swing Component, this is where you add your buttons and controls. ++
+We create a standard JPanel inside the JFrame. Give it any Layout you wish – here we use a simple Flow Layout. Where the code sample says “Some Swing Component, this is where you add your buttons and controls. +
 The important step is to add() the canvas component into the panel, like all the other Swing components.
 
 [source,java]

+ 43 - 38
src/docs/asciidoc/jme3/advanced/terrain.adoc

@@ -1,27 +1,23 @@
 = TerraMonkey - The jMonkeyEngine Terrain System
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-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:
-
-*  link:http://hub.jmonkeyengine.org/2011/06/17/infinite-terrains-with-terraingrid-new-features-in-terramonkey/[New features]
-*  link:http://hub.jmonkeyengine.org/2011/07/03/terramonkey-more-textures-tools-and-undo/[More textures and Tools]
-
 
 == Overview
 
 
-image::http://jmonkeyengine.org/wp-content/uploads/2011/07/terrain-blogpost-july.png[terrain-blogpost-july.png,with="400",height="300",align="right"]
+//image::http://jmonkeyengine.org/wp-content/uploads/2011/07/terrain-blogpost-july.png[terrain-blogpost-july.png,width="400",height="300",align="right"]
 
 
 TerraMonkey is a GeoMipMapping quad tree of terrain tiles that supports real time editing and texture splatting. That's a mouth full! Lets look at each part:
 
-*  *GeoMipMapping:* a method of changing the level of detail (LOD) of geometry tiles based on how far away they are from the camera. Between the edges of two tiles, it will seam those edges together so you don't get gaps or holes. For an in-depth read on how it works, here is a pdf link:http://www.flipcode.com/archives/article_geomipmaps.pdf[http://www.flipcode.com/archives/article_geomipmaps.pdf].
+*  *GeoMipMapping:* a method of changing the level of detail (LOD) of geometry tiles based on how far away they are from the camera. Between the edges of two tiles, it will seam those edges together so you don't get gaps or holes. For an in-depth read on how it works, read link:http://www.flipcode.com/archives/article_geomipmaps.pdf[Fast Terrain Rendering Using Geometrical MipMapping
+].
 *  *Quad Tree:* The entire terrain structure is made up of TerrainPatches (these hold the actual meshes) as leaves in a quad tree (TerrainQuad). TerrainQuads are subdivided by 4 until they reach minimum size, then a TerrainPatch is created, and that is where the actual geometry mesh lives. This allows for fast culling of the terrain that you can't see.
 *  *Splatting:* The ability to paint multiple textures onto your terrain. What differs here from JME2 is that this is all done in a shader, no more render passes. So it performs much faster.
 *  *Real-time editing:* <<sdk/terrain_editor#,TerraMonkey terrains are editable in jMonkeyEngine SDK>>, and you are able to modify them in real time, for example by raising and lowering the terrain.
@@ -33,7 +29,7 @@ TerraMonkey is a GeoMipMapping quad tree of terrain tiles that supports real tim
 *  GeoMipMapping: LodControl optimizes the level of detail
 *  Terrain can be randomized or generated from a heightmap
 *  jMonkeyEngine SDK terrain editor
-*  Streaming <<jme3/advanced/endless_terraingrid#,terrain grid>> (ie. infinite terrain)
+*  Streaming <<jme3/advanced/endless_terraingrid#,terrain grid>> (i.e. infinite terrain)
 
 
 === Planned Features:
@@ -44,24 +40,25 @@ TerraMonkey is a GeoMipMapping quad tree of terrain tiles that supports real tim
 
 == Sample Code
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainTest.java[TerrainTest.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainTestAdvanced.java[TerrainTestAdvanced.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainTestCollision.java[TerrainTestCollision.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainTestModifyHeight.java[TerrainTestModifyHeight.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainTestReadWrite.java[TerrainTestReadWrite.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainTest.java[TerrainTest.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainTestAdvanced.java[TerrainTestAdvanced.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainTestCollision.java[TerrainTestCollision.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainTestModifyHeight.java[TerrainTestModifyHeight.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/terrain/TerrainTestReadWrite.java[TerrainTestReadWrite.java]
 
 
 == Geo Mip Mapping
 
 
-image::jme3/advanced/terrain-lod-high-medium-low.png[The wiremesh of a terrain with visible differences in levels of detail (LOD),with="",height="",align="right"]
+image::jme3/advanced/terrain-lod-high-medium-low.png[The wiremesh of a terrain with visible differences in levels of detail (LOD),width="",height="",align="left"]
 
 
 You have seen GeoMipMapping implemented in games before. This is where the farther away terrain has fewer polygons, and as you move closer, more polygons fill in. The whole terrain is divided into a grid of patches, and each one has its own level of detail (LOD). The GeoMipMapping algorithm looks at each patch, and its neighbours, to determine how to render the geometry. It will seam the edges between two patches with different LOD.
 
 GeoMipMapping often leads to “popping where you see the terrain switch from one LOD to another. TerraMonkey has been designed so you can swap out different LOD calculation algorithms based on what will look best for your game. You can do this with the LodCalculator interface.
 
-GeoMipMapping in TerraMonkey has been split into several parts: the terrain quad tree, and the LODGeomap. The geomap deals with the actual LOD and seaming algorithm. So if you want a different data structure for your terrain system, you can re-use this piece of code. The quad tree (TerrainQuad and TerrainPatch) provide a means to organize the LODGeomaps, notify them of their neighbour's LOD change, and to update the geometry when the LOD does change. To change the LOD it does this by changing the index buffer of the triangle strip, so the whole geometry doesn't have to be re-loaded onto the video card. If you are eager, you can read up more detail how GeoMipMapping works here: link:http://www.flipcode.com/archives/article_geomipmaps.pdf[www.flipcode.com/archives/article_geomipmaps.pdf]
+GeoMipMapping in TerraMonkey has been split into several parts: the terrain quad tree, and the LODGeomap. The geomap deals with the actual LOD and seaming algorithm. So if you want a different data structure for your terrain system, you can re-use this piece of code. The quad tree (TerrainQuad and TerrainPatch) provide a means to organize the LODGeomaps, notify them of their neighbour's LOD change, and to update the geometry when the LOD does change. To change the LOD it does this by changing the index buffer of the triangle strip, so the whole geometry doesn't have to be re-loaded onto the video card. If you are eager for more detail on how GeoMipMapping works read: link:http://www.flipcode.com/archives/article_geomipmaps.pdf[Fast Terrain Rendering Using Geometrical MipMapping
+].
 
 
 == Terrain Quad Tree
@@ -71,21 +68,21 @@ TerraMonkey is a quad tree. Each node is a TerrainQuad, and each leaf is a Terra
 
 == Texture Splatting
 
-When you “slap a texture on a mesh, the whole mesh looks the same. For big meshes (such as terrains) that is undesirable because it looks very boring (your whole landscape would be all rock, or all grass, or all sand). Texture Splatting is a technique that lets you “paint several textures into one combined texure. Each of the splat textures has an opacity value so you can define where it is visible in the final overall texture.
+When you '`slap`' a texture on a mesh, the whole mesh looks the same. For big meshes (such as terrains) that is undesirable because it looks very boring (your whole landscape would be all rock, or all grass, or all sand). Texture Splatting is a technique that lets you “paint several textures into one combined texure. Each of the splat textures has an opacity value so you can define where it is visible in the final overall texture.
 
-The default material for TerraMonkey is TerrainLighting.j3md. This material combines several texture maps to produce the final custom texture. Remember, Diffuse Maps are the main textures that define the look; optionally, each Diffuse Map can be enhanced with a Normal Map; Alpha Maps describe the opacity of each Diffuse Map used (one color –red, green, blue, or alpha– stands for one Diffuse Map's opacity); Glow and Specular Maps define optional effects. 
+The default material for TerraMonkey is TerrainLighting.j3md. This material combines several texture maps to produce the final custom texture. Remember, Diffuse Maps are the main textures that define the look; optionally, each Diffuse Map can be enhanced with a Normal Map; Alpha Maps describe the opacity of each Diffuse Map used (one color –red, green, blue, or alpha– stands for one Diffuse Map's opacity); Glow and Specular Maps define optional effects.
 
 
 [IMPORTANT]
 ====
-We recommend to link:http://jmonkeyengine.org/wiki/doku.php/sdk:terrain_editor[create and edit Splat Textures for terrains visually in the jMonkeyEngine SDK], and not do it manually. If you are simply curious about how the SDK's terrain texture plugin works, or if you indeed want to generate materials manually, then read on for the implementation details.
+We recommend to <<sdk/terrain_editor#,create and edit Splat Textures for terrains visually in the jMonkeyEngine SDK>>, and not do it manually. If you are simply curious about how the SDK's terrain texture plugin works, or if you indeed want to generate materials manually, then read on for the implementation details.
 ====
 
 
 Here are the names of TerrainLighting.j3md's material properties:
 
-
-image::http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Textures/Terrain/splat/mountains512.png[A heightmap encodes the topological highs and lows of the terrain,with="128",height="128",align="right"]
+[.right.text-left]
+image::jme3/beginner/mountains512.png[A heightmap encodes the topological highs and lows of the terrain,width="128",height="128"]
 
 
 *  1-3 Alpha Maps
@@ -94,28 +91,32 @@ image::http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Textures/T
 ***  `AlphaMap_2`
 
 *  12 Diffuse and/or Normal Maps (either in 6 pairs, or 12 stand-alone Diffuse Maps)
-***  `DiffuseMap`, `DiffuseMap_0_scale`, `NormalMap` 
+***  `DiffuseMap`, `DiffuseMap_0_scale`, `NormalMap`
 ***  `DiffuseMap_1`, `DiffuseMap_1_scale`, `NormalMap_1`
 ***  `DiffuseMap_2`, `DiffuseMap_2_scale`, `NormalMap_2`
 ***  `DiffuseMap_3`, `DiffuseMap_3_scale`, `NormalMap_3` 
-image::http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Textures/Terrain/splat/alphamap.png[An alpha map can describe where 4 textures are painted onto the terrain.,with="128",height="128",align="right"]
+image:jme3/beginner/alphamap.png[An alpha map can describe where 4 textures are painted onto the terrain.,width="128",height="128",align="right"]
 
 ***  `DiffuseMap_4`, `DiffuseMap_4_scale`, `NormalMap_4`
-***  … 
+***  …
 ***  `DiffuseMap_11`, `DiffuseMap_11_scale`, `NormalMap_11`
 
-*  Light maps
+*  Light maps
 ***  `GlowMap`
 ***  `SpecularMap`
 
 
-*Note:* `DiffuseMap_0_scale` is a float value (e.g. 1.0f); you must specify one scale per Diffuse Map.
+[NOTE]
+====
+`DiffuseMap_0_scale` is a float value (e.g. 1.0f); you must specify one scale per Diffuse Map.
+====
 
 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)!
 
 Adhere to the following constraints:
 
-image::http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Textures/Terrain/splat/road.jpg[The Diffuse Map of one of the terrain textures depicts the colors of a paved surface,with="",height="",align="right"]
+[.right.text-left]
+image::jme3/beginner/road.jpg[The Diffuse Map of one of the terrain textures depicts the colors of a paved surface,width="",height=""]
 
 
 *  1-12 Diffuse Maps. One Diffuse Map is the minimum!
@@ -127,16 +128,17 @@ image::http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Textures/T
 
 Here are some common examples what this means:
 
-image::http://jmonkeyengine.googlecode.com/svn/trunk/engine/test-data/Textures/Terrain/splat/road_normal.png[The Normal Map of one of the terrain textures depicts the bumpiness of a paved surface,with="",height="",align="right"]
+[.right.text-left]
+image::jme3/beginner/road_normal.png[The Normal Map of one of the terrain textures depicts the bumpiness of a paved surface,width="",height=""]
 
 
-*  3 Alpha + 11 Diffuse + 1 Normal. 
-*  3 Alpha + 11 Diffuse + 1 Glow. 
-*  3 Alpha + 11 Diffuse + 1 Specular. 
-*  3 Alpha + 10 Diffuse + 3 Normal. 
-*  3 Alpha + 10 Diffuse + 1 Normal + 1 Glow + 1 Specular. 
-*  2 Alpha + 8 Diffuse + 6 Normal. 
-*  2 Alpha + 6 Diffuse + 6 Normal + 1 Glow + 1 Specular. 
+*  3 Alpha + 11 Diffuse + 1 Normal.
+*  3 Alpha + 11 Diffuse + 1 Glow.
+*  3 Alpha + 11 Diffuse + 1 Specular.
+*  3 Alpha + 10 Diffuse + 3 Normal.
+*  3 Alpha + 10 Diffuse + 1 Normal + 1 Glow + 1 Specular.
+*  2 Alpha + 8 Diffuse + 6 Normal.
+*  2 Alpha + 6 Diffuse + 6 Normal + 1 Glow + 1 Specular.
 *  1 Alpha + 3 Diffuse + 3 Normal + 1 Glow + 1 Specular (rest unused)
 
 You can hand-paint Alpha, Diffuse, Glow, and Specular maps in a drawing program, like Photoshop. Define each splat texture in the Alpha Map in either Red, Green, Blue, or Alpha (=RGBA). The JmeTests project bundled in the <<sdk#,SDK>> includes some image files that show you how this works. The example images show a terrain heightmap next to its Alpha Map (which has been prepare for 3 Diffuse Maps), and one examplary Diffuse/Normal Map pair.
@@ -198,7 +200,7 @@ Next we create the actual terrain.
 terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());
 terrain.setMaterial(matRock);
 terrain.setLocalScale(2f, 1f, 2f); // scale to make it less steep
-List<Camera> cameras = new ArrayList<Camera>();
+List<Camera> cameras = new ArrayList<>();
 cameras.add(getCamera());
 TerrainLodControl control = new TerrainLodControl(terrain, cameras);
 terrain.addControl(control);
@@ -206,7 +208,9 @@ rootNode.attachChild(terrain);
 
 ----
 
-PS: As an alternative to an image-based height map, you can also generate a Hill hightmap:
+[TIP]
+====
+As an alternative to an image-based height map, you can also generate a Hill hightmap:
 
 [source,java]
 ----
@@ -214,3 +218,4 @@ PS: As an alternative to an image-based height map, you can also generate a Hill
 heightmap = new HillHeightMap(1025, 1000, 50, 100, (byte) 3);
 
 ----
+====

+ 6 - 2
src/docs/asciidoc/jme3/advanced/terrain_collision.adoc

@@ -5,6 +5,7 @@
 :keywords: terrain, collision
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
@@ -70,7 +71,8 @@ public class HelloTerrainCollision extends SimpleApplication
     /** Set up Physics */
     bulletAppState = new BulletAppState();
     stateManager.attach(bulletAppState);
-    //bulletAppState.getPhysicsSpace().enableDebug(assetManager);
+    //Uncomment for debugging. 
+    //bulletAppState.setDebugEnabled(true);
     
     flyCam.setMoveSpeed(100);
     setUpKeys();
@@ -209,7 +211,7 @@ public class HelloTerrainCollision extends SimpleApplication
 }
 ----
 
-To try this code, create a New Project → JME3 → BasicGame using the default settings. Paste the sample code over the pregenerated Main.java class. Chnage the package to “mygame if necessary. Open the Project Properties, Libraries, and add the `jme3-test-data` library to make certain you have all the files. 
+To try this code, create a `menu:New Project[JME3 > BasicGame]` using the default settings. Paste the sample code over the pregenerated Main.java class. Change the package to '`mygame`' if necessary. Open the `menu:File[Project Properties > Libraries]` and add the `jme3-test-data` library to make certain you have all the files. 
 
 Compile and run the code. You should see a terrain. You can use the WASD keys and the mouse to run up and down the hills.
 
@@ -234,6 +236,7 @@ Read <<jme3/beginner/hello_collision#,Hello Collision>> for details of the follo
 .  The `ActionListener` (`onAction()`) lets you reconfigure the input handling for the first-person player, so it takes collision detection into account.
 .  The custom `setUpKeys()` method loads your reconfigured input handlers. They now don't just walk blindly, but calculate the `walkDirection` vector that we need for collision detection.
 .  `simpleUpdate()` uses the `walkDirection` vector and makes the character walk, while taking obstacles and solid walls/floor into account. 
+
 [source,java]
 ----
 player.setWalkDirection(walkDirection);
@@ -273,6 +276,7 @@ You attach the `terrain` and the first-person `player` to the rootNode, and to t
 You see that you can combine snippets of sample code (such as HelloTerrain and HelloCollision), and create a new application from it that combines two features into soemthing new.
 
 You should spawn high up in the area and fall down to the map, giving you a few seconds to survey the area.  Then walk around and see how you like the lay of the land.
+
 '''
 
 See also:

+ 4 - 2
src/docs/asciidoc/jme3/advanced/traverse_scenegraph.adoc

@@ -20,9 +20,11 @@ You can run a search across the whole scene graph and search for individual Spat
 
 *Example 2:*
 
-.  You created a mostly static scene in the jMonkeyEngine SDK and exported it as .j3o file. +The scene also contains interactive objects, for example a particle emitter, spatials with user data, or spatials with custom controls. 
+.  You created a mostly static scene in the jMonkeyEngine SDK and exported it as .j3o file. +
+The scene also contains interactive objects, for example a particle emitter, spatials with user data, or spatials with custom controls. 
 .  You load the .j3o scene using the assetManager. 
-.  You want to interact with one of the loaded interactive scene elements in your Java code. +For example, you want to call `emitAllParticles()` on the particle emitter. Or you want to find all NPC's Geometries with a custom CivilianControl, and call the CivilianControl method that makes them start acting their role.
+.  You want to interact with one of the loaded interactive scene elements in your Java code. +
+For example, you want to call `emitAllParticles()` on the particle emitter. Or you want to find all NPC's Geometries with a custom CivilianControl, and call the CivilianControl method that makes them start acting their role.
 
 In this case, you can use a SceneGraphVisitorAdapter to identify and access the Spatials in question.
 

+ 6 - 3
src/docs/asciidoc/jme3/advanced/update_loop.adoc

@@ -29,7 +29,8 @@ To let you see the main update loop in context, understand that the SimpleApplic
 
 ..  Repeat loop.
 
-*  *Quit* – If user requests `exit()`, execute `cleanup()` and `destroy()`. +The jME window closes and the loop ends.
+*  *Quit* – If user requests `exit()`, execute `cleanup()` and `destroy()`. +
+The jME window closes and the loop ends.
 
 
 == Usage
@@ -38,5 +39,7 @@ In a trivial <<jme3/intermediate/simpleapplication#,SimpleApplication>> (such as
 
 It's a best practice to modularize your game mechanics and spread out initialization and update loop code over several Java objects:
 
-*  Move modular code blocks from the `simpleInitApp()` method into <<jme3/advanced/application_states#,AppStates>>. Attach AppStates to initialize custom subsets of “one dungeon, and detach it when the player exits this “dungeon. +Examples: Weather/sky audio and visuals, physics collision shapes, sub-rootnodes of individual dungeons including dungeon NPCs, etc.
-*  Move modular code blocks from the `simpleUpdate()` method into the update loops of <<jme3/advanced/custom_controls#,Custom Controls>> to control individual entity behavior (NPCs), and into the update method of <<jme3/advanced/application_states#,AppStates>> to control world events. +Examples: Weather behaviour, light behaviour, physics behaviour, individual NPC behaviour, trap behaviour, etc.
+*  Move modular code blocks from the `simpleInitApp()` method into <<jme3/advanced/application_states#,AppStates>>. Attach AppStates to initialize custom subsets of “one dungeon, and detach it when the player exits this “dungeon. +
+Examples: Weather/sky audio and visuals, physics collision shapes, sub-rootnodes of individual dungeons including dungeon NPCs, etc.
+*  Move modular code blocks from the `simpleUpdate()` method into the update loops of <<jme3/advanced/custom_controls#,Custom Controls>> to control individual entity behavior (NPCs), and into the update method of <<jme3/advanced/application_states#,AppStates>> to control world events. +
+Examples: Weather behaviour, light behaviour, physics behaviour, individual NPC behaviour, trap behaviour, etc.

+ 20 - 15
src/docs/asciidoc/jme3/advanced/vehicles.adoc

@@ -1,6 +1,6 @@
 = Controlling a Physical Vehicle
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, physics, vehicle, collision
 :relfileprefix: ../../
@@ -8,14 +8,14 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-For physical vehicles, jME's uses the jBullet ray-cast vehicle. In this vehicle implementation, the physical chassis 'floats' along on four non-physical vertical rays. 
+For physical vehicles, jME's uses the jBullet ray-cast vehicle. In this vehicle implementation, the physical chassis 'floats' along on four non-physical vertical rays.
 
 Internally, each wheel casts a ray down, and using the ray's intersection point, jBullet calculates the suspension length, and the suspension force. The suspension force is applied to the chassis, keeping it from hitting the ground. The friction force is calculated for each wheel where the ray intersects with the ground. Friction is applied as a sideways and forwards force. footnote:[ link:https://docs.google.com/Doc?docid=0AXVUZ5xw6XpKZGNuZG56a3FfMzU0Z2NyZnF4Zmo&hl=en[https://docs.google.com/Doc?docid=0AXVUZ5xw6XpKZGNuZG56a3FfMzU0Z2NyZnF4Zmo&amp;hl=en] ]
 
 This article shows how you use this vehicle implementation in a jME3 application.
 
 
-image::jme3/advanced/physics-vehicle.png[physics-vehicle.png,with="",height="",align="center"]
+image::jme3/advanced/physics-vehicle.png[physics-vehicle.png,width="",height="",align="center"]
 
 
 
@@ -31,7 +31,7 @@ Full code samples are here:
 
 The goal is to create a physical vehicle with wheels that can be steered and that interacts (collides with) with the floor and obstacles.
 
-.  Create a SimpleApplication with a <<jme3/advanced/physics#,BulletAppState>> 
+.  Create a SimpleApplication with a <<jme3/advanced/physics#,BulletAppState>>
 **  This gives us a PhysicsSpace for PhysicsNodes
 
 .  Create a VehicleControl + CompoundCollisionShape for the physical vehicle behaviour
@@ -56,7 +56,7 @@ The goal is to create a physical vehicle with wheels that can be steered and tha
 
 The vehicle that we create here in the link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsCar.java[TestPhysicsCar.java] example is just a “box on wheels, a basic vehicle shape that you can replace with a fancy car model, as demonstrated in link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestFancyCar.java[TestFancyCar.java].
 
-Every physical object must have a collision shape, that we prepare first. For the vehicle, we choose a compound collision shape that is made up of a box-shaped body of the right size for the vehicle. We will add the wheels later. 
+Every physical object must have a collision shape, that we prepare first. For the vehicle, we choose a compound collision shape that is made up of a box-shaped body of the right size for the vehicle. We will add the wheels later.
 
 [source,java]
 ----
@@ -66,14 +66,14 @@ BoxCollisionShape box = new BoxCollisionShape(new Vector3f(1.2f, 0.5f, 2.4f));
 
 ----
 
-*Best Practice:* We attach the BoxCollisionShape (the vehicle body) to the CompoundCollisionShape at a Vector of (0,1,0): This shifts the effective center of mass of the BoxCollisionShape downwards to 0,-1,0 and makes a moving vehicle more stable! 
+*Best Practice:* We attach the BoxCollisionShape (the vehicle body) to the CompoundCollisionShape at a Vector of (0,1,0): This shifts the effective center of mass of the BoxCollisionShape downwards to 0,-1,0 and makes a moving vehicle more stable!
 
 [source,java]
 ----
 compoundShape.addChildShape(box, new Vector3f(0, 1, 0));
 ----
 
-Any kind of geometry can make up the visible part of the vehicle, here we use a wireframe box. We create a node that we use to group the geometry. 
+Any kind of geometry can make up the visible part of the vehicle, here we use a wireframe box. We create a node that we use to group the geometry.
 
 [source,java]
 ----
@@ -114,7 +114,7 @@ We now have a node `vehicleNode` with a visible “car geometry, which acts like
 
 == Adding the Wheels
 
-We create four wheel Geometries and add them to the vehicle. Our wheel geometries are simple, non-physical discs (flat Cylinders), they are just visual decorations. Note that the physical wheel behaviour (the com.jme3.bullet.objects.VehicleWheel objects) is created internally by the `vehicle.addWheel()` method. 
+We create four wheel Geometries and add them to the vehicle. Our wheel geometries are simple, non-physical discs (flat Cylinders), they are just visual decorations. Note that the physical wheel behaviour (the com.jme3.bullet.objects.VehicleWheel objects) is created internally by the `vehicle.addWheel()` method.
 
 The `addWheel()` method sets following properties:
 
@@ -123,7 +123,8 @@ The `addWheel()` method sets following properties:
 *  Vector3f axle – Axle direction is typically a (-1,0,0) vector.
 *  float suspensionRestLength – Suspension rest length in world units
 *  float wheelRadius – Wheel radius in world units
-*  boolean isFrontWheel – Whether this wheel is one of the steering wheels. +Front wheels are the ones that rotate visibly when the vehicle turns.
+*  boolean isFrontWheel – Whether this wheel is one of the steering wheels. +
+Front wheels are the ones that rotate visibly when the vehicle turns.
 
 We initialize a few variables that we will reuse when we add the four wheels. yOff, etc, are the particular wheel offsets for our small vehicle model.
 
@@ -209,12 +210,16 @@ Not shown here is that we also created a Material `mat`.
 
 Not shown here is the standard way how we map the input keys to actions (see full code sample). Also refer to <<jme3/advanced/input_handling#,Input Handling>>).
 
-In the ActionListener, we implement the actions that control the vehicle's direction and speed. For the four directions (accelerate=up, brake=down, left, right), we specify how we want the vehicle to move. 
+In the ActionListener, we implement the actions that control the vehicle's direction and speed. For the four directions (accelerate=up, brake=down, left, right), we specify how we want the vehicle to move.
 
-*  The braking action is pretty straightforward: +`vehicle.brake(brakeForce)`
-*  For left and right turns, we add a constant to `steeringValue` when the key is pressed, and subtract it when the key is released. +`vehicle.steer(steeringValue);`
-*  For acceleration we add a constant to `accelerationValue` when the key is pressed, and substract it when the key is released. +`vehicle.accelerate(accelerationValue);`
-*  Because we can and it's fun, we also add a turbo booster that makes the vehicle jump when you press the assigned key (spacebar). +`vehicle.applyImpulse(jumpForce, Vector3f.ZERO);`
+*  The braking action is pretty straightforward: +
+`vehicle.brake(brakeForce)`
+*  For left and right turns, we add a constant to `steeringValue` when the key is pressed, and subtract it when the key is released. +
+`vehicle.steer(steeringValue);`
+*  For acceleration we add a constant to `accelerationValue` when the key is pressed, and substract it when the key is released. +
+`vehicle.accelerate(accelerationValue);`
+*  Because we can and it's fun, we also add a turbo booster that makes the vehicle jump when you press the assigned key (spacebar). +
+`vehicle.applyImpulse(jumpForce, Vector3f.ZERO);`
 
 [source,java]
 ----

+ 11 - 9
src/docs/asciidoc/jme3/advanced/walking_character.adoc

@@ -8,7 +8,7 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-In the <<jme3/beginner/hello_collision#,Hello Collision>> tutorial and the link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/TestQ3.java[TestQ3.java] code sample you have seen how to create collidable landscapes and walk around in a first-person perspective. The first-person camera is enclosed by a collision shape and is steered by the BetterCharacterControl. 
+In the <<jme3/beginner/hello_collision#,Hello Collision>> tutorial and the link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestQ3.java[TestQ3.java] code sample you have seen how to create collidable landscapes and walk around in a first-person perspective. The first-person camera is enclosed by a collision shape and is steered by the BetterCharacterControl. 
 
 Other games however require a third-person perspective of the character: In these cases you use a CharacterControl on a Spatial. This example also shows how to set up custom navigation controls, so you can press WASD to make the third-person character walk; and how to implement dragging the mouse to rotate.
 
@@ -24,12 +24,12 @@ Some details on this page still need to be updated from old CharacterControl +++
 
 Several related code samples can be found here:
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/TestPhysicsCharacter.java[TestPhysicsCharacter.java] (third-person view)
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/TestWalkingChar.java[TestWalkingChar.java] (third-person view)
-**  Uses also link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/BombControl.java[BombControl.java] 
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsCharacter.java[TestPhysicsCharacter.java] (third-person view)
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestWalkingChar.java[TestWalkingChar.java] (third-person view)
+**  Uses also link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/BombControl.java[BombControl.java] 
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/bullet/TestQ3.java[TestQ3.java] (first-person view)
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/helloworld/HelloCollision.java[HelloCollision.java] (first-person view)
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestQ3.java[TestQ3.java] (first-person view)
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/helloworld/HelloCollision.java[HelloCollision.java] (first-person view)
 
 The code in this tutorial is a combination of these samples.
 
@@ -100,7 +100,8 @@ a| CharacterControl Method
 a| Property 
 
 a| setUpAxis(1)
-a| Fixed upward axis. Values: 0 = X axis , 1 = Y axis , 2 = Z axis. +Default: 1, because for characters and vehicles, up is typically along the Y axis.
+a| Fixed upward axis. Values: 0 = X axis , 1 = Y axis , 2 = Z axis. +
+Default: 1, because for characters and vehicles, up is typically along the Y axis.
 
 a| setJumpSpeed(10f) 
 a| Jump speed (movement along upward-axis) 
@@ -115,7 +116,8 @@ a| How steep the slopes and steps are that the character can climb without consi
 a| The intensity of gravity for this CharacterControl'ed entity. Tip: To change the direction of gravity for a character, modify the up axis.
 
 a| setWalkDirection(new Vector3f(0f,0f,0.1f))
-a| (CharacterControl only) Make a physical character walk continuously while checking for floors and walls as solid obstacles. This should probably be called “setPositionIncrementPerSimulatorStep. This argument is neither a direction nor a velocity, but the amount to increment the position each physics tick: vector length = accuracy*speed in m/s. +Use `setWalkDirection(Vector3f.ZERO)` to stop a directional motion. 
+a| (CharacterControl only) Make a physical character walk continuously while checking for floors and walls as solid obstacles. This should probably be called “setPositionIncrementPerSimulatorStep. This argument is neither a direction nor a velocity, but the amount to increment the position each physics tick: vector length = accuracy*speed in m/s. +
+Use `setWalkDirection(Vector3f.ZERO)` to stop a directional motion. 
 
 |===
 
@@ -452,4 +454,4 @@ public void onAnimChange(AnimControl control, AnimChannel channel, String animNa
 
 == See also
 
-*  link:http://hub.jmonkeyengine.org/forum/topic/bettercharactercontrol-in-the-works/[http://hub.jmonkeyengine.org/forum/topic/bettercharactercontrol-in-the-works/]
+*  link:https://hub.jmonkeyengine.org/t/bettercharactercontrol-in-the-works/25242[https://hub.jmonkeyengine.org/t/bettercharactercontrol-in-the-works/25242]

+ 12 - 15
src/docs/asciidoc/jme3/advanced/water.adoc

@@ -1,37 +1,34 @@
 = Simple Water
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-jMonkeyEngine offers a SimpleWaterProcessor that turns any quad (flat rectangle) into a reflective water surface with waves. You can use this quad for simple limited water surfaces such as water troughs, shallow fountains, puddles, shallow water in channels. The SimpleWaterProcessor has less performance impact on your game than the full featured <<jme3/advanced/post-processor_water#,SeaMonkey WaterFilter>>; the main difference is that the SimpleWaterProcessor does not include under-water effects. 
+jMonkeyEngine offers a SimpleWaterProcessor that turns any quad (flat rectangle) into a reflective water surface with waves. You can use this quad for simple limited water surfaces such as water troughs, shallow fountains, puddles, shallow water in channels. The SimpleWaterProcessor has less performance impact on your game than the full featured <<jme3/advanced/post-processor_water#,SeaMonkey WaterFilter>>; the main difference is that the SimpleWaterProcessor does not include under-water effects.
 
 Here is some background info for JME3's basic water implementation:
 
-*  link:http://www.jmonkeyengine.com/forum/index.php?topic=14740.0[http://www.jmonkeyengine.com/forum/index.php?topic=14740.0]
+// *  link:http://www.jmonkeyengine.com/forum/index.php?topic=14740.0[http://www.jmonkeyengine.com/forum/index.php?topic=14740.0]
 *  link:http://www.bonzaisoftware.com/water_tut.html[http://www.bonzaisoftware.com/water_tut.html]
-*  link:http://www.gametutorials.com/Articles/RealisticWater.pdf[http://www.gametutorials.com/Articles/RealisticWater.pdf]
-
-
-image::http://www.jmonkeyengine.com/wp-content/uploads/2010/10/simplewaterdemo.jpg[simplewaterdemo.jpg,with="277",height="180",align="center"]
-
+// *  link:http://www.gametutorials.com/Articles/RealisticWater.pdf[http://www.gametutorials.com/Articles/RealisticWater.pdf]
+// image::http://www.jmonkeyengine.com/wp-content/uploads/2010/10/simplewaterdemo.jpg[simplewaterdemo.jpg,width="277",height="180",align="center"]
 
 
 == SimpleWaterProcessor
 
 A JME3 scene with water can use a `com.jme3.water.SimpleWaterProcessor` (which implements the SceneProcessor interface).
 
-To achieve a water effect, JME3 uses shaders and a special material, `Common/MatDefs/Water/SimpleWater.j3md`. The water surface is a quad, and we use normal map and dU/dV map texturing to simulate the waves. 
+To achieve a water effect, JME3 uses shaders and a special material, `Common/MatDefs/Water/SimpleWater.j3md`. The water surface is a quad, and we use normal map and dU/dV map texturing to simulate the waves.
 
 .  Every frame, we render to three texture maps:
 **  For the water surface (reflection), we take a snapshot of the environment, flip it upside down, and clip it to the visible water surface. Note that we do not actually use a “water texture color map: The “texture of the water is solely a distorted reflection.
 **  For the “wavy distortion (refraction), we use the derivative of a normal map, a dU/dV map.
 **  For the fogginess of water (depth) we use a depth map from the terrains z-buffer.
 
-.  In the shaders, we add all of the texture maps together. 
+.  In the shaders, we add all of the texture maps together.
 **  For the “bumpy displacement of the waves, we use a normal map and a du/dv map that are shifted against each other over time to create the wave effect.
 **  For the light reflection vectors on the water surface, we use the Fresnel formula, together with normal vectors.
 **  We add specular lighting.
@@ -41,8 +38,8 @@ To achieve a water effect, JME3 uses shaders and a special material, `Common/Mat
 
 == Usage
 
-
-image::jme3/advanced/simplewater.png[simplewater.png,with="384",height="288",align="right"]
+[.right.text-left]
+image::jme3/advanced/simplewater.png[simplewater.png,width="384",height="288",align="right"]
 
 
 .  Create a `mainScene` Node
@@ -73,7 +70,7 @@ image::jme3/advanced/simplewater.png[simplewater.png,with="384",height="288",ali
 
 == Sample Code
 
-The sample code can be found in `jme3/src/jme3test/water/TestSimpleWater.java` and `jme3/src/jme3test/water/TestSceneWater.java`.
+The sample code can be found in `link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/445f7ed010199d30c484fe75bacef4b87f2eb38e/jme3-examples/src/main/java/jme3test/water/TestSimpleWater.java[TestSimpleWater.java]` and `link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/445f7ed010199d30c484fe75bacef4b87f2eb38e/jme3-examples/src/main/java/jme3test/water/TestSceneWater.java[TestSceneWater.java]`.
 
 Here is the most important part of the code:
 
@@ -118,7 +115,7 @@ You can lower the render size to gain higher performance:
 waterProcessor.setRenderSize(128,128);
 ----
 
-The deeper the water, the more transparent. (?) 
+The deeper the water, the more transparent. (?)
 
 [source,java]
 ----

+ 20 - 17
src/docs/asciidoc/jme3/android.adoc

@@ -24,7 +24,7 @@ The android support is in constant enhancement so if you have questions or sugge
 ..  Start the SDK Manager and install the default selected 13 packages (accept licenses)
 
 
-image:jme3/android_sdk_manager.png[android_sdk_manager.png,with="",height=""]
+image:jme3/android_sdk_manager.png[android_sdk_manager.png,width="",height=""]
 
 *  (Optional) Install NBAndroid in the jMonkeyEngine SDK:
 ..  Go to Tools→Plugins→Available Plugins.
@@ -36,7 +36,7 @@ image:jme3/android_sdk_manager.png[android_sdk_manager.png,with="",height=""]
 
 *  Android 2.3 device or better with development mode (“USB-Debugging) enabled
 *  Graphic card that supports OpenGL ES 2.0 or better
-*  link:http://jmonkeyengine.org/groups/android/forum/topic/does-my-phone-meet-the-requirements-necessary-to-run-jmonkeyengine-3/[Does my phone meet the requirements necessary to run jMonkeyEngine 3?]
+*  link:https://hub.jmonkeyengine.org/t/does-my-phone-meet-the-requirements-necessary-to-run-jmonkeyengine-3/17231[Does my phone meet the requirements necessary to run jMonkeyEngine 3?]
 *  Remember to install the driver software on your computer
 
 
@@ -79,11 +79,13 @@ Mobile deployment is a “one-click option next to Desktop/WebStart/Applet deplo
 
 .  Open an existing JME3 project, or create a new JME3 project.
 .  Right-click the project node in the Projects Window and open the Properties.
-.  In the Application&gt;Android Properties, enable Android Deployment, and select an Android target. E.g. `Android 4.2.2` +This creates a “mobile folder in your projects directory. This folder contains a complete android project with correct settings to run the application using the AndroidHarness.
+.  In the Application&gt;Android Properties, enable Android Deployment, and select an Android target. E.g. `Android 4.2.2` +
+This creates a “mobile folder in your projects directory. This folder contains a complete android project with correct settings to run the application using the AndroidHarness.
 .  (Restart the jMonkeyEngine)
-.  A Mobile Files node appears in the Project window. +It lets you edit the MainActivitity.java, the AndroidManifest.xml, and build.properties.
+.  A Mobile Files node appears in the Project window. +
+It lets you edit the MainActivitity.java, the AndroidManifest.xml, and build.properties.
 
-image:jme3/nvyyd.png[nvyyd.png,with="",height=""]
+image:jme3/nvyyd.png[nvyyd.png,width="",height=""]
 
 The Android deployment option creates a separate sub-project for android and makes the main project and associated libraries available to the sub-project as libraries. The sub-project can be edited using NBAndroid (see below) or using Eclipse or any other IDE that supports standard android projects. Normally you do not need to edit the android project files. Exceptions are described further below. _The libraries are first added to the android sub-project when the main project is built for the first time._
 
@@ -94,7 +96,8 @@ Open your game project in the jMonkeyEngine SDK.
 
 *Building*
 
-.  Right-click the project node to build your project. +An APK file is created in the “dist folder.
+Right-click the project node to build your project. +
+An APK file is created in the “dist folder.
 
 *Running*
 
@@ -129,7 +132,7 @@ Activating the nbandroid plugin in the jMonkeyEngine SDK is optional, but recomm
 .  Go to Tools→Plugins→Available Plugins.
 .  Install the NbAndroid plugin. (Will show up as Android)
 
-*If the android plugin is not in that list follow link:http://www.nbandroid.org/p/installation.html[these instructions].*
+*If the android plugin is not in that list follow link:https://bitbucket.org/nbandroid/nbandroid/wiki/Installation[these instructions].*
 
 
 ==== Notes
@@ -160,8 +163,8 @@ As described above, you should always try to design your application as platform
 
 Since the main project is not configured to access the android api directly, you have to install NBAndroid (see above) to be able to edit the created android project in the SDK. After installing, click the “open project button and navigate to the “mobile folder inside the main project folder (it should show up with an android “a icon) and open it.
 
-
-image::jme3/android_access.png[android_access.png,with="",height="",align="right"]
+[.right]
+image::jme3/android_access.png[android_access.png,width="",height=""]
 
 Although you will use android specific api, using a camera is not exactly android specific and so you should try to design this part of the application as platform independent as possible as well. As an example, if you want to use the phones camera as an image input stream for a texture, you can create e.g. the AppState that manages the image and makes it available to the application inside the main project (no android code is needed). Then in the android part of the code you make a connection to the camera and update the image in the AppState. This also allows you to easily support cameras on other platforms in the same way or fallback to something else in case the platform doesn't support a camera.
 
@@ -170,13 +173,13 @@ Note that you have to build the whole project once to make (new) classes in the
 
 == Signing an APK
 
-When you have a mobile project in the “important files” section you have an “Android Properties” file.+
-There are 2 entries in this file :+
-key.store=path/to/your/keystore/on/your/drive/mykeystore.keystore+
-key.alias=mykeystorealias+
+When you have a mobile project in the “important files” section you have an “Android Properties” file. +
+There are 2 entries in this file : +
+key.store=path/to/your/keystore/on/your/drive/mykeystore.keystore +
+key.alias=mykeystorealias 
 
-If those entries are filled, the apk will be signed during the build.+
-You’ll be prompted when building to enter the password (twice). It will generate a signed apk in the dist folder of your project.+
+If those entries are filled, the apk will be signed during the build. +
+You’ll be prompted when building to enter the password (twice). It will generate a signed apk in the dist folder of your project.
 
 
 == More Info
@@ -185,5 +188,5 @@ There is currently no proper guidance of running on android.
 The SDK will later provide tools to adapt the materials and other graphics settings of the Android deployment version automatically.
 
 *  link:https://www.youtube.com/watch?feature=player_embedded&v=np3N4pCCTPo[Youtube Video on Android deployment]
-*  link:http://jmonkeyengine.org/groups/android/forum/topic/android-deployment-via-checkbox-is-here[Android Forum Thread (beta)]
-*  link:http://jmonkeyengine.org/groups/android/forum/topic/how-to-run-your-jme3-application-on-android-androidharness[Android Forum Thread (alpha)]
+*  link:https://hub.jmonkeyengine.org/t/android-deployment-via-sdk-checkbox-is-here/18579[Android Forum Thread (beta)]
+*  link:https://hub.jmonkeyengine.org/t/how-to-run-your-jme3-application-on-android-androidharness/16925[Android Forum Thread (alpha)]

+ 11 - 11
src/docs/asciidoc/jme3/atomixtuts.adoc

@@ -1,6 +1,6 @@
 = atomixtuts
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../
 :imagesdir: ..
@@ -18,7 +18,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Long time ago I planed to make tutorial series in making games in JME3 and done some examples. I waited for our project to reach a stable status. May be now is the best time to show them up!
 A lot of changes have been make to the core and also a lot of excited and amazing contributions into the world of JME this day (you can name some).
 
-OK, my project had changed to Atomix Tutorial Series (short as ATS). 
+OK, my project had changed to Atomix Tutorial Series (short as ATS).
 [quote]
 ____
  These tutorials will lead you through adventures in game devlopment in some games and genres. I will try to get much detail as I can. Hopefully this will become a valuable guidebook for monkeys want to join the jungle! emoji:smile
@@ -69,13 +69,13 @@ They require quite advanced techniques, suited for advanced Java developer which
 === Extra stuffs:
 
 *  Framework: <<jme3/advanced/atom_framework#, Atom framework>> , <<jme3/atomixtuts/mmorpg/researches#, Researches MMORPG techs>> , <<jme3/advanced/atom_framework/atomex#, Atom for Cloud framework>>
-*  Modeling : <<jme3/atomixtuts/cc#, Character in Blender>> , <<jme3/atomixtuts/fx#, Effects>> 
+*  Modeling : <<jme3/atomixtuts/cc#, Character in Blender>> , <<jme3/atomixtuts/fx#, Effects>>
 *  Concept &amp; Speed painting:
 *  Design : <<jme3/atomixtuts/design#,design>>
 *  AI :  <<jme3/advanced/atom_framework/ai#,AtomAI Framework and Tools>> ,  <<jme3/advanced/atom_framework/ai/researches#, AI Researches>>
 *  +++<abbr title="Graphical User Interface">GUI</abbr>+++ : <<jme3/advanced/atom_framework/gui#,AtomExGui>>
 *  Scripting : <<jme3/scripting#,scripting>>, <<jme3/advanced/atom_framework/scripting#,AtomScripting>>
-*  Everyday stuffs: 
+*  Everyday stuffs:
 
 
 === Screenshots:
@@ -83,33 +83,33 @@ They require quite advanced techniques, suited for advanced Java developer which
 *Card game:*
 
 
-image::http://farm9.staticflickr.com/8546/8616981856_4d9755f034_z.jpg[8616981856_4d9755f034_z.jpg,with="300",height="",align="center"]
+image::http://farm9.staticflickr.com/8546/8616981856_4d9755f034_z.jpg[8616981856_4d9755f034_z.jpg,width="300",height="",align="center"]
 
 
 *Blade of the immortals* <<jme3/atomixtuts/bladegame#,bladegame>>
 
 
-image::http://farm8.staticflickr.com/7219/6979909124_af97ffed51_b.jpg[6979909124_af97ffed51_b.jpg,with="200",height="",align="center"]
+image::http://farm8.staticflickr.com/7219/6979909124_af97ffed51_b.jpg[6979909124_af97ffed51_b.jpg,width="200",height="",align="center"]
 
 
 
-image::http://farm8.staticflickr.com/7226/7125997763_ced745ee82_z.jpg[7125997763_ced745ee82_z.jpg,with="200",height="",align="center"]
+image::http://farm8.staticflickr.com/7226/7125997763_ced745ee82_z.jpg[7125997763_ced745ee82_z.jpg,width="200",height="",align="center"]
 
 
 *Euro Kick*
 
 
-image::http://farm8.staticflickr.com/7120/7420435866_b531225642_b.jpg[7420435866_b531225642_b.jpg,with="400",height="",align="center"]
+image::http://farm8.staticflickr.com/7120/7420435866_b531225642_b.jpg[7420435866_b531225642_b.jpg,width="400",height="",align="center"]
 
 
 
-image::http://farm6.staticflickr.com/5320/7420435428_7a99ca6553_b.jpg[7420435428_7a99ca6553_b.jpg,with="400",height="",align="center"]
+image::http://farm6.staticflickr.com/5320/7420435428_7a99ca6553_b.jpg[7420435428_7a99ca6553_b.jpg,width="400",height="",align="center"]
 
 
 *Heaven – RTS Game.*
 
 
-image::http://farm9.staticflickr.com/8041/7976138046_752c4a5b03_b.jpg[7976138046_752c4a5b03_b.jpg,with="400",height="",align="center"]
+image::http://farm9.staticflickr.com/8041/7976138046_752c4a5b03_b.jpg[7976138046_752c4a5b03_b.jpg,width="400",height="",align="center"]
 
 
 

+ 20 - 20
src/docs/asciidoc/jme3/atomixtuts/bladegame.adoc

@@ -1,6 +1,6 @@
 = bladegame
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -41,9 +41,9 @@ Mode: Single and multiplayer
 
 === Idea & Story
 
-Blade of the immortals, its name. 
+Blade of the immortals, its name.
 
-This Story about a girl, named Zena in a mission to deliver a secret weapon - known as “the gift of god to the King of Katharal. 
+This Story about a girl, named Zena in a mission to deliver a secret weapon - known as “the gift of god to the King of Katharal.
 
 The game are about her adventures along the journey. She got chased by huanted evil and mystic monster raised from hell to stop her mission. Fortunately, he got helped by 3 hero that willing to help her on her way…
 
@@ -56,23 +56,23 @@ The game are about her adventures along the journey. She got chased by huanted e
 Here is some more screen shots
 
 
-image::http://farm8.staticflickr.com/7219/6979909124_af97ffed51_b.jpg[6979909124_af97ffed51_b.jpg,with="200",height="",align="right"]
+image::http://farm8.staticflickr.com/7219/6979909124_af97ffed51_b.jpg[6979909124_af97ffed51_b.jpg,width="200",height="",align="right"]
 
 
 
-image::http://farm8.staticflickr.com/7226/7125997763_ced745ee82_z.jpg[7125997763_ced745ee82_z.jpg,with="200",height="",align="left"]
+image::http://farm8.staticflickr.com/7226/7125997763_ced745ee82_z.jpg[7125997763_ced745ee82_z.jpg,width="200",height="",align="left"]
 
 
 
-image::http://farm8.staticflickr.com/7091/6981639806_c1e4e014d8_z.jpg[6981639806_c1e4e014d8_z.jpg,with="200",height="",align="center"]
+image::http://farm8.staticflickr.com/7091/6981639806_c1e4e014d8_z.jpg[6981639806_c1e4e014d8_z.jpg,width="200",height="",align="center"]
 
 
 
-image::http://farm8.staticflickr.com/7063/6981639942_bb06362b55_z.jpg[6981639942_bb06362b55_z.jpg,with="200",height="",align="right"]
+image::http://farm8.staticflickr.com/7063/6981639942_bb06362b55_z.jpg[6981639942_bb06362b55_z.jpg,width="200",height="",align="right"]
 
 
 
-image::http://farm8.staticflickr.com/7178/6987339044_3ff558d451_z.jpg[6987339044_3ff558d451_z.jpg,with="200",height="",align="left"]
+image::http://farm8.staticflickr.com/7178/6987339044_3ff558d451_z.jpg[6987339044_3ff558d451_z.jpg,width="200",height="",align="left"]
 
 
 
@@ -95,14 +95,14 @@ iframe::http://text2mindmap.com/1VG1V4[width="800px", height="600px", alt="", sc
 
 *  RPGGame
 **  Player
-**  Character 
+**  Character
 **  Party
 
 *  NPC
 *  Enemy
 **  Demon
-**  Werewolf 
-**  Skeleton 
+**  Werewolf
+**  Skeleton
 **  Scorpion
 
 *  Skill
@@ -113,17 +113,17 @@ iframe::http://text2mindmap.com/1VG1V4[width="800px", height="600px", alt="", sc
 
 ===== World
 
-*  Map 
-**  Land 
-**  Moutain 
-***  Forest 
-***  River 
+*  Map
+**  Land
+**  Moutain
+***  Forest
+***  River
 ***  Bridge
 
 
 *  Trigger
-*  Props 
-*  Dungeon 
+*  Props
+*  Dungeon
 **  Door
 
 
@@ -139,7 +139,7 @@ iframe::http://text2mindmap.com/1VG1V4[width="800px", height="600px", alt="", sc
 == Asset making
 
 Male
-image:http://fc04.deviantart.net/fs70/i/2010/021/3/4/Cabal_Dude_Workflow_by_imogia.jpg[Cabal_Dude_Workflow_by_imogia.jpg,with="",height=""]
+image:http://fc04.deviantart.net/fs70/i/2010/021/3/4/Cabal_Dude_Workflow_by_imogia.jpg[Cabal_Dude_Workflow_by_imogia.jpg,width="",height=""]
 
 
 == Setup

+ 10 - 10
src/docs/asciidoc/jme3/atomixtuts/cardsgame.adoc

@@ -1,6 +1,6 @@
 = cardsgame
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -14,7 +14,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 This is the first Chapter of the Game making tutorial series and named “The card game”.
 
-My intention is to make a “clone” Card game as Yugi Oh card game (similar to Collectable Magic Cards game). 
+My intention is to make a “clone” Card game as Yugi Oh card game (similar to Collectable Magic Cards game).
 
 
 [IMPORTANT]
@@ -89,7 +89,7 @@ Issues:
 
 Here is some more screen shots
 
-image::http://farm9.staticflickr.com/8546/8616981856_4d9755f034_z.jpg[8616981856_4d9755f034_z.jpg,with="300",height="",align="center"]
+image::http://farm9.staticflickr.com/8546/8616981856_4d9755f034_z.jpg[8616981856_4d9755f034_z.jpg,width="300",height="",align="center"]
 
 
 Preview Video:
@@ -143,7 +143,7 @@ Now the prepare steps are almost complete, we start coding our game!
 
 [IMPORTANT]
 ====
-This will be a big but interesting challenge for who really want to start a serious game development career and even for who just want to learn how to do it. 
+This will be a big but interesting challenge for who really want to start a serious game development career and even for who just want to learn how to do it.
 ====
 
 
@@ -153,7 +153,7 @@ ____
 I can present my self almost an artist (60% vs 40% of a programmer :p ).. So, i prefer doing cool stuffs instead of hard stuffs. That’s why i played with both Java and Groovy. In this section, from time to time, you will find how Groovy save your life with clean and bright syntax instead of verbose big bad Java here and there.
 ____
 
-You can get started with groovy in just few hours here. I also will explain a little bit of Groovy in the way. 
+You can get started with groovy in just few hours here. I also will explain a little bit of Groovy in the way.
 
 <<jme3/scripting#, Read more about Groovy Scripting>>
 
@@ -215,8 +215,8 @@ In this game, Groovy script will envolved in:
 *  EffectText
 *  In-house card editor
 
-More insights, 
-Rule are implemented with groovy script 
+More insights,
+Rule are implemented with groovy script
 Card's Effect are implemented with groovy script. You can procedure the script 2 two ways:
 
 .  parse from original EffectText ripped from the internet, via OpenNLP
@@ -258,7 +258,7 @@ You generally dont want to go too deep in your first tutorial! :p So consider re
 ====
 
 
-*  Use Webharvest to collect useful data for your game. 
+*  Use Webharvest to collect useful data for your game.
 *  And Groovy to config instead of XML or plain-text
 *  Groovy to make an in-house cards editor
 *  OpenNLP to process EffectText of the orginal card
@@ -272,7 +272,7 @@ Detailed introduction <<jme3/atomixtuts/cardsgame/adtechs#,adtechs>>
 After a few thousands LoC game, I hope you guys find something useful to start working with our powerful engine JME3. In this first tutorial, I don’t want to go too much and too soon into technical problems. That’s not the way to go! ;-P
 
 ....
-  In the next tutorial of the series, you will go straight in a bigger challenge with I think will give you more inspirations: “A Medieval RPG game” -  with story telling and cinematic. That’s it, a real game template which you can expand to make a full blown game. 
+  In the next tutorial of the series, you will go straight in a bigger challenge with I think will give you more inspirations: “A Medieval RPG game” -  with story telling and cinematic. That’s it, a real game template which you can expand to make a full blown game.
 ....
 
 

+ 4 - 4
src/docs/asciidoc/jme3/atomixtuts/cardsgame/adtechs.adoc

@@ -1,6 +1,6 @@
 = adtechs
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -39,14 +39,14 @@ You can take a look at my webhavest configuration file here , but use them as yo
 
 === Groovy data scripting
 
-It comes the time when you don’t want to use XML and all other things to make config and text data file, cause you just love the short and briliant syntax of Groovy. Me too… again! 
+It comes the time when you don’t want to use XML and all other things to make config and text data file, cause you just love the short and briliant syntax of Groovy. Me too… again!
 
 In Atom framework, I used Groovy to make game configuration, dialogue, cinematic scripting, facial scripting, AI scripting and even a whole GAME! That’s why I also use Groovy to save the infomations of the cards. Lucky me, Web harvest also can play with groovy like a charm, so benefit.
 
 Detailed technique should be shown in an “in-deep” topic, here I just show a few pictures what I’ve done with this two techs for this card game: :woot: :woot:
 '''
 
-image:http://farm9.staticflickr.com/8383/8616233293_aac77bc87e_c.jpg[8616233293_aac77bc87e_c.jpg,with="",height=""]
+image:http://farm9.staticflickr.com/8383/8616233293_aac77bc87e_c.jpg[8616233293_aac77bc87e_c.jpg,width="",height=""]
 
 
 === GroovyEditor

+ 6 - 6
src/docs/asciidoc/jme3/atomixtuts/cardsgame/assets.adoc

@@ -1,6 +1,6 @@
 = assets
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -22,12 +22,12 @@ In my example,for the Front textures of the cards, I use the orignal Yugioh Card
 
 The card model made of a Box with side faces deleted. The two remain faces has some change in UV, instead of the have exactly the same UV, they share the 50-50% vertical areas. Why? Cause in the shader we will modify the way to calculate UV and use two different diffuse for front face and back face. :p This is very cool thing to learn!
 
-image:http://farm9.staticflickr.com/8104/8617106224_e0c494dbf6_z.jpg[8617106224_e0c494dbf6_z.jpg,with="",height=""]
+image:http://farm9.staticflickr.com/8104/8617106224_e0c494dbf6_z.jpg[8617106224_e0c494dbf6_z.jpg,width="",height=""]
 
 
 === The Card material:
 
-After import from Blender, the importer made a default Lighting material for the model. So basicly we want to change that to our approriate material. 
+After import from Blender, the importer made a default Lighting material for the model. So basicly we want to change that to our approriate material.
 
 We make it by creating 3 new files: *CardMat.j3md* , *CardMat.j3m*, *SimpleCard.frag* ; and go to the Libraries section, where the TestData package is, copy the 4th file: *ColoredTexture.vert*.
 
@@ -41,7 +41,7 @@ We make it by creating 3 new files: *CardMat.j3md* , *CardMat.j3m*, *SimpleCard.
 
 Below show the detail content of the Material file in JMP and explain why for newbie in GLSL:
 
-image::http://farm9.staticflickr.com/8521/8616051519_7c8c32ee1a_c.jpg[8616051519_7c8c32ee1a_c.jpg,with="",height="",align="center"]
+image::http://farm9.staticflickr.com/8521/8616051519_7c8c32ee1a_c.jpg[8616051519_7c8c32ee1a_c.jpg,width="",height="",align="center"]
 
 
 
@@ -158,5 +158,5 @@ The side divided to some areas, including: Deck block, Magic block, Fusion block
 The table represent by a single quad with this texture. I did it in PTS but you can also do the same thing in Gimp or even paint.net (which one you prefered). The source PTS file is in the Project assets if you want to look into.
 
 
-image::http://farm9.staticflickr.com/8251/8617035018_bf7db17d09_z.jpg[8617035018_bf7db17d09_z.jpg,with="",height="",align="center"]
+image::http://farm9.staticflickr.com/8251/8617035018_bf7db17d09_z.jpg[8617035018_bf7db17d09_z.jpg,width="",height="",align="center"]
 

+ 32 - 32
src/docs/asciidoc/jme3/atomixtuts/design.adoc

@@ -1,6 +1,6 @@
 = design
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -10,7 +10,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == Game Design short introduction
 
-This page is dedicated to introduce you to Game design/Planing/Managing with: 
+This page is dedicated to introduce you to Game design/Planing/Managing with:
 
 basic ideas, some terms, techniques,idioms, workflows you should learn and practice in the way of game/software developing.
 
@@ -26,53 +26,53 @@ TRY: link:http://www.handdrawnapps.com/category/game-design-resources/[http://ww
 Doing it right!
 ....
 
-image:http://rubycowgames.com/wp-content/uploads/game-design.jpg[game-design.jpg,with="400",height=""]
+image:http://rubycowgames.com/wp-content/uploads/game-design.jpg[game-design.jpg,width="400",height=""]
 '''
 
 ....
 The Process and elements
 ....
 
-image:http://www.gamasutra.com/db_area/images/feature/3934/image002.jpg[image002.jpg,with="400",height=""]
+image:http://www.gamasutra.com/db_area/images/feature/3934/image002.jpg[image002.jpg,width="400",height=""]
 '''
 
 ....
 Use UML & List & Tree and Graph
 ....
 
-image:http://dundee.cs.queensu.ca/~cax/arch/game-design-3.png[game-design-3.png,with="400",height=""]
+image:http://dundee.cs.queensu.ca/~cax/arch/game-design-3.png[game-design-3.png,width="400",height=""]
 
-image:http://indiegamesstudio.com/blog/wp-content/uploads/2012/08/articydraft_dialogjunkie_shot02_615x362.jpg[articydraft_dialogjunkie_shot02_615x362.jpg,with="400",height=""]
+image:http://indiegamesstudio.com/blog/wp-content/uploads/2012/08/articydraft_dialogjunkie_shot02_615x362.jpg[articydraft_dialogjunkie_shot02_615x362.jpg,width="400",height=""]
 '''
 
 ....
 Line up gameplay's element for better overview first
 ....
 
-image:http://fc04.deviantart.net/fs50/i/2009/287/d/c/Game_Design_Sketch_Pack_by_deadinsane.jpg[Game_Design_Sketch_Pack_by_deadinsane.jpg,with="400",height=""]
+image:http://fc04.deviantart.net/fs50/i/2009/287/d/c/Game_Design_Sketch_Pack_by_deadinsane.jpg[Game_Design_Sketch_Pack_by_deadinsane.jpg,width="400",height=""]
 '''
 
 ....
 Care about player input and experience, motion and emotion,inspired by them!
 ....
 
-image:http://gametea.files.wordpress.com/2010/09/game-design-101.gif[game-design-101.gif,with="400",height=""]
+image:http://gametea.files.wordpress.com/2010/09/game-design-101.gif[game-design-101.gif,width="400",height=""]
 
-image:http://bulk2.destructoid.com/ul/215158-GameDesignEvent.JPG[215158-GameDesignEvent.JPG,with="400",height=""]
+image:http://bulk2.destructoid.com/ul/215158-GameDesignEvent.JPG[215158-GameDesignEvent.JPG,width="400",height=""]
 
-image:http://www-static.dreambox.com/wp-content/uploads/2009/06/video_gamestest.jpg[video_gamestest.jpg,with="400",height=""]
+image:http://www-static.dreambox.com/wp-content/uploads/2009/06/video_gamestest.jpg[video_gamestest.jpg,width="400",height=""]
 '''
 
 ....
 Teamwork and share, hubris is the gamekiller!
 ....
 
-image:http://gamecareerguide.net/db_area/images/item_images/20071120/071120_design_game03.jpg[071120_design_game03.jpg,with="400",height=""]
+image:http://gamecareerguide.net/db_area/images/item_images/20071120/071120_design_game03.jpg[071120_design_game03.jpg,width="400",height=""]
 
 
 === Website
 
-image:http://gamedesignschools.com/uploads/digital_asset/file/1161/gamedesignschoolscom-main-image_900x300.jpg[gamedesignschoolscom-main-image_900x300.jpg,with="400",height=""]
+image:http://gamedesignschools.com/uploads/digital_asset/file/1161/gamedesignschoolscom-main-image_900x300.jpg[gamedesignschoolscom-main-image_900x300.jpg,width="400",height=""]
 
 link:http://gamedesignschools.com/[http://gamedesignschools.com/]
 
@@ -107,16 +107,16 @@ If you are not a professional game designer developer, or not in a “restricted
 ==== Smart workflow
 
 
-image::http://www.creativeuncut.com/imgs/video-game-designer.jpg[video-game-designer.jpg,with="",height="",align="center"]
+image::http://www.creativeuncut.com/imgs/video-game-designer.jpg[video-game-designer.jpg,width="",height="",align="center"]
 
 
 
 ===== As developer
 
-Read : 
+Read :
 link:http://en.wikipedia.org/wiki/Rapid_Application_Development[http://en.wikipedia.org/wiki/Rapid_Application_Development]
 
-try *Extreme programing*: 
+try *Extreme programing*:
 link:http://en.wikipedia.org/wiki/Extreme_programming[http://en.wikipedia.org/wiki/Extreme_programming]
 
 
@@ -134,14 +134,14 @@ link:http://www.handdrawnapps.com/2013/02/19/game-design-principles/[http://www.
 See 4 phase I recommended below as my experience manage a small team:
 
 
-image::http://www.skillset.org/uploads/jpeg/asset_11049_hl.jpg[asset_11049_hl.jpg,with="",height="",align="center"]
+image::http://www.skillset.org/uploads/jpeg/asset_11049_hl.jpg[asset_11049_hl.jpg,width="",height="",align="center"]
 
 
 
-image::http://hub.leoartz.com/wp-content/uploads/2009/05/m_creative_uncut.jpg[m_creative_uncut.jpg,with="400",height="",align="center"]
+image::http://hub.leoartz.com/wp-content/uploads/2009/05/m_creative_uncut.jpg[m_creative_uncut.jpg,width="400",height="",align="center"]
 
 
-.  2D Concept 
+.  2D Concept
 ..  Outline: sketch first, dicuss a lot about ideas, be wild
 ..  Coloring: get as much of details as you can
 
@@ -151,7 +151,7 @@ image::http://hub.leoartz.com/wp-content/uploads/2009/05/m_creative_uncut.jpg[m_
 
 
 
-image::http://benregimbal.com/lame_example_benrc_2007.jpg[lame_example_benrc_2007.jpg,with="400",height="",align="center"]
+image::http://benregimbal.com/lame_example_benrc_2007.jpg[lame_example_benrc_2007.jpg,width="400",height="",align="center"]
 
 
 
@@ -161,7 +161,7 @@ Be wild!
 ====
 
 
-image::http://fc00.deviantart.net/fs49/f/2009/206/d/b/Attack_Force_Iphone_game_art_by_carefulconan.jpg[Attack_Force_Iphone_game_art_by_carefulconan.jpg,with="400",height="",align="center"]
+image::http://fc00.deviantart.net/fs49/f/2009/206/d/b/Attack_Force_Iphone_game_art_by_carefulconan.jpg[Attack_Force_Iphone_game_art_by_carefulconan.jpg,width="400",height="",align="center"]
 
 
 
@@ -173,12 +173,12 @@ If you never in a professinal workflow before, try to do it simplier as your onl
 ..  Flexible but manageable: Try to use SVN.
 ..  Shoot with both hands: Do both assets and programming can cause a mesh, do one at a time. After finish review, get approved by yourself or the leader. Continue developing.
 ..  Pirate spirit: Use place holder as much as your can. Skip concept, may use existed assets. There are plenty of free assets.
-..  Avoid premature optimization: If still concerning about design, make it work first. When doubt lelf out. 
+..  Avoid premature optimization: If still concerning about design, make it work first. When doubt lelf out.
 ..  +++<abbr title="What You See Is What You Get">WYSIWYG</abbr>+++ : What You See Is What You® (Get| Got| Goodat | Goingto | Goal )
 ..  +++<abbr title="Keep it simple stupid">KISS</abbr>+++ : Keep It Simple Stupid! link:http://en.wikipedia.org/wiki/KISS_principle[http://en.wikipedia.org/wiki/KISS_principle]
 
 
-image::http://billeebrady.com/wp-content/uploads/2012/06/Keep-It-Simple-Stupid.jpg[Keep-It-Simple-Stupid.jpg,with="300",height="",align="center"]
+image::http://billeebrady.com/wp-content/uploads/2012/06/Keep-It-Simple-Stupid.jpg[Keep-It-Simple-Stupid.jpg,width="300",height="",align="center"]
 
 
 
@@ -203,7 +203,7 @@ So, in the end of each phase, you want to estimate your objectives and performan
 
 *Design phase*   Gameplay → Screens
 
-*Implementation phase*  Screen → States [or other paradigms] → Codes (class,config) 
+*Implementation phase*  Screen → States [or other paradigms] → Codes (class,config)
 
 *Review phase*  Runs → Bugs → Patches → Deployed publishabe packages, game.
 
@@ -212,7 +212,7 @@ So, in the end of each phase, you want to estimate your objectives and performan
 
 In this phase, we will design the most important things have influence to our game:
 
-*  Gameplay 
+*  Gameplay
 *  Screens
 
 Consider, gameplay brief texts is the initial basic “outline, and the screens are the detailed sketches of the gameplay into a “software form (that's it, a game :p).
@@ -237,7 +237,7 @@ link:http://dokgames.blogspot.com/2012/09/brick-4-whats-games-development-workfl
 
 ==== Gameplay
 
-A list of “names or “things will be seen in our game, bricks that build up the gameplay piece by piece. 
+A list of “names or “things will be seen in our game, bricks that build up the gameplay piece by piece.
 
 
 ===== As shortlist
@@ -245,11 +245,11 @@ A list of “names or “things will be seen in our game, bricks that build up t
 Yeah, a real text list of names, short description and notes!
 
 For examples, in a Football Manager game, as my EuroKick game <<jme3/atomixtuts/kickgame#,kickgame>>
-You can see them as things: 
+You can see them as things:
 
-* a Football fan see a football match in a stadium*. 
+* a Football fan see a football match in a stadium*.
 
-or 
+or
 
 *a business man see a company with finance, reports and statistics*.
 
@@ -275,11 +275,11 @@ Mind map can be consider very simple and basic ideas of the game in Graph based
 
 ==== Design to Programming translation
 
-Those, in turn will be implemented in programming language with a programming manner. 
+Those, in turn will be implemented in programming language with a programming manner.
 
-OOP for specific, appropriate name should be transfer to a appropriate Class of Object, with properties and methods. 
+OOP for specific, appropriate name should be transfer to a appropriate Class of Object, with properties and methods.
 
-For Component Oriented Programming (COP), names should be interpreted as Prefab with a specific set of components, and their processors. 
+For Component Oriented Programming (COP), names should be interpreted as Prefab with a specific set of components, and their processors.
 Read : <<jme3/entitysystem#,entitysystem>>
 
 

+ 7 - 7
src/docs/asciidoc/jme3/atomixtuts/heavenrtsgame.adoc

@@ -1,6 +1,6 @@
 = heavenrtsgame
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -61,7 +61,7 @@ Inspired by Zero-K by SpringRTS.
 
 === Quick start
 
-Source code: 
+Source code:
 link:https://code.google.com/p/heaven-rts-jmegame/[https://code.google.com/p/heaven-rts-jmegame/]
 
 Forum link:
@@ -90,7 +90,7 @@ link:http://guyspeed.com/best-rts-games-ever/[http://guyspeed.com/best-rts-games
 
 Heaven – RTS Game.
 
-image::http://farm9.staticflickr.com/8041/7976138046_752c4a5b03_b.jpg[7976138046_752c4a5b03_b.jpg,with="400",height="",align="center"]
+image::http://farm9.staticflickr.com/8041/7976138046_752c4a5b03_b.jpg[7976138046_752c4a5b03_b.jpg,width="400",height="",align="center"]
 
 
 
@@ -102,11 +102,11 @@ image::http://farm9.staticflickr.com/8041/7976138046_752c4a5b03_b.jpg[7976138046
 
 [TIP]
 ====
-So, what is the point of doing quite amount of researches before into real game developing. Ehr… RTS is a hard topic, especially, thousands of game in this genre got published, with failures and successes. If we want to go beyond “making a game like Starcraft goal, we have to do those long term researches. 
+So, what is the point of doing quite amount of researches before into real game developing. Ehr… RTS is a hard topic, especially, thousands of game in this genre got published, with failures and successes. If we want to go beyond “making a game like Starcraft goal, we have to do those long term researches.
 ====
 
 
-RTS games are my fav game genre.. I lost thousands of hours in them and never regret :p . That's why I try to make one, at least one like Star craft broodwar. 
+RTS games are my fav game genre.. I lost thousands of hours in them and never regret :p . That's why I try to make one, at least one like Star craft broodwar.
 
 Long and Detailed research topic and links for you to read into:
 
@@ -118,7 +118,7 @@ Long and Detailed research topic and links for you to read into:
 This section arrange the process and parts into a timeline to suite better with a tutorial format. You can read it day by day, week by week until you complete.
 
 .  Part 0: Download and Setup
-.  Part 1: Review and design, sketch 
+.  Part 1: Review and design, sketch
 .  Part 2: Assets
 .  Part 3: Code the main
 .  Part 4: Code the gameplay

+ 18 - 18
src/docs/asciidoc/jme3/atomixtuts/kickgame.adoc

@@ -1,6 +1,6 @@
 = kickgame
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -40,11 +40,11 @@ _Watch Euro now, play the game later! :p_
 
 Special technique will be introduced in the game and in the video tutorials:
 
-*   AI 
-**  Steering behavior &amp; Formation 
-**  Decision Tree 
+*   AI
+**  Steering behavior &amp; Formation
+**  Decision Tree
 **  Goalbase
-**  Stregagy planning 
+**  Stregagy planning
 **  Probality
 
 *   Scripting
@@ -63,7 +63,7 @@ I saw a Unity example about making sport game and It’s pretty damn good! But w
 
 Source code: link:http://code.google.com/p/eurokick-jmegame/[http://code.google.com/p/eurokick-jmegame/]
 
-Forum link: 
+Forum link:
 
 Design: link:https://docs.google.com/document/d/1JV8wZkyhaJc_4Jqrj1RQjhK4lNmGn7YFKwbJXxPM7Kk/edit?usp=sharing[here]
 
@@ -85,13 +85,13 @@ Inspired by series of the game Champion Manager and Pro Soccer!
 
 === Screenshots
 
-Version 0.1 
+Version 0.1
 
-image::http://farm8.staticflickr.com/7120/7420435866_b531225642_b.jpg[7420435866_b531225642_b.jpg,with="400",height="",align="center"]
+image::http://farm8.staticflickr.com/7120/7420435866_b531225642_b.jpg[7420435866_b531225642_b.jpg,width="400",height="",align="center"]
 
 
 
-image::http://farm6.staticflickr.com/5320/7420435428_7a99ca6553_b.jpg[7420435428_7a99ca6553_b.jpg,with="400",height="",align="center"]
+image::http://farm6.staticflickr.com/5320/7420435428_7a99ca6553_b.jpg[7420435428_7a99ca6553_b.jpg,width="400",height="",align="center"]
 
 
 
@@ -100,7 +100,7 @@ image::http://farm6.staticflickr.com/5320/7420435428_7a99ca6553_b.jpg[7420435428
 
 === Insight
 
-Because I'm (in my job) a 3D Artist, I can do the draft modelling in few days, and complete them in few weeks. Then I went down the long road of AI and doing +++<abbr title="Graphical User Interface">GUI</abbr>+++ for the game. These unbelievable numbers of tasks take me like 4-5 months because i'm also very busy at work. 
+Because I'm (in my job) a 3D Artist, I can do the draft modelling in few days, and complete them in few weeks. Then I went down the long road of AI and doing +++<abbr title="Graphical User Interface">GUI</abbr>+++ for the game. These unbelievable numbers of tasks take me like 4-5 months because i'm also very busy at work.
 
 Thank to good papers I found, I can achive good result which can sastisfy me a little bit.
 
@@ -110,7 +110,7 @@ Thank to good papers I found, I can achive good result which can sastisfy me a l
 This section arrange the process and parts into a timeline to suite better with a tutorial format. You can read it day by day, week by week until you complete.
 
 .  Part 0: Download and Setup
-.  Part 1: Review and design, sketch 
+.  Part 1: Review and design, sketch
 .  Part 2: Assets
 .  Part 3: Code the main
 .  Part 4: Code the gameplay
@@ -139,7 +139,7 @@ Here is check list:
 ..  Soccer stragegy
 ..  Locomotion of football player ( quite a long story …<<jme3/atomixtuts/kickgame/aa#,Read it>>)
 ..  Character customizing ( quite a long story …<<jme3/atomixtuts/kickgame/cc#,Read it>>)
-..  Advanced cinematic and camera system 
+..  Advanced cinematic and camera system
 
 .  Assets:
 ..  As I intend to use character customizing to reduce the amount of characters I have to model, so I have to learn how to make a model that can be customized with advanced rigs and animations.
@@ -159,7 +159,7 @@ So, there it's *no way in hell* this example game can compare to thoose commerci
 
 [NOTE]
 ====
-You can get the whole Design Document in googledoc link:https://docs.google.com/document/d/1JV8wZkyhaJc_4Jqrj1RQjhK4lNmGn7YFKwbJXxPM7Kk/edit?usp=sharing[here] with a lot of pictures instead of text! 
+You can get the whole Design Document in googledoc link:https://docs.google.com/document/d/1JV8wZkyhaJc_4Jqrj1RQjhK4lNmGn7YFKwbJXxPM7Kk/edit?usp=sharing[here] with a lot of pictures instead of text!
 ====
 
 
@@ -181,7 +181,7 @@ Read a short Game Design workflow introduction: <<jme3/atomixtuts/design#,design
 
 In this phase, we will design the most important things have influence to our game:
 
-*  Gameplay 
+*  Gameplay
 *  Screens
 
 We did not mention concepts and idea step… but it's no need for this kind of game, because we played a lot of them and see it on TV everyday.
@@ -205,7 +205,7 @@ In my POV, Mind mapping is really good for game design very first attempt!
 ====
 
 
-Football image:http://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KeFVfQ204ZjE0ZGM&.png[uc?export=view&amp;id=0B1ZtpcLL_67KeFVfQ204ZjE0ZGM&amp;.png,with="200",height=""] and Bussiness image:http://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KSmFJcjFlc1U3ejg&.png[uc?export=view&amp;id=0B1ZtpcLL_67KSmFJcjFlc1U3ejg&amp;.png,with="200",height=""]
+Football image:http://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KeFVfQ204ZjE0ZGM&.png[uc?export=view&amp;id=0B1ZtpcLL_67KeFVfQ204ZjE0ZGM&amp;.png,width="200",height=""] and Bussiness image:http://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KSmFJcjFlc1U3ejg&.png[uc?export=view&amp;id=0B1ZtpcLL_67KSmFJcjFlc1U3ejg&amp;.png,width="200",height=""]
 
 If you don't want to see the full picture yet, or want to try your self. Please consider evolving the ideas from this abstraction:
 
@@ -229,7 +229,7 @@ If you don't want to see the full picture yet, or want to try your self. Please
 **  Construction ( build a big stadium of your own)
 **  Shop ( sell some thing from your club )
 **  Media ( the news, tv..)
-**  Business ( contracts, reports…) 
+**  Business ( contracts, reports…)
 **  Statistics ( charts, numbers…)
 
 *  Other gameplay
@@ -277,7 +277,7 @@ Round Matches
 ....
 
 
-image::http://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KNGRER0FCaDVHOGM&.png[uc?export=view&amp;id=0B1ZtpcLL_67KNGRER0FCaDVHOGM&amp;.png,with="250",height="",align="right"]
+image::http://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KNGRER0FCaDVHOGM&.png[uc?export=view&amp;id=0B1ZtpcLL_67KNGRER0FCaDVHOGM&amp;.png,width="250",height="",align="right"]
 
 
 

+ 6 - 6
src/docs/asciidoc/jme3/atomixtuts/kickgame/assets.adoc

@@ -1,6 +1,6 @@
 = assets
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -22,17 +22,17 @@ Uniform Cloth Texture layout is the same with Pro Soccer evolution and Fifa seri
 
 In Blender
 
-image::https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KMGxFSHo4WEdIMG8&.png[uc?export=view&amp;id=0B1ZtpcLL_67KMGxFSHo4WEdIMG8&amp;.png,with="400",height="",align="center"]
+image::https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KMGxFSHo4WEdIMG8&.png[uc?export=view&amp;id=0B1ZtpcLL_67KMGxFSHo4WEdIMG8&amp;.png,width="400",height="",align="center"]
 
 
 In JMP
 
-image::https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KQzBlRlRaSDJTa2s&.png[uc?export=view&amp;id=0B1ZtpcLL_67KQzBlRlRaSDJTa2s&amp;.png,with="400",height="",align="center"]
+image::https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KQzBlRlRaSDJTa2s&.png[uc?export=view&amp;id=0B1ZtpcLL_67KQzBlRlRaSDJTa2s&amp;.png,width="400",height="",align="center"]
 
 
 Cloth Texture
 
-image::https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KQnVId29DUjduMkk&.png[uc?export=view&amp;id=0B1ZtpcLL_67KQnVId29DUjduMkk&amp;.png,with="400",height="",align="center"]
+image::https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KQnVId29DUjduMkk&.png[uc?export=view&amp;id=0B1ZtpcLL_67KQnVId29DUjduMkk&amp;.png,width="400",height="",align="center"]
 
 
 Video
@@ -52,7 +52,7 @@ Video
 
 At first attempt, I model the audiences in the stadium with 2D sprites. So they are flat animated billboard always face the camera. For the beginning, this method is good enough. We will change to advanced method later.
 
-image:https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KTkx4djR2Qk80OHM&.png[uc?export=view&amp;id=0B1ZtpcLL_67KTkx4djR2Qk80OHM&amp;.png,with="256",height=""]
+image:https://drive.google.com/uc?export=view&id=0B1ZtpcLL_67KTkx4djR2Qk80OHM&.png[uc?export=view&amp;id=0B1ZtpcLL_67KTkx4djR2Qk80OHM&amp;.png,width="256",height=""]
 
 Video
 

+ 23 - 23
src/docs/asciidoc/jme3/atomixtuts/mmorpg.adoc

@@ -1,6 +1,6 @@
 = mmorpg
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -22,29 +22,29 @@ After a long project, I have time to sit down a write something about MMORPG and
 ====
 A MMORPG Project is *not easy nor appropriate* for beginner. +
 Such projects need a lot of skills, knowledge, passions and efforts to accomplish… +
-This tutorial just 've written down as the process of one no warranty attempt start by forum members : @atomix and … () 
+This tutorial just 've written down as the process of one no warranty attempt start by forum members : @atomix and … ()
 ====
 
 
-The project will be a community project, that mean Open-source and non-profit, code name : 
+The project will be a community project, that mean Open-source and non-profit, code name :
 *Ancient Monkey World.*
 
-image::http://digital-art-gallery.com/oid/66/1356x1600_12073_Monkey_King_2d_fantasy_character_monkey_king_picture_image_digital_art.jpg[1356x1600_12073_Monkey_King_2d_fantasy_character_monkey_king_picture_image_digital_art.jpg,with="300",height="",align="right"]
+image::http://digital-art-gallery.com/oid/66/1356x1600_12073_Monkey_King_2d_fantasy_character_monkey_king_picture_image_digital_art.jpg[1356x1600_12073_Monkey_King_2d_fantasy_character_monkey_king_picture_image_digital_art.jpg,width="300",height="",align="right"]
 
 
 
 === Quick start for Developers
 
 *  Forum: link:http://hub.jmonkeyengine.org/forum/topic/mmorpg-adventure/[http://hub.jmonkeyengine.org/forum/topic/mmorpg-adventure/]
-*  Wiki: link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg] and link:http://code.google.com/p/ancient-monkey-world/w/list[http://code.google.com/p/ancient-monkey-world/w/list]
+*  Wiki: <<jme3/atomixtuts/mmorpg#,jme3:atomixtuts:mmorpg>> and link:http://code.google.com/p/ancient-monkey-world/w/list
 *  Sourcecode: link:http://code.google.com/p/ancient-monkey-world/[http://code.google.com/p/ancient-monkey-world/]
-*  Plan: link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg#process[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg#process]
+*  Plan: <<jme3/atomixtuts/mmorpg#process,jme3:atomixtuts:mmorpg#process>>
 *  Issues: link:https://code.google.com/p/ancient-monkey-world/issues/list[https://code.google.com/p/ancient-monkey-world/issues/list]
-*  Setup: 
+*  Setup:
 *  Tools: <<jme3/atomixtuts/mmorpg_tools#, Tools used>> <<jme3/atomixtuts/mmorpg/researches/toolset#,Research about toolset>>
-*  Game documents: 
-*  Art &amp; Assets: 
-*  License: BSD 
+*  Game documents:
+*  Art &amp; Assets:
+*  License: BSD
 
 
 === Quick start for Viewers
@@ -135,7 +135,7 @@ Of course not. It will take more than thousands of hours to code and to draw, do
 
 People may come up with different levels of knowledge and experience. So here and there, they may want to replace an open-source project by their own library. I also write almost every modules of the architure, but for myself I can not provide enough efforts for an opensource project maintaining. I just can keep bad code, release a few good one and write down articles.
 
-For people who are exciting of community project as MMORPG, may be this time you can gather up. I’m not guaranty that I’m enough of abitily to make it to the end, but at least we have a working base to start with. 
+For people who are exciting of community project as MMORPG, may be this time you can gather up. I’m not guaranty that I’m enough of abitily to make it to the end, but at least we have a working base to start with.
 
 
 [IMPORTANT]
@@ -161,7 +161,7 @@ link:https://www.google.com/search?q=Monkey+King[https://www.google.com/search?q
 
 I compose the idea with wild jungle scenes in fictional oriental - western mixed scenery and theme, and adventures along the jouney.
 
-image::http://fc09.deviantart.net/fs70/i/2011/004/d/5/monkey_king_by_saryth-d36e92m.jpg[monkey_king_by_saryth-d36e92m.jpg,with="400",height="",align="center"]
+image::http://fc09.deviantart.net/fs70/i/2011/004/d/5/monkey_king_by_saryth-d36e92m.jpg[monkey_king_by_saryth-d36e92m.jpg,width="400",height="",align="center"]
 
 
 [TIP]
@@ -173,7 +173,7 @@ More about ideas and Game Design [googlecode] and [googledocs] <<jme3/atomixtuts
 
 === Mind map
 
-This is the sketch mindmap of the game. 
+This is the sketch mindmap of the game.
 
 iframe::http://text2mindmap.com/JdE5xP[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
 
@@ -187,7 +187,7 @@ iframe::http://text2mindmap.com/JdE5xP[width="100%", height="600px", alt="", scr
 
 ==== Overal MMO Game Architecture
 
-In Phase 0 of the development process I intend to use Marauroa and some code from Arriane because the ease of use and clear design! 
+In Phase 0 of the development process I intend to use Marauroa and some code from Arriane because the ease of use and clear design!
 In *Marauroa* engine they have an excellent short and precise overview MMO game architecture which I will cite below, keep in my the detail implementation like DB or even programming language are optional:
 
 _Marauroa is based on very simple principles:_
@@ -210,7 +210,7 @@ link:http://arianne.sourceforge.net/engine/marauroa.html[http://arianne.sourcefo
 ====
 
 
-As said, the architecture and the components of a MMORPG game will be kept but part by part will be swaped or replaced as the process go. Why? Because there are better solutions new technologies nowaday. Now let take a look at the three things call the “Triangle of Bedmudas in game design. 
+As said, the architecture and the components of a MMORPG game will be kept but part by part will be swaped or replaced as the process go. Why? Because there are better solutions new technologies nowaday. Now let take a look at the three things call the “Triangle of Bedmudas in game design.
 
 
 ==== Entity system
@@ -228,7 +228,7 @@ So, as you see, JME community already offer 2-3 Entity System solutions. As the
 ==== Event system
 
 What's the hurry for a game event system?
-Yeah, event system here is not just the event (message) broadcasting. Because game technologies involve more and more parallelism, especially to be corporate with networking, the event system should also be considered again. 
+Yeah, event system here is not just the event (message) broadcasting. Because game technologies involve more and more parallelism, especially to be corporate with networking, the event system should also be considered again.
 
 Event system should encourage decoupeling and give the developer more strength and controls. Also ease of use, ightweight, non blocking, non replicating…etc
 
@@ -255,7 +255,7 @@ ____
 But can we come up with better overal design first?+Hopefully, yes, this time!
 ____
 
-So the asynchronized server, network and event system are widely use nowadays. The are dozen of open source project intended to solve the enterprise problems at once. 
+So the asynchronized server, network and event system are widely use nowadays. The are dozen of open source project intended to solve the enterprise problems at once.
 
 ....
  Node.js is a good example, the idea is simple but the implementation are truely epic. They've done it beautifully and we (java devs) should have the same thing or get used to it in the mean time.
@@ -275,16 +275,16 @@ In the researches you will find an article tell extractly how I use, modify, lev
 
 === Phase Zero
 
-*Start:* July 1st - August 1st 
+*Start:* July 1st - August 1st
 
-*Main task:* Setup and Port  MORPG engine Arriane from 2D to 3D. Try and review. 
+*Main task:* Setup and Port  MORPG engine Arriane from 2D to 3D. Try and review.
 
 <<jme3/atomixtuts/mmorpg/phase0#,phase0>>
 
 
 === Phase 1
 
-*Start:* August 1st - September 1st 
+*Start:* August 1st - September 1st
 
 *Main task:* Unknown
 
@@ -293,7 +293,7 @@ In the researches you will find an article tell extractly how I use, modify, lev
 
 === Phase 2
 
-*Start:* September 1st - Oct 1st 
+*Start:* September 1st - Oct 1st
 
 *Main task:* Unknown
 
@@ -302,7 +302,7 @@ In the researches you will find an article tell extractly how I use, modify, lev
 
 === Phase 3
 
-*Start:* Oct 1st - Nov 1st 
+*Start:* Oct 1st - Nov 1st
 
 *Main task:* Unknown
 

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels