Просмотр исходного кода

Merge pull request #2 from jMonkeyEngine/master

update
Yan 7 лет назад
Родитель
Сommit
8906213e21
100 измененных файлов с 2764 добавлено и 1549 удалено
  1. 68 15
      README.adoc
  2. 10 10
      src/docs/asciidoc/bsd_license.adoc
  3. 4 3
      src/docs/asciidoc/documentation.adoc
  4. 6 4
      src/docs/asciidoc/jme3.adoc
  5. 92 78
      src/docs/asciidoc/jme3/advanced/android.adoc
  6. 48 45
      src/docs/asciidoc/jme3/advanced/animation.adoc
  7. 64 0
      src/docs/asciidoc/jme3/advanced/application_states.adoc
  8. 22 22
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore.adoc
  9. 18 18
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/cycle.adoc
  10. 3 3
      src/docs/asciidoc/jme3/advanced/atom_framework/citygen.adoc
  11. 10 10
      src/docs/asciidoc/jme3/advanced/atom_framework/codegen.adoc
  12. 135 135
      src/docs/asciidoc/jme3/advanced/atom_framework/comparison.adoc
  13. 18 18
      src/docs/asciidoc/jme3/advanced/atom_framework/design.adoc
  14. 2 2
      src/docs/asciidoc/jme3/advanced/atom_framework/design/patterns.adoc
  15. 1 1
      src/docs/asciidoc/jme3/advanced/atom_framework/docs.adoc
  16. 1 1
      src/docs/asciidoc/jme3/advanced/collision_and_intersection.adoc
  17. 1 1
      src/docs/asciidoc/jme3/advanced/custom_controls.adoc
  18. 814 15
      src/docs/asciidoc/jme3/advanced/jme3_ai.adoc
  19. 150 88
      src/docs/asciidoc/jme3/advanced/loading_screen.adoc
  20. 50 58
      src/docs/asciidoc/jme3/advanced/mixamo.adoc
  21. 1 1
      src/docs/asciidoc/jme3/advanced/nifty_gui.adoc
  22. 127 126
      src/docs/asciidoc/jme3/advanced/physics.adoc
  23. 2 1
      src/docs/asciidoc/jme3/advanced/post-processor_water.adoc
  24. 15 15
      src/docs/asciidoc/jme3/advanced/softbody.adoc
  25. 22 20
      src/docs/asciidoc/jme3/advanced/walking_character.adoc
  26. 9 9
      src/docs/asciidoc/jme3/android.adoc
  27. 2 2
      src/docs/asciidoc/jme3/atomixtuts/bladegame.adoc
  28. 1 1
      src/docs/asciidoc/jme3/atomixtuts/cardsgame.adoc
  29. 4 5
      src/docs/asciidoc/jme3/atomixtuts/cardsgame/scripting.adoc
  30. 11 5
      src/docs/asciidoc/jme3/atomixtuts/design.adoc
  31. 77 77
      src/docs/asciidoc/jme3/atomixtuts/greenberet.adoc
  32. 13 13
      src/docs/asciidoc/jme3/atomixtuts/heavenrtsgame/gameplay/detailed.adoc
  33. 1 1
      src/docs/asciidoc/jme3/beginner/hello_animation.adoc
  34. 46 60
      src/docs/asciidoc/jme3/beginner/hello_asset.adoc
  35. 49 1
      src/docs/asciidoc/jme3/beginner/hello_simpleapplication.adoc
  36. 77 17
      src/docs/asciidoc/jme3/build_from_sources.adoc
  37. 136 63
      src/docs/asciidoc/jme3/build_jme3_sources_with_netbeans.adoc
  38. 45 51
      src/docs/asciidoc/jme3/contributions.adoc
  39. 26 25
      src/docs/asciidoc/jme3/contributions/entitysystem/detailed.adoc
  40. 4 16
      src/docs/asciidoc/jme3/contributions/entitysystem/terms.adoc
  41. 37 39
      src/docs/asciidoc/jme3/contributions/tonegodgui_quickstart.adoc
  42. 23 23
      src/docs/asciidoc/jme3/intermediate/multi-media_asset_pipeline.adoc
  43. 21 16
      src/docs/asciidoc/jme3/intermediate/simpleapplication.adoc
  44. 21 21
      src/docs/asciidoc/jme3/math.adoc
  45. 4 4
      src/docs/asciidoc/jme3/math_for_dummies.adoc
  46. 10 10
      src/docs/asciidoc/jme3/requirements.adoc
  47. 5 3
      src/docs/asciidoc/jme3/scenegraph_for_dummies.adoc
  48. 18 20
      src/docs/asciidoc/jme3/scripting.adoc
  49. 6 6
      src/docs/asciidoc/jme3/scripting/groovy_event.adoc
  50. 8 8
      src/docs/asciidoc/jme3/scripting/groovy_learn.adoc
  51. 16 16
      src/docs/asciidoc/jme3/simpleapplication_from_the_commandline.adoc
  52. 61 10
      src/docs/asciidoc/jme3/virtualreality.adoc
  53. 2 2
      src/docs/asciidoc/sdk.adoc
  54. 5 6
      src/docs/asciidoc/sdk/development/sceneexplorer.adoc
  55. 16 14
      src/docs/asciidoc/sdk/use_own_jme.adoc
  56. 2 2
      src/docs/asciidoc/sdk_pt.adoc
  57. 3 3
      src/docs/asciidoc/spidermonkey.adoc
  58. 20 0
      src/docs/asciidoc/wiki/admonitions.adoc
  59. 196 0
      src/docs/asciidoc/wiki/atom_editor.adoc
  60. 40 0
      src/docs/asciidoc/wiki/atom_snippets.adoc
  61. 65 0
      src/docs/asciidoc/wiki/wiki_header.adoc
  62. 0 6
      src/docs/asciidoc/документация.adoc
  63. 0 8
      src/docs/asciidoc/документация/jme3_ru.adoc
  64. 0 8
      src/docs/asciidoc/документация/jme3_ru/faq_ru.adoc
  65. 0 8
      src/docs/asciidoc/документация/jme3_ru/scene_graph_для_чайников.adoc
  66. 0 8
      src/docs/asciidoc/документация/jme3_ru/вклад.adoc
  67. 0 8
      src/docs/asciidoc/документация/jme3_ru/внешние/blender_ru.adoc
  68. 0 8
      src/docs/asciidoc/документация/jme3_ru/вращение.adoc
  69. 0 8
      src/docs/asciidoc/документация/jme3_ru/граф_сцены_и_другая_терминология_jme3.adoc
  70. 0 8
      src/docs/asciidoc/документация/jme3_ru/кватернионы.adoc
  71. 0 8
      src/docs/asciidoc/документация/jme3_ru/математика_видео_уроки.adoc
  72. 0 8
      src/docs/asciidoc/документация/jme3_ru/матрица.adoc
  73. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/documentation.adoc
  74. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_анимацией.adoc
  75. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_вектором.adoc
  76. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_взаимодействиями.adoc
  77. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_догоняющей_камерой.adoc
  78. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_материалом.adoc
  79. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_местностью.adoc
  80. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_основным_циклом_обработки_событий.adoc
  81. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_простым_приложением.adoc
  82. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_ресурсами.adoc
  83. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_системой_ввода.adoc
  84. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_системой_ввода/время_нажатия_клавиши.adoc
  85. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_столкновениями.adoc
  86. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_узлами.adoc
  87. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_физикой.adoc
  88. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_эффектами.adoc
  89. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_со_звуком.adoc
  90. 0 8
      src/docs/asciidoc/документация/jme3_ru/начальная/что_такое_ide.adoc
  91. 0 8
      src/docs/asciidoc/документация/jme3_ru/особенности.adoc
  92. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/appsettings_ru.adoc
  93. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/documentation.adoc
  94. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/math_ru.adoc
  95. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/multi-media_asset_pipeline_ru.adoc
  96. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/simpleapplication_ru.adoc
  97. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/как_использовать_материал.adoc
  98. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/лучшая_практика.adoc
  99. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/оптимизация.adoc
  100. 0 8
      src/docs/asciidoc/документация/jme3_ru/промежуточная/типы_файлов.adoc

+ 68 - 15
README.adoc

@@ -1,55 +1,108 @@
+:experimental:
+
 image:https://travis-ci.org/jMonkeyEngine/wiki.svg?branch=master["Build Status", link="https://travis-ci.org/jMonkeyEngine/wiki"]
 
 = jMonkeyEngine Documentation
 
-WARNING: The project is an experimental WIP for the documentation of jME3
-
 see http://jmonkeyengine.github.io/wiki/documentation
 
-The project to store, edit, and generate the documentation of http://jmonkeyengine.org[jMonkeyEngine]
+The project to store, edit, and generate the documentation of http://jmonkeyengine.org[jMonkeyEngine].
 
 The documentation (<<src/docs/asciidoc>>) is editable :
 
-* online via github (Edit button + PR)
-* offline, after local `git clone` + ....
+* online via github (Edit button located at top of the Wiki page + Pull Request)
+* offline with Netbeans after local `git clone` + open
+* offline with Atom editor, see link:https://jmonkeyengine.github.io/wiki/wiki/atom_editor.html[Atom Editor for Wiki Editing]
+
+.Prerequisites
+.  Have a link:https://github.com/[GitHub account].
+.  Optional: Are a Wiki project member.
+
+If you are not a member, you can fork the repository into your GitHub account and issue pull requests from there or
+online via github. (Edit button located at top of the Wiki page + Pull Request)
+
+To fork the Wiki repository into your GitHub Account:
+
+*  In the menu at the top of the page, select the *Fork* button.
 
 The syntax is asciidoc :
 
-* http://asciidoctor.org/docs/asciidoc-syntax-quick-reference/[Asciidoc Syntax Quick Reference]
+*  link:http://asciidoctor.org/docs/asciidoc-syntax-quick-reference/[Asciidoc Syntax Quick Reference]
+*  link:http://asciidoctor.org/docs/user-manual/#introduction-to-asciidoctor[Asciidoctor User Manual]
+
+An easy to use primer for GitHub commands can be found here:
+
+*  link:http://rogerdudler.github.io/git-guide/[git - the simple guide]
+
 
 == Contribute
 
-TODO
+There are a few simple rules to follow when contributing.
+
+. It's not required but it's a good idea to give a heads up you made a P/R on the link:https://hub.jmonkeyengine.org/[jMonkeyEngine Forum] under the `Documentation` topic.
+.  When adding documents, make sure to always complete the header of your document first.
+** see link:https://jmonkeyengine.github.io/wiki/wiki/wiki_header.html[Anatomy of a Wiki Header]
+.  When linking to other Wiki pages, always use an "`Inter-Document Cross Reference`" with the format,
+** ++<<path/to/wiki/page#,custom label text>>++ +
+The `#` sign substitutes for the file extension. This type of link will first look for the `.adoc` file and if not found default to the `.html` version.
++
+The path should be relative to the `asciidoc` folder.
++
+For example: `++<<jme3/requirements#,Software and hardware requirements>>++` +
+links to the `requirements.adoc` page, which lives in a sub-folder of `asciidoc` named `jme3`.
++
+See link:http://asciidoctor.org/docs/user-manual/#inter-document-cross-references[http://asciidoctor.org/docs/user-manual/#inter-document-cross-references] for more info.
+.  When linking to images stored in the wiki repository, always use an image prefix in front of the file name and square brackets after it with the format,
+**  Image on its own line  - `image::path/to/image.jpg[image alt text,width=" ",height=" ", align=" "]`
++
+For example: `++image::jme3/beginner/beginner-assets-models.png[beginner-assets-models.png,320,250,align="center"]++`
++
+*  This image is on its own line.
+*  Is stored in the `jme3/beginner` folder which lives in the `images` folder.
+*  Is named `beginner-assets-models.png`.
+*  Has a `alt text` name of `beginner-assets-models.png`.
+*  Has a width of 320.
+*  Has a height of 250.
+*  Is aligned in the center of the page.
+**  If you want to include an image inline, use the `image:` prefix instead (notice there is only one colon):
++
+See link:http://asciidoctor.org/docs/user-manual/#images[http://asciidoctor.org/docs/user-manual/#images] for in depth instructions.
 
-== Build
 
-Convert the AsciiDoc to HTML5 by invoking the 'asciidoctor' goal:
+== Build
 
+*  In Netbeans, convert the AsciiDoc to HTML5 by invoking the 'asciidoctor' goal:
++
+[source]
+----
  $ ./gradlew asciidoctor
-
+----
++
 Open the file _build/asciidoc/html5/index.html_  in your browser to see the generated HTML file.
 
+*  In Atom, you see real time changes when using the `AsciiDoc Preview` (kbd:[ctrl]+kbd:[shift]+kbd:[A] or `menu:Packages[AsciiDoc Preview>Toggle Preview]`). No build is required.
+
 == TODO
 
 - [x] configure travis build
 - [x] configure github + gradle + travis to publish on gh-pages branches
 - [x] find and fixe conversion bug
 - [x] complete conversion: note, warning, ...
-- [ ] fix warning during html's generation (should be fixed manually)
+- [x] fix warning during html's generation (should be fixed manually)
 - [x] add meta info during conversion (doctitle, revision, tags, ...)
 - [x] add a home page (index.html)
 - [ ] add a navigation bar or a menu (?)
 - [ ] customize html layout (header, footer, css)
 - [x] transfer ownership to jMonkeyEngine org
-- [ ] complete Doc, how to contribute,...
-- [ ] accept PR
+- [x] complete Doc, how to contribute,...
+- [ ] accept Pull Request
 - [ ] write a post about the migration (the tools, why asciidoc, vs alternatives, how ...)
 - [ ] generate sitemap
-- [ ] add search box
+- [x] add search box
 - [ ] add google analytics (?)
 - [ ] support emoji
 - [ ] support iframe block
-- [ ] fix slideshow of "Xxx for Dummies"
+- [x] fix slideshow of "Xxx for Dummies"
 - [ ] optimize remove useless images
 - [ ] optimize image, use smaller file, eg convert to jpg or to webp, resize
 - [ ] organize i18n / lang

+ 10 - 10
src/docs/asciidoc/bsd_license.adoc

@@ -1,6 +1,6 @@
 = bsd_license
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
@@ -11,24 +11,24 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 [source]
 ----
 
-Copyright (c) 2003-2016 jMonkeyEngine
+Copyright (c) 2003-2017 jMonkeyEngine
 All rights reserved.
- 
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
- 
+
 * Redistributions of source code must retain the above copyright
 notice, this list of conditions and the following disclaimer.
- 
+
 * Redistributions in binary form must reproduce the above copyright
 notice, this list of conditions and the following disclaimer in the
 documentation and/or other materials provided with the distribution.
- 
-* Neither the name of 'jMonkeyEngine' nor the names of its contributors 
-may be used to endorse or promote products derived from this software 
+
+* Neither the name of 'jMonkeyEngine' nor the names of its contributors
+may be used to endorse or promote products derived from this software
 without specific prior written permission.
- 
+
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

+ 4 - 3
src/docs/asciidoc/documentation.adoc

@@ -9,8 +9,9 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 This documentation wiki contains installation and configuration guides, jME coding tutorials and other information that will help you get your game project going. You can search the contents of this wiki using the search box in the upper right.
 
-You are also very welcome to fix mistakes or spelling as well as unclear paragraphs using the “Wiki menu on top or the “Edit buttons after each paragraph. You have to be logged in to edit the wiki.
+You are also very welcome to fix mistakes or spelling as well as unclear paragraphs using the "`Wiki`" menu on top or the "`Edit`" buttons after each paragraph. You have to be logged in to edit the wiki.
 
+TIP: This is an Admonition. You will see many of these scattered throughout the Wiki. See the <<wiki/admonitions#,Admonition Definitions>> for the meaning of this and all the other Admonitions.
 
 == Install
 
@@ -86,7 +87,8 @@ a| <<jme3/faq#,Answers to Frequently Asked Questions>>
 Are you an experienced Java developer who wants to add new features or contribute patches to the jME3 project?
 
 *  Get inspired by existing <<jme3/contributions#,contributions>>
-*  link:http://hub.jmonkeyengine.org/introduction/contributors-handbook/[Read the Contributors Handbook]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/CONTRIBUTING.md[How to contribute to jMonkeyEngine]
+*  link:https://github.com/jMonkeyEngine/wiki[Become a Wiki Editor]
 *  link:http://hub.jmonkeyengine.org/c/contribution-depot-jme3[Chime in on the Contributors Forum]
 *  <<jme3/jme3_source_structure#,Learn about the source structure>>
 *  <<sdk#development,Write jMonkeyEngine SDK plugins and visual editors>>
@@ -106,6 +108,5 @@ You are welcome to contribute and inquire about the project: Please contact the
 
 == Languages
 
-<<документация#,Документация на Русском>> +
 <<documentacao#,Documentação em Português>> +
 <<documentation_zh#,中文版>>

+ 6 - 4
src/docs/asciidoc/jme3.adoc

@@ -7,6 +7,8 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
+TIP: This is an Admonition. You will see many of these scattered throughout the Wiki. See the <<wiki/admonitions#,Admonition Definitions>> for the meaning of this and all the other Admonitions.
+
 
 == Installation
 
@@ -116,7 +118,7 @@ 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>>     
+**  <<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 `menu:File[New Project>JME3 Tests]`) and the example games provided by the community!
@@ -132,9 +134,9 @@ Now that you understand the concepts, it's time to make the most of the jMonkeyE
 *  <<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>>     
+***  <<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/sourcecode#how-to-control-a-character-in-a-scene-source-code#,Source Code>>    
 
 *  <<jme3/advanced/multithreading#,Multithreading>>
 
@@ -209,7 +211,7 @@ Now that you understand the concepts, it's time to make the most of the jMonkeyE
 *  <<jme3/advanced/walking_character#,Walking Character>>
 *  <<jme3/advanced/ragdoll#,Ragdoll>>
 *  <<jme3/advanced/vehicles#,Vehicles>>
-*  <<jme3/advanced/ray_and_sweep_tests#,Physics Rays and Sweep Tests>>
+//*  <<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

+ 92 - 78
src/docs/asciidoc/jme3/advanced/android.adoc

@@ -1,35 +1,39 @@
 = android
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
 == Changing the Name of Your APK/Application:
 
-1. Open your project’s properties and navigate to Application+
-2. Update the title+
+. Open your project’s properties and navigate to Application
+. Update the title
 
 This has no real effect, however it keeps continuity throughout your app. Actually, this likely renamed the window created to display your app. So, now go change the actual name of your APK:
 
-1. Select File View in the left pane of the SDK+
-2. Navigate to the mobile/res/values directory and open the strings.xml file+
-3. There should be a string tag with the following key pair: name=”app_name”+
-4. Replace MyGame with your app’s name and save the file.+
-5. In File view, navigate to nbproject and open the project.properties file+
-6. Edit the value of application.title to reflect your game’s name (unless step 1/2 above altered this for you)+
+. Select `File View` in the left pane of the SDK.
+. Navigate to the `mobile/res/values` directory and open the `strings.xml` file.
+. There should be a string tag with the following key pair: name="app_name".
+. Replace `MyGame` with your app`'s name and save the file.
+. In `File view`, navigate to nbproject and open the `project.properties` file.
+. Edit the value of `application.title` to reflect your game`'s name (unless step 1/2 above altered this for you).
 
 
 == Changing the APK Icon:
 
-1. Under the File view of your project navigate to mobile/res and add a “drawable” folder if one does not exist.+
-2. Add you icon file (png)+
-3. Open the Android Manifest file and add the following to your application tag: android:icon=”@drawable/&lt;ICON FILE NAME WITHOUT EXTENSION&gt;”+
-4. If you would like multiple size icons, add the following folders:+
+. Under the `File view` of your project navigate to `mobile/res` and add a `drawable` folder if one does not exist.
+. Add your icon file (png).
+. Open the Android Manifest file and add the following to your application tag:
++
+`android:icon="@drawable/<ICON FILE NAME WITHOUT EXTENSION>"`
 
+. If you would like multiple size icons, add the following folders:
++
 ....
 drawable-hdpi (should contain the icon named the same at 72×72 pixels)\\
 drawable-ldpi (should contain the icon named the same at 36×36 pixels)\\
@@ -40,117 +44,127 @@ drawable-xhdpi (should contain the icon named the same at 96×96 pixels)\\
 
 == Adding a Splash Screen to your app:
 
-1. Open Android Main Activity, ether through the Important Files list in Project view or in the File view under mobile/src/&lt;package name&gt;/ directory+
-2. Add the following line to the MainActivity method:+
+. Open `Android Main Activity`, either through the `Important Files` list in `Project view` or in the `File view` under `mobile/src/<package name>` directory.
+. Add the following line to the `MainActivity` method:
++
+`splashPicID = R.drawable.<IMAGE NAME WITHOUT EXTENSION>;`
 
-splashPicID = R.drawable.&lt;IMAGE NAME WITHOUT EXTENSION&gt;;
-
-3. Add the image the the mobile/res/drawable directory
+. Add the image to the `mobile\res\drawable` directory.
 
 Compiling Google Play Services and Adding it to Your Project:
 
 First get the api:
 
-1. Download the google play services add-on through the SDK Manager under Extras (named Google Play services)+
-2. Copy the directory from where you downloaded it to another location (like JME Projects Folder)+
+. Download the google play services add-on through the SDK Manager under Extras (named Google Play services).
+. Copy the directory from where you downloaded it to another location (like JME Projects Folder).
 
 
 == Compile the jar file for use with your project:
 
-1. In the directory you copied, there is an android project file.+
-2. In JME’s IDE, open this project+
-3. In the General section of the project properties, there is a list of potential Android target platforms. Select the one you are using for your project by clicking on the list (this is not intuitive at all, as the list looks like nothing more than info… not selectable items)+
-4. Under the Library section, click the checkbox that is labeled: Is Library+
-5. Click Ok and then Clean &amp; Build this project.+
+. In the directory you copied, there is an android project file.
+. In JME`'s IDE, open this project
+. In the General section of the project properties, there is a list of potential Android target platforms. Select the one you are using for your project by clicking on the list (this is not intuitive at all, as the list looks like nothing more than info… not selectable items).
+. Under the Library section, click the checkbox that is labeled:
+* [*] Is Library
+. Click btn:[Ok] and then Clean & Build this project.
 
 This will compile the play services all proper like so you can add it to your project. Now, for that step:
 
-1. Open your project’s properties.+
-2. In the Libraries section, click the “Add JAR/folder” button.+
-3. Find and add the jar you compiled above (This can be found in: &lt;COPIED DIR&gt;\libproject\google-play-services_lib\libs\google-play-services.jar+
-4. Modify your Android Manifest by adding the following tags under application:+
-&lt;meta-data android:name=”com.google.android.gms.games.APP_ID”
-android:value=”@string/app_id” /&gt;
-&lt;meta-data android:name=”com.google.android.gms.version”
-android:value=”@integer/google_play_services_version”/&gt;
-5. Add the following tag to your mobile/res/values/integers.xml file (create it if it doesn’t exist):+
-&lt;integer name=”google_play_services_version”&gt;4323000&lt;/integer&gt;
-6. Clean &amp; Build your project+
+. Open your project’s properties.
+. In the Libraries section, click the btn:[Add JAR/folder] button.
+. Find and add the jar you compiled above. This can be found in:
++
+`<COPIED DIR>\libproject\google-play-services_lib\libs\google-play-services.jar`
 
+. Modify your Android Manifest by adding the following tags under application:
++
+`<meta-data android:name="com.google.android.gms.games.APP_ID"
+android:value="@string/app_id" />
+<meta-data android:name="com.google.android.gms.version"
+android:value="@integer/google_play_services_version"/>`
+. Add the following tag to your mobile/res/values/integers.xml file (create it if it doesn’t exist):
++
+`<integer name="google_play_services_version">4323000</integer>`
+. Clean & Build your project
 
-== Adding Play Games Services to Your Project:
 
-1. Download the project from: link:https://github.com/playgameservices/android-samples[https://github.com/playgameservices/android-samples]+
-2. In the following directory, you find java files you will need to add to your project:+
+== Adding Play Games Services to Your Project:
 
+. Download the project from:
++
+link:https://github.com/playgameservices/android-samples[https://github.com/playgameservices/android-samples]
+. In the following directory, you find java files you will need to add to your project:
++
 ....
 <DOWNLOAD DIR>\android-samples-master\BasicSamples\libraries\BaseGameUtils\src\main\java\com\google\example\games\basegameutils\\
 Grab GameHelper.java and GameHelperUtil.java and add them to the directory you projects Main Activity is in\\
 ....
 
-3. In the following directoriy, you find a resource file you will need to add to your project:+
-
+. In the following directory, you find a resource file you will need to add to your project:
++
 ....
 <DOWNLOAD DIR>\android-samples-master\BasicSamples\libraries\BaseGameUtils\src\main\res\values\\
 Grab the gamehelper_strings.xml into your mobile/res/values folder\\
 ....
 
-4. Add the following jar from the Adroid SDK folder to your project as a library:+
-
+. Add the following jar from the Adroid SDK folder to your project as a library:
++
 ....
 <ANDROID SDK INSTALL DIR>\adt-bundle-windows-x86_64-20131030\sdk\extras\android\support\v4\android-support-v4.jar\\
 ....
-
++
 And this is the basics for setting this up.
 
 
 == Adding AdMob Support to Your Project:
 
-1. Open your Android Manifest and add the following tag update the application tag:+
-&lt;activity android:name=”com.google.android.gms.ads.AdActivity” android:configChanges=”keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize”/&gt;+
-2. After the application tag, add the following tags:
-&lt;uses-permission android:name=”android.permission.INTERNET”/&gt;+
-&lt;uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE”/&gt;+
-3. In the onCreate method of your Main Activity, add the following snippet (configure however you like):+
-
+. Open your Android Manifest and add the following tag update the application tag:
++
+`<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>`
+. After the application tag, add the following tags:
++
+`<uses-permission android:name="android.permission.INTERNET"/> +
+<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>`
+. In the onCreate method of your Main Activity, add the following snippet (configure however you like):
++
 ....
-      adView = new AdView(this);
-      adView.setAdSize(AdSize.FULL_BANNER);
-      adView.setAdUnitId(“<WHATEVER AD UNIT ID YOU ARE ASSIGNED THROUGH THE GOOGLE DEV CONSOLE>”);
-      adView.buildLayer(); 
-      LinearLayout ll = new LinearLayout(this);
-      ll.setGravity(Gravity.BOTTOM);
-      ll.addView(adView);
-      addContentView(ll, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+adView = new AdView(this);
+adView.setAdSize(AdSize.FULL_BANNER);
+adView.setAdUnitId(“<WHATEVER AD UNIT ID YOU ARE ASSIGNED THROUGH THE GOOGLE DEV CONSOLE>”);
+adView.buildLayer();
+LinearLayout ll = new LinearLayout(this);
+ll.setGravity(Gravity.BOTTOM);
+ll.addView(adView);
+addContentView(ll, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
 ....
 
 
 == Communication Between your Application & Main Activity:
 
-1. Create an interface named something along the lines of JmeToHarness.java
-2. Open your Android Main Activity and implement this interface.
-3. In Main.java of your Application, add the following:
-
+. Create an interface named something along the lines of `JmeToHarness.java`.
+. Open your `Android Main Activity` and implement this interface.
+. In `Main.java` of your Application, add the following:
++
 ....
- JmeToHarness harness; 
+ JmeToHarness harness;
  public JmeToHarness getHarness() {
    return this.harness;
- } 
+ }
  public void setHarnessListener(JmeToHarness harness) {
     this.harness = harness;
  }
- 
-....
 
-4. Add the following snippet to the onCreate method of your Android Main Activity:
+....
 
+. Add the following snippet to the onCreate method of your Android Main Activity:
++
 ....
 if (app != null)
     ((Main)app).setHarnessListener(this);
-    
+
 ....
 
-5. Add error handling if you want it.
+. Add error handling if you want it.
 
 This bit is ultra useful for calling AdMob changes and Play Games methods (like updating achievements, leader boards, etc, etc)
 
@@ -159,16 +173,16 @@ EDIT: Keep this as generic as you possibly can as it should plug &amp; play with
 
 == Changing the Package Name After Project Creation:
 
-1. Open the project properties of your Application
-2. Navigate to Application &gt; Android and edit the package name.
+. Open the project properties of your Application
+. Navigate to `menu:Application[Android]` and edit the package name.
 
 This does absolutely nothing, but help with consistency.
 
 So, to actually change the package name, you will want to:
 
-1. Open the Android Manifest
-2. Edit the manifest tag key pair: package=”&lt;THE NEW PACKAGE NAME&gt;”
-3. In File view, navigate to nbproject and open the project.properties file
-4. Edit the value of mobile.android.package
+. Open the `Android Manifest`
+. Edit the manifest tag key pair: `package="<THE NEW PACKAGE NAME>"`
+. In `File view`, navigate to nbproject and open the `project.properties` file.
+. Edit the value of `mobile.android.package`.
 
-Take a moment or 4 to navigate through the directory structure in file view and remove any artifacts left from the previous package name build. Alternately, you can run Clean on the project prior to updating the package name.
+Take a moment or 4 to navigate through the directory structure in file view and remove any artifacts left from the previous package name build. Alternately, you can run `Clean` on the project prior to updating the package name.

+ 48 - 45
src/docs/asciidoc/jme3/advanced/animation.adoc

@@ -1,30 +1,30 @@
 = Animation in jME3
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-In 3D games, you do not only load static 3D models, you also want to be able to trigger animations in the model from the Java code. 
+In 3D games, you do not only load static 3D models, you also want to be able to trigger animations in the model from the Java code.
 
 
 == Requirements
 
-JME3 only loads and plays animated models, it does not create them. 
+JME3 only loads and plays animated models, it does not create them.
 
 What is required for an animated model? (<<jme3/terminology#Animation,See also: Animation terminology>>)
 
-.  For each model, you have to segment the model into a skeleton (*bone rigging*). 
-.  For each motion, you have to specify how the animation distorts parts of the model (*skinning*).  
+.  For each model, you have to segment the model into a skeleton (*bone rigging*).
+.  For each motion, you have to specify how the animation distorts parts of the model (*skinning*).
 .  For each animation, you have to specify a series of snapshots of how the bones are positioned (*keyframes*).
 .  One model can contain several animations. You give every animation a name when you save it in the mesh editor.
 
 Unless you download free models, or buy them from a 3D artist, you must create your animated models in an *external mesh editor* (for example, Blender) yourself.
 
 *  <<sdk/blender#,Converting Blender Models to JME3 (.J3o files)>>
-*  link:http://www.youtube.com/user/aramakara[Video Series: Creating models in Blender, OgreMax, 3dsMax]
+//*  link:http://www.youtube.com/user/aramakara[Video Series: Creating models in Blender, OgreMax, 3dsMax]
 *  link:http://www.youtube.com/watch?v=NdjC9sCRV0s[Video: Creating and Exporting OgreXML Animations from Blender 2.61 to JME3 ]
 *  link:https://docs.google.com/fileview?id=0B9hhZie2D-fENDBlZDU5MzgtNzlkYi00YmQzLTliNTQtNzZhYTJhYjEzNWNk&hl=en[Scene Workflow: 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]
@@ -32,18 +32,18 @@ Unless you download free models, or buy them from a 3D artist, you must create y
 
 What is required in your JME3-based Java class?
 
-*  One Animation Control per animated model
+*  One Animation Control per animated model.
 *  As many Animation Channels per Control as you need to play your animations. In simple cases one channel is enough, sometimes you need two or more Channels per model to play gestures and motions in parallel.
 
 
 == Code Samples
 
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/model/anim/TestSpatialAnim.java[TestSpatialAnim.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/model/anim/TestBlenderAnim.java[TestBlenderAnim.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/model/anim/TestBlenderObjectAnim.java[TestBlenderObjectAnim.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/model/anim/TestOgreAnim.java[TestOgreAnim.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/model/anim/TestOgreComplexAnim.java[TestOgreComplexAnim.java]
-*  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/model/anim/TestCustomAnim.java[TestCustomAnim.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/anim/TestSpatialAnim.java[TestSpatialAnim.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/anim/TestBlenderAnim.java[TestBlenderAnim.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/anim/TestBlenderObjectAnim.java[TestBlenderObjectAnim.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/anim/TestOgreAnim.java[TestOgreAnim.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java[TestOgreComplexAnim.java]
+*  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/anim/TestCustomAnim.java[TestCustomAnim.java]
 
 
 == Controlling Animations
@@ -51,7 +51,7 @@ What is required in your JME3-based Java class?
 
 === The Animation Control
 
-Create one `com.jme3.animation.AnimControl` object in your JME3 application for each animated model that you want to control. You have to register each animated model to one of these Animation Controls. The control object gives you access to the available animation sequences in the model.  
+Create one `com.jme3.animation.AnimControl` object in your JME3 application for each animated model that you want to control. You have to register each animated model to one of these Animation Controls. The control object gives you access to the available animation sequences in the model.
 
 [source,java]
 ----
@@ -66,9 +66,9 @@ Create one `com.jme3.animation.AnimControl` object in your JME3 application for
 
 === Animation Channels
 
-An Animation Control has several Animation Channels (`com.jme3.animation.AnimChannel`). Each channel can play one animation sequence at a time. 
+An Animation Control has several Animation Channels (`com.jme3.animation.AnimChannel`). Each channel can play one animation sequence at a time.
 
-There often are situations where you want to run several animation sequences at the same time, e.g. “shooting while walking or “boxing while jumping. In this case, you create several channels, assign an animation to each, and play them in parallel. 
+There often are situations where you want to run several animation sequences at the same time, e.g. "`shooting`" while walking or "`boxing`" while jumping. In this case, you create several channels, assign an animation to each, and play them in parallel.
 
 [source,java]
 ----
@@ -79,7 +79,7 @@ There often are situations where you want to run several animation sequences at
 
 ----
 
-To reset a Control, call `control.clearChannels();`
+To reset a Control, call `control.clearChannels()`.
 
 
 == Animation Control Properties
@@ -105,7 +105,7 @@ a|Clear all channels in this control.
 
 a|addListener(animEventListener) +
 removeListener(animEventListener) +
-clearListeners() 
+clearListeners()
 a|Adds or removes listeners to receive animation related events.
 
 |===
@@ -126,10 +126,10 @@ a|Adds or removes an animation from this Control.
 a|getAnimationNames()
 a|A String Collection of names of all animations that this Control can play for this model.
 
-a|getAnim(“anim)
+a|getAnim("`anim`")
 a|Retrieve an animation from the list of animations.
 
-a|getAnimationLength(“anim)
+a|getAnimationLength("`anim`")
 a|Returns the length of the given named animation in seconds
 
 |===
@@ -146,7 +146,7 @@ a|The Skeleton object controlled by this Control.
 a|getTargets()
 a|The Skin objects controlled by this Control, as Mesh array.
 
-a|getAttachmentsNode(“bone)
+a|getAttachmentsNode("`bone`")
 a|Returns the attachment node of a bone. Attach models and effects to this node to make them follow this bone's motions.
 
 |===
@@ -161,20 +161,20 @@ The following properties are set per AnimChannel.
 a|AnimChannel Property
 a|Usage
 
-a|setLoopMode(LoopMode.Loop); 
-a| From now on, the animation on this channel will repeat from the beginning when it ends. 
+a|setLoopMode(LoopMode.Loop);
+a| From now on, the animation on this channel will repeat from the beginning when it ends.
 
-a|setLoopMode(LoopMode.DontLoop); 
-a| From now on, the animation on this channel will play once, and the freeze at the last keyframe. 
+a|setLoopMode(LoopMode.DontLoop);
+a| From now on, the animation on this channel will play once, and the freeze at the last keyframe.
 
-a|setLoopMode(LoopMode.Cycle); 
-a| From now on, the animation on this channel will play forward, then backward, then again forward, and so on. 
+a|setLoopMode(LoopMode.Cycle);
+a| From now on, the animation on this channel will play forward, then backward, then again forward, and so on.
 
-a|setSpeed(1f); 
-a| From now on, play this animation slower (&lt;1f) or faster (&gt;1f), or with default speed (1f). 
+a|setSpeed(1f);
+a| From now on, play this animation slower (&lt;1f) or faster (&gt;1f), or with default speed (1f).
 
-a|setTime(1.3f); 
-a| Fast-forward or rewind to a certain moment in time of this animation. 
+a|setTime(1.3f);
+a| Fast-forward or rewind to a certain moment in time of this animation.
 
 |===
 
@@ -212,16 +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) +
+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,15 +229,18 @@ a|Add a series of bones to be influenced by this animation channel: Add all bone
 
 == Playing Animations
 
-Animations are played by channel. *Note:* Whether the animation channel plays continuously or only once, depends on the Loop properties you have set.
+Animations are played by channel.
+
+NOTE: Whether the animation channel plays continuously or only once, depends on the Loop properties you have set.
+
 [cols="2", options="header"]
 |===
 
 a|Channel Method
 a|Usage
 
-a|channel_walk.setAnim(“Walk,0.50f); 
-a| Start the animation named “Walk on channel channel_walk. +
+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.
 
 |===
@@ -250,7 +253,7 @@ Use the AnimEventLister below to react at the end or start of an animation cycle
 
 === Usage Example
 
-In this short example, we define the space key to trigger playing the “Walk animation on channel2.
+In this short example, we define the space key to trigger playing the "`Walk`" animation on channel2.
 
 [source,java]
 ----
@@ -286,12 +289,12 @@ public class HelloAnimation extends SimpleApplication
                      implements AnimEventListener { ... }
 ----
 
-This optional Listener enables you to respond to animation start and end events, onAnimChange() and onAnimCycleDone().
+This optional Listener enables you to respond to animation start and end events, `onAnimChange()` and `onAnimCycleDone()`.
 
 
 === Responding to Animation End
 
-The onAnimCycleDone() event is invoked when an animation cycle has ended. For non-looping animations, this event is invoked when the animation is finished playing. For looping animations, this event is invoked each time the animation loop is restarted.
+The `onAnimCycleDone()` event is invoked when an animation cycle has ended. For non-looping animations, this event is invoked when the animation is finished playing. For looping animations, this event is invoked each time the animation loop is restarted.
 
 You have access to the following objects:
 
@@ -315,9 +318,9 @@ You have access to the following objects:
 
 === Responding to Animation Start
 
-The onAnimChange() event is invoked every time before an animation is set by the user to be played on a given channel (`channel.setAnim()`).
+The `onAnimChange()` event is invoked every time before an animation is set by the user to be played on a given channel (`channel.setAnim()`).
 
-You have access to the following objects
+You have access to the following objects:
 
 *  The Control to which the listener is assigned.
 *  The animation channel being played.

+ 64 - 0
src/docs/asciidoc/jme3/advanced/application_states.adoc

@@ -4,6 +4,7 @@
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
@@ -186,6 +187,69 @@ public class MyAppState extends AbstractAppState {
 ----
 
 
+== BaseAppState
+
+
+A new link:http://javadoc.jmonkeyengine.org/com/jme3/app/state/BaseAppState.html[BaseAppState] class was introduced as part of the link:https://hub.jmonkeyengine.org/t/jmonkeyengine-3-1-alpha-4-released/35478[updates] being made to the AppState interface. AbstractAppState is the most minimal of the minimal implementations of the AppState interface. You essentially still need to do everything yourself, including getting the funky enable/disable/initialized/terminate logic right. Now you just extend BaseAppState and you get onEnable() and onDisable() already worked out for you.
+
+Definition:
+
+[source,java]
+----
+public class MyBaseAppState extends BaseAppState {        
+    @Override    
+    protected void initialize(Application app) {        
+        //It is technically safe to do all initialization and cleanup in the         
+        //onEnable()/onDisable() methods. Choosing to use initialize() and         
+        //cleanup() for this is a matter of performance specifics for the         
+        //implementor.        
+        //TODO: initialize your AppState, e.g. attach spatials to rootNode    
+    }
+
+    @Override    
+    protected void cleanup(Application app) {        
+        //TODO: clean up what you initialized in the initialize method,        
+        //e.g. remove all spatials from rootNode    
+    }
+    
+    //onEnable()/onDisable() can be used for managing things that should     
+    //only exist while the state is enabled. Prime examples would be scene     
+    //graph attachment or input listener attachment.    
+    @Override    
+    protected void onEnable() {        
+        //Called when the state is fully enabled, ie: is attached and         
+        //isEnabled() is true or when the setEnabled() status changes after the         
+        //state is attached.    
+    }
+    
+    @Override    
+    protected void onDisable() {        
+        //Called when the state was previously enabled but is now disabled         
+        //either because setEnabled(false) was called or the state is being         
+        //cleaned up.    
+    }        
+    
+    @Override    
+    public void update(float tpf) {        
+        //TODO: implement behavior during runtime    
+    }
+    
+}
+----
+
+Notable BaseAppState changes are as follows:
+
+
+*  You no longer need to call super.initialize(stateManager, app) because it is now called by BaseAppState upon initialization for you.
+*  You no longer have to cast SimpleApplication to have access to AssetManager, AppStateManager, and you can even get a State directly. The getters getApplication(), getAssetManager(), getState(type) and their methods are available to you immediately. However, you still have to cast SimpleApplication to get rootNode.
+*  You no longer call super during cleanup, its done for you now.
+*  It's now safe to do all initialization and cleanup in the onEnable()/onDisable() methods.
+*  Cleanup and setEnabled now have logging built in.
+
+You use BaseAppState as you would AbstractAppState, other than mentioned above, and which one you use is entirely up to you. However, BaseAppState makes your life easier and is the recommended one to use now.
+
+See link:http://javadoc.jmonkeyengine.org/com/jme3/app/state/BaseAppState.html[BaseAppState] for more information.
+
 == Pausing and Unpausing
 
 You define what an AppState does when Paused or Unpaused, in the `setEnabled()` and `update()` methods. Call `myState.setEnabled(false)` on all states that you want to pause. Call `myState.setEnabled(true)` on all states that you want to unpause.

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

@@ -1,6 +1,6 @@
 = atomcore
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -16,7 +16,7 @@ This is the detailed documentation of AtomCore module architecture, design decis
 
 Source: link:https://code.google.com/p/atom-game-framework/source/browse/AtomCore/[https://code.google.com/p/atom-game-framework/source/browse/AtomCore/]
 
-Javadoc: 
+Javadoc:
 
 Issues:
 
@@ -61,7 +61,7 @@ Below you will read about how each feature is implemented in AtomCore.
 
 From an abstraction level, a Game- a special kind of software (almost always):
 
-*  composed by Entities, and their Stage; 
+*  composed by Entities, and their Stage;
 *  where Actions happen in a Cycle, procedure Events;
 
 A little bit more detailed, Gameplay is the way player play the Game, has:
@@ -75,9 +75,9 @@ A little bit more detailed, Gameplay is the way player play the Game, has:
 **  Interactive mode: When player interact with the game world
 
 *  Control: The way player handle their entities
-*  League: 
+*  League:
 **  Player, Matchs, Groups and their infos &amp; activities
-**  Single: Infos, score, rewards stick to an individual 
+**  Single: Infos, score, rewards stick to an individual
 **  Multi: The way players join, left, make friend and interactive and play together…
 
 *  Status: Way to pause/continue , save/load current game
@@ -93,7 +93,7 @@ The game “software should be published in specific enviroment called Context,
 
 [NOTE]
 ====
-This is so important to mention that every techs Atom framework are around Bean/ POJO technologies. 
+This is so important to mention that every techs Atom framework are around Bean/ POJO technologies.
 ====
 
 
@@ -129,7 +129,7 @@ In JME3 we almost see the things work like this, the “almighty” Cycle:
 
 The reason this cycle exists is because of JME3 application tied strictly with monotholic processing method, and the main convict is OpenGL.
 
-In Atom, is not actually the case!! Atom try to connect various parts of facilities in networks and try to run as independent-parallel as it can. Cycle defined as a pre-ordered routine is not suiable with the work of parallel processing and enterprise… That's why a sotiphicated customable-expandable “cycle is the heart to Atom framework which made it a solid replacement of “old JME3 cycle. 
+In Atom, is not actually the case!! Atom try to connect various parts of facilities in networks and try to run as independent-parallel as it can. Cycle defined as a pre-ordered routine is not suiable with the work of parallel processing and enterprise… That's why a sotiphicated customable-expandable “cycle is the heart to Atom framework which made it a solid replacement of “old JME3 cycle.
 
 Read more details in AtomCore's Cycle.
 
@@ -138,7 +138,7 @@ Read more details in AtomCore's Cycle.
 
 ===== As core of a whole Enterprise
 
-As a long term follower of Spring (one of Atom inspiration) : 
+As a long term follower of Spring (one of Atom inspiration) :
 link:http://spring.io/[http://spring.io/]  …
 link:http://en.wikipedia.org/wiki/Spring_framework[http://en.wikipedia.org/wiki/Spring_framework]
 
@@ -154,7 +154,7 @@ I learnt few things,eventually Spring is for Enterprise, so most of its features
 ....
 
 
-===== Entity
+==== Entity
 
 
 ===== Managers
@@ -177,7 +177,7 @@ To clean the mist of confusion about mixed of concepts a little bit, there are s
   Manager have power over its children : its handle it children; in almost scenarios child has left its Manager's list come hollow (as null)
 ....
 
-Entity related - Managers can be considered as the other piece in constrast with Entity, as it manage entity existing and activities. 
+Entity related - Managers can be considered as the other piece in constrast with Entity, as it manage entity existing and activities.
 
 Also note that Managers normally form a Tree, with Hierarchy or dependency as commonly seen in OOP.
 
@@ -210,7 +210,7 @@ In AtomCore I sketch some interface of ES in which not care much about the imple
 ==== Common implementations
 
 ....
-  Of course a framewok is almost meaningless if it just contain psuedo code or interfaces without inplementation. I also implemented some common and useful piecies of code which ready to use :p. 
+  Of course a framewok is almost meaningless if it just contain psuedo code or interfaces without inplementation. I also implemented some common and useful piecies of code which ready to use :p.
 ....
 
 
@@ -223,7 +223,7 @@ My basic form of game Cycle aka CommonCycle crafted to work well with AppState c
 The Cycle consist 6 basis methods:
 
 .  init : Lazy init and be injected with its dependencies declaretion
-.  load : Load assets or underlying data (later than its dependencies) 
+.  load : Load assets or underlying data (later than its dependencies)
 .  config : reconfig if need, even in update
 .  start : trigger start a working routine of the object
 .  update
@@ -236,7 +236,7 @@ why 6? Why cycle? The customizable version of cycle? Introduce new cycles, queue
 
 Common scenarios that almost every game have, help you to startup easily. That mean the code is there in the library, you can also overide because its very extensible!
 
-*  Manage entities: add/remove/select 
+*  Manage entities: add/remove/select
 *  Composable logic: with condition, trigger
 *  Event messaging system (network ready): as inner / outter communicate media with eventbus and non blocking network
 *  Provide user functions and controls: As State, Control, Actors
@@ -273,7 +273,7 @@ Detail:
 
 ==== Event message system
 
-With eventbus 
+With eventbus
 
 non blocking network
 
@@ -284,7 +284,7 @@ In turn, along with this pre defined cycle, some common states which ready to us
 
 *  LoadState : load / watch
 *  MenuState : select / option / ingame / exit
-*  InGameState : pause/ stop 
+*  InGameState : pause/ stop
 
 
 ==== Common Routines
@@ -294,9 +294,9 @@ Handle Tasks, Actions in good concurent way (multi threading, actor..).
 
 ===== Common Controls
 
-EntityControl 
+EntityControl
 
-SpatialEditorControl 
+SpatialEditorControl
 
 AtomCharacterControl
 
@@ -373,7 +373,7 @@ Concepts and Facilities to create and manage animations and effects.
 *  particles 		Concepts to build bigger system from smaller part [Atom concepts]
 *  sprite			Concepts for cross dimensional elements
 *  timeline		Enhance of timming framework
-*  transition		Transition between stateful objects 
+*  transition		Transition between stateful objects
 *  tween			Object interpolations.
 
 
@@ -404,7 +404,7 @@ Concepts and interfaces for connectivity and communication via networks
 
 Concepts and facilities for cinematography like games
 
-*  actor			Bridge from entities to actor framework	
+*  actor			Bridge from entities to actor framework
 *  cine			Sostiphicate cinematic framework for complex video games
 *  helpers			“Inplace controls which know about Stage. Bridge from JME3 Controls concepts
 *  input			Sostiphicate high level input system use for develop and test game
@@ -425,7 +425,7 @@ General +++<abbr title="Graphical User Interface">GUI</abbr>+++ for user interac
 
 ==== sg.atom.utils
 
-Collections of userful utilities and datastructures, algorimths here and there. 
+Collections of userful utilities and datastructures, algorimths here and there.
 
 
 [WARNING]
@@ -441,7 +441,7 @@ Concepts and interfaces to build and manage the game world and enviroment
 
 *  gen				Generate the world from data
 *  geometry		Maths for geometries
-*  lod				Level of detail framework provides a lot of methods to optimize scene and geometry. 
+*  lod				Level of detail framework provides a lot of methods to optimize scene and geometry.
 *  material		Additional to JME3 material system
 *  physics			Additional to JME3 physic system
 *  rendering		Additional to JME3 render system

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

@@ -1,6 +1,6 @@
 = cycle
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../../
 :imagesdir: ../../../..
@@ -10,18 +10,18 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == Well defined Cycles
 
-Cycle are ordered activities which repeat over and over during the entire application life time. It's usually referred as game loop. 
+Cycle are ordered activities which repeat over and over during the entire application life time. It's usually referred as game loop.
 
 If you see a cycle as a list (ordered collection) of actions that the application does one at a time. You will see the application Iterate over them. In the opposite view (or in the action body), a traveller (usually data) seen it drag from one to the next one, so call pull to next step.
 
-As Atom also support reactive programming, it's essential that developer should understand clearly what is the benefit of program with this direction or other. To get (Between) BEST OF BOTH WORLD! 
+As Atom also support reactive programming, it's essential that developer should understand clearly what is the benefit of program with this direction or other. To get (Between) BEST OF BOTH WORLD!
 
 
 === Why 6?
 
 Game programmer usually stick with 3 steps execution
 
-.  init 
+.  init
 .  update
 .  destroy
 
@@ -34,7 +34,7 @@ Instead of that, Atom use 6 steps execution cycle:
 .  update
 .  finish
 
-These 6, I carefully learnt from other “good module and component framework I 've use: Wicket, OSGi,Spring…they have different steps number! 
+These 6, I carefully learnt from other “good module and component framework I 've use: Wicket, OSGi,Spring…they have different steps number!
 
 link:http://wicketguide.comsysto.com/guide/chapter6.html#chapter6_1[http://wicketguide.comsysto.com/guide/chapter6.html#chapter6_1]
 
@@ -54,7 +54,7 @@ For a real-time game, we need 2 more:
 
 ....
 load, update
- 
+
 ....
 
 “Config method is kind of a replicate of “init or “load, or confusion of these two, even can be done in “update somehow but in fact, it's worth to be separated. The config step will help you gain a lot in the way to extend the frameworks or to adapt/scale  your game to smaller or bigger usecase, anyway 6 “is not too much but enough !
@@ -72,9 +72,9 @@ Swing-MVC concepts are embeded in a event-driven enviroment… and it's actually
 
 Real-time application can be event-driven or not. As my exprience, apply this Swing-MVC to real-time application not usually help greatly but sounds very confused and blury. It can help if you too familiar with it anyway, but be careful or you break the MVC contracts easily and make it not useful. You can blindy apply it without concerning of consequence, but that don’t make any sense.
 
-The solid and only reason to say JME3 is pull and push, and why we still has to stop once for a while because of OpenGL via LWJGL is still monotholic! Not the GPU processing or GPU-CPU data exchange. So we still have to stop at the renderer's door, knock and wait until its done, then go to next step? Umh not quite. 
+The solid and only reason to say JME3 is pull and push, and why we still has to stop once for a while because of OpenGL via LWJGL is still monotholic! Not the GPU processing or GPU-CPU data exchange. So we still have to stop at the renderer's door, knock and wait until its done, then go to next step? Umh not quite.
 
-But to do this, we have to not depend in the update() and render() methods to get to total freedom. 
+But to do this, we have to not depend in the update() and render() methods to get to total freedom.
 
 
 ==== Concurrent / Parallel world
@@ -92,8 +92,8 @@ link:https://github.com/Netflix/RxJava/wiki[https://github.com/Netflix/RxJava/wi
 
 Even if “Cycle- which we used to known is just a conceptual view of points, my solution for this problem is to declare several new kinds of well-defined “Cycle :
 
-.  Push cycle 
-.  Pull cycle 
+.  Push cycle
+.  Pull cycle
 .  Non-cycle
 
 … because defining routines in Atom is not only free but also helps in a lot of situations like when you interact with GUIs, networks or webs.
@@ -101,7 +101,7 @@ Even if “Cycle- which we used to known is just a conceptual view of points, my
 
 ===== Pull cycle
 
-To connect to Swing MVC (also a pull cycle) with events, you can wrap them in Actors and let events send as messages between actors. The Swing actor in the EDT act as the brigde here. 
+To connect to Swing MVC (also a pull cycle) with events, you can wrap them in Actors and let events send as messages between actors. The Swing actor in the EDT act as the brigde here.
 
 
 ===== Push cycle
@@ -111,7 +111,7 @@ As in functional reactive programming and flow based programming, functions (sma
 
 ===== Non-cycle
 
-A serial of Tasks can also form atribinary routines ( non-cycle) and be coordinated together via Data they exchange. 
+A serial of Tasks can also form atribinary routines ( non-cycle) and be coordinated together via Data they exchange.
 
 
 [TIP]
@@ -124,7 +124,7 @@ Goto AtomPar for more concurrent/ paralell concepts and advices
 == Customable cycles
 
 
-==== Customable routines
+=== Customable routines
 
 Via tasks and workers, you can atribinary make your own cycle that do anything around and later participate in the rendering stage and JME logic stage (if they want).
 
@@ -137,16 +137,16 @@ Read: <<jme3/advanced/atom_framework/atomcore/concurrent#, AtomPar>>
 
 Bucket is a way to layered your rendering queue into layers or separate them into different categories (aka buckets) to handle differently.
 
-With a composable comperator, a sub-list from a list, or a sub-tree from a tree, even a sub-graph from a entire scene graph can be extracted, or the whole collection can be sorted arcordingly. Custom bucket in Atom framework is implemented in AtomLight package to extend JME3 rendering pipeline. 
+With a composable comperator, a sub-list from a list, or a sub-tree from a tree, even a sub-graph from a entire scene graph can be extracted, or the whole collection can be sorted arcordingly. Custom bucket in Atom framework is implemented in AtomLight package to extend JME3 rendering pipeline.
 
-Note that a custom bucket is not very efficient! Even though if you enable a setting, Atom will take care of its render order and the update will be “IO wise with special indexing structure call B-Tree. If you use it without cautions it can require a lot of memory and make your rendering suffer. 
+Note that a custom bucket is not very efficient! Even though if you enable a setting, Atom will take care of its render order and the update will be “IO wise with special indexing structure call B-Tree. If you use it without cautions it can require a lot of memory and make your rendering suffer.
 
 
 == Cycle & Scale
 
 You can see there is a trend for networks call non blocking IO, which Node.js is the first most and remarkable success. In that world, there is actually not a wellform cycle or turn at all. Because if there is a Queue or a lock, a insist port holder or an strict order (like a cycle), it can not scale at all!!
 
-In fact the atribinary networks and async data signals have a lot more problems than we can possible imagine. Not everything can be fast and precise…Some parts (services) may be slow by intend, some parts cause errors frequently. 
+In fact the atribinary networks and async data signals have a lot more problems than we can possible imagine. Not everything can be fast and precise…Some parts (services) may be slow by intend, some parts cause errors frequently.
 
 The fault torrent architecture of AtomEx make sure some sercurity and transactional problems are shielded. AtomDust in another hand focus in highly loose mobile devices and atribinay short range connections. Those carefully design systems for usecases actually make Atom suitable even without a real Cycle.
 
@@ -161,7 +161,7 @@ Read more about AtomEx for Cloud scale and AtomDust of Mobile scale.
 == Technical reviews
 
 
-==== Cycle (or ring)
+=== Cycle (or ring)
 
 
 ==== Cicular (or ring) buffer

+ 3 - 3
src/docs/asciidoc/jme3/advanced/atom_framework/citygen.adoc

@@ -1,6 +1,6 @@
 = citygen
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -39,7 +39,7 @@ Other CCD
 == First look
 
 
-==== Generation
+=== Generation
 
 
 ==== Simulation

+ 10 - 10
src/docs/asciidoc/jme3/advanced/atom_framework/codegen.adoc

@@ -1,6 +1,6 @@
 = codegen
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -25,9 +25,9 @@ MetaWidget
 
 Other game engines and editor: UDK, Unity, Blender, GameMaker…
 
-Other node base editor: 
+Other node base editor:
 
-Web world: 
+Web world:
 
 
 ==== Features
@@ -46,7 +46,7 @@ Scope &amp; Instruction &amp; Control base
 
 link:http://metawidget.org/[http://metawidget.org/]
 
-is for generating UI from objects. 
+is for generating UI from objects.
 
 *CodeGen* is for generating data (objects) from (data) objects.
 
@@ -76,7 +76,7 @@ That's said!
 == First look
 
 
-==== Generation
+=== Generation
 
 link:http://en.wikipedia.org/wiki/Code_generation_%28compiler%29[http://en.wikipedia.org/wiki/Code_generation_%28compiler%29]
 
@@ -106,7 +106,7 @@ Targets
 == Architecture & Designs
 
 
-==== MetaWidget Architecture
+=== MetaWidget Architecture
 
 link:http://metawidget.sourceforge.net/doc/reference/en/html/ch02.html[http://metawidget.sourceforge.net/doc/reference/en/html/ch02.html]
 
@@ -127,7 +127,7 @@ link:http://wiki.eclipse.org/index.php/EMF/FAQ[http://wiki.eclipse.org/index.php
 
 [TIP]
 ====
-MORAL: 
+MORAL:
 ====
 
 
@@ -143,8 +143,8 @@ Also take a look at wisdoms and <<jme3/advanced/atom_framework/atomcore/algorith
 *  [Language] Translate sematic from one to another language need a dictionary.
 *  [Art] Nothing new, just a cover
 *  [Computing] Template is a good abstraction of algorimths.
-*  [Programming] DRY and open source. 
-*  [New techs &amp; trends] Topology and well defined network actually a virtue. 
+*  [Programming] DRY and open source.
+*  [New techs &amp; trends] Topology and well defined network actually a virtue.
 
 
 ==== Layouts

+ 135 - 135
src/docs/asciidoc/jme3/advanced/atom_framework/comparison.adoc

@@ -1,6 +1,6 @@
 = comparison
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -17,21 +17,21 @@ Comparisons of general Java 3D which not tied to games and simulation
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| JME3             
-<a| Atom              
+<a| Features
+<a| JME3
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -40,21 +40,21 @@ Comparisons of general Java 3D which not tied to games and simulation
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| JScience             
-<a| Atom              
+<a| Features
+<a| JScience
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -63,21 +63,21 @@ Comparisons of general Java 3D which not tied to games and simulation
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| Plotemy           
-<a| Atom              
+<a| Features
+<a| Plotemy
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -86,21 +86,21 @@ Comparisons of general Java 3D which not tied to games and simulation
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| Java3D            
-<a| Atom              
+<a| Features
+<a| Java3D
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -110,7 +110,7 @@ Comparisons of general Java 3D which not tied to games and simulation
 3D game/simulation dev frameworks
 
 
-==== Java GameEngines
+=== Java GameEngines
 
 Some of them are free and open sourced but limited in features compared to JME3 and Atom together. In fact one can learn the architecture of Atom and plug in their engines. It's not too hard to do so as I did go through that path. The problem is the architecture is very hard to built from different concepts and loads of researches I did in the past 6 years. :)) But yes, they can of course.
 
@@ -119,21 +119,21 @@ Some of them are free and open sourced but limited in features compared to JME3
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| Unity             
-<a| Atom              
+<a| Features
+<a| Unity
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -142,21 +142,21 @@ Some of them are free and open sourced but limited in features compared to JME3
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| Unity             
-<a| Atom              
+<a| Features
+<a| Unity
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -167,21 +167,21 @@ Alice 4 is not open sourced yet
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| Unity             
-<a| Atom              
+<a| Features
+<a| Unity
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -195,21 +195,21 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| Unity             
-<a| Atom              
+<a| Features
+<a| Unity
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -218,21 +218,21 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| UDK               
-<a| Atom              
+<a| Features
+<a| UDK
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -241,21 +241,21 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| CryEngine         
-<a| Atom              
+<a| Features
+<a| CryEngine
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 
@@ -264,21 +264,21 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 [cols="3", options="header"]
 |===
 
-<a| Features      
-<a| HeroEngine       
-<a| Atom              
+<a| Features
+<a| HeroEngine
+<a| Atom
 
-<a| Row 1 Col 1    
-<a| Row 1 Col 2     
-<a| Row 1 Col 3        
+<a| Row 1 Col 1
+<a| Row 1 Col 2
+<a| Row 1 Col 3
 
-<a| Row 2 Col 1    
-<a| some colspan    
-<a|                    
+<a| Row 2 Col 1
+<a| some colspan
+<a|
 
-<a| Row 3 Col 1    
-<a| Row 2 Col 2     
-<a| Row 2 Col 3        
+<a| Row 3 Col 1
+<a| Row 2 Col 2
+<a| Row 2 Col 3
 
 |===
 

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

@@ -1,6 +1,6 @@
 = design
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -33,7 +33,7 @@ In this page:
 == Design goals
 
 
-==== Overal goals
+=== Overal goals
 
 *  Flexible: Game | simulations centric but not forced!
 *  Modular: Dependency injection along with Component injection
@@ -82,13 +82,13 @@ As mentioned in the Atom framwork's introduction, Atom is actually inspired by P
 So the two projects' *goals* are quite overlapped but have different focus points and mindset!
 
 *  Atom has no or less concern/ interests about mathematic/ physics correctioness ( so simmulations) but the graphics side and overal behaviors.
-*  Atom has open-source spirit… but not academic!! You can see Plotemy is quite “complicated and not very popular as it provided for academic first; in constrast, Atom is broadcasted for every one to use and to make games as kids in sandboxes. 
+*  Atom has open-source spirit… but not academic!! You can see Plotemy is quite “complicated and not very popular as it provided for academic first; in constrast, Atom is broadcasted for every one to use and to make games as kids in sandboxes.
 
 
 ==== Techniques differencies:
 
 *  Atom not “just depend on well-defined models!
-*  Atom use simplier models, …but sometime simplier is better! 
+*  Atom use simplier models, …but sometime simplier is better!
 **  Simplier Entity model (not abstract out of Java object)
 **  Actor model is not as abstrat also actually from threaded enviroment
 **  No contract in Systems, the study of Systems conections and interactivities are though data-driven analysising only, that's it, a dataflow monitoring system over working system.
@@ -140,20 +140,20 @@ For example, AtomCore module depends in these high quality libraries:
 
 *  JME3
 *  Common Java JSR annotations:
-*  Apache commons 
+*  Apache commons
 **  Lang
 **  Configurations
 **  BeanUtils
 **  Collections
 
-*  Google's 
+*  Google's
 **  Guava:
 **  Guice: Dependency injection
 **  Snappy:
 **  LevelDB
 **  Auto
 
-*  
+*
 
 Other require pieces are write from sk
 
@@ -170,7 +170,7 @@ This section is dedicated to explain some idioms, patterns, and long term soluti
 
 From an abstraction level, a Game- a special kind of software (almost always):
 
-*  composed by Entities, and their Stage; 
+*  composed by Entities, and their Stage;
 *  where Actions happen in a Cycle, procedure Events;
 
 A little bit more detailed, Gameplay is the way player play the Game, has:
@@ -184,8 +184,8 @@ A little bit more detailed, Gameplay is the way player play the Game, has:
 **  Interactive mode: When player interact with the game world
 
 *  Control: The way player handle their entities
-*  League: 
-**  Single: Infos, score, rewards stick to an individual 
+*  League:
+**  Single: Infos, score, rewards stick to an individual
 **  Multi: The way players join, left, make friend and interactive and play together…
 
 *  Status: Way to pause/continue , save/load current game
@@ -256,7 +256,7 @@ At some point, we have to find a solution to reduce “manual Data + code making
 
 [NOTE]
 ====
-This is so important to mention that every techs Atom framework are around Bean/ POJO technologies. 
+This is so important to mention that every techs Atom framework are around Bean/ POJO technologies.
 ====
 
 For example:
@@ -273,7 +273,7 @@ As built in Java technologies, Bean/ POJO is the only "consider good" solution a
 ....
 
 ....
-also can be seen as 
+also can be seen as
 **from Object oriented programming to Data oriented programming**
 **from Object oriented programming to Aspect oriented programming**
 ....
@@ -294,7 +294,7 @@ Atom in its core try to be polymorphism (polygot programming), to suite with OOP
 
 Because AtomScripting and others use Groovy, so it inherit (a lot of) polygot capacity from Groovy.
 
-Read: link:http://groovy.codehaus.org/Polyglot+Programming+with+Groovy[http://groovy.codehaus.org/Polyglot+Programming+with+Groovy]
+Read: link:http://groovy-lang.org/Polyglot+Programming+with+Groovy[http://groovy-lang.org/Polyglot+Programming+with+Groovy]
 
 
 ==== Functional reactive programming
@@ -343,10 +343,10 @@ link:http://code.imagej.net/gbh/lookup/DependencyInjectionandLookup.html[http://
 ==== Dependency management coolness
 
 So what's cool about dependency in real-time application and game that Atom included…
-A lot of things, but let me point out fews: 
+A lot of things, but let me point out fews:
 
 *Real-time dependency* is a new feature for game developing…
-Imagine that even the game just can load part of assets, with the other are delayed or missing, the dependency graph can help the game cycle continue to run, part of it in the mean time. 
+Imagine that even the game just can load part of assets, with the other are delayed or missing, the dependency graph can help the game cycle continue to run, part of it in the mean time.
 
 In fact the dependency graph can be considered the topo structure of JME assets dependency graph before it built, means hard links via references. Now even when the assets graph are just partly loaded, the game can run because it know a resolution to safety resolve the assets graph and scene graph afterward.
 
@@ -357,9 +357,9 @@ You can imagine how Atom framework tend to bridge JME game and the Web universal
 == Enterprise facilities
 
 
-==== Services, Dependency and Decoupling
+=== Services, Dependency and Decoupling
 
-The world of enteprise evolve Modular paradigm a lot to link services (database, configurations, network protocols, web…) and help they work together in one application. 
+The world of enteprise evolve Modular paradigm a lot to link services (database, configurations, network protocols, web…) and help they work together in one application.
 
 
 === Available Services

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

@@ -44,7 +44,7 @@ image::wiki/groovy-logo.png[200,width="",height="",align="right"]
 is an agile and dynamic language for the Java Virtual Machine
 builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk
 
-link:http://groovy.codehaus.org/[http://groovy.codehaus.org/]
+link:http://groovy-lang.org/[http://groovy-lang.org/]
 
 
 [TIP]
@@ -126,7 +126,7 @@ Back to real-time game, if you not making a chess game, almost you “are doing
 Here some analysing about patterns in JME3 world so Atom bypass or inherit them.
 
 
-==== Push or pull ?
+=== Push or pull ?
 
 worth to note:
 even some part of JME3 assemble MPV, it’s not the whole!

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

@@ -69,7 +69,7 @@ AtomCore (pure Java) supports:
 
 Because AtomScripting and others use Groovy, so it inherit (a lot of) polygot capacity from Groovy.
 
-Read: link:http://groovy.codehaus.org/Polyglot+Programming+with+Groovy[http://groovy.codehaus.org/Polyglot+Programming+with+Groovy]
+Read: link:http://groovy-lang.org/Polyglot+Programming+with+Groovy[http://groovy-lang.org/Polyglot+Programming+with+Groovy]
 
 
 === How can I structure my code?

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

@@ -164,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://javadoc.jmonkeyengine.org/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

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

@@ -263,7 +263,7 @@ public class MyControl extends MyCustomClass implements MyControlInterface {
 == Best Practices
 
 
-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's an example from the link:http://code.google.com/p/monkeyzone/[MonkeyZone] code:
 
 [source,java]
 ----

+ 814 - 15
src/docs/asciidoc/jme3/advanced/jme3_ai.adoc

@@ -1,41 +1,840 @@
 = jMonkeyEngine Artificial Intelligence
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2017/04/15 13:30
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
 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. 
+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. 
+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]. 
+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 path-finding].
 
-== 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. 
+== Requirements
 
-The jme3 Artificial Intelligence Library:
+*  link:https://github.com/MeFisto94/jme3-artificial-intelligence/releases[jme3 Artificial Intelligence Library] - The library and javaDocs for jme3AI. This is also where you can report problems or help in maintaining the library.
+*  link:https://github.com/stevefsp/critterai/releases[CritterAI] - Stephen Pratt's link:http://www.critterai.org/projects/nmgen_study/[NMGen Study] project files to generate the navmesh.
+*  To get the assets (3D models) used in this example, add the <<sdk/sample_code#jme3testdata-assets#,jME3-testdata.jar>> to your classpath.
+*  Java SDK 8+.
 
-*  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.]  
+Stephen Pratt explains in detail the configuration parameters of CritterAI/Jme3AI in a easy to follow format and is suggested reading.
 
+*  link:http://www.critterai.org/projects/nmgen_study/config.html[Configuration Parameters]
 
-== Use Examples
 
-Coming at a later date.
+== Use Example
 
 
-== Other jME3 AI Options
+The jme3 Artificial Intelligence Library contains:
+
+*  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 - 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.] 
+
+[NOTE]
+====
+This scope of this tutorial is restricted to the NavMesh part of the library and expands upon the lessons taught in the <<jme3#tutorials-for-beginners,tutorials>>. It demonstrates the use of some classes and methods found in the Medium and Advanced topics of the wiki as well. You can find the source code for this tutorial in the  link:https://github.com/jMonkeyEngine/doc-examples/tree/master/src/com/jme3/examples/jme3ai[jMonkeyEngine/docs-examples] repository.
+====
+
+Moving a character through your scene requires three things.
+
+*  A navigation mesh.
+*  A path-finding component that uses that navigation mesh to calculate a path.
+*  A way to move the character.
+
+
+== NavMesh Creation
+
+
+The first thing you need for path-finding is a navigation mesh. There are two ways to generate the NavMesh, procedural or the jMonkey link:https://github.com/jMonkeyEngine/sdk/releases[SDK].
+
+*  The SDK has a built-in command, but comes with a trade-off that no parameter exceptions are thrown. This means you are flying blind when the NavMesh fails generation.
+*  If you choose procedural, you see any generation exceptions, but you will have to do a little more work like saving, loading and/or displaying the NavMesh.
+
+Both methods produce exactly the same NavMesh and both will be covered in this tutorial.
+
+=== From the SDK
+*  Open your scene in the Terrain Editor or Scene Explorer by btn:[RMB] selecting the file in your assets folder and choosing `Edit Terrain` or `Edit in SceneComposer`.
+*  Once open, btn:[RMB] select the root node in the `SceneExplorer` and then select `menu:Spatial[NavMesh]`.
+
+This will open the `Create NavMesh` dialog with default settings. You can read in depth about each parameter by following the `Configuration Parameters` link under <<jme3/advanced/jme3_ai#requirements#,Requirements>>.
+
+.Parameter Insight
+The jme3AI system uses CritterAI, which is based off link:https://github.com/recastnavigation/recastnavigation[Recast and Detour] navigation. The author of Recast lays out a few specific rules for NavMesh creation in this link:http://digestingduck.blogspot.dk/2009/08/recast-settings-uncovered.html[blog post], which logically apply to jme3AI. Below is a translation of this post as it pertains to jme3AI.
+
+*  First you should decide the size of your character "capsule". For example, if you are using meters as units in your game world, a good size of human sized character might be (r)adius=0.4, (h)eight=2.0.
+*  Next the voxelization cell size (cs) will be derived from that. Usually good value for cs is r/2 or r/3. In outdoor environments, r/2 might be enough, indoors you sometimes want the extra precision and you might choose to use r/3 or smaller.
+*  The voxelization cell height (ch) is defined separately in order to allow greater precision in height tests. Good starting point for ch is cs/2. If you get small holes where there are discontinuities in the height (steps), you may want to decrease cell height.
+*  Next up is the character definition values. First up is `minTraversableHeight`, which defines the height of the agent.
+*  The `maxTraversableStep` defines how high steps the character can climb.
+*  The parameter `traversableAreaBorderSize` defines the agent radius. If this value is greater than zero, the navmesh will be shrunken by the `traversableAreaBorderSize`. If you want to have tight fit navmesh, use zero radius.
+*  The parameter `maxTraversableSlope` is used before voxelization to check if the slope of a triangle is too high and those polygons will be given a non-walkable flag. The parameter is in radians.
+*  In certain cases really long outer edges may decrease the triangulation results. Sometimes this can be remedied by just tessellating the long edges. The parameter `maxEdgeLength` defines the max
+edge length. A good value for `maxEdgeLength` is something like `traversableAreaBorderSize*8`. A good way to tweak this value is to first set it really high and see if your data creates long edges. If so, then try to find as big value as possible which happen to create those few extra vertices which makes the tessellation better.
+*  When the rasterized areas are converted back to vectorized representation the `edgeMaxDeviation` describes how loosely the simplification is done.  Good values are between 1.1-1.5 (1.3 usually yield good results). If the value is less, some stair-casing starts to appear at the edges and if it is more than that, the simplification starts to cut some corners.
+
+NOTE: A summary of the parameter effects is included in the comments of the link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/ai/NavMeshState.java[NavMeshState.java] file and discussed in the Procedural code examples that follow this section.
+
+If there are problems with your parameter settings, you will only know if the NavMesh doesn't appear under the Node you selected and there is no task running in the status area located at the bottom right of the SDK.
+
+If the NavMesh doesn't appear, then you will have to make adjustments to the `Configuration Parameters` until it completes successfully. Minor adjustments to cell size will usually work.
+
+CAUTION: Cell size has the greatest impact on your NavMesh. The smaller the cell size, the more accurate the NavMesh, the longer it takes to generate. Generating a 1024x1024 NavMesh can take anywhere from 30 seconds to ten minutes to complete, depending on terrain complexity. Even larger NavMeshes can take many hours.
+
+TIP: Selecting the NavMesh node in the SceneExplorer will show the NavMesh in the Terrain Editor or SceneComposer view-port. If it doesn't show, with the NavMesh node selected, change the `Cull Hint` to `Never` in the `NavMesh - Properties` panel.
+
+=== Procedural Method
+There are many ways to create a NavMesh. If you look at the constructor for the link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/Jme3AI.java[Jme3AI.java] file, you will see I use a <<jme3/advanced/application_states#baseappstate#,BaseAppState>> named link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/ai/NavMeshState.java[NavMeshState.java] which creates a `generator` object and builds the `NavMesh` new every time the program is ran.
+
+.Jme3AI constructor
+[source, java]
+----
+public Jme3AI() {
+    super(new StatsAppState(), new DebugKeysAppState(), new TerrainState(),
+            new NavMeshState(), new PCState(), new KeyboardRunState());
+}
+----
+
+It can take from seconds to hours to build a NavMesh, depending on how complicated it is. Therefore, you would normally build the NavMesh or meshes, add them to your `Assets` folder and load them at startup. The `NavMeshState` and `NavMeshGenerator` classes are both convenience classes and are not required to create a NavMesh. If you wish to keep your game minimalist, you can set the variables for the CritterAI NavmeshGenerator (note the lower case 'm' in mesh) in the method call directly or by variable, and pass the IndexBuffer and VertexBuffer of your mesh into the CritterAI NavmeshGenerator object.
+
+[source, java]
+----
+NavmeshGenerator nmgen = new NavmeshGenerator(cellSize, cellHeight, minTraversableHeight,
+                maxTraversableStep, maxTraversableSlope,
+                clipLedges, traversableAreaBorderSize,
+                smoothingThreshold, useConservativeExpansion,
+                minUnconnectedRegionSize, mergeRegionSize,
+                maxEdgeLength, edgeMaxDeviation, maxVertsPerPoly,
+                contourSampleDistance, contourMaxDeviation);
+...
+Get mesh buffers and set IntermediateData
+...
+
+//Pass buffers and IntermediateData to build process
+TriangleMesh triMesh = nmgen.build(positions, indices, intermediateData);
+
+...
+Process trimesh
+...
+----
+
+Let's examine what it takes to create the `NavMesh` using the `NavMeshState` and `NavMeshGenerator` helper classes.
+
+.NavMeshState NavMesh generation method
+[source, java]
+----
+/**
+ * creates the NavMesh
+ */
+private void createNavMesh() {
+    generator = new NavMeshGenerator();
+    //The width and depth resolution used when sampling the source geometry.
+    //outdoors = agentRadius/2, indoors = agentRadius/3, cellSize =
+    //agentRadius for very small cells.
+    //Constraints > 0 , default=1
+    generator.setCellSize(.25f);
+    //The height resolution used when sampling the source geometry.
+    //minTraversableHeight, maxTraversableStep, and contourMaxDeviation
+    //will need to be greater than the value of cellHeight in order to
+    //function correctly. maxTraversableStep is especially susceptible to
+    //impact from the value of cellHeight.
+    //cellSize/2
+    //Constraints > 0, default=1.5
+    generator.setCellHeight(.125f);
+    //Represents the minimum floor to ceiling height that will still allow
+    //the floor area to be considered traversable.
+    //minTraversableHeight should be at least two times the value of
+    //cellHeight in order to get good results. Max spatial height.
+    //Constraints > 0, default=7.5
+    generator.setMinTraversableHeight(2f);
+    //Represents the maximum ledge height that is considered to still be
+    //traversable.
+    //maxTraversableStep should be greater than two times cellHeight.
+    //Constraints >= 0, default=1
+    generator.setMaxTraversableStep(0.3f);
+    //The maximum slope that is considered traversable. (In degrees.)
+    //Constraints >= 0, default=48
+    generator.setMaxTraversableSlope(50.0f);
+    //Indicates whether ledges should be considered un-walkable.
+    //Constraints None, default=false
+    generator.setClipLedges(false);
+    //Represents the closest any part of a mesh can get to an obstruction in
+    //the source geometry.
+    //traversableAreaBorderSize value must be greater than the cellSize to
+    //have an effect. Radius of the spatial.
+    //Constraints >= 0, default=1.2
+    generator.setTraversableAreaBorderSize(0.6f);
+    //The amount of smoothing to be performed when generating the distance
+    //field used for deriving regions.
+    //Constraints >= 0, default=2
+    generator.setSmoothingThreshold(0);
+    //Applies extra algorithms to help prevent malformed regions from
+    //forming.
+    //Constraints None, default=true
+    generator.setUseConservativeExpansion(true);
+    //The minimum region size for unconnected (island) regions.
+    //Constraints > 0, default=3
+    generator.setMinUnconnectedRegionSize(8);
+    //Any regions smaller than this size will, if possible, be merged with
+    //larger regions.
+    //Constraints >= 0, default=10
+    generator.setMergeRegionSize(20);
+    //The maximum length of polygon edges that represent the border of
+    //meshes.
+    //setTraversableAreaBorderSize * 8
+    //Constraints >= 0, default=0
+    generator.setMaxEdgeLength(4.0f);
+    //The maximum distance the edges of meshes may deviate from the source
+    //geometry.
+    //1.1 to 1.5 for best results.
+    //Constraints >= 0 , default=2.4
+    generator.setEdgeMaxDeviation(1.3f);
+    //The maximum number of vertices per polygon for polygons generated
+    //during the voxel to polygon conversion process.
+    //Constraints >= 3, default=6
+    generator.setMaxVertsPerPoly(6);
+    //Sets the sampling distance to use when matching the detail mesh to the
+    //surface of the original geometry.
+    //Constraints >= 0, default=25
+    generator.setContourSampleDistance(5.0f);
+    //The maximum distance the surface of the detail mesh may deviate from
+    //the surface of the original geometry.
+    //Constraints >= 0, default=25
+    generator.setContourMaxDeviation(5.0f);
+    //Time allowed before generation process times out in miliseconds.
+    //default=10000
+    generator.setTimeout(40000);
+
+    //the data object to use for storing data related to building the
+    //navigation mesh.
+    IntermediateData data = new IntermediateData();
+    generator.setIntermediateData(data);
+
+    Mesh mesh = new Mesh();
+    GeometryBatchFactory.mergeGeometries(findGeometries(app.getRootNode(),
+            new LinkedList<>(), generator), mesh);
+
+    //uncomment to show mesh
+//        Geometry meshGeom = new Geometry("MeshGeometry");
+//        meshGeom.setMesh(mesh);
+//        showGeometry(meshGeom, ColorRGBA.Yellow);
+//        saveNavMesh(meshGeom);
+
+    Mesh optiMesh = generator.optimize(mesh);
+    navMesh.loadFromMesh(optiMesh);
+
+    Geometry geom = new Geometry(DataKey.NAVMESH);
+    geom.setMesh(optiMesh);
+    //display the mesh
+    showGeometry(geom, ColorRGBA.Green);
+    //save the navmesh to Scenes/NavMesh for loading
+    exportNavMesh(geom, DataKey.NAVMESH);
+    //save geom to rootNode if you wish
+    saveNavMesh(geom);
+}
+----
+
+First, we create the link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/ai/NavMeshGenerator.java[NavMeshGenerator] object and then use it to set the parameters for the NavMesh.
+
+[source, java]
+----
+generator = new NavMeshGenerator();
+...
+generator.setCellSize(.25f);
+...
+----
+
+In our next step we create an IntermediateData object.
+
+[source, java]
+----
+//the data object to use for storing data related to building the
+//navigation mesh.
+IntermediateData data = new IntermediateData();
+generator.setIntermediateData(data);
+----
+
+The IntermediateData object can be used to get information about the build process of the NavMesh such as build times. You query this object after building the NavMesh. If you don't wish to see the data, set it to null.
+
+At this point, you now have a `generator` object that you use to create the NavMesh with.
+
+Included in the link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/ai/NavMeshState.java[NavMeshState.java] file is the helper method `findGeometries`.
+
+[source, java]
+----
+//Gathers all geometries in supplied node into supplied List. Uses
+//NavMeshGenerator to merge found Terrain meshes into one geometry prior to
+//adding. Scales and sets translation of merged geometry.
+private List<Geometry> findGeometries(Node node, List<Geometry> geoms,
+          NavMeshGenerator generator)
+----
+
+
+It is used to collect all geometries, attached to a node, into a List. If a child of the node is a Terrain instance (which can consist of many meshes), it will use the `generator` object to merge them into one mesh, then scale and set translation of the merged mesh prior to being added to the list. You then use GeometryBatchFactory to merge all the geometries in the list into a single `mesh` object.
+
+[source, java]
+----
+Mesh mesh = new Mesh();
+GeometryBatchFactory.mergeGeometries(findGeometries(app.getRootNode(),
+        new LinkedList<>(), generator), mesh);
+----
+
+After these methods execute, you have a single `mesh` object that is now ready to be optimized.
+
+[source, java]
+----
+Mesh optiMesh = generator.optimize(mesh);
+----
+
+This is where the parameters you set with the `generator` object are applied to the supplied `mesh`. The optimize method will return a new Mesh object that reflects your generator settings. Now is when any problems with your parameters will show themselves as either warnings or exceptions. You should keep changing the various parameters, one at a time and in small increments/decrements, until your `mesh` generates with no errors. See each parameter's notes for suggestions on how to do so.
+
+After the mesh generates, you need to link all of its cells together so it can be used as your `NavMesh` object. You do this by calling `loadFromMesh()` or `loadFromData()`, depending on your implementation, on your `optiMesh` object.
+
+[source, java]
+----
+navMesh.loadFromMesh(optiMesh);
+----
+
+If you look at the second contructor for the `NavMesh` class you will see this is all it does. You would use this constructor if you were loading a `Mesh` from a geometry that had already been optimized and saved into your `Assets` folder for example.
+
+[source, java]
+----
+public NavMesh(Mesh mesh) {
+  loadFromMesh(mesh);
+}
+----
+
+The `NavMesh` object is now ready for use in your game, but you still need to create the geometry for it if you wish to save or view it. You do this the same as you would for any newly created mesh.
+
+[source, java]
+----
+Geometry geom = new Geometry(DataKey.NAVMESH);
+geom.setMesh(navMesh);
+----
+
+Now that you have your Mesh you should save it.
+
+[source, java]
+----
+//save the navmesh to Scenes/NavMesh for loading
+exportNavMesh(geom, DataKey.NAVMESH);
+//save geom to rootNode if you wish
+saveNavMesh(geom);
+----
+
+In this instance, the object is exported to the projects `Assets` folder so it can be loaded rather than generated every time the game starts. This is the preferred method. The `saveNavMesh()` method just attaches the geometry to the `rootNode`. How and where you choose to save depends on your implementation and personal preferences.
+
+
+== Pathfinding
+
+
+There are many ways to implement the `NavMeshPathfinder` class of the jme3AI library. You can create a control, instantiate the `NavMeshPathFinder` class, and query the newly created object in a thread. You could use a single AppState to calculate all your paths. You could, as in this tutorial, extend the NavMeshPathFinder class in a custom control.
+
+You also need a way to communicate `Vector3f` changes to the `NavMeshPathfinder`. This tutorial uses an ActionListener and Interface. You could just as easily create a public method in the control, and call it from the ActionListener, or store the `Vector3f` in `UserData` and look for changes from the control itself.
+
+These are implementation decisions that are left up to you.
+
+=== Loading the NavMesh
+
+In this tutorial example, the optimized mesh was exported as a geometry using the jMonkey binary format `.j3o`. Doing so means the loading of your `NavMeshes` is done the same way you load any model, by using the `AssetManager`. Once you load the `.j3o`, you grab its `Mesh` and create the `NavMesh` object to be passed to the link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/ai/NavigationControl.java[NavigationControl] constructor. This tutorial uses a <<jme3/advanced/application_states#baseappstate#,BaseAppState>> for model loading so access to the `Application` class is built in.
+
+[source, java]
+----
+//load NavMesh geometry saved to assets folder
+Geometry navGeom = (Geometry) getApplication().getAssetManager().
+        loadModel("Scenes/NavMesh/NavMesh.j3o");
+NavigationControl navControl = new NavigationControl(new NavMesh(
+        navGeom.getMesh()), getApplication(), true)
+charNode.addControl(navControl);
+//NavigationControl implements Pickable Interface
+picked = navControl;
+----
+
+[NOTE]
+
+====
+This tutorial uses a custom control, `NavigationControl`, that extends the `NavMeshPathfinder` class. As this is a tutorial, some extra variables are used for dispalying the navigation path and are not needed. The constructor for `NavMeshPathfinder` requires just the the passing of the `NavMesh` object, which makes for a cleaner control.
+
+[source, java]
+----
+public NavigationControl(NavMesh navMesh) {
+  ...
+}
+----
+
+====
+
+=== Communicating with NavigationControl
+
+This tutorial makes use of the <<jme3/beginner/hello_picking#,Hello Picking>> and <<jme3/advanced/mouse_picking#pick-a-target-using-the-mouse-pointer#,Mouse Picking>> tutorials so you should already be familiar with this method for picking and how to add the <<jme3/beginner/hello_input_system#,input mappings>> to your game. How you implement your ActionListener is up to you.
+
+.PCState ActionListener
+[source, java]
+----
+    private class ClickedListener implements ActionListener {
+
+        @Override
+        public void onAction(String name, boolean isPressed, float tpf) {
+
+            if (name.equals(ListenerKey.PICK) && !isPressed) {
+                CollisionResults results = new CollisionResults();
+                Vector2f click2d = getInputManager().getCursorPosition().clone();
+                Vector3f click3d = app.getCamera().getWorldCoordinates(click2d,
+                        0f).clone();
+                Vector3f dir = app.getCamera().getWorldCoordinates(
+                        click2d, 1f).subtractLocal(click3d).normalizeLocal();
+                Ray ray = new Ray(click3d, dir);
+                app.getRootNode().collideWith(ray, results);
+
+                for (int i = 0; i < results.size(); i++) {
+                    // For each hit, we know distance, impact point, name of geometry.
+                    float dist = results.getCollision(i).getDistance();
+                    Vector3f pt = results.getCollision(i).getContactPoint();
+                    String hit = results.getCollision(i).getGeometry().getName();
+                    System.out.println("* Collision #" + i);
+                    System.out.println(
+                            "  You shot " + hit
+                            + " at " + pt
+                            + ", " + dist + " wu away.");
+                }
+
+                if (results.size() > 0) {
+                    // The closest collision point is what was truly hit:
+                    CollisionResult closest = results.getClosestCollision();
+                    // Let's interact - we mark the hit with a red dot.
+                    mark.setLocalTranslation(closest.getContactPoint());
+                    app.getRootNode().attachChild(mark);
+                    picked.setTarget(closest.getContactPoint());
+                    System.out.println("  Closest Contact " + closest.
+                            getContactPoint());
+                } else {
+                    // No hits? Then remove the red mark.
+                    app.getRootNode().detachChild(mark);
+                }
+            }
+        }
+    }
+----
+
+The main line of interest here is,
+
+[source, java]
+----
+picked.setTarget(closest.getContactPoint());
+----
+
+where `picked` is the reference object used to communicate our `Vector3f` changes to the `NavigationControl`.
+
+[source, java]
+----
+//NavigationControl implements Pickable Interface
+picked = navControl;
+----
+
+At this point you have loaded your `NavMesh`, added the `NavigationControl` to your spatial, and instituted a method for communicating with the `NavMeshPathFinder`. Next we will delve into the details of the `NavigationControl`.
+
+
+=== NavigationControl
+
+
+The link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/ai/NavigationControl.java[NavigationControl] is a <<jme3/advanced/custom_controls#,custom control>> that extends the link:https://github.com/MeFisto94/jme3-artificial-intelligence/blob/master/AI/src/com/jme3/ai/navmesh/NavMeshPathfinder.java[NavMeshPathFinder] class of the Jme3AI library and implements the `Pickable` interface.
+
+[source, java]
+----
+public class NavigationControl extends NavMeshPathfinder implements Control,
+        JmeCloneable, Pickable {
+}
+----
+
+The link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/interfaces/Pickable.java[Pickable] interface is straightforward and its sole purpose in this implementation is to communicate changes made to the pick target.
+
+.Pickable Interface implementation
+[source, java]
+----
+/**
+ * @param target the target to set
+ */
+@Override
+public void setTarget(Vector3f target) {
+    this.target = target;
+}
+----
+
+The heartbeat of the control lies in the pathfinding thread which makes calls to the `computePath()` method. Potentially long running tasks like this should always be ran from a thread. Below, is the constructor you would normally use to instantiate your control.
+
+[source, java]
+----
+public NavigationControl(NavMesh navMesh) {
+    super(navMesh); //sets the NavMesh for this control
+    executor = Executors.newScheduledThreadPool(1);
+    startPathFinder();
+}
+----
+
+First, you call `super(navMesh)` to set the `NavMesh` for the control, then setup your `ExecutorService` and start the pathfinding thread.
+
+This is a custom thread implementation so it's up to you to handle shutting it down. This is done in the controls `setSpatial()` method.
+
+[source, java]
+----
+if (spatial == null) {
+    shutdownAndAwaitTermination(executor);
+    ...
+} else {
+    ...
+}
+----
+
+.Executor shutdown process
+[source, java]
+----
+//standard shutdown process for executor
+private void shutdownAndAwaitTermination(ExecutorService pool) {
+    pool.shutdown(); // Disable new tasks from being submitted
+    try {
+        // Wait a while for existing tasks to terminate
+        if (!pool.awaitTermination(6, TimeUnit.SECONDS)) {
+            pool.shutdownNow(); // Cancel currently executing tasks
+            // Wait a while for tasks to respond to being cancelled
+            if (!pool.awaitTermination(6, TimeUnit.SECONDS)) {
+                LOG.log(Level.SEVERE, "Pool did not terminate {0}", pool);
+            }
+        }
+    } catch (InterruptedException ie) {
+        // (Re-)Cancel if current thread also interrupted
+        pool.shutdownNow();
+        // Preserve interrupt status
+        Thread.currentThread().interrupt();
+    }
+}
+----
+
+The easiest way to move a physics character is by using the <<jme3/advanced/walking_character#bettercharactercontrol#,BetterCharacterControl>> class. In this implementation, this is done in the link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/controls/PCControl.java[PCControl] class by extending `BetterCharacterControl`. Since `BetterCharacterControl` is required to be present on the spatial for pathfinding, in the `setSpatial()` method, we throw an exception to let us know if it's missing.
+
+[source, java]
+----
+if (spatial == null) {
+    ...
+} else {
+    pcControl = spatial.getControl(PCControl.class);
+    if (pcControl == null) {
+        throw new IllegalStateException(
+                "Cannot add NavigationControl to spatial without PCControl!");
+    }
+}
+----
+
+=== Pathfinding Thread
+
+.NavigationControl pathfinding thread
+[source, java]
+----
+//Computes a path using the A* algorithm. Every 1/2 second checks target
+//for processing. Path will remain untill a new path is generated.
+private void startPathFinder() {
+    executor.scheduleWithFixedDelay(() -> {
+        if (target != null) {
+            clearPath();
+            setWayPosition(null);
+            pathfinding = true;
+            //setPosition must be set before computePath is called.
+            setPosition(spatial.getWorldTranslation());
+            //warpInside(target) moves endpoint within the navMesh always.
+            warpInside(target);
+            System.out.println("Target " + target);
+            boolean success;
+            //comput the path
+            success = computePath(target);
+            System.out.println("SUCCESS = " + success);
+            if (success) {
+                //clear target if successful
+                target = null;
+                ...
+            }
+            pathfinding = false;
+        }
+    }, 0, 500, TimeUnit.MILLISECONDS);
+}
+----
+
+How you setup your pathfinding thread makes a significant difference.
+
+[source, java]
+----
+executor.scheduleWithFixedDelay(() -> {
+...
+}, 0, 500, TimeUnit.MILLISECONDS);
+----
+
+This `ExecutorService` is set to start immediately (0) with a fixed delay of (500) milliseconds. This means the task has a fixed delay of 1/2 second between the end of an execution and the start of the next execution, i.e. it doesn't take into account the actual duration of the task. If you were to use `scheduleAtFixedRate()`, you risk that the task doesn't complete in the time allocated.
+
+When you use the `BetterCharacterControl`, all that's required to move the spatial is that you `setWalkDirection()` and the spatial will continuously move in that direction. The following code breakdown explains how the `NavigationControl` takes advantage of this.
+
+It starts by having the pathfinding thread check a `target` variable for changes.
+
+[source, java]
+----
+if (target != null) {
+    ...
+}
+----
+
+If it finds a target, it will compute a new path to that `target`, and if successful, update the `NavMeshPathfinder` path variable. The `update()` loop of the control continuously checks this path variable, and if its non-null, takes an appropriate action.
+
+Before you compute the path you first clear the existing path, and set wayPosition to null.
+
+[source, java]
+----
+if (target != null) {
+    clearPath();
+    setWayPosition(null);
+    pathfinding = true;
+    ...
+}
+----
+
+Doing this allows the player to select a new `target` at any time and immediately start moving along the new path. Otherwise, the character must finish the path they are on, then backtrack to the position the character was at when the `target` change was made, before then continuing on the new path.
+
+Next, you must call `setPosition()` *before* calling the `computePath()` method.
+
+[source, java]
+----
+if (target != null) {
+  ...
+  setPosition(spatial.getWorldTranslation());
+  ...
+  //compute the path
+  success = computePath(target);
+  ...
+}
+----
+
+There are some things you need to know about how a path is computed.
+
+*  The first waypoint on any path is the one you set with `setPosition()`.
+*  The last waypoint on any path is always the `target` Vector3f.
+*  computePath() adds one waypoint to the cell *nearest* to the target only if you are not in the goalCell (the cell target is in), and if there is a cell between first and last waypoint, and if there is no direct line of sight.
+*  If inside the goalCell when a new target is selected, computePath() will do a direct line of sight placement of target. This means there will only be two waypoints set, `setPosition()` and `target`.
+*  If the `target` is outside the `NavMesh`, your endpoint will be as well.
+
+To guarantee that `target` is always inside the `NavMesh`, call
+
+[source, java]
+----
+if (target != null) {
+    ...
+    //warpInside(target) moves endpoint within the navMesh always.
+    warpInside(target);
+    ...
+    //compute the path
+    success = computePath(target);
+    ...
+}
+----
+
+before calling `computePath()` and the endpoint of the path will be moved to the closest cell to the `target` that's inside the `NavMesh`.
+
+== Character Movement
+
+.NavigationControl update() loop
+[source, java]
+----
+@Override
+public void update(float tpf) {
+    if (getWayPosition() != null) {
+        Vector3f spatialPosition = spatial.getWorldTranslation();
+        Vector2f aiPosition = new Vector2f(spatialPosition.x,
+                spatialPosition.z);
+        Vector2f waypoint2D = new Vector2f(getWayPosition().x,
+                getWayPosition().z);
+        float distance = aiPosition.distance(waypoint2D);
+        //move char between waypoints untill waypoint reached then set null
+        if (distance > .25f) {
+            Vector2f direction = waypoint2D.subtract(aiPosition);
+            direction.mult(tpf);
+            pcControl.setViewDirection(new Vector3f(direction.x, 0,
+                    direction.y).normalize());
+            pcControl.onAction(ListenerKey.MOVE_FORWARD, true, 1);
+        } else {
+            setWayPosition(null);
+        }
+    } else if (!isPathfinding() && getNextWaypoint() != null
+            && !isAtGoalWaypoint()) {
+        if (showPath) {
+            showPath();
+            showPath = false;
+        }
+        //advance to next waypoint
+        goToNextWaypoint();
+        setWayPosition(new Vector3f(getWaypointPosition()));
+
+        //set spatial physical position
+        if (getPositionType() == EnumPosition.POS_STANDING.position()) {
+            setPositionType(EnumPosition.POS_RUNNING.position());
+            stopFeetPlaying();
+            stopTorsoPlaying();
+        }
+    } else {
+        //waypoint null so stop moving and set spatials physical position
+        if (getPositionType() == EnumPosition.POS_RUNNING.position()) {
+            setPositionType(EnumPosition.POS_STANDING.position());
+            stopFeetPlaying();
+            stopTorsoPlaying();
+        }
+        pcControl.onAction(ListenerKey.MOVE_FORWARD, false, 1);
+    }
+}
+----
+
+If the `computePath()` successfully computes a new path, the path variable of the `NavMeshPathfinder` will no longer be null. The update loop of the `NavigationControl` checks this path variable, every iteration that wayPosition is null, by calling the `getNextWaypoint()` method. If the path has another waypoint, it will advance to the next position in the path and set the `wayPosition` variable of the `NavigationControl` to that position.
+
+[source, java]
+----
+} else if (!isPathfinding() && getNextWaypoint() != null
+        && !isAtGoalWaypoint()) {
+    ...
+    //advance to next waypoint
+    goToNextWaypoint();
+    setWayPosition(new Vector3f(getWaypointPosition()));
+    ...
+}
+----
+
+IMPORTANT: Remember, the first waypoint in the path is always the spatials current position. This is why you always advance the position first.
+
+On the next iteration of the controls `update()` method, it sees that `wayPosition` is no longer null and calculates the distance from the spatials current position to the `wayPosition`.
+
+[source, java]
+----
+if (getWayPosition() != null) {
+    Vector3f spatialPosition = spatial.getWorldTranslation();
+    Vector2f aiPosition = new Vector2f(spatialPosition.x,
+            spatialPosition.z);
+    Vector2f waypoint2D = new Vector2f(getWayPosition().x,
+            getWayPosition().z);
+    float distance = aiPosition.distance(waypoint2D);
+    ...
+}
+----
+
+If it's greater than the distance specified, it will `setViewDirection()` of the `PCControl` (which extends BetterCharacterControl) and then notify the `PCControl` that the spatial can move by calling the controls `onAction()` method directly.
+
+[source, java]
+----
+if (getWayPosition() != null) {
+    ...
+    //move char between waypoints untill waypoint reached then set null
+    if (distance > .25f) {
+        Vector2f direction = waypoint2D.subtract(aiPosition);
+        direction.mult(tpf);
+        pcControl.setViewDirection(new Vector3f(direction.x, 0,
+                direction.y).normalize());
+        pcControl.onAction(ListenerKey.MOVE_FORWARD, true, 1);
+    } else {
+        ...
+    }
+}
+----
+
+It's up to the `NavigationControl` to determine when the character should stop moving. Each time the spatial reaches a point that is less than the specified distance, it sets the wayPosition to null.
+
+[source, java]
+----
+if (distance > .25f) {
+    ...
+} else {
+    setWayPosition(null);
+}
+----
+
+If the path position has not yet reached the end, it will once again be advance to the next waypoint in the path and update the wayPosition.
+
+[source, java]
+----
+} else if (!isPathfinding() && getNextWaypoint() != null
+        && !isAtGoalWaypoint()) {
+    ...
+    //advance to next waypoint
+    goToNextWaypoint();
+    setWayPosition(new Vector3f(getWaypointPosition()));
+    ...
+}
+----
+
+When the last waypoint is reached, the `NavigationControl` notifies the `PCControl` that the spatial can no longer move.
+
+[source, java]
+----
+} else {
+    ...
+    pcControl.onAction(ListenerKey.MOVE_FORWARD, false, 1);
+}
+----
+
+The link:https://github.com/jMonkeyEngine/doc-examples/blob/master/src/com/jme3/examples/jme3ai/controls/PCControl.java[PCControl] class handles the actual movement of the spatial in its `update()` loop. It does this by checking the `forward` variable every iteration. This variable is set when you call the `onAction()` method from the `NavigationControl` update loop.
+
+.PCControl ActionListener
+[source, java]
+----
+@Override
+public void onAction(String name, boolean isPressed, float tpf) {
+    if (name.equals(ListenerKey.MOVE_FORWARD)) {
+        forward = isPressed;
+    }
+}
+----
+
+
+.PCControl update() loop
+[source, java]
+----
+@Override
+public void update(float tpf) {
+    super.update(tpf);
+    this.moveSpeed = 0;
+    walkDirection.set(0, 0, 0);
+    if (forward) {
+        Vector3f modelForwardDir = spatial.getWorldRotation().mult(Vector3f.UNIT_Z);
+        position = getPositionType();
+        for (EnumPosition pos : EnumPosition.values()) {
+            if (pos.position() == position) {
+                switch (pos) {
+                    case POS_RUNNING:
+                        moveSpeed = EnumPosition.POS_RUNNING.speed();
+                        break;
+                    default:
+                        moveSpeed = 0f;
+                        break;
+                }
+            }
+        }
+        walkDirection.addLocal(modelForwardDir.mult(moveSpeed));
+    }
+    setWalkDirection(walkDirection);
+}
+----
+
+The `PCControl` will then set the walk direction, based off spatials world rotation, and set the speed.
+
+
+== Conclusion
+
+
+The intent of this tutorial was to give you a general breakdown of how the Jme3AI navigation system works as well as demonstrate how flexible its implementation is. All the code in this tutorial is free for your use and can be found in the link:https://github.com/jMonkeyEngine/doc-examples[jme3 documentation repository]. The implementations design is such that you can easily change each of the parameters and then visually see how they affect the NavMesh. If you have questions or suggestions on improving this tutorial you can do so in the link:https://hub.jmonkeyengine.org/[jMonkeyEngine forum].
+
+== Other 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://www.policyalmanac.org/games/aStarTutorial.htm[A* path-finding 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 
+*  link:http://www.red3d.com/cwr/steer/gdc99/[Steering Behaviors For Autonomous Characters] by Craig W. Reynolds
+*  link:http://www.critterai.org/projects/nmgen_study/[Study: Navigation Mesh Generation Java] by Stephen Pratt

+ 150 - 88
src/docs/asciidoc/jme3/advanced/loading_screen.adoc

@@ -10,15 +10,20 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == Nifty Loading Screen (Progress Bar)
 
-There is a good tutorial about creating a nifty progress bar here:
-link:http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Create_your_own_Control_%28A_Nifty_Progressbar%29[http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Create_your_own_Control_%28A_Nifty_Progressbar%29]
+//There is a good tutorial about creating a nifty progress bar here:
+//link:http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Create_your_own_Control_%28//A_Nifty_Progressbar%29[http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Create_yo//ur_own_Control_%28A_Nifty_Progressbar%29]
 
 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)
+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,width="",height=""]
+
 image:jme3/advanced/border1.png[border1.png,width="",height=""]
 
+You need to add the jme3-niftygui and <<sdk/sample_code#jme3testdata-assets#,jme3-test-data>> libraries.
+
+You will need to set your projects source to JDK 8.
+
 This is the progress bar at 90%:
 
 image:jme3/advanced/loadingscreen.png[loadingscreen.png,width="",height=""]
@@ -106,7 +111,7 @@ This screen simply displays a button in the middle of the screen, which could be
 
 ----
 
-This screen displays our custom progress bar control with a text control
+This screen displays our custom progress bar control with a text control.
 
 [source,xml]
 ----
@@ -152,38 +157,44 @@ The 2 main good solutions are:
 
 === Updating progress bar over a number of frames
 
-The idea is to break down the loading of the game into discrete parts
+The idea is to break down the loading of the game into discrete parts.
 
 [source,java]
 ----
 
 package jme3test;
 
-import com.jme3.niftygui.NiftyJmeDisplay;
-import de.lessvoid.nifty.Nifty;
-import de.lessvoid.nifty.elements.Element;
-import de.lessvoid.nifty.input.NiftyInputEvent;
-import de.lessvoid.nifty.screen.Screen;
-import de.lessvoid.nifty.screen.ScreenController;
-import de.lessvoid.nifty.tools.SizeValue;
 import com.jme3.app.SimpleApplication;
 import com.jme3.material.Material;
+import com.jme3.niftygui.NiftyJmeDisplay;
+import static com.jme3.niftygui.NiftyJmeDisplay.newNiftyJmeDisplay;
 import com.jme3.renderer.Camera;
 import com.jme3.terrain.geomipmap.TerrainLodControl;
-import com.jme3.terrain.heightmap.AbstractHeightMap;
 import com.jme3.terrain.geomipmap.TerrainQuad;
+import com.jme3.terrain.heightmap.AbstractHeightMap;
 import com.jme3.terrain.heightmap.ImageBasedHeightMap;
 import com.jme3.texture.Texture;
 import com.jme3.texture.Texture.WrapMode;
+import de.lessvoid.nifty.Nifty;
 import de.lessvoid.nifty.controls.Controller;
+import de.lessvoid.nifty.controls.Parameters;
+import de.lessvoid.nifty.elements.Element;
 import de.lessvoid.nifty.elements.render.TextRenderer;
-import de.lessvoid.xml.xpp3.Attributes;
+import de.lessvoid.nifty.input.NiftyInputEvent;
+import de.lessvoid.nifty.screen.Screen;
+import de.lessvoid.nifty.screen.ScreenController;
+import de.lessvoid.nifty.tools.SizeValue;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Properties;
-import jme3tools.converters.ImageToAwt;
 
-public class TestLoadingScreen extends SimpleApplication implements ScreenController, Controller {
+/**
+ * This is the TestLoadingScreen Class of your Game. You should only do
+ * initialization here. Move your Logic into AppStates or Controls
+ *
+ * @author normenhansen
+ */
+public class TestLoadingScreen extends SimpleApplication implements
+        ScreenController, Controller {
 
     private NiftyJmeDisplay niftyDisplay;
     private Nifty nifty;
@@ -202,7 +213,7 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
     @Override
     public void simpleInitApp() {
         flyCam.setEnabled(false);
-        niftyDisplay = new NiftyJmeDisplay(assetManager,
+        niftyDisplay = newNiftyJmeDisplay(assetManager,
                 inputManager,
                 audioRenderer,
                 guiViewPort);
@@ -218,22 +229,27 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
 
         if (load) { //loading is done over many frames
             if (frameCount == 1) {
-                Element element = nifty.getScreen("loadlevel").findElementByName("loadingtext");
+                Element element = nifty.getScreen("loadlevel").findElementById(
+                        "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"));
+                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");
 
             } else if (frameCount == 2) {
-                Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
+                Texture grass = assetManager.loadTexture(
+                        "Textures/Terrain/splat/grass.jpg");
                 grass.setWrap(WrapMode.Repeat);
                 mat_terrain.setTexture("Tex1", grass);
                 mat_terrain.setFloat("Tex1Scale", 64f);
                 setProgress(0.4f, "Loading dirt");
 
             } else if (frameCount == 3) {
-                Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
+                Texture dirt = assetManager.loadTexture(
+                        "Textures/Terrain/splat/dirt.jpg");
 
                 dirt.setWrap(WrapMode.Repeat);
                 mat_terrain.setTexture("Tex2", dirt);
@@ -241,7 +257,8 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
                 setProgress(0.5f, "Loading rocks");
 
             } else if (frameCount == 4) {
-                Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
+                Texture rock = assetManager.loadTexture(
+                        "Textures/Terrain/splat/road.jpg");
 
                 rock.setWrap(WrapMode.Repeat);
 
@@ -251,11 +268,13 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
 
             } else if (frameCount == 5) {
                 AbstractHeightMap heightmap = null;
-                Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
+                Texture heightMapImage = assetManager.loadTexture(
+                        "Textures/Terrain/splat/mountains512.png");
                 heightmap = new ImageBasedHeightMap(heightMapImage.getImage());
 
                 heightmap.load();
-                terrain = new TerrainQuad("my terrain", 65, 513, heightmap.getHeightMap());
+                terrain = new TerrainQuad("my terrain", 65, 513, heightmap.
+                        getHeightMap());
                 setProgress(0.8f, "Positioning terrain");
 
             } else if (frameCount == 6) {
@@ -267,9 +286,10 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
                 setProgress(0.9f, "Loading cameras");
 
             } else if (frameCount == 7) {
-                List<Camera> cameras = new ArrayList<Camera>();
+                List<Camera> cameras = new ArrayList<>();
                 cameras.add(getCamera());
-                TerrainLodControl control = new TerrainLodControl(terrain, cameras);
+                TerrainLodControl control = new TerrainLodControl(terrain,
+                        cameras);
                 terrain.addControl(control);
                 setProgress(1f, "Loading complete");
 
@@ -287,7 +307,8 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
 
     public void setProgress(final float progress, String loadingText) {
         final int MIN_WIDTH = 32;
-        int pixelWidth = (int) (MIN_WIDTH + (progressBarElement.getParent().getWidth() - MIN_WIDTH) * progress);
+        int pixelWidth = (int) (MIN_WIDTH + (progressBarElement.getParent().
+                getWidth() - MIN_WIDTH) * progress);
         progressBarElement.setConstraintWidth(new SizeValue(pixelWidth + "px"));
         progressBarElement.getParent().layoutElements();
 
@@ -309,7 +330,8 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
 
     @Override
     public void bind(Nifty nifty, Screen screen) {
-        progressBarElement = nifty.getScreen("loadlevel").findElementByName("progressbar");
+        progressBarElement = nifty.getScreen("loadlevel").findElementById(
+                "progressbar");
     }
 
     // methods for Controller
@@ -319,64 +341,70 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
     }
 
     @Override
-    public void bind(Nifty nifty, Screen screen, Element elmnt, Properties prprts, Attributes atrbts) {
-        progressBarElement = elmnt.findElementByName("progressbar");
+    public void onFocus(boolean getFocus) {
     }
 
     @Override
-    public void init(Properties prprts, Attributes atrbts) {
+    public void bind(Nifty nifty, Screen screen, Element elmnt,
+            Parameters prmtrs) {
+        progressBarElement = elmnt.findElementById("progressbar");
     }
 
-    public void onFocus(boolean getFocus) {
+    @Override
+    public void init(Parameters prmtrs) {
     }
+
 }
 
 ----
 
-Note:
-
-*  Try and add all controls near the end, as their update loops may begin executing
+NOTE: Try and add all controls near the end, as their update loops may begin executing.
 
 
 === Using multithreading
 
 For more info on multithreading: <<jme3/advanced/multithreading#,The jME3 Threading Model>>
 
-Make sure to change the XML file to point the controller to TestLoadingScreen*1*
+Make sure to change the XML file to point the controller to TestLoadingScreen*1*.
 
 [source,java]
 ----
 
 package jme3test;
 
-import com.jme3.niftygui.NiftyJmeDisplay;
-import de.lessvoid.nifty.Nifty;
-import de.lessvoid.nifty.elements.Element;
-import de.lessvoid.nifty.input.NiftyInputEvent;
-import de.lessvoid.nifty.screen.Screen;
-import de.lessvoid.nifty.screen.ScreenController;
-import de.lessvoid.nifty.tools.SizeValue;
 import com.jme3.app.SimpleApplication;
 import com.jme3.material.Material;
+import com.jme3.niftygui.NiftyJmeDisplay;
+import static com.jme3.niftygui.NiftyJmeDisplay.newNiftyJmeDisplay;
 import com.jme3.renderer.Camera;
 import com.jme3.terrain.geomipmap.TerrainLodControl;
-import com.jme3.terrain.heightmap.AbstractHeightMap;
 import com.jme3.terrain.geomipmap.TerrainQuad;
+import com.jme3.terrain.heightmap.AbstractHeightMap;
 import com.jme3.terrain.heightmap.ImageBasedHeightMap;
 import com.jme3.texture.Texture;
 import com.jme3.texture.Texture.WrapMode;
+import de.lessvoid.nifty.Nifty;
 import de.lessvoid.nifty.controls.Controller;
+import de.lessvoid.nifty.controls.Parameters;
+import de.lessvoid.nifty.elements.Element;
 import de.lessvoid.nifty.elements.render.TextRenderer;
-import de.lessvoid.xml.xpp3.Attributes;
+import de.lessvoid.nifty.input.NiftyInputEvent;
+import de.lessvoid.nifty.screen.Screen;
+import de.lessvoid.nifty.screen.ScreenController;
+import de.lessvoid.nifty.tools.SizeValue;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Properties;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import jme3tools.converters.ImageToAwt;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
-public class TestLoadingScreen1 extends SimpleApplication implements ScreenController, Controller {
+public class TestLoadingScreen1 extends SimpleApplication implements
+        ScreenController, Controller {
 
     private NiftyJmeDisplay niftyDisplay;
     private Nifty nifty;
@@ -384,9 +412,11 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
     private TerrainQuad terrain;
     private Material mat_terrain;
     private boolean load = false;
-    private ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(2);
+    private ScheduledExecutorService exec = Executors.newScheduledThreadPool(2);
     private Future loadFuture = null;
     private TextRenderer textRenderer;
+    private static final Logger LOG = Logger.getLogger(TestLoadingScreen1.class.
+            getName());
 
     public static void main(String[] args) {
         TestLoadingScreen1 app = new TestLoadingScreen1();
@@ -396,7 +426,7 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
     @Override
     public void simpleInitApp() {
         flyCam.setEnabled(false);
-        niftyDisplay = new NiftyJmeDisplay(assetManager,
+        niftyDisplay = newNiftyJmeDisplay(assetManager,
                 inputManager,
                 audioRenderer,
                 guiViewPort);
@@ -411,7 +441,7 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
     public void simpleUpdate(float tpf) {
         if (load) {
             if (loadFuture == null) {
-                //if we have not started loading yet, submit the Callable to the executor
+                //if we have not started loading, submit Callable to executor
                 loadFuture = exec.submit(loadingCallable);
             }
             //check if the execution on the other thread is done
@@ -430,35 +460,44 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
             }
         }
     }
-    //this is the callable that contains the code that is run on the other thread.
-    //since the assetmananger is threadsafe, it can be used to load data from any thread
-    //we do *not* attach the objects to the rootNode here!
+    //This is the callable that contains the code that is run on the other
+    //thread.
+    //Since the assetmananger is threadsafe, it can be used to load data from
+    //any thread.
+    //We do *not* attach the objects to the rootNode here!
     Callable<Void> loadingCallable = new Callable<Void>() {
 
+        @Override
         public Void call() {
 
-            Element element = nifty.getScreen("loadlevel").findElementByName("loadingtext");
+            Element element = nifty.getScreen("loadlevel").findElementById(
+                    "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"));
+            mat_terrain = new Material(assetManager,
+                    "Common/MatDefs/Terrain/Terrain.j3md");
+            mat_terrain.setTexture("Alpha", assetManager.loadTexture(
+                    "Textures/Terrain/splat/alphamap.png"));
             //setProgress is thread safe (see below)
             setProgress(0.2f, "Loading grass");
 
-            Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
+            Texture grass = assetManager.loadTexture(
+                    "Textures/Terrain/splat/grass.jpg");
             grass.setWrap(WrapMode.Repeat);
             mat_terrain.setTexture("Tex1", grass);
             mat_terrain.setFloat("Tex1Scale", 64f);
             setProgress(0.4f, "Loading dirt");
 
-            Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");
+            Texture dirt = assetManager.loadTexture(
+                    "Textures/Terrain/splat/dirt.jpg");
 
             dirt.setWrap(WrapMode.Repeat);
             mat_terrain.setTexture("Tex2", dirt);
             mat_terrain.setFloat("Tex2Scale", 32f);
             setProgress(0.5f, "Loading rocks");
 
-            Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");
+            Texture rock = assetManager.loadTexture(
+                    "Textures/Terrain/splat/road.jpg");
 
             rock.setWrap(WrapMode.Repeat);
 
@@ -467,11 +506,13 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
             setProgress(0.6f, "Creating terrain");
 
             AbstractHeightMap heightmap = null;
-            Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");
+            Texture heightMapImage = assetManager.loadTexture(
+                    "Textures/Terrain/splat/mountains512.png");
             heightmap = new ImageBasedHeightMap(heightMapImage.getImage());
 
             heightmap.load();
-            terrain = new TerrainQuad("my terrain", 65, 513, heightmap.getHeightMap());
+            terrain = new TerrainQuad("my terrain", 65, 513, heightmap.
+                    getHeightMap());
             setProgress(0.8f, "Positioning terrain");
 
             terrain.setMaterial(mat_terrain);
@@ -480,7 +521,7 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
             terrain.setLocalScale(2f, 1f, 2f);
             setProgress(0.9f, "Loading cameras");
 
-            List<Camera> cameras = new ArrayList<Camera>();
+            List<Camera> cameras = new ArrayList<>();
             cameras.add(getCamera());
             TerrainLodControl control = new TerrainLodControl(terrain, cameras);
             terrain.addControl(control);
@@ -491,18 +532,18 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
     };
 
     public void setProgress(final float progress, final String loadingText) {
-        //since this method is called from another thread, we enqueue the changes to the progressbar to the update loop thread
-        enqueue(new Callable() {
-
-            public Object call() throws Exception {
-                final int MIN_WIDTH = 32;
-                int pixelWidth = (int) (MIN_WIDTH + (progressBarElement.getParent().getWidth() - MIN_WIDTH) * progress);
-                progressBarElement.setConstraintWidth(new SizeValue(pixelWidth + "px"));
-                progressBarElement.getParent().layoutElements();
-
-                textRenderer.setText(loadingText);
-                return null;
-            }
+        //Since this method is called from another thread, we enqueue the
+        //changes to the progressbar to the update loop thread.
+        enqueue(() -> {
+            final int MIN_WIDTH = 32;
+            int pixelWidth = (int) (MIN_WIDTH + (progressBarElement.getParent().
+                    getWidth() - MIN_WIDTH) * progress);
+            progressBarElement.setConstraintWidth(new SizeValue(pixelWidth
+                    + "px"));
+            progressBarElement.getParent().layoutElements();
+
+            textRenderer.setText(loadingText);
+            return null;
         });
 
     }
@@ -522,7 +563,8 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
 
     @Override
     public void bind(Nifty nifty, Screen screen) {
-        progressBarElement = nifty.getScreen("loadlevel").findElementByName("progressbar");
+        progressBarElement = nifty.getScreen("loadlevel").findElementById(
+                "progressbar");
     }
 
     // methods for Controller
@@ -532,25 +574,45 @@ public class TestLoadingScreen1 extends SimpleApplication implements ScreenContr
     }
 
     @Override
-    public void bind(Nifty nifty, Screen screen, Element elmnt, Properties prprts, Attributes atrbts) {
-        progressBarElement = elmnt.findElementByName("progressbar");
+    public void onFocus(boolean getFocus) {
     }
 
     @Override
-    public void init(Properties prprts, Attributes atrbts) {
+    public void destroy() {
+        super.destroy();
+        shutdownAndAwaitTermination(exec);
     }
 
-    public void onFocus(boolean getFocus) {
+    //standard shutdown process for executor
+    private void shutdownAndAwaitTermination(ExecutorService pool) {
+        pool.shutdown(); // Disable new tasks from being submitted
+        try {
+            // Wait a while for existing tasks to terminate
+            if (!pool.awaitTermination(6, TimeUnit.SECONDS)) {
+                pool.shutdownNow(); // Cancel currently executing tasks
+                // Wait a while for tasks to respond to being cancelled
+                if (!pool.awaitTermination(6, TimeUnit.SECONDS)) {
+                    LOG.log(Level.SEVERE, "Pool did not terminate {0}", pool);
+                }
+            }
+        } catch (InterruptedException ie) {
+            // (Re-)Cancel if current thread also interrupted
+            pool.shutdownNow();
+            // Preserve interrupt status
+            Thread.currentThread().interrupt();
+        }
     }
 
+    @Override
+    public void bind(Nifty nifty, Screen screen, Element elmnt,
+            Parameters prmtrs) {
+        progressBarElement = elmnt.findElementById("progressbar");
+    }
 
     @Override
-    public void stop() {
-        super.stop();
-        //the pool executor needs to be shut down so the application properly exits.
-        exec.shutdown();
+    public void init(Parameters prmtrs) {
     }
-}
 
+}
 
 ----

+ 50 - 58
src/docs/asciidoc/jme3/advanced/mixamo.adoc

@@ -1,6 +1,6 @@
 = Animating Blender Models With Mixamo
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2017/05/25 13:04
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -8,22 +8,18 @@
 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. 
+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 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.
+*  A link:https://www.mixamo.com/#/[Mixamo] account.
 
 
 == Prepare to Export
@@ -47,7 +43,7 @@ To properly animate your models there are a few rules you must follow.
 ====
 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. 
+See <<jme3/external/blender#,Creating assets in Blender3D>> for help on creating jME3 compatible models.
 ====
 
 == Blender FBX Export
@@ -57,19 +53,19 @@ See <<jme3/external/blender#,Creating assets in Blender3D>> for help on creating
 .  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:: 
+.  In the `Export FBX` panel, located in the bottom left of the export dialog:
+Main Tab::
 - [x] Selected Objects
-- Scale = 1 
+- 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 
+-  Forward = -Z Forward
 -  Up = Y Up
--  Which kind of object to export = Mesh 
+-  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.
@@ -83,10 +79,10 @@ You can save these FBX export settings by clicking the btn:[+] button next to bt
 == Mixamo FBX Import
 
 
-.  Create an link:https://www.mixamo.com/[Mixamo] account and login.
-.  Navigate to your `My Assets` folder.
-.  Select `Upload`.
+.  Create an link:https://www.mixamo.com/#/[Mixamo] account and login.
+.  From the `Default Character` panel, select `Upload Character`.
 .  Navigate to the file to be uploaded or drag and drop it onto the file up-loader.
+.  Select `Open`.
 
 [NOTE]
 ====
@@ -99,7 +95,7 @@ Generally, if at any time during the import and rigging process the model does n
 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. 
+.  In this panel you will rig your model. Place the markers as shown in the Auto-Rigger dialog image.
 +
 [NOTE]
 ====
@@ -108,24 +104,25 @@ 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.
+.  When the model appears, if satisfied with the results, click `Finish`.
 
 
 == 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.
+.  After the animation is applied to your model, toggle the btn:[In Place] checkbox if it's a moving animation.
 +
 [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.
+.  When satisfied with the animation, select the btn:[Download] button and follow the `Mixamo Download` instructions below.
+
+If you wish to add more animations, after the download, remove the animation by clicking on the btn:[X] button located next to the animations name. Add your new animation and when satisfied, download the new animation. Repeat as often as is neccessary.
+
 
 
 == Mixamo Download
@@ -133,36 +130,31 @@ You can make small adjustments to the animation by using the sliders. The most c
 
 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.
+.  Make sure the btn:[In Place] checkbox is selected if it's a moving animation.
 .  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.
+.  Click btn:[Download] and save it to your computer.
 
 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.
+.  Click btn:[Download] and save it to your computer.
 
 
 == 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. 
+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.
 
+.  Start Blender if it is not already open.
 .  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 `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]
@@ -185,14 +177,14 @@ 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. 
+.  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.  
+.  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. 
+.  Select the btn:[F] button to save the action.
 .  Save your file with the same name as the action.
 
 [NOTE]
@@ -211,7 +203,7 @@ 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`. 
+.  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:
@@ -224,7 +216,7 @@ Bake Action::
 -  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. 
+.  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.
 
@@ -251,11 +243,11 @@ 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. 
+.  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. 
+*  In the `Properties` panel, navigate to the `Bone` tab.
 *  Rename the bone to `Root`.
-*  Deselect the `Deform` panel checkbox. 
+*  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].
@@ -266,7 +258,7 @@ 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. 
+*  In the `Transparency` panel, move the `Alpha` slider to 1.
 +
 [IMPORTANT]
 ====
@@ -275,7 +267,7 @@ There appears to be a bug where the FBX importer adds an `Alpha` map texture to
 
 *  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. 
+*  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.
@@ -299,11 +291,11 @@ Texture Tab::
 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. 
+.  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]. 
+.  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.
 
@@ -313,26 +305,26 @@ More on the `Ogre` settings can be found in <<jme3/advanced/3d_models#creating-m
 ====
 
 
-== Appending Blender Animations 
+== 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`. 
+.  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. 
+.  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. 
+.  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]
 ====
@@ -343,20 +335,20 @@ When the strip is in drag mode it will be purple. While in drag mode you do not
 +
 [TIP]
 ====
-You can use the mouse scroll wheel to shrink or expand the strip window to bring all strips into the view. 
+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>>. 
+Your file is now ready to <<jme3/advanced/mixamo#ogre-export#,export>>.
 
 [IMPORTANT]
 ====
-Prior to export: 
+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.
 

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

@@ -14,7 +14,7 @@ image::jme3/advanced/nifty-gui-13.png[nifty-gui-13.png,width="276",height="217",
 
 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.)
+This document introduces you to link:https://github.com/nifty-gui/nifty-gui/[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]
 

+ 127 - 126
src/docs/asciidoc/jme3/advanced/physics.adoc

@@ -1,6 +1,6 @@
 = Physics: Gravity, Collisions, Forces
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: physics, documentation, control
 :relfileprefix: ../../
@@ -10,7 +10,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 A physics simulation is used in games and applications where objects are exposed to physical forces: Think of games like pool billiard and car racing simulators. Massive objects are pulled by gravity, forces cause objects to gain momentum, friction slows them down, solid objects collide and bounce off one another, etc. Action and Adventure games also make use of physics to implement solid obstacles, falling, and jumping.
 
-The jMonkeyEngine3 has built-in support for link:http://jbullet.advel.cz[jBullet Physics] (based on link:http://bulletphysics.org[Bullet Physics]) via the `com.jme3.bullet` package. This article focuses mostly on the RigidBodyControl, but also introduces you to others. 
+The jMonkeyEngine3 has built-in support for link:http://jbullet.advel.cz[jBullet Physics] (based on link:http://bulletphysics.org[Bullet Physics]) via the `com.jme3.bullet` package. This article focuses mostly on the RigidBodyControl, but also introduces you to others.
 
 If you are looking for info on how to respond to physics events such as collisions, read about <<jme3/advanced/physics_listeners#,Physics Listeners>>.
 
@@ -46,11 +46,11 @@ Due to some differences in how bullet and jME handle the scene and other objects
 
 When you use this physics simulation, values correspond to the following units:
 
-*  1 length unit (1.0f) equals 1 meter, 
+*  1 length unit (1.0f) equals 1 meter,
 *  1 weight unit (1.0f) equals 1 kilogram,
 *  most torque and rotation values are expressed in radians.
 
-Bullet physics runs internally at 60fps by default. This rate is not dependent on the actual framerate and it does not lock the framerate at 60fps. Instead, when the actual fps is higher than the physics framerate the system will display interpolated positions for the physics objects. When the framerate is lower than the physics framerate, the physics space will be stepped multiple times per frame to make up for the missing calculations. 
+Bullet physics runs internally at 60fps by default. This rate is not dependent on the actual framerate and it does not lock the framerate at 60fps. Instead, when the actual fps is higher than the physics framerate the system will display interpolated positions for the physics objects. When the framerate is lower than the physics framerate, the physics space will be stepped multiple times per frame to make up for the missing calculations.
 
 Internally, the updating and syncing of the actual physics objects in the BulletAppState happens in the following way:
 
@@ -77,14 +77,14 @@ A short overview of how to write a jME application with Physics capabilities:
 Do the following once per application to gain access to the `physicsSpace` object:
 
 .  Make your application extend `com.jme3.app.SimpleApplication`.
-.  Create a BulletAppState field: 
+.  Create a BulletAppState field:
 +
 [source,java]
 ----
 private BulletAppState bulletAppState;
 ----
 
-.  Initialize your bulletAppState and attach it to the state manager: 
+.  Initialize your bulletAppState and attach it to the state manager:
 +
 [source,java]
 ----
@@ -97,7 +97,7 @@ public void simpleInitApp() {
 
 [TIP]
 ====
-In your application, you can always access the `BulletAppState` via the ApplicationStateManager: 
+In your application, you can always access the `BulletAppState` via the ApplicationStateManager:
 
 [source,java]
 ----
@@ -117,7 +117,7 @@ For each Spatial that you want to be physical:
 .  Attach the Spatial to the rootNode (as usual).
 .  (Optional) Implement the `PhysicsCollisionListener` interface to respond to `PhysicsCollisionEvent`s.
 
-Let's look at the details: 
+Let's look at the details:
 
 
 == Create a CollisionShape
@@ -128,38 +128,38 @@ Before you can create a Physics Control, you must create a CollisionShape from t
 [cols="25,40,35", options="header"]
 |===
 
-<a| Non-Mesh CollisionShape     
-<a| Usage                                
-a| Examples 
+<a| Non-Mesh CollisionShape
+<a| Usage
+a| Examples
 
-<a| BoxCollisionShape()         
-a| Box-shaped behaviour, does not roll. 
-<a| Oblong or cubic objects like bricks, crates, furniture.  
+<a| BoxCollisionShape()
+a| Box-shaped behaviour, does not roll.
+<a| Oblong or cubic objects like bricks, crates, furniture.
 
-<a| SphereCollisionShape()      
-<a| Spherical behaviour, can roll.       
-a| Compact objects like apples, soccer balls, cannon balls, compact spaceships. 
+<a| SphereCollisionShape()
+<a| Spherical behaviour, can roll.
+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| CylinderCollisionShape()
+a| Tube-shaped and disc-shaped behaviour, can roll on one side.
 a| Oblong objects like pillars. +
-Disc-shaped objects like wheels, plates. 
+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. 
-a| A car with wheels (1 box + 4 cylinders), etc. 
+<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.
+a| A car with wheels (1 box + 4 cylinders), etc.
 
-<a| CapsuleCollisionShape()     
-<a| A built-in compound shape of a vertical cylinder with one sphere at the top and one sphere at the bottom. Typically used with <<jme3/advanced/walking_character#,CharacterControls>>: A cylinder-shaped body does not get stuck at corners and vertical obstacles; the rounded top and bottom do not get stuck on stair steps and ground obstacles.  
-a| Persons, animals. 
+<a| CapsuleCollisionShape()
+<a| A built-in compound shape of a vertical cylinder with one sphere at the top and one sphere at the bottom. Typically used with <<jme3/advanced/walking_character#,CharacterControls>>: A cylinder-shaped body does not get stuck at corners and vertical obstacles; the rounded top and bottom do not get stuck on stair steps and ground obstacles.
+a| Persons, animals.
 
-<a| SimplexCollisionShape()     
+<a| SimplexCollisionShape()
 a| A physical point, line, triangle, or rectangle Shape, defined by one to four points.
 a|Guardrails
 
-<a| PlaneCollisionShape()       
-a| A 2D plane. Very fast. 
-a| Flat solid floor or wall. 
+<a| PlaneCollisionShape()
+a| A 2D plane. Very fast.
+a| Flat solid floor or wall.
 
 |===
 
@@ -167,26 +167,26 @@ All non-mesh CollisionShapes can be used for dynamic, kinematic, as well as stat
 [cols="25,40,35", options="header"]
 |===
 
-<a| Mesh CollisionShapes   
-<a| Usage                                
-a| Examples 
+<a| Mesh CollisionShapes
+<a| Usage
+a| Examples
 
-<a| MeshCollisionShape        
+<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 whole static game level model. 
+*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| 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 dynamic 3D model. 
+*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| 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| Complex dynamic objects (like spiders) in Virtual Reality or scientific simulations. 
+*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| 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|Static terrains.
@@ -197,12 +197,12 @@ On a CollisionShape, you can apply a few properties
 [cols="30,45,25", options="header"]
 |===
 
-a| CollisionShape Method 
-a| Property 
-a| Examples 
+a| CollisionShape Method
+a| Property
+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| 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)`
 
@@ -213,7 +213,7 @@ The mesh-accurate shapes can use a CollisionShapeFactory as constructor (code sa
 
 [IMPORTANT]
 ====
-Pick the simplest and most applicable shape for the mesh for what you want to do: If you give a box a sphere collision shape, it will roll; if you give a ball a box collision shape, it will sit on a slope. If the shape is too big, the object will seem to float; if the shape is too small it will seem to sink into the ground. During development and debugging, you can make collision shapes visible by adding the following line after the bulletAppState initialization: 
+Pick the simplest and most applicable shape for the mesh for what you want to do: If you give a box a sphere collision shape, it will roll; if you give a ball a box collision shape, it will sit on a slope. If the shape is too big, the object will seem to float; if the shape is too small it will seem to sink into the ground. During development and debugging, you can make collision shapes visible by adding the following line after the bulletAppState initialization:
 
 [source,java]
 ----
@@ -236,14 +236,14 @@ bulletAppState.setDebugEnabled(true);
 *  One way of using a constructor and a Geometry's mesh for static Spatials:
 [source,java]
 ----
-MeshCollisionShape level_shape = 
+MeshCollisionShape level_shape =
     new MeshCollisionShape(level_geo.getMesh());
 ----
 
 *  One way of using a constructor and a Geometry's mesh for dynamic Spatials:
 [source,java]
 ----
-HullCollisionShape shape = 
+HullCollisionShape shape =
     new HullCollisionShape(katamari_geo.getMesh());
 ----
 
@@ -257,7 +257,7 @@ CompoundCollisionShape myComplexShape =
 *  Creating a dynamic HullCollisionShape shape (or CompoundCollisionShape with HullCollisionShapes as children) for a Geometry:
 [source,java]
 ----
-CollisionShape shape = 
+CollisionShape shape =
     CollisionShapeFactory.createDynamicMeshShape(spaceCraft);
 ----
 
@@ -268,7 +268,7 @@ CompoundCollisionShape boxShape =
     CollisionShapeFactory.createBoxShape((Node) crate_geo);
 ----
 
-*  A round, non-mesh-accurate compound shape: 
+*  A round, non-mesh-accurate compound shape:
 [source,java]
 ----
 SphereCollisionShape sphereShape =
@@ -279,22 +279,22 @@ 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. 
+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="20,40,40", options="header"]
 |===
 
 a|Standard PhysicsControls
 a| Usage
-a| Examples 
+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|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|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. 
+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="20,40,40", options="header"]
@@ -302,19 +302,19 @@ a|A monster's “aggro radius, CharacterControl collisions, motion detectors, ph
 
 a|Special PhysicsControls
 a| Usage
-a| Examples 
+a| Examples
 
 a|VehicleControl +
 PhysicsVehicleWheel
-a| Special Control used for <<jme3/advanced/vehicles#,&quot;terrestrial&quot;  vehicles with suspension and wheels>>. 
+a| Special Control used for <<jme3/advanced/vehicles#,&quot;terrestrial&quot;  vehicles with suspension and wheels>>.
 a|Cars, tanks, hover crafts, ships, motorcycles…
 
 a|CharacterControl
 a|Special Control used for <<jme3/advanced/walking_character#,Walking Character>>s.
-a|Upright walking persons, animals, robots… 
+a|Upright walking persons, animals, robots…
 
 a|RagDollControl
-a|Special Control used for <<jme3/advanced/ragdoll#,collapsing, flailing, or falling characters>> 
+a|Special Control used for <<jme3/advanced/ragdoll#,collapsing, flailing, or falling characters>>
 a|Falling persons, animals, robots, “Rag dolls
 
 |===
@@ -324,18 +324,18 @@ Click the links for details on the special PhysicsControls. This article is abou
 
 === Physics Control Code Samples
 
-The most commonly used physics control is RigidBodyControl.  The RigidBodyControl constructor takes up to two parameters:  a collision shape and a mass (a float in kilograms).  The mass parameter also determines whether the object is dynamic (movable) or static (fixed). For a static object such as a floor or wall, specify zero mass. 
+The most commonly used physics control is RigidBodyControl.  The RigidBodyControl constructor takes up to two parameters:  a collision shape and a mass (a float in kilograms).  The mass parameter also determines whether the object is dynamic (movable) or static (fixed). For a static object such as a floor or wall, specify zero mass.
 
 [source,java]
 ----
-RigidBodyControl myThing_phys = 
+RigidBodyControl myThing_phys =
     new RigidBodyControl( myThing_shape , 123.0f ); // dynamic
 ----
 
 [source,java]
 ----
-RigidBodyControl myDungeon_phys = 
-    new RigidBodyControl( myDungeon_shape , 0.0f ); // static 
+RigidBodyControl myDungeon_phys =
+    new RigidBodyControl( myDungeon_shape , 0.0f ); // static
 ----
 
 
@@ -375,7 +375,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. 
+.  Add a PhysicsControl to a Spatial.
 +
 [source,java]
 ----
@@ -387,16 +387,16 @@ myThing_geo.addControl(myThing_phys);
 
 == Add PhysicsControl to PhysicsSpace
 
-The PhysicsSpace is an object in BulletAppState that is like a rootNode for Physics Controls. 
+The PhysicsSpace is an object in BulletAppState that is like a rootNode for Physics Controls.
 
-*  Just like you add the Geometry to the rootNode, you add its PhysicsControl to the PhysicsSpace. 
+*  Just like you add the Geometry to the rootNode, you add its PhysicsControl to the PhysicsSpace.
 [source,java]
 ----
-bulletAppState.getPhysicsSpace().add(myThing_phys); 
-rootNode.attachChild(myThing_geo); 
+bulletAppState.getPhysicsSpace().add(myThing_phys);
+rootNode.attachChild(myThing_geo);
 ----
 
-*  When you remove a Geometry from the scene and detach it from the rootNode, also remove the PhysicsControl from the PhysicsSpace: 
+*  When you remove a Geometry from the scene and detach it from the rootNode, also remove the PhysicsControl from the PhysicsSpace:
 [source,java]
 ----
 bulletAppState.getPhysicsSpace().remove(myThing_phys);
@@ -425,10 +425,10 @@ 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"); 
+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)); 
+model.getControl(RigidBodyControl.class).getCollisionShape().setScale(new Vector3f(2, 2, 2));
 bulletAppState.getPhysicsSpace().add(model);
 
 // Works fine
@@ -436,15 +436,16 @@ Spatial model = assetManager.loadModel("Models/MonkeyHead.j3o"); // Same Model
  // IMPORTANT : You must navigate to the Geometry for this to work
 Geometry geom = ((Geometry) ((Node) model).getChild("MonkeyHeadGeom"));
 geom.addControl(new RigidBodyControl(0));
-// Works great (scaling of a MeshCollisionShape)	
+// Works great (scaling of a MeshCollisionShape)
 geom.getControl(RigidBodyControl.class).getCollisionShape().setScale(new Vector3f(2, 2, 2));
 bulletAppState.getPhysicsSpace().add(geom);
 
 ----
 
 With the corresponding output below:
-link:http://i.imgur.com/fAXlF.png[External Link]
-link:http://i.imgur.com/Josua.png[External Link]
+
+image:http://i.imgur.com/fAXlF.png[http://i.imgur.com/fAXlF.png,width='45%']
+image:http://i.imgur.com/Josua.png[http://i.imgur.com/fAXlF.png,width='45%']
 
 
 === PhysicsSpace Code Samples
@@ -460,7 +461,7 @@ a|setGravity(new Vector3f(0, -9.81f, 0));
 a|Specifies the global gravity.
 
 a|setAccuracy(1f/60f);
-a|Specifies physics accuracy. The higher the accuracy, the slower the game. Decrease value if objects are passing through one another, or bounce oddly. (e.g. Change value from 1f/60f to something like 1f/80f.) 
+a|Specifies physics accuracy. The higher the accuracy, the slower the game. Decrease value if objects are passing through one another, or bounce oddly. (e.g. Change value from 1f/60f to something like 1f/80f.)
 
 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.
@@ -480,35 +481,35 @@ On a RigidBodyControl, you can set the following physical properties.
 [cols="3", options="header"]
 |===
 
-a| RigidBodyControl Method 
-a| Property 
-a| Examples 
+a| RigidBodyControl Method
+a| Property
+a| Examples
 
-a| setGravity(new Vector3f(0f,-9.81f,0f)) 
+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| setMass(1f) 
+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! 
+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| setFriction(1f)
 a| Friction. +
-Slippery objects have low friction. The ground has high friction. 
+Slippery objects have low friction. The ground has high friction.
 a| Ice, slides: 0.0f +
-Soil, concrete, rock: 1.0f 
+Soil, concrete, rock: 1.0f
 
-a| setRestitution(0.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. 
+This setting has an impact on performance, so use it sparingly.
 a| Brick: 0.0f +
-Rubber ball: 1.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.
@@ -520,18 +521,18 @@ On a RigidBodyControl, you can apply the following physical forces:
 [cols="2", options="header"]
 |===
 
-a| RigidBodyControl Method 
-a| Motion 
+a| RigidBodyControl Method
+a| Motion
 
 a| setPhysicsLocation()
-a|Positions the objects. Do not use setLocalTranslation() for physical objects. Important: Make certain not to make CollisionShapes overlap when positioning them. 
+a|Positions the objects. Do not use setLocalTranslation() for physical objects. Important: Make certain not to make CollisionShapes overlap when positioning them.
 
 a| setPhysicsRotation()
 a|Rotates the object. Do not use setLocalRotate() for physical objects.
 
-a| setKinematic(true) 
+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.) 
+(See detailed explanation below.)
 
 |===
 
@@ -540,12 +541,12 @@ a| By default, RigidBodyControls are dynamic (kinematic=false) and are affected
 
 All physical objects…
 
-*  must not overlap. 
+*  must not overlap.
 *  can detect collisions and report several values about the impact.
 *  can respond to collisions dynamically, or statically, or kinematically.
 [cols="4", options="header"]
 |===
-|Property |Static |Kinematic |Dynamic 
+|Property |Static |Kinematic |Dynamic
 
 a|Examples
 a|Immobile obstacles: Floors, walls, buildings, …
@@ -554,7 +555,7 @@ a|Interactive objects: Rolling balls, movable crates, falling pillars, zero-g sp
 
 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|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?
@@ -582,9 +583,9 @@ a|no
 a|no
 a|yes
 
-a|How to activate this behaviour? 
+a|How to activate this behaviour?
 a|setMass(0f); +
-setKinematic(false); 
+setKinematic(false);
 a|setMass(1f); +
 setKinematic(true);
 a|setMass(1f); +
@@ -595,14 +596,14 @@ setKinematic(false);
 ==== When Do I Use Kinematic Objects?
 
 *  Kinematics are solid and characters can “stand on them.
-*  When they collide, Kinematics push dynamic objects, but a dynamic object never pushes a Kinematic. 
-*  You can hang kinematics up “in mid-air and attach other PhysicsControls to them using <<jme3/advanced/hinges_and_joints#,hinges and joints>>. Picture them as “air hooks for flying aircraft carriers, floating islands in the clouds, suspension bridges, swings, chains… 
+*  When they collide, Kinematics push dynamic objects, but a dynamic object never pushes a Kinematic.
+*  You can hang kinematics up “in mid-air and attach other PhysicsControls to them using <<jme3/advanced/hinges_and_joints#,hinges and joints>>. Picture them as “air hooks for flying aircraft carriers, floating islands in the clouds, suspension bridges, swings, chains…
 *  You can use Kinematics to create mobile remote-controlled physical objects, such as moving elevator platforms, flying blimps/airships. You have full control how Kinematics move, they never “fall or “topple over.
 
 
 [IMPORTANT]
 ====
-The position of a kinematic RigidBodyControl is updated automatically depending on its spatial's translation. You move Spatials with a kinematic RigidBodyControl programmatically, that means you write translation and rotation code in the update loop. You describe the motion of kinematic objects either by using methods such as `setLocalTranslation()` or `move()`, or by using a <<jme3/advanced/motionpath#,MotionPath>>. 
+The position of a kinematic RigidBodyControl is updated automatically depending on its spatial's translation. You move Spatials with a kinematic RigidBodyControl programmatically, that means you write translation and rotation code in the update loop. You describe the motion of kinematic objects either by using methods such as `setLocalTranslation()` or `move()`, or by using a <<jme3/advanced/motionpath#,MotionPath>>.
 ====
 
 
@@ -613,29 +614,29 @@ Use the following methods to move dynamic physical objects.
 [cols="2", options="header"]
 |===
 
-a| PhysicsControl Method 
-a| Motion 
+a| PhysicsControl Method
+a| Motion
 
-a| setLinearVelocity(new Vector3f(0f,0f,1f)) 
-a| Set the linear speed of this object. 
+a| setLinearVelocity(new Vector3f(0f,0f,1f))
+a| Set the linear speed of this object.
 
-a| setAngularVelocity(new Vector3f(0f,0f,1f)) 
-a| Set the rotational speed of the object; the x, y and z component are the speed of rotation around that axis. 
+a| setAngularVelocity(new Vector3f(0f,0f,1f))
+a| Set the rotational speed of the object; the x, y and z component are the speed of rotation around that axis.
 
-a| applyCentralForce(…) 
-<a| Move (push) the object once with a certain moment, expressed as a Vector3f.  
+a| applyCentralForce(…)
+<a| Move (push) the object once with a certain moment, expressed as a Vector3f.
 
-a| applyForce(…) 
-a| Move (push) the object once with a certain moment, expressed as a Vector3f. Optionally, you can specify where on the object the pushing force hits. 
+a| applyForce(…)
+a| Move (push) the object once with a certain moment, expressed as a Vector3f. Optionally, you can specify where on the object the pushing force hits.
 
-a| applyTorque(…) 
-a| Rotate (twist) the object once around its axes, expressed as a Vector3f. 
+a| applyTorque(…)
+a| Rotate (twist) the object once around its axes, expressed as a Vector3f.
 
-a| applyImpulse(…) 
-a| An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball. 
+a| applyImpulse(…)
+a| An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball.
 
-a| applyTorqueImpulse(…) 
-a| An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball. 
+a| applyTorqueImpulse(…)
+a| An idealised change of momentum. This is the kind of push that you would use on a pool billiard ball.
 
 a| clearForces()
 a|Cancels out all forces (force, torque) etc and stops the motion.
@@ -653,8 +654,8 @@ PhysicsControls also support the following advanced features:
 [cols="2", options="header"]
 |===
 
-a| PhysicsControl Method 
-a| Property 
+a| PhysicsControl Method
+a| Property
 
 a| setCollisionShape(collisionShape)
 a|Changes the collision shape after creation.
@@ -672,13 +673,13 @@ a| setAngularFactor(1f)
 a|Set the amount of rotation that will be applied. A value of zero will cancel all rotational force outcome. (?)
 
 a| setSleepingThreshold(float,float)
-a|Sets the sleeping thresholds which define when the object gets deactivated to save resources. The first value is the linear threshold and the second the angular. Low values keep the object active when it barely moves (slow precise performance), high values put the object to sleep immediately (imprecise fast performance). (?) 
+a|Sets the sleeping thresholds which define when the object gets deactivated to save resources. The first value is the linear threshold and the second the angular. Low values keep the object active when it barely moves (slow precise performance), high values put the object to sleep immediately (imprecise fast performance). (?)
 
-a| setCcdMotionThreshold(0f) 
+a| setCcdMotionThreshold(0f)
 a|Sets the amount of motion that has to happen in one physics tick to trigger the continuous motion detection in moving objects that push one another. This avoids the problem of fast objects moving through other objects. Set to zero to disable (default).
 
 a| setCcdSweptSphereRadius(.5f)
-a|Bullet does not use the full collision shape for continuous collision detection, instead it uses a “swept sphere shape to approximate a motion, which can be imprecise and cause strange behaviors such as objects passing through one another or getting stuck. Only relevant for fast moving dynamic bodies. 
+a|Bullet does not use the full collision shape for continuous collision detection, instead it uses a “swept sphere shape to approximate a motion, which can be imprecise and cause strange behaviors such as objects passing through one another or getting stuck. Only relevant for fast moving dynamic bodies.
 
 |===
 
@@ -699,7 +700,7 @@ You can `setApplyPhysicsLocal(true)` for an object to make it move relatively to
 *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. 
+*Solution:* Use the debug mode to make CollisionShapes visible and verify that CollisionShapes do not overlap.
 [source,java]
 ----
 bulletAppState.getPhysicsSpace().enableDebug(assetManager);

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

@@ -9,7 +9,8 @@
 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:
+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:https://www.gamedev.net/articles/programming/graphics/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:
 
 
 image::jme3/advanced/water-post.png[water-post.png,width="",height="",align="center",link=https://youtu.be/AWlUzgRN3Pc]

+ 15 - 15
src/docs/asciidoc/jme3/advanced/softbody.adoc

@@ -1,6 +1,6 @@
 = Physics : SoftBody
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -42,7 +42,7 @@ The dynamics libraries for softbody (.so , .dll …) isn't (yet) prebuild for yo
 public void simpleInitApp() {
     softBodyAppState = new BulletSoftBodyAppState();
     getStateManager().attach(softBodyAppState);
-    
+
     SoftBodyWorldInfo sbwi = softBodyAppState.getPhysicsSoftSpace().getWorldInfo();
     sbwi.setGravity(Vector3f.UNIT_Y.mult(-0.981f));
 
@@ -56,9 +56,9 @@ public void simpleInitApp() {
     soft.generateClusters(8);
     soft.config().setDynamicFrictionCoef(0.8f);
     soft.config().setPoseMatchingCoef(0.2f);
-    
+
     soft.config().setCollisionsFlags(PhysicsSoftBody.Config.CL_SS + PhysicsSoftBody.Config.CL_RS);
-    
+
     soft.setPose(false, true);
     soft.setTotalMass(100, true);
     soft.randomizeConstraints();
@@ -76,7 +76,7 @@ public void simpleInitApp() {
 
 == Documentation
 
-soft mesh / surface 
+soft mesh / surface
 
 Cluster ?
 
@@ -85,13 +85,13 @@ Cluster ?
 config collision flag ?
 
 
-==== Ropes
+=== Ropes
 
 A rope can be created by creating a new SoftBody on a Mesh with Mesh.Mode.Lines.
 More informations on creating <<jme3/advanced/custom_meshes#,custom meshes>>.
 
 
-===== Example
+==== Example
 
 [source,java]
 ----
@@ -138,7 +138,7 @@ t.addControl(new SoftBodyControl(false));
 ==== Anchors
 
 An Anchors act like a weld between a SoftBody and a RigidBody.
-Adding a anchors to a soft body require to specify the SoftBody's node and the RigidBody to weld with. 
+Adding a anchors to a soft body require to specify the SoftBody's node and the RigidBody to weld with.
 
 [source,java]
 ----
@@ -155,12 +155,12 @@ An anchor bind a SoftBody's node (or Vertex) to a RigidBody, the node will be at
 
 [WARNING]
 ====
- Anchors are not yet Serialized 
+ Anchors are not yet Serialized
 ====
 
 
 
-===== Example
+==== Example
 
 [source,java]
 ----
@@ -197,12 +197,12 @@ soft.removeAnchor(8,rigid);
 
 ==== Joints
 
-Joints require SoftBodies with Clusters ( see generateClusters(int k) ). 
+Joints require SoftBodies with Clusters ( see generateClusters(int k) ).
 
 
 [WARNING]
 ====
- joint don't use values pivotA & pivotB (not yet) 
+ joint don't use values pivotA & pivotB (not yet)
 ====
 
 
@@ -229,7 +229,7 @@ public SoftAngularJoint(Vector3f axis, PhysicsSoftBody nodeA, PhysicsSoftBody no
 ----
 
 
-===== Examples
+==== Examples
 
 
 === LinearJoint
@@ -242,7 +242,7 @@ Geometry b = new Geometry("rigidBox", box);
 b.move(0, 5f, 0);
 b.addControl(new RigidBodyControl(1));
 rigid = b.getControl(RigidBodyControl.class);
-        
+
 Torus torus = new Torus(20, 10, 1f, 1.5f);
 Geometry t = new Geometry("softTorus", torus);
 t.addControl(new SoftBodyControl(true, false));

+ 22 - 20
src/docs/asciidoc/jme3/advanced/walking_character.adoc

@@ -1,6 +1,6 @@
 = Walking Character
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, physics, input, animation, character, NPC, collision
 :relfileprefix: ../../
@@ -8,7 +8,7 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-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. 
+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.
 
@@ -26,7 +26,7 @@ Several related code samples can be found here:
 
 *  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] 
+**  Uses also link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/BombControl.java[BombControl.java]
 
 *  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)
@@ -75,20 +75,22 @@ player.setLocalScale(0.5f); // optionally adjust scale of model
 playerControl = new BetterCharacterControl(1.5f, 6f, 1f); // construct character. (If your character bounces, try increasing height and weight.)
 playerNode.addControl(playerControl); // attach to wrapper
 // set basic physical properties:
-        playerControl.setJumpForce(new Vector3f(0,5f,0)); 
+        playerControl.setJumpForce(new Vector3f(0,5f,0));
         playerControl.setGravity(new Vector3f(0,1f,0));
 playerControl.warp(new Vector3f(0,10,10)); // warp character into landscape at particular location
 // add to physics state
-        bulletAppState.getPhysicsSpace().add(playerControl); 
-        bulletAppState.getPhysicsSpace().addAll(playerNode); 
+        bulletAppState.getPhysicsSpace().add(playerControl);
+        bulletAppState.getPhysicsSpace().addAll(playerNode);
 rootNode.attachChild(playerNode); // add wrapper to root
 
 ----
 
+== Character Control
+
 
 [IMPORTANT]
 ====
-The BulletPhysics CharacterControl only collides with “real PhysicsControls (RigidBody). It does not detect collisions with other CharacterControls! If you need additional collision checks, add GhostControls to your characters and create a custom <<jme3/advanced/physics_listeners#,collision listener>> to respond. (The JME3 team may implement a better CharacterControl one day.)
+The BulletPhysics CharacterControl only collides with “real PhysicsControls (RigidBody). It does not detect collisions with other CharacterControls! If you need additional collision checks, add GhostControls to your characters and create a custom <<jme3/advanced/physics_listeners#,collision listener>> to respond.
 ====
 
 
@@ -96,28 +98,28 @@ A CharacterControl is a special kinematic object with restricted movement. Chara
 [cols="2", options="header"]
 |===
 
-a| CharacterControl Method 
-a| Property 
+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| setJumpSpeed(10f) 
-a| Jump speed (movement along upward-axis) 
+a| setJumpSpeed(10f)
+a| Jump speed (movement along upward-axis)
 
-a| setFallSpeed(20f) 
-a| Fall speed (movement opposite to upward-axis) 
+a| setFallSpeed(20f)
+a| Fall speed (movement opposite to upward-axis)
 
-a| setMaxSlope(1.5f) 
-a| How steep the slopes and steps are that the character can climb without considering them an obstacle. Higher obstacles need to be jumped. Vertical height in world units. 
+a| setMaxSlope(1.5f)
+a| How steep the slopes and steps are that the character can climb without considering them an obstacle. Higher obstacles need to be jumped. Vertical height in world units.
 
-<a| setGravity(1f)   
+<a| setGravity(1f)
 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. 
+Use `setWalkDirection(Vector3f.ZERO)` to stop a directional motion.
 
 |===
 
@@ -386,7 +388,7 @@ private void attack() {
 
 ----
 
-Finally, the update loop looks at the directional variables and moves the character accordingly. Since this is a special kinematic CharacterControl, we use the `setWalkDirection()` method. 
+Finally, the update loop looks at the directional variables and moves the character accordingly. Since this is a special kinematic CharacterControl, we use the `setWalkDirection()` method.
 
 The variable `airTime` tracks how long the character is off the ground (e.g. when jumping or falling) and adjusts the walk and stand animations acccordingly.
 
@@ -431,7 +433,7 @@ public void simpleUpdate(float tpf) {
         animationChannel.setAnim("Walk", 0.7f);
       }
     }
-    
+
   walkDirection.multLocal(25f).multLocal(tpf);// The use of the first multLocal here is to control the rate of movement multiplier for character walk speed. The second one is to make sure the character walks the same speed no matter what the frame rate is.
   character.setWalkDirection(walkDirection); // THIS IS WHERE THE WALKING HAPPENS
 }

+ 9 - 9
src/docs/asciidoc/jme3/android.adoc

@@ -1,6 +1,6 @@
 = Android Support in the jMonkeyEngine
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, sdk, android, deployment, tool
 :relfileprefix: ../
@@ -75,7 +75,7 @@ Mobile deployment is a “one-click option next to Desktop/WebStart/Applet deplo
 .  Open the jMonkeyEngine SDK Options&gt;Mobile and enter the path to your Android SDK directory, and click OK. E.g. `C:\Program Files\android-sdk`
 
 
-==== Activate Android Deployment
+=== Activate Android Deployment
 
 .  Open an existing JME3 project, or create a new JME3 project.
 .  Right-click the project node in the Projects Window and open the Properties.
@@ -90,7 +90,7 @@ 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._
 
 
-==== Build and Run
+=== Build and Run
 
 Open your game project in the jMonkeyEngine SDK.
 
@@ -124,7 +124,7 @@ During build, the libraries and main jar file from the main project are copied t
 *Be aware that logging has been identified as having a significant performance hit in Android applications. If getting poor performance please try turning logging either down or off and retesting.*
 
 
-==== Installing NBAndroid
+=== Installing NBAndroid
 
 Activating the nbandroid plugin in the jMonkeyEngine SDK is optional, but recommended. You do not need the nbandroid plugin for Android support to work, however nbandroid will not interfere and will in fact allow you to edit the android source files and project more conveniently. To be able to edit, extend and code android-specific code in Android projects, install NBAndroid from the update center:
 
@@ -135,7 +135,7 @@ Activating the nbandroid plugin in the jMonkeyEngine SDK is optional, but recomm
 *If the android plugin is not in that list follow link:https://bitbucket.org/nbandroid/nbandroid/wiki/Installation[these instructions].*
 
 
-==== Notes
+=== Notes
 
 *  The package name parameter is only used when creating the project and only sets the android MainActivity package name
 *  The needed android.jar comes with the plugin and is automatically added to the android build
@@ -151,7 +151,7 @@ Activating the nbandroid plugin in the jMonkeyEngine SDK is optional, but recomm
 You can use the jMonkeyEngine SDK to save (theoretically) any jMonkeyEngine app as Android app. But the application has to be prepared for the fact that Android devices have a smaller screen resolution, touchscreens instead of mouse buttons, and (typically) no keyboards.
 
 *  *Inputs:* Devise an alternate control scheme that works for Android users (e.g. using com.jme3.input.controls.TouchListener). This mobile scheme is likely quite different from the desktop scheme.
-*  *Effects:* Android devices do no support 3D features as well as PCs – or even not at all. This restriction includes post-processor filters (depth-of-field blur, bloom, light scattering, cartoon, etc), drop shadows, water effects, 3D Audio. Be prepared that these effects will (at best) slow down the application or (in the worst case) not work at all. Provide the option to switch to a low-fi equivalent! 
+*  *Effects:* Android devices do no support 3D features as well as PCs – or even not at all. This restriction includes post-processor filters (depth-of-field blur, bloom, light scattering, cartoon, etc), drop shadows, water effects, 3D Audio. Be prepared that these effects will (at best) slow down the application or (in the worst case) not work at all. Provide the option to switch to a low-fi equivalent!
 *  *Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++:* Use different base UI layout XML files for the mobile version of your app to account for a different screen resolution.
 
 *Best Practice:* Ideally, you write the core application code in a way that it checks for the environment it's being run on, and automatically adapts the device's limitations by switching off effects, changing input mechanisms etc. Learn how to <<jme3/advanced/read_graphic_card_capabilites#,read graphic card capabilites>> here.
@@ -168,7 +168,7 @@ 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.
 
-Note that you have to build the whole project once to make (new) classes in the main project available to the android part. 
+Note that you have to build the whole project once to make (new) classes in the main project available to the android part.
 
 
 == Signing an APK
@@ -176,7 +176,7 @@ Note that you have to build the whole project once to make (new) classes in the
 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 
+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.

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

@@ -82,7 +82,7 @@ image::http://farm8.staticflickr.com/7178/6987339044_3ff558d451_z.jpg[6987339044
 == Design
 
 
-==== Mindmaping
+=== Mindmaping
 
 iframe::http://bubbl.us/view/1860d6/2fd76d/15vmlQSf.3GMg/[width="800px", height="600px", alt="", scroll="true",border="true",align="false"]
 
@@ -91,7 +91,7 @@ iframe::http://text2mindmap.com/1VG1V4[width="800px", height="600px", alt="", sc
 
 
 
-===== Game play
+==== Game play
 
 *  RPGGame
 **  Player

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

@@ -99,7 +99,7 @@ Preview Video:
 == FIRST RUN
 
 
-==== STEP 1) Download and Setup:
+=== STEP 1) Download and Setup:
 
 Full complete project download: Download from SVN
 Starter project (with assets) download: Download from SVN

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

@@ -1,6 +1,6 @@
 = scripting
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -13,7 +13,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 === Rule
 
-In this game, Rule are implemented with groovy script 
+In this game, Rule are implemented with groovy script
 
 
 === EffectText
@@ -38,6 +38,5 @@ I always make a small in-house editor for every of my small games (before I inte
 
 [TIP]
 ====
-For the help in GroovySwing and Grifon go <<jme3/advanced/scripting#,scripting>>
+For the help in GroovySwing and Grifon go <<jme3/scripting#,scripting>>.
 ====
-

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

@@ -20,6 +20,7 @@ I will keep it short but concise!
 === Wisdoms and Insights with Images
 
 TRY: link:http://www.handdrawnapps.com/category/game-design-resources/[http://www.handdrawnapps.com/category/game-design-resources/]
+
 '''
 
 ....
@@ -27,6 +28,7 @@ Doing it right!
 ....
 
 image:http://rubycowgames.com/wp-content/uploads/game-design.jpg[game-design.jpg,width="400",height=""]
+
 '''
 
 ....
@@ -34,6 +36,7 @@ The Process and elements
 ....
 
 image:http://www.gamasutra.com/db_area/images/feature/3934/image002.jpg[image002.jpg,width="400",height=""]
+
 '''
 
 ....
@@ -43,6 +46,7 @@ Use UML & List & Tree and Graph
 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,width="400",height=""]
+
 '''
 
 ....
@@ -50,6 +54,7 @@ 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,width="400",height=""]
+
 '''
 
 ....
@@ -61,6 +66,7 @@ image:http://gametea.files.wordpress.com/2010/09/game-design-101.gif[game-design
 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,width="400",height=""]
+
 '''
 
 ....
@@ -185,7 +191,7 @@ image::http://billeebrady.com/wp-content/uploads/2012/06/Keep-It-Simple-Stupid.j
 == Management tips
 
 
-==== Time constraints
+=== Time constraints
 
 With any workflow and model your team choose, keep in mind this to get high quality artworks in short limit of time, keep phase (a duration of development) tight, as my personal experiences:
 
@@ -235,12 +241,12 @@ link:http://dokgames.blogspot.com/2012/09/brick-4-whats-games-development-workfl
 == Useful terms
 
 
-==== Gameplay
+=== Gameplay
 
 A list of “names or “things will be seen in our game, bricks that build up the gameplay piece by piece.
 
 
-===== As shortlist
+==== As shortlist
 
 Yeah, a real text list of names, short description and notes!
 
@@ -286,12 +292,12 @@ Read : <<jme3/entitysystem#,entitysystem>>
 == Userful tools
 
 
-==== Online Docs and Repository
+=== Online Docs and Repository
 
 To writing corporate documentations
 
 
-===== Google
+==== Google
 
 Google doc link:http://doc.google.com[http://doc.google.com]
 Google code link:http://code.google.com[http://code.google.com]

+ 77 - 77
src/docs/asciidoc/jme3/atomixtuts/greenberet.adoc

@@ -1,6 +1,6 @@
 = greenberet
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -10,7 +10,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == GreenBeret game
 
-This is the up-comming chaper from game making Series 
+This is the up-comming chaper from game making Series
 
 Part II: chapter 8 - GreenBeret Steath action game
 
@@ -35,123 +35,123 @@ Topic :
 
 ==== Disclamed
 
-3D Models 
+3D Models
 
 
 == Researches
 
-Improving Guard Behaviour in a Top-Down 2D Stealth Game 
+Improving Guard Behaviour in a Top-Down 2D Stealth Game
 
-[1]   Konami,  “Metal Gear,  Konami,  1987. 
+[1]   Konami,  “Metal Gear,  Konami,  1987.
 
 [2]   Konami,  “Metal Gear  Solid 2:  Sons of Liberty,
-Konami,  2001. 
+Konami,  2001.
 
-[3]   Guinnes World Records, “First Stealth Game  to Feature 
-Collective  Artificial  Intelligence, 2008. [Online]. 
+[3]   Guinnes World Records, “First Stealth Game  to Feature
+Collective  Artificial  Intelligence, 2008. [Online].
 
-[4]   A. J. Champandard,  “On Finite State Machines and 
-Reusability, 2007.  [Online].  Available: 
-link:http://aigamedev.com/open/article/fsm-reusable/[http://aigamedev.com/open/article/fsm-reusable/]. 
-[Accessed March 2013]. 
+[4]   A. J. Champandard,  “On Finite State Machines and
+Reusability, 2007.  [Online].  Available:
+link:http://aigamedev.com/open/article/fsm-reusable/[http://aigamedev.com/open/article/fsm-reusable/].
+[Accessed March 2013].
 
 [5]   A. J. Champandard,  “The Gist  of Hierarchical  FSM,
-2007.  [Online].  
+2007.  [Online].
 
-Available: 
-link:http://aigamedev.com/open/article/hfsm-gist/[http://aigamedev.com/open/article/hfsm-gist/]. 
-[Accessed March 2013]. 
+Available:
+link:http://aigamedev.com/open/article/hfsm-gist/[http://aigamedev.com/open/article/hfsm-gist/].
+[Accessed March 2013].
 
-[6]   M. Gilgenbach and T. McIntosh, “A Flexible  AI 
-System through Behavior Compositing, in AI Game 
-Programming Wisdom  3, S. Rabin, Ed.,  Boston, 
-Charles River  Media, 2006,  pp. 289-300. 
+[6]   M. Gilgenbach and T. McIntosh, “A Flexible  AI
+System through Behavior Compositing, in AI Game
+Programming Wisdom  3, S. Rabin, Ed.,  Boston,
+Charles River  Media, 2006,  pp. 289-300.
 
-[7]   A. Khoo, “An Introduction to Behavior-Based Systems 
-for Games,  in AI Game Programming Wisdom 3, S. 
-Rabin,  Ed., Boston, Charles River  Media, 2006,  pp. 
+[7]   A. Khoo, “An Introduction to Behavior-Based Systems
+for Games,  in AI Game Programming Wisdom 3, S.
+Rabin,  Ed., Boston, Charles River  Media, 2006,  pp.
 351-364.
 
 [8]   A. J. Champandard,  “Understanding Behaviour Trees,
-2007.  [Online].  Available: 
-link:http://aigamedev.com/open/article/bt-overview/[http://aigamedev.com/open/article/bt-overview/]. 
-[Accessed March 2013]. 
+2007.  [Online].  Available:
+link:http://aigamedev.com/open/article/bt-overview/[http://aigamedev.com/open/article/bt-overview/].
+[Accessed March 2013].
 
-[9]   B.  Knafla,  “Introduction to Behavior Trees, 2011. 
-[Online].  Available: 
+[9]   B.  Knafla,  “Introduction to Behavior Trees, 2011.
+[Online].  Available:
 link:http://www.altdevblogaday.com/2011/02/24/[http://www.altdevblogaday.com/2011/02/24/] introductio
-n-to-behavior-trees/. [Accessed April 2013]. 
+n-to-behavior-trees/. [Accessed April 2013].
 
-[10]  A. J. Champandard,  “Planning in Games:  An Overview 
-and Lessons Learned, 2013.  [Online].  Available: 
-link:http://aigamedev.com/open/review/planning-in-games/[http://aigamedev.com/open/review/planning-in-games/]. 
-[Accessed March 2013]. 
+[10]  A. J. Champandard,  “Planning in Games:  An Overview
+and Lessons Learned, 2013.  [Online].  Available:
+link:http://aigamedev.com/open/review/planning-in-games/[http://aigamedev.com/open/review/planning-in-games/].
+[Accessed March 2013].
 
-[11]  A. J. Champandard,  “The Power  of Sequences for 
-Hierarchical  Behaviors, 2007.  [Online].  Available: 
-link:http://aigamedev.com/open/article/sequence/[http://aigamedev.com/open/article/sequence/]. 
-[Accessed April 2013]. 
+[11]  A. J. Champandard,  “The Power  of Sequences for
+Hierarchical  Behaviors, 2007.  [Online].  Available:
+link:http://aigamedev.com/open/article/sequence/[http://aigamedev.com/open/article/sequence/].
+[Accessed April 2013].
 
-[12]  A. J. Champandard,  “The Flexibility  of Selectors for 
-Hierarchical  Logic, 2007.  [Online].  Available: 
-link:http://aigamedev.com/open/article/selector/[http://aigamedev.com/open/article/selector/]. [Accessed 
-April 2013]. 
+[12]  A. J. Champandard,  “The Flexibility  of Selectors for
+Hierarchical  Logic, 2007.  [Online].  Available:
+link:http://aigamedev.com/open/article/selector/[http://aigamedev.com/open/article/selector/]. [Accessed
+April 2013].
 
 [13]  Looking  Glass Studios, “Thief:  The Dark  Project,
-Eidos Interactive, 1998. 
+Eidos Interactive, 1998.
 
-[14]  T. Leonard, “Building an AI Sensory System: 
+[14]  T. Leonard, “Building an AI Sensory System:
 Examining  The Design of Thief: The Dark  Project,
-2003.  [Online].  Available: 
+2003.  [Online].  Available:
 link:http://www.gamasutra.com/view/feature/131297/buildi[http://www.gamasutra.com/view/feature/131297/buildi]
-ng_an_ai_sensory_system_.php. [Accessed March 
-2013]. 
+ng_an_ai_sensory_system_.php. [Accessed March
+2013].
 
-[15]   D. Isla, “Probabilistic Target Tracking and Search 
-Using Occupancy Maps, in AI Game Programming 
-Wisdom 3, S. Rabin, Ed.,  Boston, Charles River  Media, 
+[15]   D. Isla, “Probabilistic Target Tracking and Search
+Using Occupancy Maps, in AI Game Programming
+Wisdom 3, S. Rabin, Ed.,  Boston, Charles River  Media,
 2006,  pp. 379-387.
 
-[16]  W. v. d. Sterren, “Squad Tactics: Team  AI and 
-Emergent  Maneuvers, in AI Game Programming 
-Wisdom,  S. Rabin, Ed.,  Hingham,  Charles  River Media, 
-2002,  pp. 233-246. 
+[16]  W. v. d. Sterren, “Squad Tactics: Team  AI and
+Emergent  Maneuvers, in AI Game Programming
+Wisdom,  S. Rabin, Ed.,  Hingham,  Charles  River Media,
+2002,  pp. 233-246.
 
-[17]  D. D.  Corkill,  “Blackboard Systems, 1991.  [Online]. 
-Available:  link:http://gbbopen.org/papers/ai-expert.pdf[http://gbbopen.org/papers/ai-expert.pdf]. 
-[Accessed April 2013]. 
+[17]  D. D.  Corkill,  “Blackboard Systems, 1991.  [Online].
+Available:  link:http://gbbopen.org/papers/ai-expert.pdf[http://gbbopen.org/papers/ai-expert.pdf].
+[Accessed April 2013].
 
-[18]  Monolith Productions, “F.E.A.R,  Vivendi  Universal, 
-2005. 
+[18]  Monolith Productions, “F.E.A.R,  Vivendi  Universal,
+2005.
 
-[19]  J. Orkin,  “Three States and a Plan: The A.I. of 
-F.E.A.R.,  2006.  [Online].  Available: 
+[19]  J. Orkin,  “Three States and a Plan: The A.I. of
+F.E.A.R.,  2006.  [Online].  Available:
 link:http://web.media.mit.edu/~jorkin/gdc2006_orkin_je[http://web.media.mit.edu/~jorkin/gdc2006_orkin_je] ff_f
-ear.pdf. [Accessed March 2013]. 
+ear.pdf. [Accessed March 2013].
 
-[20]  GSC  Game  World, “S.T.A.L.K.E.R.:  Shadow of 
-Chernobyl, THQ,  2007. 
+[20]  GSC  Game  World, “S.T.A.L.K.E.R.:  Shadow of
+Chernobyl, THQ,  2007.
 
-[21]  Geurrilla  Games,  “Killzone  2, Sony Computer 
-Entertainment  Europe, 2009. 
+[21]  Geurrilla  Games,  “Killzone  2, Sony Computer
+Entertainment  Europe, 2009.
 
-[22]  T. Verweij,  “A hierarchically-layered  multiplayer  bot 
-system for a first-person shooter, August 2007. 
+[22]  T. Verweij,  “A hierarchically-layered  multiplayer  bot
+system for a first-person shooter, August 2007.
 [Online].  Available: link:http://www.guerrilla[http://www.guerrilla]-
 games.com/presentations/VUA07_Verweij_Hiera rchica
-lly-Layered-MP-Bot_System.pdf.  [Accessed March 
-2013]. 
+lly-Layered-MP-Bot_System.pdf.  [Accessed March
+2013].
 
 
 == Process
 
 
-==== Tutorial timeline
+=== Tutorial timeline
 
 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
@@ -177,13 +177,13 @@ This section arrange the process and parts into a timeline to suite better with
 == Programming
 
 
-==== Core
+=== Core
 
 
 === Stage
 
 
-===== Cam
+==== Cam
 
 
 === States
@@ -213,7 +213,7 @@ This section arrange the process and parts into a timeline to suite better with
 === Activities
 
 
-===== Timed
+==== Timed
 
 
 === Probality
@@ -225,7 +225,7 @@ This section arrange the process and parts into a timeline to suite better with
 === AI Sensors
 
 
-===== Line of Sight
+==== Line of Sight
 
 link:http://www.redblobgames.com/articles/visibility/[http://www.redblobgames.com/articles/visibility/]
 
@@ -236,7 +236,7 @@ link:http://www.redblobgames.com/articles/visibility/[http://www.redblobgames.co
 === Visibility & LevelOfDetail
 
 
-===== Ranged
+==== Ranged
 
 
 ===== Piority Ordered

+ 13 - 13
src/docs/asciidoc/jme3/atomixtuts/heavenrtsgame/gameplay/detailed.adoc

@@ -1,6 +1,6 @@
 = detailed
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../../
 :imagesdir: ../../../..
@@ -19,9 +19,9 @@ To verify and unite the ideas, terms in this page I'd recommend you to read wiki
 
 Wiki: link:http://en.wikipedia.org/wiki/Real-time_strategy[http://en.wikipedia.org/wiki/Real-time_strategy]
 
-Mindmap: 
+Mindmap:
 
-Slide: 
+Slide:
 You can view full Gameplay Design document in Googledoc ( with more images, less text)
 
 
@@ -38,14 +38,14 @@ Gameplay element will lead to requirements in AI and other components. Here we l
 
 ==== Battle
 
-Battle are most obvious activities of wars and also the distinc of RTS with civilazation game genre which have slow peace and mainly in Economic. War between planets and universe races like in StarCraft or between Countries like in Age of Empires. Battle in each game have its own “style and “form, mainly cause by the theme of the game, the skills of each units, number of them and the enviroments. 
+Battle are most obvious activities of wars and also the distinc of RTS with civilazation game genre which have slow peace and mainly in Economic. War between planets and universe races like in StarCraft or between Countries like in Age of Empires. Battle in each game have its own “style and “form, mainly cause by the theme of the game, the skills of each units, number of them and the enviroments.
 
 Also we can see this gameplay element will require AI, network system to tightly corporate.
 
 
 ==== Economic
 
-Economic in RTS can be seen as “build order, “tech tree or “resource locating problem, because almost every game have economic just as secondary gameplay to support battle. 
+Economic in RTS can be seen as “build order, “tech tree or “resource locating problem, because almost every game have economic just as secondary gameplay to support battle.
 
 
 ==== Fog of war - Reconnaissance
@@ -62,7 +62,7 @@ Each race or country have its own history and agriculture which will affect asse
 === RTS Core
 
 
-===== Player
+==== Player
 
 Every player have an Account that they can use to log in to lobby and find Game and invite other Players to join a hosted Match
 
@@ -79,7 +79,7 @@ We have 3 Races : Human, Mech (as Protos), Bug (as Zerg). Their have different S
 
 ===== Game
 
-A Game start with basic pieces: Players attented, a Level(Map), a GameplayType and Goal. 
+A Game start with basic pieces: Players attented, a Level(Map), a GameplayType and Goal.
 
 
 ===== Level (Map)
@@ -99,7 +99,7 @@ link:http://en.wikipedia.org/wiki/Technology_tree[http://en.wikipedia.org/wiki/T
 === Actions & routines
 
 
-===== Game routines
+==== Game routines
 
 In the Game, various of GameActions are taken by Players to envolve the game. Beside of that the Level also offer specific Rountines.
 
@@ -122,7 +122,7 @@ In general speaking, it provides more GameActions, then in turn expand the TechT
 
 Fights happend when you attack your Enemies targets: Unit and Building. The results are:
 
-*  Your units get damaged , get killed or kill others. 
+*  Your units get damaged , get killed or kill others.
 *  Building get damaged or destroyed.
 
 More aspects of a fight should be concern is range, type of an Attack, abilities to defend againts each Attack. About visual aspects, different skills appear as different effects.
@@ -144,7 +144,7 @@ The final conclusion of the game (gameover) is reached as one Team complete the
 === GameplayType - Objectives & Goals
 
 
-===== Defeat enemies
+==== Defeat enemies
 
 By default, a game normally ended when a team defeat all it enemies, as they killed and destroyed all/every or almost opponents units/constructions. Or in some games, win-lose declared as the MainHouse is destroyed.
 
@@ -177,7 +177,7 @@ The rising gameplay recently ( ehr, not really :p ) …
 === Devices & Inputs & Controls
 
 
-===== PC
+==== PC
 
 
 ===== Mouse & Keyboards
@@ -190,7 +190,7 @@ The rising gameplay recently ( ehr, not really :p ) …
 === More Gameplay aspects
 
 
-===== Economy
+==== Economy
 
 In Age of Empire (few others), when you just focus in expanding your empire without fighting and the game said that you reach a limit, where you can not expand your economic base futher. Consider this point, you will see the different between RTS game and the game genre just focus in building things in long term like civilazation and city tycoons.
 

+ 1 - 1
src/docs/asciidoc/jme3/beginner/hello_animation.adoc

@@ -158,7 +158,7 @@ After you load the animated model, you register it to the Animation Controller.
 
 ----
 
-This line of code will return NULL if the AnimeControl is not in the main node of your model.
+This line of code will return NULL if the AnimControl is not in the main node of your model.
 
 [source,java]
 ----

+ 46 - 60
src/docs/asciidoc/jme3/beginner/hello_asset.adoc

@@ -1,10 +1,11 @@
 = jMonkeyEngine 3 Tutorial (3) - Hello Assets
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: beginner, intro, documentation, lightnode, material, model, node, gui, hud, texture
 :relfileprefix: ../../
 :imagesdir: ../..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
@@ -20,7 +21,7 @@ image::jme3/beginner/beginner-assets-models.png[beginner-assets-models.png,320,2
 
 [TIP]
 ====
-<<sdk/sample_code#,Trouble finding the files to run this sample?>> To get the assets (3D models) used in this example, add the included `jME3-testdata.jar` to your classpath. In project created with the jMonkeyEngine SDK (recommended), simply right-click your project, choose “Properties, go to “Libraries, press “Add Library and add the preconfigured “jme3-test-data library. 
+<<sdk/sample_code#,Trouble finding the files to run this sample?>> To get the assets (3D models) used in this example, add the included `jME3-testdata.jar` to your classpath. In project created with the jMonkeyEngine SDK (recommended), simply right-click your project, choose “Properties, go to “Libraries, press “Add Library and add the preconfigured “jme3-test-data library.
 ====
 
 
@@ -41,7 +42,7 @@ import com.jme3.scene.Geometry;
 import com.jme3.scene.Spatial;
 import com.jme3.scene.shape.Box;
 
-/** Sample 3 - how to load an OBJ model, and OgreXML model, 
+/** Sample 3 - how to load an OBJ model, and OgreXML model,
  * a material/texture, or text. */
 public class HelloAssets extends SimpleApplication {
 
@@ -54,7 +55,7 @@ public class HelloAssets extends SimpleApplication {
     public void simpleInitApp() {
 
         Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.obj");
-        Material mat_default = new Material( 
+        Material mat_default = new Material(
             assetManager, "Common/MatDefs/Misc/ShowNormals.j3md");
         teapot.setMaterial(mat_default);
         rootNode.attachChild(teapot);
@@ -62,9 +63,9 @@ public class HelloAssets extends SimpleApplication {
         // Create a wall with a simple texture from test_data
         Box box = new Box(2.5f,2.5f,1.0f);
         Spatial wall = new Geometry("Box", box );
-        Material mat_brick = new Material( 
+        Material mat_brick = new Material(
             assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
-        mat_brick.setTexture("ColorMap", 
+        mat_brick.setTexture("ColorMap",
             assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
         wall.setMaterial(mat_brick);
         wall.setLocalTranslation(2.0f,-2.5f,0.0f);
@@ -99,19 +100,19 @@ Build and run the code sample. You should see a green Ninja with a colorful teap
 
 == The Asset Manager
 
-*By game assets we mean all multi-media files, such as models, materials, textures, whole scenes, custom shaders, music and sound files, and custom fonts.* JME3 comes with a handy AssetManager object that helps you access your assets. 
+*By game assets we mean all multi-media files, such as models, materials, textures, whole scenes, custom shaders, music and sound files, and custom fonts.* JME3 comes with a handy AssetManager object that helps you access your assets.
 The AssetManager can load files from:
 
-*  the current classpath (the top level of your project directory), 
+*  the current classpath (the top level of your project directory),
 *  the `assets` directory of your project, and
 *  optionally, custom paths that you register.
 
-The following is the recommended directory structure for storing assets in your project directoy: 
+The following is the recommended directory structure for storing assets in your project directoy:
 
 [source]
 ----
 
-MyGame/assets/               
+MyGame/assets/
 MyGame/assets/Interface/
 MyGame/assets/MatDefs/
 MyGame/assets/Materials/
@@ -139,9 +140,9 @@ Place your textures in a subdirectory of `assets/Textures/`. Load the texture in
 // Create a wall with a simple texture from test_data
 Box box = new Box(2.5f,2.5f,1.0f);
 Spatial wall = new Geometry("Box", box );
-Material mat_brick = new Material( 
+Material mat_brick = new Material(
     assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
-mat_brick.setTexture("ColorMap", 
+mat_brick.setTexture("ColorMap",
     assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
 wall.setMaterial(mat_brick);
 wall.setLocalTranslation(2.0f,-2.5f,0.0f);
@@ -149,7 +150,7 @@ rootNode.attachChild(wall);
 
 ----
 
-In this case, you <<jme3/beginner/hello_material#,create your own Material>> and apply it to a Geometry. You base Materials on default material descriptions (such as “Unshaded.j3md), as shown in this example. 
+In this case, you <<jme3/beginner/hello_material#,create your own Material>> and apply it to a Geometry. You base Materials on default material descriptions (such as “Unshaded.j3md), as shown in this example.
 
 
 === Loading Text and Fonts
@@ -201,7 +202,7 @@ Note that you do not need to create a Material if you exported the model with a
 
 === Loading Assets From Custom Paths
 
-What if your game relies on user supplied model files, that are not included in the distribution? If a file is not located in the default location (e.g. assets directory), you can register a custom Locator and load it from any path. 
+What if your game relies on user supplied model files, that are not included in the distribution? If a file is not located in the default location (e.g. assets directory), you can register a custom Locator and load it from any path.
 
 Here is a usage example of a ZipLocator that is registered to a file `town.zip` in the top level of your project directory:
 
@@ -220,47 +221,35 @@ Here is a HttpZipLocator that can download zipped models and load them:
 ----
 
     assetManager.registerLocator("https://storage.googleapis.com/"
-            + "google-code-archive-downloads/v2/code.google.com/" 
+            + "google-code-archive-downloads/v2/code.google.com/"
             + "jmonkeyengine/wildhouse.zip", HttpZipLocator.class);
     Spatial scene = assetManager.loadModel("main.scene");
     rootNode.attachChild(scene);
 
 ----
 
-JME3 offers ClasspathLocator, ZipLocator, FileLocator, HttpZipLocator, and UrlLocator (see `com.jme3.asset.plugins`). 
+JME3 offers ClasspathLocator, ZipLocator, FileLocator, HttpZipLocator, and UrlLocator (see `com.jme3.asset.plugins`).
 
 
 == Creating Models and Scenes
 
-To create 3D models and scenes, you need a 3D Mesh Editor. If you don't have any tools, install Blender and the OgreXML Exporter plugin. 
+To create 3D models and scenes, you need a 3D Mesh Editor. If you don't have any tools, install Blender and the OgreXML Exporter plugin.
 Then you link:http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/UV_Map_Basics[create fully textured models (e.g. with Blender)] and export them to your project.
-Then you use the <<sdk#,SDK>> to <<sdk/model_loader_and_viewer#,load models>>, <<sdk/blender#,convert models>>, and <<sdk/scene_composer#,create 3D scenes>> from them. 
+Then you use the <<sdk#,SDK>> to <<sdk/model_loader_and_viewer#,load models>>, <<sdk/blender#,convert models>>, and <<sdk/scene_composer#,create 3D scenes>> from them.
 
-*Example:* From Blender, you export your models as Ogre XML meshes with materials as follows:
-
-.  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 texture files.
-.  In the Export Meshes field: Select a 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.
+See <<jme3/advanced/3d_models#creating-models-and-scenes#,creating models and scenes>> for an example on how to export your models as Ogre XML meshes with materials.
 
 
 === Model File Formats
 
 JME3 can convert and load
 
-*  Ogre XML models + materials, 
-*  Ogre DotScenes, 
-*  Wavefront OBJ + MTL models, 
+*  Ogre XML models + materials,
+*  Ogre DotScenes,
+*  Wavefront OBJ + MTL models,
 *  .Blend files.
 
-The `loadModel()` method loads these original file formats when you run your code directly from the SDK. If you however build the executables using the default build script, then the original model files (XML, OBJ, etc) _are not included_. This means, when you run the executable outside the SDK, and load any original models directly, you get the following error message: 
+The `loadModel()` method loads these original file formats when you run your code directly from the SDK. If you however build the executables using the default build script, then the original model files (XML, OBJ, etc) _are not included_. This means, when you run the executable outside the SDK, and load any original models directly, you get the following error message:
 
 [source]
 ----
@@ -278,9 +267,9 @@ But for QA test builds and for the final release build, you use *.j3o files* exc
 
 Open your JME3 Project in the jMonkeyEngine SDK.
 
-.  Right-click a .Blend, .OBJ, or .mesh.xml file in the Projects window, and choose “convert to JME3 binary. 
-.  The .j3o file appears next to the .mesh.xml file and has the same name. 
-.  Update all your `loadModel()` lines accordingly. For example: 
+.  Right-click a .Blend, .OBJ, or .mesh.xml file in the Projects window, and choose “convert to JME3 binary.
+.  The .j3o file appears next to the .mesh.xml file and has the same name.
+.  Update all your `loadModel()` lines accordingly. For example:
 +
 [source,java]
 ----
@@ -288,23 +277,22 @@ Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.j3o");
 ----
 
 
-
 [TIP]
 ====
 If your executable throws a “Cannot locate resource runtime exception, check all load paths and make sure you have converted all models to .j3o files!
 ====
 
 
-
 === Loading Models and Scenes
-[cols="30,70", options="header"]
+[cols="15,85", options="header"]
 |===
 
-a| Task? 
-a| Solution! 
+a| Task?
+a| Solution!
+
+a| Load model W/ materials
+a| Use the asset manager's `loadModel()` method and attach the Spatial to the rootNode.
 
-a| Load a model with materials 
-a| Use the asset manager's `loadModel()` method and attach the Spatial to the rootNode. 
 [source,java]
 ----
 Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
@@ -317,9 +305,9 @@ Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.j3o");
 rootNode.attachChild(elephant);
 ----
 
+a| Load model W/O materials
+a| If you have a model without materials, you have to give it a material to make it visible.
 
-a| Load a model without materials 
-a| If you have a model without materials, you have to give it a material to make it visible. 
 [source,java]
 ----
 Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.j3o");
@@ -328,9 +316,9 @@ teapot.setMaterial(mat);
 rootNode.attachChild(teapot);
 ----
 
+a| Load a scene
+a| You load scenes just like you load models:
 
-a| Load a scene 
-a| You load scenes just like you load models: 
 [source,java]
 ----
 Spatial scene = assetManager.loadModel("Scenes/town/main.scene");
@@ -342,8 +330,6 @@ rootNode.attachChild(scene);
 Spatial scene = assetManager.loadModel("Scenes/town/main.j3o");
 rootNode.attachChild(scene);
 ----
-
-
 |===
 
 
@@ -351,9 +337,9 @@ rootNode.attachChild(scene);
 
 As an exercise, let's try different ways of loading a scene. You will learn how to load the scene directly, or from a zip file.
 
-.  link:https://github.com/jMonkeyEngine/wiki/raw/master/src/docs/resources/Scenes/Town/town.zip[Download the town.zip] sample scene. 
+.  link:https://github.com/jMonkeyEngine/wiki/raw/master/src/docs/resources/Scenes/Town/town.zip[Download the town.zip] sample scene.
 .  (Optional:) Unzip the town.zip to see the structure of the contained Ogre dotScene: You'll get a directory named `town`. It contains XML and texture files, and file called main.scene. (This is just for your information, you do not need to do anything with it.)
-.  Place the town.zip file in the top level directory of your JME3 project, like so: 
+.  Place the town.zip file in the top level directory of your JME3 project, like so:
 +
 [source]
 ----
@@ -369,7 +355,7 @@ jMonkeyProjects/MyGameProject/town.zip
 Use the following method to load models from a zip file:
 
 .  Verify `town.zip` is in the project directory.
-.  Register a zip file locator to the project directory: Add the following code under `simpleInitApp() {`
+.  Register a zip file locator to the project directory: Add the following code under `simpleInitApp()`.
 +
 [source,java]
 ----
@@ -384,7 +370,7 @@ The loadModel() method now searches this zip directly for the files to load. +
 (This means, do not write `loadModel(town.zip/main.scene)` or similar!)
 
 .  Clean, build and run the project. +
-You should now see the Ninja+wall+teapot standing in a town. 
+You should now see the Ninja+wall+teapot standing in a town.
 
 [TIP]
 ====
@@ -395,7 +381,7 @@ Earlier in this tutorial, you loaded scenes and models from the asset directory.
 
 .  Remove the code that you added for the previous exercise.
 .  Move the unzipped `town/` directory into the `assets/Scenes/` directory of your project.
-.  Add the following code under `simpleInitApp() {` 
+.  Add the following code under `simpleInitApp()`.
 +
 [source,java]
 ----
@@ -408,13 +394,13 @@ Earlier in this tutorial, you loaded scenes and models from the asset directory.
 Note that the path is relative to the `assets/…` directory.
 
 .  Clean, build and run the project. +
-Again, you should see the Ninja+wall+teapot standing in a town. 
+Again, you should see the Ninja+wall+teapot standing in a town.
 
 Here is a third method you must know, loading a scene/model from a .j3o file:
 
 .  Remove the code from the previous exercise.
 .  If you haven't already, open the <<sdk#,SDK>> and open the project that contains the HelloAsset class.
-.  In the projects window, browse to the `assets/Scenes/town` directory. 
+.  In the projects window, browse to the `assets/Scenes/town` directory.
 .  Right-click the `main.scene` and convert the scene to binary: The jMonkeyPlatform generates a main.j3o file.
 .  Add the following code under `simpleInitApp() {`
 +
@@ -429,7 +415,7 @@ Here is a third method you must know, loading a scene/model from a .j3o file:
 Again, note that the path is relative to the `assets/…` directory.
 
 .  Clean, Build and run the project. +
-Again, you should see the Ninja+wall+teapot standing in a town. 
+Again, you should see the Ninja+wall+teapot standing in a town.
 
 
 == Conclusion

+ 49 - 1
src/docs/asciidoc/jme3/beginner/hello_simpleapplication.adoc

@@ -221,6 +221,53 @@ A typical JME3 game has the following initialization process:
 
 
 
+=== The Future of SimpleApplication
+
+
+There are plans to change SimpleApplication. Sometime back it was decided that we should really re-factor the Application class. SimpleApplication especially is a mess of 'magic' protected fields that on the one hand makes it really easy to slam some simple one-class application together, but on the other hand does new users no favors because they have no idea where 'cam' and 'assetManager' come from. Unfortunately, lots of code refers to Application and it's tough to change... especially the app states.
+
+So, we hatched a plan to convert the Application class to an interface. This would give us some freedom to iterate on a new set of application base classes. You can read about the changes link:https://hub.jmonkeyengine.org/t/jmonkeyengine-3-1-alpha-4-released/35478[here]. As said before we are envisioning a better design that is not enforced today, but that is already usable. 
+
+If you look at SimpleApplication default constructor you will understand how it works.
+
+[source,java]
+----
+public SimpleApplication() {    
+    this(new StatsAppState(), new FlyCamAppState(), new AudioListenerState(), new DebugKeysAppState());}
+----
+
+Basically the application is injected upon construction with the default AppStates. Let's look at the second constructor.
+
+[source,java]
+----
+public SimpleApplication( AppState... initialStates ) {    
+    super(initialStates);
+}
+----
+
+It allows you to specify what AppState you want for your application. So SimpleApplication is handy for test projects (I very often use it as is) but I recommend for a full blown-game to use it like this:
+
+[source,java]
+----
+public class MyGame extends SimpleApplication {
+    
+    public MyGame(){
+         super(new MyCustomSate(), new AnotherState(), ....);
+    }
+
+    public static void main(String[] args) {
+        MyGame app = new MyGame();
+        app.start();
+    }
+
+}
+----
+
+Then have all logic implemented in <<jme3/advanced/application_states#,AppStates>> and your SimpleApplication will never change much, except when you want to add a bootstrap AppState (or maybe you can have an AppState that manages AppStates...), SimpleApplication is just the list of states you are using.
+
+In future versions, all the code in SimpleApplication will be refactored in AppStates (InputHandlingState, RenderAppState, whatever) and you will decide what you want to use. However, for legacy sake we kept the code as is for now.
+
+
 == Conclusion
 
 You have learned that a SimpleApplication is a good starting point because it provides you with:
@@ -245,4 +292,5 @@ See also:
 
 *  <<documentation#,Install the jMonkeyEngine>>
 *  <<jme3/simpleapplication_from_the_commandline#,SimpleApplication From the Commandline>>
-*  <<sdk/project_creation#,Create a JME3 project>>.
+*  <<sdk/project_creation#,Create a JME3 project>>
+*  <<jme3/advanced/application_states#,AppStates>>

+ 77 - 17
src/docs/asciidoc/jme3/build_from_sources.adoc

@@ -1,6 +1,6 @@
 = Building jMonkeyEngine 3 from the Sources
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, install
 :relfileprefix: ../
@@ -8,35 +8,95 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-We recommend downloading the link:https://github.com/jMonkeyEngine/sdk/releases/tag/stable[jMonkeyEngine SDK] - but of course you can also build the jMonkeyEngine yourself from the sources. In this case, you need the link:http://subversion.tigris.org[Subversion] file version system installed (svn).
+== Foreword
 
-.  *Checkout:* Checkout the Subversion repository.
+Please understand that this tutorial gives you access to the latest development release of the engine. Whilst many developers use this release to work with, it is by definition still being developed. Expect bleeding edge implementations to need work. If you don’t want that kind of hassle, please use the <<jme3/maven#,stable releases>>.
+
+
+== Build jMonkeyEngine from Github source.
+
+Here is the basic outline of our goal:
+
+.  Install git client.
+.  Download jMonkeyEngine using git-client.
+.  Update jMonkeyEngine using git-client.
+.  Build jMonkeyEngine locally using gradle.
+
+Repeat steps 3 and 4 whenever any changes have been committed to the master branch.
+
+. Install Git Client: +
+website: link:https://git-scm.com/downloads[https://git-scm.com/downloads]
+
+Now we need to get the engine source using the git client and build it locally. There are 3 batch files below provided for convenience (download, update, build) and can all be placed in the same directory and run without administrator privileges. For example, you can put all of these files into `D:\programming\` - and the scripts will create, download and update files in the `./jmonkeyengine/` sub-directory.
+
+[start=2]
+.  Download the Engine: `download.bat` +
+ This file downloads the engine into a dir called "`jmonkey`" using the git client.
+.  Update the Engine: `update.bat` +
+ This file downloads any changed files from github using the git client.
+.  Build the Engine: `build.bat` +
+ This file builds the engine using the gradle wrapper and places them in your local repository.
 +
-[source]
+--
+NOTE: This is USER-SPECIFIC. My files are stored in `C:\Users\James\.m2\repository`
+
+link:https://gist.github.com/jayfella/12af46c2fc4650640652b69b84b3dd01[https://gist.github.com/jayfella/12af46c2fc4650640652b69b84b3dd01]
+
+.download.bat
 ----
-svn checkout http://jmonkeyengine.googlecode.com/svn/branches/3.0final/engine jme3
+@echo off
+echo "downloading engine..."
+git clone -b master --single-branch --depth 10 https://github.com/jMonkeyEngine/jMonkeyEngine/ jmonkeyengine
 ----
 
-**  You can leave login and password empty
+.build.bat
+----
+@echo off
+
+echo "Building JME engine to your local maven repo...."
+cd jmonkeyengine
+gradlew.bat -PbuildJavaDoc=true install
+cd ..
+
+cmd /k
+----
+
+.update.bat
+----
+@echo off
+cd jmonkeyengine
+git pull
+cd ..
+cmd /k
+----
+--
 
-.  *Build:* Execute `ant jar`
-**  This compiles the JAR files in `dist/libs/*`
+== Using the built engine in your game
 
-.  *Javadoc:* Execute `ant javadoc` 
-**  This generates javadocs in the `dist/javadoc` directory.
+Add the maven plugin to your build script, and put the mavenLocal() repository in your list of repositories. Then just reference the dependencies as you would normally. Note that we are now using version 3.2.+ of the engine.
 
-.  *Run:* Execute `ant run`
-**  This runs the TestChooser where you can browse examples.
+----
+apply plugin: 'maven'
 
-.  *Use:* Create a Java SE project and place all JARs from the `dist/lib` directory on the classpath.
-**  You can now extend your first game from `com.jme3.app.SimpleApplication`. 
+ext.jmeVersion = "[3.2,)"
 
+repositories {
+    mavenLocal()
+    jcenter()
+}
+
+dependencies {
+    compile "org.jmonkeyengine:jme3-core:$jmeVersion"
+    compile "org.jmonkeyengine:jme3-desktop:$jmeVersion"
+    compile "org.jmonkeyengine:jme3-lwjgl:$jmeVersion"
+}
+----
 
-For a detailed description of the created jar files see <<jme3/jme3_source_structure#structure_of_jmonkeyengine3_jars,this list>>.
+//For a detailed description of the created jar files see <<jme3/jme3_source_structure#structure_of_jmonkeyengine3_jars,this list>>.
 
 '''
 
 Learn more about:
 
 *  <<jme3/simpleapplication_from_the_commandline#,Setting up JME3 on the commandline (generic)>>.
-*  <<jme3/build_jme3_sources_with_netbeans#,Building JME3 from the sources with NetBeans>> 
+*  <<jme3/build_jme3_sources_with_netbeans#,Building JME3 from the sources with NetBeans>>

+ 136 - 63
src/docs/asciidoc/jme3/build_jme3_sources_with_netbeans.adoc

@@ -1,95 +1,168 @@
-= Setting up JME3 in Netbeans 6+
-:author: 
-:revnumber: 
+= Building JME3 from Sources in Netbeans 8.x
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, install
 :relfileprefix: ../
 :imagesdir: ..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-You are welcome to try out the new jME3, and contribute patches and features! This document shows how to download, set up, build, and run the latest development version from the sources. These instructions work in NetBeans IDE 6 or better.
+You are welcome to try out the new jME3, and contribute patches and features! This document shows how to download, set up, build, and run the latest development version from the sources. These instructions work in NetBeans IDE 8.x or better.
 
-Note: In the following, always replace “~ with the path to your home directory.
+.Prerequisites
+.  Have a link:https://github.com/[GitHub account].
+.  Are a jMonkeyEngine project member.
+
+If you are not a member, you fork the repository into your GitHub account and issue pull requests from there.
+
+To fork the jMonkeyEngine repository into your GitHub Account:
+
+.  Navigate to link:https://github.com/jMonkeyEngine/jmonkeyengine[https://github.com/jMonkeyEngine/jmonkeyengine].
+.  In the menu at the top of the page, select the icon:code-fork[]*Fork* button.
+
+
+NOTE: In the following, always replace kbd:[~] with the path to your home directory.
 
 
 == Downloading the Sources
 
-Check out the sources from the repository. (The following NetBeans instructions are equivalent to executing `cd ~/NetBeansProjects; svn checkout link:http://jmonkeyengine.googlecode.com/svn/branches/3.0final/engine[http://jmonkeyengine.googlecode.com/svn/branches/3.0final/engine] jme3` on the commandline.)
-
-.  In NetBeans go to Team &gt; Subversion &gt; Checkout
-..  Repository +++<abbr title="Uniform Resource Locator">URL</abbr>+++: `link:https://jmonkeyengine.googlecode.com/svn[https://jmonkeyengine.googlecode.com/svn]`
-..  You can leave user/pw blank for anonymous access. 
-
-.  Click Next
-..  Repository Folders: `branches/3.0final/engine`
-..  Enable the checkbox to Skip “engine and only checkout its contents.
-..  Local Folder: `~/NetBeansProjects/jme3`
-
-.  Click Finish and wait.
-
-The jme3 project opens in the Project window. It already includes a working ANT build script for building and running.
-
-Look into the Libraries node and confirm that the project depends on the following libraries in the classpath:
-
-*  j-ogg-oggd.jar        
-*  j-ogg-vorbisd.jar       
-*  jbullet.jar	         
-*  stack-alloc.jar
-*  vecmath.jar     
-*  lwjgl.jar       
-*  jME3-lwjgl-natives.jar	
-*  jinput.jar	
-*  eventbus.jar
-*  nifty-default-controls.jar                              
-*  nifty-examples.jar                              
-*  nifty-style-black.jar                              
-*  nifty.jar
-*  jglfont-core.jar                              
-*  xmlpull-xpp3.jar
-*  android.jar
-*  jME3-bullet-natives.jar
-*  gluegen-rt.jar
-*  joal.jar
-*  jogl-all.jar
-*  jME3-natives-joal.jar
-*  jME3-openal-soft-natives-android.jar
+Clone the sources from the repository.
+
+.  In NetBeans, go to `menu:Team[Git>Clone]`.
+..  Repository +++<abbr title="Uniform Resource Locator">URL</abbr>+++:
++
+--
+----
+https://github.com/jMonkeyEngine/jmonkeyengine
+----
+
+IMPORTANT: Use the +++<abbr title="Uniform Resource Locator">URL</abbr>+++ to your repository fork and clone your fork if a non-member and you wish to contribute.
+--
+
+..  You can leave user/pw blank for anonymous access unless you are going to `push` a `commit`.
+..  Specify Destination Folder. +
+Local Folder: `~/NetBeansProjects]/jmonkeyengine`
+..  Click btn:[Next].
+.  Select:
+* [x] master*
+..  Click btn:[Next].
+.  Verify the auto-fill information in the `Destination Directory` dialog is correct.
+..  Optional:
+* [ ] Scan for NetBeans Projects after Clone
+..  Click btn:[Finish] and wait.
+
+After some time the download will end.
+
+
+== Information on Pull/Pushing Commits
+
+
+You now have a local copy of the `jmonkeyengine` repository. There are a few rules you need to follow in order to contribute.
+
+.Members & Non-Members Pull/Push
+Update your local copy and push commits by using the NetBeans command `menu:Git[Remote>Pull From Upstream]` or `menu:Git[Remote>Push To Upstream]`.
+
+.Non-Members
+To update *your fork* on GitHub:
+
+.  Go to your version of the repository on GitHub.
+.  Click the btn:[New Pull Request] button at the top.
+.  Note that the jMonkeyEngine repository will be on the left and your repository will be on the right.
+.  Click the btn:[Base Fork] button and from the drop down menu select your forked repository.
+.  Select the "`compare across forks`" link.
+.  Click the btn:[Head Fork] button and from the drop down list select "`jMonkeyEngine/jmonkeyengine`".
+.  Click the green button btn:[Create pull request].
+
+To submit changes to the jMonkeyEngine repository after pushing them to *your fork*:
+
+.  Go to your version of the repository on GitHub.
+.  Click the btn:[New Pull Request] button at the top.
+.  Note that the jMonkeyEngine repository will be on the left and your repository will be on the right.
+.  Click the green button btn:[Create pull request]. Give a succinct and informative title, in the comment field give a short explanation of the changes and click the green button btn:[Create pull request] again.
+
+.Everyone
+NOTE: See  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/CONTRIBUTING.md[How to contribute to jMonkeyEngine] before submitting a P/R.
+
+
+== Verify Cloned Subprojects
+
+Look into the `Subprojects` node and confirm that the subprojects cloned:
+
+*  jme3-android
+*  jme3-android-native
+*  jme3-blender
+*  jme3-bullet
+*  jme3-bullet-native
+*  jme3-bullet-native-android
+*  jme3-core
+*  jme3-desktop
+*  jme3-effects
+*  jme3-examples
+*  jme3-ios
+*  jme3-jbullet
+*  jme3-jogg
+*  jme3-jogl
+*  jme3-lwjgl
+*  jme3-lwjgl3
+*  jme3-networking
+*  jme3-niftygui
+*  jme3-plugins
+*  jme3-terrain
+*  jme3-testdata
+*  jme3-vr
 
 For a detailed description of the separate jar files see <<jme3/jme3_source_structure#structure_of_jmonkeyengine3_jars,this list>>.
 
 
 == Build the Project and Run a Sample App
 
-.  Right-click the jme3 project node and “Clean and Build the project.
-.  In the Projects window, open the `Test` folder which contains the sample apps.
-.  Every file with a Main class (for example `jme3test.model/TestHoverTank.java` or `jme3test.game/CubeField.java`) is an app.
-.  Right-click a sample app and choose “Run File (Shift-F6).
+[CAUTION]
+====
+When you build the engine from the root node, part of the build process includes building the header files for the jme3-bullet-native subproject. This updates the timestamp on the header files, even though you did not edit them. This will then mark them as modified, which will add them to your next commit.
+
+To prevent them from being commited, before you do anything else:
+
+.  In the Projects window, open the `jme3-bullet-native` subproject node.
+.  Navigate to the `Source Packages/<default package>` folder.
+.  Select all `.h` header files to highlight them.
+.  btn:[RMB] select the highlighted files then choose `menu:Git[Ignore>Exclude From Commit]`
+====
+
+.  btn:[RMB] select the `jmonkeyengine` project root node and `Clean and Build` the project.
+.  In the Projects window, btn:[RMB] select and then open the `jme-examples` node which contains the sample apps. You do this for any subproject you wish to make changes to.
+.  Every file in the `Source Packages` folder with a Main class (for example `jme3test.model/TestHoverTank.java` or `jme3test.games/CubeField.java`) is an app.
+.  Right-click a sample app and choose "`Run File`" (Shift-F6).
 .  Generally in sample apps:
 ..  the mouse and the WASD keys control movement
 ..  the Esc key exits the application
 
-
+TIP: You can btn:[RMB] select the `jme-examples` node and select `Run` to start the `Test Chooser` app whether or not you open the project node.
 
 == Optional: Javadoc Popups and Source Navigation in NetBeans
 
-If you are working on the jme3 sources:
+If you are working on the jmonkeyengine sources:
 
-.  In the Projects window, right-click the jme3 project and choose Generate Javadoc. Wait.
-.  Confirm in the Files window that the javadoc has been created in `~/NetBeansProjects/jme3/dist/javadoc`
-.  In the editor, place the caret in a jme class and press ctrl-space to view javadoc.
+.  Confirm in the Files window that the javadoc has been created in `~/NetBeansProjects/jmonkeyengine/dist/javadoc`
+.  In the editor, place the caret in a jme class and press kbd:[ctrl]-kbd:[space] to view javadoc.
 
-If you are working on a game project that depends on jme3:
+If you are working on a game project that depends on jmonkeyengine:
 
-.  First follow the previous tip. (In the future, we may offer jme javadoc as download instead.)
-.  In your game project, right-click the Libraries node and choose “Properties.
-.  In the Library properties, select jme3.jar and click the Edit button.
-..  For the Javadoc field, browse to `~/NetBeansProjects/jme3/dist/javadoc`. Check “as relative path and click select.
-..  For the Sources field, browse to `~/NetBeansProjects/jme3/src`. Check “as relative path and click select.
-..  Click OK.
-
-.  In the editor, place the caret in a jme class and press ctrl-space to view javadoc. Ctrl-click any jme3 method to jump to its definition in the sources. 
+.  In the jmonkeyengine source:
+..  btn:[RMB] selecting a subproject node and choosing `menu:Tasks[install]` will install the built jars for that subproject into your local maven repositories `org.jmonkeyengine` folder, which on linux is ~/.m2, and on Windows might be in AppData, or in your home directory.
+..  btn:[RMB] selecting the root node and choosing `menu:Tasks[dist]` creates a jME3 examples distribution with all jme3 binaries, javadoc and external libraries under `~/NetBeansProjects/jmonkeyengine/dist`.
+.. btn:[RMB] selecting the root node and choosing `menu:Tasks[libDist]` builds and copies the engine binaries and sources to `~/NetBeansProjects/jmonkeyengine/build/libDist`.
+..  btn:[RMB] selecting the root node and choosing `menu:Tasks[copyLib]` copies the engine dependencies to `~/NetBeansProjects/jmonkeyengine/build/libDist/lib-ext`.
+.  In your game project, add the jme3 jar by btn:[RMB] selecting the Libraries node and selecting btn:[Add Jar/Folder].
+.  Navigate to the folder of choice and select the library jar you're interested in.  Check "`as relative path`" and click btn:[Open] .
+.  btn:[RMB] select the newly added jar and choose "`Edit`".
+.  In the `Edit Jar Reference` dialog, `JavaDoc:` btn:[Browse] to the `javadoc/` folder of choice. Check "`as relative path`" and click btn:[Open] .
+.  In the `Edit Jar Reference` dialog, `Sources:` btn:[Browse] to the folder of choice that contains your sources. Check "`as relative path`" and click btn:[Open].
+.  In the editor, place the caret in a jme class and press kbd:[ctrl]-kbd:[space] to view javadoc. Ctrl-click any jme3 method to jump to its definition in the sources.
 
 This tip works for any third-party JAR library that you use. (You may have to download the javadoc/sources from their home page separately).
+
 '''
 
-Sources used: link:http://code.google.com/p/jmonkeyengine/wiki/BuildJme3[BuildJme3], link:http://www.jmonkeyengine.com/forum/index.php?topic=13108.0[NetBeans tutorial from forum]
+Sources used: https://github.com/jMonkeyEngine/jmonkeyengine[https://github.com/jMonkeyEngine/jmonkeyengine]

+ 45 - 51
src/docs/asciidoc/jme3/contributions.adoc

@@ -1,6 +1,6 @@
 = Contributions
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../
 :imagesdir: ..
@@ -31,12 +31,6 @@ A collection of jME libraries and assets by David Bernard:
 link:https://bintray.com/jmonkeyengine/contrib[https://bintray.com/jmonkeyengine/contrib]
 
 
-== Subversion Repo
-
-This seems to be the main repository for jME SDK plugins:
-link:https://code.google.com/p/jmonkeyplatform-contributions/source/browse/#svn%2Ftrunk[https://code.google.com/p/jmonkeyplatform-contributions/source/browse/#svn%2Ftrunk]
-
-
 == Forum: Contributions
 
 This is the forum category where you can find other people's contributions or present your own contribution:
@@ -45,15 +39,15 @@ link:http://hub.jmonkeyengine.org/c/contribution-depot-jme3[http://hub.jmonkeyen
 
 == Other Repos
 
-There are other repositories for code sources. A list of weblinks follows: 
+There are other repositories for code sources. A list of weblinks follows:
 
-*  link:http://sourceforge.net/projects/jmonkeycsg/[http://sourceforge.net/projects/jmonkeycsg/] 
+*  link:http://sourceforge.net/projects/jmonkeycsg/[http://sourceforge.net/projects/jmonkeycsg/]
 *  link:https://github.com/davidB/jme3_skel[https://github.com/davidB/jme3_skel]
 
 
 == Frameworks
 
-These are premade classes/functionalities that you can use. 
+These are premade classes/functionalities that you can use.
 
 
 === ImagePainter
@@ -66,17 +60,17 @@ A fairly complete set of painting tools for editing jME3 Images from code.
 [cols="2", options="header"]
 |===
 
-a| *Contact person* 
-a| link:https://hub.jmonkeyengine.org/users/zarch/activity[zarch] 
+a| *Contact person*
+a| link:https://hub.jmonkeyengine.org/users/zarch/activity[zarch]
 
-a| *Documentation* 
-a| link:https://hub.jmonkeyengine.org/t/image-painter-plugin-available/24255[Forum Post, full javadoc in plugin] 
+a| *Documentation*
+a| link:https://hub.jmonkeyengine.org/t/image-painter-plugin-available/24255[Forum Post, full javadoc in plugin]
 
-a| *Available as SDK plugin* 
-a| Yes 
+a| *Available as SDK plugin*
+a| Yes
 
-a| *Work in progress* 
-a| No 
+a| *Work in progress*
+a| No
 
 |===
 
@@ -91,17 +85,17 @@ A Native +++<abbr title="Graphical User Interface">GUI</abbr>+++ Library for JME
 [cols="2", options="header"]
 |===
 
-a| *Contact person* 
-a| link:https://hub.jmonkeyengine.org/users/t0neg0d/activity[t0neg0d] 
+a| *Contact person*
+a| link:https://hub.jmonkeyengine.org/users/t0neg0d/activity[t0neg0d]
 
-a| *Documentation* 
-a| <<jme3/contributions/tonegodgui#,Wiki Page>> 
+a| *Documentation*
+a| <<jme3/contributions/tonegodgui#,Wiki Page>>
 
-a| *Available as SDK plugin* 
-a| Yes 
+a| *Available as SDK plugin*
+a| Yes
 
-a| *Work in progress* 
-a| Yes 
+a| *Work in progress*
+a| Yes
 
 |===
 
@@ -116,17 +110,17 @@ The “Shaderblow library contains various shader effects, e.g. refraction, part
 [cols="2", options="header"]
 |===
 
-a| *Contact person* 
-a| link:https://hub.jmonkeyengine.org/users/mifth/activity[mifth] 
+a| *Contact person*
+a| link:https://hub.jmonkeyengine.org/users/mifth/activity[mifth]
 
-a| *Documentation* 
-a| <<sdk/plugin/shaderblow#,Wiki Page>> 
+a| *Documentation*
+a| <<sdk/plugin/shaderblow#,Wiki Page>>
 
-a| *Available as SDK plugin* 
-a| Yes 
+a| *Available as SDK plugin*
+a| Yes
 
-a| *Work in progress* 
-a| Yes 
+a| *Work in progress*
+a| Yes
 
 |===
 
@@ -140,17 +134,17 @@ A framework for block worlds (also called “bloxel or “minecraft-like) - It o
 [cols="2", options="header"]
 |===
 
-a| *Contact person* 
-a| link:https://hub.jmonkeyengine.org/users/destroflyer/activity[destroflyer] 
+a| *Contact person*
+a| link:https://hub.jmonkeyengine.org/users/destroflyer/activity[destroflyer]
 
-a| *Documentation* 
-a| <<jme3/contributions/cubes#,Wiki Page>> 
+a| *Documentation*
+a| <<jme3/contributions/cubes#,Wiki Page>>
 
-a| *Available as SDK plugin* 
-a| Yes 
+a| *Available as SDK plugin*
+a| Yes
 
-a| *Work in progress* 
-a| Yes 
+a| *Work in progress*
+a| Yes
 
 |===
 
@@ -165,17 +159,17 @@ A self-contained thread-capable entity system.
 [cols="2", options="header"]
 |===
 
-<a| *Contact person*  
-a| link:https://hub.jmonkeyengine.org/users/pspeed/activity[Paul Speed (pspeed)] 
+<a| *Contact person*
+a| link:https://hub.jmonkeyengine.org/users/pspeed/activity[Paul Speed (pspeed)]
 
-<a| *Documentation*   
-<a| <<jme3/contributions/entitysystem#,Wiki Page>>  
+<a| *Documentation*
+<a| <<jme3/contributions/entitysystem#,Wiki Page>>
 
-<a| *Available as SDK plugin*  
-<a| Yes  
+<a| *Available as SDK plugin*
+<a| Yes
 
-<a| *Work in progress*  
-<a| Seems fairly complete  
+<a| *Work in progress*
+<a| Seems fairly complete
 
 |===
 

+ 26 - 25
src/docs/asciidoc/jme3/contributions/entitysystem/detailed.adoc

@@ -1,6 +1,6 @@
 = detailed
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -17,7 +17,7 @@ This wiki is dedicated to who want to do research about Entity System.
 
 You should 've read a brief introduction here: <<jme3/contributions/entitysystem/introduction#,jme3:contributions:entitysystem:introduction>>
 
-And if you still have some concerning you are in the right place! 
+And if you still have some concerning you are in the right place!
 
 
 [IMPORTANT]
@@ -101,7 +101,7 @@ Pictures
 
 NOTE: Definition notations:
 
-*  Normal is clearly/no doubt in the definition. 
+*  Normal is clearly/no doubt in the definition.
 *  *Bold* is keywork.
 *  _Italic_ is example
 *  +++<u>Underling</u>+++ is doubt
@@ -115,7 +115,7 @@ An Entity is simply *an unique Id*. _Every Unit, Item, Bullet, etc. in your game
 
 ==== Component
 
-A Component is a class which only contains data. +++<strike>This means it has a constructor and only getter methods</strike>+++. 
+A Component is a class which only contains data. +++<strike>This means it has a constructor and only getter methods</strike>+++.
 _Examples for Components can be:
   * PositionComponent
   * MovementComponent
@@ -132,7 +132,7 @@ As you can see *Entities are made flexible up of different Components*. _You nee
 
 Simply all other classes *except the components and the entities* can we consider as systems. You need to pay attention when you read about other Entity Systems because they can have different ideas of what a system is.
 
-In the systems you can request all Entities which have special components. 
+In the systems you can request all Entities which have special components.
 _For example you can say that you want all entities who have a position and a movement component and now calculate the new position for these Entities +++<strike>by overwriting the old position component with a new one</strike>+++._
 
 
@@ -193,14 +193,14 @@ Here is a short one to help you get start quickly : <<jme3/contributions/entitys
 
 == What is NOT an ES ?
 
-From more 'open' perspective the core elements can be viewed as, but remember the name as a noun can be mislead: 
+From more 'open' perspective the core elements can be viewed as, but remember the name as a noun can be mislead:
 _This resulted as a dicussion of @pspeed and toolforger, eventually is form a skeptical question, it's really interesting by how we all see this problem confused at first!!_
 
 ....
   Entity -> ID. It just binds the components together, in the sense that there is one function that creates a bunch of components with the same ID, and one function to destroy all components for an ID. An entity is the set of objects that have the same ID, entities don’t exist as coherent objects inside the code.
-  
+
   Component -> Facet. A position is a facet of an entity, as its velocity, its health, its armor, its whatever. If entities were Java objects, facets would be groups of interrelated properties.
-  
+
   System -> Processor. A function that operates on a slice of components.
 ....
 
@@ -251,7 +251,7 @@ This is the place to share the “real world difficuties when working with ES, h
 Because this topic is so debatable, there is no solid candidate for ES done right now in my POV, but Zay-ES and Artemis are closest one, Zay-ES a little bit better as its the later born.
 
 
-==== Why debatable [Short]?
+=== Why debatable [Short]?
 
 Because apply to each game, the scenarios and usecases are vary difference. Situation changes, a design which should be right can be a failure!  You may see the point.
 
@@ -357,7 +357,7 @@ This is a short checklist that help you open your mind before going to design an
 
 === Pros – cons?
 
-Here, I listed the pros – cons of the COP and Pure data ES. 
+Here, I listed the pros – cons of the COP and Pure data ES.
 
 [WARNING]
 ====
@@ -408,7 +408,7 @@ link:http://piemaster.net/2011/07/entity-component-primer/[http://piemaster.net/
 .  Flat table problem: Because ES is a big table by nature, with component set is a row. It’s as efficient even less than a big table, which form the flat table problem as seen in many indexed base database. Tree, Graph and other data structure will almost immediately break the ES contract!!
 .  Observation problem: As update beat over listening method, ES restrict the observation methods a lot.
 .  Sercurity problem : No encapsulation, kind of no private POJO mean no java power in protecting data, a lot of security holes! ES implementations and COP forget all about sercurity danger as Component contracted to be processed by Processor but not hiding its content.
-.  Scale : In theory, ES should scale well..!!! But read this carefully or mislead it, enterprise system need much more than just a way to orginize your data!!! 
+.  Scale : In theory, ES should scale well..!!! But read this carefully or mislead it, enterprise system need much more than just a way to orginize your data!!!
 
 
 [TIP]
@@ -475,13 +475,13 @@ From @pspeed:
   - there aren’t many entities and/or the behavior is so clearly defined that you’d just implement it one or two classes. Thing card games, a lot of puzzle games, etc..
   - the game is so simple that it’s just implemented as JME controls and a few app states. You could use an ES here but it would be wasted.
   - the game logic cuts across all objects nearly all the time. (I think of card games and puzzle games again.) This usually implies that there are few entities, though.
-  - the team doing the work will have trouble understanding an ES. To me this is a huge one. Sometimes our choice of technologies is not dictated by what might be technically best… but what is technically best for the skills of the team. For example, if your artist only knows Sketchup then Blender is probably not the right tool even if it is superior in many ways. 
+  - the team doing the work will have trouble understanding an ES. To me this is a huge one. Sometimes our choice of technologies is not dictated by what might be technically best… but what is technically best for the skills of the team. For example, if your artist only knows Sketchup then Blender is probably not the right tool even if it is superior in many ways.
 ....
 
 
 === Known issues:
 
-Even if done right, the ES also have it underlying issues which noticed by its authors, (that means annoying things)! 
+Even if done right, the ES also have it underlying issues which noticed by its authors, (that means annoying things)!
 
 *Why this section havs things from the Cons section but consider differrently?*
 
@@ -537,13 +537,13 @@ As said, as a long term java developer and also an artist. I can not see a stron
 
 BLOB is not a problem with a carefully designed software, same as hard as split your components… Deep inheritance even multi inheritance problem can not be reached in an indie project, and even it reached, maintain it always easier than redesign a 3D model to change the export pipeline!!!
 
-Also the tangled wires between inheritance form the nature of programming and matter in the universal. :p 
+Also the tangled wires between inheritance form the nature of programming and matter in the universal. :p
 
 *BUT* They have IDE support, profiler, proved technologies, lot more… We talking about a no IDE support paradigm with plain text editor, table and some black magic, tell me more about the company will approve your plan?
 
 Some alternate solution may solve almost your design goal when you likely to use an ES:
 
-.  Smart bean framework : try Spring, EJB. For Enterprise, if you've known EJB and Spring, you will not bet in home grown ES, dont you? 
+.  Smart bean framework : try Spring, EJB. For Enterprise, if you've known EJB and Spring, you will not bet in home grown ES, dont you?
 .  Actor framework: try AKKA
 .  If you see java as a failure, try Scala’s trail …
 
@@ -589,7 +589,7 @@ So this chapter will mainly answer the BIG question:
 Some open source Entity System implementation projects:
 
 
-==== Artemis: General
+=== Artemis: General
 
 GoogleCode: link:https://code.google.com/p/artemis-framework/[https://code.google.com/p/artemis-framework/]
 
@@ -653,7 +653,6 @@ The comparasions will focus in these below points, follow with the scope, status
 .  Current status: Long term, stable, community?
 
 [More]
-———————————————————————————————
 
 
 [IMPORTANT]
@@ -671,15 +670,16 @@ Link to articles, researches and papers you should read:
 
 *Start of the wave*
 
-[1] link:http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/[http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/]
+pass:[[1]] link:http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/[http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/]
 
 *Sploreg ES in JME introduction in indiedb*
 
-[2] link:http://www.indiedb.com/games/attack-of-the-gelatinous-blob/news/the-entity-system[http://www.indiedb.com/games/attack-of-the-gelatinous-blob/news/the-entity-system]
+pass:[[2]] link:http://www.indiedb.com/games/attack-of-the-gelatinous-blob/news/the-entity-system[http://www.indiedb.com/games/attack-of-the-gelatinous-blob/news/the-entity-system]
 
 *Worth to read, pspeed conversation with Michael Leahy, also lead another ES project TyphonRT*
 
-[3] link:http://t-machine.org/index.php/2011/06/24/using-an-entity-system-with-jmonkeyengine-mythruna/[http://t-machine.org/index.php/2011/06/24/using-an-entity-system-with-jmonkeyengine-mythruna/]
+pass:[[3]]
+link:http://t-machine.org/index.php/2011/06/24/using-an-entity-system-with-jmonkeyengine-mythruna/[http://t-machine.org/index.php/2011/06/24/using-an-entity-system-with-jmonkeyengine-mythruna/]
 
 *Our wiki link*
 
@@ -687,19 +687,20 @@ Link to articles, researches and papers you should read:
 
 *Beside of BLOB anti pattern, explain why ES suite as data in modern GPU, CPU!*
 
-[5] link:http://gamesfromwithin.com/data-oriented-design[http://gamesfromwithin.com/data-oriented-design]
+pass:[[5]]
+link:http://gamesfromwithin.com/data-oriented-design[http://gamesfromwithin.com/data-oriented-design]
 
 *Worth to read, paper of another C++ ES leader of cistron project link:http://code.google.com/p/cistron[http://code.google.com/p/cistron]*
 
-[6] link:http://acmantwerp.acm.org/wp-content/uploads/2010/10/componentbasedprogramming.pdf[http://acmantwerp.acm.org/wp-content/uploads/2010/10/componentbasedprogramming.pdf]
+pass:[[6]] link:http://acmantwerp.acm.org/wp-content/uploads/2010/10/componentbasedprogramming.pdf[http://acmantwerp.acm.org/wp-content/uploads/2010/10/componentbasedprogramming.pdf]
 
 *Stack over flow topic, links, texts and especially interesting recommendation to switch form CBSE , COP to functional programming!*
 
-[7] link:http://stackoverflow.com/questions/1901251/component-based-game-engine-design[http://stackoverflow.com/questions/1901251/component-based-game-engine-design]
+pass:[[7]] link:http://stackoverflow.com/questions/1901251/component-based-game-engine-design[http://stackoverflow.com/questions/1901251/component-based-game-engine-design]
 
 *Link to other entitiy system approaches in its own wikidot!*
 
-[8] link:http://entity-systems.wikidot.com/es-approaches[http://entity-systems.wikidot.com/es-approaches]
+pass:[[8]] link:http://entity-systems.wikidot.com/es-approaches[http://entity-systems.wikidot.com/es-approaches]
 
 [9] An interesting write up in GDD about ES and Events in a game engine. And some production,workflow concerns
 

+ 4 - 16
src/docs/asciidoc/jme3/contributions/entitysystem/terms.adoc

@@ -1,6 +1,6 @@
 = terms
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../../
 :imagesdir: ../../..
@@ -14,12 +14,10 @@ Object-oriented programming (OOP) is a programming paradigm that represents conc
 
 link:http://en.wikipedia.org/wiki/Object-oriented_programming[http://en.wikipedia.org/wiki/Object-oriented_programming]
 
-—————————————————————————————
-
 
 == Data Oriented Programming
 
-[This just not exist]
+pass:[[This just not exist]]
 
 If you use Data-oriented_languages, you can call it Data Oriented Programming! You may talking about *Data Oriented Design (Architecture)* instead
 
@@ -27,8 +25,6 @@ link:http://stackoverflow.com/questions/4122696/what-is-data-oriented-programmin
 
 link:http://en.wikipedia.org/wiki/List_of_programming_languages_by_category#Data-oriented_languages[http://en.wikipedia.org/wiki/List_of_programming_languages_by_category#Data-oriented_languages]
 
-—————————————————————————————
-
 
 == Component Oriented Programming
 
@@ -36,8 +32,6 @@ This is “the rising force” we are talking about!
 
 It’s a “rather new” programming paradigm. Despite of its name and even the fact it’s was born from the marriage of “Component base architecture” and “Data oriented architecture”, but something different.
 
-—————————————————————————————
-
 
 == COP’s Entity System in OOP java
 
@@ -47,7 +41,6 @@ In fact the implementation detail of Entity system is various, some may resembli
 
 but note that Entity System really stand on its own terminology on this single page:
 We are talking about the ES within COP, but implemented by an pure OOP like Java.
-—————————————————————————————
 
 
 == Data driven programming:
@@ -58,8 +51,6 @@ In computer programming, data-driven programming is a programming paradigm in wh
 
 link:http://en.wikipedia.org/wiki/Data-driven_programming[http://en.wikipedia.org/wiki/Data-driven_programming]
 
-—————————————————————————————
-
 
 == Data driven solution (architecture):
 
@@ -85,8 +76,6 @@ link:http://en.wikipedia.org/wiki/Data-driven_programming[http://en.wikipedia.or
   It has the “data force”, that’s why it call ‘driven’, the force sometime a “generative force”!
 ....
 
-—————————————————————————————
-
 
 == Data oriented (design) architecture:
 
@@ -94,9 +83,8 @@ link:http://en.wikipedia.org/wiki/Data-driven_programming[http://en.wikipedia.or
   Data oriented design is an approach that extracts the operations on the data from the “objects” and flattens the things that they need to run in order to be cache friendly. According to the literature (I got my first exposure in Game Engine Gems 2, Chapter 15), in many cases it actually simplifies the code.
 ....
 
-———————————————
 From atomix ‘s overview:
-—————————–
+
 Data oriented architecture is focus in Data arrangement and process(delay of data and the dataflow) and everything is Data, with a repository! It have more aspects than Data driven architecture and not talking about “the force of generative data”.
 
 In hardware level, data oriented appear in structure and operations of chip set, when input and output are carefullly design to get batch/cache efficient.

+ 37 - 39
src/docs/asciidoc/jme3/contributions/tonegodgui_quickstart.adoc

@@ -1,6 +1,6 @@
 = tonegodgui_quickstart
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -10,12 +10,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == Quick Start Guide:
 
-For anyone who just wants to jump right in and read as you go, here are the basics for getting a UI up and running in minutes.+
-+
-The first step is to create the screen control. This can be done one of two ways.+
-+
-1. Using the provided default style information:
+For anyone who just wants to jump right in and read as you go, here are the basics for getting a UI up and running in minutes.
 
+The first step is to create the screen control. This can be done one of two ways.
+
+. Using the provided default style information:
++
 [source,java]
 ----
 
@@ -26,8 +26,8 @@ guiNode.addControl(screen);
 
 ----
 
-2. Providing a path to another Style map.
-
+. Providing a path to another Style map.
++
 [source,java]
 ----
 
@@ -38,10 +38,9 @@ guiNode.addControl(screen);
 
 ----
 
-*NOTE:*+
-style_map.xml consists of a list of xml documents containing varied styles for varied use. You can copy the default style map and replace one, many, all with project specific style (Covered later in this tutorial).+
-+
-Next, we add a control. Might as well start with something interesting as all control contructors follow the same format. Let go with a window and then we’ll add a button to it. Here are the three contrustor choices for creating the window:+
+NOTE: style_map.xml consists of a list of xml documents containing varied styles for varied use. You can copy the default style map and replace one, many, all with project specific style (Covered later in this tutorial).
+
+Next, we add a control. Might as well start with something interesting as all control contructors follow the same format. Let go with a window and then we’ll add a button to it. Here are the three contrustor choices for creating the window:
 
 [source,java]
 ----
@@ -51,14 +50,14 @@ Next, we add a control. Might as well start with something interesting as all co
   * String UID,
   * Vector2f position
   */
- 
+
 Window win = new Window(screen, “win”, new Vector2f(15, 15));
 screen.addElement(win);
 
 ----
 
-And… boom! You have a fancy new resizable, movable window as part of you’re UI. Now, let’s take a look at the two additional constructors.+
-+
+And… boom! You have a fancy new resizable, movable window as part of you’re UI. Now, let’s take a look at the two additional constructors.
+
 The second adds a 4th parameter to specify the windows dimensions, like such:
 
 [source,java]
@@ -66,7 +65,7 @@ The second adds a 4th parameter to specify the windows dimensions, like such:
 
 /** Additional Parameter:
   * Vector2f dimensions  */
- 
+
 Window win = new Window(screen, “win”, new Vector2f(15, 15),
     new Vector2f(400, 300)
 );
@@ -83,7 +82,7 @@ The third option adds 2 more parameters and looks like this:
   * Vector4f resizeBorders,
   * String defaultImg
   */
- 
+
 Window win = new Window(screen, “win”, new Vector2f(15, 15), new Vector2f(400, 300),
     new Vector4f(14,14,14,14),
     “tonegod/gui/style/def/Window/panel_x.png”
@@ -92,23 +91,23 @@ screen.addElement(win);
 
 ----
 
-Any parameters not specified are derived from the defaults specified in the Window style information.+
-+
-*NOTE:*+
-The occasional control extends this contructor format, adding an additional Orientation parameter or possibly a boolean flag for controls that provide multiple configurable layouts.+
-+
-So, now lets add a button to the window that will create more windows!+
-+
-The Button class is one of the only +++<abbr title="Graphical User Interface">GUI</abbr>+++ control classes that implements JME’s Control interface. The Control only becomes active if setInterval is called because the Button requires the use of stillPressed events. This and much more will be cover in later documentation. Again, you ave the three options above for creating an instance of the button control.+
-+
-*NOTE:*+
-The button control (like many controls) is abstract and provides methods for handling user input. All events can be consumed by using evt.setConsumed(); First, lets setup a method to create new windows:
+Any parameters not specified are derived from the defaults specified in the Window style information.
+
+NOTE: The occasional control extends this contructor format, adding an additional Orientation parameter or possibly a boolean flag for controls that provide multiple configurable layouts.
+
+So, now lets add a button to the window that will create more windows!
+
+The Button class is one of the only +++<abbr title="Graphical User Interface">GUI</abbr>+++ control classes that implements JME’s Control interface. The Control only becomes active if setInterval is called because the Button requires the use of stillPressed events. This and much more will be cover in later documentation. Again, you ave the three options above for creating an instance of the button control.
+
+NOTE: The button control (like many controls) is abstract and provides methods for handling user input. All events can be consumed by using evt.setConsumed();
+
+First, lets setup a method to create new windows:
 
 [source,java]
 ----
 
 private int winCount = 0;
- 
+
 public final void createNewWindow(String someWindowTitle) {
     Window nWin = new Window(
         screen,
@@ -132,25 +131,25 @@ Now lets add the button to allow users to create new window:
   * String UID,
   * Vector2f position
   */
- 
+
 ButtonAdapter makeWindow = new ButtonAdapter( screen, “Btn1″, new Vector2f(15, 55) ) {
     @Override
     public void onButtonMouseLeftUp(MouseButtonEvent evt, boolean toggled) {
         createNewWindow(“New Window ” + winCount);
     }
 };
- 
+
 // Add it to out initial window
 win.addChild(makeWindow);
 
 ----
 
-*NOTE:*+
-For layout purposes, it is suggested that you add all child Elements toa control PRIOR to adding the control to the screen… so, ceate a window, add a button, add window to screen.+
-+
-*A Bit More Info:*+
- All controls are based on the Element class which has access to all default behaviors. Behaviors can be enabled disabled on ANY control or primitive Element.
+[NOTE]
+====
+For layout purposes, it is suggested that you add all child Elements toa control PRIOR to adding the control to the screen… so, ceate a window, add a button, add window to screen.
 
+*A Bit More Info:* All controls are based on the Element class which has access to all default behaviors. Behaviors can be enabled disabled on ANY control or primitive Element.
+====
 
 == A Few of the Common Behaviors:
 
@@ -186,5 +185,4 @@ setIgnoreMouse(boolean);
 
 ----
 
-*NOTE:*+
-There are far more behaviors, however, these are the most critical when creating custom controls to ensure that nested Elements react as you would like when a parent Element is altered.+
+NOTE: There are far more behaviors, however, these are the most critical when creating custom controls to ensure that nested Elements react as you would like when a parent Element is altered.

+ 23 - 23
src/docs/asciidoc/jme3/intermediate/multi-media_asset_pipeline.adoc

@@ -1,6 +1,6 @@
 = Multi-Media Asset Pipeline
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: spatial, node, mesh, geometry, scenegraph, sdk
 :relfileprefix: ../../
@@ -11,32 +11,32 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Assets are files that are not code. Your multi-media assets includes, for example, your textures (image files), models (mesh files), and sounds (audio files).
 
 *  You create textures in a graphic editor, for example link:http://gimp.org[Gimp], and export them as PNG or JPG.
-*  You <<jme3/external/blender#,create models>> in a 3D mesh editor, for example link:http://blender.org[Blender], and export them in Ogre Mesh XML or Wavefront OBJ format. 
+*  You <<jme3/external/blender#,create models>> in a 3D mesh editor, for example link:http://blender.org[Blender], and export them in Ogre Mesh XML or Wavefront OBJ format.
 *  You create sounds in an audio editor, for example link:http://audacity.sourceforge.net[Audacity], and export them as WAVE or OGG.
 
-=== Asset Pipeline
+== Asset Pipeline
 [cols="2", options="header"]
 |===
 
 a|DO
 a|DON'T
 
-a| Import original models plus textures into `assets/Textures`. 
-a| Don't leave textures or models in a folder outside your JME project: The game cannot load or reference them from there. 
+a| Import original models plus textures into `assets/Textures`.
+a| Don't leave textures or models in a folder outside your JME project: The game cannot load or reference them from there.
 
-a| Save sounds into `assets/Sounds`. 
-a| Don't leave audio files in a folder outside your JME project: The game cannot load or reference them from there. 
+a| Save sounds into `assets/Sounds`.
+a| Don't leave audio files in a folder outside your JME project: The game cannot load or reference them from there.
 
-a| Create low-polygon models. 
-a| Don't create high-polygon models, they render too slow to be useful in games. 
+a| Create low-polygon models.
+a| Don't create high-polygon models, they render too slow to be useful in games.
 
-a| Only use Diffuse Map, Normal Map, Glow Map, Specular Map in your models' materials. 
+a| Only use Diffuse Map, Normal Map, Glow Map, Specular Map in your models' materials.
 a| Don't use unsupported material properties that are not listed in the <<jme3/advanced/materials_overview#,Materials Overview>>.
 
-a| Use UV texture / texture atlases / baking for each texture map. 
+a| Use UV texture / texture atlases / baking for each texture map.
 a| Don't create models based on multiple separate textures, it will break the model into separate meshes.
 
-a| Convert original models to JME3's .j3o format. Move .j3o files into `assets/Models`. 
+a| Convert original models to JME3's .j3o format. Move .j3o files into `assets/Models`.
 a|Don't reference original Blender/Ogre/OBJ files in your load() code, because these unoptimized files are not automatically packaged into the final JAR.
 
 a|Agree on naming schemes and folder schemes with your artists early on to avoid confusion. E.g. keep naming schemes for bones and certain model parts. Try to keep your assets folder clean, its like your codes class structure.
@@ -49,7 +49,7 @@ Read on for details.
 
 == Use The Assets Folder
 
-Store your assets in subfolders of your project's `assets` directory. The `assets` directory is the default path where a JME game's <<jme3/advanced/asset_manager#,Asset Manager>> looks for files to load. 
+Store your assets in subfolders of your project's `assets` directory. The `assets` directory is the default path where a JME game's <<jme3/advanced/asset_manager#,Asset Manager>> looks for files to load.
 
 [source]
 ----
@@ -61,19 +61,19 @@ jMonkeyProjects/MyGame/assets/Models/    # .blend, .j3o
 jMonkeyProjects/MyGame/assets/Scenes/    # .j3o
 jMonkeyProjects/MyGame/assets/Shaders/   # .j3f, .vert, .frag
 jMonkeyProjects/MyGame/assets/Sounds/    # .ogg, .wav
-jMonkeyProjects/MyGame/assets/Textures/  # .jpg, .png; also .mesh.xml+.material, .mtl+.obj, 
+jMonkeyProjects/MyGame/assets/Textures/  # .jpg, .png; also .mesh.xml+.material, .mtl+.obj,
 
 ----
 
 Prepare the `asset` folder structure for your individual project:
 
-.  Agree on a directory structure with the graphic designers. 
+.  Agree on a directory structure with the graphic designers.
 .  Create subfolders of `assets` in any way that suits your project (see example above). Stick with one system.
 **  If different assets belong together, create a parallel subdirectory structure for them. +
 Example: For car models, create `Textures/vehicles/car1/`, `Materials/vehicles/car1/`, `Models/vehicles/car1/`, , `Sounds/vehicles/car1/` (etc) directories now.
 
-.  Agree on a file naming and numbering scheme with the graphic designers. 
-**  Are some assets used interchangeably? Systematic naming and numbering lets developers easily swap out assets by swapping out parts of the path String. 
+.  Agree on a file naming and numbering scheme with the graphic designers.
+**  Are some assets used interchangeably? Systematic naming and numbering lets developers easily swap out assets by swapping out parts of the path String.
 **  Decide on naming standards for naming interactive parts (arms/legs) of animated models.
 
 
@@ -90,13 +90,13 @@ See also:
 Install a graphic editor such as Gimp or Photoshop. *Consult the graphic editor's documentation for specific details how to do the following tasks.*
 
 .  Create textures in a graphic editor.
-**  Save all textures to your prepared subfolders in the `assets/Textures` directory. 
+**  Save all textures to your prepared subfolders in the `assets/Textures` directory.
 
 .  (Optional) If you plan to use JME materials that you set programmatically from the code, create .j3m materials in the SDK.
 **  Save these .j3m files into the `assets/Materials` directory.
 
 
-Storing the textures inside your project directory is necessary for the paths in JME's binary model files (.j3o) to work. Treat the paths of your assets like class names of java classes, they define a specific asset. When you later generate .j3o files, and compile class files, and distribute the application, all paths and files need to be available in their final, absolute form. 
+Storing the textures inside your project directory is necessary for the paths in JME's binary model files (.j3o) to work. Treat the paths of your assets like class names of java classes, they define a specific asset. When you later generate .j3o files, and compile class files, and distribute the application, all paths and files need to be available in their final, absolute form.
 
 
 [IMPORTANT]
@@ -117,7 +117,7 @@ Note that UV coords are part of the mesh and not part of the material, so if you
 ====
 
 
-.  Create 3D models in a mesh editor. 
+.  Create 3D models in a mesh editor.
 ..  Create efficient *low-polygon models*. High-polygon models may look pretty in static 3D art contests, but they slow down dynamic games!
 ..  <<jme3/advanced/j3m_material_files#,Create materials>> for your models either in the 3D editor, or in the jME3 SDK. Only use the following material features: *Diffuse Map or Diffuse Color (minimum); plus optionally Normal Map, Glow Map, Specular Map.* +
 Every material feature not listed in the <<jme3/advanced/materials_overview#,Materials Overview>> is unsupported and ignored by JME3's renderer.
@@ -142,12 +142,12 @@ See also: link:http://www.gamasutra.com/view/feature/2530/practical_texture_atla
 
 == Convert 3D Models to .j3o Format
 
-Convert all models and scenes to jME3's binary .j3o format to load() them. You use the jMonkeyEngine SDK to do the conversion. 
+Convert all models and scenes to jME3's binary .j3o format to load() them. You use the jMonkeyEngine SDK to do the conversion.
 
 .  Confirm that you exported the model into the `assets/Textures` directory (or subdirectories) together with all its textures.
 .  In the SDK, right-click the model and choose “Convert to j3o Binary. +
 The paths in the j3o now reference files with an absolute `assets/Textures/…` path.
-.  Now, move the .j3o into the corresponding `assets/Models/` or `assets/Scenes/` directory. 
+.  Now, move the .j3o into the corresponding `assets/Models/` or `assets/Scenes/` directory.
 .  Use the AssetManager to load() the .j3o files.
 
 This process ensures that the texture paths are correct, and it also keeps your `assets/Models` folder free from textures. You can reuse your set of textures for many models.

+ 21 - 16
src/docs/asciidoc/jme3/intermediate/simpleapplication.adoc

@@ -1,6 +1,6 @@
 = SimpleApplication
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: display, basegame, documentation, intro, intermediate, init, input, game, loop, rootnode, application, simpleapplication
 :relfileprefix: ../../
@@ -8,9 +8,9 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-The base class of the jMonkeyEngine3 is `com.jme3.app.SimpleApplication`. Your first game's Main class extends SimpleApplication directly. When you feel confident you understand the features, you will typically extend SimpleApplication to create a custom base class for the type of games that you want to develop. 
+The base class of the jMonkeyEngine3 is `com.jme3.app.SimpleApplication`. Your first game's Main class extends SimpleApplication directly. When you feel confident you understand the features, you will typically extend SimpleApplication to create a custom base class for the type of games that you want to develop.
 
-SimpleApplication gives you access to standard game features, such as a scene graph (rootNode), an asset manager, a user interface (guiNode), input manager, audio manager, a physics simulation, and a fly-by camera. You call app.start() and app.stop() on your game instance to start or quit the application. 
+SimpleApplication gives you access to standard game features, such as a scene graph (rootNode), an asset manager, a user interface (guiNode), input manager, audio manager, a physics simulation, and a fly-by camera. You call app.start() and app.stop() on your game instance to start or quit the application.
 
 
 [IMPORTANT]
@@ -78,15 +78,15 @@ a|The default <<jme3/advanced/camera#,camera>> provides perspective projection,
 a|assetManager +
 getAssetManager()
 a|An object that manages paths for loading models, textures, materials, sounds, etc. +
-By default the <<jme3/advanced/asset_manager#,Asset Manager>> paths are relative to your project's root directory. 
+By default the <<jme3/advanced/asset_manager#,Asset Manager>> paths are relative to your project's root directory.
 
 a|audioRenderer +
 getAudioRenderer()
-a|This object gives you access to the jME3 <<jme3/advanced/audio#,audio>> system. 
+a|This object gives you access to the jME3 <<jme3/advanced/audio#,audio>> system.
 
 a|listener +
 getListener()
-a|This object represents the user's ear for the jME3 <<jme3/advanced/audio#,audio>> system. 
+a|This object represents the user's ear for the jME3 <<jme3/advanced/audio#,audio>> system.
 
 a|inputManager +
 getInputManager()
@@ -104,10 +104,10 @@ a|Application methods
 a|Purpose
 
 a|setPauseOnLostFocus(true)
-a|Set this boolean whether the game loop should stop running when ever the window loses focus (typical for single-player game). Set this to false for real-time and multi-player games that keep running. 
+a|Set this boolean whether the game loop should stop running when ever the window loses focus (typical for single-player game). Set this to false for real-time and multi-player games that keep running.
 
 a|start()
-a|Call this method to start a jME3 game. By default this opens a new jME3 window, initializes the scene, and starts the event loop. 
+a|Call this method to start a jME3 game. By default this opens a new jME3 window, initializes the scene, and starts the event loop.
 
 a|restart()
 a|Loads modified <<jme3/intermediate/appsettings#,AppSettings>> into the current application context.
@@ -148,7 +148,7 @@ a|Low-level and high-level rendering interface. Mostly used internally.
 
 a|guiViewPort +
 getGuiViewPort()
-a|The view object for the orthogonal +++<abbr title="Graphical User Interface">GUI</abbr>+++ view. Only used internally for <<jme3/advanced/hud#,HUD>>s. 
+a|The view object for the orthogonal +++<abbr title="Graphical User Interface">GUI</abbr>+++ view. Only used internally for <<jme3/advanced/hud#,HUD>>s.
 
 a|timer
 a|An internal update loop timer, don't use. See `tpf` in `simpleUpdate()` below to learn about timers.
@@ -165,7 +165,7 @@ The com.jme3.app.SimpleApplication class extends the generic com.jme3.app.Applic
 
 *  First-person (fly-by) camera
 *  Scene graph that manages your models in the rendered 3D scene.
-*  Useful default input mappings (details below.) 
+*  Useful default input mappings (details below.)
 
 Additional to the functionality that Application brings, SimpleApplication offers the following methods and fields that can be used, for example, inside the `simpleInitApp()` method:
 [cols="25,75", options="header"]
@@ -203,7 +203,13 @@ a|setDisplayFps(false);
 a|A default SimpleApplication displays the framerate (frames per second) on the screen. You can choose to deactivate the FPS display using this command.
 
 a|setDisplayStatView(false);
-a|A default SimpleApplication displays mesh statistics on the screen using the com.jme3.app.StatsView class. The information is valuable during the development and debugging phase, but for the release, you should hide the statistics HUD.
+a|A default SimpleApplication displays mesh statistics on the screen using the com.jme3.app.StatsView class. The information is valuable during the development and debugging phase, but for the release, you should hide the statistics HUD. +
+*pass:[*]Note:* There is a dark quad behind the stats. Each letter displayed in the stats is a quad. Each quad has 4 vertexes and 2 triangles. +
+
+456/2 = 228 +
+912/4 = 228
+
+This means if you display stats, there will be 456 triangles and 912 vertices showing in the stats view in addition to anything you add yourself.
 
 |===
 [cols="40,60", options="header"]
@@ -217,7 +223,7 @@ a|Override this method to initialize the game scene. Here you load and create ob
 
 a|public void simpleUpdate(float tpf)
 a|Override this method to hook into the <<jme3/advanced/update_loop#,update loop>>, all code you put here is repeated in a loop. Use this loop to poll the current game state and respond to changes, or to let the game mechanics generate encounters and initiate state changes. Use the float `tpf` as a factor to time actions relative to the _time per frame_ in seconds: `tpf` is large on slow PCs, and small on fast PCs. +
-For more info on how to hook into the <<jme3/advanced/update_loop#,update loop>>, see <<jme3/advanced/application_states#,Application States>> and <<jme3/advanced/custom_controls#,Custom Controls>>. 
+For more info on how to hook into the <<jme3/advanced/update_loop#,update loop>>, see <<jme3/advanced/application_states#,Application States>> and <<jme3/advanced/custom_controls#,Custom Controls>>.
 
 a|public void simpleRender(RenderManager rm)
 a|*Optional:* Advanced developers can override this method if the need to modify the frameBuffer and scene graph directly.
@@ -310,7 +316,7 @@ By default, a SimpleApplication displays Statistics (`new StatsAppState()`), has
 
 The following example shows how you can remove one of the default AppStates, in this case, the FlyCamAppState:
 
-*  Either, in your application's contructor, you create the SimpleApplication with only the AppStates you want to keep: 
+*  Either, in your application's contructor, you create the SimpleApplication with only the AppStates you want to keep:
 [source,java]
 ----
 public MyAppliction() {
@@ -318,11 +324,10 @@ public MyAppliction() {
 }
 ----
 
-*  Or, in the `simpleInitApp()` method, you remove the ones you do not want to keep: 
+*  Or, in the `simpleInitApp()` method, you remove the ones you do not want to keep:
 [source,java]
 ----
   public void simpleInitApp() {
     stateManager.detach( stateManager.getState(FlyCamAppState.class));
     ...
 ----
-

+ 21 - 21
src/docs/asciidoc/jme3/math.adoc

@@ -52,7 +52,7 @@ Transformations define an operation that converts points from one coordinate sys
 Visibility Determination concerns itself with minimizing the amount of data that is sent to the graphics card for rendering. Specifically, we do not want to send data that will not be seen. Data not sent to the graphics card is said to be culled. The primary focus of this section is Frustum Culling based on the Camera's view frustum. In essence, this frustum creates six standard view planes. The BoundingVolume of an object is tested against the frustum planes to determine if it is contained in the frustum. If at any point the object's bounding is outside of the plane, it is tossed out and no longer processed for rendering. This also includes any children that it managed, allowing fast culling of large sections of the scene.
 
 
-==== Fundamental Types
+=== Fundamental Types
 
 
 == ColorRGBA
@@ -196,12 +196,12 @@ jME includes two types of Matrix classes: Matrix3f and Matrix4f. Matrix3f is a 3
 Multiplying a vector with a Matrix allows the vector to be transformed. Either rotating, scaling or translating that vector.
 
 
-===== Scaling
+==== Scaling
 
 If a _diagonal Matrix_, defined by D = [d~ij~] and d~ij~ = 0 for i != j, has all positive entries it is a _scaling matrix_. If d~i~ is greater than 1 then the resulting vector will grow, while if d~i~ is less than 1 it will shrink.
 
 
-===== Rotation
+==== Rotation
 
 A _rotation matrix_ requires that the transpose and inverse are the same matrix (R^-1^ = R^T^). The _rotation matrix_ R can then be calculated as: R = I + (sin(angle)) S + (1 - cos(angle)S^2^ where S is:
 [cols="3", options="header"]
@@ -222,7 +222,7 @@ a|0
 |===
 
 
-===== Translation
+==== Translation
 
 Translation requires a 4x4 matrix, where the vector (x,y,z) is mapped to (x,y,z,1) for multiplication. The _Translation Matrix_ is then defined as:
 [cols="2", options="header"]
@@ -263,19 +263,19 @@ We have two Vectors (2f and 3f) meaning we have tuples of 2 float values or 3 fl
 === Operations
 
 
-===== Multiplication by Scalar
+==== Multiplication by Scalar
 
 A Vector can be multiplied by a scalar value to produce a second Vector with the same proportions as the first. a**V** = **V**a = &lt;aV~1~, aV~2~,…,aV~n~&gt;
 
 
-===== Addition and Subtraction
+==== Addition and Subtraction
 
 Adding or subtracting two Vectors occurs component-wise. That is the first component is added (subtracted) with the first component of the second Vector and so on.
 
 *P* + *Q* = &lt;P~1~+Q~1~, P~2~+Q~2~, …, P~n~+Q~n~&gt;
 
 
-===== Magnitude
+==== Magnitude
 
 The _magnitude_ defines the length of a Vector. A Vector of magnitude 1 is _unit length_.
 
@@ -284,7 +284,7 @@ For example, if *V* = (x, y, z), the magnitude is the square root of (x^2^ + y^2
 A Vector can be _normalized_ or made _unit length_ by multiplying the Vector by (1/magnitude).
 
 
-===== Dot Products
+==== Dot Products
 
 The dot product of two vectors is defined as:
 *P* dot *Q* = P~x~Q~x~ + P~y~Q~y~ + P~z~Q~z~
@@ -294,14 +294,14 @@ Using the dot product allows us to determine how closely two Vectors are pointin
 If the dot product is 0 then the two Vectors are _orthogonal_ or 90 degrees off.
 
 
-===== Cross Product
+==== Cross Product
 
 The Cross Product of two Vectors returns a third Vector that is prependicular to the two Vectors. This is very useful for calculating surface normals.
 
 *P* X *Q* = &lt;P~y~Q~z~ - P~z~Q~y~, P~z~Q~x~ - P~x~Q~z~, P~x~Q~y~ - P~y~Q~x~&gt;
 
 
-===== jME Class
+==== jME Class
 
 Vector3f and Vector2f store their values (x, y, z) and (x, y) respectively as floats. Most methods are straight forward, and I will leave documentation to the Javadoc.
 
@@ -348,7 +348,7 @@ These basic operations allow us to convert various rotation representations to Q
 You might wish to represent your rotations as Angle Axis pairs. That is, you define a axis of rotation and the angle with which to <<jme3/rotate#,rotate>> about this axis. <<jme3/quaternion#,Quaternion>> defines a method `fromAngleAxis` (and `fromAngleNormalAxis`) to create a Quaternion from this pair. This is acutally used quite a bit in jME demos to continually rotate objects. You can also obtain a Angle Axis rotation from an existing Quaternion using `toAngleAxis`.
 
 
-===== Example - Rotate a Spatial Using fromAngleAxis
+==== Example - Rotate a Spatial Using fromAngleAxis
 
 [source,java]
 ----
@@ -367,7 +367,7 @@ s.getLocalRotation().fromAngleAxis(angle, axis);
 You can also represent a rotation by defining three angles. The angles represent the rotation about the individual axes. Passing in a three-element array of floats defines the angles where the first element is X, second Y and third is Z. The method provided by Quaternion is `fromAngles` and can also fill an array using `toAngles`
 
 
-===== Example - Rotate a Spatial Using fromAngles
+==== Example - Rotate a Spatial Using fromAngles
 
 [source,java]
 ----
@@ -384,7 +384,7 @@ s.getLocalRotation().fromAngles(angles);
 If you have three axes that define your rotation, where the axes define the left axis, up axis and directional axis respectively) you can make use of `fromAxes` to generate the Quaternion. It should be noted that this will generate a new <<jme3/matrix#,Matrix>> object that is then garbage collected, thus, this method should not be used if it will be called many times. Again, `toAxes` will populate a Vector3f array.
 
 
-===== Example - Rotate a Spatial Using fromAxes
+==== Example - Rotate a Spatial Using fromAxes
 
 [source,java]
 ----
@@ -405,7 +405,7 @@ s.getLocalRotation().fromAxes(axes);
 Commonly you might find yourself with a <<jme3/matrix#,Matrix>> defining a rotation. In fact, it's very common to contain a rotation in a <<jme3/matrix#,Matrix>> create a Quaternion, rotate the Quaternion, and then get the <<jme3/matrix#,Matrix>> back. Quaternion contains a `fromRotationMatrix` method that will create the appropriate Quaternion based on the give <<jme3/matrix#,Matrix>>. The `toRotationMatrix` will populate a given <<jme3/matrix#,Matrix>>.
 
 
-===== Example - Rotate a Spatial Using a Rotation Matrix
+==== Example - Rotate a Spatial Using a Rotation Matrix
 
 [source,java]
 ----
@@ -428,7 +428,7 @@ As you can see there are many ways to build a Quaternion. This allows you to wor
 One of the biggest advantages to using Quaternions is allowing interpolation between two rotations. That is, if you have an initial Quaternion representing the original orientation of an object, and you have a final Quaternion representing the orientation you want the object to face, you can do this very smoothly with slerp. Simply supply the time, where time is [0, 1] and 0 is the initial rotation and 1 is the final rotation.
 
 
-===== Example - Use Slerp to Rotate Between two Quaternions
+==== Example - Use Slerp to Rotate Between two Quaternions
 
 [source,java]
 ----
@@ -494,14 +494,14 @@ FastMath provides a number of constants that can help with general math equation
 There are five major categories of functions that FastMath provides.
 
 
-===== Trig Functions
+==== Trig Functions
 
 * cos and acos - provide link:http://en.wikipedia.org/wiki/cosine[cosine] and link:https://en.wikipedia.org/wiki/Inverse_trigonometric_functions[arc cosine] values (make use of the look-up table if `USE_FAST_TRIG` is true)
 * sin and asin - provide link:http://en.wikipedia.org/wiki/sine[sine] and link:https://en.wikipedia.org/wiki/Inverse_trigonometric_functions[arc sine] values (make use of the look-up table if `USE_FAST_TRIG` is true)
 * tan and atan - provide link:http://en.wikipedia.org/wiki/tangent[tangent] and link:https://en.wikipedia.org/wiki/Inverse_trigonometric_functions[arc tangent] values
 
 
-===== Numerical Methods
+==== Numerical Methods
 
 * ceil - provides the ceiling (smallest value that is greater than or equal to a given value and an integer)of a value.
 * floor - provides the floor (largest value that is less than or equal to a given value and an integer) of a value.
@@ -516,13 +516,13 @@ There are five major categories of functions that FastMath provides.
 * invSqrt - provides the inverse link:http://en.wikipedia.org/wiki/Square_root[square root] of a value (1 / sqrt(value).
 
 
-===== Linear Algebra
+==== Linear Algebra
 
 * LERP - calculate the link:http://en.wikipedia.org/wiki/Linear_interpolation[linear interpolation] of two points given a time between 0 and 1.
 * determinant - calculates the link:http://en.wikipedia.org/wiki/determinant[determinant] of a 4x4 matrix.
 
 
-===== Geometric Functions
+==== Geometric Functions
 
 * counterClockwise - given three points (defining a triangle), the winding is determined. 1 if counter-clockwise, -1 if clockwise and 0 if the points define a line.
 * pointInsideTriangle - calculates if a point is inside a triangle.
@@ -530,7 +530,7 @@ There are five major categories of functions that FastMath provides.
 * cartesianToSpherical - converts a point from link:https://en.wikipedia.org/wiki/Cartesian[cartesian coordinates] to link:https://en.wikipedia.org/wiki/Spherical_coordinate_system[spherical coordinates].
 
 
-===== Misc.
+==== Misc.
 
 * newRandomFloat - obtains a random float.
 
@@ -609,7 +609,7 @@ Vector3f normal = new Vector3f(0,1,0);
 float constant = new Vector3f(1,1,1).dot(normal);
 Plane testPlane = new Plane(normal, constant);
 
-int side = testPlane.whichSide(new Vector3f(2,1,0);
+int side = testPlane.whichSide(new Vector3f(2,1,0));
 
 if(side == Plane.NO_SIDE) {
    System.out.println("This point lies on the plane");

+ 4 - 4
src/docs/asciidoc/jme3/math_for_dummies.adoc

@@ -10,16 +10,16 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == jMonkeyEngine3 Math for Dummies
 
-iframe::https://jmonkeyengine.github.io/wiki/tutorials/math[width="100%", height="850px", alt="", scroll="true",border="true",align="false"]
-
++++
+<iframe src=https://jmonkeyengine.github.io/wiki/tutorials/math width="100%" height="850px" alt=""></iframe>
++++
 
+//iframe::https://jmonkeyengine.github.io/wiki/tutorials/math[width="100%", height="850px", alt="", scroll="true",border="true",align="false"]
 
 [TIP]
 ====
 
-
 *  You can open this presentation in link:https://jmonkeyengine.github.io/wiki/tutorials/math[Fullscreen Mode].
 *  When using link:http://www.apple.com/safari/[Safari] as a browser the presentation is animated.
 
-
 ====

+ 10 - 10
src/docs/asciidoc/jme3/requirements.adoc

@@ -1,6 +1,6 @@
 = jMonkeyEngine3 Requirements
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../
 :imagesdir: ..
@@ -20,10 +20,10 @@ These are the minimum requirements for developers who create games using the jMo
 |===
 
 a|Operating system
-a|Mac +++<abbr title="Operating System">OS</abbr>+++ X, Windows, Linux, Solaris 
+a|Mac +++<abbr title="Operating System">OS</abbr>+++ X, Windows, Linux, Solaris
 
 a|Memory (JVM heap size)
-a| &gt; 40 +++<abbr title="Megabyte">MB</abbr>+++ ++ memory for assets 
+a| &gt; 40 +++<abbr title="Megabyte">MB</abbr>+++ ++ memory for assets
 
 a|CPU
 a|&gt; 1 +++<abbr title="Gigahertz">GHz</abbr>+++
@@ -33,9 +33,9 @@ a|AMD/ATI Radeon 9500, NVIDIA GeForce 5 FX, Intel GMA 4500, or better +
 supporting OpenGL 2.0 or better (native libraries are included in download)
 
 a|Java Development Kit
-a|JDK 6 or higher +
+a|JDK 7 or higher +
 Your development team gets the Java Development Kit for free from link:http://www.java.com[http://www.java.com]; for Mac +++<abbr title="Operating System">OS</abbr>+++, see link:http://support.apple.com/kb/DL1421[apple.com]. +
-At least intermediate Java experience is required. 
+At least intermediate Java experience is required.
 
 |===
 
@@ -49,10 +49,10 @@ These are the minimum requirements for your customers, users who play the games
 |===
 
 a|Operating system
-a|Mac +++<abbr title="Operating System">OS</abbr>+++ X, Windows, Linux, Solaris 
+a|Mac +++<abbr title="Operating System">OS</abbr>+++ X, Windows, Linux, Solaris
 
 a|Memory (JVM heap size)
-a| &gt; 10 +++<abbr title="Megabyte">MB</abbr>+++ ++ memory for assets (models, textures, sounds, etc, of a particular game) 
+a| &gt; 10 +++<abbr title="Megabyte">MB</abbr>+++ ++ memory for assets (models, textures, sounds, etc, of a particular game)
 
 a|CPU
 a|&gt; 1 +++<abbr title="Gigahertz">GHz</abbr>+++
@@ -61,13 +61,13 @@ a|Graphic card
 a|AMD/ATI Radeon 9500, NVIDIA GeForce 5 FX, Intel GMA 4500, or better +
 supporting OpenGL 2.0 or better (native libraries are included in download)
 
-a|link:http://jmonkeyengine.org/groups/android/forum/topic/does-my-phone-meet-the-requirements-necessary-to-run-jmonkeyengine-3/[Android Devices]
+a|link:https://hub.jmonkeyengine.org/t/does-my-phone-meet-the-requirements-necessary-to-run-jmonkeyengine-3/17231[Android Devices]
 a|(For mobile games only) Android 2.2 +++<abbr title="Operating System">OS</abbr>+++, graphics card supporting OpenGL 2
 
 a|Java Runtime
 a|Java 5 or higher +
 The Java Virtual Machine (JVM) is required to run jME games. +
-The JVM is often preinstalled, if not, your users get it for free from link:http://www.java.com[http://www.java.com]; for Mac +++<abbr title="Operating System">OS</abbr>+++, see link:http://support.apple.com/kb/DL1421[apple.com]. 
+The JVM is often preinstalled, if not, your users get it for free from link:http://www.java.com[http://www.java.com]; for Mac +++<abbr title="Operating System">OS</abbr>+++, see link:http://support.apple.com/kb/DL1421[apple.com].
 
 |===
 

+ 5 - 3
src/docs/asciidoc/jme3/scenegraph_for_dummies.adoc

@@ -10,15 +10,17 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 == jMonkeyEngine3 Scene Graph for Dummies
 
-iframe::https://jmonkeyengine.github.io/wiki/tutorials/scenegraph[width="100%", height="850px", alt="", scroll="true",border="true",align="false"]
++++
+<iframe src=https://jmonkeyengine.github.io/wiki/tutorials/scenegraph width="100%" height="850px" alt=""></iframe>
++++
+
+//iframe::https://jmonkeyengine.github.io/wiki/tutorials/scenegraph[width="100%", height="850px", alt="", scroll="true",border="true",align="false"]
 
 
 [TIP]
 ====
 
-
 *  You can open this presentation in link:https://jmonkeyengine.github.io/wiki/tutorials/scenegraph[Fullscreen Mode].
 *  When using link:http://www.apple.com/safari/[Safari] as a browser the presentation is animated.
 
-
 ====

+ 18 - 20
src/docs/asciidoc/jme3/scripting.adoc

@@ -7,8 +7,8 @@
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-*Monkeys*,+
-+
+*Monkeys*,
+
 For anyone who still ask for something like *“Scripting” with JME3*, here is it, about it at once!
 
 We nearly reach 3.0, i’m so excited about it and want to write something for it. In this post you will have a good run from Zero to Hero with Groovy and Monkey :p
@@ -20,8 +20,10 @@ image::wiki/stll_monkey_typing.jpg[100,width="",height="",align="right"]
 
 [IMPORTANT]
 ====
-emoji:
-*Quick question*: What this related to my other tuts emoji:confused ?+[atomixtuts]
+emoji: +
+*Quick question*: What this related to my other tuts emoji:confused ? +
+
+pass:[[atomixtuts]]
 *Answer*: As I wrote the others, I thought I should write this first, because if no one know about Groovy, no one can understand a single line of my code emoji:confused , and it’s bad!
 ====
 
@@ -45,9 +47,6 @@ Let’s start!
 
 == Content:
 
-+
-+
-+
 
 .  GET STARTED
 .  LEARN GROOVY
@@ -75,8 +74,6 @@ Let’s start!
 ..  Codegen
 ..  Groovy – Almighty God!
 
-'''
-
 
 == GET STARTED
 
@@ -87,7 +84,6 @@ If you already know about Groovy and just curious about how to intergrate Groovy
 ====
 
 
-
 === WHAT IS GROOVY?
 
 *Groovy*…
@@ -98,7 +94,7 @@ image::wiki/groovy-logo.png[200,width="",height="",align="right"]
 is an agile and dynamic language for the Java Virtual Machine
 builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk
 
-link:http://groovy.codehaus.org/[http://groovy.codehaus.org/]
+link:http://groovy-lang.org/[http://groovy-lang.org/]
 
 
 === Highlight
@@ -121,19 +117,19 @@ link:http://en.wikipedia.org/wiki/Groovy_%28programming_language%29[http://en.wi
 
 If you used JMP to code your game (I don’t know about Eclipse users, sorry). Go to Update Center to install Groovy plugin, then download the lastest Groovy (ver2.1) and wrap it as a Library. You are ready for the adventure!
 
-link:http://groovy.codehaus.org/Download?nc[http://groovy.codehaus.org/Download?nc]
+link:http://groovy-lang.org/Download?nc[http://groovy-lang.org/Download?nc]
 
 
 === WHAT CAN BE SCRIPT
 
-_*or “TO SCRIPT OR NOT TO SCRIPT, is the PROBLEM”?*_
+*_or “TO SCRIPT OR NOT TO SCRIPT, is the PROBLEM”?_*
 
 *Everything*.
 You can do almost every thing with Groovy just like with Java.
 
 In this post i will show example by example every aspect of game you can develop with Groovy.
 
-+++<u>*Pros:*</u>+++
+*+++<u>Pros:</u>+++*
 
 *  Scripting is very common and intuitive way to do game programing. It's common because it's shorter, cleaner, easy to read, maintain and re-use.
 
@@ -145,7 +141,8 @@ In this post i will show example by example every aspect of game you can develop
 
 *  Performance improved recently: If you worry about the performance, , in the next release, it can even get to the speed of Java, and soon to be a very competitive opponent to Scala! Read this? link:http://java.dzone.com/articles/groovy-20-performance-compared[http://java.dzone.com/articles/groovy-20-performance-compared]
 
-+++<u>*Cons:*</u>+++
+*+++<u>Cons:</u>+++*
+
 It’s good, but what about the down-side?
 
 *  Can not run in Android, yet!
@@ -231,7 +228,7 @@ I means use your imagination. I give you some examples:
 *  Make a whole freaking game
 *  Even feed my dogs …
 
-[10 more]
+pass:[[10 more]]
 
 What I want to say is *Groovy* is for smarty, master it and it save you +++<u>freaking big times</u>+++ ! Java and Groovy are a sweetest combination of programing languages I ever tried beside of dozen of others.
 
@@ -247,7 +244,7 @@ Some of the example above will be include in this post or in my AtomScript proje
 
 Here are some website that you can find a lot of examples from simple to complicated tasks:
 
-link:http://groovy.codehaus.org/Cookbook+Examples[http://groovy.codehaus.org/Cookbook+Examples]
+link:http://groovy-lang.org/Cookbook+Examples[http://groovy-lang.org/Cookbook+Examples]
 
 link:http://www.groovyexamples.org/[http://www.groovyexamples.org/]
 
@@ -281,7 +278,7 @@ GOTO <<jme3/scripting/gpars_usecases#,gpars_usecases>>
 
 [TIP]
 ====
-First I recommend all who don't know much about Groovy read this official documentation link:http://groovy.codehaus.org/Embedding+Groovy[http://groovy.codehaus.org/Embedding+Groovy]
+First I recommend all who don't know much about Groovy read this official documentation link:http://groovy-lang.org/Embedding+Groovy[http://groovy-lang.org/Embedding+Groovy]
 ====
 
 
@@ -298,8 +295,9 @@ So technical problem and requirement will be dicussed first, then the Design of
 
 ==== NEED OF POWERFUL SCRIPTING SYSTEM
 
-iframe::https://docs.google.com/presentation/d/1Kc1ehI1qLbtEGe-6-q8NikY7Q77A6jvozDaX94BqX0g/embed?start=false&loop=false&delayms=3000[width="100%", height="850px", alt="", scroll="true",border="true",align="false"]
-
+++++
+<iframe src=https://docs.google.com/presentation/d/1Kc1ehI1qLbtEGe-6-q8NikY7Q77A6jvozDaX94BqX0g/embed?start=false&loop=false&delayms=3000 width="100%" height="850px" alt=""></iframe>
+++++
 
 
 ==== DESIGN & ARCHITECTURE

+ 6 - 6
src/docs/asciidoc/jme3/scripting/groovy_event.adoc

@@ -1,6 +1,6 @@
 = groovy_event
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -49,7 +49,7 @@ class EventHandler{
 }
 
 class CustomEvent{
-    
+
 }
 handler = new EventHandler();
 eventBus.register(handler);
@@ -68,18 +68,18 @@ Here, EventBus will play the communicate media in our Groovy scripting solution.
 
 === Trigger
 
-If you build up your game world's activites from Action, Trigger is the brick to build Gameplay. It's the combination of : Event + Condition → Action 
+If you build up your game world's activites from Action, Trigger is the brick to build Gameplay. It's the combination of : Event + Condition → Action
 
 The concept of trigger can be describle like this: When an Event happen, if it's passed a Condition check, the Action is taken. A more detailed description envolve: the Enviroment - a specific Context of those 3 (E - C - A), Durations , Threaded or not, Executor … But here we concern the most simple form, the Context is the single specific that procedure the Event and its Global awareness.
 
 In Groovy,
 
 *  Event is Class based, mentioned in the chapter above.
-*  Condition can be modeled with a Closure 
+*  Condition can be modeled with a Closure
 *  Action also very suitable with a Closure representation.
 
 
-===== Example1:
+==== Example1:
 
 [source,java]
 ----

+ 8 - 8
src/docs/asciidoc/jme3/scripting/groovy_learn.adoc

@@ -39,13 +39,13 @@ We will learn about it later.
 
 ==== Official syntax description
 
-link:http://groovy.codehaus.org/For+those+new+to+both+Java+and+Groovy[http://groovy.codehaus.org/For+those+new+to+both+Java+and+Groovy]
+link:http://groovy-lang.org/For+those+new+to+both+Java+and+Groovy[http://groovy-lang.org/For+those+new+to+both+Java+and+Groovy]
 
-link:http://groovy.codehaus.org/User+Guide[http://groovy.codehaus.org/User+Guide]
+link:http://groovy-lang.org/User+Guide[http://groovy-lang.org/User+Guide]
 
-link:http://groovy.codehaus.org/Logical+Branching[http://groovy.codehaus.org/Logical+Branching]
+link:http://groovy-lang.org/Logical+Branching[http://groovy-lang.org/Logical+Branching]
 
-link:http://groovy.codehaus.org/Looping[http://groovy.codehaus.org/Looping]
+link:http://groovy-lang.org/Looping[http://groovy-lang.org/Looping]
 
 For your overview, I will introduce the most important syntax of the language:
 
@@ -77,9 +77,9 @@ Beside with elegant syntax, Groovy has features you always wish that Java have,
 
 Read more about it here:
 
-link:http://groovy.codehaus.org/Closures[http://groovy.codehaus.org/Closures]
-link:http://groovy.codehaus.org/Closures+-+Informal+Guide[http://groovy.codehaus.org/Closures+-+Informal+Guide]
-link:http://groovy.codehaus.org/Closures+-+Formal+Definition[http://groovy.codehaus.org/Closures+-+Formal+Definition]
+link:http://groovy-lang.org/Closures[http://groovy-lang.org/Closures]
+link:http://groovy-lang.org/Closures+-+Informal+Guide[http://groovy-lang.org/Closures+-+Informal+Guide]
+link:http://groovy-lang.org/Closures+-+Formal+Definition[http://groovy-lang.org/Closures+-+Formal+Definition]
 
 What is a *Closure*?
 
@@ -101,7 +101,7 @@ Note that in the above example, “hello! is printed when the Closure is called,
 
 === and Gotchas
 
-link:http://groovy.codehaus.org/Differences+from+Java[http://groovy.codehaus.org/Differences+from+Java]
+link:http://groovy-lang.org/Differences+from+Java[http://groovy-lang.org/Differences+from+Java]
 
 
 === Meta-programming

+ 16 - 16
src/docs/asciidoc/jme3/simpleapplication_from_the_commandline.adoc

@@ -1,16 +1,17 @@
 = Starting a JME3 application from the Commandline
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, install
 :relfileprefix: ../
 :imagesdir: ..
+:experimental:
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
-Although we recommend the jMonkeyEngine <<sdk#,SDK>> for developing JME3 games, you can use any IDE (integrated development environment) such as <<jme3/setting_up_netbeans_and_jme3#,NetBeans>> or <<jme3/setting_up_jme3_in_eclipse#,Eclipse>>, and even work freely from the commandline. Here is a generic IDE-independent “getting started tutorial. 
+Although we recommend the jMonkeyEngine <<sdk#,SDK>> for developing JME3 games, you can use any IDE (integrated development environment) such as <<jme3/setting_up_netbeans_and_jme3#,NetBeans>> or <<jme3/setting_up_jme3_in_eclipse#,Eclipse>>, and even work freely from the commandline. Here is a generic IDE-independent "`getting started`" tutorial.
 
-This example shows how to set up and run a simple application (HelloJME3) that depends on the jMonkeyEngine3 libraries. 
+This example shows how to set up and run a simple application (HelloJME3) that depends on the jMonkeyEngine3 libraries.
 
 The directory structure will look as follows:
 
@@ -31,14 +32,14 @@ HelloJME3/src
 
 == Installing the JME3 Framework
 
-To install the development version of jme3, link:http://updates.jmonkeyengine.org/stable/3.0/engine[download the nightly build], unzip the folder into a directory named `jme3`. The filenames here are just an example, but they will always be something like `jME3_xx-xx-2011`. 
+To install the development version of jme3, download the latest  link:https://github.com/jMonkeyEngine/jmonkeyengine/releases[stable release], unzip the folder into a directory named `jme3`. The filenames here are just an example, but they will always be something like `jME3.x-stable`.
 
 [source]
 ----
 
 mkdir jme3
 cd jme3
-unzip jME3_01-18-2011.zip
+unzip jME3.1-stable.zip
 
 ----
 
@@ -46,16 +47,15 @@ Alternatively, you can build JME3 from the sources. (Recommended for JME3 develo
 
 [source]
 ----
-
 svn checkout https://jmonkeyengine.googlecode.com/svn/branches/3.0final/engine jme3
 cd jme3
 ant run
 cd ..
-
 ----
 
-If you see a Test Chooser application open now, the build was successful. *Tip:* Use just `ant` instead of `ant run` to build the libraries without running the demos.
+If you see a Test Chooser application open now, the build was successful.
 
+TIP: Use just ant instead of ant run to build the libraries without running the demos.
 
 == Sample Project Directory Structure
 
@@ -78,7 +78,7 @@ Next you copy the necessary JAR libraries from the download to your project. You
 [source]
 ----
 
-mkdir HelloJME3/build 
+mkdir HelloJME3/build
 mkdir HelloJME3/lib
 cp jme3/lib/*.* HelloJME3/lib
 
@@ -89,7 +89,7 @@ If you have built JME3 from the sources, then the copy paths are different:
 [source]
 ----
 
-mkdir HelloJME3/build 
+mkdir HelloJME3/build
 mkdir HelloJME3/lib
 cp jme3/dist/*.* HelloJME3/lib
 
@@ -123,7 +123,7 @@ public class HelloJME3 extends SimpleApplication {
     public void simpleInitApp() {
         Box b = new Box(Vector3f.ZERO, 1, 1, 1);
         Geometry geom = new Geometry("Box", b);
-        Material mat = new Material(assetManager, 
+        Material mat = new Material(assetManager,
           "Common/MatDefs/Misc/Unshaded.j3md");
         mat.setColor("Color", ColorRGBA.Blue);
         geom.setMaterial(mat);
@@ -141,7 +141,7 @@ We build the sample application into the build directory…
 ----
 
 cd HelloJME3
-javac -d build -cp "lib/eventbus-1.4.jar:lib/j-ogg-oggd.jar:lib/j-ogg-vorbisd.jar:lib/jME3-lwjgl-natives.jar:lib/jbullet.jar:lib/jinput.jar:lib/lwjgl.jar:lib/stack-alloc.jar:lib/vecmath.jar:lib/xmlpull-xpp3-1.1.4c.jar:lib/jME3-blender.jar:lib/jME3-core.jar:lib/jME3-desktop.jar:lib/jME3-jogg.jar:lib/jME3-plugins.jar:lib/jME3-terrain.jar:lib/jME3-testdata.jar:lib/jME3-niftygui.jar:lib/nifty-default-controls.jar:lib/nifty-examples.jar:lib/nifty-style-black.jar:lib/nifty.jar:." src/hello/HelloJME3.java 
+javac -d build -cp "lib/eventbus-1.4.jar:lib/j-ogg-oggd.jar:lib/j-ogg-vorbisd.jar:lib/jME3-lwjgl-natives.jar:lib/jbullet.jar:lib/jinput.jar:lib/lwjgl.jar:lib/stack-alloc.jar:lib/vecmath.jar:lib/xmlpull-xpp3-1.1.4c.jar:lib/jME3-blender.jar:lib/jME3-core.jar:lib/jME3-desktop.jar:lib/jME3-jogg.jar:lib/jME3-plugins.jar:lib/jME3-terrain.jar:lib/jME3-testdata.jar:lib/jME3-niftygui.jar:lib/nifty-default-controls.jar:lib/nifty-examples.jar:lib/nifty-style-black.jar:lib/nifty.jar:." src/hello/HelloJME3.java
 
 ----
 
@@ -154,9 +154,9 @@ cd build
 java -cp "../lib/eventbus-1.4.jar:../lib/j-ogg-oggd.jar:../lib/j-ogg-vorbisd.jar:../lib/jME3-lwjgl-natives.jar:../lib/jbullet.jar:../lib/jinput.jar:../lib/lwjgl.jar:../lib/stack-alloc.jar:../lib/vecmath.jar:../lib/xmlpull-xpp3-1.1.4c.jar:../lib/jME3-blender.jar:../lib/jME3-core.jar:../lib/jME3-desktop.jar:../lib/jME3-jogg.jar:../lib/jME3-plugins.jar:../lib/jME3-terrain.jar:../lib/jME3-testdata.jar:../lib/jME3-niftygui.jar:../lib/nifty-default-controls.jar:../lib/nifty-examples.jar:../lib/nifty-style-black.jar:../lib/nifty.jar:." hello/HelloJME3
 ----
 
-Note: If you use Windows, the classpath separator is “; instead of “:.
+NOTE: If you use Windows, the classpath separator is kbd:[\ ]  instead of kbd:[/].
 
-If a settings dialog pops up, confirm the default settings. You should now see a simple window with a 3-D cube. Use the mouse and the WASD keys to move. It works! 
+If a settings dialog pops up, confirm the default settings. You should now see a simple window with a 3-D cube. Use the mouse and the WASD keys to move. It works!
 
 
 == Recommended Asset Directory Structure
@@ -192,7 +192,7 @@ import com.jme3.scene.Spatial;
 
 ----
 
-You will learn more about the asset manager and how to customize it later. For now feel free to structure your assets (images, textures, models) into further sub-directories, like in this example the `assets/models/Elephant` directory that contains the `elephant.meshxml` model and its materials.
+You will learn more about the asset manager and how to customize it later. For now feel free to structure your assets (images, textures, models) into further sub-directories, like in this example the `assets/models/Elephant` directory that contains the `elephant.mesh.xml` model and its materials.
 
 
 == Next Steps

+ 61 - 10
src/docs/asciidoc/jme3/virtualreality.adoc

@@ -1,4 +1,4 @@
-= virtualreality
+= Virtual Reality
 :author: 
 :revnumber: 
 :revdate: 2016/10/23 11:22
@@ -10,22 +10,73 @@ jMonkeyEngine 3 has a wide range of support for Virtual Reality (VR). The known
 
 HTC Vive and systems supporting SteamVR/OpenVR
 
+Native Oculus Rift support (and through SteamVR)
+
 Razer HDK and systems supporting OSVR
 
 Google Cardboard / GoogleVR
 
-Legacy: Oculus Rift 0.5
+== Sample Application
+
+[source,java]
+----
+public class Main extends SimpleApplication {
+
+    public static void main(String[] args) {
+        AppSettings settings = new AppSettings(true);
+        settings.put(VRConstants.SETTING_VRAPI, VRConstants.SETTING_VRAPI_OPENVR_VALUE);
+        settings.put(VRConstants.SETTING_ENABLE_MIRROR_WINDOW, true);
+       
+        VREnvironment env = new VREnvironment(settings);
+        env.initialize();
+        
+    	// Checking if the VR environment is well initialized 
+    	// (access to the underlying VR system is effective, VR devices are detected).
+    	if (env.isInitialized()){
+            VRAppState vrAppState = new VRAppState(settings, env);
+            vrAppState.setMirrorWindowSize(1024, 800);
+            Main app = new Main(vrAppState);
+            app.setLostFocusBehavior(LostFocusBehavior.Disabled);
+            app.setSettings(settings);
+            app.setShowSettings(false);
+            app.start();
+        }
+    }
+    
+    public Main(AppState... appStates) {
+        super(appStates);
+    }
+
+    @Override
+    public void simpleInitApp() {
+        Box b = new Box(1, 1, 1);
+        Geometry geom = new Geometry("Box", b);
+
+        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
+        mat.setColor("Color", ColorRGBA.Blue);
+        geom.setMaterial(mat);
+
+        rootNode.attachChild(geom);
+    }
+
+    @Override
+    public void simpleUpdate(float tpf) {
+        //TODO: add update code
+    }
 
-In any form of VR, a library is needed as support is not built in to the core of jMonkeyEngine3.
+    @Override
+    public void simpleRender(RenderManager rm) {
+        //TODO: add render code
+    }
+}
+----
+Project source: https://github.com/neph1/VRSampleApplication
 
-== jMonkeyVR (https://github.com/phr00t/jMonkeyVR)
-This is the main library to use when you want wide VR support. It has full OpenVR/SteamVR support and OSVR support in the making (as of Oct 2016)
 
-== jme3-osvr (https://github.com/neph1/jme3-osvr)
-Together with https://github.com/neph1/OSVR-Java provides rudimentary OSVR support (extended mode). Examples: https://github.com/neph1/jme3-osvr-examples
+== Google Cardboard VR SDK 1.0 integration
+gvr-android-jme (https://github.com/nordfalk/gvr-android-jme)
 
-== gvr-android-jme (https://github.com/nordfalk/gvr-android-jme)
-Google Cardboard VR SDK 1.0 integration
 
 == Legacy
-There is legacy support for Oculus Rift up to version 0.5: https://github.com/neph1/jmonkeyengine-oculus-rift
+The following projects are not up to date, but may provide functionality not found in the other packages.
+Google Cardboard up to version 0.6: https://github.com/neph1/jme-cardboard

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

@@ -42,7 +42,7 @@ The built-in help system lets you browse a local copy of the documentation pulle
 == All Features and Usecases
 
 
-==== Video Tutorials
+=== Video Tutorials
 
 *SDK Use Case Tutorials*
 
@@ -66,7 +66,7 @@ The built-in help system lets you browse a local copy of the documentation pulle
 image:sdk/jmonkeyplatform-docu-4.png[jmonkeyplatform-docu-4.png,width="421",height="298",align="right"] +
 image:jme3-built-in-help.png[jme3-built-in-help.png,width="400",height="260",align="right"]
 
-==== SDK User Guide
+=== SDK User Guide
 
 *Getting Started*
 

+ 5 - 6
src/docs/asciidoc/sdk/development/sceneexplorer.adoc

@@ -1,6 +1,6 @@
 = The SceneExplorer
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :relfileprefix: ../../
 :imagesdir: ../..
@@ -12,7 +12,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 If your plugin brings in its own SceneGraph objects you can still have them work like any other SceneExplorer item, including its special properties.
 
-If you want to support special properties of your objects that are not exposed by the SDK automatically, you will have to create your own class that extends org.openide.nodes.Node and implement the interface com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode. Then you register that class by adding 
+If you want to support special properties of your objects that are not exposed by the SDK automatically, you will have to create your own class that extends org.openide.nodes.Node and implement the interface com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode. Then you register that class by adding
 
 [source]
 ----
@@ -178,7 +178,7 @@ public class JmeGhostControl extends AbstractSceneExplorerNode {
 
         set.put(makeProperty(obj, Vector3f.class, "getPhysicsLocation", "setPhysicsLocation", "Physics Location"));
         set.put(makeProperty(obj, Quaternion.class, "getPhysicsRotation", "setPhysicsRotation", "Physics Rotation"));
-        
+
         set.put(makeProperty(obj, CollisionShape.class, "getCollisionShape", "setCollisionShape", "Collision Shape"));
         set.put(makeProperty(obj, int.class, "getCollisionGroup", "setCollisionGroup", "Collision Group"));
         set.put(makeProperty(obj, int.class, "getCollideWithGroups", "setCollideWithGroups", "Collide With Groups"));
@@ -304,7 +304,7 @@ public class NewRigidBodyAction extends AbstractNewControlAction {
 ----
 
 
-==== Adding using a Wizard
+=== Adding using a Wizard
 
 You can create a new wizard using the wizard template in the SDK (New File→Module Development→Wizard). The Action that the template creates can easily be changed to one for adding a Control or Spatial or for applying a Tool. Note that we extend AbstractNewSpatial*Wizard*Action here.
 
@@ -407,4 +407,3 @@ public class AddSkyboxAction extends AbstractNewSpatialWizardAction {
 ====
 The abstract spatial and control actions implement undo/redo automatically, for the ToolActions you have to implement it yourself.
 ====
-

+ 16 - 14
src/docs/asciidoc/sdk/use_own_jme.adoc

@@ -1,28 +1,30 @@
 = use_own_jme
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, sdk, project, builds
 :relfileprefix: ../
 :imagesdir: ..
+:experimental:
+
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
 == How to integrate your own jME3 compile in jMonkeyEngine SDK projects
 
-.  <<jme3/build_jme3_sources_with_netbeans#,Download jme3 project from svn>>
+.  <<jme3/build_jme3_sources_with_netbeans#,Download jme3 project>>
 .  Make your changes
 .  Compile jme3 project
-.  Go to Tools → Libraries
-.  Press “New Library
-.  Name it “jme3-modified
-.  Press “Add Jar/Folder
+.  Go to `menu:Tools[Libraries]`
+.  Press btn:[New Library]
+.  Name it "`jme3-modified`"
+.  Press btn:[Add Jar/Folder]
 .  Select all JAR files from the `dist` dir of the compiled jme3 version
-.  Add the `src` folder of the jme3 project in the “sources tab
-.  Optionally javadoc in the “javadoc tab
-.  Press “OK
-.  Right-click your project and select “Properties
-.  Select “Libraries to the left
-.  Remove the “jme3 library
-.  Press “Add Library and select the “jme3-modified library
+.  Add the `src` folder of the jme3 project in the "`sources`" tab
+.  Optionally javadoc in the "`javadoc`" tab
+.  Press btn:[OK]
+.  btn:[RMB] select your project and choose "`Properties`"
+.  Select "`Libraries`" to the left
+.  Remove the "`jme3`" library
+.  Press btn:[Add Library] and select the "`jme3-modified`" library

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

@@ -43,7 +43,7 @@ The built-in help system lets you browse a local copy of the documentation pulle
 == All Features and Usecases
 
 
-==== Video Tutorials
+=== Video Tutorials
 
 *SDK Use Case Tutorials*
 
@@ -67,7 +67,7 @@ image::sdk/jmonkeyplatform-docu-4.png[jmonkeyplatform-docu-4.png,width="421",hei
 
 
 
-==== SDK User Guide
+=== SDK User Guide
 
 *Getting Started*
 

+ 3 - 3
src/docs/asciidoc/spidermonkey.adoc

@@ -1,6 +1,6 @@
 = SpiderMonkey (Deprecated!)
-:author: 
-:revnumber: 
+:author:
+:revnumber:
 :revdate: 2016/03/17 20:48
 :keywords: documentation, network
 ifdef::env-github,env-browser[:outfilesuffix: .adoc]
@@ -48,7 +48,7 @@ SpiderMonkey creates two connections by default. A TCP connection for a reliable
 Serializing is an aspect that received a lot of attention. I wanted it to be simple for people to register their own messages, but also be able to register serializers for their own object types. The system works by registering classes to serializers. Generally, a serializer does not exist without a class it can serialize - simply because it doesn't have to: Why have a serializer when there's nothing to serialize. A lot of work has been put into making it as efficient as possible. What can be left out, is left out, and what can optimized, is optimized.
 
 
-==== Field serializer
+=== Field serializer
 
 The default serializer requires some explanation. This serializer serializes all classes that have no (registered) serializer. The field serializer works by saving all fields internally, so it can access them on serialization faster. The fields are taken, and their types are checked. They are put through a serializer again (which serializer depends, of course, on the data type). Then they are ready to be written to the buffer. As you can tell, this is quite a simple serializer, and should be used if your message don't require extra attention. See <<spidermonkey/tutorial/serializing#,this tutorial>> if you want to know how to register your own messages or serializers.
 

+ 20 - 0
src/docs/asciidoc/wiki/admonitions.adoc

@@ -0,0 +1,20 @@
+= Admonition Definitions
+:author: mitm
+:revnumber:
+:revdate: 2017-09-08T23:24:11.262Z
+:relfileprefix: ../
+:imagesdir: ..
+:experimental:
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+
+
+NOTE: This is a Note Admonition. They are used to give you additionl information about the topic at hand.
+
+TIP: This is a Tip Admonition. They are intended to give you a small but useful piece of practical advice.
+
+IMPORTANT: This is an Important Admonition. This means the information is of great significance or value and should not be ignored.
+
+CAUTION: This is a Caution Admonition. When you see these you should pay particular attention to the information and care should be taken to avoid mistakes.
+
+WARNING: This is a Warning Admonition. The information should be taken very seriously and indicates a possible problem, or other unpleasant situation may arrise if ignored.

+ 196 - 0
src/docs/asciidoc/wiki/atom_editor.adoc

@@ -0,0 +1,196 @@
+= Atom Editor for Wiki Editing
+:author: mitm
+:revnumber:
+:revdate: 2017-09-08T23:24:11.262Z
+:relfileprefix: ../
+:imagesdir: ..
+:experimental:
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+
+Contributing to the Wiki is now easier than it ever has been. Using the Atom editor will give you an easy to use interface that is cross-platform, has code completion, syntax highlighting, instant AsciiDoctor page previewing, with an integrated GitHub client. The only thing it doesn't do is write the page for you.
+
+== Atom Editor Setup
+
+.Prerequisites
+.  Have a link:https://github.com/[GitHub account].
+.  Are a Wiki project member.
+
+If you are not a member, you fork the repository into your GitHub account and issue "`Pull`" requests to the Wiki repository from there.
+
+To fork the Wiki repository into your GitHub Account:
+
+.  Navigate to link:https://github.com/jMonkeyEngine/wiki[https://github.com/jMonkeyEngine/wiki].
+.  In the menu at the top of the page, select the icon:code-fork[]*Fork* button.
+
+== Downloading the Sources
+
+.  Download and install the Atom editor - https://atom.io/
+.  After installation is complete, you can customize the editor by selecting the `Choose A Theme` panel followed by the btn:[Theme Picker] button.
+.  Once you are satisfied with the customization of the editor, you will need to add several packages to make Atom AsciiDoctor compatible. Package installation is painless.
+..  From the `Install A Package` panel, select the btn:[Open Installer] button, or select `menu:Packages[Settings View>Install Packages/Themes]` from the file header.
+..  Enter "`asciidoc`" in the search box and press the btn:[Packages] button.
++
+.Add these packages:
+*** *language-asciidoc* +
+*** *asciidoc-preview* +
+*** *autocomplete-asciidoc*
++
+TIP: You can add more GitHub controls to the editor by adding the package `*git-plus*`.
+
+.  To edit the Wiki you will need to clone the wiki repository.
+..  From the `Command Palette` (kbd:[ctrl]+kbd:[shift] +kbd:[P]  or `menu:Packages[Command Palette>Toggle]`), enter "`git`" into the search box.
+..  Select btn:[GitHub: Clone].
+..  Paste the wiki the +++<abbr title="Uniform Resource Locator">URL</abbr>+++ into the `Clone from` box.
++
+--
+[source]
+----
+https://github.com/jMonkeyEngine/wiki
+----
+The `To directory` will automatically update when you do.
+
+IMPORTANT: Use the +++<abbr title="Uniform Resource Locator">URL</abbr>+++ to your repository fork and clone your fork if a non-member.
+--
+
+..  When you're ready, press the btn:[Clone] button.
++
+The clone will take some time due to the size of the Wiki. Once cloned, a new `Project` tab will open on the left, and the `Git` and `GitHub Preview` tabs will open to the right. If they don't, you can open the Git tab using kbd:[ctrl]+kbd:[shift]+kbd:[9]  and the GitHub Preview tab using kbd:[ctrl]+kbd:[shift]+kbd:[8]. Alternatively, you can navigate the `menu:Packages[GitHub]` menu. You will also notice in the lower right corner, on the `Status Bar`, you now have your GitHub control.
+
+.  Before you can commit any changes to the Wiki, you must configure at least the user.email and user.name variables for Git. You can do this via Git Bash, or manually, by following these instructions.
+
+*  Git Bash:  link:https://help.github.com/articles/setting-your-commit-email-address-in-git/[Setting your commit email address in Git]
+*  Manually: link:https://help.github.com/articles/setting-your-commit-email-address-on-github/[Set your commit email address on GitHub]
+..  Open your `.gitconfig` file (located in USER_HOME) and add:
++
+[source]
+----
+[user]
+        name = yourname
+        email = youremail
+----
+..  To maintain your privacy, setup your email settings in your GitHub account and use the `users.noreply.github.com` email address.
+
+.  Lastly, you will need to create a GitHub token. Follow the directions in the popup to enter the token.
+
+All Wiki documents live in the `asciidoc` folder, images in the `images` folder, and resources for your documents in the `resources` folder. Select an appropriate folder under each to store your new document, image or resource.
+
+When you edit a Wiki page, the Git tab will show any unstaged changes. When you're done making changes, you stage any or all changes, write your commit message, commit, and then push the changes.
+
+You can preview your documents by selecting the document and using the keyboard shortcut kbd:[ctrl]+kbd:[shift]+kbd:[A] or by using the File header menu menu:Packages[AsciiDoc Preview>Toggle Preview].
+
+
+== Updating Local Wiki Copies
+
+
+It's a good idea to update your local copy of the Wiki prior to commiting any changes.
+
+.Members
+Update your local copy of the Wiki from the Atom Editor by issuing a Pull command prior to Commit/Push.
+
+As a member, you issue Git commands from the Atom Editor.
+
+.Non-Members
+Update your local copy of the Wiki by issuing a pull request from your forked repository to the Wiki repository prior to pushing your commit to your fork.
+
+.  Go to your version of the repository on GitHub.
+.  Click the btn:[New Pull Request] button at the top.
++
+NOTE: The Wiki repository will be on the left and your repository will be on the right.
+
+.  Click the btn:[Base] button on the left and from the drop down list select your forked repository.
+.  Click the "`compare across forks`" link.
+.  Click the btn:[Head Fork] button and from the drop down list select the Wiki repository.
+.  If the repositories are not identical, there will be green button btn:[Create pull request]. Click it to update your repository.
+.  Update your local copy by doing a Pull request in Atom.
+
+IMPORTANT: As a non-member, when there is interaction between the Wiki repository and your fork, you issue commands online. When the interaction is between your forked repository and your local copy, you issue commands from Atom.
+
+
+== Pushing Changes
+
+.Members
+As a member, you issue all Git commands from the Atom Editor.
+
+.Non-Members
+To submit changes to the Wiki repository after pushing them to your fork:
+
+.  Go to your version of the Wiki repository on GitHub.
+.  Click the btn:[New Pull Request] button at the top.
+.  Note that the jMonkeyEngine repository will be on the left and your repository will be on the right.
+.  Click the green button btn:[Create pull request]. Give a succinct and informative title, in the comment field give a short explanation of the changes and click the green button btn:[Create pull request] again.
+
+IMPORTANT: As a non-member, when there is interaction between the Wiki repository and your fork, you issue commands online. When the interaction is between your forked repository and your local copy, you issue commands from Atom.
+
+
+== Wiki Template
+
+
+To make things even easier, you can create your own Wiki template for page creation. You must first have the `*file-templates*` package installed. You can find this package by selecting `menu:File[Settings>Install]` and typing "`template`" into the search box.
+
+.  Once installed, from the `Command Palette` (kbd:[ctrl]+kbd:[shift] +kbd:[P] or `menu:Packages[Command Palette>Toggle]`) enter "`file`" into the search box.
+.  Select btn:[File Templates: New Template].
+.  For `Template Name`, use `Jme3 Wiki Template`, and when ready select btn:[Create].
+.  From the `Command Palette`, enter "`file`" and select btn:[File Templates: Update Template].
+.  If this is the first template it will open automatically. If not, then select the `Jme3 Wiki Template` you just created and press the btn:[Edit Template] button.
+.  Copy and paste the text below into the head of the document.
++
+[source,subs="+macros"]
+----
+= Enter Document Title Here
+:author: @author@
+:revnumber:
+:revdate: @timestamp@
+:relfileprefix: Enter path to asciidoc folder ../../
+:imagesdir: Enter path to images folder ../..
+:experimental:
+ifdef++::++env-github,env-browser[:outfilesuffix: .adoc]
+----
+.  When done, close the document and when it asks you if you want to save it select btn:[Yes] .
+
+You can now use your template when creating new Wiki documents by opening the `Command Palette`, entering "`file`" into the search box, and selecting btn:[File Templates: New File].
+
+[TIP]
+====
+To edit the template, from the `Command Palette` (kbd:[ctrl]+kbd:[shift] +kbd:[P]) type "`file`" into the search box and select: +
+`menu:File Templates: Update Template[Jme3 Wiki Page>Edit Template]`
+
+Save the edit when finished.
+====
+
+See also:
+
+<<wiki/wiki_header#,Anatomy of a Wiki Header>>
+
+
+== Atom Snippets
+
+
+[quote, Atom Flight Manual: Snippets]
+Snippets are an incredibly powerful way to quickly generate commonly needed code syntax from a shortcut.
+
+One advantage of using Atom as an editor for the Wiki comes from the use of link:http://flight-manual.atom.io/using-atom/sections/snippets/[Snippets]. You can see a list of available snippets for your document by using the `Command Palette` (kbd:[ctrl]+kbd:[shift] +kbd:[P] or `menu:Packages[Command Palette>Toggle]`). Enter "`snippets`" into the search box and select btn:[Snippets: Available].
+
+The Atom AsciiDoc packages add great functionality to the editor, but they do not cover everything that's possible when using AsciiDoctor syntax. You can customize the editor even further by adding your own snippets. I will get you started with your first snippet. Simply copy and paste the code below into your "`snippets.cson`" file and save. You can locate the file under menu:File[Snippets].
+
+[source]
+----
+'.source.asciidoc':
+  'Inter-Doc Cross Reference':
+    'prefix': 'xref'
+    'body': '<<${1:path/to/wiki/page}#,${2:custom label text}>>'
+----
+
+Thereafter just type kbd:[xref] and hit kbd:[Tab] to insert an Inter-Document Cross Reference link. You can then use the kbd:[Tab] key to cycle through each tab stop when your ready.
+
+You can help the jMonkey community by adding new snippets. Use your editor and edit the <<wiki/atom_snippets#,Atom Snippets>> document. Make sure to announce any proposed changes on the link:https://hub.jmonkeyengine.org/[jMonkeyEngine Forum] under the topic "`Documentation`" first so others are aware and can test out your proposed change.
+
+'''
+Next steps,
+
+*  Read the Wiki link:https://github.com/jMonkeyEngine/wiki[README] page.
+*  Add link:http://asciidoctor.org/docs/user-manual/#introduction-to-asciidoctor[Introduction to Asciidoctor] to your favorites, you will refer to it often.
+*  Add the link:https://atom.io/docs[Atom Docs] to your favorites.
+*  Add the link:http://flight-manual.atom.io/[Atom Flight Manual] to your favorites.
+*  Add the link:http://rogerdudler.github.io/git-guide/[git - the simple guide] to your favorites.
+*  Start contributing.

+ 40 - 0
src/docs/asciidoc/wiki/atom_snippets.adoc

@@ -0,0 +1,40 @@
+= Atom Snippets Page
+:author: mitm
+:revnumber:
+:revdate: 2017-09-08T23:24:11.262Z
+:relfileprefix: ../
+:imagesdir: ..
+:experimental:
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+
+Edit this file to add snippets to the snippets.cson file for the link:https://atom.io/[Atom editor]. To use these snippets just copy and paste the text below into your snippets.cson file.
+
+[source]
+----
+# Your snippets
+#
+# Atom snippets allow you to enter a simple prefix in the editor and hit tab to
+# expand the prefix into a larger code block with templated values.
+#
+# You can create a new snippet in this file by typing "snip" and then hitting
+# tab.
+#
+# An example CoffeeScript snippet to expand log to console.log:
+#
+# '.source.coffee':
+#   'Console log':
+#     'prefix': 'log'
+#     'body': 'console.log $1'
+#
+# Each scope (e.g. '.source.coffee' above) can only be declared once.
+#
+# This file uses CoffeeScript Object Notation (CSON).
+# If you are unfamiliar with CSON, you can read more about it in the
+# Atom Flight Manual:
+# http://flight-manual.atom.io/using-atom/sections/basic-customization/#_cson
+'.source.asciidoc':
+  'Inter-Doc Cross Reference':
+    'prefix': 'xref'
+    'body': '<<${1:path/to/wiki/page}#,${2:custom label text}>>'
+----

+ 65 - 0
src/docs/asciidoc/wiki/wiki_header.adoc

@@ -0,0 +1,65 @@
+= Anatomy of a Wiki Header
+:author: mitm
+:revnumber:
+:revdate: 2017-09-08T23:24:11.262Z
+:relfileprefix: ../
+:imagesdir: ..
+:experimental:
+ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+
+All wiki documents use these header attributes. Optional attributes can be left blank following the kbd:[:] colon symbol.
+
+[source,subs="+macros"]
+----
+= Enter Document Title Here
+:author:
+:revnumber:
+:revdate:
+:relfileprefix: ../../
+:imagesdir: ../..
+:experimental:
+ifdef++::++env-github,env-browser[:outfilesuffix: .adoc]
+----
+
+*pass:[=]* Mandatory. Title of your document.
+
+*pass:[:]author:* Optional. Document author.
+
+*pass:[:]revnumber:* Optional. Revision number.
+
+*pass:[:]revdate:* Optional. Revision Date
+
+*pass:[:]relfileprefix:* Mandatory. Enter a path to the "`asciidoc`" folder.
+
+TIP: Use `Tree View` (kbd:[ctrl]+kbd:[\ ] or `menu:View[Toggle Tree View]`) to locate the "`asciidoc`" folder if using the link:https://atom.io/[Atom editor].
+
+In the example below, "`asciidoc`" is two folders above the folder this file is located in.
+
+`pass:[:]relfileprefix: ../../`
+
+*pass:[:]imagesdir:* Mandatory. Enter a path to the "images" folder.
+
+TIP: Use `Tree View` (kbd:[ctrl]+kbd:[\ ] or `menu:View[Toggle Tree View]`) to locate the "`images`" folder if using the link:https://atom.io/[Atom editor].
+
+In the example below, "`images`" is two folders above the folder this file is located in. Note the missing kbd:[/] forward slash.
+
+`pass:[:]imagesdir: ../..`
+
+[TIP]
+====
+A simple way to determine the location of the "asciidoc" and "images" folder in the Atom editor is first save the file to its new location, then in `Tree View` (kbd:[ctrl]+kbd:[\ ] or `menu:View[Toggle Tree View]`), btn:[RMB] select the saved file and select btn:[Copy Project Path].
+
+Temporarily paste this into your document to see where the "`asciidoc`" folder is located.
+
+For example: `src\docs\asciidoc\jme3\advanced\3d_models.adoc`
+
+In this example, "asciidoc" is located two folders above the "advanced" folder `3d_models.adoc` resides in.
+
+You can find this same folder information using link:https://github.com/jMonkeyEngine/wiki/blob/master/src/docs/asciidoc/jme3/advanced/3d_models.adoc[GitHub].
+====
+
+The "`images`" folder resides in the same folder as the "`asciidoc`" folder so it has the same setting minus the kbd:[/ ] forward slash.
+
+*pass:[:]experimental:* Leave this blank. This is the experimental attribute that allows the use of link:http://asciidoctor.org/docs/user-manual/#user-interface-macros[User Interface Macros]. You use these macros for creating keyboard shortcuts, displaying menu selections and UI buttons.
+
+*ifdef++::++env-github,env-browser[:outfilesuffix: .adoc]* See link:http://asciidoctor.org/docs/user-manual/#navigating-between-source-files[Navigating Between Source Files] in the AsciiDoctor user manual. Leave this as written.

+ 0 - 6
src/docs/asciidoc/документация.adoc

@@ -1,6 +0,0 @@
-= документация
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru.adoc

@@ -1,8 +0,0 @@
-= jme3_ru
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../
-:imagesdir: ..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/faq_ru.adoc

@@ -1,8 +0,0 @@
-= faq_ru
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/scene_graph_для_чайников.adoc

@@ -1,8 +0,0 @@
-= scene_graph_для_чайников
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/вклад.adoc

@@ -1,8 +0,0 @@
-= вклад
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/внешние/blender_ru.adoc

@@ -1,8 +0,0 @@
-= blender_ru
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/вращение.adoc

@@ -1,8 +0,0 @@
-= вращение
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/граф_сцены_и_другая_терминология_jme3.adoc

@@ -1,8 +0,0 @@
-= граф_сцены_и_другая_терминология_jme3
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/кватернионы.adoc

@@ -1,8 +0,0 @@
-= кватернионы
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/математика_видео_уроки.adoc

@@ -1,8 +0,0 @@
-= математика_видео_уроки
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/матрица.adoc

@@ -1,8 +0,0 @@
-= матрица
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/documentation.adoc

@@ -1,8 +0,0 @@
-= начальная
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_анимацией.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_анимацией
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_вектором.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_вектором
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_взаимодействиями.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_взаимодействиями
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_догоняющей_камерой.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_догоняющей_камерой
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_материалом.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_материалом
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_местностью.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_местностью
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_основным_циклом_обработки_событий.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_основным_циклом_обработки_событий
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_простым_приложением.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_простым_приложением
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_ресурсами.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_ресурсами
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_системой_ввода.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_системой_ввода
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_системой_ввода/время_нажатия_клавиши.adoc

@@ -1,8 +0,0 @@
-= время_нажатия_клавиши
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../../
-:imagesdir: ../../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_столкновениями.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_столкновениями
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_узлами.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_узлами
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_физикой.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_физикой
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_с_эффектами.adoc

@@ -1,8 +0,0 @@
-= знакомство_с_эффектами
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/знакомство_со_звуком.adoc

@@ -1,8 +0,0 @@
-= знакомство_со_звуком
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/начальная/что_такое_ide.adoc

@@ -1,8 +0,0 @@
-= что_такое_ide
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/особенности.adoc

@@ -1,8 +0,0 @@
-= особенности
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/appsettings_ru.adoc

@@ -1,8 +0,0 @@
-= appsettings_ru
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/documentation.adoc

@@ -1,8 +0,0 @@
-= промежуточная
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/math_ru.adoc

@@ -1,8 +0,0 @@
-= math_ru
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/multi-media_asset_pipeline_ru.adoc

@@ -1,8 +0,0 @@
-= multi-media_asset_pipeline_ru
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/simpleapplication_ru.adoc

@@ -1,8 +0,0 @@
-= simpleapplication_ru
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/как_использовать_материал.adoc

@@ -1,8 +0,0 @@
-= как_использовать_материал
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/лучшая_практика.adoc

@@ -1,8 +0,0 @@
-= лучшая_практика
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/оптимизация.adoc

@@ -1,8 +0,0 @@
-= оптимизация
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

+ 0 - 8
src/docs/asciidoc/документация/jme3_ru/промежуточная/типы_файлов.adoc

@@ -1,8 +0,0 @@
-= типы_файлов
-:author: 
-:revnumber: 
-:revdate: 1970/01/01 00:00
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
-

Некоторые файлы не были показаны из-за большого количества измененных файлов