Explorar o código

dokuwiki conversion: apply the last version of the exporter

Travis %!s(int64=9) %!d(string=hai) anos
pai
achega
5921794e73
Modificáronse 100 ficheiros con 265 adicións e 2491 borrados
  1. 0 1
      src/docs/asciidoc/bugtest.adoc
  2. 12 24
      src/docs/asciidoc/choose-jme2-or-jme3.adoc
  3. 3 19
      src/docs/asciidoc/documentacao.adoc
  4. 3 20
      src/docs/asciidoc/documentation.adoc
  5. 8 22
      src/docs/asciidoc/documentation_de.adoc
  6. 3 22
      src/docs/asciidoc/documentation_zh.adoc
  7. 0 13
      src/docs/asciidoc/gsoc/application.adoc
  8. 23 47
      src/docs/asciidoc/gsoc/ideas.adoc
  9. 0 1
      src/docs/asciidoc/gsoc/students_handbook.adoc
  10. 0 27
      src/docs/asciidoc/jm3/solutions.adoc
  11. 0 43
      src/docs/asciidoc/jme3.adoc
  12. 0 7
      src/docs/asciidoc/jme3/advanced/3d_models.adoc
  13. 0 1
      src/docs/asciidoc/jme3/advanced/ai.adoc
  14. 8 72
      src/docs/asciidoc/jme3/advanced/android.adoc
  15. 6 35
      src/docs/asciidoc/jme3/advanced/animation.adoc
  16. 0 4
      src/docs/asciidoc/jme3/advanced/anisotropic_filtering.adoc
  17. 4 25
      src/docs/asciidoc/jme3/advanced/application_states.adoc
  18. 5 10
      src/docs/asciidoc/jme3/advanced/appstatesdemo.adoc
  19. 11 53
      src/docs/asciidoc/jme3/advanced/asset_manager.adoc
  20. 1 36
      src/docs/asciidoc/jme3/advanced/atom_framework.adoc
  21. 1 40
      src/docs/asciidoc/jme3/advanced/atom_framework/ai.adoc
  22. 0 22
      src/docs/asciidoc/jme3/advanced/atom_framework/ai/architecture.adoc
  23. 0 2
      src/docs/asciidoc/jme3/advanced/atom_framework/atom2d.adoc
  24. 0 3
      src/docs/asciidoc/jme3/advanced/atom_framework/atom2deditor.adoc
  25. 0 78
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore.adoc
  26. 0 2
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/actor.adoc
  27. 0 80
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/algorithms.adoc
  28. 0 2
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/beans.adoc
  29. 0 7
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/config.adoc
  30. 0 42
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/cycle.adoc
  31. 1 8
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/entitysystem.adoc
  32. 1 9
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/net.adoc
  33. 0 9
      src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/scenegraph.adoc
  34. 1 5
      src/docs/asciidoc/jme3/advanced/atom_framework/atomeditor.adoc
  35. 0 27
      src/docs/asciidoc/jme3/advanced/atom_framework/atomex.adoc
  36. 1 45
      src/docs/asciidoc/jme3/advanced/atom_framework/atomexasset.adoc
  37. 1 14
      src/docs/asciidoc/jme3/advanced/atom_framework/atomscripting.adoc
  38. 0 1
      src/docs/asciidoc/jme3/advanced/atom_framework/atomsdk.adoc
  39. 0 26
      src/docs/asciidoc/jme3/advanced/atom_framework/cc.adoc
  40. 7 12
      src/docs/asciidoc/jme3/advanced/atom_framework/citygen.adoc
  41. 14 51
      src/docs/asciidoc/jme3/advanced/atom_framework/codegen.adoc
  42. 14 20
      src/docs/asciidoc/jme3/advanced/atom_framework/comparison.adoc
  43. 0 52
      src/docs/asciidoc/jme3/advanced/atom_framework/design.adoc
  44. 0 30
      src/docs/asciidoc/jme3/advanced/atom_framework/design/patterns.adoc
  45. 2 49
      src/docs/asciidoc/jme3/advanced/atom_framework/docs.adoc
  46. 5 17
      src/docs/asciidoc/jme3/advanced/atom_framework/docs/code/structure.adoc
  47. 1 8
      src/docs/asciidoc/jme3/advanced/atom_framework/docs/managers.adoc
  48. 3 10
      src/docs/asciidoc/jme3/advanced/atom_framework/docs/project.adoc
  49. 6 19
      src/docs/asciidoc/jme3/advanced/atom_framework/docs/setup.adoc
  50. 0 5
      src/docs/asciidoc/jme3/advanced/atom_framework/facial.adoc
  51. 0 34
      src/docs/asciidoc/jme3/advanced/atom_framework/fx.adoc
  52. 0 11
      src/docs/asciidoc/jme3/advanced/atom_framework/gui.adoc
  53. 0 11
      src/docs/asciidoc/jme3/advanced/atom_framework/mmorpgtools.adoc
  54. 0 11
      src/docs/asciidoc/jme3/advanced/atom_framework/rpgcreator.adoc
  55. 6 8
      src/docs/asciidoc/jme3/advanced/atom_framework/status.adoc
  56. 0 7
      src/docs/asciidoc/jme3/advanced/atom_framework/teehee.adoc
  57. 6 25
      src/docs/asciidoc/jme3/advanced/audio.adoc
  58. 0 2
      src/docs/asciidoc/jme3/advanced/audio_environment_presets.adoc
  59. 11 37
      src/docs/asciidoc/jme3/advanced/bloom_and_glow.adoc
  60. 0 13
      src/docs/asciidoc/jme3/advanced/building_recast.adoc
  61. 0 6
      src/docs/asciidoc/jme3/advanced/bullet_multithreading.adoc
  62. 3 10
      src/docs/asciidoc/jme3/advanced/bullet_pitfalls.adoc
  63. 0 7
      src/docs/asciidoc/jme3/advanced/camera.adoc
  64. 0 38
      src/docs/asciidoc/jme3/advanced/capture_audio_video_to_a_file.adoc
  65. 2 29
      src/docs/asciidoc/jme3/advanced/cinematics.adoc
  66. 1 23
      src/docs/asciidoc/jme3/advanced/collision_and_intersection.adoc
  67. 7 33
      src/docs/asciidoc/jme3/advanced/combo_moves.adoc
  68. 3 30
      src/docs/asciidoc/jme3/advanced/custom_controls.adoc
  69. 0 41
      src/docs/asciidoc/jme3/advanced/custom_meshes.adoc
  70. 0 17
      src/docs/asciidoc/jme3/advanced/debugging.adoc
  71. 0 22
      src/docs/asciidoc/jme3/advanced/effects_overview.adoc
  72. 0 12
      src/docs/asciidoc/jme3/advanced/endless_terraingrid.adoc
  73. 0 2
      src/docs/asciidoc/jme3/advanced/fade.adoc
  74. 0 6
      src/docs/asciidoc/jme3/advanced/headless_server.adoc
  75. 0 20
      src/docs/asciidoc/jme3/advanced/hinges_and_joints.adoc
  76. 3 28
      src/docs/asciidoc/jme3/advanced/hud.adoc
  77. 6 36
      src/docs/asciidoc/jme3/advanced/input_handling.adoc
  78. 2 19
      src/docs/asciidoc/jme3/advanced/j3m_material_files.adoc
  79. 0 6
      src/docs/asciidoc/jme3/advanced/jme3_renderbuckets.adoc
  80. 8 83
      src/docs/asciidoc/jme3/advanced/jme3_shadernodes.adoc
  81. 3 91
      src/docs/asciidoc/jme3/advanced/jme3_shaders.adoc
  82. 0 52
      src/docs/asciidoc/jme3/advanced/jme3_srgbpipeline.adoc
  83. 7 33
      src/docs/asciidoc/jme3/advanced/level_of_detail.adoc
  84. 1 41
      src/docs/asciidoc/jme3/advanced/light_and_shadow.adoc
  85. 5 22
      src/docs/asciidoc/jme3/advanced/loading_screen.adoc
  86. 1 19
      src/docs/asciidoc/jme3/advanced/localization.adoc
  87. 1 13
      src/docs/asciidoc/jme3/advanced/logging.adoc
  88. 7 14
      src/docs/asciidoc/jme3/advanced/makehuman_blender_ogrexml_toolchain.adoc
  89. 3 18
      src/docs/asciidoc/jme3/advanced/making_the_camera_follow_a_character.adoc
  90. 0 14
      src/docs/asciidoc/jme3/advanced/material_definitions.adoc
  91. 0 47
      src/docs/asciidoc/jme3/advanced/material_specification.adoc
  92. 20 154
      src/docs/asciidoc/jme3/advanced/materials_overview.adoc
  93. 0 5
      src/docs/asciidoc/jme3/advanced/mesh.adoc
  94. 0 4
      src/docs/asciidoc/jme3/advanced/monkey_brains.adoc
  95. 1 27
      src/docs/asciidoc/jme3/advanced/monkey_zone.adoc
  96. 1 11
      src/docs/asciidoc/jme3/advanced/motionpath.adoc
  97. 0 8
      src/docs/asciidoc/jme3/advanced/mouse_picking.adoc
  98. 1 23
      src/docs/asciidoc/jme3/advanced/multiple_camera_views.adoc
  99. 11 38
      src/docs/asciidoc/jme3/advanced/multithreading.adoc
  100. 0 53
      src/docs/asciidoc/jme3/advanced/networking.adoc

+ 0 - 1
src/docs/asciidoc/bugtest.adoc

@@ -11,4 +11,3 @@ khjg akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh
 ii askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh
 lkjhg akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh
 akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh askjdhaskjdh akjdh akjdsh akjdhakjsdh 
-

+ 12 - 24
src/docs/asciidoc/choose-jme2-or-jme3.adoc

@@ -8,73 +8,61 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 It is is one of the most common questions on the jME board, hence this wiki page is dedicated to answering it in full. For further insight on features, please refer to this <<compare-jme2-jme3#, comparison between jME2 and jME3>>.
 
-
 If you are still not sure about your choice, we'll be happy to answer your questions on the forum. Many have asked before though, so please start out with a couple search terms like 'jme2 and jme3' and you might find that your question has been answered already.
 
 
-
-= Why choose jME3?
+== Why choose jME3?
 
 
-== Current- & next-generation graphics
+=== Current- & next-generation graphics
 
 From the beginning, jME3 was designed with modern principles and hardware in mind. Being shader based and only supporting OpenGL 2 or higher, jME3 is meant for the higher end of today's computers, and what's yet to come. OpenGL 1 support is limited to the basics of displaying textured models.
 
 
-
-== Actively developed
+=== Actively developed
 
 As opposed to it's legacy counterpart, jME3 is very actively developed by a team of core developers and a huge community of contributors. Any aspect of jME3 can be brought up for debate at any time.
 P.S. The earlier you get involved the greater the chance you can have a changing impact on the project.
 
 
-
-== Ever-improving documentation
+=== Ever-improving documentation
 
 The majority of new docs created today are documentation for jMonkeyEngine3. While naturally part of a grand community effort, these docs benefit greatly from the added support and continued iteration by core team members.
 
 
-
-== jMonkeyEngine SDK
+=== jMonkeyEngine SDK
 
 With jMonkeyEngine <<sdk#,SDK>>, jME3 is the first jME version with a dedicated IDE for application development, deployment, asset management and composition tools.
 
 
-
-== Broad Featureset
+=== Broad Featureset
 
 A major design goal for jME3 is “no game-dev essential left behind. Straight out of the box we aim to deliver all the basics you need to practically prototype any type of game: Physics, networking, terrain and so on, all bundled, but not forced. You can always replace any feature that doesn't match your game's requirement with a custom solution of your own making.
 
 
-
-== We'll be so happy to have you!
+=== We'll be so happy to have you!
 
 Naturally we are thrilled every time someone has decided to adopt jME3 for their [game-] development needs. Prospectively speaking, this means more testing, more commits, more buzz, more projects, more innovation; better community.
 
 
-
-= Why choose jME2?
+== Why choose jME2?
 
 
-== Stability right now
+=== Stability right now
 
 jME2 has been deemed stable since 2009, with no major feature additions or reworks since 2008. Although there are plans for a final point version release (2.1), jME2 is practically in complete feature freeze.
 
 
-
-== Support for low-end computers
+=== Support for low-end computers
 
 jME2 fully supports OpenGL 1, while jME3 does not. Coupled with careful programming this means you can achieve very low hardware requirements for your project.
 
 
-
-== Community Tools
+=== Community Tools
 
 Well written utilities like SceneMonitor and SceneWorker greatly enrich the engine's toolset.
 
 
-
-== Thoroughly documented
+=== Thoroughly documented
 
 There are literally hundreds of pages of documentation for jMonkeyEngine 2.0, detailing development practices with the engine from beginners' levels through intermediate to advanced. Do note however that as jME3 grows more popular this documentation will be maintained by the community alone (see 'Ever-improving documentation' in the jME3 section below).
-

+ 3 - 19
src/docs/asciidoc/documentacao.adoc

@@ -8,15 +8,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Essa wiki contém guias de instalação e configuração, tutoriais de codificação jME3 e outras informaçõess que lhe ajudarão a dar andamento no seu projeto de jogo. Você pode pesquisar o conteúdo dessa wiki usando a caixa de pesquisa “Search localizado na direita-superior dessa página.
 
-
 Você também é convidado a corrigir equívicos ou problemas de digitação, como também parágrafos confusos, usando o menu “Tools localizado na direita-superior dessa página ou o botão “Edit em cada parágrafo. Você precisa estar conectado na wiki para poder editar.
 
 
-
 == Instalação
 
 *Antes de instalar, verifique a <<bsd_license#,licença>>, <<jme3/features#,funcionalidades>>, e <<jme3/requerimentos#,requerimentos>>.* Então, escolha uma das seguintes opções:
-
 [cols="4", options="header"]
 |===
 
@@ -41,32 +38,22 @@ a| Ultima versão estável, fontes, javadoc.
 a| Fontes 
 
 a| Aprenda mais… 
-a| <<sdk#,Utilizando o SDK>> +
-<<sdk/project_creation#,Criação de Projeto>> +
-
+a| <<sdk#,Utilizando o SDK>> +<<sdk/project_creation#,Criação de Projeto>> +
 image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,with="144",height="90",align="center"]
  
-a| <<jme3/maven#,Configurando o JME3 com IDE compatívels com maven>> * +
-<<jme3/setting_up_netbeans_and_jme3#,Configurando o JME3 no NetBeans IDE>> * +
-<<jme3/setting_up_jme3_in_eclipse#,Configurando o JME3 no Eclipse IDE>> * +
-<<jme3/eclipse_jme3_android_jnindk#,Configurando o JME3 no Eclipse IDE (com Android e/ou JNI/NDK)>> * 
-a| <<jme3/build_from_sources#,Compilando JME3 a partir dos Fontes>> +
-<<jme3/build_jme3_sources_with_netbeans#,Compilando jME3 a partir dos Fontes com NetBeans>> +
-<<jme3/simpleapplication_from_the_commandline#,Configurando o jME3 na linha de comando>> 
+a| <<jme3/maven#,Configurando o JME3 com IDE compatívels com maven>> * +<<jme3/setting_up_netbeans_and_jme3#,Configurando o JME3 no NetBeans IDE>> * +<<jme3/setting_up_jme3_in_eclipse#,Configurando o JME3 no Eclipse IDE>> * +<<jme3/eclipse_jme3_android_jnindk#,Configurando o JME3 no Eclipse IDE (com Android e/ou JNI/NDK)>> * 
+a| <<jme3/build_from_sources#,Compilando JME3 a partir dos Fontes>> +<<jme3/build_jme3_sources_with_netbeans#,Compilando jME3 a partir dos Fontes com NetBeans>> +<<jme3/simpleapplication_from_the_commandline#,Configurando o jME3 na linha de comando>> 
 
 |===
 
 (*) O SDK cria projetos baseados em ANT que qualquer Java IDE pode importar. Nós recomendamos que usuários de outras IDEs baixem a jMonkeyEngine SDK e escolham “Arquivo→Importar Projeto→Pastas de Projeto Externo para criar um projeto sem código, apanas para gerenciar os assets. Dessa forma, você pode codificar no IDE de sua escolha e ainda utilizar o SDK para converter seus modelos para o formato .j3o.
 
-
 * EM CONSTRUÇÃO *
 
 
-
 == Crie
 
 Depois de baixado e instalado, <<jme3#,adicione esta página em seus favoritos>> e comece a escrever seu primeiro jogo!
-
 [cols="3", options="header"]
 |===
 
@@ -93,7 +80,6 @@ a| <<jme3/faq#,Respostas para Perguntas Frequentes>>
 
 Você é um desenvolvedor Java experiente que quer adicionar novas funcionalidades ou contribuír com o projeto jME3?
 
-
 *  Inspire-se com <<jme3/contributions#,contribuições>> existentes
 *  link:http://hub.jmonkeyengine.org/introduction/contributors-handbook/[Leia o guia dos Contribuídores]
 *  link:http://hub.jmonkeyengine.org/[Grite no fórum dos Contribuídores]
@@ -107,7 +93,6 @@ Você é um desenvolvedor Java experiente que quer adicionar novas funcionalidad
 Você é bem-vindo em contribuír ou perguntar sobre o projeto: Por favor mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[contate] os
 link:http://jmonkeyengine.org/team/[desenvolvedores] ou pergunte no link:http://hub.jmonkeyengine.org/[fórum].
 
-
 *  mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[Contate o time jME]
 **  link:http://jmonkeyengine.org/team/[Core Team - Quem somos?]
 
@@ -119,4 +104,3 @@ link:http://jmonkeyengine.org/team/[desenvolvedores] ou pergunte no link:http://
 
 <<документация#,Документация на Русском>>
 <<documentacao#,Documentação em Português>>
-

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

@@ -8,15 +8,12 @@ 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.
 
 
-
 == Install
 
 *Before installing, check the <<bsd_license#,license>>, <<jme3/features#,features>>, and <<jme3/requirements#,requirements>>.* Then choose one of these options:
-
 [cols="4", options="header"]
 |===
 
@@ -41,29 +38,20 @@ a| Latest stable binary build, sources, javadoc.
 a| Sources 
 
 a| Learn more here… 
-a| <<sdk#,Using the SDK>> +
-<<sdk/project_creation#,Project Creation>> +
-
+a| <<sdk#,Using the SDK>> +<<sdk/project_creation#,Project Creation>> +
 image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,with="144",height="90",align="center"]
  
-a| <<jme3/maven#,Setting up jME3 with maven compatible IDEs>> * +
-<<jme3/setting_up_netbeans_and_jme3#,Setting up JME3 in the NetBeans IDE>> * +
-<<jme3/setting_up_jme3_in_eclipse#,Setting up JME3 in the Eclipse IDE>> * +
-<<jme3/eclipse_jme3_android_jnindk#,Setting up JME3 in the Eclipse IDE (with Android and/or JNI/NDK)>> * 
-a| <<jme3/build_from_sources#,Building JME3 from the Sources>> +
-<<jme3/build_jme3_sources_with_netbeans#,Building JME3 from the sources with NetBeans>> +
-<<jme3/simpleapplication_from_the_commandline#,Setting up JME3 on the commandline>> 
+a| <<jme3/maven#,Setting up jME3 with maven compatible IDEs>> * +<<jme3/setting_up_netbeans_and_jme3#,Setting up JME3 in the NetBeans IDE>> * +<<jme3/setting_up_jme3_in_eclipse#,Setting up JME3 in the Eclipse IDE>> * +<<jme3/eclipse_jme3_android_jnindk#,Setting up JME3 in the Eclipse IDE (with Android and/or JNI/NDK)>> * 
+a| <<jme3/build_from_sources#,Building JME3 from the Sources>> +<<jme3/build_jme3_sources_with_netbeans#,Building JME3 from the sources with NetBeans>> +<<jme3/simpleapplication_from_the_commandline#,Setting up JME3 on the commandline>> 
 
 |===
 
 (*) The SDK creates Ant-based projects that any Java IDE can import. We recommend users of other IDEs to also download the jMonkeyEngine SDK and choose “File→Import Project→External Project Assets to create a codeless project for managing assets only. This way you can code in the IDE of your choice, and use the SDK to convert your models to .j3o format.
 
 
-
 == Create
 
 After downloading and installing, <<jme3#,bookmark the jME Documentation page>> and start writing your first game!
-
 [cols="3", options="header"]
 |===
 
@@ -90,7 +78,6 @@ 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:http://hub.jmonkeyengine.org/c/contribution-depot-jme3[Chime in on the Contributors Forum]
@@ -103,7 +90,6 @@ Are you an experienced Java developer who wants to add new features or contribut
 
 You are welcome to contribute and inquire about the project: Please mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[contact] the link:http://jmonkeyengine.org/team/[developers] or ask on the link:http://hub.jmonkeyengine.org/[forums].
 
-
 *  mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[Contact the jME team]
 **  link:http://jmonkeyengine.org/team/[Core team - Who are we?]
 
@@ -114,8 +100,5 @@ You are welcome to contribute and inquire about the project: Please mailto:&#x63
 == Languages
 
 <<документация#,Документация на Русском>> +
-
 <<documentacao#,Documentação em Português>> +
-
 <<documentation_zh#,中文版>>
-

+ 8 - 22
src/docs/asciidoc/documentation_de.adoc

@@ -8,24 +8,19 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 *Du bist Java Entwickler und möchtest 3D Spiele schreiben, die auf Windows, Mac, Linux, im Webbrowser, und auf der Android Plattform laufen? Dann bist du hier richtig! Das jMonkeyEngine Framework (jME) ist eine leistungsstarke, 3D Szenen-basierte Grafik +++<abbr title="Application Programming Interface">API</abbr>+++ mit <<jme3/features#,modernen Features>>.*
 
-
 Die jMonkeyEngine 3 ist ein Bündel aus JAR Dateien, das du in den Java Classpath platzierst. Die Software ist in Java geschrieben und nutzt LWJGL für den Zugriff auf OpenGL. Die jMonkeyEngine Open Source Community gibt diese Bibliotheken lizensiert unter der <<bsd_license#,BSD Lizenz>> heraus, welche sie jedem frei zur Verfügung stellt, so wie er sie benötigt – sei es für das eigene Hobby, für Lehrzwecke, oder kommerziell.
 
-
 Die dritte Version der jMonkeyEngine ist nun im Beta Stadium. Du nutzt noch die link:http://jme2.jmonkeyengine.org/[jME2]? Dann lies doch bitte unsere <<choose-jme2-or-jme3#,Begründung für die Wahl der jME2 oder jME3>> und den <<compare-jme2-jme3#,jME2/jME3 Feature-Vergleich>> und beginne mit dem Portieren zur jME3.
 
 
-
-==== Was ist das jMonkeyEngine SDK?
+== Was ist das jMonkeyEngine SDK?
 
 Das link:http://jmonkeyengine.org/downloads/[jMonkeyEngine3 SDK] ist ein vorkonfiguriertes Software-Entwicklungskit, maßgeschneidert für Java Spielentwickler. Das SDK kombiniert alle jME3 Bibliotheken und einige <<sdk#,einmalige Entwickler Werkzeuge>>, die dir das Leben leichter machen, wenn du in Java programmierst und deine Projekte managst. Das SDK beinhaltet Projekt- und Dateiassistenten, einen erweiterten Code Editor, Spieldaten-Management, Dateikonverter, Szenenbetrachter und -designer, eine Codeschnipselablage, einen Terrain-Editor, und vieles mehr.
 
 
-
-== Installation
+=== Installation
 
 *Bevor du die Installation startest, lies dir die <<bsd_license#,Lizenz>> durch, <<jme3/features#,die jME3 Features>>, und die <<jme3/requirements#,Systemanforderungen>>.* Wähle dann eine der folgenden Optionen:
-
 [cols="4", options="header"]
 |===
 
@@ -50,27 +45,20 @@ a| Den aktuellsten nightly build, Quellcodes, JavaDoc.
 a| Quellcodes 
 
 a| Erfahre mehr … 
-a| <<sdk#,Benutzung des SDK>> +
-<<sdk/project_creation#,Projekte erstellen>> +
-
+a| <<sdk#,Benutzung des SDK>> +<<sdk/project_creation#,Projekte erstellen>> +
 image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,with="144",height="90",align="center"]
  
-a| <<jme3/setting_up_netbeans_and_jme3#,Nutzung der jME3 in NetBeans>> * +
-<<jme3/setting_up_jme3_in_eclipse#,Nutzung der jME3 in Eclipse>> * 
-a| <<jme3/build_from_sources#,Kompilieren der jME3 aus den Quellcodes>> +
-<<jme3/build_jme3_sources_with_netbeans#,Kompilieren der jME3 aus den Quellcodes mit NetBeans>> +
-<<jme3/simpleapplication_from_the_commandline#,Einrichtung der jME3 über die Kommandozeileneingabe>> 
+a| <<jme3/setting_up_netbeans_and_jme3#,Nutzung der jME3 in NetBeans>> * +<<jme3/setting_up_jme3_in_eclipse#,Nutzung der jME3 in Eclipse>> * 
+a| <<jme3/build_from_sources#,Kompilieren der jME3 aus den Quellcodes>> +<<jme3/build_jme3_sources_with_netbeans#,Kompilieren der jME3 aus den Quellcodes mit NetBeans>> +<<jme3/simpleapplication_from_the_commandline#,Einrichtung der jME3 über die Kommandozeileneingabe>> 
 
 |===
 
 (*) Das SDK erstellt Ant-basierte Projekte, welche jede Java IDE importieren kann. Wir empfehlen Benutzern anderer IDEs sich ebenfalls das jMonkeyEngine SDK herunterzuladen und die Spieldaten dann zu importieren (File→Import Project→External Project Assets), um die Spieldaten gesondert verwalten zu können, ohne Code. So kannst du mit der IDE deiner Wahl Code schreiben, und gleichzeitig das SDK nutzen, um deine Modelle in das .j3o Format zu konvertieren.
 
 
-
-== Entwicklung des ersten, eigenen Spiels
+=== Entwicklung des ersten, eigenen Spiels
 
 Nachdem du alles heruntergeladen und installiert hast, <<jme3#,lege dir ein Lesezeichen für die jME3 Dokumentation an>>. Dann kann es auch schon losgehen mit der Entwicklung deines ersten, eigenen Spiels! ;)
-
 [cols="3", options="header"]
 |===
 
@@ -93,11 +81,10 @@ a|
 |===
 
 
-== Wenn du etwas beitragen möchtest
+=== Wenn du etwas beitragen möchtest
 
 Du bist ein erfahrener Java Entwickler und möchtest neue Features oder Verbesserungen in das jME3 Projekt einbringen?
 
-
 *  link:http://jmonkeyengine.org/introduction/contributors-handbook/[Lies das Mitarbeiter Handbuch]
 *  link:http://www.jmonkeyengine.com/forum/index.php?board=30.0[Klinke dich im Mitarbeiter Forum ein]
 *  <<jme3/jme3_source_structure#,Lerne die Quellcode Strukturen kennen>>
@@ -105,11 +92,10 @@ Du bist ein erfahrener Java Entwickler und möchtest neue Features oder Verbesse
 *  <<report_bugs#,Melde Fehler und reiche Patches ein>>
 
 
-== Kontakt
+=== Kontakt
 
 Gerne darfst du unser Projekt unterstützen, oder Fragen dazu stellen: Bitte mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[kontaktiere] die link:http://jmonkeyengine.org/team/[Entwickler] oder frage im link:http://jmonkeyengine.org/forums[Forum] nach.
 
-
 *  mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[Schreibe dem jME Team eine Mail!]
 **  link:http://jmonkeyengine.org/team/[Das Kern-Team - Wer sind wir?]
 **  link:http://jmonkeyengine.org/groups/contributor/members/[Mitarbeiter - Wer sind wir?]

+ 3 - 22
src/docs/asciidoc/documentation_zh.adoc

@@ -8,15 +8,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 本wiki页面包含jME3的安装和配置指南、jME3编程教程以及其他一些能够帮助你开发游戏项目的资料,请善用本页右上方的搜索框来检索整个wiki中的内容。
 
-
 本文翻译自英文版<<documentation#,jME文档>>,受编者水平所限,难免存在各种各样的问题。如果您在阅读的过程中发现任何错误,非常欢迎您直接修正错误的内容。编辑此页面需要link:http://hub.jmonkeyengine.org[官方论坛]账号,然后点击本页右上角的“Tools → Login登录。登录后点击右上角“Tools → Edit this page或者每个段落后面的“Edit按钮,即可编辑此页面。
 
 
-
 == 下载和安装
 
 *在安装之前,请查阅<<bsd_license#,许可证>>、<<jme3/features_zh#,jME3功能说明>>和<<jme3/requirements_zh#,开发需求>>,* 然后选择其中一个选项:
-
 [cols="4", options="header"]
 |===
 
@@ -41,29 +38,20 @@ a| Latest stable binary build, sources, javadoc.
 a| Sources 
 
 a| 更多学习内容… 
-a| <<sdk_zh#,学习使用SDK>> +
-<<sdk/project_creation_zh#,使用SDK创建工程>> +
-
+a| <<sdk_zh#,学习使用SDK>> +<<sdk/project_creation_zh#,使用SDK创建工程>> +
 image::sdk/jme3-jmonkeyplatform.png[jme3-jmonkeyplatform.png,with="144",height="90",align="center"]
  
-a| <<jme3/maven_zh#,在任何兼容maven的IDE中集成JME3>> * +
-<<jme3/setting_up_netbeans_and_jme3_zh#,在NetBeans中集成JME3>> * +
-<<jme3/setting_up_jme3_in_eclipse_zh#,在Eclipse中集成JME3>> * +
-<<jme3/eclipse_jme3_android_jnindk_zh#,在Eclipse(含Android及JNI/NDK)中集成JME3>> * 
-a| <<jme3/build_from_sources_zh#,编译JME3源码>> +
-<<jme3/build_jme3_sources_with_netbeans_zh#,在NetBeans中编译JME3源码>> +
-<<jme3/simpleapplication_from_the_commandline_zh#,在(Linux)命令行下开发JME3>> 
+a| <<jme3/maven_zh#,在任何兼容maven的IDE中集成JME3>> * +<<jme3/setting_up_netbeans_and_jme3_zh#,在NetBeans中集成JME3>> * +<<jme3/setting_up_jme3_in_eclipse_zh#,在Eclipse中集成JME3>> * +<<jme3/eclipse_jme3_android_jnindk_zh#,在Eclipse(含Android及JNI/NDK)中集成JME3>> * 
+a| <<jme3/build_from_sources_zh#,编译JME3源码>> +<<jme3/build_jme3_sources_with_netbeans_zh#,在NetBeans中编译JME3源码>> +<<jme3/simpleapplication_from_the_commandline_zh#,在(Linux)命令行下开发JME3>> 
 
 |===
 
 (*) jME SDK创建的是基于Ant的项目,任何Java IDE都可以导入。我们建议其他IDE的用户也下载jME SDK,并选择 “File→Import Project→External Project Assets 来创建一个不包含任何代码的资源项目,用以管理项目中的资源文件(如模型、材质、贴图等)。这样您就可以在自己选择的IDE中编码,并利用jME SDK来将您的模型转换成.j3o格式。
 
 
-
 == 创建jME工程
 
 下载安装jME之后,请把这个<<jme3_zh#,jME教程>>加入您的书签,然后动手开发您的第一个游戏吧!
-
 [cols="3", options="header"]
 |===
 
@@ -90,7 +78,6 @@ a| <<jme3/faq_zh#,FAQ>>
 
 想给jME3贡献新的特性和功能吗?如果你是一名熟练的Java开发者,请看下列页面:
 
-
 *  了解已有的<<jme3/contributions#,贡献>>
 *  link:http://hub.jmonkeyengine.org/introduction/contributors-handbook/[阅读贡献者手册]
 *  link:http://hub.jmonkeyengine.org/[加入官方论坛的讨论]
@@ -103,7 +90,6 @@ a| <<jme3/faq_zh#,FAQ>>
 
 欢迎您的贡献和咨询:请通过mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[电子邮箱]联系link:http://jmonkeyengine.org/team/[开发团队],或者在 link:http://hub.jmonkeyengine.org/[官方论坛]发帖提问。
 
-
 *  mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[联系jME团队]
 **  link:http://jmonkeyengine.org/team/[核心团队 - 我们是谁?]
 
@@ -114,16 +100,11 @@ a| <<jme3/faq_zh#,FAQ>>
 == 本页的多国语言版
 
 <<documentation#,英文原版>> +
-
 <<документация#,俄语版>> +
-
 <<documentacao#,葡萄牙语>> +
-
 <<documentation_zh#,中文版>>
 
 
-
 == 中文开发者讨论群
 
 本群不是jME的官方QQ群,而是由一群国内的jME爱好者聚集的讨论群,欢迎加入讨论,群号:423979787。
-

+ 0 - 13
src/docs/asciidoc/gsoc/application.adoc

@@ -11,43 +11,36 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 (Courtesy of Blender.org; link:http://wiki.blender.org/index.php/Dev:Ref/GSoC/2010/Application_Template[http://wiki.blender.org/index.php/Dev:Ref/GSoC/2010/Application_Template])
 
 
-
 == Name
 
 Please provide your full name.
 
 
-
 == Email / IRC / WWW
 
 Where can we contact you? If you frequent our +++<abbr title="Internet Relay Chat">IRC</abbr>+++ channel (#jme on irc.freenode.net) please let us know what your nick is. If you have a web page you'd like us to know about, please include it.
 
 
-
 == Synopsis
 
 A short description of your planned SoC project
 
 
-
 == Benefits to jME
 
 Describe how your project will benefit jME. Will it enhance some graphics functionality? Lower the entry barrier? Simplify a common procedure?
 
 
-
 == Deliverables
 
 Provide a user-level summary of the final output or results of your project. How does it integrate in jME, and how does it cooperate with the rest of jME's features? Note that end-user documentation should be one of the deliverables as well.
 
 
-
 == Project Details
 
 A more detailed description.
 
 
-
 == Project Schedule
 
 How long will the project take? When can you begin work?
@@ -56,18 +49,12 @@ Please also note any vacation time you expect to take during the project period.
 Do you have any possible school or work conflicts with your schedule?
 
 
-
 == Bio
 
 Who are you, what are you studying (and where), and what activities do you enjoy? What is your experience using jME or other computer graphics programs? What (3D) code development projects have you realized? What makes you the best person to work on this project? If you have any history contributing to jME or otherwise advocating the project, please describe your efforts.
 +
-
 +
-
 Send your application to mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[]
 +
-
 +
-
 _Thank you for applying!_
-

+ 23 - 47
src/docs/asciidoc/gsoc/ideas.adoc

@@ -10,70 +10,58 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Below is listed every idea for a prospective jME student project during GSoC.
 +
-
 Got a suggestion? Please discuss it in the link:http://www.jmonkeyengine.com/forum/[forum].
 +
-
-
 [quote]
 ____
  If the forum won't suffice we can always be reached at mailto:&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x63;&#x74;&#x40;&#x6a;&#x6d;&#x6f;&#x6e;&#x6b;&#x65;&#x79;&#x65;&#x6e;&#x67;&#x69;&#x6e;&#x65;&#x2e;&#x63;&#x6f;&#x6d;[]
 ____
 
 
-= Worth noting
+== Worth noting
 
 *Difficulty setting pending:* The developers have yet to estimate difficulty and scope for each of the suggested projects.
 +
-
 *GDE-appropriate:* Many of the suggestions below would be most suitable as an extension to our WIP 'link:http://www.jmonkeyengine.com/forum/index.php?board=33.0[Game Development Environment]', but won't be identified as such until further evaluation. Doing so keeps the jME 3.0 core clean and lean.
 
 
-
-== Finish/extend sound engine
+=== Finish/extend sound engine
 
 jME's sound engine is almost complete, but lacks more extensive testing and has room for improvements.
 
 
-
-== New terrain system
+=== New terrain system
 
 One of the most sought after features for jME is a complete terrain system, topped off with a user-friendly visual editor. → link:http://jmonkeyengine.com/wiki/doku.php/terrain_systems[Terrain Systems]
 
 
-
-== Basic AI system
+=== Basic AI system
 
 Basic path-finding, primitive bot behavior…
 
 
-
-== Game frameworks
+=== Game frameworks
 
 A great way of adding to jME3's accessibility. A 'game framework' would be a bare-bones implementation of a genre-specific, clearly defined type of gameplay, like a link:http://en.wikipedia.org/wiki/First-person_shooter[First-person_shooter].
 
 
-
-== Extended builders for particle effects
+=== Extended builders for particle effects
 
 
-== Cinematics
+=== Cinematics
 
 A system that eases the job of handling all the different kinds of camera-, recording and playback work involved for making a cinematic in any type of game.  Additionally, the use of pre-rendered and edited footage in-game (either in 3D space or contained in cut scenes)
 
 
-
-== Game Development Environment: Editors
+=== Game Development Environment: Editors
 
 Editors for the gde could become a way to avoid bloating the core engine. More specialized tools like cinematics creation and terrain editing might be best suited as an extension to the jME3 Game Development Environment.
 
 
-
-== Post process effect
+=== Post process effect
 
 Add a new post process effect to jME, follow the way the HDRProcessor and BasicShadowProcessor were designed. Some examples of post process effects:
 
-
 *  Motion Blur
 *  Depth of Field
 *  Parallel-Split Shadow Maps
@@ -81,76 +69,68 @@ Add a new post process effect to jME, follow the way the HDRProcessor and BasicS
 *  Bloom
 
 
-== jME Importer
+=== jME Importer
 
 Create a new importer for jME, it should be a popular format for most effectiveness. Some examples:
 
-
 *  3DS
 *  OBJ - MTL (material) file import. Should be able to support normal and specular maps!
 *  Collada (advanced)
 
 
-== Scene editor
+=== Scene editor
 
 Create a scene editor, with model importing, moving around models, editing particles and applying materials, etc.
 If you want something simpler than the above, you can just write a particle editor
 
 
-
-== Game state system: AppState
+=== Game state system: AppState
 
 Create a game state system, similar to jME2's StandardGame and GameState. Please call it AppState though.
 
 
-
-== Improved multithreading support
+=== Improved multithreading support
 
 (advanced)
 
 
-
-== Deferred rendering
+=== Deferred rendering
 
 (advanced)
 
 
-
-== Hardware skinning
+=== Hardware skinning
 
 
-== A jME Game
+=== A jME Game
 
 Create a game using jME. Doesn't have to be advanced or graphically intense, something like pacman in 3D for example for geeneral optimization of the engine and many community resources.
 
 
-
-== Android Interface
+=== Android Interface
 
 E.g. Create “virtual arrow keys and other buttons on the screen, for those phones without keyboard but only touchscreen.
 
 
-
-== Android Multitouch support
+=== Android Multitouch support
 
 (Android 2.1 only?)
 
 
-
-== Android Trackball support
+=== Android Trackball support
 
 
-== General core Android optimizations
+=== General core Android optimizations
 
 
-== Evaluation: Game Asset Pipeline
+=== Evaluation: Game Asset Pipeline
 
 *  Evaluate various model converters and creators, audio tools, 3-D and 2-D graphic tools (free and paid).
 *  Write an example make script that regenerates the artwork everytime the designer made changes, and copies the files to the developer's directory.
 *  Collect the best practices (pros/cons/limitations of tools and approaches) in a comparison table.  
 
 
-== Evaluation: Deployment Options
+=== Evaluation: Deployment Options
 
 *  Applet, Webstart, OneJAR, …
 *  Free vs commercial executable creators for all supported operating systems…
@@ -162,20 +142,16 @@ E.g. Create “virtual arrow keys and other buttons on the screen, for those pho
 *  Collect the best practices (pros/cons/limitations) in a comparison table.
 
 
-== jME on the iPhone
+=== jME on the iPhone
 
 XMLVM is a project that let's you convert .class-files (and .net-clr files) into xml-files. This xml-files then 
 can be translated into different targets and also objective c. They already implemented an compatibilty layer you can write your android-application against and create iphone objective c-sourcecode including makefiles out of it. (It seems  that) all you have to do is to run the makefile on a MAC. Kev Glass implemented the opengl-translation and one nehe-lesson is included as example. 
 
-
 Here some links:
 
-
 link:http://www.xmlvm.org/overview/[http://www.xmlvm.org/overview/]
 link:http://www.xmlvm.org/iphone/[http://www.xmlvm.org/iphone/]
 link:http://www.cokeandcode.com/aboidblog[http://www.cokeandcode.com/aboidblog]
 
-
 opengl-compatlib (in sourcefolder src/xmlvm2objc/compat-lib/java ):
 org..xmlvm.iphone.gl
-

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

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

+ 0 - 27
src/docs/asciidoc/jm3/solutions.adoc

@@ -11,7 +11,6 @@ This is a user-proposed group of solutions for some or all of the exercises pres
 There are several ways to do them, so take what you see with a grain of salt, and actually try to do them yourself instead of jumping to the solution, for it is the best way to learn!
 
 
-
 == Hello Update Loop
 
 
@@ -20,12 +19,10 @@ There are several ways to do them, so take what you see with a grain of salt, an
 It will spin the other way around.
 
 
-
 === Exercise 2
 
 First, one must declare another Geometry, for example, a red cube:
 
-
 [source,java]
 ----
 
@@ -54,7 +51,6 @@ public void simpleInitApp() {
 
 To have the red cube spin twice as fast as the other cube, simply make it rotate on the same axis but with double the value:
 
-
 [source,java]
 ----
 
@@ -73,7 +69,6 @@ public void simpleUpdate(float tpf) {
 
 One possible solution is to shrink or grow depending on current size. The cube may start by either growing or shrinking. If the cube is growing, it will start shrinking instead only when it reaches a size large enough. If the cube is shrinking, it will start growing again, only when the size is small enough. In short, the cube should switch between growing and shrinking when it reaches a specified maximum and minimum sizes. The following code is an example of this solution:
 
-
 [source,java]
 ----
 
@@ -98,10 +93,8 @@ public void simpleUpdate(float tpf) {
 
 The cube starts by growing, and when it reaches a size larger than 120% its original size, it starts shrinking instead. The cube will then keep shrinking, until it reaches a size smaller than 80% its original size, which will make it start growing again, and so on.
 
-
 Another approach is to switch between shrinking and growing every chosen unit of time. The tpf variable stores the time per frame rendered, so if you sum every tpf at the simpleUpdate method, you get the time passed since the game started. Using time like a stopwatch, one may grow the cube for some time, and then shrink the cube for the same amount of time, and start over again. The following code shows an example of this solution:
 
-
 [source,java]
 ----
 
@@ -123,10 +116,8 @@ public void simpleUpdate(float tpf) {
 
 The cube grows for 2 two seconds, then shrinks for another 2 seconds, and repeats indefinitely.
 
-
 Another approach is to set the cube scale as the result of a sine wave. This results in a smooth repetitive oscillating scale. Note however that this approach is computational expensive due to the use of the sine function. One may create a sine wave by calculating sine as a function of time. As such, for each iteration of the simpleUpdate method, the scale is set as the result of sine as function of time plus the original cube scale. The following code shows an example of this approach:
 
-
 [source,java]
 ----
 
@@ -143,7 +134,6 @@ public void simpleUpdate(float tpf) {
 
 The cube should repeatedly and smoothly grow and shrink and have maximum and minimum scale of 0.5 and 1.5 its original size. The following variables can change the scale behavior:
 
-
 *  initScale - Sets the initial scale of cube
 *  amplitude - Increases minimum and maximum scale
 *  angularFrequency - Increases scale speed
@@ -153,7 +143,6 @@ The cube should repeatedly and smoothly grow and shrink and have maximum and min
 
 Same logic! Use a timeVar, and make the Material declaration + initialization line we had @ simpleInitApp() into only the initialization, with the Material mat; going as a global variable, so we can access it on the simpleUpdate()! Like so:
 
-
 [source,java]
 ----
 
@@ -163,7 +152,6 @@ protected Material mat;
 
 As global var, then the initialization cuts off the Material bit:
 
-
 [source,java]
 ----
 
@@ -173,7 +161,6 @@ mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
 
 And then the simpleUpdate()
 
-
 [source,java]
 ----
 
@@ -192,7 +179,6 @@ public void simpleUpdate(float tpf) {
 
 A possible solution is to change the rotation axis of player from y to x, and make it move along the z axis:
 
-
 [source,java]
 ----
 
@@ -207,7 +193,6 @@ public void simpleUpdate(float tpf) {
 The above code should make the player roll towards the camera.
 
 
-
 == Hello Input
 
 
@@ -215,7 +200,6 @@ The above code should make the player roll towards the camera.
 
 First, add the mappings for the Up and Down actions to the initKeys() method:
 
-
 [source,java]
 ----
 
@@ -231,7 +215,6 @@ private void initKeys() {
 
 Then implement the actions in the onAnalog() method:
 
-
 [source,java]
 ----
 
@@ -256,12 +239,10 @@ public void onAnalog(String name, float value, float tpf) {
 This should enable cube to move upwards, if the H key is pressed, and downwards, if the L key is pressed.
 
 
-
 === Exercise 2
 
 Following the proposed solution 1, add new mappings for the mouse wheel in the initKeys() method:
 
-
 [source,java]
 ----
 
@@ -279,13 +260,11 @@ private void initKeys() {
 Now you should be able to scroll the cube up or down with the mouse wheel.
 
 
-
 === Exercise 3
 
 When the controls are user-chosen.
 
 
-
 == Hello Picking
 
 
@@ -293,7 +272,6 @@ When the controls are user-chosen.
 
 You can jump right off and obtain the hit object's material, by acessing the “closest object we previously acquired, obtain it's geometry through .getGeometry(), and then get the Geometry's material through .getMaterial(), like so: 
 
-
 [source,java]
 ----
 
@@ -304,10 +282,8 @@ Material g = closest.getGeometry().getMaterial();
 It's the same as going through the two steps hinted in the tips: `Geometry g = closest.getGeometry(); Material material = g.getMaterial();`
 Finally, you need only add this line: `material.setColor(“Color, ColorRGBA.randomColor())` , which will change the material from the hit object to a random color!
 
-
 The lines can be added anywhere within the `if (results.size() &gt; 0)` block, after declaring the closest object. End result is as so:
 
-
 [source,java]
 ----
 
@@ -322,7 +298,6 @@ material.setColor("Color", ColorRGBA.randomColor());
 First of all, we need some light shed to make the model visible! Add a simple DirectionalLight like previously showed.
 Then, declare a `Spatial golem` variable outside of methods. Then initialize golem to load his model: 
 
-
 [source,java]
 ----
 
@@ -332,7 +307,6 @@ golem = assetManager.loadModel("Models/Oto/Oto.mesh.xml");
 
 Now we need him to show up! So we need to attach him: but the rootNode won't do, because we're checking collision with it's child, the shootables node! So we attach it to shootables!
 
-
 [source,java]
 ----
 
@@ -345,7 +319,6 @@ shootables.attachChild(golem);
 
 Here is my code, it works and it is well commented.
 
-
 [source,java]
 ----
 

+ 0 - 43
src/docs/asciidoc/jme3.adoc

@@ -12,7 +12,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 The beginner tutorials demonstrate the most common use cases and explain basic concepts. We encourage you to run the sample codes and experiment with them. link:https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-examples/src/main/java/jme3test[All example code] is included in the jMonkeyEngine SDK: Simply create a new project from the `JmeTests` template. To start writing your own projects, create a new file from the `BasicGame` template.
 
 
-
 [IMPORTANT]
 ====
 *Press F1* in the <<sdk#,jMonkeyEngine SDK>> to browse and search a copy of this wiki's contents while coding. The help documents in the SDK always match the version that you currently use. The wiki is updated for the link:https://github.com/jMonkeyEngine/jmonkeyengine[latest development version] of jME3.
@@ -20,11 +19,9 @@ The beginner tutorials demonstrate the most common use cases and explain basic c
 
 
 
-
 image::jme3/beginner/beginner-physics.png[beginner-physics.png,with="360",height="291",align="right"]
 
 
-
 *  Make sure you are familiar with basic <<jme3/terminology#,3D game development concepts>> such as <<jme3/the_scene_graph#,the scene graph>>.
 
 ..  <<jme3/beginner/hello_simpleapplication#,Hello SimpleApplication>> – Initializing a SimpleApplication
@@ -45,19 +42,15 @@ image::jme3/beginner/beginner-physics.png[beginner-physics.png,with="360",height
 
 See also: <<sdk/sample_code#,Trouble running the samples>>?
 
-
 For more help getting started, check out this tuts+ guide on “link:http://gamedevelopment.tutsplus.com/articles/how-to-learn-jmonkeyengine-3--gamedev-10479[ How to learn jMonkeyEngine 3].
 
 
-
 == Documentation for Intermediate Users
 
 Now that you understood the basics, let's put it all together. The following intermediate articles help you to understand how to use these concepts in context.
 
-
 *jMonkeyEngine3 Concepts*
 
-
 *  <<jme3/intermediate/best_practices#,Best Practices>>
 *  <<jme3/intermediate/simpleapplication#,SimpleApplication>>
 *  <<jme3/intermediate/appsettings#,AppSettings>>
@@ -67,7 +60,6 @@ Now that you understood the basics, let's put it all together. The following int
 
 *Maths Concepts*
 
-
 *  <<jme3/math_for_dummies#,jME3 Math for Dummies>>
 *  <<jme3/intermediate/math#,Short 3D math &quot;cheat sheet&quot;>>
 *  <<jme3/math#,jME3 math overview>>
@@ -75,7 +67,6 @@ Now that you understood the basics, let's put it all together. The following int
 
 *3D Graphics Concepts*
 
-
 *  <<jme3/intermediate/multi-media_asset_pipeline#,Multi-Media Asset Pipeline>>
 *  <<jme3/scenegraph_for_dummies#,3D Scene Graph for Dummies>>
 *  <<jme3/terminology#,3D Graphics Terminology>>
@@ -86,28 +77,23 @@ Now that you understood the basics, let's put it all together. The following int
 
 *Game Tutorials*
 
-
 *  link:http://gamedevelopment.tutsplus.com/series/cross-platform-vector-shooter-jmonkeyengine--gamedev-13757[Neon Vector Shooter tutorial on Tuts+]
 
 *Video Use Case Tutorials*
 - Note these videos use alpha features only available in the next release
 
-
 *  link:http://www.youtube.com/watch?v=-OzRZscLlHY[Video: jMonkeyEngine SDK Use Case Demo 1 (Quixote)]
 *  link:http://www.youtube.com/watch?v=6-YWxD3JByE[Video: jMonkeyEngine SDK Use Case Demo 2 (Models and Materials)]
 
 Learn from sample code in link:https://github.com/jMonkeyEngine/jmonkeyengine/tree/master/jme3-examples/src/main/java/jme3test[src/main/java/jme3test] (also available in the sdk by File &gt; New Project &gt; JME3 Tests) and the example games provided by the community!
 
 
-
 == Documentation for Advanced Users
 
 Now that you understand the concepts, it's time to make the most of the jMonkeyEngine. Deep-dive into the +++<abbr title="Application Programming Interface">API</abbr>+++ and learn about all options, including less commonly used advanced methods. Don't over-extend yourself, developing a good game requires time and dedication. One step at a time, champ! :)
 
-
 *Controlling Game Logic*
 
-
 *  <<jme3/advanced/update_loop#,Update Loop>>
 *  <<jme3/advanced/application_states#,Application States>>
 *  <<jme3/advanced/custom_controls#,Custom Controls>>
@@ -118,7 +104,6 @@ Now that you understand the concepts, it's time to make the most of the jMonkeyE
 
 *Managing Objects in the 3D Scene Graph*
 
-
 *  <<jme3/advanced/traverse_scenegraph#,Traverse SceneGraph>>
 *  <<jme3/advanced/spatial#,Spatial: Node versus Geometry>>
 *  <<jme3/advanced/mesh#,Mesh>>
@@ -133,7 +118,6 @@ Now that you understand the concepts, it's time to make the most of the jMonkeyE
 
 *Animations and Scenes*
 
-
 *  <<jme3/advanced/animation#,Animation>>
 *  <<jme3/advanced/cinematics#,Cinematics (cutscenes, fake destruction physics)>>
 *  <<jme3/advanced/motionpath#,MotionPaths and waypoints>>
@@ -148,17 +132,14 @@ Now that you understand the concepts, it's time to make the most of the jMonkeyE
 Create jme3 compatible racing tracks in blender
 * link:http://www.youtube.com/watch?v=3481ueuDJwQ&feature=youtu.be[Video: Create jme3 compatible models in blender]
 
-
 Exporting OgreXML scenes from Blender to JME3
 
-
 *  link:https://docs.google.com/leaf?id=0B9hhZie2D-fEYmRkMTYwN2YtMzQ0My00NTM4LThhOTYtZTk1MTRlYTNjYTc3&hl=en[Animation Workflow: Create Animated UV-Mapped OgreXML Models in Blender, and use them in JME3]
 **  link:http://www.youtube.com/watch?v=IDHMWsu_PqA[Video: Creating Worlds with Instances in Blender]
 **  <<jme3/advanced/ogrecompatibility#,OgreCompatibility>>
 
 *Materials, Light, Shadow*
 
-
 *  <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>
 *  <<jme3/advanced/j3m_material_files#,Creating .j3m Materials>>
 *  <<jme3/advanced/material_definitions#,How to Use Material Definitions (.j3md)>>
@@ -173,7 +154,6 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Physics Integration*
 
-
 *  <<jme3/advanced/physics#,Physics: Gravity, Collisions, Forces>>
 *  <<jme3/advanced/bullet_multithreading#,Multi-Threaded Physics>>
 *  <<jme3/advanced/physics_listeners#,Physics Listeners and Collision Detection>>
@@ -186,7 +166,6 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Audio and Video*
 
-
 *  <<jme3/advanced/audio#,Audio: Playing Sounds>>
 *  <<jme3/advanced/audio_environment_presets#,Audio Environment Presets>>
 *  <<jme3/advanced/video#,Video: Playing Clips>>
@@ -195,14 +174,12 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Post-Processor Filters and Effects*
 
-
 *  <<jme3/advanced/effects_overview#,Effects and Filters Overview>>
 *  <<jme3/advanced/bloom_and_glow#,Bloom and Glow>>
 *  <<jme3/advanced/particle_emitters#,Particle Emitters>>
 
 *Landscapes*
 
-
 *  <<jme3/advanced/sky#,Sky>>
 *  <<jme3/advanced/terrain#,Terrain (TerraMonkey)>>
 *  <<jme3/advanced/endless_terraingrid#,Endless Terrain (TerrainGrid)>>
@@ -214,7 +191,6 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Artificial Intelligence (AI)*
 
-
 *  <<jme3/advanced/recast#,Recast Navigation>>
 *  <<jme3/advanced/building_recast#,Updating and building Recast Native Bindings>>
 *  <<jme3/advanced/monkey_brains#,Monkey Brains>>
@@ -222,7 +198,6 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Multiplayer Networking*
 
-
 *  <<jme3/advanced/networking#,Multiplayer Networking (SpiderMonkey)>>
 *  <<jme3/advanced/headless_server#,Headless Server>>
 *  <<jme3/advanced/monkey_zone#,Monkey Zone: Multi-Player Demo Code>>
@@ -231,12 +206,10 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Entity Systems*
 
-
 *  <<jme3/contributions/entitysystem#, The Zay-ES Entity System>>
 
 *Camera*
 
-
 *  <<jme3/advanced/camera#,Camera>>
 *  <<jme3/advanced/making_the_camera_follow_a_character#,Making the Camera Follow a Character>>
 *  <<jme3/advanced/remote-controlling_the_camera#,Remote-Controlling the Camera>>
@@ -244,7 +217,6 @@ Exporting OgreXML scenes from Blender to JME3
 
 *User Interaction*
 
-
 *  <<jme3/advanced/input_handling#,Input Handling>>
 **  link:https://github.com/jMonkeyEngine-Contributions/Lemur/wiki/Modules[Lemur Scene Graph Tools]
 ***  link:http://hub.jmonkeyengine.org/t/lemur-gems-1-inputmapper-based-camera-movement/28703[Lemur Gems #1 - Input mapper based camera movement. ]
@@ -257,7 +229,6 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Graphical User Interface*
 
-
 *  link:https://github.com/jMonkeyEngine-Contributions/Lemur[Lemur - a native jME3 GUI library with scene graph tools]
 *  <<jme3/contributions/tonegodgui#,tonegodGUI - a native jME3 GUI library>>
 *  <<jme3/advanced/nifty_gui#,Nifty GUI - JME3 Integration Tutorial>>
@@ -269,20 +240,17 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Custom Rendering*
 
-
 *  <<jme3/advanced/jme3_forwardrendering#,Forward Rendering process>>
 *  <<jme3/advanced/jme3_renderbuckets#,Render Buckets>>
 
 *Custom Tools*
 
-
 *  <<jme3/tools/navigation#,Mercator Projection Tool (Marine Navigation)>>
 *  <<jme3/tools/charts#,Visualizing Maps in JME3 (Marine Charts)>>
 *  <<jme3/advanced/atom_framework#,Atom framework. Mash-up of other plugins>>
 
 *Logging and Debugging*
 
-
 *  <<jme3/advanced/logging#,Logging>>
 *  <<sdk/log_files#,Log Files>>
 *  <<jme3/advanced/read_graphic_card_capabilites#,Read Graphic Card Capabilites>>
@@ -290,40 +258,33 @@ Exporting OgreXML scenes from Blender to JME3
 
 *Android specific development*
 
-
 *  <<jme3/advanced/android#,Android Project Cheat Sheet>>
 
 *Deployment*
 
-
 *  <<jme3/android#,Android>>
 *  <<sdk/application_deployment#,Application Deployment (using jMonkeyEngine SDK)>>
 *  <<jme3/webstart#,WebStart Deployment (without jMonkeyEngine SDK)>>
 
 *Scripting*
 
-
 *  <<jme3/scripting#, Groovy scripting>>
 
 *Virtual Reality &amp; Simulation*
 
-
 *  <<jme3/virtualreality#, Virtual Reality. OpenCV &amp; JavaCV>>
 
 *jMonkey User Contributions*
 
-
 *  <<jme3/contributions#, Contributions - User made utilities to add functionality to the engine.>>
 
 *Sample Projects*
 
-
 *  <<sdk/sample_code#,JmeTests>> – The “official sample project JmeTests.
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/BookSamples/#BookSamples%2Fsrc[BookSamples] – Some more jME3 code samples
 
 These code examples are not supported by the core team and we cannot guarantee their correctness:
 
-
 *  <<jme3/user_examples_project#,User Examples Project>> – The jME3 users examples project.
 *  <<jme3/shaderblow_project#,ShaderBlow Project>> – The jME3 users shaders project.
 *  <<jme3/rise_of_mutants_project#,Rise of Mutants Project>> – Rise of Mutants Project by BigBoots Team.
@@ -337,16 +298,13 @@ These code examples are not supported by the core team and we cannot guarantee t
 image::sdk/jmonkeyplatform-docu-2.png[jmonkeyplatform-docu-2.png,with="420",height="300",align="right"]
 
 
-
 The <<sdk#,jMonkeyEngine SDK>> is our recommended game development environment.
 
-
 *  <<sdk/comic#,jMonkeyEngine SDK - the Comic>>
 *  <<sdk#,SDK Documentation (All editors, plugins, etc)>>
 
 Here are some videos of how the jMonkeyEngine SDK makes your development team's life easier:
 
-
 *  link:http://www.youtube.com/watch?v=nL7woH40i5c[Video: Importing Models]
 *  link:http://www.youtube.com/watch?v=ntPAmtsQ6eM[Video: Scene Composing]
 *  link:http://www.youtube.com/watch?v=DUmgAjiNzhY[Video: Dragging&amp;Dropping Nodes]
@@ -368,7 +326,6 @@ Here are some videos of how the jMonkeyEngine SDK makes your development team's
 
 jME3 is in development; if a tutorial doesn't work as expected, try using the latest daily build. If that doesn't “fix it then:
 
-
 *  link:http://code.google.com/p/jmonkeyengine/issues/list?can=2&q=label:Component-Docs[Report a Documentation Task]
 *  link:http://jmonkeyengine.org/wiki/doku.php/report_bugs[Report a Bug]
 *  link:http://jmonkeyengine.org/forums[Ask (and Answer!) Questions on the Forum]

+ 0 - 7
src/docs/asciidoc/jme3/advanced/3d_models.adoc

@@ -10,12 +10,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Like <<jme3/advanced/shape#,Shape>>s, 3D models are also made up of <<jme3/advanced/mesh#,Mesh>>es, but models are more complex than Shapes. While Shapes are built into jME3, you typically create models in external 3D Mesh Editors. 
 
 
-
 == Using Models and Scenes with jME3
 
 To use 3D models in a jME3 application:
 
-
 .  Export the 3D model in Ogre XML or Wavefront OBJ format. Export Scenes as Ogre DotScene format.
 .  Save the files into a subdirectory of your jME3 project's `assets` directory.
 .  In your code, you use the <<jme3/advanced/asset_manager#,Asset Manager>> to load models as <<jme3/advanced/spatial#,Spatial>>s into a jME application. 
@@ -32,18 +30,14 @@ Spatial model = assetManager.loadModel(
 
 To create 3D models and scenes, you need a 3D Mesh Editor such as link:http://www.blender.org/[Blender], with an OgreXML Exporter plugin. 
 
-
 *Tip:* Learn how to create link:http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/UV_Map_Basics[UV textures] for more complex models, it looks more professional. 
 
-
 3D model editors are third-party products, so please consult their documentation for instructions how to use them. Here is an example workflow for Blender users:
 
-
 *  <<jme3/external/blender#,Creating jME3 compatible 3D models in Blender>>
 
 To export your models as Ogre XML meshes with materials:
 
-
 .  Open the menu File &gt; Export &gt; OgreXML Exporter to open the exporter dialog.
 .  In the Export Materials field: Give the material the same name as the model. For example, the model `something.mesh.xml` goes with `something.material`, plus (optionally) `something.skeleton.xml`, and some JPG files.
 .  In the Export Meshes field: Select a target subdirectory of your `assets/Models/` directory. E.g. `assets/Models/something/`.
@@ -57,4 +51,3 @@ To export your models as Ogre XML meshes with materials:
 .  Click export.
 
 You can now use the <<sdk#,jMonkeyEngine SDK>> to <<sdk/model_loader_and_viewer#,load and view models>>. You can <<sdk/scene_composer#,create scenes>> from them and write code that loads them into your application. 
-

+ 0 - 1
src/docs/asciidoc/jme3/advanced/ai.adoc

@@ -10,7 +10,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Building a Nav-Mesh for your JME game.
 
 
-
 == About
 
 

+ 8 - 72
src/docs/asciidoc/jme3/advanced/android.adoc

@@ -8,44 +8,28 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== Changing the Name of Your APK/Application:
+== Changing the Name of Your APK/Application:
 
 1. Open your project’s properties and navigate to Application+
-
 2. 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)+
 
 
-
-
-=== Changing the APK Icon:
+== 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:+
 
-
-
 ....
 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)\\
@@ -54,78 +38,51 @@ drawable-xhdpi (should contain the icon named the same at 96×96 pixels)\\
 ....
 
 
-=== Adding a Splash Screen to your app:
+== 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:+
 
-
-
 splashPicID = R.drawable.&lt;IMAGE NAME WITHOUT EXTENSION&gt;;
 
-
 3. Add the image the 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)+
 
 
-
-
-=== Compile the jar file for use with your project:
+== 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.+
 
-
-
 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+
 
 
-
-
-=== Adding Play Games Services to 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:+
 
-
-
 ....
 <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\\
@@ -133,8 +90,6 @@ Grab GameHelper.java and GameHelperUtil.java and add them to the directory you p
 
 3. In the following directoriy, 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\\
@@ -142,8 +97,6 @@ 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:+
 
-
-
 ....
 <ANDROID SDK INSTALL DIR>\adt-bundle-windows-x86_64-20131030\sdk\extras\android\support\v4\android-support-v4.jar\\
 ....
@@ -151,22 +104,15 @@ Grab the gamehelper_strings.xml into your mobile/res/values folder\\
 And this is the basics for setting this up.
 
 
-
-=== Adding AdMob Support to Your Project:
+== 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):+
 
-
-
 ....
       adView = new AdView(this);
       adView.setAdSize(AdSize.FULL_BANNER);
@@ -179,13 +125,12 @@ And this is the basics for setting this up.
 ....
 
 
-=== Communication Between your Application & Main Activity:
+== 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:
 
-
 ....
  JmeToHarness harness; 
  public JmeToHarness getHarness() {
@@ -199,7 +144,6 @@ And this is the basics for setting this up.
 
 4. Add the following snippet to the onCreate method of your Android Main Activity:
 
-
 ....
 if (app != null)
     ((Main)app).setHarnessListener(this);
@@ -208,31 +152,23 @@ if (app != null)
 
 5. 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)
 
-
 EDIT: Keep this as generic as you possibly can as it should plug &amp; play with iOS &amp; Applets if you keep that in mind. Google Play Services/Play Games Services works for all of the above… soooo… anyways.
 
 
-
-=== Changing the Package Name After Project Creation:
+== 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.
 
-
 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
 
-
 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.
-

+ 6 - 35
src/docs/asciidoc/jme3/advanced/animation.adoc

@@ -10,15 +10,12 @@ 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. 
 
 
-
 == Requirements
 
 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 animation, you have to specify a series of snapshots of how the bones are positioned (*keyframes*).
@@ -26,7 +23,6 @@ What is required for an animated model? (<<jme3/terminology#Animation,See also:
 
 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/watch?v=NdjC9sCRV0s[Video: Creating and Exporting OgreXML Animations from Blender 2.61 to JME3 ]
@@ -36,7 +32,6 @@ 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
 *  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.
 
@@ -58,7 +53,6 @@ What is required in your JME3-based Java class?
 
 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]
 ----
 
@@ -74,10 +68,8 @@ Create one `com.jme3.animation.AnimControl` object in your JME3 application for
 
 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. 
 
-
 [source,java]
 ----
 
@@ -90,11 +82,9 @@ There often are situations where you want to run several animation sequences at
 To reset a Control, call `control.clearChannels();`
 
 
-
 == Animation Control Properties
 
 The following information is available for an AnimControl.
-
 [cols="2", options="header"]
 |===
 
@@ -113,9 +103,7 @@ a|Gets individual channels by index number. At most `getNumChannels()`.
 a|clearChannels()
 a|Clear all channels in this control.
 
-a|addListener(animEventListener) +
-removeListener(animEventListener) +
-clearListeners() 
+a|addListener(animEventListener) +removeListener(animEventListener) +clearListeners() 
 a|Adds or removes listeners to receive animation related events.
 
 |===
@@ -128,8 +116,7 @@ a|Usage
 a|setAnimations(aniHashMap)
 a|Sets the animations that this AnimControl is capable of playing. The animations must be compatible with the skeleton given in the constructor.
 
-a|addAnim(boneAnim) +
-removeAnim(boneAnim)
+a|addAnim(boneAnim) +removeAnim(boneAnim)
 a|Adds or removes an animation from this Control.
 
 a|getAnimationNames()
@@ -163,7 +150,6 @@ a|Returns the attachment node of a bone. Attach models and effects to this node
 == Animation Channel Properties
 
 The following properties are set per AnimChannel.
-
 [cols="2", options="header"]
 |===
 
@@ -188,7 +174,6 @@ a| Fast-forward or rewind to a certain moment in time of this animation.
 |===
 
 The following information is available for a channel.
-
 [cols="2", options="header"]
 |===
 
@@ -213,7 +198,6 @@ a|The AnimControl that belongs to this AnimChannel.
 |===
 
 Use the following methods to add or remove individual bones to an AnimChannel. This is useful when you play two animations in parallel on two channels, and each controls a subset of the bones (e.g. one the arms, and the other the legs).
-
 [cols="2", options="header"]
 |===
 
@@ -223,16 +207,13 @@ a|Usage
 a|addAllBones()
 a|Add all the bones of the model's skeleton to be influenced by this animation channel. (default)
 
-a|addBone(“bone1) +
-addBone(bone1)
+a|addBone(“bone1) +addBone(bone1)
 a|Add a single bone to be influenced by this animation channel.
 
-a|addToRootBone(“bone1) +
-addToRootBone(bone1) 
+a|addToRootBone(“bone1) +addToRootBone(bone1) 
 a|Add a series of bones to be influenced by this animation channel: Add all bones, starting from the given bone, to the root bone.
 
-a|addFromRootBone(“bone1) +
-addFromRootBone(bone1) 
+a|addFromRootBone(“bone1) +addFromRootBone(bone1) 
 a|Add a series of bones to be influenced by this animation channel: Add all bones, starting from the given root bone, going towards the children bones.
 
 |===
@@ -241,7 +222,6 @@ 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.
-
 [cols="2", options="header"]
 |===
 
@@ -249,20 +229,17 @@ a|Channel Method
 a|Usage
 
 a|channel_walk.setAnim(“Walk,0.50f); 
-a| Start the animation named “Walk on channel channel_walk. +
-The float value specifies the time how long the animation should overlap with the previous one on this channel. If set to 0f, then no blending will occur and the new animation will be applied instantly.
+a| Start the animation named “Walk on channel channel_walk. +The float value specifies the time how long the animation should overlap with the previous one on this channel. If set to 0f, then no blending will occur and the new animation will be applied instantly.
 
 |===
 
 *Tip:* Use the AnimEventLister below to react at the end or start of an animation cycle.
 
 
-
 === Usage Example
 
 In this short example, we define the space key to trigger playing the “Walk animation on channel2.
 
-
 [source,java]
 ----
 
@@ -291,7 +268,6 @@ In this short example, we define the space key to trigger playing the “Walk an
 
 A jME3 application that contains animations can implement the `com.jme3.animation.AnimEventListener` interface.
 
-
 [source,java]
 ----
 public class HelloAnimation extends SimpleApplication
@@ -301,15 +277,12 @@ public class HelloAnimation extends SimpleApplication
 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.
 
-
 You have access to the following objects:
 
-
 *  The Control to which the listener is assigned.
 *  The animation channel being played.
 *  The name of the animation that has just finished playing.
@@ -332,10 +305,8 @@ You have access to the following objects:
 
 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
 
-
 *  The Control to which the listener is assigned.
 *  The animation channel being played.
 *  The name of the animation that will start playing.

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

@@ -13,19 +13,15 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Anisotropic Filtering is very important for Desktop Games and their textures. Most games use AnisotropicFiltering = 4/8/16. It sharpens your textures under different Angle View. 
 Anisotropy makes a performance draw back about 10-40 fps, but the result looks much better.
 
-
 See Example: link:http://i.imgur.com/0yiv9.jpg[http://i.imgur.com/0yiv9.jpg]
 
 image::jme3/advanced/anisotropy_example_mifth_01.jpg[anisotropy_example_mifth_01.jpg,with="360",height="900",align="right"]
 
 
-
 JME has DEFAULT AnisotropicFiltering = 0. So, if you make a game for Windows/Linux/Mac.. you need to set the Anisotropic Filtering more than 0.
 
-
 Example how to set AnisotropicFiltering = 4 for all textures:
 
-
 [source,java]
 ----
 

+ 4 - 25
src/docs/asciidoc/jme3/advanced/application_states.adoc

@@ -10,7 +10,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 The `com.jme3.app.state.AppState` class is a customizable jME3 interface that allows you to control the global game logic, the overall game mechanics. (To control the behaviour of a Spatial, see <<jme3/advanced/custom_controls#,Custom Controls>> instead. Controls and AppStates can be used together.)
 
 
-
 == Overview
 
 
@@ -18,7 +17,6 @@ The `com.jme3.app.state.AppState` class is a customizable jME3 interface that al
 
 There are situations during your game development where you think:
 
-
 *  Mouse and key inputs are handled differently in-game versus in the main menu. Can I group a set of input handler settings, and activate and deactivate them all in one step?  
 *  I have the in-game scene, and a character editor, and a Captain's Quarters screen. Can I group a set of nodes and behaviours, and swap them in and out in one step?
 *  When I pause the game, I want the character's “idle animation to continue, but all other loops and game events should stop. How do I define what happens when the game is paused/unpaused? 
@@ -27,7 +25,6 @@ There are situations during your game development where you think:
 
 You can! This is what AppStates are there for. An AppState class is subset of (or an extension to) your application. Every AppState class has access to all fields in your main application (AssetManager, ViewPort, StateManager, InputManager, RootNode, GuiNode, etc) and hooks into the main update loop. An AppState can contain:
 
-
 *  a subset of class fields, functions, methods (game state data and accessors), 
 *  a subset of +++<abbr title="Graphical User Interface">GUI</abbr>+++ elements and their listeners, 
 *  a subset of input handlers and mappings, 
@@ -41,12 +38,9 @@ You can! This is what AppStates are there for. An AppState class is subset of (o
 
 Each AppState lets you define what happens to it in the following situations:
 
-
-*  *The AppState is initialized:* You load and initialize game data, InputHandlers, AppStates and Controls and attach nodes. +
-The AppState executes its own simpleInitApp() method when it is attached, so to speak.
+*  *The AppState is initialized:* You load and initialize game data, InputHandlers, AppStates and Controls and attach nodes. +The AppState executes its own simpleInitApp() method when it is attached, so to speak.
 *  *The AppState has been enabled (unpaused):* This toggles a boolean isEnabled() to true. Here you attach nodes and listeners that should become active while it's running. 
-*  *While the AppState is running/paused:* You can poll isEnabled() to define paused and unpaused game behaviour in the update() loop. In update(), you poll and modify the game state, modify the scene graph, and trigger events. Test if `!isEnabled()`, and write code that skips the running sections of this AppState's `update()` loop. +
-Each AppState has its own update loop, which hooks into the main simpleUpdate() loop (callback). 
+*  *While the AppState is running/paused:* You can poll isEnabled() to define paused and unpaused game behaviour in the update() loop. In update(), you poll and modify the game state, modify the scene graph, and trigger events. Test if `!isEnabled()`, and write code that skips the running sections of this AppState's `update()` loop. +Each AppState has its own update loop, which hooks into the main simpleUpdate() loop (callback). 
 *  *The AppState has been disabled (paused):* This toggles a boolean isEnabled() to false. Here you switch all objects to their specific “paused behaviour. 
 *  *The AppState is cleaned up:* Here you decide what happens when the AppState is detached. Save this AppState's game state, unregister Controls and InputHandlers, detach related AppStates, detach nodes from the rootNode, etc.
 
@@ -58,12 +52,10 @@ Tip: AppStates are extremely handy to swap out, or pause/unpause whole sets of o
 
 
 
-
 === Usage
 
 To implement game logic:
 
-
 .  Create one AbstractAppState instance for each set of game mechanics. 
 .  Implement game behaviour in the AppState's update() method.
 **  You can pass custom data as arguments in the constructor.
@@ -76,12 +68,10 @@ To implement game logic:
 When you add several AppStates to one Application and activate them, their initialize() methods and update() loops are executed in the order in which the AppStates were added to the AppStateManager.
 
 
-
 === Code Samples
 
 JME3 comes with a BulletAppState that implements Physical behaviour (using the jBullet library). You, for example, could write an Artificial Intelligence AppState to control all your enemy units. Existing examples in the code base include:
 
-
 *  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-bullet/src/common/java/com/jme3/bullet/BulletAppState.java[BulletAppState] controls physical behaviour in PhysicsControl'ed Spatials.
 *  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/app/state/TestAppStates.java[TestAppStates.java] an example of a custom AppState
 **  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/app/state/RootNodeState.java[RootNodeState.java]
@@ -91,7 +81,6 @@ JME3 comes with a BulletAppState that implements Physical behaviour (using the j
 == AppState
 
 The AppState interface lets you initialize sets of objects, and hook a set of continuously executing code into the main loop.
-
 [cols="2", options="header"]
 |===
 
@@ -116,15 +105,13 @@ a|Here you implement the behaviour that you want to hook into the simpleUpdate()
 a|isInitialized()
 a|Your implementations of this interface should return the correct respective boolean value. (See AbstractAppState)
 
-a|setEnabled(true) +
-setEnabled(false)
+a|setEnabled(true) +setEnabled(false)
 a|Temporarily enables or disables an AppState. (See AbstractAppState) 
 
 a|isEnabled()
 a|Test whether AppState is enabled or disabled. Your implementation should consider the boolean. (See AbstractAppState)
 
-a|stateAttached(asm) +
-stateDetached(asm)
+a|stateAttached(asm) +stateDetached(asm)
 a|The AppState knows when it is attached to, or detached from, the AppStateManager, and triggers these two methods. Don't modify the scene graph from here! (Typically not used.) 
 
 a|render(RenderManager rm)
@@ -140,10 +127,8 @@ a|Called after all rendering commands are flushed, including your optional custo
 
 The link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/app/state/AbstractAppState.java[AbstractAppState] class already implements some common methods (`isInitialized(), setEnabled(), isEnabled()`) and makes creation of custom AppStates a bit easier. We recommend you extend AbstractAppState and override the remaining AppState methods: `initialize(), setEnabled(), cleanup()`.
 
-
 Definition:
 
-
 [source,java]
 ----
 public class MyAppState extends AbstractAppState {
@@ -202,11 +187,9 @@ public class MyAppState extends AbstractAppState {
 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.
 
 
-
 == AppStateManager
 
 The com.jme3.app.state.AppStateManager holds the list of AppStates for an application. AppStateManager ensures that active AppStates can modify the scene graph, and that the update() loops of active AppStates is executed. There is one AppStateManager per application. You typically attach several AppStates to one AppStateManager, but the same state can only be attached once.
-
 [cols="2", options="header"]
 |===
 
@@ -223,7 +206,6 @@ a|Returns the first attached state that is an instance of a subclass of `MyAppSt
 
 The AppStateManager's `render(), postRender(), cleanup()` methods are internal, ignore them, users never call them directly.
 
-
 *  If a detached AppState is attached then initialize() will be called on the following render pass.
 *  If an attached AppState is detached then cleanup() will be called on the following render pass.
 *  If you attach an already-attached AppState then the second attach is a no-op and will return false.
@@ -238,10 +220,8 @@ The AppStateManager's `render(), postRender(), cleanup()` methods are internal,
 
 You can only access other AppStates (read from and write to them) from certain places: From a Control's update() method, from an AppState's update() method, and from the SimpleApplication's simpleUpdate() loop. Don't mess with the AppState from other places, because from other methods you have no control over the order of modifications; the game can go out of sync because you can't know when (during which half-finished step of another state change) your modification will be performed.
 
-
 You can use custom accessors to get data from AppStates, to set data in AppStates, or to trigger methods in AppStates.
 
-
 [source,java]
 ----
 this.app.getStateManager().getState(MyAppState.class).doSomeCustomStuffInThisState();
@@ -252,7 +232,6 @@ this.app.getStateManager().getState(MyAppState.class).doSomeCustomStuffInThisSta
 
 To access class fields of the SimpleApplication the way you are used to, initialize them to local variables, as shown in the following AppState template:
 
-
 [source,java]
 ----
 

+ 5 - 10
src/docs/asciidoc/jme3/advanced/appstatesdemo.adoc

@@ -17,23 +17,18 @@ THIS DEMO IS OUT OF DATE AND NEEDS CORRECTING
 
 
 
-
-= THIS DEMO IS OUT OF DATE AND NEEDS CORRECTING FOR NOW PLEASE SEE
+== THIS DEMO IS OUT OF DATE AND NEEDS CORRECTING FOR NOW PLEASE SEE
 
  link:http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:application_states[http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:application_states]
 
-
 Note: this tutorial needs to be fixed and is currently not correct.  One should almost never override stateDetached and stateAttached… and should certainly never do anything scene related in them.
 
-
 This demo is a simple example of how you use AppStates to toggle between a StartScreen and a SettingsScreen (press RETURN) while the game is paused, and start the game by switching to a GameRunning state (press BACKSPACE). 
 
-
 There are four files, Main.java, GameRunningState.java, StartScreenState.java, SettingsScreenState.java. 
 
 
-
-== Main.java
+=== Main.java
 
 [source,java]
 ----
@@ -133,7 +128,7 @@ public class Main extends SimpleApplication {
 ----
 
 
-== GameRunningState.java
+=== GameRunningState.java
 
 [source,java]
 ----
@@ -229,7 +224,7 @@ public class GameRunningState extends AbstractAppState {
 ----
 
 
-== SettingsScreenState.java
+=== SettingsScreenState.java
 
 [source,java]
 ----
@@ -322,7 +317,7 @@ public class SettingsScreenState extends AbstractAppState {
 ----
 
 
-== StartScreenState.java
+=== StartScreenState.java
 
 [source,java]
 ----

+ 11 - 53
src/docs/asciidoc/jme3/advanced/asset_manager.adoc

@@ -9,20 +9,16 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 By assets we mean multi-media files, such as 3D models, materials, textures, scenes, custom shaders, music and sound files, and custom fonts. JME3 has an integrated asset manager that helps you keep your project assets organized. Think of the asset manager as the filesystem of your game, independent of the actual deployment platform. By default, store your assets in the `MyGame/assets/ ` directory of your project.
 
-
 Advantages of the AssetManager:
 
-
 *  The paths stay the same, no matter whether the game runs on Windows, Mac, Linux, etc!
-*  The AssetManager automatically caches and optimizes the handling of OpenGL objects. +
-For example, the same textures are not uploaded to the graphics card multiple times when multiple models use them.
+*  The AssetManager automatically caches and optimizes the handling of OpenGL objects. +For example, the same textures are not uploaded to the graphics card multiple times when multiple models use them.
 *  The <<sdk/default_build_script#,default build script>> automatically bundles the contents of the `assets` directory into the executable. 
 
 Advanced users can write a custom build and packaging script, and can register custom paths to the AssetManager, but this is up to you then. 
 
 
-
-==== Context
+== Context
 
 [source]
 ----
@@ -41,18 +37,14 @@ jMonkeyProjects/MyGame/test/      # You store test classes here (optional)
 See also <<jme3/intermediate/best_practices#,Best Practices>>.
 
 
-
-== Usage
+=== Usage
 
 The `assetManager` object is an com.jme3.asset.AssetManager instance that every com.jme3.app.Application can access. It maintains a root that also includes your project's classpath by default, so you can load any asset that's on the classpath, that is, the top level of your project directory. 
 
-
 You can use the inherited `assetManager` object directly, or use the accessor `app.getAssetManager()`.
 
-
 Here is an example how you load assets using the AssetManager. This lines loads a default Material from the built-in `Common/` directory:
 
-
 [source,java]
 ----
 Material mat = (Material) assetManager.loadAsset(
@@ -61,27 +53,22 @@ Material mat = (Material) assetManager.loadAsset(
 
 This Material is “somewhere in the jME3 JAR; the default Asset Manager is configured to handle a `Common/…` path correctly, so you don't have to specify the whole path when referring to built-in assets (such as default Materials).
 
-
 Additionally, you can configure the Asset Manager and add any path to its root. This means, you can load assets from any project directory you specify. The next example shows how you load assets from your project's assets directory.
 
 
-
-== Asset Directory
+=== Asset Directory
 
 By default, jME3 searches for models in a directory named `assets`. 
 
 
-
 [IMPORTANT]
 ====
 In Java projects created with the jMonkeyEngine SDK, an `assets` folder is created by default in your project directory. If you are using any other IDE, or the command line, you simply create an `assets` directory manually (see the Codeless Project tip below).
 ====
 
 
-
 This is our recommended directory structure for storing assets:
 
-
 [source]
 ----
 
@@ -101,32 +88,26 @@ jMonkeyProjects/MyGame/assets/Textures/    # .jpg, .png; also .mesh.xml+.materia
 These subdirectories are just the most common examples. 
 
 
-
 [IMPORTANT]
 ====
 You can rename/delete/add (sub)directories inside the `assets` directory in any way you like. Note however that there is no automatic refactoring for asset paths in the SDK, so if you modify them late in the development process, you have to refactor all paths manually.
 ====
 
 
-
 *Examples:* You can rename `assets/Sounds` to `assets/Audio`, you can delete `assets/MatDefs` if you don't use it, you can create `assets/AIscripts`, etc. You can rename/move the `assets/Textures` directory or its subdirectories, but then you have to re-export all models, and re-convert them all to .j3o, so plan ahead!
 
 
-
 [IMPORTANT]
 ====
-Store textures in `assets/Textures/` before you work with them in a mesh editor! Export and save 3D model files (.mesh.xml+.material, .mtl+.obj, .blend) into the `assets/Textures/` (!) before you convert the model to binary format (.j3o)! This ensures that texture paths correctly point to the `assets/Textures` directory. +
-After the conversion, you move the .j3o file into the `assets/Models/` or `assets/Scenes/` directories. This way, you can reuse textures, your binaries consistently link the correct textures, and the `assets/Models` and `assets/Scenes` directories don't become cluttered.
+Store textures in `assets/Textures/` before you work with them in a mesh editor! Export and save 3D model files (.mesh.xml+.material, .mtl+.obj, .blend) into the `assets/Textures/` (!) before you convert the model to binary format (.j3o)! This ensures that texture paths correctly point to the `assets/Textures` directory. +After the conversion, you move the .j3o file into the `assets/Models/` or `assets/Scenes/` directories. This way, you can reuse textures, your binaries consistently link the correct textures, and the `assets/Models` and `assets/Scenes` directories don't become cluttered.
 ====
 
 
 
-
-== Example Code: Loading Assets
+=== Example Code: Loading Assets
 
 Creating a material instance with the definition “Unshaded.j3md:
 
-
 [source,java]
 ----
 
@@ -137,7 +118,6 @@ Material mat_brick = new Material(
 
 Applying a texture to the material:
 
-
 [source,java]
 ----
 
@@ -148,7 +128,6 @@ mat_brick.setTexture("ColorMap",
 
 Loading a font:
 
-
 [source,java]
 ----
 
@@ -158,7 +137,6 @@ guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
 
 Loading a model:
 
-
 [source,java]
 ----
 
@@ -168,7 +146,6 @@ Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
 
 Loading a scene from an Ogre3D dotScene file stored inside a zip:
 
-
 [source,java]
 ----
 
@@ -180,7 +157,6 @@ rootNode.attachChild(scene);
 
 Alternatively to ZipLocator, there is also a HttpZipLocator that can stream models from a zip file online:
 
-
 [source,java]
 ----
 
@@ -194,7 +170,6 @@ rootNode.attachChild(scene);
 jME3 also offers a ClasspathLocator, ZipLocator, FileLocator, HttpZipLocator, and UrlLocator (see `com.jme3.asset.plugins`). 
 
 
-
 [IMPORTANT]
 ====
 The custom build script does not automatically include all ZIP files in the executable build. See “Cannot Locate Resource solution below.
@@ -202,8 +177,7 @@ The custom build script does not automatically include all ZIP files in the exec
 
 
 
-
-== Common AssetManager Tasks
+=== Common AssetManager Tasks
 [cols="2", options="header"]
 |===
 
@@ -248,14 +222,12 @@ rootNode.attachChild(scene);
 |===
 
 
-== NullPointerException: Cannot locate resource?
+=== NullPointerException: Cannot locate resource?
 
 *Problem:*
 
-
 My game runs fine when I run it right from the jMonkeyEngine SDK. But when I run the stand-alone executables (.jar, .jnlp .exe, .app), a DesktopAssetManager error message occurs in the console, and it quits?
 
-
 [source]
 ----
 com.jme3.asset.DesktopAssetManager loadAsset
@@ -268,16 +240,12 @@ java.lang.NullPointerException
 
 *Reason:*
 
-
 If you use the default build script, *original models and scenes (.mesh.xml, .obj, .blend, .zip), are excluded* from the distribution automatically. A stand-alone executable includes converted *.j3o files* (models and scenes) only. The default build script makes sure to bundle existing .j3o files in the distribution, but you need to remember to convert the models (from mesh.xml–&gt;.j3o, or .obj–&gt;.j3o, etc) yourself. 
 
-
 *Solution*
 
-
 Before building the executable, you must use the jMonkeyEngine SDK's context menu action to <<sdk/model_loader_and_viewer#,convert 3D models to .j3o binary format>>.
 
-
 .  Save your original models (.mesh.xml, .scene, .blend, or .obj files, plus textures) into `assets/Textures/`. (!)
 .  Open the jME3 project in the jMonkeyEngine SDK.
 .  Browse to the `assets` directory in the Projects window. 
@@ -289,7 +257,6 @@ Before building the executable, you must use the jMonkeyEngine SDK's context men
 This ensures that the model's Texture paths keep working between your 3D mesh editor and JME3.
 
 
-
 [IMPORTANT]
 ====
 If you must load custom assets from a non-.j3o ZIP file, you must manually ammend the <<sdk/default_build_script#,default build script>> to copy ZIP files into your distribution. ZIPs are skipped by default.
@@ -297,29 +264,22 @@ If you must load custom assets from a non-.j3o ZIP file, you must manually ammen
 
 
 
-
-== Asset Handling For Other IDEs: Codeless Projects
+=== Asset Handling For Other IDEs: Codeless Projects
 
 *Problem:*
 
-
 I use another IDE than jMonkeyEngine SDK for coding (Eclipse, IntelliJ, text editor). Where is my `asset` folder and .j3o converter?
 
-
 *Solution:*
 
-
 You can code in any IDE, but you must create a so-called codeless project in the jMonkeyEngine SDK to maintain assets. *A code-less jMonkeyEngine project does not meddle with your sources or custom build scripts.* You merely use it to convert models to .j3o binaries. 
 
-
 .  Create your (Eclipse or whatever) project as you like.
-.  Create a directory in your project folder and name it, for example, `assets`. +
-Store your assets there as described above.
+.  Create a directory in your project folder and name it, for example, `assets`. +Store your assets there as described above.
 .  Download and install the jMonkeyEngine SDK.
 .  In the SDK, go to File → Import Projects → External Project Assets.
 .  Select your (Eclipse or whatever) project and your assets folder in the Import Wizard.
-.  You can now open this (Eclipse or whatever) project in the jMonkeyEngine SDK. +
-Convert assets as described above.
+.  You can now open this (Eclipse or whatever) project in the jMonkeyEngine SDK. +Convert assets as described above.
 
 
 [IMPORTANT]
@@ -329,10 +289,8 @@ If you don't use the SDK for some reason, you can still convert models to j3o fo
 
 
 
-
 [TIP]
 ====
 Use file version control and let team members check out the project. Your developers open the project in Eclipse (etc) as they are used to. Additionally to their graphic tools, ask your graphic designers to install the jMonkeyEngine SDK, and to check out the codeless project that you just prepared. This makes it easy for non-coding team member to browse and preview game assets, to arrange scenes, and to convert files. At the same time, non-coders don't accidentally mess with code, and developers don't accidentally mess with assets. :)
 ====
 
-

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

@@ -12,14 +12,11 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 *Hi Monkeys,*
 
-
 *Atom framework for game developing in Java. Powered by JME3.*
 
-
 *Atom* framework which on top of JME3 and have some features like AI, Scripting, Database, VirtualReallity, Trigger, Multiplayer…(more below)  to make developing game process in JME3 much more easier!
 
 
-
 [TIP]
 ====
 
@@ -28,46 +25,35 @@ Go to the Atomix Game making tutorials. <<jme3/atomixtuts#,atomixtuts>>
 
 
 
-
 === Open Source
 
 Atom Core : The AtomCore source code is hosted in Googlecode
 
-
 Googlecode: link:https://code.google.com/p/atom-game-framework/[https://code.google.com/p/atom-game-framework/]
 
-
 Github: link:https://github.com/atomixnmc/atom-game-framework[https://github.com/atomixnmc/atom-game-framework]
 
-
 Wiki: link:https://code.google.com/p/atom-game-framework/wiki/[https://code.google.com/p/atom-game-framework/wiki/]
 
 
-
 === Documentations:
 
 <<jme3/advanced/atom_framework/design#, Detailed architecture designs >>
 
-
 <<jme3/advanced/atom_framework/docs#, Detailed documentation >>
 
-
 <<jme3/advanced/atom_framework/comparison#, Detailed comparison>>
 
 
-
 === Idea & Buzz
 
 *Better, more freedom, more fun!*
 
-
 From +++<strike>UDK and Unity</strike>+++ 's battle field, I've dreamt about making even better game engine with the help of my 2 fav technologies - *Java* and *opensource*.
 
-
 JME3 and Netbean combination are the most brighten idea I 've seen in years. I think it deserve a better reputation worldwide.
 
 
-
 ==== Initial Ideas:
 
 *  Ease the learning curve
@@ -80,10 +66,8 @@ JME3 and Netbean combination are the most brighten idea I 've seen in years. I t
 
 link:https://en.wikipedia.org/wiki/Atom[https://en.wikipedia.org/wiki/Atom]
 
-
 Yes, this is for game developing. But in its heart is future's technologies. 
 
-
 ....
  Atom Etymology: Devive the thing as small as you can, than compose it into a thing again.
 ....
@@ -93,7 +77,6 @@ ____
 ____
 
 The most conceptual inspiration for Atom framework is project link:http://ptolemy.eecs.berkeley.edu/index.htm[http://ptolemy.eecs.berkeley.edu/index.htm] . Unfortunately Ptolemy is in “for research only area and its direction toward the much large scale than game developing. That's why Atom framework was born with the learnt architecture from Ptolemy. 
-
 [quote]
 ____
  The Ptolemy project studies modeling, simulation, and design of concurrent, real-time, embedded systems. The focus is on assembly of concurrent components. The key underlying principle in the project is the use of well-defined models of computation that govern the interaction between components. A major problem area being addressed is the use of heterogeneous mixtures of models of computation
@@ -108,7 +91,6 @@ ____
 
 * Atom framework Highlights*
 
-
 *  Flexible: Game | simulations centric but not forced!
 *  Modular: Dependency injection along with Component injection
 *  Parallel: Embrace parallel computing
@@ -118,7 +100,6 @@ ____
 
 Full Features list
 
-
 *  Cross game genre framework for JME3
 **  <<jme3/advanced/atom_framework/atomcore#,General stage - world ; game play and cycle>>
 **  <<jme3/advanced/atom_framework/atomcore/entitysystem#,General Entity framework>>
@@ -150,9 +131,7 @@ Full Features list
 
 Here are its architecture and components.
 
-
-iframe:http://bubbl.us/view/1860d6/2fd77c/15vOUTXerN5GQ/[width="800px", height="400px", alt="", scroll="true",border="true",align="false"]
-
+iframe::http://bubbl.us/view/1860d6/2fd77c/15vOUTXerN5GQ/[width="800px", height="400px", alt="", scroll="true",border="true",align="false"]
 
 
 
@@ -233,43 +212,34 @@ iframe:http://bubbl.us/view/1860d6/2fd77c/15vOUTXerN5GQ/[width="800px", height="
 
 Yeah, it was long time ago, you quit learning java because java gaming is a dead end.
 
-
 But Android come to play, and the the market are open so freaking big that even companies live with their C++ code base want to take advantage of the new wave…
 
-
 Recently Java has so much improvements and then JME3 enchant the talents all around the world to develop the master peices of software!
 
 
-
 ==== But did we chasing after them?
 
 No, we are not. We are going ahead of them with all the techniques from the almightly open-source.
 
-
 Java communities are much more open and helpful than any of those Microsoft, Apple, UDK, Unity,… evils… Let's make a fairplay at last!
 
 
-
 ==== Can we win?
 
 The time will tell… but at least, we once gain give the power to the hands of the people, not just some rich and intelligent people, that's the most critical point!
 
 
-
 === Project status
 
 If you interest in contribute to Atom framework open-sourced project, here is the status of the project in 2014 and some mile stones it want to reach in the future.
 
-
 <<jme3/advanced/atom_framework/status#,Atom framework open-sourced project Status - 2014>>
 
 
-
 === Other open-source dependencies
 
 Actually it use directly/indirectly various projects of JME3 great contributors and open source projects:
 
-
 *  AI from @Sploreg,@shirkit and mine
 *  VirtualReallity integrated with OpenCV, JavaCV : @noncom + mine
 *  ShaderBlow from @mifth
@@ -289,7 +259,6 @@ Hundred of opensource projects…Nail it
 
 
 
-
 [TIP]
 ====
 _I want to thank all of you for you great great great contributions, help me and my friends here to start learning game programming and doing our own game. Salute! My job is to glue the those great gems together, (pretty time consuming job) :_
@@ -297,12 +266,8 @@ _I want to thank all of you for you great great great contributions, help me and
 ====
 
 
-
 As the spliting above, then I will make two different topic to keep them separate, the Atom framework and the Series of game making.
 
-
 <<jme3/atomixtuts#, Atomix Series of game making>>
 
-
 GOTO <<jme3/advanced/atom_framework/docs#,Detailed Atom framework Documentation>>
-

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

@@ -12,30 +12,23 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Hi,
 
-
 This is the wiki for Atom AI framework.
 
 
-
 image::http://blogs.ifsworld.com/wp-content/uploads/2012/11/AI-lowres.jpg[AI-lowres.jpg,with="200",height="",align="right"]
 
 
 
-
 === Questions and Answers
 
 *Question:* What's the h#$ll is AI or why should I bother in this thingy anyway emoji:
 
-
 *Answer:* It's big, over-complicated and also attractive subject in Game developing.. emoji: emoji:sunglasses
 
-
 *Question:* What can be use in my game?
 
-
 *Answer:* Everything… You can use this lib to:
 
-
 *   solve the common path finding, 
 *  let your creature know how to think and learn, 
 *  direct your vehicle the way to move, 
@@ -46,30 +39,23 @@ image::http://blogs.ifsworld.com/wp-content/uploads/2012/11/AI-lowres.jpg[AI-low
 
 *Question:* Sound wonderful…? But wait… It should be soooooooo freaking big and heavy, is it *real-time* shit?
 
-
 *Answer:* Yes, partly… Some parts are real heavy for real time computing. They just can be used in non real time application or few kind of games. Others apx 60% are designed well enough to run in real time, and also provided with JME examples. It also comes with architectures/ functions that can config, optimize, balance, cache, and batch it selfs for real-time applications…
 
-
 *Question:* Eh… Universal solution can not be true…
 
-
 *Answer:* Let's me explain. Consider this a warper of every good open-source java AI libraries you can name out and hook in to JME architecure (AppState, Sptial, Entity, Control, Update cycle…etc). Under the hood, I use Guice| OSGi |Felix to dynamicly link/bind them, when you need it. The full explaination you will find below.
 
-
 *Question:* Nice, I want to try it?
 
-
 *Answer:* Everything is here at once, sir/ madam !
 More questions ? Not convinced yet? Go to <<FAQ,FAQ>>
 
 
-
 === Introducing Atom AI framework
 
 This Atom AI framework are more or less a “framework to bring AI to jME3 game (also means real-time application)!
 
 
-
 [TIP]
 ====
 Here is my picked list of <<jme3/advanced/atom_framework/ai/researches#,researches>> and articles you can read in AI field (game and none-game) 
@@ -77,7 +63,6 @@ Here is my picked list of <<jme3/advanced/atom_framework/ai/researches#,research
 
 
 
-
 === Idea & Buzz
 
 *  It contains warpers for various java AI libraries build on top of light-weight, configable module architecture and provide the way to hook seamlessly to jME3 games. 
@@ -92,14 +77,11 @@ Here is my picked list of <<jme3/advanced/atom_framework/ai/researches#,research
 
 (T) means additional Tools are supported
 
-
 (C) means with examples cases
 
-
 (E) means use| depend on external libs 
 
 
-
 [IMPORTANT]
 ====
 Note that: despite of the fact, the lib has a lot of dependencies, the author always try have simple fallback - homegrown implemention.  Of course, support a fewer use cases, mainly for specific game genres, but it's better than nothing, that's the bright side 
@@ -107,7 +89,6 @@ Note that: despite of the fact, the lib has a lot of dependencies, the author al
 
 
 
-
 [IMPORTANT]
 ====
 Read alternatives and searches if you want to go further than Atom!
@@ -115,7 +96,6 @@ Read alternatives and searches if you want to go further than Atom!
 
 
 
-
 ==== Framework
 
 *  Modulize (E)
@@ -203,9 +183,7 @@ Read alternatives and searches if you want to go further than Atom!
 
 Here are its <<jme3/advanced/atom_framework/ai/architecture/architecture#,Architecture>> and <<jme3/advanced/atom_framework/ai/components/components#,Components>>.
 
-
-iframe:http://bubbl.us/view/1860d6/2fd76d/15vmlQSf.3GMg/[width="98%", height="400px", alt="600px,600px", scroll="true",border="true",align="false"]
-
+iframe::http://bubbl.us/view/1860d6/2fd76d/15vmlQSf.3GMg/[width="98%", height="400px", alt="600px,600px", scroll="true",border="true",align="false"]
 
 
 
@@ -213,64 +191,48 @@ iframe:http://bubbl.us/view/1860d6/2fd76d/15vmlQSf.3GMg/[width="98%", height="40
 
 As the framework grown up, I will bring more unit tests and example cases.
 
-
 Also it should has even better integration with the JME SDK and other Netbean's plugins like (weka, neuphons…). Corporate with Code gen, it's can easily replace Alice, Manson,etc…  as much better 3D non-coding enviroment and one day maybe become the most advanced AI simulation enviroment on earth! 
 
 
-
 === FAQ
 
 *Question*: Why warpers?
 
-
 *Answer*: Not reinventing the wheel, trust in good opensource project, broader use caces, broader user… And last but not least, it's just work!
-
 '''
 
 *Question*: Why java 1.5+?
 
-
 *Answer* : Consider this lib is a push to java techs and java's game techs. The user are forced to get familiar with the changing world… Yes, AI is a rapid changing subject and we (java game devs) should keep up.
-
 '''
 
 *Question*: Why f$#kin heavy and not light-weight, real-time, etc???
 
-
 *Answer*: This libs provide some features which just optimized enough to run in “quite high performance machine. But it also have sotiphicated methods to config it self. Consider this key feature to keep in mind. Get fit!
-
 '''
 
 *Question*: Big jar?
 
-
 *Answer*: Nope, consider not too big… thanks to Guice, size &lt; 6MBs and can even smaller if you compile it your self and cut the unneccesary things. In some case you want to use *ALL* the features, the whole dependencies will take about *78MB* and *45MB* for the SDK plugins! And Maven should be to used to get every artifacts!
-
 '''
 
 *Question*: Documentations and javadoc?
 
-
 *Answer* : On its way, the orginal author (me, @atomix) are slow (busy) , volunteers are welcome! Also read all the external wel-documented open source libs <<jme3/advanced/atom_framework/ai/libs#, Full list here>> that this lib depend on are quite enough. Cause its idiom is simple.
-
 '''
 
 *Question*: I have ideas?
 
-
 *Answer* : Tell me , @atomix in the forum.
 
 
-
 === Other open-source dependencies
 
 As said, even if I try to rewriten some parts that most critical for real time game, I cannot against the ideas of including every good functions of other libs. So, I provide good way to communicate between them and the way to link them on demand…
 
-
 Let name the libs can be used:
 As category
 
-
 *  Neutral Network
 *  Machine Learning
 *  Search
@@ -308,4 +270,3 @@ As category
 == Researches
 
 Go to <<jme3/advanced/atom_framework/researches#,researches>>
-

+ 0 - 22
src/docs/asciidoc/jme3/advanced/atom_framework/ai/architecture.adoc

@@ -13,22 +13,18 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 AtomAI is an innovative framework for doing AI for simulations and interactive applications, focus in Games!
 
 
-
 === Technologies
 
 AtomAI built up by bleeding-edge of AI technologies based in lastest researches. Underlying, it depends in extensible framework to leverage maximum Java language in spirit of Atom framework.
 
-
 Many parts of AtomAI are very innovative and actually release the developer from low level concerning and save a lot of time redo common usecases implementations; without errors.
 
 
-
 === Dependencies
 
 AtomAI depend a lot in good AI opensource projects
 
 
-
 ==== Java DataStructures & Mechanisms
 
 
@@ -36,7 +32,6 @@ AtomAI depend a lot in good AI opensource projects
 
 link:http://javolution.org/[http://javolution.org/]
 
-
 ....
  Because real-time programming requires a time-predictable standard library. Javolution real-time goals are simple: To make your application faster and more time predictable!
 ....
@@ -44,28 +39,22 @@ link:http://javolution.org/[http://javolution.org/]
 Javolution solve some fundamental real-time problems with innovative technologies. Javolution is one of core dependencies of AtomCore and so AtomAI. 
 
 
-
 ===== Guava & Guice
 
 Two google opensource projects that make Java developer's life easier.
 
 
-
 ===== Apache Commons
 
 Lang
 
-
 BeanUtils 
 
-
 Math
 
-
 Logging
 
 
-
 [TIP]
 ====
 Javolution, Guava, Guice, Commons Lang, BeanUtils, Math, Logging are a complete sets of libraries for Real-time applications with testable, logable capacities, fullfill each other and has just a little bit overlaps. You can setup them easily via Maven or gradle with JME3.
@@ -73,12 +62,10 @@ Javolution, Guava, Guice, Commons Lang, BeanUtils, Math, Logging are a complete
 
 
 
-
 ===== XXL
 
 link:http://code.google.com/p/xxl/[http://code.google.com/p/xxl/]
 
-
 ....
  XXL is a Java library that contains a rich infrastructure for implementing advanced query processing functionality. The library offers low-level components like access to raw disks as well as high-level ones like a query optimizer. On the intermediate levels, XXL provides a demand-driven cursor algebra, a framework for indexing and a powerful package for supporting aggregation.
 ....
@@ -86,12 +73,10 @@ link:http://code.google.com/p/xxl/[http://code.google.com/p/xxl/]
 XXL already solved a lot of problems in spatial, relational and metadata… Upon that base, AtomAI focus in higher level of abstraction like Graph, State, Tree; Flow, Stream, Load balance;  later focus more in AI stuffs without worry about lower levels.
 
 
-
 ===== Qi4j
 
 link:http://qi4j.org/[http://qi4j.org/]
 
-
 ....
  is a framework for domain centric application development, including evolved concepts from Aspect Oriented Programming, Dependency Injection and Domain Driven Design.
 ....
@@ -103,12 +88,10 @@ link:http://qi4j.org/[http://qi4j.org/]
 Qi4j offers a way to config the system by layers and entities. More over, Entity-Composite (with relasionship enable) compare to Entity-components is a better way to compose things.
 
 
-
 ===== RxJava
 
 link:https://github.com/Netflix/RxJava[https://github.com/Netflix/RxJava]
 
-
 ....
  Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
 ....
@@ -116,7 +99,6 @@ link:https://github.com/Netflix/RxJava[https://github.com/Netflix/RxJava]
 RxJava already provided mechanisms for composing asynchronous and event-based programs. AtomAI then focus in design the flows of events of agents. This is a win-win scenario for boths.
 
 
-
 ==== Scripting
 
 
@@ -125,7 +107,6 @@ RxJava already provided mechanisms for composing asynchronous and event-based pr
 Groovy leverage Java in a very elegent way. Make itself the most valid candidate to being a scripting language for Java and AtomAI to construct a very flexible framework. AtomAI also provide better mechanisms to automatic tasks and tools, give developer more power in editing scripts and actions.
 
 
-
 ==== AI Model and source structure
 
 
@@ -133,7 +114,6 @@ Groovy leverage Java in a very elegent way. Make itself the most valid candidate
 
 link:http://code.google.com/p/aima-java/[http://code.google.com/p/aima-java/]
 
-
 ....
  Java implementation of algorithms from Norvig and Russell's Artificial Intelligence - A Modern Approach 3rd Edition
  
@@ -142,12 +122,10 @@ link:http://code.google.com/p/aima-java/[http://code.google.com/p/aima-java/]
 is de-facto for AI techs. AtomAI *modify* and *add implementations* to AIMA-java that intergrate deeply with above technologies, make AIMA the most complete, powerful and open java AI framework.
 
 
-
 ===== Choco
 
 link:https://github.com/chocoteam/choco3[https://github.com/chocoteam/choco3]
 
-
 ....
   Choco3 is an open-source Java library for Constraint Programming. 
   Choco3 comes with:

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

@@ -13,7 +13,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Atom2D
 
 
-
 === Datastructure
 
 
@@ -35,4 +34,3 @@ Atom2D
 === Tools
 
 (Swing)
-

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

@@ -12,10 +12,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Provide +++<abbr title="Application Programming Interface">API</abbr>+++ and implementation for “reactive in-game editor in JME3 and Atom framework. 
 
-
 Inspired by: 
 
-
 Netbean: link:https://netbeans.org/[https://netbeans.org/]
 LightTable: link:http://www.lighttable.com/[http://www.lighttable.com/]
-

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

@@ -12,61 +12,44 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 AtomCore is the main component of Atom framework.
 
-
 This is the detailed documentation of AtomCore module architecture, design decisions, implementations and real usecases, examples, resources.
 
-
 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: 
 
-
 Issues:
 
-
 Quick links: _Read if you know ready know the basic_
 
-
 <<jme3/advanced/atom_framework/atomcore/cycle#,AtomCore Cycle>>
 
-
 <<jme3/advanced/atom_framework/design/patterns#,AtomCore patterns>>
 
-
 <<jme3/advanced/atom_framework/atomcore/algorithms#,AtomCore algorithms>>
 
 
-
 == Architecture Design
 
 Atom philosophy is “Minimal, “Only one.
 
-
 As a software modeler, you always need more than one thing to decribe your solutions. Atom try to compact them into mimimal sets and if possible, only one piece of consistent but flexible design.
 
-
 As a developer, you may find it easy to adapt and extend the framework to suite your games and purpose.
 
-
 Now talk about the most primitive “Core design of the framework is a “Relationship between the “Core and the “Container. This also the most important concept of philosophy of the universe, sciences and of course programming.
 
-
 AtomCore leverages Java programming with concepts and ultilities for various pairs of Core-Container (common in game development) such as: Actor &amp; Stage, Player &amp; League, Task &amp; Manager, Worker &amp; Thread, Entity &amp; Context, UI &amp; Layout, Stream &amp; Pipeline, Pipeline &amp; Topology…
 
-
 Beside of those common basis pairs, collections, graphs and other datastructure, executions, pattern and behaviours are also supported!
 
-
 The details of those techniques will be listed below.
 
 
-
 === The core features:
 
 Features of AtomCore
 
-
 *  Cross game-genre elements: stage, cycle, entity, logic, trigger, event, config;
 *  Managers and management: Advanced assets manager, IOC, AOP, dependecy injection, factory, scripting, basic DB..;
 *  Common case: Common state, common scenerio, common UIs…
@@ -74,18 +57,15 @@ Features of AtomCore
 Below you will read about how each feature is implemented in AtomCore.
 
 
-
 ==== Cross game-genre elements
 
 From an abstraction level, a Game- a special kind of software (almost always):
 
-
 *  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:
 
-
 *  Logic:
 **  Trigger: in which Conditions, active some appropriate Action, as primitive brick.
 **  Rule: the laws, restrictions form the game rule which player, entities obey.
@@ -104,7 +84,6 @@ A little bit more detailed, Gameplay is the way player play the Game, has:
 
 The game “software should be published in specific enviroment called Context, it then has:
 
-
 *  Configurations : appropriate settings for specific enviroment, device.
 *  Data : appropriate size and format
 
@@ -118,10 +97,8 @@ This is so important to mention that every techs Atom framework are around Bean/
 ====
 
 
-
 In <<jme3/advanced/atom_framework/atomcore/beans#,AtomCore Bean>> are leverage in a few ways:
 
-
 *  Modeling
 *  Generating
 *  Binding
@@ -134,10 +111,8 @@ In <<jme3/advanced/atom_framework/atomcore/beans#,AtomCore Bean>> are leverage i
 
 In JME3 we almost see the things work like this, the “almighty” Cycle:
 
-
 link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:update_loop[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:update_loop]
 
-
 .  Input listeners respond to mouse clicks and keyboard presses – Input handling
 .  Update game state:
 ..  Update overall game state – Execute Application States
@@ -154,31 +129,24 @@ link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:update_loop[http:/
 
 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. 
 
-
 Read more details in AtomCore's Cycle.
 
-
 <<jme3/advanced/atom_framework/atomcore#,atomcore>>
 
 
-
 ===== As core of a whole Enterprise
 
 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]
 
-
 I learnt few things,eventually Spring is for Enterprise, so most of its features is accessed through AtomEx, but AtomCore will have some of its goods to be integrated later.
 
-
 <<jme3/advanced/atom_framework/atomex#,atomex>>
 
 
-
 === AtomCore concepts
 
 ....
@@ -193,19 +161,14 @@ I learnt few things,eventually Spring is for Enterprise, so most of its features
 
 AtomCore introduce the concepts of Manager (then Helper, Worker, Actor later). What are they?
 
-
 Managers are useful objects (usually Singleton) to manage aspects of a game, such as Rendering,  Sounds, World, Assets, Networks, Effects, etc…
 
-
 Managers are born to help developer manage/ monitor/ manipulate every conner/ moment/ objects in the game code base and run-time activites.
 
-
 Manager is the concept of who have responsibities and power over others (as its children or employee in the real world), essentially it is a list of its children, and have basic opertions like add,remove to manage that list… You can also think about it as the Control of the MVC paradigm where it is the mediator between Model and View. In JME3, you see Manager every where such as AssetManager, StateManager as the wraper of underlying functions. So, event mixed up quite a lot concepts at once, Manager in Scripting is extremely useful and fullfill the missing piece of the picture we are painting for a while here.
 
-
 To clean the mist of confusion about mixed of concepts a little bit, there are some practical wisdoms about Manager implementation:
 
-
 ....
   Manager acts globally, handy: usually a Singleton, or really easy to reference in script
   Manager wrap underlying details in intuitive way
@@ -216,14 +179,11 @@ To clean the mist of confusion about mixed of concepts a little bit, there are s
 
 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.
 
-
 But, the Manager-Entity system is not forced to be in relationship with each other! If work as a flat array, the Manager system can be transform to a Component process as seen in COP. This open a door to integrated deeply with Component base solutions as describled below.
 
 
-
 ===== Actor
 
 
@@ -242,14 +202,11 @@ We (forum members) and game devs all over the world also have controversial conv
 ====
 
 
-
 You can read about Component base solutions and architecture here:
 
-
 In AtomCore I sketch some interface of ES in which not care much about the implementation of the ES (pure data, smart bean, DB backed what ever…), open possiblities to intergrated ES libs in Atom framework.
 
 
-
 ==== Common implementations
 
 ....
@@ -261,13 +218,10 @@ In AtomCore I sketch some interface of ES in which not care much about the imple
 
 The first thing should be mentioned, as essentital to the framework is root of the game activities: the Cycle - Ordered activities that repeat over and over!
 
-
 My basic form of game Cycle aka CommonCycle crafted to work well with AppState concept of JME3 and other existed Managers (StateManager, AssetManager, InputManager..).
 
-
 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) 
 .  config : reconfig if need, even in update
@@ -278,12 +232,10 @@ The Cycle consist 6 basis methods:
 why 6? Why cycle? The customizable version of cycle? Introduce new cycles, queues and stuffs. read <<jme3/advanced/atom_framework/atomcore/cycle#,cycle>>
 
 
-
 ==== Common scenarios
 
 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 
 *  Composable logic: with condition, trigger
 *  Event messaging system (network ready): as inner / outter communicate media with eventbus and non blocking network
@@ -303,42 +255,33 @@ Common scenarios that almost every game have, help you to startup easily. That m
 
 The AtomCore offer (but not forced) you a way to manage “your entities (game objects) embeded to a scenegraph . This is the distinct point that made AtomCore entity difference with “other entity framework (component entity, pure data, …)
 
-
 Detail:
 
 
-
 ==== Composable logic
 
 In AtomCore version 0.1, i've implementated my own Conditional checking and composing classes and functions to build up a composable logic system. That means compose a logic phrase out of 2 boolean values: true and false!
 
-
 This system later can be use as piece in Gameplay composing, piece of Decision tree, as Guard in Finite State Machine, as condition in selecting…
 
-
 In AtomCore 0.2, I made a change, consider big affect to the whole AtomCore I adapted to Guava's Function and Predicate. What's so intereting about Java's functional flavours? It provides more ways to compose logic, also more consise, readable, resuable if done right… Read more about Predicate:
 link:http://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Predicates[http://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Predicates]
 link:http://java.dzone.com/articles/google-guavas-predicates[http://java.dzone.com/articles/google-guavas-predicates]
 
-
 Detail:
 
 
-
 ==== Event message system
 
 With eventbus 
 
-
 non blocking network
 
 
-
 ==== Common state
 
 In turn, along with this pre defined cycle, some common states which ready to use
 
-
 *  LoadState : load / watch
 *  MenuState : select / option / ingame / exit
 *  InGameState : pause/ stop 
@@ -349,25 +292,19 @@ In turn, along with this pre defined cycle, some common states which ready to us
 Handle Tasks, Actions in good concurent way (multi threading, actor..).
 
 
-
 ===== Common Controls
 
 EntityControl 
 
-
 SpatialEditorControl 
 
-
 AtomCharacterControl
 
-
 AtomAnimationControl
 
-
 IKControl
 
 
-
 ==== Common Actors
 
 
@@ -387,14 +324,11 @@ IKControl
 
 Provide a easy way to make +++<abbr title="Graphical User Interface">GUI</abbr>+++ out of XML, bean, text, script… as seen in MetaWidget. Binding means input and data transaction ready.
 
-
 Some common game UI as FlashScreen, MainMenu, Options, Lobby, Credit…
 
-
 Advanced UI operation is on AtomGUI
 
 
-
 === Application related
 
 
@@ -411,7 +345,6 @@ Advanced UI operation is on AtomGUI
 
 Core elements of the framework.
 
-
 *  annotations 	Annotations to setting up elements in java code. [Same in every packages!]
 *  assets 			Facilities to import / export assets from JME3 pipeline
 *  bean			Facilities to use Java bean in Atom context with mapping and binding.
@@ -428,12 +361,10 @@ Core elements of the framework.
 Concepts and Facilities to build up Game object. [Beta]
 
 
-
 ==== sg.atom.fx
 
 Concepts and Facilities to create and manage animations and effects.
 
-
 *  anim			Concepts for animation
 *  automatic 		Automatic driven for animation
 *  constraint		Other way to declare relationship between entities and activities
@@ -450,7 +381,6 @@ Concepts and Facilities to create and manage animations and effects.
 
 Concepts and facilities for games (cross-genre)
 
-
 *  action			Concepts and interfaces for action in games
 *  controls		Additional to JME3 character controls
 *  league			Leagues  group and tournament of players
@@ -465,18 +395,15 @@ Concepts and facilities for games (cross-genre)
 Basic block for building game from a programming language via formal system.
 
 
-
 ==== sg.atom.net
 
 Concepts and interfaces for connectivity and communication via networks
 
 
-
 ==== sg.atom.stage
 
 Concepts and facilities for cinematography like games
 
-
 *  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
@@ -491,19 +418,16 @@ Concepts and facilities for cinematography like games
 Additional for JME3 app state (bridge between to systems) and some common states for a common games
 
 
-
 ==== sg.atom.ui
 
 General +++<abbr title="Graphical User Interface">GUI</abbr>+++ for user interaction and styling in hierachy (non-strict) elements
 
 
-
 ==== sg.atom.utils
 
 Collections of userful utilities and datastructures, algorimths here and there. 
 
 
-
 [WARNING]
 ====
 Note: This package contains a lot of stuff borrowed from libraries and should be clean up. Do not rely too much in this library!
@@ -511,12 +435,10 @@ Note: This package contains a lot of stuff borrowed from libraries and should be
 
 
 
-
 ==== sg.atom.world
 
 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. 

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

@@ -9,11 +9,9 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Actor is
 
-
 AtomActor is
 
 
-
 == Concepts
 
 

+ 0 - 80
src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/algorithms.adoc

@@ -12,43 +12,32 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Single (or serveral) objective algorimths useful for games.
 
-
 link:http://en.wikipedia.org/wiki/Algorithm[http://en.wikipedia.org/wiki/Algorithm]
 
-
 link:http://en.wikipedia.org/wiki/Linear_programming[http://en.wikipedia.org/wiki/Linear_programming]
 
-
 Algorithm is a step-by-step procedure for calculations. An algorithm is an effective method expressed as a finite list[1] of well-defined instructions[2] for calculating a function.[3] Starting from an initial state and initial input (perhaps empty),[4] the instructions describe a computation that, when executed, proceeds through a finite[5] number of well-defined successive states, eventually producing “output[6] and terminating at a final ending state. The transition from one state to the next is not necessarily deterministic; some algorithms, known as randomized algorithms, incorporate random input.[7]
 
-
 Linear programming (LP, or linear optimization) is a method to achieve the best outcome (such as maximum profit or lowest cost) in a mathematical model whose requirements are represented by linear relationships. More formally, linear programming is a technique for the optimization of a linear objective function, subject to linear equality and linear inequality constraints. Its feasible region is a convex polyhedron, which is a set defined as the intersection of finitely many half spaces, each of which is defined by a linear inequality. Its objective function is a real-valued affine function defined on this polyhedron. A linear programming algorithm finds a point in the polyhedron where this function has the smallest (or largest) value if such a point exists.
 
 
-
 === Why use this ... for games?
 
 This package provides algorithms common in game developments. More to come but first let's take a look of those problems it trying to solve to distingish the objective and goals of this package compare to collection and others.
 
 
-
 ==== It's not another Collection (DataStructure) or Pattern package!
 
 Sort, concurrent, packing, data compressing is also partial relate to its processing method (that's algorithm) but first, they are provided as the core of the programming language, second we want to care more about the high level of abstraction, not the details. It use “interface of structure for its explaination and progress.
 
-
 Also, pattern is the term refered to a popular method in software developmenet. Pattern is also in higher level of abstraction compare to algorimths. So consider pattern is the law and algorimth is the effective way of making the job work effectively obey that law.
 
-
 Algorithms involve logic, a lot of them. But it higher level than logic. And of course algorithms need math (some physics, philosophy also) to be smart!
 
-
 Algorithms are used heavily in AI. But this package only provide pure algorithms which can be used also outside of AI topics.
 
-
 That's said:
 
-
 *  Datastructure, Pattern, Logic and AI are supported elsewhere!
 **  Algorimths depends in Pattern, Logic, Interface of Structure.
 
@@ -58,16 +47,13 @@ That's said:
 Developer want to use the algorithm they know to solve one or more goals (problem, requirement, aspect, situation, … what ever you call it). The algorithms provided here are the bricks for you to use and reuse, for different purposes. And you may notice the package also be arranged into purposes instead of implementations - techniques or another structure. That's explained the reason!
 
 
-
 ==== For games?
 
 Yes, not all of the problems we know are solved by this library…??? You've already know. It not even sotiphicated like the alternatives below but they are extremely useful for average programmers; especially game programmer, who, usually focus in the fun side (Am I right? :) )
 
-
 The library try to provide useful algorithms (best practices and wisdoms) enough for a wide range of usecases and also used in Atom framework its self. The algorimths them self may use another algorimths to solve sub-problems. Of course, it also come with examples and a lot of applications &amp; suggestion, which its the algorithms use for you to quickly and smartly solve your own problem thank to it.
 Support algorithms by purposes
 
-
 ....
  1. Allocation: solve problems about resources.
        1. Allocate resources efficiently on demand and sastify requirements:
@@ -129,20 +115,15 @@ Support algorithms by purposes
 
 First of all this package has some degree similar to JScience and Opt4J… I can't denied I had used them intensively to know what is good and what is not. About the similarity between Ptolemy and Atom, even the two take different approaches and implementation, you can read from the Atom framework introduction.
 
-
 Algorimths in computing, programming and game programming has grown, based in knowledges and wisdoms from a lot of other sciences: math, physics, philosophy, chemistry, biology… etc. Here and there the concepts are familiar with developer because they've taught in schools. Some may require extra knowledge from mathematics and physics per se… But you know google can have any way.
 
-
 Here is the part where the concepts which used in algorithms in Atom framework which you can reference and research futher. Almost every part you can also google about them or try to find it in jscience +++<abbr title="Application Programming Interface">API</abbr>+++ javadoc:
 
-
 link:http://jscience.org/api/index.html[http://jscience.org/api/index.html]
 
-
 link:http://jscience.org/experimental/javadoc/[http://jscience.org/experimental/javadoc/]
 
 
-
 === From Mathematics
 
 
@@ -168,52 +149,38 @@ link:http://jscience.org/experimental/javadoc/[http://jscience.org/experimental/
 
 You may notice that if there is a “pattern or “algorimth to optimize a progress. Can we use them repeatly until processing time toward minimum or even zero????
 
-
 This sounds totally untrue and also ridiculous but an interesting captious way of thinking. 
 
-
 link:http://algs4.cs.princeton.edu/66intractability/[http://algs4.cs.princeton.edu/66intractability/]
 
-
 link:http://en.wikipedia.org/wiki/Time_hierarchy_theorem[http://en.wikipedia.org/wiki/Time_hierarchy_theorem]
 
-
 link:http://www.npr.org/blogs/13.7/2011/09/19/140599268/minds-and-machines-the-limits-of-turing-complete-machines[http://www.npr.org/blogs/13.7/2011/09/19/140599268/minds-and-machines-the-limits-of-turing-complete-machines]
 
-
 link:http://en.wikipedia.org/wiki/Turing_machine#Computational_complexity_theory[http://en.wikipedia.org/wiki/Turing_machine#Computational_complexity_theory]
 
-
 Here i used the term the *saturation of algorithms* to describle the problem from overview.
 
-
 Let say the algorithm A needs B to compute, and than B needs A to compute. The Recursion will be forever in the turing machine such as our computer, until we out of memory or can even cause a crash in some programming language and computer-small scale ones (pc,console…). In real-life, it's hardly useful for game developing. 
 
-
 For example: 
 
-
 In Allocation package, we need to compute the dependencies between resources, si call Dependency package. In computing dependency, we need resource so we call allocation package… This loop is actually fine but its will run forever if there is no saturation point or the end point of the recursion calls. 
 
-
 So in AtomAA, there is a detection of Recursion and cyclic dependency that can break-out early from the infinite loops. Also if Dependency package call, it tell Allocation not to call it again in the amount of time. Allocation then will chose another path of computing by just allocate directly. This not gaurantee to prevent the problem but ease out the percentage you fall into a dead trap. It work pretty much like concurrent contention resolving in by synchronization in Java. 
 
-
 This mean the context of computing is affect the algorithms, lead the algorithm to context-depend. So is it conflict with the definition of algorithm and wrong? Well, in real-life, some algorithms actually work upon a data structure and context, if not to say all of them. The abstraction and agnostic of algorithm is limit but higher than data structure, it just depend in the “context of computing but work in various data structure, even a new one. It's also better than normal datastructure in this “loop situation. You may experience the situation that datastructure implementation may cause infinite loop with them self or others. At least algorithms try to prevent that…
 
 
-
 [WARNING]
 ====
 *Note:* Actually when the situation happen, there is a way to stop the whole!… but not a clean way to set a flag, clear the flag and continue again, because the next time, the progress can not distingish between the normal processing and the invalid one. At least not a simple way without Tranactional Memeory Model.
 ====
 
 
-
 In development mode, with AtomAA , the programmer will be notified and the progress will stop. A monitoring framework can also help. The determistic of the algorithms over arbitrary data (in real-life) is also quite a challange problem. That's also a caveat in AtomAA its self.
 
 
-
 == Implementation details
 
 
@@ -224,12 +191,10 @@ The *[JavaAA]* (Java Atom Algorithms) tags mark what this package support.
 
 
 
-
 === Allocation
 
 solve problems about resources.
 
-
 ....
 Allocate resources efficiently on demand and sastify requirements:
   in an amount of time (interval, arrangement, progess, budget)
@@ -260,21 +225,16 @@ find a division, distribution for equality, find equilibrium between inputs of f
 
 higher wisdoms than equality and difference. Its the progress of making two or more things equal by exchanging one by one (local optimal or greedy). It's also a study of distribution to find equilibrium between inputs of forces. This problem araise a lot in classical game theory and later game developing. 
 
-
 Read: 
 link:http://en.wikipedia.org/wiki/Game_theory[http://en.wikipedia.org/wiki/Game_theory]
 
-
 link:http://en.wikipedia.org/wiki/Solution_concept[http://en.wikipedia.org/wiki/Solution_concept]
 
-
 link:http://en.wikipedia.org/wiki/Nash_equilibrium[http://en.wikipedia.org/wiki/Nash_equilibrium]
 
-
 link:http://en.wikipedia.org/wiki/Ultimatum_game[http://en.wikipedia.org/wiki/Ultimatum_game]
 
 
-
 === Energy :
 
 ....
@@ -290,7 +250,6 @@ more than just physics simulation, its applied physics-math based methods
 
 find a solution that sastify a list of constraints.
 
-
 ....
 Search for sollution in avaiable space (travel)
 Generate a sollution base in template
@@ -305,12 +264,10 @@ various problems related to intervals (values a duration of time).
  Schedule jobs
 
 
-
 === Optimization:
 
 to optimize toward a goal
 
-
 ....
  Maximize - minimize:
  Resolution: Find a solution upon a known solution (aka neirghboor search)
@@ -326,7 +283,6 @@ to optimize toward a goal
 
  solve problems between things relate to other (Very close to abstract aglebra):
 
-
 ....
  Reconfiguration: if one change, others react
  Coupling: link-relink-relax link-remove link between two or a group by cateria (aka clustering)
@@ -336,7 +292,6 @@ to optimize toward a goal
 
 The relationship between things cause complex problems, this package try to solve a subset of problems which is useful in programming and gamedev in general. Relation is very abstract, but some of  “relationship problems are well-defined like:
 
-
 *  the cause of declaration of relationships 
 *  the dependency between two subject
 *  the direction, order of relation or force
@@ -345,7 +300,6 @@ The relationship between things cause complex problems, this package try to solv
 *Dependency*: If one object “declare relationship to another, aka one-direction link:
 *Coupling*: If two objects “declare relationship between each other, aka bi-direction link:
 
-
 *  [Real-life] Imagine the marriage law when two get married :) 
 *  [Computing] The dependency between packages, modules, operations, tasks.
 *  [JavaAA] 
@@ -362,7 +316,6 @@ The relationship between things cause complex problems, this package try to solv
 
 *Reconfiguration*: If two objet “change the relationship and the affections.
 
-
 *  [Real-life] Imagine a devote, and the fate of the property and children
 *  [Computing] Reconfiguration cause computation in the said domain and cause a chains of reaction in the network. The reconfiguration can cause “bigger affection than the first time config, but how to decrease the cost?
 *  [JavaAA] 
@@ -377,7 +330,6 @@ The relationship between things cause complex problems, this package try to solv
 
 *Order*: directions, or the order of travelling when bunch of objects are related.
 
-
 *  [Real-life] I want to travel in a city by roads. I have to know the map.
 *  [Computing] Graph problems and how to change the direction of processing
 *  [JavaAA] 
@@ -391,7 +343,6 @@ The relationship between things cause complex problems, this package try to solv
 
 Study the “number,“amount (aka quantity) of things; summarize and judge (aka quality). Wisdoms about: Measuring, scale, approximation, coloring or the alike.
 
-
 ....
  Budget:
  Audit: (aka Accounting)
@@ -401,16 +352,13 @@ Study the “number,“amount (aka quantity) of things; summarize and judge (aka
 
 This package support the invoke of functions and actions for measurement in single step or a chain of steps. Also it provide the remain of power within a Budget. After serveral of steps, it can invoke audit for examine the progress. For doing this, it has to know detail about Unit by understand Cardinality in the context. 
 
-
 This package depend in Commons Math and JScience for useful functions.
 
 
-
 === Travel:
 
 Study the step by step “move between unit of things. This is a fundamental and essential spirit of algorithms. <<jme3/advanced/atom_framework/atomcore/algorithms#algorimths_for_games,Read back algorithm definition above>>
 
-
 ....
  Search: Study the exploring in space.
  Trace: Study the affection (footprint, operations, cost.. ) the algorithms left each step
@@ -420,28 +368,22 @@ Study the step by step “move between unit of things. This is a fundamental and
 
 Travel depend in relate. It Explores bunch of things that relate to each others in a space (Data space, time space). The process known as Search. Doing Search, it left Traces. Flowing trace in each step, one can see a Track or a Flow of the progress.
 
-
 This package support: datastructure-agnostic search, traces and tracks (beside of those already supported in Java, Guava…)
 
-
 Search:  
 DFS, BFS, Traveler 
 
-
 Trace: 
 Visit, Footprint (mark), Cost
 
-
 Track: 
 ForwardTrack, BackwardTrack, Flow (TotalCostTrack-SingleStepCostTrack), FlowCapacity
 
 
-
 === Generation:
 
  good practises in making new things
 
-
 ....
  Template is the resource of generation
  Production is the progress of creating new things
@@ -449,7 +391,6 @@ ForwardTrack, BackwardTrack, Flow (TotalCostTrack-SingleStepCostTrack), FlowCapa
 
 A collections of wisdoms explain what/why/how to generate new things smart and efficiently.
 
-
 *  [Math] A function from one domain to another domain. 
 **  link:http://en.wikipedia.org/wiki/Function_%28mathematics%29[http://en.wikipedia.org/wiki/Function_%28mathematics%29]
 
@@ -482,17 +423,13 @@ A collections of wisdoms explain what/why/how to generate new things smart and e
 
 Only simple forms. But External libs can be hooked!
 
-
 Usage of interface from sg.atom.world.physics package, should be all in sg.atom.utils only!
 
-
 Lack of unit tests. But in the future
 
-
 Lack of better documentation and education. Here you are, improve it your self.
 
 
-
 == Applications
 
 
@@ -501,61 +438,44 @@ Lack of better documentation and education. Here you are, improve it your self.
 Used in Asset/Task packages
 
 
-
 === Others
 
 This small library can be used in a wide range of applications especially games and simulations. 
 
 
-
 [TIP]
 ====
 Don't limit your imagination
 ====
 
 
-
 link:http://en.wikipedia.org/wiki/Algorithmic_game_theory[http://en.wikipedia.org/wiki/Algorithmic_game_theory]
 
-
 link:http://en.wikipedia.org/wiki/LP-type_problem[http://en.wikipedia.org/wiki/LP-type_problem]
 
-
 link:http://en.wikipedia.org/wiki/Multi-agent_systems[http://en.wikipedia.org/wiki/Multi-agent_systems]
 
-
 link:http://en.wikipedia.org/wiki/Auction_Theory[http://en.wikipedia.org/wiki/Auction_Theory]
 
 
-
 == Alternatives
 
 For scientific wisdom in Java:
 
-
 link:http://jscience.org/[http://jscience.org/]
 
-
 For full-ledged multi objective meta heristic algorithms, try:
 
-
 link:http://www.joptimizer.com[http://www.joptimizer.com]
 
-
 link:http://opt4j.sourceforge.net/[http://opt4j.sourceforge.net/]
 
-
 link:http://jmetal.sourceforge.net/[http://jmetal.sourceforge.net/]
 
-
 Constraint programming and solver:
 
-
 Choco
 
-
 JACK
 
-
 JaCop
-

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

@@ -16,7 +16,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Bean is nothing new in Java, actually is … (a long story) plain old :)
 What Atom'sBeans try to do is similar to EJB without its complexility. Because we have to use it in real-time enviroment, we have to make its fast and have high through put performance.
 
-
 *  Bean binding : reactive binding with generated functions like 2-way mapping below
 *  Bean mapping / morphing : bytecode generation (or reflection) for mapping and interpolating, remote syncing 
 *  Bean modelling : code generation directly from java-java, java-xml, java-html
@@ -26,7 +25,6 @@ What Atom'sBeans try to do is similar to EJB without its complexility. Because w
 The most different between this bean frameworks and others is it stand in J2SE specification and make bean related job really easy as it should! See to believe.
 
 
-
 === Components
 
 

+ 0 - 7
src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/config.adoc

@@ -13,12 +13,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Atom Configurations provide facilities for do configurations and profiles for enviroments, Games of course instead of just normal Java applications.
 
 
-
 === The past
 
 First let's take a look into the past of years and see how Java developers do configurations for their applications: 
 
-
 *  The config files for application in desktop enviroments may loaded from user's home, or the app's folder. The config files can be plain text, XML, JSON, binary or something else.
 *  The config can also be received from external sources like from network services, database. The protocol for them can be object base (POJO), relational structure based (resultset) or else …
 *  The config can also be intelligently procedure based in the stats and infos of the device or deployed enviroment…
@@ -26,22 +24,17 @@ First let's take a look into the past of years and see how Java developers do co
 So there is not a single way to do configurations. Is there an unified way now?
 The answer is still NO. Configurations is the aspect of gamedev SHOULD be kept flexible the most. Tricks and smart stuffs can involve in this progress a lot: optimizations, per device &amp; per user configuration, policies… In another hand, it keep you busy with tricky parts and complexibilities of underlying datastructure and extra progress.
 
-
 Some other libraries and game engine tend to hide the detail from developer and provide a premade solutions for configurations in supported enviroment. 
 
-
 Ex: LibGDX with Prefs, Unity with Metadata, XNA with Properties…
 
-
 The more configurations apart from Data and Code, the more it getting complex. In the other hand, getting closer, it mixed and tangled with Data and Code. So how can we make it the right way?
 
 
-
 === The solutions
 
 The Solution is actually very practical as it should. It's the corporation of existed techniques but with a fine-tuned and industrial approaches. The “Fine tuning are predefined or customized by the user them self (if they know how to do it). Isn't it what is configurations is all about. Think about a ridiculous control panel which have only one button, and the other complex and also not very useful with 300 of them… This framework is your control panel, tailored by you! What it help:
 
-
 .  There are “fine-tuned configurations for enviroments , devices, users, or aspects… and custom configurations for arbitrary scope and context.
 .  Abstract out the data structure of configurations and its lower level of persist, load and communications.
 .  Revolution in the publish, deloy enviroment and progress: to make the configuration actually is data (and code…), not something else.

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

@@ -12,26 +12,21 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 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! 
 
 
-
 === Why 6?
 
 Game programmer usually stick with 3 steps execution
 
-
 .  init 
 .  update
 .  destroy
 
 Instead of that, Atom use 6 steps execution cycle:
 
-
 .  init
 .  start
 .  load
@@ -41,29 +36,22 @@ Instead of that, Atom use 6 steps execution cycle:
 
 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]
 
-
 link:http://en.wikipedia.org/wiki/OSGi#Life-cycle[http://en.wikipedia.org/wiki/OSGi#Life-cycle]
 
-
 link:http://www.tutorialspoint.com/spring/spring_bean_life_cycle.htm[http://www.tutorialspoint.com/spring/spring_bean_life_cycle.htm]
 
-
 The reason of these 6 step routine compare to 2,3,4,5.. or any other division is to support lazy loading, heavy task, gabage collection wise, much more…
 
-
 So we usually have these 3 main methods:
 
-
 ....
 init , start , end
 ....
 
 For a real-time game, we need 2 more:
 
-
 ....
 load, update
  
@@ -71,52 +59,39 @@ 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 !
 
-
 Anyway this is a common cycle and compromise between ICycle who join the Atom conversations; that's hook in methods (classic style isn't it?). Beside of that, you can define your own routines through safe tasks and channels which provided by AtomMain. Though this tunnels, all your operations are guarantee to be not conflict in concurrent term with any other jobs of Managers, actors or helpers. So the Data is for you until you end the tasks (or be shut by forced because timeout for ex)!!
 
 
-
 === Pull or push?
 
 As said in the analysis about JME3's patterns, especially rendering and update loop, it's pull and push at the same time. Confused? Yes it's… Why is so confused?
 
-
 Java developers are “toooo familiar with MVC architecture that bring to us by Swing and all classic sun solutions. That's why we find them in every programming books and every beginner's articles, especially if you develops game in desktop, (obviously in swing also). OpenGL and LWJGL also start as window based solution. So that we get “used to it… Latter, a lot of web frameworks also make tanged mess of push &amp; pull concepts?
 
-
 Swing-MVC concepts are embeded in a event-driven enviroment… and it's actually pull.
 
-
 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. 
 
-
 But to do this, we have to not depend in the update() and render() methods to get to total freedom. 
 
 
-
 ==== Concurrent / Parallel world
 
 Welcome to the parallel world which some time the well-defined cycle not even exist.
 
-
 But the routine or the flow does exist indeed!
 
-
 Just look at how your “data or “signal actually run through your systems, though “node and “stages as a network of roads &amp; cars. This actually a well-study area known as data flow analysis. In a perspective, data seem to be “pushed from sources to targets. Some may also view its as data are “requested by some nodes and “pulled by those nodes.
 
-
 link:https://github.com/Netflix/RxJava/wiki[https://github.com/Netflix/RxJava/wiki]
 
 
-
 ==== What is the new routines options?
 
 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 
 .  Non-cycle
@@ -124,25 +99,21 @@ Even if “Cycle- which we used to known is just a conceptual view of points, my
 … 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.
 
 
-
 ===== 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. 
 
 
-
 ===== Push cycle
 
 As in functional reactive programming and flow based programming, functions (small piece of jobs) are flow with their data. A flow is not a well defined cycle but a routine and can be monitored.
 
 
-
 ===== Non-cycle
 
 A serial of Tasks can also form atribinary routines ( non-cycle) and be coordinated together via Data they exchange. 
 
 
-
 [TIP]
 ====
 Goto AtomPar for more concurrent/ paralell concepts and advices
@@ -150,7 +121,6 @@ Goto AtomPar for more concurrent/ paralell concepts and advices
 
 
 
-
 == Customable cycles
 
 
@@ -158,38 +128,29 @@ Goto AtomPar for more concurrent/ paralell concepts and advices
 
 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).
 
-
 This freedom of doing things (in parallel if you want) is thanks to lock-free concurrent algorimths and data structure that Atom use. In other hand, the synchonizing problem is under research!
 
-
 Read: <<jme3/advanced/atom_framework/atomcore/concurrent#, AtomPar>>
 
 
-
 ==== Customable (rendering) bucket
 
 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. 
 
-
 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. 
 
-
 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.
 
 
-
 [TIP]
 ====
 Read more about AtomEx for Cloud scale and AtomDust of Mobile scale.
@@ -197,7 +158,6 @@ Read more about AtomEx for Cloud scale and AtomDust of Mobile scale.
 
 
 
-
 == Technical reviews
 
 
@@ -208,9 +168,7 @@ Read more about AtomEx for Cloud scale and AtomDust of Mobile scale.
 
 Ring buffer is fast way to make concurrent real time data streaming…
 
-
 link:http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html[http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html]
 
 
-
 ==== Is there a real cycle? or just a lot of streams

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

@@ -13,26 +13,19 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 *Real Object Oriented Programming Eco system.*
 
 
-
 === Innovitation
 
 *OOP is not Class-based!*
 
-
 Read: link:http://qi4j.org/[http://qi4j.org/]
 
-
 *Entity System is a good choice to start your game!*
 
-
 Read: link:http://hub.jmonkeyengine.org/forum/topic/entity-system-topic-united/[http://hub.jmonkeyengine.org/forum/topic/entity-system-topic-united/]
 
-
 link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:contributions:entitysystem:detailed[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:contributions:entitysystem:detailed]
 
-
-iframe:https://docs.google.com/presentation/d/1R5ovJi67i9ml6zAcmQPlSe9ZNem1Fuo14hoJZi3iRaY/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
-
+iframe::https://docs.google.com/presentation/d/1R5ovJi67i9ml6zAcmQPlSe9ZNem1Fuo14hoJZi3iRaY/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
 
 
 

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

@@ -13,26 +13,21 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 *Atom Core Network framework is for networked game developing in Java. Powered by JME3, SpiderMonkey, MirrorMonkey and Netty.*
 
 
-
 === Introduction
 
 To make developing networked game (multiplayer, social, even MMO..) in JME3 much more easier! With Java, with tools, with monitors!
 
-
 This module depends in JME3, SpiderMonkey, MirrorMonkey and Netty. It has all the features that libries it depends on have with ultimate extra power!!
 
-
 You can include Optional modules like Kryo (Kryonet), ProtocolBuffer, Zay-ES which is official extensions for various of usecaces.
 
 
-
 === Features
 
 
 === Concepts & Papers
 
-iframe:https://docs.google.com/presentation/d/1YxUR8fCc115rkokROZb3GVq1J1vRGnGSlwlu6Q_SB48/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
-
+iframe::https://docs.google.com/presentation/d/1YxUR8fCc115rkokROZb3GVq1J1vRGnGSlwlu6Q_SB48/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
 
 
 *  Annotations: @Data, @Event, @Sync
@@ -102,7 +97,6 @@ class Server implement NetworkService{
 Some examples 
 
 
-
 == Documentation
 
 
@@ -110,11 +104,9 @@ Some examples
 
 link:http://gafferongames.com/networking-for-game-programmers/[http://gafferongames.com/networking-for-game-programmers/]
 
-
 link:https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking[https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking]
 
 
-
 === Programming
 
 

+ 0 - 9
src/docs/asciidoc/jme3/advanced/atom_framework/atomcore/scenegraph.adoc

@@ -12,27 +12,18 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Scenegraph
 
-
 SceneGraphUtils
 
-
 Spatial Scheduler
 
-
 Spatial Relation
 
-
 Spatial Proxy
 
-
 Spatial hash
 
-
 Spatial cache
 
-
 TransformUtils
 
-
 TransformAligner
-

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

@@ -13,14 +13,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Editor for 2D game based in JME3, Atom, Atom2D technologies.
 
 
-
-==== Inspired by:
+=== Inspired by:
 
 Unity2D
 
-
 Sprite
 
-
 Web game editor : 
-

+ 0 - 27
src/docs/asciidoc/jme3/advanced/atom_framework/atomex.adoc

@@ -14,7 +14,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 *Atom Ex* framework helps you biggest steps to make your applications scale to web and distributed computing!
 
 
-
 [TIP]
 ====
 
@@ -23,11 +22,9 @@ It's one of my long-term research, result of more than 6 years of research and 2
 
 
 
-
 === Idea & Buzz
 
 *Bigger, more powerful with ease*
-
 [quote]
 ____
 From Data Central and Web's battle field, end up in game developing, I've dreamt about games and applications that scale its self in a snap. At first, something like a render-farm to accelerate 3D rendering pipeline or baking lightmap, massive level entities computing to save 3D artist lives, then may be something like 3D collaborative editing enviroment…
@@ -35,30 +32,24 @@ ____
 
 Initial Ideas:
 
-
 *  Get to the cloud with ease, Spring-like but not just Spring
 *  Framework for games and apps(3D) 
 *  Nextgen techs
 
 But technically, is something like this possible at all????
 
-
 *Yes*, with helps of creative design of tools and frameworks, workflows and lastest technologies!!!
 
-
 link:http://en.wikipedia.org/wiki/Model-driven_architecture[http://en.wikipedia.org/wiki/Model-driven_architecture]
 
-
 link:http://en.wikipedia.org/wiki/Data-driven_architecture[http://en.wikipedia.org/wiki/Data-driven_architecture]
 
-
 .  The first thing that most important to make this idea possible: *Everything are data*, including source code. 
 .  How can it be? Yes, it can if source code are very *generative* , means it can be generated in this way or others. In fact, *generative* is also a key. 
 .  Every aspect of this software development framework involving different kinds of auto-generating. Once again, *automatic* instead of manual is a key
 .  Keep in mind *this is not magic but the lastest technologies* , means it's new, and some people also can not believe it real :p That's easy to understand. 
 
 In fact, current implementation of AtomEx only cover a very small part of the automatic distributed game development but its potential is large. 
-
 [quote]
 ____
 As examples for distributed computing, I made a 3d rendering farm and a lightmap baker for demostration that show well the power of its theory and also helpful but not show much the automatic aspect. [quote]
@@ -75,14 +66,11 @@ Go try JMERenderFarmLite link:http://github.com/sgmedia/jme-renderfarm-lite[http
 ====
 
 
-
 The most attractive and impressive part is this is not a “config hell framework, somehow Spring-like mechaism, but Convention over configuration…
 
-
 [to be continued]
 
 
-
 === Features
 
 
@@ -91,7 +79,6 @@ The most attractive and impressive part is this is not a “config hell framewor
 Here are its architecture and components.
 Atom Ex Core highlights:
 
-
 *  Beans: Java at its finesse
 *  Generative | Automative as its insistent characteristic
 *  Dependency | Component injection: For modular enterprise software
@@ -103,14 +90,12 @@ Atom Ex Core highlights:
 
 Atom DB : Generate all DAO, configs for persitent. One code, run anywhere.
 
-
 *  Bridge to ORMs : Cayneene , Hibernate
 *  Bridge to NoSQL : Casabranda , Neo4j
 *  Leverage all with “useful EJB3,Spring ideas and model driven architecture
 
 Atom WebScale : play with only the best in Web world, generate game's website front|admin in few clicks
 
-
 *  Bridge to Wicket
 *  Bridge to Grails
 *  Bridge to Play
@@ -119,21 +104,18 @@ Atom WebScale : play with only the best in Web world, generate game's website fr
 
 Atom Cloud : Modulize the game | application project and deploy structure
 
-
 *  Bridge to Osgi
 *  Ultimate Maven Gradle automatic deployment
 *  Toward Collabrative enviroment
 
 Atom Storm : Distributed computing at its finesse
 
-
 *  Storm: as its best corporator
 *  Hadoop and folks as the runner-up
 *  Come with ready to use tools help 3D rendering and game creating pipeline
 
 Atom Universal : Bring it all to common open infrastructure
 
-
 *  Full distributed packages of the Atom framework online
 *  Dynamic flexiable linkage that can suite almost teamwork game developing projects
 *  Simple but powerful Pipeline | Workflow designer
@@ -143,7 +125,6 @@ Atom Universal : Bring it all to common open infrastructure
 
 Atom Star Dust:
 
-
 *  Smallscale version of those mentioned components, toward mobile devices and web-base, HTML5 games for ex.
 *  Every where, small tiny, fastest, embed inside others, stick together well. 
 *  This is specific component of Atom framework really show up as “Atom
@@ -153,20 +134,15 @@ Atom Star Dust:
 
 Without trying to bloat, this is a most attractive point of the whole framework - Atom. 
 
-
 You have open computing power, open infrastructure, open storage and everything under your hand and work as you wish!
 
-
 Toward “cloud for game development and gaming, even better than that! 
 
-
 Metaphorically, it's the sweestest result you can milk from the open source cows :p (Sorry if the idiom offense anyone) 
 
-
 Yeah, money somehow..? But Open spirit in its heart! 
 
 
-
 === Other open-source dependencies
 
 
@@ -176,9 +152,6 @@ Hundred of opensource projects…Nail it
 ====
 
 
-
 <<jme3/atomixtuts#, Atomix Series of game making>>
 
-
 GOTO <<jme3/advanced/atom_framework#,This Part of Atom framework >>
-

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

@@ -13,7 +13,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 The future assets pipeline for JME3 games!
 
 
-
 === Features
 
 *  Real pipeline
@@ -24,17 +23,13 @@ The future assets pipeline for JME3 games!
 
 Pipeline is a common term in computing and also asset making. From sattelite view, pipeline is progresses between input and output.
 
-
 image:http://storm.incubator.apache.org/images/topology.png[400px,with="",height=""]
 
-
 Here in game we talking about Assets aspect, mostly! 
 
-
 In real world, converting-processing data and assets also require amount of times, efforts and cause headaches, almost comparable to making data and assets.
 
 
-
 [TIP]
 ====
 Some of the problems and solutions here can also be applied to other situation and usecaces
@@ -42,12 +37,10 @@ Some of the problems and solutions here can also be applied to other situation a
 
 
 
-
 ==== Converting
 
 Converting between things is a hard problem:
 
-
 *  Semantic: “things are different “in contexts. 
 *  Incompatible: Converting almost one-direction only. Converter programs sometime not reliable and not support your data
 *  Hidden: Some format is unknown. Some require commercial and $$$
@@ -58,7 +51,6 @@ Converting between things is a hard problem:
 
 Processing again is require a lot power:
 
-
 *  Time: Did you ever generate lightmap or PVS? - It may take a long long wait and easy to fail.
 *  Power and units: Did you ever render a movie? - It may require a render farm.
 *  Connections: Is there anything has to transfer between units? - It may delay the whole progress.
@@ -69,37 +61,30 @@ Processing again is require a lot power:
 AtomExAsset try to leverage pipelines from ideas inspired:
 
 
-
 ===== From Preon
 
 Bit stream language
 
 
-
 ===== From DataTurbine
 
 Real-time data over network
 
 
-
 ===== From Distributed computing
 
 link:http://storm.incubator.apache.org/[http://storm.incubator.apache.org/] -
 
 
-
 ===== From Other CCDs and Engines
 
 3DSMax and Autodesk programs: Render farm integrated.
 
-
 Blender: DNA structure
 
-
 Unity: Metadata and SVN integrated
 
 
-
 === Multi sources & Multi targets
 
 
@@ -108,8 +93,7 @@ Unity: Metadata and SVN integrated
 
 === Slides
 
-iframe:https://docs.google.com/presentation/d/1gvh00FBoSYgvryw7Czbcjxrt5TmlK12P14QRdjKo4NA/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
-
+iframe::https://docs.google.com/presentation/d/1gvh00FBoSYgvryw7Czbcjxrt5TmlK12P14QRdjKo4NA/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
 
 
 
@@ -126,11 +110,9 @@ iframe:https://docs.google.com/presentation/d/1gvh00FBoSYgvryw7Czbcjxrt5TmlK12P1
 
 “Unified Format (use one format to encoded, decoded all kind of assets) is actually a nice idea but it's not real useful in real life situtations (or not even possible?)
 
-
 AtomExAsset in other hand has unified pipeline via: Codecs, Flows, EntryPoints. Its “unified data are actually a temporial data which has meta-data embeded.
 
 
-
 ==== Temporial scene data
 
 
@@ -138,39 +120,30 @@ AtomExAsset in other hand has unified pipeline via: Codecs, Flows, EntryPoints.
 
 Models
 
-
 Textures
 
-
 Animations
 
-
 Basic usages
 
 
-
 ==== EntryPoints
 
 EntryPoint is a higher abstract level of AssetKey where we accept the fact that Assets is not actually separated but reference in nested way, via each other and form a topology. We are talking about batch solutions which are very popular in real-life gamedev, and a way to integrate the flow of assets to the normal pipeline…
 
-
 A lot of AAA games of big company relied on packed and streaming assets (online, from disks..). This assets usually get loaded by chunks instead of a whole at a time, make it possible to process as fast and smooth as possible.
 
-
 You can see one simple example of the situation when:
 
-
 *  We reference to a Texture assetkey of a single Tile: assetManager.load(“tile1.png);
 *  We later make a texture atlas of Tiles: tiles.png
 *  How can we reference to the original tile the old way, ignore the fact that it got batched!?
 
 Texture atlas for ex and all kind of batching assets (pack, atlas, uber …) are techniques to optimize/boost  load time and real-time performance. Obfucasion, encoding add an extra layer technique that hide the real data from the back-end user; who shouldn't touch that data and modify them.
 
-
 Also the always processing nature of the the asset in Atom pipeline require “dynamic entry point which AssetKey's abstraction is not enough. EntryPoint and Flow are two new concept in the playground that you should take time to get familiar with.
 
 
-
 ==== Flows
 
 
@@ -178,21 +151,18 @@ Also the always processing nature of the the asset in Atom pipeline require “d
 
 .j3a (see, it looks like j3o) stand for “Alternate Automatic Assets is not actually format, but a meta-data or entry point in the asset system. One can use .j3a as entry point to load what ever he want with just the name, for ex:
 
-
 ....
  assetManager.load("monkey.j3o")
 ....
 
 is equal with:
 
-
 ....
  assetManager.load("monkey.j3a")
 ....
 
 but the later has extra effects:
 
-
 *  It put a update watcher over the entry point 
 **  the file in filesystem
 **  if you has config for that entry to “link to another remote point (git, remote asset central), it actually manage the linkage for you
@@ -210,24 +180,20 @@ but the later has extra effects:
 You can see the Atom's asset pipeline as a replacement of the official one. In fact, you can also let them work together seamlessly because Atom pipeline just bypass JME3's assetManager in a few special case.
 
 
-
 [WARNING]
 ====
 Remember Atom's asset pipeline is better for “not-well formed assets. In normal situation, you can use JME3's asset without a doubt!
 ====
 
 
-
 Way1 - Atom over JME3: Put assetManager under an entry point, let call it “SEP - StaticEntryPoint.
 
-
 ....
  assetManager.load("SEP\")
 ....
 
 Way2 - Atom with JME#:
 
-
 ....
  assetManager.load(".j3a")
 ....
@@ -240,23 +206,17 @@ Way2 - Atom with JME#:
 
 Models
 
-
 Textures
 
-
 Animations
 
-
 Basic usage
 
-
 Preon reference:
 
-
 link:http://preon.codehaus.org/preon-binding/apidocs/1.1-SNAPSHOT/nl/flotsam/preon/codec/package-summary.html[http://preon.codehaus.org/preon-binding/apidocs/1.1-SNAPSHOT/nl/flotsam/preon/codec/package-summary.html]
 
 
-
 === Manage dataflow & turbine
 
 
@@ -264,12 +224,8 @@ link:http://preon.codehaus.org/preon-binding/apidocs/1.1-SNAPSHOT/nl/flotsam/pre
 
 AtomExAssets ultimately use Building tools and Framework to help Java developer doing Game assets!
 
-
 Beside of Defacto of the building tools: Ant &amp; Maven, the new rising star Gradle. AtomExAssets also use the powerful framework:
 
-
 link:http://www.go.cd/[http://www.go.cd/]
 
-
 image:http://www.go.cd/images/home-image1.png[home-image1.png,with="",height=""]
-

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

@@ -13,7 +13,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 +++<abbr title="Application Programming Interface">API</abbr>+++ and ultilities for various scripting language upon Atom framework.
 
 
-
 === Initial Idea
 
 
@@ -22,14 +21,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Java has its quirk, the others JVM language try to fullfill it!
 
 
-
 ==== Scripting - Polygon expanding?
 
 
 ==== 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="600px", alt="", scroll="true",border="true",align="false"]
-
+iframe::https://docs.google.com/presentation/d/1Kc1ehI1qLbtEGe-6-q8NikY7Q77A6jvozDaX94BqX0g/embed?start=false&loop=false&delayms=3000[width="100%", height="600px", alt="", scroll="true",border="true",align="false"]
 
 
 
@@ -38,28 +35,21 @@ iframe:https://docs.google.com/presentation/d/1Kc1ehI1qLbtEGe-6-q8NikY7Q77A6jvoz
 Leverage Java syntax and capacities through scripting (or polygot expanding) with below languages:
 
 
-
 ==== Features:
 
 Groovy
 
-
 Scala
 
-
 JLua
 
-
 Jython
 
-
 JavaScript
 
-
 Clojure
 
 
-
 === TECH PROBS
 
 
@@ -74,17 +64,14 @@ Clojure
 Slide
 
 
-
 == IMPLEMENTATION
 
 Slide
 
 
-
 == Scripting tutorials
 
 <<jme3/scripting#,Scripting tutorial>>
 
 
-
 == DOCUMENTATION

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

@@ -8,4 +8,3 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 AtomSDK
-

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

@@ -13,7 +13,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 This is an introduction of Character customization tool of Atom framework
 
 
-
 [TIP]
 ====
 Go to <<jme3/advanced/atom_framework/quickstart#,quickstart>> if you on a rush!
@@ -21,7 +20,6 @@ Go to <<jme3/advanced/atom_framework/quickstart#,quickstart>> if you on a rush!
 
 
 
-
 === Ideas & Features
 
 
@@ -29,17 +27,14 @@ Go to <<jme3/advanced/atom_framework/quickstart#,quickstart>> if you on a rush!
 
 The initial idea of Character customization is: We (human) are soooo *similiar*!! 
 
-
 The second idea: *resuable* and *composable*!
 
-
 .  Cloths, skins, 3dmodels, animation.. are components of a whole, which made up character
 .  The same ideas with component oriented architecture
 
 So to reduce a very big workload of data and assets need for a game with vast data of character (football players, etc…) More over we can support and encourage gamer to “build their own character! This is how we handle the situations, similiar scenario can happen in a MMOs.
 
 
-
 ==== Features
 
 *  Customize parts of characters (body, face, weapon) in gender | race (male - female, human - animal…), various height, weight!
@@ -55,7 +50,6 @@ Go to alternatives and researches if you want to go further than Atom!
 
 
 
-
 [TIP]
 ====
 Try some example in Football game's character cusomization <<jme3/atomixtuts/kickgame/cc#,cc>>
@@ -63,7 +57,6 @@ Try some example in Football game's character cusomization <<jme3/atomixtuts/kic
 
 
 
-
 == AtomFacial framework - First look
 
 
@@ -81,52 +74,38 @@ Try some example in Football game's character cusomization <<jme3/atomixtuts/kic
 image:jme3/advanced/atom_framework/youtube_fcf6grenolg[youtube_fcf6grenolg,with="",height=""]
 
 
-
 === Techniques
 
 *1) Blend shape* : 
 
-
 *2) Bone* : 
 
-
 *3) Free form deformation*: 
 
 
-
 === Problems
 
 *1) Blend shape* : 
 
-
 I saw that going to be added into the core soon. So exciting, that will help a tons, as soon as finish, I will make a patch to help import blend shape from blender too. One thing I still have to consider is: Can we make a type of Mesh that save a whole topology from Blender or other CAD and then become the base mesh for futher manipulate?
 
-
 *2) Bone* : 
 
-
 I saw the current behavior of Bone, SkeletonControl are quite limited. I remember once @nehon explain that we don’t save the Length of the bone, but the trans/rot/scale just like a mat4… In fact, we can save more information in a Bone, and it will help tons when it come to a situation that someone want to manipulate the bone his self.
 
-
 _setUserControl_ didn’t sastify me cause I force me to patch the whole animation system just because I want to scale a bone up and down (ex: bigger nose for a character), and sync that with the existed animation. You can say it’s just my very own problem but …
 
-
 *3) Free form deformation*: 
 
-
 For the need of cloth customization, I made my self a quick FFD system, in fact, it works extactly like a set of bones still have lengths and envelops on them. But in the end, once again I have to hack into the Mesh class and other things, just because a lot of private and final methods… It’s kind of sad that it should not be that hard for the engine users to add more features to the engine if the user want to.
 
-
 At the end, I just want what I want, that mean I just want things work if it’s really easy, silly me. So is there another way around to make those 2 simple things?
 
-
 1) Scale/Translate/Rotate a bonebut preseved the current animation. ⇒ If yes, go for Characer custumization and facial…
 
-
 2) The mesh class is the center of the system, we should provide a way for people to build in from scratch or preseved topology. May be another type of Mesh, like HalfEdge mesh. If the answer it’s No need for now just consider it once in the future (We are not just making game for the moment)!
 
 
-
 === Architecture
 
 
@@ -137,11 +116,9 @@ At the end, I just want what I want, that mean I just want things work if it’s
 
 Go Quick 
 
-
 Go in depth
 
 
-
 === Basic video tutorials
 
 
@@ -161,11 +138,9 @@ Go in depth
 
 This is a short list of Researches &amp; Papers
 
-
 I have a Character customization system which i've plan to be quite complete. I reviewed a fews character system including:
 link:http://www.youtube.com/watch?v=RO8GIoRLGa0[http://www.youtube.com/watch?v=RO8GIoRLGa0]
 
-
 *  Perfect World
 *  APB: Reloaded
 *  Aion
@@ -174,7 +149,6 @@ link:http://www.youtube.com/watch?v=RO8GIoRLGa0[http://www.youtube.com/watch?v=R
 
 Some technical articles:
 
-
 * link:http://www.heroengine.com/heroengine/dynamic-character-systems/[http://www.heroengine.com/heroengine/dynamic-character-systems/]
 * link:http://hewiki.heroengine.com/wiki/Character_Design_and_Development[http://hewiki.heroengine.com/wiki/Character_Design_and_Development]
 * link:http://anticto.com/[http://anticto.com/]

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

@@ -12,42 +12,37 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Geometric generator, editor and urban buildings, city simulation. All in one
 
-
 Powered by AtomCore, AtomAI, TopoMesh and JME3.
 
 
-
-==== Inspired by
+=== Inspired by
 
 CityEngine
 
-
 CityGen
 
-
 Other CCD
 
 
-
-=== Features
+==== Features
 
 
-==== Shape grammar
+=== Shape grammar
 
 
-==== Simulation
+=== Simulation
 
 
-==== Optimization
+=== Optimization
 
 
 == First look
 
 
-=== Generation
+==== Generation
 
 
-=== Simulation
+==== Simulation
 
 
 == Documentation

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

@@ -12,103 +12,78 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Code generator for various - cross platform programming languages and paradims. All in one!
 
-
 Powered by AtomCore and JME3.
 
 
-
-==== Inspired by
+=== Inspired by
 
 ECore
 
-
 UML
 
-
 MetaWidget
 
-
 Other game engines and editor: UDK, Unity, Blender, GameMaker…
 
-
 Other node base editor: 
 
-
 Web world: 
 
 
-
-=== Features
+==== Features
 
 Node &amp; Flow &amp; Graph base
 
-
 Model base
 
-
 Scope &amp; Instruction &amp; Control base
 
 
+==== Comparasion
 
-=== Comparasion
 
-
-==== VS MetaWidget OIM
+=== VS MetaWidget OIM
 
 link:http://metawidget.org/[http://metawidget.org/]
 
-
 is for generating UI from objects. 
 
-
 *CodeGen* is for generating data (objects) from (data) objects.
 
 
-
-==== VS EMF
+=== VS EMF
 
 link:https://www.eclipse.org/modeling/emf/[https://www.eclipse.org/modeling/emf/]
 
-
 link:http://www.eclipse.org/ecoretools/[http://www.eclipse.org/ecoretools/]
 
-
 is for model based generation.
 
-
 *CodeGen* works upon EMF and also support others: flow base - scope base paradigm.
 
-
 CodeGen tools toward Netbean instead of Eclipse to suite with JME3's SDK. Also CodeGen toward Games, not general applications!
 
 
-
-==== VS Morph/ BeanMapping / ORM
+=== VS Morph/ BeanMapping / ORM
 
 Work in higher level than those.
 
-
 That's said!
 
-
 *CodeGen* work in higher level, solve other problems and depends on MetaWidget, EMF, Morph, BeanMapping and ORM.
 
 
-
 == First look
 
 
-=== Generation
+==== Generation
 
 link:http://en.wikipedia.org/wiki/Code_generation_%28compiler%29[http://en.wikipedia.org/wiki/Code_generation_%28compiler%29]
 
-
 Atom support code generation from multiple sources and to various targets to help speed up and unite production pipeline. CodeGen - Ultimate tools for code genration corporate with AtomExAsset - Ultimate tools for game assets management is 2 facilities in charge for the job.
 
-
 Sources
 
-
 *  UML
 *  ECore
 *  Java code or Java classes with annotations
@@ -117,7 +92,6 @@ Sources
 
 Targets
 
-
 *  Other Model format - via ECore, UML
 *  Groovy or Java - via ECore, UML, ANTLR
 *  Java bytecode - via instrument and transformation ASM
@@ -126,21 +100,19 @@ Targets
 *  Assetpack and other kind of assets - via processing pipeline
 
 
-=== Simulation
+==== Simulation
 
 
 == 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]
 
-
 link:http://metawidget.sourceforge.net/elevator.php[http://metawidget.sourceforge.net/elevator.php]
 
 
-
 [TIP]
 ====
 MORAL: Object has “similar semantic with its UI. A thing has conceptal similarties with its representation, if there is a projection from it to the representation.
@@ -148,13 +120,11 @@ MORAL: Object has “similar semantic with its UI. A thing has conceptal similar
 
 
 
-
-=== EMF Architecture
+==== EMF Architecture
 
 link:http://wiki.eclipse.org/index.php/EMF/FAQ[http://wiki.eclipse.org/index.php/EMF/FAQ]
 
 
-
 [TIP]
 ====
 MORAL: 
@@ -162,15 +132,12 @@ MORAL:
 
 
 
-
-=== CodeGen Architecture
+==== CodeGen Architecture
 
 The initial idea of CodeGen is “there is similarity between two, there is a transform available, learnt from above.
 
-
 Also take a look at wisdoms and <<jme3/advanced/atom_framework/atomcore/algorithms#,Algorithms>> which AtomCore sketchs for Generation:
 
-
 *  [Math] A function from one set to another set.
 *  [Physics] Energy from one form to another.
 *  [Language] Translate sematic from one to another language need a dictionary.
@@ -180,25 +147,21 @@ Also take a look at wisdoms and <<jme3/advanced/atom_framework/atomcore/algorith
 *  [New techs &amp; trends] Topology and well defined network actually a virtue. 
 
 
-=== Layouts
+==== Layouts
 
 GraphLayout
 
 
-
-=== Builders
+==== Builders
 
 BlockBuilder
 
 
-
-=== Blocks
+==== Blocks
 
 CodeBlock
 
-
 PlaceHolderBlock
 
 
-
 == Documentation

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

@@ -13,8 +13,7 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Comparisons of general Java 3D which not tied to games and simulation
 
 
-
-==== JME3
+=== JME3
 [cols="3", options="header"]
 |===
 
@@ -37,7 +36,7 @@ Comparisons of general Java 3D which not tied to games and simulation
 |===
 
 
-==== JScience
+=== JScience
 [cols="3", options="header"]
 |===
 
@@ -60,7 +59,7 @@ Comparisons of general Java 3D which not tied to games and simulation
 |===
 
 
-==== Plotemy
+=== Plotemy
 [cols="3", options="header"]
 |===
 
@@ -83,7 +82,7 @@ Comparisons of general Java 3D which not tied to games and simulation
 |===
 
 
-==== Java3D
+=== Java3D
 [cols="3", options="header"]
 |===
 
@@ -111,14 +110,12 @@ 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.
 
 
-
-==== LibGDX
+=== LibGDX
 [cols="3", options="header"]
 |===
 
@@ -141,7 +138,7 @@ Some of them are free and open sourced but limited in features compared to JME3
 |===
 
 
-==== Threerings
+=== Threerings
 [cols="3", options="header"]
 |===
 
@@ -164,10 +161,9 @@ Some of them are free and open sourced but limited in features compared to JME3
 |===
 
 
-==== Alice
+=== Alice
 
 Alice 4 is not open sourced yet
-
 [cols="3", options="header"]
 |===
 
@@ -190,13 +186,12 @@ Alice 4 is not open sourced yet
 |===
 
 
-=== Others
+==== Others
 
 Some of them are free for non-commercial usages. But they're not opensourced and also just a “game engine with a lot of limitation because of this closed model. Other technologies are slowly get into their supports (and even their mind set). In my POV, those limitation's not acceptable for a rapid changing world like we living in.
 
 
-
-==== Atom vs Unity
+=== Atom vs Unity
 [cols="3", options="header"]
 |===
 
@@ -219,7 +214,7 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 |===
 
 
-==== Atom vs UDK
+=== Atom vs UDK
 [cols="3", options="header"]
 |===
 
@@ -242,7 +237,7 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 |===
 
 
-==== Atom vs CryEngine
+=== Atom vs CryEngine
 [cols="3", options="header"]
 |===
 
@@ -265,7 +260,7 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 |===
 
 
-==== Atom vs HeroEngine
+=== Atom vs HeroEngine
 [cols="3", options="header"]
 |===
 
@@ -288,7 +283,6 @@ Some of them are free for non-commercial usages. But they're not opensourced and
 |===
 
 
-=== Conclusion
+==== Conclusion
 
 Atom and JME3 are young but the vision is clear. We want to build next gen game engine for every one with the lastest technologies!
-

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

@@ -13,21 +13,17 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 This is the repository resulted of the design phase of Atom framework over years.
 
 
-
 === Motivation
 
 It born to helps JME3 focus in *game/simulation development*, push futher in lastest/future Java technologies toward to enterpise/AAA game dev as its final goal, but compromise/ compatible with existing insfracture of JME3 and OpenGL.
 
-
 Its concept, design and archictecture inspired by AAA game engine and Enterprise Java solution.
 
 
-
 === Overview
 
 In this page:
 
-
 .  Goal of Atom framework - which tend to expand JME3 and Java language to suite more for game dev.
 .  Problems of realtime applications (especially games).
 .  Solutions and those base platforms, frameworks that we going to use to approach those goals.
@@ -59,28 +55,23 @@ In this page:
 You can view slides and download papers about the design of Atom framework here.
 
 
-
 == Real time applications
 
 Atom is designed to *MAKE* concurrent, real-time, embedded systems and *GAMES*
 
 
-
 === Atom VS ptolemy
 
 As mentioned in the Atom framwork's introduction, Atom is actually inspired by Plotemy project link:http://ptolemy.eecs.berkeley.edu/index.htm[http://ptolemy.eecs.berkeley.edu/index.htm]
 
-
  but it actually tend to has various different goals, techniques, mindset and approaches. The comparasion in constrast with Ptolemy will reveal a lot of Atom characteristics.
 
-
 ....
  The Ptolemy project studies modeling, simulation, and design of concurrent, real-time, embedded systems. The focus is on assembly of concurrent components. The key underlying principle in the project is the use of well-defined models of computation that govern the interaction between components.A major problem area being addressed is the use of heterogeneous mixtures of models of computation.
 ....
 
 *VS*
 
-
 ....
  Atom is designed to **MAKE** concurrent, real-time, embedded systems and **GAMES**. So it focus more in code generation, profile, monitoring; focus more in graphics, physics, **player experience**... etc.   Underlying, it borrow quite a bunch of concepts that built in Ptolemy (not codes!).
 ....
@@ -90,7 +81,6 @@ 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. 
 
@@ -111,11 +101,9 @@ So the two projects' *goals* are quite overlapped but have different focus point
 
 Atom also depends in Javolution and has some parts from JScience code base but once again the purpose, Atom focus in Games and simulations… Also a lot of techniques Atom is different from one used in JScience.
 
-
 One can also see that Atom fullfill the lack of JScience's experimental Game package. :)
 
 
-
 === Target Devices & Platforms
 
 
@@ -142,17 +130,14 @@ One can also see that Atom fullfill the lack of JScience's experimental Game pac
 In Java, a lot good opensource projects are already provide solutions for various challanges in software developments. The problem is how to glue those gems together in appropriate way and result in efficient, good quality product - Saving time and efforts.
 
 
-
 [WARNING]
 ====
 Hundred of opensource projects…
 ====
 
 
-
 For example, AtomCore module depends in these high quality libraries:
 
-
 *  JME3
 *  Common Java JSR annotations:
 *  Apache commons 
@@ -173,13 +158,11 @@ For example, AtomCore module depends in these high quality libraries:
 Other require pieces are write from sk
 
 
-
 == Atom framework Design course
 
 This section is dedicated to explain some idioms, patterns, and long term solutions for problems and each design goals, structures.
 
 
-
 === Game and real-time application
 
 
@@ -187,13 +170,11 @@ 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; 
 *  where Actions happen in a Cycle, procedure Events;
 
 A little bit more detailed, Gameplay is the way player play the Game, has:
 
-
 *  Logic:
 **  Trigger: in which Conditions, active some appropriate Action, as primitive brick.
 **  Rule: the laws, restrictions form the game rule which player, entities obey.
@@ -211,7 +192,6 @@ A little bit more detailed, Gameplay is the way player play the Game, has:
 
 The game “software should be published in specific enviroment, it then has:
 
-
 *  Configurations : appropriate settings for specific enviroment, device.
 *  Data : appropriate size and format
 
@@ -232,21 +212,17 @@ The game “software should be published in specific enviroment, it then has:
 
 The Core is the part that focus in *Game and real-time application*. It declare
 
-
 You can read more about the Core architecture here.
 <<jme3/advanced/atom_framework/atomcore#,atomcore>>
 
 
-
 === Design patterns & Programming paradigms
 
 Consider research through this trusted resources before we go deeper into Atom architecture and where/why/how it apply each Design patterns:
 
-
 <<jme3/advanced/atom_framework/design/patterns#,patterns>>
 
 
-
 === Programming aspects
 
 
@@ -254,34 +230,27 @@ Consider research through this trusted resources before we go deeper into Atom a
 
 The most “Java things in AtomCore is Bean and Properties. Two pure Java data type which are very useful in Game world. Bean is for game object modeling and Properties for configuration.
 
-
 Of course, other Java technologies are also used but not mentioned because it's not nessesary. But Bean and Properties are the two techs that heavily used!
 
-
 “Good Java extensions used in AtomCore 0.2+ is:
 Guava:
 
-
 *  Bring Eventbus, network in a snap
 *  Collection, Fluent, functional syntax and flavour to Java.
 *  Guava also support Cache, reflection and more low level operations
 
 Guice: bring Dependency injection, better unit test, refactoring in a lightweight manner.
 
-
 Groovy is a JVM language and intergrated deeply with AtomCore, most appreal as Scripting language but remember it also can replace Java, or seen as Java. Groovy also offer much more of superb things.
 
 
-
 ==== Code vs Data
 
 For big game, the amount of Data required can be so much. Mean while the complexity of code also rise fast, as the result of data increasing!
 
-
 At some point, we have to find a solution to reduce “manual Data + code making and maintaining. That where “generative code also can be seen as a kind of Data was born. This called Data-driven architecture (solution). In AtomCore 0.2, it have features to support this trend.
 
 
-
 ==== Around Bean
 
 
@@ -292,14 +261,12 @@ This is so important to mention that every techs Atom framework are around Bean/
 
 For example:
 
-
 *  AtomEX : the bridge to AKKA Actor model also use POJO as its candidate
 *  EJB leverage…
 *  Fx: use POJO as its effect elements
 
 Here is a brief explaination why Bean/ POJO is choosed to be the Core of Atom framework?
 
-
 ....
 As built in Java technologies, Bean/ POJO is the only "consider good" solution as:
 **"the bridge"** **from Java OOP to COP**, **from Java OOP to AOP**
@@ -325,14 +292,11 @@ or **Code but also Data**...
 
 Atom in its core try to be polymorphism (polygot programming), to suite with OOP, COP, AOP or functional … Yeah, it's java after all but good kind of Java.
 
-
 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]
 
 
-
 ==== Functional reactive programming
 
 
@@ -356,50 +320,40 @@ Read: link:http://groovy.codehaus.org/Polyglot+Programming+with+Groovy[http://gr
 
 Take a look at a JME3 game, Manager for example, what if you want the two manager's work together but loosely depend on each other, or what if you want the State to direct the Manager to do something but have minimal informations about them…
 
-
 More abstract, whenever you have some kind of Service, which is loosely depend on each other, you should try Dependency Injection link:http://martinfowler.com/articles/injection.html[http://martinfowler.com/articles/injection.html] .
 
-
 That's where Guice help in the big picture.
 
 
-
 ==== Dependency injection
 
 link:https://code.google.com/p/google-guice/[https://code.google.com/p/google-guice/]
 
 
-
 ==== Component Injection
 
 link:http://wiki.apidesign.org/wiki/Component_Injection[http://wiki.apidesign.org/wiki/Component_Injection]
 
 
-
 ==== Dependency injection VS Component Injection
 
 link:http://code.imagej.net/gbh/lookup/DependencyInjectionandLookup.html[http://code.imagej.net/gbh/lookup/DependencyInjectionandLookup.html]
 
 
-
 ==== 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: 
 
-
 *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. 
 
-
 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.
 
-
 *Enterprise features*
 You can imagine how Atom framework tend to bridge JME game and the Web universal. It's not so hard in fact. Cause Java enterprise technologies are already there to use. Lot of them are built on the top of Dependency injection and Inversion of control (or else)… I really like dependency injection but I can not agree that i should always couple with IoC per se. This will be discuss later in this documentation
 
 
-
 == Enterprise facilities
 
 
@@ -408,13 +362,11 @@ You can imagine how Atom framework tend to bridge JME game and the Web universal
 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
 
 Try AtomEx
 
 
-
 ==== To Database
 
 
@@ -437,7 +389,6 @@ Try AtomEx
 
 Atom framework's design is inspried by:
 
-
 *  Game Engine Architcture book
 *  Game Programming gems serires
 *  AI Game Engine book
@@ -445,7 +396,6 @@ Atom framework's design is inspried by:
 
 other GameEngine that I did use:
 
-
 *  UDK
 *  Unity
 *  CryEngineSDK
@@ -455,7 +405,6 @@ other GameEngine that I did use:
 
 other Java techs:
 
-
 *  EJB
 *  Spring
 *  Groovy
@@ -463,4 +412,3 @@ other Java techs:
 *  … hunread of open-source projects
 
 Full researched papers list are comming.
-

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

@@ -19,43 +19,34 @@ This is *NOT* 1st Computer science class!! Understanding programming paradigms a
 
 
 
-
 === Programming paradigms
 
 Programming generally and programming languages usually designed toward a paradigm, but some of them are multi-paradigm also.
 
-
 link:http://en.wikipedia.org/wiki/Programming_paradigm[http://en.wikipedia.org/wiki/Programming_paradigm]
 
-
 link:http://en.wikipedia.org/wiki/Comparison_of_programming_paradigms[http://en.wikipedia.org/wiki/Comparison_of_programming_paradigms]
 
 
-
 ==== Java programming language
 
 
 image::http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Java_logo_and_wordmark.svg/150px-Java_logo_and_wordmark.svg.png[200,with="",height="",align="left"]
  *Java* is a computer programming language that is concurrent, class-based, object-oriented, (mostly) imperative, structured (also referred as strictly typed)
 
-
 emoji:sunglasses Suppose that when you read this wiki you already know what Java is (partly)
 
-
 *Groovy*… 
 
 image::wiki/groovy-logo.png[200,with="",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/]
 
 
-
 [TIP]
 ====
 Learn groovy: link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting]
@@ -63,49 +54,39 @@ Learn groovy: link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting[htt
 
 
 
-
 === Game Programming paradigms
 
 Game framework or game engines also be comparasion (along with its programming language) into some category (not include graphics capacity):
 
 
-
 ==== By
 
 Entity System
 
 
-
 ==== By concurrent capicity
 
 Active
 
-
 Reactive
 
-
 Interactive
 
 
-
 === Design patterns
 
 link:http://en.wikipedia.org/wiki/Software_design_pattern[http://en.wikipedia.org/wiki/Software_design_pattern]
 
-
 link:http://sourcemaking.com/[http://sourcemaking.com/]
 
-
 link:http://wiki.apidesign.org/wiki/Main_Page[http://wiki.apidesign.org/wiki/Main_Page]
 
 
-
 === Design patterns in game developing
 
 link:http://gameprogrammingpatterns.com/[http://gameprogrammingpatterns.com/]
 
 
-
 ==== Singleton . Central . Law of detemer
 
 
@@ -123,36 +104,28 @@ link:http://gameprogrammingpatterns.com/[http://gameprogrammingpatterns.com/]
 MPV: Model View Presenter is the two way of
 MVC Model View Controller; where Presenter is the middle-man, the mediator between Model and View know and get notificated by both Model and View.
 
-
 Talk about MVC first: Assume you know about web
 
-
 from Wikipedia link:http://en.wikipedia.org/wiki/Web_application_framework#Push-based_vs._pull-based[http://en.wikipedia.org/wiki/Web_application_framework#Push-based_vs._pull-based]
 
-
 *Push-based vs. pull-based*
 
-
 ....
 Most MVC frameworks follow a push-based architecture also called “action-based”. These frameworks use actions that do the required processing, and then “push” the data to the view layer to render the results.[5] Struts, Django, Ruby on Rails, Symfony, Yii, Spring MVC, Stripes, Play, CodeIgniter, and Struts2[6] are good examples of this architecture. An alternative to this is pull-based architecture, sometimes also called “component-based”. These frameworks start with the view layer, which can then “pull” results from multiple controllers as needed. In this architecture, multiple controllers can be involved with a single view. Lift, Tapestry, JBoss Seam, JavaServer Faces, and Wicket are examples of pull-based architectures.
 ....
 
 MVC Push was born in the world of “none frequent” and not suite well for kind of application almost done update every-frame. So there is some kind of Event,Action embed on it.
 
-
 MVC Pull in another hand, suite better for “frequent update” and assume that View is the one trigger the update call.
 
-
 Back to real-time game, if you not making a chess game, almost you “are doing” a pull based MVC, or apply this pattern privately. 
 
 
-
 == Design patterns in JME3
 
 Here some analysing about patterns in JME3 world so Atom bypass or inherit them.
 
 
-
 ==== Push or pull ?
 
 worth to note:
@@ -160,16 +133,13 @@ even some part of JME3 assemble MPV, it’s not the whole!
 also for a game, apply MPV is quite annoying and also tricky!
 
 
-
 [TIP]
 ====
 Here is the twist: Actually in JME3, you are doing both, that’s why it look like MVP!
 ====
 
 
-
 because of this cycle 
 
 
-
 == Design patterns in Atom

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

@@ -13,7 +13,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Welcome this is the main entrance of Atom framework documentation. Here you will find all the resource you need to start developing with Atom framework. First take a look at the structure of the documentation.
 
 
-
 === Structure of the Documentations
 
 .  Architecture Design
@@ -35,14 +34,12 @@ Welcome this is the main entrance of Atom framework documentation. Here you will
 <<jme3/advanced/atom_framework/docs/setup#,Download and Setup instructions>>
 
 
-
 == Design documentation
 
 Design &amp; Architecture documentation page: 
 <<jme3/advanced/atom_framework/design#,design>>
 
 
-
 == The Code
 
 
@@ -53,7 +50,6 @@ Make sure that you've read and understanded Atom's Design part
 
 
 
-
 === Programming aspects
 
 *  Java
@@ -65,7 +61,6 @@ Make sure that you've read and understanded Atom's Design part
 
 AtomCore (pure Java) supports:
 
-
 *  Functional reactive programming
 *  Flow based programming
 *  Component based programming
@@ -74,11 +69,9 @@ 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]
 
 
-
 === How can I structure my code?
 
 ....
@@ -88,25 +81,20 @@ How can I structure my code in Atom framework and in JME3 games. What is the bes
 
 link:http://hub.jmonkeyengine.org/forum/topic/how-to-structure-the-game-code/[http://hub.jmonkeyengine.org/forum/topic/how-to-structure-the-game-code/]
 
-
 More detailed, <<jme3/advanced/atom_framework/docs/code/structure#,Code structure explained>>
 
-
 You can also find a better examples here in my game examples:
 <<jme3/atomixtuts#, Atomix's tutorials games>>
 
 
-
 === Code generation
 
 link:http://en.wikipedia.org/wiki/Code_generation_%28compiler%29[http://en.wikipedia.org/wiki/Code_generation_%28compiler%29]
 
-
 Atom support code generation from multiple sources and to various targets to help speed up and unite production pipeline. <<jme3/advanced/atom_framework/codegen#,CodeGen>> - Ultimate tools for code genration corporate with <<jme3/advanced/atom_framework/atomexasset#,AtomExAsset>> - Ultimate tools for game assets management is 2 facilities in charge for the job.
 
 
-
-===== Sources
+==== Sources
 
 *  UML
 *  ECore
@@ -115,7 +103,7 @@ Atom support code generation from multiple sources and to various targets to hel
 *  3D Model and assets
 
 
-===== Targets
+==== Targets
 
 *  Other Model format - via ECore, UML
 *  Groovy or Java - via ECore, UML, ANTLR
@@ -133,17 +121,14 @@ Atom support code generation from multiple sources and to various targets to hel
 Atom support configs based in Apache Commons Configurations:
 link:http://commons.apache.org/proper/commons-configuration/[http://commons.apache.org/proper/commons-configuration/]
 
-
 Apache Commons Configurations supported configuration format:
 
-
 *  Properties 
 *  XML
 *  JMX
 
 Additionally Atom support configuration via:
 
-
 *  Java Annotations 
 *  GroovyConfigs
 
@@ -152,63 +137,48 @@ Additionally Atom support configuration via:
 
 Default scripting language of Atom framework is Groovy. 
 
-
 Some optional groovy facilities are also included (gpars, ASM, ANTLR…) 
 
 
-
 [IMPORTANT]
 ====
 But note that AtomCore is not depend in Groovy.
 ====
 
 
-
 You can also do scripting in other Java scripting frameworks like BeanScript or JavaScript.
 
-
 Scripting leverage game programming a lot. You can stay inside the running game and make changes into the game enviroment (is just one small advantage aside of other super cool features!). So read about how to do scripting here:
 
-
 link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:atom_framework:atomscripting[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:atom_framework:atomscripting]
 
-
 link:http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting[http://hub.jmonkeyengine.org/wiki/doku.php/jme3:scripting]
 
 
-
 == The Project
 
 Atom provide two editing facilities : AtomEditor for ingame editing and AtomSDK for desktop swing based in Netbean. Both of them working with a Project format and structure defined in AtomEditor structure.
 
-
 The main format to save Project informations is XML. With default settings format is normal XML, it can be set to used a multiversion XML tree (imagine git but effective in XML).
 
-
 <<jme3/advanced/atom_framework/docs/project#,Project details>>
 
 
-
 === Project structure
 
 The project also has a folder structure (directories and files) convention just like JME3. Aware of that when coding or making assets.
 
-
 <<jme3/advanced/atom_framework/docs/project/structure#,Project structure>>
 
 
-
 === Code or Data?
 
 First take a look at how Atom manage Data…
 
-
 <<jme3/advanced/atom_framework/atomexasset#,AtomExAsset>>
 
-
 *One question you may ask: if Atom was so Data+Model-driven and generative. Is code still code or is Data?*
 
-
 .  Code is still code in almost every situations. 
 .  Till it's sent into generation pipelines (when you hit build or so), the new code and assets are generated.
 .  In pakaging phase, code (as byte code or scripts) are packed completely in jar (or packages format). Some of them are ofucased, zipped then translate via network. They are now data.
@@ -218,7 +188,6 @@ First take a look at how Atom manage Data…
 The distingish between data and code just need to be clear if you like to process on them. As long as you don't, they are same bit, forget about the differencies totally - who give a $%it!
 
 
-
 === Project settings
 
 
@@ -241,51 +210,35 @@ The distingish between data and code just need to be clear if you like to proces
 
 AtomCore
 
-
 AtomSripting
 
-
 AtomEditor
 
-
 Atom2D
 
-
 Atom2DEditor
 
-
 CodeGen
 
-
 CityGen
 
-
 AtomEx
 
-
 AtomExAsset
 
-
 AtomLight
 
-
 AtomAnim
 
-
 AtomAI
 
-
 AtomTestbed
 
 
-
 === Inside AtomSDK
 
 TeeHeeComposer
 
-
 CharacterCreator
 
-
 MMO-Machines
-

+ 5 - 17
src/docs/asciidoc/jme3/advanced/atom_framework/docs/code/structure.adoc

@@ -8,10 +8,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== How can I structure my code?
+== How can I structure my code?
 
 
-==== The question
+=== The question
 
 ....
 How can I structure my code?
@@ -21,22 +21,18 @@ How can I structure my code?
 link:http://hub.jmonkeyengine.org/forum/topic/how-to-structure-the-game-code/[http://hub.jmonkeyengine.org/forum/topic/how-to-structure-the-game-code/]
 
 
-
-==== The pattern
+=== The pattern
 
 Read the explain about some design patterns in Design <<jme3/advanced/atom_framework/design#,design>>
 
-
 This queston evolve several patterns like Singleton, Manager, Factory and related directly to the Central idiom of Atom's framework!
 
 
-
-==== The central
+=== The central
 
 Now talking about the long “getManager().getSubManager().getItsManagedObject().doSomeThing()”
 Consider asking your self this when you code:
 
-
 .  Can singleton help?
 .  Can hierarchy actually help?
 .  How secure is your application, is it a game or anything else?
@@ -44,7 +40,6 @@ Consider asking your self this when you code:
 
 For this particular example, related to “Law of Demeter” that @zanval88 mentioned is about “communicating range scope” and “hiding information”, appear as “encapsulation” and “reference” in Java.
 
-
 .  If all your Manager classes is public, and referenced every where chances that they can be Singleton (read more about singleton for its downside).
 .  If not, you should nest your Manager and its ManagedObject it arbitrary order and way. Consider this for a game, it’s almost always not necessary!
 ..  When you have your Managers and Object form a “tree” and obey a “cycle” or “protocol” or “common pattern”, may be contract them with an Interface or force them to extend the same base. [I DID this in my Atom framework!]
@@ -60,17 +55,14 @@ For this particular example, related to “Law of Demeter” that @zanval88 ment
 
 
 
-==== The structure
+=== The structure
 
 I have a strong conceptual POV about video game, which affected by cinematography a lot. Because English is not my native language I can misunderstood the real meaning of the noun but I’ve tried to find the right words in decade.
 
-
 This one is mine, maybe only me but noone else :p :
 
-
 So consider this 5 level of separation:
 
-
 .  Main : The main entry, have everything only relate to this single game, single application. Also game specific Configs should be here
 .  Core : The shared part can be used in almost every application share the same base
 .  Stage : The ‘Stage’ is the base of entities, activites and events… It’s not nessesary care about the gameplay but the World, Camera, Light and Effects, Cinematic. Stage contain most of the underlying logic, and the actors.
@@ -79,7 +71,6 @@ So consider this 5 level of separation:
 
 Others optional:
 
-
 .  *Network : For network game, blending between state, sub-routine and arbitrary events is difficult and may require other kind of paradigm, that’s why is not in Stage, but elsewhere outside.
 .  *Services: If your game use external services such as Web or IAP or something like that.
 .  *UI: UI stand for user interface, almost everygame have user interfaces but not all, so it’s also optional
@@ -90,11 +81,9 @@ Others optional:
 
 
-
 The directory :
  * src
 
-
 * my.game.name
 ** main
 ** core
@@ -108,4 +97,3 @@ The directory :
 
 More detailed, You can find a better example here in my game examples:
 <<jme3/atomixtuts#,atomixtuts>>
-

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

@@ -8,29 +8,22 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== Atom framework's Managers
+== Atom framework's Managers
 
 Read about the Manager idea here <<jme3/advanced/atom_framework/atomcore#,atomcore>>
 
-
 Atom also have a lot of Managers. *Here suggestion for implemented one!*, you can call it a convention because it's not forced on you to gain more flexibility.
 
-
 Manager can has SubManagers, as a List or a Map (Hierarchy or not is not forced)
 
-
 Manager can be extended or Singleton or DefaultInstance (can be getDefault() but not a singleton) here and there. Manager all “attend” in a “cycle” but not “obey”. They can implement ICycle to mark they executor as Obey stricly to the Cycle.
 
-
 you can do Main.getManager(Class) if your Main support it, or doing the long reference getManager().getSubManager().
 
-
 You can see it as a hybrid or “no contract yet” – “not stricted to” way of implementing to get “best of both world” out of:
 
-
 .  singleton vs default vs linked instance
 .  hierarchy vs flatten component base
 .  cycle attend vs a random routine.
 
 In this implementation, I also try to have a good balance between flexibility and usefulness, clearance and performance. In the near future, when my framework is proved to be statable and useful, I will release it fully.
-

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

@@ -8,20 +8,17 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== The structure
+== The structure
 
 
-==== Videogame structure
+=== Videogame structure
 
 I have a strong conceptual POV about video game, which affected by cinematography a lot. Because English is not my native language I can misunderstood the real meaning of the noun but I’ve tried to find the right words in decade.
 
-
 This one is mine, maybe only me but noone else :p :
 
-
 So consider this 5 level of separation:
 
-
 .  Main : The main entry, have everything only relate to this single game, single application. Also game specific Configs should be here
 .  Core : The shared part can be used in almost every application share the same base
 .  Stage : The ‘Stage’ is the base of entities, activites and events… It’s not nessesary care about the gameplay but the World, Camera, Light and Effects, Cinematic. Stage contain most of the underlying logic, and the actors.
@@ -30,7 +27,6 @@ So consider this 5 level of separation:
 
 Others optional:
 
-
 .  *Network : For network game, blending between state, sub-routine and arbitrary events is difficult and may require other kind of paradigm, that’s why is not in Stage, but elsewhere outside.
 .  *Services: If your game use external services such as Web or IAP or something like that.
 .  *UI: UI stand for user interface, almost everygame have user interfaces but not all, so it’s also optional
@@ -42,13 +38,11 @@ Others optional:
 
 
-
-==== Project source structure
+=== Project source structure
 
 The directory :
  * src
 
-
 * my.game.name
 ** main
 ** core
@@ -62,4 +56,3 @@ The directory :
 
 More detailed, You can find a better example here in my game examples:
 <<jme3/atomixtuts#,atomixtuts>>
-

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

@@ -8,11 +8,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== Download and Setup
+== Download and Setup
 
 Checklists before you start:
 
-
 ....
   You has JME3 Engine and SDK installed properly with lastest version
   You've read the wiki and know what Atom framework is? 
@@ -20,7 +19,6 @@ Checklists before you start:
 
 Checkout
 
-
 ....
   Check out the source from
 ....
@@ -34,51 +32,40 @@ Checkout
 ....
 
 
-==== Download
+=== Download
 
 Jar:
 
-
 Repository:
 
-
 Update central:
 
-
 Maven:
 
-
 Gradle:
 
 
-
-==== Setup
+=== Setup
 
 
-===== For AtomSDK
+==== For AtomSDK
 
 
-===== For Atom TeeHee
+==== For Atom TeeHee
 
 Troubleshoots
 
-
 If you can not get this basic start, don't worry.
 
-
 Read back JME3 simple tutorials first and come back. Just take 10 mins or so. :) or goto: link:http://code.google.com/p/atom-game-framework/wiki/Troubleshootings[http://code.google.com/p/atom-game-framework/wiki/Troubleshootings]
 
-
 Cheer.
 Install AtomSDK from Update Central
 Done, let's make games!
 
 
-
-=== Let's take basic tutorials here.
+== Let's take basic tutorials here.
 
 If you 'are proficient enough with Java+GameDev?+JME3. 
 
-
 Let's go to immediate tutorials and examples here. 
-

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

@@ -12,10 +12,8 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Eh… What 's so fancy about those AAA games, like MassEffect, Drake and those from UDKs…?
 
-
 It's all about the face!
 
-
 ....
   Yeah, indeed. Facial animation play an important role in game industry today. I won't tell you much about how much money are spent to get that character's face talk and lively... From an artist point of view, facial and emotional behavior of human character is the point to make a game's state of art!
 ....
@@ -23,7 +21,6 @@ It's all about the face!
 Let see how can we do it in JME3, shall we?
 
 
-
 === Ideas
 
 *  Customize the face with animations, emotions: ( eyes, nose, mouth ) with (smile, angry …)
@@ -42,13 +39,11 @@ Go to <<Researches & Papers,alternatives and researches>> if you want to go furt
 
 
 
-
 == AtomFacial framework
 
 image:jme3/advanced/atom_framework/youtube_fcf6grenolg[youtube_fcf6grenolg,with="",height=""]
 
 
-
 === Architecture
 
 

+ 0 - 34
src/docs/asciidoc/jme3/advanced/atom_framework/fx.adoc

@@ -12,25 +12,19 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Stand for Effects.
 
-
 Also stand for dynamic value functions f(x). 
 
-
 Inspired by 
 
-
 link:http://nodebox.net/node/[http://nodebox.net/node/]
 
-
 link:http://udk.com[http://udk.com]
 
 
-
 === What's about the f(x) ?
 
 For various effects the game may require. Need customable, extensible way to declare input-process-ouput:
 
-
 .  dynamic generic Data, which can be procedure by various sources, signals, services
 .  dynamic generic declaration of operations
 .  dynamic generic declaration of output order
@@ -38,15 +32,12 @@ For various effects the game may require. Need customable, extensible way to dec
 Last but not least, it should be resuable, generative and composable.
 
 
-
 ==== In Java?
 
 About the implementation, such as language should be under considered!
 
-
 These all requirements fit to an DSL, functional and lazy like groovy scenario, but what about java - a traditional grown as imperative language? It's like we going to implement all its core language elements for god-sake… Umh, not like that. With the help of Guava, we do it properly acceptable and scalable! But read it carefully first or mislead later!!!
 
-
 link:http://code.google.com/p/guava-libraries/wiki/FunctionalExplained[http://code.google.com/p/guava-libraries/wiki/FunctionalExplained]
 
 [IMPORTANT]
@@ -56,7 +47,6 @@ This framework's feature goes in two branches: in Java 1.5+ with Guava and in Gr
 
 
 
-
 ==== Focus in effects
 
 
@@ -66,70 +56,52 @@ The abstract concept and even implementation of the Fx framework make it look si
 ====
 
 
-
 Of course we not going to do a whole language enhancement here but use a functional ultilities to get start up quick and go straight to the “real-time effects part later. But remember the base concepts of it, which really to be extend and custom for your own needs. 
 
-
 Now Let's see how does it work?
 
 
-
 === Interface & Abstract
 
 We need dynamic Data, which can be procedure through various sources, signals, services… let call the abstract which provide the data IValueProvider:
 
-
 interface IValueProvider &lt;x,y&gt;{
 y   value(x) return new y
 }
 
-
 Function &lt;x,y&gt; is the default implementation
 
-
 Function &lt;x,y&gt;{
 }
 
 
-
 === Input
 
 So what can be the input?
 
-
 Single&lt;Value&gt; or any primitive
 
-
 List&lt;Value&gt; . String
 
-
 more
 
 
-
 === Time factor & Real time application
 
 An important factor of a real time system is … time, indeed. Imagine a physic world functioning with f(t) is the primitive law. Our effects system also. Almost every effects envolve time and almost modify or procedure several positions values. It's a very common case in this scenario.
 
-
 In fact almost of the F(x) features are actually f(t) which t is the time provided by the system via update cycle. 
 
-
 Now consider this very simple physic xample :
 
-
 S = V.t 
 
-
 pos = startPos + S 
 
-
 → pos = startPos + V.t
 
-
 We have:
 
-
 .  startPos is a Vector3f (can be localTranslation of a jme3's Spatial!). 
 .  a parameter vector V, basicly stand for the Speed
 .  t is time provided by system
@@ -137,17 +109,14 @@ We have:
 
 → We can compute the new pos which we can use as a slide of a ball!
 
-
 In this simplest example, we should reads a mathematic equations as a “procedural process in our fx system with time as an essential key. Which later will help us build up extraordary complex effect!
 
 
-
 ==== Animations concepts
 
 Here we will revised some animation concept. Kinematic and functionals.
 
 
-
 ===== Timeline
 
 
@@ -192,7 +161,6 @@ Here we will revised some animation concept. Kinematic and functionals.
 IValueProvider
 
 
-
 ===== Layout
 
 
@@ -212,13 +180,11 @@ Ideas from Adobe After effect ,3DSMax, Cinema4D, Processing, Blender…!
 
 
 
-
 === Text Effects
 
 One of the most under rated part in almost every 3d game engine I come across is the *Text effect*. We *DO* need Text effect but it didn't have any native support. I've started by doing a lot of After effect's text effects and plugin, then trying in 3DSMax, Cinema4D, later in Processing… but I can not find one that make me feel easy to use and powerful. From some ideas borrow from those applications, I try to implement some in this framework.
 
 
-
 === Particle Effects
 
 

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

@@ -12,16 +12,13 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 In Atom framework, I choose NiftyGUI because its much more features, expandable, have active developing status, and good friendly supports. 
 
-
 AtomGUI is the base of AtomEditor component (of Atom framework), which in turn provide easy editing support for game objects, configs and such, just like Swing does with Java's bean and Models, but in 3D with hardware accelarated.
 
 
-
 === Additions
 
 My additions for NiftyGUI:
 
-
 *  Lightweight MVC
 **  Template framework
 **  a Groovy builder
@@ -38,37 +35,29 @@ My additions for NiftyGUI:
 
 It's worthy to note that I come from the Web world, and I use JavaScript everyday beside of Java. That's why I always want “good things in JavaScript world show up in game dev world.
 
-
 Things such like Template, +++<abbr title="Cascading Style Sheets">CSS</abbr>+++, GQuery, … corporate tightly with JME3 systems but with a lot of additional gun and gears. Make Nifty and JME3 a real powerful monkey as it should!
 
 
-
 === Template and CSS
 
 Every Web framework come with a Template framework, facade and styles make the Web world colorful and attractive but +++<abbr title="HyperText Markup Language">HTML</abbr>+++ and +++<abbr title="Cascading Style Sheets">CSS</abbr>+++ is a blow-up standard!!! 
 
-
 What we trying to do here is to make is compact and usable but with posibility to enhance and extend.
 There are some “good template framework in the Java and JavaScript world:
 - Mustache
 - StringBuilder
 - Veclocity
 
-
 Also worth to take a look is : LESS (the scriptable +++<abbr title="Cascading Style Sheets">CSS</abbr>+++)
 
-
 I see much powerful can be gained if we open this direction with the combination of : JME3 + Nifty + Groovy. That's why I experiment all this stuffs.
 
 
-
 === GQuery
 
 GQuery stand for “JQuery like in Groovy. 
 
-
 JQuery is a famous framework in the JavaScript and Web world. GQuery try to provide some of its features, immtimate its syntax and sugars, leverage by Groovy:
 
-
 *  Query, select a Node Tree (like +++<abbr title="HyperText Markup Language">HTML</abbr>+++, Nifty elements,…) with a minimal Path syntax , same as XPath
 *  Hooks to Node's (components, elements..) events with Eventbus

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

@@ -13,21 +13,17 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 This is the introduction of Atoms framework's MMORPG Tools.
 
 
-
 === Ideas
 
 A lot of MMORPG game are published but how many in java you can count?
 
-
 Do you feel so strange about it, even if we have the most powerful programming languages, techniques and toolset?
 
 
-
 ==== Problems
 
 Let's talk a little bit about the problems:
 
-
 .  Too much technical problems
 .  Too much framework to use, which one is right?
 .  Too much data to make
@@ -37,15 +33,12 @@ Let's talk a little bit about the problems:
 More about the MMORPG dream for small team, even invidual <<jme3/atomixtuts/mmorpg#,mmorpg>>
 
 
-
 ==== Solution?
 
 Only one word (or 2): Open-source!
 
-
 So in short, what I telling you is at least it provide you a framework and a rich toolset to build up your dream game and also a production enviroment to make MMORPG!
 
-
 .  Stand in the shoulders of best open-source projects and also open-source spirit in its heart. 
 .  Also born form the most innovative ideas of game production and deployment.
 
@@ -54,7 +47,6 @@ So in short, what I telling you is at least it provide you a framework and a ric
 
 It's coming with:
 
-
 .  Ease of use - even your grandma can do, less code, smart tools in every single step
 .  Effiecient - increase your productivity at least 10x
 .  Scale to massive! - distributed computing, multi node , graph base database, non block event messaging, social network … much more!
@@ -66,7 +58,6 @@ It's coming with:
 Read the full article in researches about the open-source and commercial tool for MMORPG we have currently (well, the most popular) <<jme3/atomixtuts/mmorpg/researches/toolset#,toolset>>
 
 
-
 === Features
 
 
@@ -86,7 +77,6 @@ Go to alternatives and researches if you want to go further than Atom!
 
 
 
-
 == Architecture
 
 
@@ -96,4 +86,3 @@ Go to alternatives and researches if you want to go further than Atom!
 == Use case & Example
 
 <<jme3/atomixtuts/mmorpg#,mmorpg>>
-

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

@@ -12,44 +12,33 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 This is the introduction of the RPGCreator
 
-
 Despite of its name, its not just for Role playing game!  
 
-
 Provide functions to create| test| config basic game with these key elements : characters| stories| skills| items| modes| regions… almost every game genre has them embeded partly, means cross game genre!
 
 
-
 === Ideas
 
 *Question*: Why not a general Entity framework?
 
-
 *Answer*: You've told somewhere else that an Entity framework can compose up every thing… Yeah, quite. But for RPG, more specificly, for the idea phase, same with software modeling phase in game ( means when character concept, design, voice acting, dialoge, scripts…are made), it's not really appropriated! 
-
 '''
 
 *Question*: So you telling about the gaps?
 
-
 *Answer*: Yes, you know, thoose guys (script writer) not really need to know any technical things. They just like to made up stuffs. That's why after write down thoose ideas, this framework change the resulted data into programming materials (code, config, 3d models…). Consider this a bridge from game designers to coder, and the script writer to the teams.
-
 '''
 
 *Question*: What so Next-gen about it?
 
-
 *Answer*: Yeah, not so much. The idea at first is humble, but it will leverage so much your company's productivity. In fact, big team and big company use home grown tools to archive their scripts and ideas,intelectual properties. That's how their do it, if you know yet!
-
 '''
 
 *Question*: Enouh, show me?
 
-
 *Answer*: Here is it!
 
 
-
 === Features
 
 

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

@@ -8,25 +8,23 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== Status
+== Status
 
 
-=== Issues
+== Issues
 
 Check google code issues checker
 
-
 link:https://code.google.com/p/atom-game-framework/issues/list[https://code.google.com/p/atom-game-framework/issues/list]
 
 
-
-=== Dificulties
+== Dificulties
 
 
-=== Not implemented (yet!)
+== Not implemented (yet!)
 
 
-=== Vison
+== Vison
 
 
-=== Plans
+== Plans

+ 0 - 7
src/docs/asciidoc/jme3/advanced/atom_framework/teehee.adoc

@@ -20,22 +20,17 @@ Cauz it's a funny thing. You play with it.
 *Compose anything you want as easy as smart kids-can-do*
 
 
-
 ==== What can it make ?
 
 Inspired by +++<strike>UDK and Unity's</strike>+++ , Adobe, Blender and few more…toolset and workflow. 
 
-
 Includes all of their goods but excludes or minimize their bads!
 
-
 Inspite of the fact its name is kind of funny, it's very powerful, even more than you imagine. 
 
-
 Let's me get that straight!
 
 
-
 ==== Features
 
 *  Compose anything you want as easy as kids-can-do
@@ -70,7 +65,6 @@ Let's me get that straight!
 
 Components
 
-
 *  Cinematic composer
 *  Dialogue composer
 *  Effect composer
@@ -80,5 +74,4 @@ Components
 Screenshots
 
 
-
 == Manuals

+ 6 - 25
src/docs/asciidoc/jme3/advanced/audio.adoc

@@ -11,12 +11,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Place audio files in the `assets/Sound/` directory of your project. jME3 supports Ogg Vorbis audio compression (.ogg) and uncompressed PCM Wave (.wav) formats. You can use for example link:http://audacity.sourceforge.net/[Audacity] to convert from other formats.
 
 
-
 == Audio Terminology
 
 *  *Streaming:* There are two ways to load audio data: Short audio files are to be stored entirely in memory (prebuffered), while long audio files, such as music, are streamed from the hard drive as it is played.
-*  *Looping:* You can play a sound either once and then stop, or repeatedly (continuously) in a loop. +
-You cannot loop streamed sounds.
+*  *Looping:* You can play a sound either once and then stop, or repeatedly (continuously) in a loop. +You cannot loop streamed sounds.
 *  *Instance:* If you play the same audio twice, the playing is queued up and jME plays one after the other. If you play instances of sounds, several instances of the same sound can play at the same time.
 
 
@@ -24,7 +22,6 @@ You cannot loop streamed sounds.
 
 The main jME audio class to look at is `com.jme3.audio.AudioNode`. When creating a new audio node you need to declare whether how you want to load this sound:
 
-
 *  *Buffered:* By default, a new audio node is buffered. This means jME3 loads the whole file into memory before playing. Use this for short sounds. You create a buffered sound  by setting DataType.Buffer, or using no DataType at all: 
 [source,java]
 ----
@@ -61,7 +58,6 @@ a|Returns the pitch.
 Note: There are other obvious getters to poll the status of all corresponding setters listed here.
 
 
-
 == Setting AudioNode Properties
 [cols="2", options="header"]
 |===
@@ -97,13 +93,11 @@ a|Configures the sound so that, if it is played, it plays once and stops. No loo
 a|AudioNode Method
 a|Usage
 
-a|setPositional(false) +
-setDirectional(false)
+a|setPositional(false) +setDirectional(false)
 a|All 3D effects switched off. This sound is global and plays in headspace (it appears to come from everywhere). Good for environmental ambient sounds and background music.
 
 a|setLooping(true)
-a|Configures the sound to be a loop: After the sound plays, it repeats from the beginning, until you call stop() or pause(). Good for music and ambient background noises. +
-*Before 3.1-alpha2, Looping does not work on streamed sounds.* 
+a|Configures the sound to be a loop: After the sound plays, it repeats from the beginning, until you call stop() or pause(). Good for music and ambient background noises. +*Before 3.1-alpha2, Looping does not work on streamed sounds.* 
 
 |===
 
@@ -115,8 +109,7 @@ a|Configures the sound to be a loop: After the sound plays, it repeats from the
 a|AudioNode Method
 a|Usage
 
-a|setPositional(true) +
-setLocalTranslation(…)
+a|setPositional(true) +setLocalTranslation(…)
 a|Activates 3D audio: The sound appears to come from a certain position, where it is loudest. Position the AudioNode in the 3D scene, or move it with mobile players or NPCs.
 
 a|setReverbEnabled(true)
@@ -132,7 +125,6 @@ Positional 3D sounds require an `AudioListener` object in the scene (representin
 
 
 
-
 === Directional 3D Sounds
 [cols="2", options="header"]
 |===
@@ -140,12 +132,10 @@ Positional 3D sounds require an `AudioListener` object in the scene (representin
 a|AudioNode Method
 a|Usage
 
-a|setDirectional(true) +
-setDirection(…) 
+a|setDirectional(true) +setDirection(…) 
 a|Activates 3D audio: This sound can only be heard from a certain direction. Specify the direction and angle in the 3D scene if you have setDirectional() true. Use this to restrict noises that should not be heard, for example, through a wall.
 
-a|setInnerAngle() +
-setOuterAngle()
+a|setInnerAngle() +setOuterAngle()
 a|Set the angle in degrees for the directional audio. The angle is relative to the direction. Note: By default, both angles are 360° and the sound can be heard from all directions!
 
 |===
@@ -158,12 +148,10 @@ Directional 3D sounds require an AudioListener object in the scene (representing
 
 
 
-
 == Play, Pause, Stop
 
 You play, pause, and stop a node called myAudioNode by using the respective of the following three methods:
 
-
 [source,java]
 ----
 myAudioNode.play();
@@ -181,10 +169,8 @@ myAudioNode.stop();
 
 *Note:* Whether an Audio Node plays continuously or only once, depends on the Loop properties you have set above!
 
-
 You can also start playing instances of an AudioNode. Use the `playInstance()` method if you need to play the same AudioNode multiple times, possibly simulatenously. Note that changes to the parameters of the original AudioNode do not affect the instances that are already playing!
 
-
 [source,java]
 ----
 myAudioNode.playInstance();
@@ -195,7 +181,6 @@ myAudioNode.playInstance();
 
 The default AudioListener object `listener` in `SimpleApplication` is the user's ear in the scene. If you use 3D audio (positional or directional sounds), you must move the AudioListener with the player: For example, for a first-person player, you move the listener with the camera. For a third-person player, you move the listener with the player avatar Geometry.
 
-
 [source,java]
 ----
 
@@ -212,7 +197,6 @@ The default AudioListener object `listener` in `SimpleApplication` is the user's
 == Setting Audio Environment Properties
 
 Optionally, You can choose from the following environmental presets from `com.jme3.audio.Environment`. This presets influence subtle echo effects (reverb) that evoke associations of different environments in your users. That is, it makes you scene sound “indoors or “outdoors etc. You use Audio Environments together with `setReverbEnabled(true)` on positional AudioNodes (see above).
-
 [cols="11", options="header"]
 |===
 
@@ -321,14 +305,11 @@ A sound engineer can create a custom `com.​jme3.​audio.Environment` object a
 ====
 
 
-
 Advanced users find more info about OpenAL and its features here: link:http://web.archive.org/web/20130327063429/http://connect.creativelabs.com/openal/Documentation/OpenAL_Programmers_Guide.pdf[OpenAL 1.1 Specification]. 
 
 
-
 [IMPORTANT]
 ====
 It depends on the hardware whether audio effects are supported (if not, you get the message `OpenAL EFX not available! Audio effects won't work.`)
 ====
 
-

+ 0 - 2
src/docs/asciidoc/jme3/advanced/audio_environment_presets.adoc

@@ -9,10 +9,8 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Use these presets together with <<jme3/advanced/audio#,Audio>> Nodes to create different “moods for sounds. Environment effects make your audio sound as if the listener were in various places that have different types of echoes. 
 
-
 Usage:
 
-
 [source,java]
 ----
 

+ 11 - 37
src/docs/asciidoc/jme3/advanced/bloom_and_glow.adoc

@@ -11,14 +11,11 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Bloom is a popular shader effect in 3D games industry. It usually consist in displaying a glowing halo around light sources or bright areas of a scene.
 In practice, the bright areas are extracted from the rendered scene, blurred and finally added up to the render.
 
-
 Those images gives an idea of what bloom does. The left image has no bloom effect, the right image does. +
-
 image:jme3/advanced/nobloomsky.png[No bloom,with="",height=""]image:jme3/advanced/blomsky.png[Bloom,with="",height=""]
 
 
-
-= Bloom Usage
+== Bloom Usage
 
 .  Create a FilterPostProcessor
 .  Create a BloomFilter
@@ -36,7 +33,6 @@ image:jme3/advanced/nobloomsky.png[No bloom,with="",height=""]image:jme3/advance
 ----
 
 Here are the parameters that you can tweak :
-
 [cols="4", options="header"]
 |===
 
@@ -70,28 +66,22 @@ a| the resulting bloom value is multiplied by this intensity
 You'll probably need to adjust those parameters depending on your scene.
 
 
-
-= Bloom with a glow map
+== Bloom with a glow map
 
 Sometimes, you want to have more control over what glows and does not glow. 
 The bloom filter supports a glow map or a glow color.
 
 
-
-===== Creating a glow-map
+=== Creating a glow-map
 
 Let's take the hover tank example bundled with JME3 test data.+
-
 Here you can see the diffuse map of the tank, and the associated glow map that only contains the parts of the texture that will glow and their glowing color: +
-
 image:jme3/advanced/tank_diffuse_ss.png[Tank diffuse map,with="",height=""]
 image:jme3/advanced/tank_glow_map_ss.png[Tank glow map,with="",height=""]
 
-
 Glow maps work with Lighting.j3md, Particles.j3md and SolidColor.j3md material definitions.
 The tank material looks like this : 
 
-
 [source]
 ----
 
@@ -114,8 +104,7 @@ Material My Material : Common/MatDefs/Light/Lighting.j3md {
 The glow map is defined here : *GlowMap : Models/HoverTank/tank_glow_map_highres.png*
 
 
-
-===== Usage
+=== Usage
 
 .  Create a FilterPostProcessor
 .  Create a BloomFilter with the GlowMode.Objects parameter
@@ -133,19 +122,16 @@ The glow map is defined here : *GlowMap : Models/HoverTank/tank_glow_map_highres
 ----
 
 Here is the result : +
-
 image:jme3/advanced/tanlglow1.png[Glowing hover tank,with="",height=""]
 
 
-
-= Bloom with a glow color
+== Bloom with a glow color
 
 Sometimes you need an entire object to glow, not just parts of it.
 In this case you'll need to use the glow color parameter.
 
 
-
-===== Usage
+=== Usage
 
 .  Create a material for your object and set the GlowColor parameter
 .  Create a FilterPostProcessor
@@ -168,7 +154,6 @@ In this case you'll need to use the glow color parameter.
 
 Here is the result on Oto's plasma ball (before and after) : +
 
-
 image::jme3/advanced/otonobloom.png[Oto's plasma ball is just a big pea,with="400",height="",align="left"]
 
 
@@ -176,17 +161,14 @@ image::jme3/advanced/otoglow.png[Oto's plasma ball radiates incredible power!!!,
 
 
 
+== Hints and tricks
 
-= Hints and tricks
 
-
-===== Increasing the blur range and reducing fps cost
+=== Increasing the blur range and reducing fps cost
 
 The glow render is sampled on a texture that has the same dimensions as the viewport.
 You can reduce the size of the bloom sampling just by using the setDownSamplingFactor method like this : +
 
-
-
 [source,java]
 ----
 
@@ -199,13 +181,11 @@ In this example the sampling size is divided by 4 (width/2,height/2), resulting
 The resulting texture is then up sampled to the screen size using hardware bilinear filtering. this results in a wider blur range.
 
 
-
-===== Using classic bloom combined with a glow map
+=== Using classic bloom combined with a glow map
 
 let's say you want a global bloom on your scene, but you have also a glowing object on it.
 You can use only one bloom filter for both effects like that
 
-
 [source,java]
 ----
 
@@ -216,13 +196,11 @@ BloomFilter bloom=new BloomFilter(BloomFilter.GlowMode.SceneAndObjects);
 However, note that both effects will share the same values of attribute, and sometimes, it won't be what you need.
 
 
-
-===== Making your home brewed material definition support Glow
+=== Making your home brewed material definition support Glow
 
 Let's say you have made a custom material on your own, and that you want it to support glow maps and glow color.
 In your material definition you need to add those lines in the MaterialParameters section :
 
-
 [source]
 ----
 
@@ -240,7 +218,6 @@ In your material definition you need to add those lines in the MaterialParameter
 
 Then add the following technique : 
 
-
 [source]
 ----
 
@@ -266,12 +243,10 @@ Then add the following technique :
 Then you can use this material with the BloomFilter
 
 
-
-===== Make a glowing object stop to glow
+=== Make a glowing object stop to glow
 
 If you are using a glow map, remove the texture from the material.
 
-
 [source]
 ----
 
@@ -281,7 +256,6 @@ material.clearTextureParam("GlowMap");
 
 If you are using a glow color, set it to black
 
-
 [source]
 ----
 

+ 0 - 13
src/docs/asciidoc/jme3/advanced/building_recast.adoc

@@ -9,13 +9,11 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 jNavigation is Java jME port for Recast Navigation written in C++. The project has two parts:
 
-
 .  link:https://github.com/QuietOne/jNavigation-native[jNavigationNative] contains Recast Navigation library and C++ wrapper for java
 .  link:https://github.com/QuietOne/jNavigation[jNavigation] is Java project that uses jNavigationNative and is the project that the end user will use
 
 If there is need for updating Recast Navigation from native side, there are two kinds of updating bindings:
 
-
 .  only updating methods as the Recast made more efficient or more precise
 .  adding new methods for Recast use
 
@@ -24,12 +22,10 @@ If there is need for updating Recast Navigation from native side, there are two
 
 Only updating methods are easy. The requirements needed:
 
-
 *  C++ compiler
 
 The jNavigationNative that has following folders and files (it has more, but these are the most important for now):
 
-
 *  Recast
 **  Include
 **  Source
@@ -39,10 +35,8 @@ The jNavigationNative that has following folders and files (it has more, but the
 
 Updating the methods is only the matter of putting all headers from Recast Navigation to Include folder, source to Source folders, and then building the project.
 
-
 As author of this project used the NetBeans 7.4 for building the project, the following instruction is included, if the building from terminal doesn't work.
 
-
 .  Setting link:https://netbeans.org/kb/docs/cnd/beginning-jni-linux.html[ parameters for NetBeans compiler]
 .  Remove all headers from Header Files
 .  Remove all source files *EXCEPT Recast_wrap.cxx* from Source Files
@@ -57,7 +51,6 @@ As author of this project used the NetBeans 7.4 for building the project, the fo
 
 This is more complicated process and it includes the all work done in NetBeans mentioned in previous section. After that, there are two ways to add new function:
 
-
 *  manually adding code to wrapper
 *  creating new wrapper with link:http://swig.org/[SWIG]
 
@@ -66,7 +59,6 @@ This is more complicated process and it includes the all work done in NetBeans m
 
 Example of method in wrapper:
 
-
 [source,java]
 ----
 
@@ -78,20 +70,16 @@ SWIGEXPORT jint JNICALL Java_com_jme3_ai_navigation_utils_RecastJNI_rcIntArray_1
 
 The Recast_wrap.cxx uses SWIG wrapper so for declaring method in wrapper you must first use the keyword `SWIGEXPORT` then returning type (for more information on returning types see link:http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html[link]), then again keyword `JNICALL` and then as the name of method `Java_com_jme3_ai_navigation_utils_RecastJNI_` + `name of class` + `name of method`, after that, there goes list of parameters needed for the function (for more information see link:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html[link]). In body of method write how the function should be used.
 
-
 After adding method to wrapper, compile project and add it to jNavigation.
 In jNavigation project in class `com.jme3.ai.navigation.utils.RecastJNI.java` add native method, and after that add in class from which you would like to use this method to call this native method. It seems a little bit more complicated than it should be, but this also for support for updating native side with SWIG.
 
 
-
 ==== Creating new wrapper with SWIG
 
 In some temporary folder add all headers. It shouldn't contain any subfolders.
 
-
 The following script was used for generating wrapper:
 
-
 [source]
 ----
 
@@ -161,7 +149,6 @@ The following script was used for generating wrapper:
 
 If there are more headers at some moment, include them in both places.
 
-
 .  Save script as Recast.i into temp folder with rest of the headers
 .  Install SWIG if not already
 .  Open terminal and go to folder where the script is

+ 0 - 6
src/docs/asciidoc/jme3/advanced/bullet_multithreading.adoc

@@ -14,12 +14,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Since bullet is not (yet) multithreaded or GPU accelerated, the jME3 implementation allows to run each physics space on a separate thread that is executed in parallel to rendering.
 
 
-
 == How is it handled in jme3 and bullet?
 
 A SimpleApplication with a BulletAppState allows setting the threading type via 
 
-
 [source]
 ----
 setThreadingType(ThreadingType type);
@@ -27,10 +25,8 @@ setThreadingType(ThreadingType type);
 
  where ThreadingType can be either SEQUENTIAL or PARALLEL. By default, it's SEQUENTIAL.
 
-
 You can activate PARALLEL threading in the simpleInitApp() method:
 
-
 [source,java]
 ----
 bulletAppState = new BulletAppState();
@@ -39,7 +35,6 @@ stateManager.attach(bulletAppState);
 ----
 
 Now the physics update happens in parallel to render(), that is, after the user's changes in the update() call have been applied. During update() the physics update loop pauses. This way the loop logic is still maintained: the user can set and change values in physics and scenegraph objects before render() and physicsUpdate() are called in parallel. This allows you to use physics methods in update() as if it was single-threaded.
-
 [cols="2", options="header"]
 |===
 
@@ -60,4 +55,3 @@ a|Physics Debug View is rendered accurately.
 You can add more physics spaces by using multiple PARALLEL bulletAppStates. You would do that if you have sets physical objects that never collide (for example, underground bolders and flying cannon balls above ground), so you put those into separate physics spaces, which improves performances (less collisions to check!). 
 ====
 
-

+ 3 - 10
src/docs/asciidoc/jme3/advanced/bullet_pitfalls.adoc

@@ -10,32 +10,25 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Bullet physics is not without its problems. Unfortunately, many of those are outside of the control of the jMonkeyEngine Core Team and thus cannot be fixed.
 
 
-
-=== Sweep Test Issues
+== Sweep Test Issues
 
 .  When using link:http://jmonkeyengine.org/javadoc/com/jme3/bullet/PhysicsSpace.html#sweepTest(com.jme3.bullet.collision.shapes.CollisionShape, com.jme3.math.Transform, com.jme3.math.Transform)[PhysicsSpace.sweepTest()], ensure that the distance between the transforms is at least 0.4wu or greater.
 .  Note that the sweep will not detect collisions if it done inside of a collision shape. It must be on the edge of a collision shape to detect any collisions.
 
 
-=== Ghost Control AABB Collision only
+== Ghost Control AABB Collision only
 
 As the javadoc for link:http://jmonkeyengine.org/javadoc/com/jme3/bullet/objects/PhysicsGhostObject.html[PhysicsObjectControl] says, the ghost object collision detection uses AABB (Axis-aligned bounding box) collision only, regardless of the collision shape it has been assigned.
 
-
 *Workaround:*+
-
 Please use PhysicsSpace.sweepTest() instead, or kinematic physics objects with link:http://jmonkeyengine.org/javadoc/com/jme3/bullet/PhysicsSpace.html#addCollisionListener(com.jme3.bullet.collision.PhysicsCollisionListener)[collision listeners].
 
 
-
-=== Rigid bodies fall through ground
+== Rigid bodies fall through ground
 
 This usually happens if the ground physics object has large triangles or consists of a large BoxCollisionShape. 
 
-
 *Workaround:*+
 
-
-
 *  For meshes with large triangles - Subdivide the mesh in a model editor such as Blender.
 *  For large boxes - seperate into smaller boxes or use a MeshCollisionShape for terrain instead of BoxCollisionShape.

+ 0 - 7
src/docs/asciidoc/jme3/advanced/camera.adoc

@@ -11,15 +11,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Note that by default, the mouse pointer is invisible, and the mouse is set up to control the camera rotation.
 
 
-
 == Default Camera
 
 The default com.jme3.renderer.Camera object is `cam` in com.jme3.app.Application.
 
-
 The camera object is created with the following defaults:
 
-
 *  Width and height are set to the current Application's settings.getWidth() and settings.getHeight() values. 
 *  Frustum Perspective:
 **  Frame of view angle of 45° along the Y axis
@@ -82,12 +79,10 @@ a|?
 *Tip:* After you change view port, frustum, or frame, call `cam.update();`
 
 
-
 == FlyBy Camera
 
 The `flyCam` class field gives you access to an AppState that extends the default camera in `com.jme3.app.SimpleApplication` with more features. The input manager of the `com.jme3.input.FlyByCamera` AppState is preconfigured to respond to the WASD keys for walking forwards and backwards, and strafing to the sides; move the mouse to rotate the camera (“Mouse Look), scroll the mouse wheel for zooming in or out. The QZ keys raise or lower the camera vertically.
 
-
 [source]
 ----
 
@@ -119,12 +114,10 @@ a|Forces the player to keep mouse button pressed to rotate camera, typically use
 The FlyByCamera is active by default, but you can change all these defaults for your game.
 
 
-
 == Chase Camera
 
 jME3 also supports an optional Chase Cam that can follow a moving target Spatial (`com.jme3.input.ChaseCamera`). When you use the chase cam, the player clicks and hold the mouse button to rotate the camera around the camera target. You can use a chase cam if you need the mouse pointer visible in your game.
 
-
 [source,java]
 ----
 

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

@@ -16,7 +16,6 @@ audio as a result. A better way is to record video and audio directly
 from the game while it is running using VideoRecorderAppState.
 
 
-
 [TIP]
 ====
 Combine this method with jMonkeyEngine's 
@@ -26,17 +25,14 @@ feature to record high-quality game trailers!
 
 
 
-
 == Simple Way
 
 First off, if all you need is to record video at 30fps with no sound, then look
 no further than jMonkeyEngine 3's built in `VideoRecorderAppState`
 class.
 
-
 Add the following code to your `simpleInitApp()` method. 
 
-
 [source,java]
 ----
 
@@ -48,16 +44,13 @@ The game will run slow, but the recording will be in high-quality and
 normal speed. Recording starts when the state is
 attached, and ends when the application quits or the state is detached.
 
-
 The video files will be stored in your *user home directory*. 
 If you want to save to another path, specify a File object in the
 VideoRecorderAppState constructor. 
 
-
 That's all!
 
 
-
 == Advanced Way
 
 
@@ -70,36 +63,28 @@ if something isn't clear, please link:http://jmonkeyengine.org/members/bortreb/[
 ====
 
 
-
 If you want to record audio as well, record at different framerates,
 or record from multiple viewpoints at once, then there's a full
 solution for doing this already made for you here:
 
-
 link:http://www.aurellem.com/releases/jmeCapture-latest.zip[http://www.aurellem.com/releases/jmeCapture-latest.zip]
 
-
 link:http://www.aurellem.com/releases/jmeCapture-latest.tar.bz2[http://www.aurellem.com/releases/jmeCapture-latest.tar.bz2]
 
-
 Download the archive in your preferred format, extract,
 add the jars to your project, and you are ready to go.
 
-
 The javadoc is here:
 link:http://www.aurellem.com/jmeCapture/docs/[http://www.aurellem.com/jmeCapture/docs/]
 
-
 To capture video and audio you use the
 `com.aurellem.capture.Capture` class, which has two methods,
 `captureAudio()` and `captureVideo()`, and the
 `com.aurellem.capture.IsoTimer` class, which sets the audio and
 video framerate.
 
-
 The steps are:
 
-
 [source,java]
 ----
 
@@ -113,7 +98,6 @@ speed up and slow down depending on how computationally demanding your
 game is, but the final recorded audio and video will be perfectly
 sychronized and will run at exactly the fps which you specified.
 
-
 [source,java]
 ----
 
@@ -127,7 +111,6 @@ Audio and video will stop being recorded when the app stops. Your
 audio will be recorded as a 44,100 Hz linear PCM wav file, while the
 video will be recorded according to the following rules:
 
-
 1.) (Preferred) If you supply an empty directory as the file, then
 the video will be saved as a sequence of .png files, one file per
 frame.  The files start at 0000000.png and increment from there.
@@ -135,7 +118,6 @@ You can then combine the frames into your preferred
 container/codec. If the directory is not empty, then writing
 video frames to it will fail, and nothing will be written.
 
-
 2.) If the filename ends in “.avi then the frames will be encoded as
 a RAW stream inside an AVI 1.0 container.  The resulting file
 will be quite large and you will probably want to re-encode it to
@@ -147,25 +129,21 @@ with them.)  Thanks to
 link:http://www.randelshofer.ch/blog/2008/08/writing-avi-videos-in-pure-java/[Werner Randelshofer]
 for his excellent work which made the AVI file writer option possible.
 
-
 3.) Any non-directory file ending in anything other than “.avi will
 be processed through Xuggle.  Xuggle provides the option to use
 many codecs/containers, but you will have to install it on your
 system yourself in order to use this option. Please visit
 link:http://www.xuggle.com/[http://www.xuggle.com/] to learn how to do this.
 
-
 Note that you will not hear any sound if you choose to record sound to
 a file.
 
 
-
 === Basic Example
 
 Here is a complete example showing how to capture both audio and video
 from one of jMonkeyEngine3's advanced demo applications.
 
-
 [source,java]
 ----
 
@@ -226,7 +204,6 @@ through the floor or obstacles due to inaccurate physics simulation,
 but after the end of one user-hour, that ball will have traveled one
 game-mile.
 
-
 When we're recording video, we don't care if the game-time syncs with
 user-time, but instead whether the time in the recorded video
 (video-time) syncs with user-time. To continue the analogy, if we
@@ -236,7 +213,6 @@ video later, we would want to see 30 fps video of the ball rolling at
 took to simulate that hour of game-time to make the high-quality
 recording.
 
-
 The IsoTimer ignores real-time and always reports that the same amount
 of time has passed every time it is called. That way, one can put code
 to write each video/audio frame to a file without worrying about that
@@ -244,29 +220,23 @@ code itself slowing down the game to the point where the recording
 would be useless.
 
 
-
 === Advanced Example
 
 The package from aurellem.com was made for AI research and can do more
 than just record a single stream of audio and video. You can use it
 to:
 
-
 1.) Create multiple independent listeners that each hear the world
 from their own perspective.
 
-
 2.) Process the sound data in any way you wish.
 
-
 3.) Do the same for visual data.
 
-
 Here is a more advanced example, which can also be found along with
 other examples in the jmeCapture.jar file included in the
 distribution.
 
-
 [source,java]
 ----
 
@@ -583,31 +553,23 @@ public class Advanced extends SimpleApplication {
 image:http://www.youtube.com/v/oCEfK0yhDrY?.swf[oCEfK0yhDrY?.swf,with="400",height=""]
 
 
-
 === Using Advanced features to Record from more than one perspective at once
 
 image:http://www.youtube.com/v/WIJt9aRGusc?.swf[WIJt9aRGusc?.swf,with="400",height=""]
 
 
-
 == More Information
 
 This is the old page showing the first version of this idea
 link:http://aurellem.org/cortex/html/capture-video.html[http://aurellem.org/cortex/html/capture-video.html]
 
-
 All source code can be found here:
 
-
 link:http://hg.bortreb.com/audio-send[http://hg.bortreb.com/audio-send]
 
-
 link:http://hg.bortreb.com/jmeCapture[http://hg.bortreb.com/jmeCapture]
 
-
 More information on the modifications to OpenAL to support multiple
 listeners can be found here.
 
-
 link:http://aurellem.org/audio-send/html/ear.html[http://aurellem.org/audio-send/html/ear.html]
-

+ 2 - 29
src/docs/asciidoc/jme3/advanced/cinematics.adoc

@@ -9,17 +9,12 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 JME3 cinematics (com.jme.cinematic) allow you to remote control nodes and cameras in a 3D game: You can script and and play cinematic scenes. You can use cinematics to create link:http://en.wikipedia.org/wiki/Cutscene[cutscenes] and movies/trailers for your game. Another good use case is efficient “destruction physics: Playing back prerecorded flying pieces of debris for demolitions is much faster than calculating them with live physics.
 
-
 Internally, Cinematics are implemented as <<jme3/advanced/application_states#,AppStates>>. 
 
-
 Short overview of the cinematic process:
 
-
-.  Plan the script of your movie. +
-Write down a timeline (e.g. on paper) of which character should be at which spot at which time.
-.  Attach the scene objects that you want to remote-control to one Node. +
-This Node can be the rootNode, or a Node that is attached to the rootNode. 
+.  Plan the script of your movie. +Write down a timeline (e.g. on paper) of which character should be at which spot at which time.
+.  Attach the scene objects that you want to remote-control to one Node. +This Node can be the rootNode, or a Node that is attached to the rootNode. 
 .  Create a Cinematic object for this movie scene. The Cinematic will contain and manage the movie script.
 .  For each line in your script (for each keyframe in your timeline), add a CinematicEvent to the Cinematic. 
 
@@ -33,7 +28,6 @@ This Node can be the rootNode, or a Node that is attached to the rootNode.
 
 A Cinematic is like a movie script for a node. 
 
-
 [source,java]
 ----
 Cinematic cinematic = new Cinematic(sceneNode, duration);
@@ -78,9 +72,7 @@ a|Pauses the cinematic.
 
 Just like a movie script consists of lines with instructions to the actors, each Cinematic consists of a series of events.
 
-
 Here is the list of available CinematicEvents that you use as events. Each track remote-controls scene objects in a different way:
-
 [cols="2", options="header"]
 |===
 
@@ -104,12 +96,10 @@ a|Use this to start playing a model <<jme3/advanced/animation#,animation>> at a
 You can add custom events by extending AbstractCinematicEvent.
 
 
-
 === MotionEvent
 
 A MotionEvent moves a Spatial along a complex path.
 
-
 [source,java]
 ----
 MotionEvent events= new MotionEvent (thingNode, path);
@@ -117,13 +107,11 @@ MotionEvent events= new MotionEvent (thingNode, path);
 
 Details of the constructor:
 
-
 *  `thingNode` is the Spatial to be moved.
 *  `path` is a complex <<jme3/advanced/motionpath#,MotionPath>>.
 
 To create a MotionEvent, do the following:
 
-
 .  <<jme3/advanced/motiontrack#,Create a MotionEvent>>
 .  Create a MotionEvent based on the MotionPath.
 .  Configure your MotionEvent (see below).
@@ -163,12 +151,10 @@ a|Sets the rotation. Use together with `MotionEvent.Direction.Rotation` or `Moti
 *Tip:* Most likely you remote-control more than one object in your scene. Give the events and paths useful names such as `dragonEvent`, `dragonPath`, `heroEvent`, `heroPath`, etc.
 
 
-
 === SoundEvent
 
 A SoundEventplays a sound as part of the cinematic. 
 
-
 [source,java]
 ----
 SoundEvent( audioPath, isStream, duration, loopMode )
@@ -176,7 +162,6 @@ SoundEvent( audioPath, isStream, duration, loopMode )
 
 Details of the constructor:
 
-
 *  `audioPath` is the path to an audio file as String, e.g. “Sounds/mySound.wav.
 *  `isStream` toggles between streaming and buffering. Set to true to stream long audio file, set to false to play short buffered sounds.
 *  `duration` is the time that it should take to play.
@@ -187,7 +172,6 @@ Details of the constructor:
 
 A GuiEventshows or hide a NiftyGUI as part of a cinematic.
 
-
 [source,java]
 ----
 GuiEvent( screen, duration, loopMode )
@@ -195,7 +179,6 @@ GuiEvent( screen, duration, loopMode )
 
 You must use this together with bindUI() to specify the Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ XML file that you want to load:
 
-
 [source,java]
 ----
 cinematic.bindUi("Interface/subtitle.xml");
@@ -203,7 +186,6 @@ cinematic.bindUi("Interface/subtitle.xml");
 
 Details of the constructor:
 
-
 *  `screen` is the name of the Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ screen to load, as String. 
 *  `duration` is the time that it should take to play.
 *  `loopMode` can be LoopMode.Loop, LoopMode.DontLoop, LoopMode.Cycle.
@@ -213,7 +195,6 @@ Details of the constructor:
 
 An AnimationEvent triggers an animation as part of a cinematic.
 
-
 [source,java]
 ----
 AnimationEvent( thingNode, animationName, duration, loopMode )
@@ -221,7 +202,6 @@ AnimationEvent( thingNode, animationName, duration, loopMode )
 
 Details of the constructor:
 
-
 *  `thingNode` is the Spatial whose animation you want to play.
 *  `animationName` the name of the animation stored in the animated model that you want to trigger, as a String.
 *  `duration` is the time that it should take to play.
@@ -232,10 +212,8 @@ Details of the constructor:
 
 There is a built in system for camera switching in Cinematics. It based on CameraNode, and the cinematic just enable the given CameraNode control at a given time.
 
-
 First you have to bind a camera to the cinematic with a unique name. You'll be provided with a CameraNode
 
-
 [source,java]
 ----
 
@@ -246,7 +224,6 @@ First you have to bind a camera to the cinematic with a unique name. You'll be p
 then you can do whatever you want with this camera node : place it so that you have a the camera angle you'd like, attach it to a motion event to have some camera scrolling, attach control of your own that give it whatever behavior you'd like.
 In the above example, I want it to be a top view of the scene looking at the world origin.
 
-
 [source,java]
 ----
 
@@ -259,7 +236,6 @@ In the above example, I want it to be a top view of the scene looking at the wor
 
 Then i just have to schedule its activation in the cinematic. I want it to get activated 3 seconds after the start of the cinematic so I just have to do 
 
-
 [source,java]
 ----
 
@@ -272,11 +248,9 @@ Then i just have to schedule its activation in the cinematic. I want it to get a
 
 You can extend individual CinematicEvents. The link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/animation/SubtitleTrack.java[SubtitleTrack.java example] shows how to extend a GuiTrack to script subtitles. See how the subtitles are used in the link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/animation/TestCinematic.java[TestCinematic.java example].
 
-
 You can also create new CinematicEvent by extending link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-core/src/main/java/com/jme3/cinematic/events/AbstractCinematicEvent.java[AbstractCinematicEvent]. An AbstractCinematicEvent implements the CinematicEvent interface and provides duration, time, speed, etc… management. Look at the link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/animation/TestCinematic.java[TestCinematic.java example] is to use this for a custom fadeIn/fadeOut effect in combination with a com.jme3.post.filters.FadeFilter.
 
 
-
 == Interacting with Cinematics
 
 
@@ -307,4 +281,3 @@ cinematic.addListener(cel);
 === Physics Interaction
 
 Upcoming.
-

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

@@ -9,22 +9,17 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 The term collision can be used to refer to <<jme3/advanced/physics_listeners#,physical interactions>> (where <<jme3/advanced/physics#,physical objects>> collide, push and bump off one another), and also to non-physical _intersections_ in 3D space. This article is about the non-physical (mathematical) collisions.
 
-
 Non-physical collision detection is interesting because it uses less computing resources than physical collision detection. The non-physical calculations are faster because they do not have any side effects such as pushing other objects or bumping off of them. Tasks such as <<jme3/advanced/mouse_picking#,mouse picking>> are easily implemented using mathematical techniques such as ray casting and intersections.  Experienced developers optimize their games by finding ways to simulate certain (otherwise expensive physical) interactions in a non-physical way. 
 
-
 *Example:* One example for an optimization is a physical vehicle's wheels. You could make the wheels fully physical disks, and have jME calculate every tiny force – sounds very accurate? It's total overkill and too slow for a racing game. A more performant solution is to cast four invisible rays down from the vehicle and calculate the intersections with the floor. These non-physical wheels require (in the simplest case) only four calculations per tick to achieve an effect that players can hardly distinguish from the real thing.
 
 
-
 == Collidable
 
 The interface com.jme3.collision.Collidable declares one method that returns how many collisions were found between two Collidables: `collideWith(Collidable other, CollisionResults results)`.
 
-
 *  A `com.jme3.collision.CollisionResults` object is an ArrayList of comparable `com.jme3.collision.CollisionResult` objects.
-*  You can iterate over the CollisionResults to identify the other parties involved in the collision. +
-Note that jME counts _all_ collisions, this means a ray intersecting a box will be counted as two hits, one on the front where the ray enters, and one on the back where the ray exits.
+*  You can iterate over the CollisionResults to identify the other parties involved in the collision. +Note that jME counts _all_ collisions, this means a ray intersecting a box will be counted as two hits, one on the front where the ray enters, and one on the back where the ray exits.
 [cols="2", options="header"]
 |===
 
@@ -46,7 +41,6 @@ a|Returns the CollisionResult at index i.
 |===
 
 A CollisionResult object contains information about the second party of the collision event.
-
 [cols="2", options="header"]
 |===
 
@@ -78,10 +72,8 @@ a|Returns the index of the triangle on the second party's mesh that was hit.
 
 Assume you have two collidables a and b and want to detect collisions between them. The collision parties can be Geometries, Nodes with Geometries attached (including the rootNode), Planes, Quads, Lines, or Rays. An important restriction is that you can only collide geometry vs bounding volumes or rays. (This means for example that a must be of Type Node or Geometry and b respectively of Type BoundingBox, BoundingSphere or Ray.)
 
-
 The following code snippet can be triggered by listeners (e.g. after an input action such as a click), or timed in the update loop.
 
-
 [source,java]
 ----
 
@@ -105,7 +97,6 @@ The following code snippet can be triggered by listeners (e.g. after an input ac
 
 You can also loop over all results and trigger different reactions depending on what was hit and where it was hit. In this example, we simply print info about them.
 
-
 [source,java]
 ----
 
@@ -132,24 +123,19 @@ You can also loop over all results and trigger different reactions depending on
 Knowing the distance of the collisions is useful for example when you intersect Lines and Rays with other objects.
 
 
-
 == Bounding Volumes
 
 A `com.jme3.bounding.BoundingVolume` is an interface for dealing with containment of a collection of points. All BoundingVolumes are `Collidable` and are used as optimization to calculate non-physical collisions more quickly: It's always faster to calculate an intersection between simple shapes like spheres and boxes than between complex shapes like models. 
 
-
 jME3 computes bounding volumes for all objects. These bounding volumes are later used for frustum culling, which is making sure only objects visible on-screen are actually sent for rendering. 
 
-
 All fast-paced action and shooter games use BoundingVolumes as an optimization. Wrap all complex models into simpler shapes – in the end, you get equally useful collision detection results, but faster. link:http://en.wikipedia.org/wiki/Bounding_volume[More about bounding volumes...]
 
-
 Supported types:
 
 image::http://www.jmonkeyengine.com/jme/wiki-data/userref/capsule.png[Capsule,with="150",height="110",align="right"]
 
 
-
 *  Type.AABB = Axis-aligned bounding box, that means it doesn't rotate, which makes it less precise. A `com.jme3.bounding.BoundingBox` is an axis-aligned cuboid used as a container for a group of vertices of a piece of geometry. A BoundingBox has a center and extents from that center along the x, y and z axis. This is the default bounding volume, since it is fairly fast to generate and gives better accuracy than the bounding sphere.
 *  Type.Sphere: `com.jme3.bounding.BoundingSphere` is a sphere used as a container for a group of vertices of a piece of geometry. A BoundingSphere has a center and a radius.
 *  Type.OBB = Oriented bounding box. This bounding box is more precise because it can rotate with its content, but is computationally more expensive. (Currently not supported.)
@@ -163,12 +149,10 @@ Note: If you are looking for bounding volumes for physical objects, use <<jme3/a
 
 
 
-
 === Usage
 
 For example you can use Bounding Volumes on custom meshes, or complex non-physical shapes.
 
-
 [source,java]
 ----
 mesh.setBound(new BoundingSphere());
@@ -181,15 +165,12 @@ mesh.updateBound();
 One of the supported `Collidable`s are meshes and scene graph objects. To execute a collision detection query against a scene graph, use `Spatial.collideWith()`. This will traverse the scene graph and return any mesh collisions that were detected. Note that the first collision against a particular scene graph may take a long time, this is because a special data structure called link:http://en.wikipedia.org/wiki/Bounding_interval_hierarchy[|Bounding Interval Hierarchy (BIH)] needs to be generated for the meshes. At a later point, the mesh could change and the BIH tree would become out of date, in that case, call link:http://jmonkeyengine.org/javadoc/com/jme3/scene/Mesh.html#createCollisionData()[Mesh.createCollisionData()] on the changed mesh to update the BIH tree.
 
 
-
 == Intersection
 
 A `com.jme3.math.Ray` is an infinite line with a beginning, a direction, and no end; whereas a `com.jme3.math.Line` is an infinite line with only a direction (no beginning, no end).
 
-
 Rays are used to perform line-of-sight calculations. This means you can detect what users were “aiming at when they clicked or pressed a key. You can also use this to detect whether game characters can see something (or someone) or not.
 
-
 *  *Click to select:* You can determine what a user has clicked by casting a ray from the camera forward in the direction of the camera. Now identify the closest collision of the ray with the rootNode, and you have the clicked object.
 *  *Line of sight:* Cast a ray from a player in the direction of another player. Then you detect all collisions of this ray with other entities (walls versus foliage versus window panes) and use this to calculate how likely it is that one can see the other.
 
@@ -200,13 +181,10 @@ These simple but powerful ray-surface intersection tests are called Ray Casting.
 ====
 
 
-
 Learn the details of how to implement <<jme3/advanced/mouse_picking#,Mouse Picking>> here.
-
 '''
 
 TODO:
 
-
 *  Bounding Interval Hierarchy (`com.jme3.collision.bih.BIHNode`)
 *  com.jme3.scene.CollisionData

+ 7 - 33
src/docs/asciidoc/jme3/advanced/combo_moves.adoc

@@ -10,13 +10,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 The ComboMoves class allows you to define combinations of inputs that trigger special actions. Entering an input combo correctly can bring the player incremental rewards, such as an increased chance to hit, an increased effectiveness, or decreased change of being blocked, whatever the game designer chooses. link:http://en.wikipedia.org/wiki/Combo_%28video_gaming%29[More background info]
 
-
 Combos are usually a series of inputs, in a fixed order: For example a keyboard combo can look  like: “press Down, then Down+Right together, then Right. 
 
-
 Usage:
 
-
 .  Create input triggers 
 .  Define combos
 .  Detect combos in ActionListener 
@@ -25,7 +22,6 @@ Usage:
 Copy the two classes ComboMoveExecution.java and ComboMove.java into your application and adjust them to your package paths.
 
 
-
 == Example Code
 
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/combomoves/TestComboMoves.java[TestComboMoves.java]
@@ -37,10 +33,8 @@ Copy the two classes ComboMoveExecution.java and ComboMove.java into your applic
 
 First you <<jme3/advanced/input_handling#,define your game's inputs>> as you usually do: Implement the com.jme3.input.controls.ActionListener interface for your class, and add triggers mappings such as com.jme3.input.controls.KeyTrigger and com.jme3.input.KeyInput. 
 
-
 For example:
 
-
 [source,java]
 ----
 
@@ -59,10 +53,8 @@ inputManager.addListener(this, "Left", "Right", "Up", "Down", "Attack1");
 
 For each of  your combo moves, you specify the series of inputs that will trigger it. The order in which you define them is the order the player has to press them for the step to be recorded. When all steps have been recorded, the combo is triggered. 
 
-
 The following example shows how a fireball combo move is triggered by pressing the navigation keys for “down, down+right, right, in this order.
 
-
 [source,java]
 ----
 
@@ -77,7 +69,6 @@ fireball.setUseFinalState(false);
 
 Also create a ComboMoveExecution object for each ComboMove. You need it later to execute the detected combo.
 
-
 [source,java]
 ----
 
@@ -89,46 +80,35 @@ ComboMoveExecution fireballExec = new ComboMoveExecution(fireball);
 === ComboMove Class Methods
 
 Use the following ComboMove methods to specify the combo:
-
 [cols="2", options="header"]
 |===
 
 a|ComboMove Method
 a|Description
 
-a|press(“A).done(); +
-press(“A,“B).done();
-a|Combo step is recorded if A is entered. +
-Combo step is recorded if A and B are entered simultaneously.
+a|press(“A).done(); +press(“A,“B).done();
+a|Combo step is recorded if A is entered. +Combo step is recorded if A and B are entered simultaneously.
 
-a|notPress(“A).done(); +
-notPress(“A,“B).done();
-a|Combo step is recorded if A is released. +
-Combo step is recorded if A and B are both released.
+a|notPress(“A).done(); +notPress(“A,“B).done();
+a|Combo step is recorded if A is released. +Combo step is recorded if A and B are both released.
 
 a|press(“A).notPress(“B).done();
 a|Combo step is recorded if A is entered, and not B
 
 a|press(“A).notPress(“B).timeElapsed(0.11f).done();
-a|Combo step is recorded a certain time after A and not B is entered. +
-etc, etc …
+a|Combo step is recorded a certain time after A and not B is entered. +etc, etc …
 
 a|setPriority(0.5f);
 a|If there is an ambiguity, a high-priority combo will trigger instead of a low-priority combo. This prevents that a similar looking combo step “hijacks another Combo. Use only once per ComboMove.
 
-a|setUseFinalState(false); +
-setUseFinalState(true);
-a|This is the final command of the series. +
-False: Do not wait on a final state, chain combo steps. (?) +
-True: This is the final state, do not chain combo steps. (?)
+a|setUseFinalState(false); +setUseFinalState(true);
+a|This is the final command of the series. +False: Do not wait on a final state, chain combo steps. (?) +True: This is the final state, do not chain combo steps. (?)
 
 |===
 
 The `press()` and `notPress()` methods accept sets of Input Triggers, e.g. `fireball.press(“A,“B,“C).done()`.
 
-
 The following getters give you more information about the game state:
-
 [cols="2", options="header"]
 |===
 
@@ -151,13 +131,10 @@ a|Returns the priority of this move
 
 Now that you have specified the combo steps, you want to detect them. You do that in the onAction() method that you get from the ActionListener interface.
 
-
 Create a HashSet `pressMappings` to track curently pressed mappings, and a ComboMove object `currentMove` to track the current move. 
 
-
 We also track the cast time of a combo to determine if it has timed out (see update loop below).
 
-
 [source,java]
 ----
 
@@ -210,7 +187,6 @@ public void onAction(String name, boolean isPressed, float tpf) {
 
 Now that you have detected the current move, you want to execute it. You do that in the update loop.
 
-
 [source,java]
 ----
 
@@ -235,11 +211,9 @@ public void simpleUpdate(float tpf){
 Test `currentMove.getMoveName()` and proceed to call methods that implement any special actions and bonuses. This is up to you and depends individually on your game.
 
 
-
 == Why Combos?
 
 Depending on the game genre, the designer can reward the players' intrinsical or extrinsical skills:
 
-
 *  (intrinsical:) RPGs typically calculate the success of an attack from the character's in-game training level: The player plays the role of a character whose skill level is defined in numbers. RPGs typically do not offer any Combos.
 *  (extrinsical:) Sport and fighter games typically choose to reward the player's “manual skills: The success of a special move solely depends on the player's own dexterity. These games typically offer optional Combos.

+ 3 - 30
src/docs/asciidoc/jme3/advanced/custom_controls.adoc

@@ -9,17 +9,13 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 A `com.jme3.scene.control.Control` is a customizable jME3 interface that allows you to cleanly steer the behaviour of game entities (Spatials), such as artificially intelligent behaviour in NPCs, traps, automatic alarms and doors, animals and pets, self-steering vehicles or platforms – anything that moves and interacts. Several instances of custom Controls together implement the behaviours of a type of Spatial. 
 
-
 To control global game behaviour see <<jme3/advanced/application_states#,Application States>> – you often use AppStates and Control together.
 
-
 *  link:http://www.youtube.com/watch?v=MNDiZ9YHIpM[Quick video introduction to Custom Controls]
 
 To control the behaviour of spatials:
 
-
-.  Create one control for each _type of behavior_. When you add several controls to one spatial, they will be executed in the order they were added. +
-For example, one NPC can be controlled by a PhysicsControl instance and an AIControl instance.
+.  Create one control for each _type of behavior_. When you add several controls to one spatial, they will be executed in the order they were added. +For example, one NPC can be controlled by a PhysicsControl instance and an AIControl instance.
 .  Define the custom control and implement its behaviour in the Control's update method:
 **  You can pass arguments into your custom control.
 **  In the control class, the object `spatial` gives you access to the spatial and subspatials that the control is attached to.
@@ -35,12 +31,10 @@ spatial.addControl(myControl);
 To implement game logic for a type of spatial, you will either extend AbstractControl (most common case), or implement the Control interface, as explained in this article.
 
 
-
 == Usage
 
 Use <<jme3/advanced/custom_controls#,Controls>> to implement the _behaviour of types of game entities_.
 
-
 *  Use Controls to add a type of behaviour (that is, methods and fields) to individual Spatials. 
 *  Each Control has its own `update()` loop that hooks into `simpleUpdate()`. Use Controls to move blocks of code out of the `simpleUpdate()` loop.
 *  One Spatial can be influenced by several Controls. (Very powerful and modular!) 
@@ -50,7 +44,6 @@ Use <<jme3/advanced/custom_controls#,Controls>> to implement the _behaviour of t
 
 Examples: You can write
 
-
 *  A WalkerNavControl, SwimmerNavControl, FlyerNavControl… that defines how a type of NPC finds their way around. All NPCs can walk, some can fly, others can swim, and some can all three, etc.
 *  A PlayerNavControl that is steered by user-configurable keyboard and mouse input.
 *  A generic animation control that acts as a common interface that triggers animations (walk, stand, attack, defend) for various entities.
@@ -61,15 +54,12 @@ Examples: You can write
 The possibilities are endless. emoji:smiley
 
 
-
 == Example Code
 
 Other examples include the built-in RigidBodyControl in JME's physics integration, the built-in TerrainLODControl that updates the terrain's level of detail depending on the viewer's perspective, etc.
 
-
 Existing examples in the code base include:
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/animation/AnimControl.java[AnimControl.java] allows manipulation of skeletal animation, including blending and multiple channels.
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/control/CameraControl.java[CameraControl.java] allows you to sync the camera position with the position of a given spatial.
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/control/BillboardControl.java[BillboardControl.java] displays a flat picture orthogonally, e.g. a speech bubble or informational dialog.
@@ -85,19 +75,15 @@ The most common way to create a Control is to create a class that extends Abstra
 ====
 
 
-
 The AbstractControl can be found under `com.jme3.scene.control.AbstractControl`. This is a default abstract class that implements the Control interface.
 
-
 *  You have access to a boolean `isEnabled()`.
 *  You have access to the Spatial object `spatial`. 
 *  You override the `controlUpdate()` method to implement the Spatial's behaviour. 
-*  You have access to a `setEnabled(boolean)` method. This activates or deactivates this Control's behaviour in this spatial temporarily. While the AbstractControl is toggled to be disabled, the `controlUpdate()` loop is no longer executed. +
-For example, you disable your IdleBehaviourControl when you enable your DefensiveBehaviourControl in a spatial.
+*  You have access to a `setEnabled(boolean)` method. This activates or deactivates this Control's behaviour in this spatial temporarily. While the AbstractControl is toggled to be disabled, the `controlUpdate()` loop is no longer executed. +For example, you disable your IdleBehaviourControl when you enable your DefensiveBehaviourControl in a spatial.
 
 Usage: Your custom subclass implements the three methods `controlUpdate()`, `controlRender()`, `setSpatial()`, and `cloneForSpatial()` as shown here:
 
-
 [source,java]
 ----
 
@@ -170,7 +156,6 @@ public class MyControl extends AbstractControl implements Savable, Cloneable {
 
 See also:
 
-
 *  To learn more about `write()` and `read()`, see <<jme3/advanced/save_and_load#,Save and Load>>
 *  To learn more about `setUserData()`, see <<jme3/advanced/spatial#,Spatial>>.
 
@@ -184,20 +169,15 @@ In the less common case that you want to create a Control that also extends anot
 ====
 
 
-
 The Control interface can be found under `com.jme3.scene.control.Control`. It has the following method signatures:
 
-
-*  `cloneForSpatial(Spatial)`: Clones the Control and attaches it to a clone of the given Spatial. +
-Implement this method to be able to <<jme3/advanced/save_and_load#,save() and load()>> Spatials carrying this Control. +
-The AssetManager also uses this method if the same spatial is loaded twice. You can specify which fields you want your object to reuse (e.g. collisionshapes) in this case. 
+*  `cloneForSpatial(Spatial)`: Clones the Control and attaches it to a clone of the given Spatial. +Implement this method to be able to <<jme3/advanced/save_and_load#,save() and load()>> Spatials carrying this Control. +The AssetManager also uses this method if the same spatial is loaded twice. You can specify which fields you want your object to reuse (e.g. collisionshapes) in this case. 
 *  `setEnabled(boolean)`: Toggles a boolean that enables or disables the Control. Goes with accessor `isEnabled();`. You test for it in the `update(float tpf)` loop before you execute anything.
 *  There are also some internal methods that you do not call from user code: `setSpatial(Spatial s)`, `update(float tpf);`, `render(RenderManager rm, ViewPort vp)`.
 
 Usage example:
 1. Create a custom control interface
 
-
 [source,java]
 ----
 public interface MyControlInterface extends Control {
@@ -207,7 +187,6 @@ public interface MyControlInterface extends Control {
 
 2. Create custom Controls implementing your Control interface.
 
-
 [source,java]
 ----
 public class MyControl extends MyCustomClass implements MyControlInterface {
@@ -284,7 +263,6 @@ public class MyControl extends MyCustomClass implements MyControlInterface {
 *Tip:* Use the getControl() accessor to get Control objects from Spatials. No need to pass around lots of object references.
 Here an example from the link:http://code.google.com/p/monkeyzone/[MonkeyZone] code:
 
-
 [source,java]
 ----
 
@@ -301,7 +279,6 @@ public class CharacterAnimControl implements Control {
 
 *Tip:* You can create custom Control interfaces so a set of different Controls provide the same methods and can be accessed with the interface class type.
 
-
 [source,java]
 ----
 public interface ManualControl extends Control {
@@ -316,7 +293,6 @@ public interface ManualControl extends Control {
 
 Then you create custom sub-Controls and implement the methods accordingly to the context:
 
-
 [source,java]
 ----
 public class ManualVehicleControl   extends ManualControl {...}
@@ -324,7 +300,6 @@ public class ManualVehicleControl   extends ManualControl {...}
 
  and
 
-
 [source,java]
 ----
 public class ManualCharacterControl extends ManualControl {...}
@@ -332,7 +307,6 @@ public class ManualCharacterControl extends ManualControl {...}
 
 Then add the appropriate controls to spatials:
 
-
 [source,java]
 ----
 
@@ -344,7 +318,6 @@ vehicleSpatial.addControl(new ManualVehicleControl());
 
 *Tip:* Use the getControl() method on a Spatial to get a specific Control object, and activate its behaviour!
 
-
 [source,java]
 ----
 ManualControl c = mySpatial.getControl(ManualControl.class);

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

@@ -13,10 +13,8 @@ image::http://wiki.jmonkeyengine.org/lib/exe/fetch.php/jme3:advanced:custom_mesh
 
 Use the Mesh class to create custom shapes that go beyond Quad, Box, Cylinder, and Sphere, even procedural shapes are possible. Thank you to KayTrance for providing the sample code!
 
-
 *Note:* In this tutorial, we (re)create a very simple rectangular mesh (a quad), and we have a look at different ways of coloring it. Coding a custom quad may not be very useful because it's exactly the same as the built-in `com.jme3.scene.shape.Quad`. We chose a simple quad to teach you how to build any shape out of triangles, without the distractions of more complex shapes.
 
-
 *  Full code sample: link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/model/shape/TestCustomMesh.java[TestCustomMesh.java]
 
 
@@ -24,22 +22,17 @@ Use the Mesh class to create custom shapes that go beyond Quad, Box, Cylinder, a
 
 Polygon <<jme3/advanced/mesh#,mesh>>es are made up of triangles. The corners of the triangles are called vertices. When ever you create any new shape, you break it down into triangles.
 
-
 *Example:* Let's look at a cube. A cube is made up of 6 rectangles. Each rectangle can be broken down into two triangles. This means you need 12 triangles to describe a cube mesh. Therefor you must provide the coordinates of the triangles' 8 corners (called vertices). 
 
-
 The important thing is that you have to specify the vertices of each triangle in the right order: Each triangle separately, counter-clockwise. 
 
-
 Sounds harder than it is – let's create a simple custom mesh, a quad.
 
 
-
 == Creating a Quad Mesh
 
 In this tutorial we want to create a 3x3 Quad. The quad has four vertices, and is made up of two triangles. In our example, we decide that the bottom left corner is at 0/0/0 and the top right is at 3/3/0. 
 
-
 [source]
 ----
 0,3,0--3,3,0
@@ -56,7 +49,6 @@ In this tutorial we want to create a 3x3 Quad. The quad has four vertices, and i
 
 The base class for creating meshes is `com.jme3.scene.Mesh`.
 
-
 [source,java]
 ----
 Mesh mesh = new Mesh();
@@ -65,12 +57,10 @@ Mesh mesh = new Mesh();
 Tip: If you create your own Mesh-based class (`public class MyMesh extends Mesh {  }`), replace the variable `mesh` by `this` in the following examples.
 
 
-
 === Vertex Coordinates
 
 To define your own shape, determine the shape's *vertex coordinates* in 3D space. Store the list of corner positions in an `com.jme3.math.Vector3f` array. For a Quad, we need four vertices: Bottom left, bottom right, top left, top right. We name the array `vertices[]`.
 
-
 [source,java]
 ----
 
@@ -87,7 +77,6 @@ vertices[3] = new Vector3f(3,3,0);
 
 Next, we define the Quad's 2D *texture coordinates* for each vertex, in the same order as the vertices: Bottom left, bottom right, top left, top right. We name this Vector2f array `texCoord[]`
 
-
 [source,java]
 ----
 
@@ -102,15 +91,12 @@ texCoord[3] = new Vector2f(1,1);
 This syntax means, when you apply a texture to this mesh, the texture will fill the quad from corner to corner at 100% percent size. Especially when you stitch together a larger mesh, you use this to tell the renderer whether, and how exactly, you want to cover the whole mesh. E.g. if you use .5f or 2f as texture coordinates instead of 1f, textures will be stretched or shrunk accordingly.
 
 
-
 === Connecting the Dots
 
 Next we turn these unrelated coordinates into *triangles*: We define the order in which each triangle is constructed. Think of these indexes as coming in groups of three. Each group of indexes describes one triangle. If the corners are identical, you can (and should!) reuse an index for several triangles. 
 
-
 Remember that you must specify the vertices counter-clockwise. 
 
-
 [source,java]
 ----
 
@@ -120,7 +106,6 @@ int [] indexes = { 2,0,1, 1,3,2 };
 
 This syntax means:
 
-
 *  The indices 0,1,2,3 stand for the four vertices that you specified for the quad in `vertices[]`.
 *  The 2,0,1 triangle starts at top left, continues bottom left, and ends at bottom right.
 *  The 1,3,2 triangle start at bottom right, continues top right, and ends at top left.
@@ -138,7 +123,6 @@ This syntax means:
 If the shape is more complex, it has more triangles, and therefor also more vertices/indices. Just continue expanding the list by adding groups of three indices for each triangle. (For example a three-triangle “house shape has 5 vertices/indices and you'd specify three groups: `int [] indexes = { 2,0,1, 1,3,2, 2,3,4 };`.) 
 
 
-
 [TIP]
 ====
 If you get the order wrong (clockwise) for some of the triangles, then these triangles face backwards. If the <<jme3/advanced/spatial#,Spatial>>'s material uses the default `FaceCullMode.Back` (see “face culling), the broken triangles appear as holes in the rendered mesh. You need to identify and fix them in your code.
@@ -146,12 +130,10 @@ If you get the order wrong (clockwise) for some of the triangles, then these tri
 
 
 
-
 === Setting the Mesh Buffer
 
 You store the Mesh data in a buffer.
 
-
 .  Using `com.jme3.util.BufferUtils`, we create three buffers for the three types of information we have:
 **  vertex coordinates,
 **  texture coordinates,
@@ -174,12 +156,10 @@ mesh.updateBound();
 Our Mesh is ready! Now we want to see it.
 
 
-
 == Using the Mesh in a Scene
 
 We create a `com.jme3.scene.Geometry` and `com.jme3.material.Material`from our `mesh`, apply a simple color material to it, and attach it to the rootNode to make it appear in the scene.
 
-
 [source,java]
 ----
 
@@ -196,12 +176,10 @@ Library for assetManager?
 Ta-daa!
 
 
-
 == Using a Quad instead
 
 We created a quad Mesh it can be replace by a Quad such as :
 
-
 [source,java]
 ----
 
@@ -217,7 +195,6 @@ rootNode.attachChild(geo);
 
 If you want to change the Textures Coordinates, in order to change the scale of the texture, use :
 
-
 [source,java]
 ----
 
@@ -231,28 +208,23 @@ quad.scaleTextureCoordinates(new Vector2f(width , height));
 
 If you are modifying a mesh dynamically in a way which changes the model's bounds, you need to update it:
 
-
 .  Call `updateBound()` on the mesh object, and then 
 .  call `updateModelBound()` on the Geometry object containing the mesh. 
 
 The updateModelBound() method warns you about not usually needing to use it, but that can be ignored in this special case.
 
-
 _N.B.: This does not work on TerrainQuad.  Please use the TerrainQuad.adjustHeight() function to edit the TerrainQuad mesh instead.  Additionally, if you want to use collisions on them afterwards, you need to call TerrainPatch.getMesh().createCollisionData(); to update the collision data, else it will collide with what seems to be the old mesh. _
 
 
-
 == Optional Mesh Features
 
 There are more vertex buffers in a Mesh than the three shown above. For an overview, see also <<jme3/advanced/mesh#,mesh>>.
 
 
-
 === Example: Vertex Colors
 
 Vertex coloring is a simple way of coloring meshes. Instead of just assigning one solid color, each vertex (corner) has a color assigned. The faces between the vertices are then colored with a gradient. For this demo, you can use the same mesh `mesh` object that you defined above.
 
-
 [source,java]
 ----
 Geometry geo = new Geometry ("ColoredMesh", mesh); // using the custom mesh
@@ -262,7 +234,6 @@ matVC.setBoolean("VertexColor", true);
 
 You create a float array color buffer:
 
-
 *  Assign 4 color values, RGBA, to each vertex.
 **  To loop over the 4 color values, use a color index 
 [source,java]
@@ -289,7 +260,6 @@ float[] colorArray = new float[yourVertexCount * 4]
 
 Loop over the colorArray buffer to quickly set some RGBA value for each vertex. As usual, RGBA color values range from 0.0f to 1.0f. *Note that the color values in this example are arbitrarily chosen.* It's just a quick loop to give every vertex a different RGBA value (a purplish gray, purple, a greenish gray, green, see screenshot), without writing too much code. For your own mesh, you'd assign meaningful values for the color buffer depending on which color you want your mesh to have.
 
-
 [source,java]
 ----
 
@@ -308,7 +278,6 @@ for(int i = 0; i < 4; i++){
 
 Next, set the color buffer. An RGBA color value contains four float components, thus the parameter `4`.
 
-
 [source,java]
 ----
 mesh.setBuffer(Type.Color, 4, colorArray);
@@ -319,12 +288,10 @@ geo.setMaterial(matVC);
 When you run this code, you see a gradient color extending from each vertex.
 
 
-
 === Example: Using Meshes With Lighting.j3md
 
 The previous examples used the mesh together with the `Unshaded.j3md` material. If you want to use the mesh with a Phong illuminated material (such as `Lighting.j3md`), the mesh must include information about its Normals. (Normal Vectors encode in which direction a mesh polygon is facing, which is important for calculating light and shadow!)
 
-
 [source,java]
 ----
 
@@ -336,16 +303,13 @@ mesh.setBuffer(Type.Normal, 3, BufferUtils.createFloatBuffer(normals));
 
 You need to specify as many normals as the polygon has vertices. For a flat quad, the four normals point in the same direction. In this case, the direction is the Z unit vector (0,0,1), this means our quad is facing the camera. 
 
-
 If the mesh is more complex or rounded, calculate cross products of neighbouring vertices to identify normal vectors!
 
 
-
 === Example: Point Mode
 
 Additionally to coloring the faces as just described, you can hide the faces and show only the vertices as colored corner points. 
 
-
 [source,java]
 ----
 Geometry coloredMesh = new Geometry ("ColoredMesh", cMesh);
@@ -364,18 +328,14 @@ rootNode.attachChild(geo);
 This will result in a 10 px dot being rendered for each of the four vertices. The dot has the vertex color you specified above. The Quad's faces are not rendered at all in this mode. You can use this to visualize a special debugging or editing mode in your game.
 
 
-
 == Debugging Tip: Culling
 
 By default, jME3 optimizes a mesh by “backface culling, this means not drawing the inside. It determines the side of a triangle by the order of the vertices: The frontface is the face where the vertices are specified counter-clockwise.
 
-
 This means for you that, by default, your custom mesh is invisible when seen from “behind or from the inside. This may not be a problem, typically this is even intended, because it's faster. The player will not look at the inside of most things anyway. For example, if your custom mesh is a closed polyhedron, or a flat wallpaper-like object, then rendering the backfaces (the inside of the pillar, the back of the painting, etc) would indeed be a waste of resources.
 
-
 In case however that your usecase requires the backfaces be visible, you have two options:
 
-
 *  If you have a very simple scene, you can simply deactivate backface culling for this one mesh's material. 
 [source]
 ----
@@ -392,6 +352,5 @@ int[] indexes = { 2,0,1, 1,3,2, 2,3,1, 1,0,2 };
 
 See also: 
 
-
 *  <<jme3/advanced/spatial#,Spatial>> – contains more info about how to debug custom meshes (that do not render as expected) by changing the default culling behaviour.
 *  <<jme3/advanced/mesh#,Mesh>> – more details about advanced Mesh properties

+ 0 - 17
src/docs/asciidoc/jme3/advanced/debugging.adoc

@@ -9,22 +9,17 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 When you deal with complex game engine features like animations or physics it is handy to get feedback from the engine how it interpreted the current state. Is the physical object's collision shape really where you think it is? Is the skeleton of the animated character moving like you think it should? This document shows you how to activate visual debug aides.
 
-
 What if you just want to quickly write code that loads models and brings them in their start position? You may not want to hunt for a sample model, convert it, add lights, and load materials. Instead you use “hasslefree simple shapes, and a “hasslefree unshaded material or wireframe: No model, no light source, no materials are needed to see them in your test scene. 
 
-
 If you ever have problems with objects appearing in the wrong spot, with the wrong scale, or wrong orientation, simply attach debug shapes to your scene to have a point of reference in 3D space – just like a giant ruler. If your code positions the debug shapes correctly, but models remain invisible when you apply the same code to them, you know that the problem must be either the model (where is its origin coordinate?), or the light (too dark? too bright? missing?), or the model's material (missing?) – and not the positioning code.
 
-
 Here are some different debug shapes: 
 
 
-
 image::jme3/advanced/debug-shapes.png[debug-shapes.png,with="600",height="220",align="center"]
 
 
 
-
 == Debug Shapes
 
 
@@ -32,7 +27,6 @@ image::jme3/advanced/debug-shapes.png[debug-shapes.png,with="600",height="220",a
 
 The coordinate axes (com.jme3.scene.debug.Arrow) help you see the cardinal directions (X,Y,Z) from their center point. Scale the arrows to use them as a “ruler for a certain length. 
 
-
 [source,java]
 ----
 
@@ -66,7 +60,6 @@ private Geometry putShape(Mesh shape, ColorRGBA color){
 
 Use a wireframe grid (com.jme3.scene.debug.Grid) as a ruler or simple floor.
 
-
 [source,java]
 ----
 
@@ -87,7 +80,6 @@ private Geometry attachGrid(Vector3f pos, float size, ColorRGBA color){
 
 Use a wireframe cube (com.jme3.scene.debug.WireBox) as a stand-in object to see whether your code scales, positions, or orients, loaded models right.
 
-
 [source,java]
 ----
 
@@ -108,7 +100,6 @@ public Geometry attachWireBox(Vector3f pos, float size, ColorRGBA color){
 
 Use a wireframe sphere (com.jme3.scene.debug.WireSphere) as a stand-in object to see whether your code scales, positions, or orients, loaded models right.
 
-
 [source,java]
 ----
 
@@ -129,7 +120,6 @@ private Geometry attachWireSphere(Vector3f pos, float size, ColorRGBA color){
 
 You can display a wireframe of the (usually invisible) collision shape around all physical objects. Use this for debugging when analyzing unexpected behaviour. Does not work with DETACHED physics, please switch to PARALLEL or SEQUENTIAL for debugging.
 
-
 [source,java]
 ----
 physicsSpace.enableDebug(assetManager);
@@ -137,7 +127,6 @@ physicsSpace.enableDebug(assetManager);
 
 With debugging enabled, colors are used to indicate various types of physical objects:
 
-
 *  A magenta wire mesh indicates an active rigid body.
 *  A blue wire mesh indicates a rigid body which is either new or inactive.
 *  A yellow wire mesh indicates a ghost.
@@ -149,7 +138,6 @@ With debugging enabled, colors are used to indicate various types of physical ob
 
 Making the skeleton visible inside animated models can be handy for debugging animations. The `control` object is an AnimControl, `player` is the loaded model.
 
-
 [source,java]
 ----
 
@@ -167,10 +155,8 @@ Making the skeleton visible inside animated models can be handy for debugging an
 
 We assume that you have loaded a model with a material `mat`.
 
-
 Then you can add a switch to toggle the model's wireframe on and off, like this:
 
-
 .  Create a key input trigger that switches between the two materials: E.g. we toggle when the T key is pressed: 
 [source,java]
 ----
@@ -223,12 +209,10 @@ Then you can add a switch to toggle the model's wireframe on and off, like this:
 TIP :: To set the line width of wireframe display, use mesh.setLineWidth(lineWidth). Default line width is 1.
 
 
-
 == Example: Toggle Wireframe on the scene
 
 To display the wireframe of the entire scene instead on one material at a time, first create the following Scene Processor
 
-
 [source,java]
 ----
 public class WireProcessor implements SceneProcessor {    
@@ -274,7 +258,6 @@ public class WireProcessor implements SceneProcessor {
 
 Then attach the scene processor to the +++<abbr title="Graphical User Interface">GUI</abbr>+++ Viewport.
 
-
 [source,java]
 ----
 getViewPort().addProcessor(new WireProcessor());

+ 0 - 22
src/docs/asciidoc/jme3/advanced/effects_overview.adoc

@@ -11,7 +11,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 jME3 supports several types of special effects: Post-Processor Filters, SceneProcessors, and Particle Emitters (also known as particle systems). This list contains screenshots and links to sample code that demonstrates how to add the effect to a scene.
 
 
-
 == Sample Code
 
 *  There is one `com.jme3.effect.ParticleEmitter` class for all Particle Systems. 
@@ -86,10 +85,8 @@ image::jme3/advanced/water.png[water.png,with="150",height="100",align="right"]
 The jMonkeyEngine's <<jme3/advanced/water#,&quot;SeaMonkey&quot; WaterFilter>> simulates ocean waves, foam, including cool underwater caustics. 
 Use the SimpleWaterProcessor (SceneProcessor) for small, limited bodies of water, such as puddles, drinking troughs, pools, fountains.
 
-
 See also the link:http://jmonkeyengine.org/2011/01/15/new-advanced-water-effect-for-jmonkeyengine-3[Rendering Water as Post-Process Effect] announcement with video.
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestSceneWater.java[jme3/src/test/jme3test/water/TestSceneWater.java] – SimpleWaterProcessor (SceneProcessor)
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestSimpleWater.java[jme3/src/test/jme3test/water/TestSimpleWater.java] – SimpleWaterProcessor (SceneProcessor)
 
@@ -99,7 +96,6 @@ image::jme3/advanced/water-reflection-muddy.png[water-reflection-muddy.png,with=
 image::jme3/advanced/underwater2.jpg[underwater2.jpg,with="150",height="100",align="right"]
 
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWater.java[jme3/src/test/jme3test/water/TestPostWater.java] – WaterFilter
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/water/TestPostWaterLake.java[jme3/src/test/jme3test/water/TestPostWaterLake.java] – WaterFilter
 
@@ -115,7 +111,6 @@ image::jme3/advanced/dof-blur.png[dof-blur.png,with="150",height="100",align="ri
 image::jme3/advanced/light-scattering-filter.png[light-scattering-filter.png,with="150",height="100",align="right"]
 
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestDepthOfField.java[jme3/src/test/jme3test/post/TestDepthOfField.java] – DepthOfFieldFilter
 
 
@@ -144,7 +139,6 @@ image::jme3/advanced/shadow-sponza-ssao.png[shadow-sponza-ssao.png,with="150",he
 
 
 
-
 === Bloom and Glow
 
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestBloom.java[jme3/src/test/jme3test/post/TestBloom.java]
@@ -165,7 +159,6 @@ image::jme3/advanced/light-sources.png[light-sources.png,with="150",height="100"
 
 
 
-
 === Shadow
 
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestShadow.java[jme3/src/test/jme3test/light/TestShadow.java] – BasicShadowRenderer (SceneProcessor)
@@ -182,7 +175,6 @@ image::jme3/advanced/toon-dino.png[toon-dino.png,with="150",height="100",align="
 
 
 
-
 === Toon Effect
 
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestCartoonEdge.java[jme3/src/test/jme3test/post/TestCartoonEdge.java] – CartoonEdgeFilter
@@ -206,10 +198,8 @@ image::jme3/advanced/shaderblow_matcap.jpg[shaderblow_matcap.jpg,with="150",heig
 image::jme3/advanced/shaderblow_light2.jpg[shaderblow_light2.jpg,with="66",height="150",align="right"]
 
 
-
 <<sdk/plugin/shaderblow#,ShaderBlow - GLSL Shader Library>>
 
-
 *  LightBlow Shader – blend material texture maps
 *  FakeParticleBlow Shader – jet, fire effect
 *  ToonBlow Shader – Toon Shading, toon edges 
@@ -226,7 +216,6 @@ image::jme3/advanced/shaderblow_light2.jpg[shaderblow_light2.jpg,with="66",heigh
 Thanks for your awesome contributions! Keep them coming!
 
 
-
 == Particle Emitters: Explosions, Fire, Smoke
 
 
@@ -236,7 +225,6 @@ image::jme3/advanced/particle.png[particle.png,with="150",height="100",align="ri
 
 <<jme3/advanced/particle_emitters#,Particle emitter effects>> are highly configurable and can have any texture. They can simulate smoke, dust, leaves, meteors, snowflakes, mosquitos, fire, explosions, clusters, embers, sparks…
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/effect/TestExplosionEffect.java[jme3/src/test/jme3test/effect/TestExplosionEffect.java] – debris, flame, flash, shockwave, smoke, sparks
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/effect/TestPointSprite.java[jme3/src/test/jme3test/effect/TestPointSprite.java] – cluster of points 
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/effect/TestMovingParticle.java[jme3/src/test/jme3test/effect/TestMovingParticle.java] – dust, smoke
@@ -247,42 +235,32 @@ image::jme3/advanced/particle.png[particle.png,with="150",height="100",align="ri
 
 Here is an extract taken from @nehon in the forum thread (link:http://hub.jmonkeyengine.org/forum/topic/how-exactly-do-filters-work/[http://hub.jmonkeyengine.org/forum/topic/how-exactly-do-filters-work/])
 
-
 The methods are called in this order (pretty much the same flow as processors):
 - initFilter() is called once when the FilterPostPorcessor is initialized or when the filter is added to the processor and this one as already been initialized.
 
-
 for each frame the methods are called in that sequence :
 - preFrame() occurs before anything happens
 - postQueue() occcurs once the queues have been populated (there is one queue per bucket and 2 additional queues for the shadows, casters and recievers). Note that geometries in the queues are the one in the view frustum.
 - postFrame occurs once the main frame has been rendered (the back buffer)
 
-
 Those methods are optional in a filter, they are only there if you want to hook in the rendering process.
 
-
 The material variable is here for convenience. You have a getMaterial method that returns the material that’s gonna be used to render the full screen quad. It just happened that in every implementation I had a material attribute in all my sub-classes, so I just put it back in the abstract class. Most of the time getMaterial returns this attribute.
 
-
 Forced-technique can be any technique really, they are more related with the material system than to the filters but anyway. When you use a forced technique the renderer tries to select it on the material of each geometry, if the technique does not exists for the material the geometry is not rendered.
 You assume well about the SSAO filer, the normal of the scene are rendered to a texture in a pre pass.
 
-
 Passes : these are filters in filters in a way. First they are a convenient way to initialize a FrameBuffer and the associated textures it needs, then you can use them for what ever you want.
 For example, a Pass can be (as in the SSAO filter) an extra render of the scene with a forced technique, and you have to handle the render yourself in the postQueue method.
 It can be a post pass to do after the main filter has been rendered to screen (for example an additional blur pass used in SSAO again). You have a list of passes called postRenderPass in the Filter abstract class. If you add a pass to this list, it’ll be automatically rendered by the FilterPostProcessor during the filter chain.
 
-
 The bloom Filter does an intensive use of passes.
 
-
 Filters in a nutshell.
-
 '''
 
 See also:
 
-
 *  <<jme3/advanced/particle_emitters#,Particle Emitters>>
 *  <<jme3/advanced/bloom_and_glow#,Bloom and Glow>>
 *  link:http://www.smashingmagazine.com/2008/08/07/50-photoshop-tutorials-for-sky-and-space-effects/[Photoshop Tutorial for Sky and space effects (article)]

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

@@ -14,21 +14,16 @@ Deprecated. Look at link:http://hub.jmonkeyengine.org/forum/topic/design-questio
 ====
 
 
-
 TerrainGrid is DEPRECATED.
 
-
 TerrainGrid is an extension built on top of the TerraMonkey tools like TerrainQuad and HeightMap, that provides “infinite Terrain paging routines.  +
-
 Thanks to Gábor (@anthyon) and Brent (@sploreg) for this contribution!
 
 
-
 == Sample Code
 
 The classes with source code can be found in the org.jme3.terrain.geomipmapping and org.jme3.terrain.heightmap packages. Also there are 3 tests prepared in the jme3test.terrain package:
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainGridTest.java[TerrainGridTest.java]: uses an ImageBasedHeightMapGrid instance to load the tiles
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainFractalGridTest.java[TerrainFractalGridTest.java]: makes use of the FractalHeightMapGrid class, and generates a terrain from noise
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/terrain/TerrainGridAlphaMapTest.java[TerrainGridAlphaMapTest.java]: shows how to use TerrainGridListener to change the material of the tiles
@@ -38,7 +33,6 @@ The classes with source code can be found in the org.jme3.terrain.geomipmapping
 
 TerrainGrid is made up of the TerrainGrid class, and the HeightMapGrid and TerrainGridListener interfaces.
 
-
 *  TerrainGrid is the central class of the system. It takes care for handling camera movement in LODUpdate, loading and unloading terrain tiles on demand, and notifying any registered listeners of changes.
 *  TerrainGridListener defines two events to listen to:
 **  gridMoved(Vector3f):  gets the new center as parameter after terrain update, so any objects can be added or removed as needed.
@@ -46,14 +40,11 @@ TerrainGrid is made up of the TerrainGrid class, and the HeightMapGrid and Terra
 
 
 +
-
 Multiple listeners can be added to the TerrainGrid, they will be called in the order of addition, so it’s possible to have multiple changes to the material before completing the load of the tile.
 +
-
 HeightMapGrid adds the possibility of loading terrain tiles on demand instead of having a simple height array. There’s no predefined way of how to store these tiles, it only takes care of loading one HeightMap object at given location at a time.
 
 
-
 == Motivation
 
 
@@ -62,13 +53,11 @@ image::wp-uploads/2011/06/grid-tiles.jpg[grid-tiles.jpg,with="130",height="130",
 After playing around with the terrain in jME3, soon comes the requirement of having larger explorable lands. Increasing the size of one TerrainQuad leads to more memory usage, while it will still be easy to reach the worlds boundaries. That’s why TerrainGrid was designed. It extends the TerraindQuad class and uses 4 HeightMaps (dark blue) as the four sub-quad. This means that a terrain of size 513 will use tiles of 257. Also an LRUCache is built into the terrain package, so surrounding tiles (green) can be pre-cached on a different thread, lowering the loading time. The quads are updated as the camera approaches the boundary of the light blue section.
 
 
-
 == Rationale
 
 The design of the TerrainGrid system was chosen carefully, so that minimal effort needs to be taken to switch from previous TerrainQuad uses. It has the same constructors with the small exception that instead of an array of heightmap it takes a HeightMapGrid instance. All other parameters are forwarded down to the underlying TerrainQuad system.
 There exist also two basic HeightMapGrid implementations:
 
-
 *  ImageBasedHeightMapGrid: uses a sequentially numbered, 16 bit grayscale heightmaps. The physical filename of these files can be generated through the Namer interface. When a tile cannot be found by the assetManager, an empty (all-zero) heightmap is created, and a warning is added to the log.
 *  FractalHeightMapGrid: uses a noise library to create a landscape on the fly. The shape of the terrain can be controlled by the various parameters and postfilters of the fractals. With the help of this grid implementation there’s no limitation – above of floating point precision limits – how far the camera can get. The tiles generated this way can be cached to the filesystem, for later modification. The FractalHeightMapGrid will always load from cache if a tile exists there!
 
@@ -83,6 +72,5 @@ There exist also two basic HeightMapGrid implementations:
 
 Further information about terrain and TerrainQuad can be found in the wiki at:
 
-
 *  link:http://jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_terrain[http://jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_terrain] and
 *  link:http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:terrain[http://jmonkeyengine.org/wiki/doku.php/jme3:advanced:terrain]

+ 0 - 2
src/docs/asciidoc/jme3/advanced/fade.adoc

@@ -11,7 +11,6 @@ You can use a fade in/fade out effect to make smooth transitions, for example be
 The effect uses com.jme3.post.FilterPostProcessor and com.jme3.post.filters.FadeFilter.
 
 
-
 == Setting up
 
 .  Create one FilterPostProcessor object per application.
@@ -41,4 +40,3 @@ public void simpleInitApp() {
 
 Now call the `fade.fadeIn()` and `fade.fadeOut()` methods to trigger the effect.
 You can also change the fade duration using `fade.setDuration()`.
-

+ 0 - 6
src/docs/asciidoc/jme3/advanced/headless_server.adoc

@@ -10,16 +10,13 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 When adding multiplayer to your game, you may find that your server needs to know about game state (e.g. where are players, objects? Was that a direct hit? etc.) You can code all this up yourself, but there's an easier way. 
 
-
 It's very easy to change your current (client) game to function as a server as well.
 
 
-
 == What Does Headless Mean?
 
 A headless server…
 
-
 *  does not display any output – no window opens, no audio plays, no graphics are rendered.
 *  ignores all input – no input handling.
 *  keeps game state – you can attach to, transform, and save the rootNode, although the scene is not displayed.
@@ -30,7 +27,6 @@ A headless server…
 
 First, let's take a look at the default way of creating a new game (in its simplest form):
 
-
 [source,java]
 ----
 
@@ -45,7 +41,6 @@ public static void main(String[] args) {
 
 Now, with a simple change you can start your game in Headless mode. This means that all input and audio/visual output will be ignored. That's a good thing for a server.
 
-
 [source,java]
 ----
 
@@ -63,7 +58,6 @@ public static void main(String[] args) {
 
 Okay, so you can now start your game in a headless 'server mode', where to go from here?
 
-
 *  Parse `String[] args` from the `main`-method to enable server mode on demand (e.g. start your server like `java -jar mygame.jar –server`.
 *  Integrate <<jme3/advanced/networking#,SpiderMonkey>>, to provide game updates to the server over a network.
 *  Only execute code that's needed. (E.g. place all rendering code inside an `if (servermode)`-block) (or `if (!servermode)` for the client).

+ 0 - 20
src/docs/asciidoc/jme3/advanced/hinges_and_joints.adoc

@@ -10,14 +10,11 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 The jMonkeyEngine3 has built-in support for link:http://jbullet.advel.cz[jBullet physics] via the `com.jme3.bullet` package.
 
-
 Game Physics are not only employed to calculate collisions, but they can also simulate hinges and joints. Think of pulley chains, shaky rope bridges, swinging pendulums, or (trap)door and chest hinges. Physics are a great addition to e.g. an action or puzzle game.
 
-
 In this example, we will create a pendulum. The joint is the (invisible) connection between the pendulum body and the hook. You will see that you can use what you learn from the simple pendulum and apply it to other joint/hinge objects (rope bridges, etc).
 
 
-
 == Sample Code
 
 *  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsHingeJoint.java[TestPhysicsHingeJoint.java]
@@ -41,7 +38,6 @@ In this example, we will create a pendulum. The joint is the (invisible) connect
 
 The hookNode is the fixed point from which the pendulum hangs. It has no mass. 
 
-
 [source,java]
 ----
 
@@ -57,12 +53,10 @@ getPhysicsSpace().add(hookNode);
 For a rope bridge, there would be two fixed nodes where the bridge is attached to the mountainside.
 
 
-
 == Creating a Dynamic Node
 
 The pendulumNode is the dynamic part of the construction. It has a mass. 
 
-
 [source,java]
 ----
 
@@ -77,21 +71,17 @@ getPhysicsSpace().add(pendulumNode);
 For a rope bridge, each set of planks would be one dynamic node. 
 
 
-
 == Understanding DOF, Joints, and Hinges
 
 A PhysicsHingeJoint is an invisible connection between two nodes – here between the pendulum body and the hook. Why are hinges and joints represented by the same class? Hinges and joints have something in common: They constrain the _mechanical degree of freedom_ (DOF) of another object. 
 
-
 Consider a free falling, “unchained object in physical 3D space: It has 6 DOFs:
 
-
 *  It translates along 3 axes
 *  It rotates around 3 axes
 
 Now consider some examples of objects with joints:
 
-
 *  An individual chain link is free to spin and move around, but joined into a chain, the link's movement is restricted to stay with the surrounding links.
 *  A person's arm can rotate around some axes, but not around others. The shoulder joint allows one and restricts the other.
 *  A door hinge is one of the most restricted types of joint: It can only rotate around one axis. 
@@ -99,12 +89,10 @@ Now consider some examples of objects with joints:
 You'll understand that, when creating any type of joint, it is important to correctly specify the DOFs that the joint restricts, and the DOFs that the joint allows. For the typical DOF of a <<jme3/advanced/ragdoll#,ragDoll>> character's limbs, jME even offers a special joint, `ConeJoint`.
 
 
-
 == Creating the Joint
 
 You create the HingeJoint after you have created the nodes that are to be chained together. In the code snippet you see that the HingeJoint constructor requires the two node objects. You also have to specify axes and pivots – they are the degrees of freedom that you just heard about.
 
-
 [source,java]
 ----
 
@@ -126,10 +114,8 @@ private HingeJoint joint;
 
 The pivot point's position will be at `(0,0,0)` in the global 3D space. In A's local space that is at `(0,0,0)` and in B's local space (remember B's position was set to `(0,-1,0)`) that is at `(0,1,0)`.
 
-
 Specify the following parameters for each joint:
 
-
 *  PhysicsControl A and B – the two nodes that are to be joined
 *  Vector3f pivot A and pivot B – coordinates of the attachment point relative to A and B
 **  The points typically lie on the surface of the PhysicsControl's Spatials, rarely in the middle.
@@ -140,7 +126,6 @@ Specify the following parameters for each joint:
 
 Remember to add all joint objects to the physicsSpace, just like you would do with any physical objects.
 
-
 [source,java]
 ----
 bulletAppState.getPhysicsSpace().add(joint);
@@ -149,18 +134,14 @@ bulletAppState.getPhysicsSpace().add(joint);
 *Tip:* If you want the joint to be visible, attach a geometry to the dynamic node, and translate it to its start position.
 
 
-
 == Apply Physical Forces
 
 You can apply forces to dynamic nodes (the ones that have a mass), and see how other joined (“chained) objects are dragged along. 
 
-
 Alternatively, you can also apply forces to the joint itself. In a game, you may want to spin an automatic revolving door, or slam a door closed in a spooky way, or dramatically open the lid of a treasure chest.
 
-
 The method to call on the joint is `enableMotor()`.
 
-
 [source,java]
 ----
 joint.enableMotor(true, 1, .1f);
@@ -175,7 +156,6 @@ joint.enableMotor(true, -1, .1f);
 
 When you disable the motor, the chained nodes are exposed to gravity again:
 
-
 [source,java]
 ----
 joint.enableMotor(false, 0, 0);

+ 3 - 28
src/docs/asciidoc/jme3/advanced/hud.adoc

@@ -12,20 +12,16 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 image::http://www.jmonkeyengine.com/wp-content/uploads/2010/10/grapplinghook.jpg[grapplinghook.jpg,with="256",height="192",align="right"]
 
 
-
 A HUD (Head-Up Display) is part of a game's visual user interface. It's an overlay that displays additional information as (typically) 2-dimensional text or icons on the screen, on top of the 3D scene. Not all games have, or need a HUD. To avoid breaking the immersion and cluttering the screen, only use a HUD if it is the only way to convey certain information.
 
-
 HUDs are used to supply players with essential information about the game state.
 
-
 *  Status: Score, minimap, points, stealth mode, …
 *  Resources: Ammunition, lives/health, time, …
 *  Vehicle instruments: Cockpit, speedometer, …
 *  Navigational aides: Crosshairs, mouse pointer or hand, …
 
 You have multiple options how to create HUDs.
-
 [cols="3", options="header"]
 |===
 
@@ -35,19 +31,14 @@ a|Cons
 
 a|Attach elements to default guiNode:
 a|Easy to learn. jMonkeyEngine built-in +++<abbr title="Application Programming Interface">API</abbr>+++ for attaching plain images and bitmap text.
-a|Only basic features. +
-You will have to write custom controls / buttons / effects if you need them.
+a|Only basic features. +You will have to write custom controls / buttons / effects if you need them.
 
 a|Use advanced <<jme3/advanced/nifty_gui#,Nifty GUI>> integration:
-a|Full-featured interactive user interface. +
-Includes buttons, effects, controls. +
-Supports XML and Java layouts.
+a|Full-featured interactive user interface. +Includes buttons, effects, controls. +Supports XML and Java layouts.
 a|Steeper learning curve.
 
 a|Use user contributed +++<abbr title="Graphical User Interface">GUI</abbr>+++ libraries such as <<jme3/contributions/tonegodgui#,tonegodgui>> or link:http://hub.jmonkeyengine.org/t/lemur-api-documentation/27209[Lemur]:
-a|Both have many features that would be difficult to do with Nifty +
-Includes buttons, effects, controls. +
-New features are still being released 
+a|Both have many features that would be difficult to do with Nifty +Includes buttons, effects, controls. +New features are still being released 
 a|Are not necessarily guaranteed future updates, not as well documented
 
 |===
@@ -55,15 +46,12 @@ a|Are not necessarily guaranteed future updates, not as well documented
 Using the +++<abbr title="Graphical User Interface">GUI</abbr>+++ Node is the default approach in jme3 to create simple HUDs. If you just quickly want to display a line of text, or a simple icon on the screen, use the no-frills +++<abbr title="Graphical User Interface">GUI</abbr>+++ Node, it's easier.
 
 
-
 == Simple HUD: GUI Node
 
 You already know the `rootNode` that holds the 3-dimensional scene graph. jME3 also offers a 2-dimension (orthogonal) node, the `guiNode`. 
 
-
 This is how you use the guiNode for HUDs:
 
-
 *  Create a +++<abbr title="Graphical User Interface">GUI</abbr>+++ element: a BitmapText or Picture object.
 *  Attach the element to the guiNode. 
 *  Place the element in the orthogonal render queue using `setQueueBucket(Bucket.Gui)`. 
@@ -71,12 +59,10 @@ This is how you use the guiNode for HUDs:
 The BitmapTexts and Pictures appear as 2 dimensional element on the screen.
 
 
-
 [TIP]
 ====
 By default, the guiNode has some scene graph statistics attached. To clear the guiNode before you attach your own +++<abbr title="Graphical User Interface">GUI</abbr>+++ elements, use the following methods: 
 
-
 [source,java]
 ----
 setDisplayStatView(false); setDisplayFps(false);
@@ -87,12 +73,10 @@ setDisplayStatView(false); setDisplayFps(false);
 
 
 
-
 === Displaying Pictures in the HUD
 
 A simple image can be displayed using `com.jme3.ui.Picture`.
 
-
 [source,java]
 ----
 Picture pic = new Picture("HUD Picture");
@@ -107,12 +91,10 @@ guiNode.attachChild(pic);
 When you set the last boolean in setImage() to true, the alpha channel of your image is rendered transparent/translucent.
 
 
-
 === Displaying Text in the HUD
 
 You use `com.jme3.font.BitmapText` to display text on the screen. 
 
-
 [source,java]
 ----
 
@@ -127,7 +109,6 @@ guiNode.attachChild(hudText);
 
 The BitmapFont object `guiFont` is a default font provided by SimpleApplication. Copy you own fonts as .fnt plus .png files into the `assets/Interface/Fonts` directory and load them like this:
 
-
 [source]
 ----
 BitmapFont myFont = assetManager.loadFont("Interface/Fonts/Console.fnt");
@@ -147,7 +128,6 @@ hudText = new BitmapText(myFont, false);
 It is technically possible to attach Quads and 3D Geometries to the HUD. They show up as flat, static +++<abbr title="Graphical User Interface">GUI</abbr>+++ elements. The size unit for the guiNode is pixels, not world units. If you attach a Geometry that uses a lit Material, you must add a light to the guiNode. 
 
 
-
 [IMPORTANT]
 ====
 If you don't see an attached object in the +++<abbr title="Graphical User Interface">GUI</abbr>+++, check it's position and material (add a light to guiNode). Also verify whether it is not too tiny to be seen. For comparison: A 1 world-unit wide cube is only 1 pixel wide when attached to the guiNode! You may need to scale it bigger.
@@ -155,12 +135,10 @@ If you don't see an attached object in the +++<abbr title="Graphical User Interf
 
 
 
-
 === Keeping the HUD Up-To-Date
 
 Use the update loop to keep the content up-to-date.
 
-
 [source,java]
 ----
 public void simpleUpdate(float tpf) {
@@ -177,18 +155,15 @@ public void simpleUpdate(float tpf) {
 
 The recommended approach to create HUDs is using <<jme3/advanced/nifty_gui#,Nifty GUI>>.
 
-
 .  Lay out the +++<abbr title="Graphical User Interface">GUI</abbr>+++ in one or several Nifty XML or Java files. 
 .  Write the controller classes in Java.
 .  Load the XML file with the controller object in your game's simpleInit() method.
 
 The advantage of Nifty +++<abbr title="Graphical User Interface">GUI</abbr>+++ is that it is well integrated into jME and the jMonkeyEngine SDK, and that it offers all the features that you expect from a professional modern user interface. 
 
-
 For HUDs, you basically follow the same instructions as for creating a normal <<jme3/advanced/nifty_gui#,Nifty GUI>>, you just don't pause the game while the HUD is up.
 
 
-
 == See also
 
 *  <<jme3/external/fonts#,Fonts>>

+ 6 - 36
src/docs/asciidoc/jme3/advanced/input_handling.adoc

@@ -10,10 +10,8 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Users interact with your jME3 application with different input devices – the mouse, the keyboard, or a joystick. To respond to inputs we use the `inputManager` object in `SimpleApplication`.
 
-
 This is how you add interaction to your game:
 
-
 .  For each action, choose the trigger(s) (a key or mouse click etc)
 .  For each action, add a trigger mapping to the inputManager
 .  Create at least one listener in SimpleApplication
@@ -31,9 +29,7 @@ This is how you add interaction to your game:
 
 Choose one or several key/mouse events for the interaction. We use `KeyTrigger`, `MouseAxisTrigger`, `MouseButtonTrigger`, `JoyAxisTrigger` and `JoyButtonTrigger` constants from the `com.jme3.input.controls` package. 
 
-
 *Note:* The MouseAxis and JoyAxis triggers go along the X axis (right/left) or Y axis (up/down). These Triggers come with extra booleans for the negative half of the axis (left, down). Remember to write code that listens to the negative (true) and positive (false) axis!
-
 [cols="2", options="header"]
 |===
 
@@ -80,35 +76,28 @@ a| Keyboard: Spacebar
 a| KeyTrigger(KeyInput.KEY_SPACE) 
 
 a| Keyboard: Shift 
-a| KeyTrigger(KeyInput.KEY_RSHIFT), +
-KeyTrigger(KeyInput.KEY_LSHIFT) 
+a| KeyTrigger(KeyInput.KEY_RSHIFT), +KeyTrigger(KeyInput.KEY_LSHIFT) 
 
 a| Keyboard: F1, F2, … 
 a| KeyTrigger(KeyInput.KEY_F1) … 
 
 a| Keyboard: Return, Enter 
-<a| KeyTrigger(KeyInput.KEY_RETURN), +
-KeyTrigger(KeyInput.KEY_NUMPADENTER)  
+<a| KeyTrigger(KeyInput.KEY_RETURN), +KeyTrigger(KeyInput.KEY_NUMPADENTER)  
 
 a| Keyboard: PageUp, PageDown 
-a| KeyTrigger(KeyInput.KEY_PGUP), +
-KeyTrigger(KeyInput.KEY_PGDN) 
+a| KeyTrigger(KeyInput.KEY_PGUP), +KeyTrigger(KeyInput.KEY_PGDN) 
 
 a| Keyboard: Delete, Backspace 
-a| KeyTrigger(KeyInput.KEY_BACK), +
-KeyTrigger(KeyInput.KEY_DELETE) 
+a| KeyTrigger(KeyInput.KEY_BACK), +KeyTrigger(KeyInput.KEY_DELETE) 
 
 a| Keyboard: Escape 
 a| KeyTrigger(KeyInput.KEY_ESCAPE) 
 
 a| Keyboard: Arrows 
-a| KeyTrigger(KeyInput.KEY_DOWN), +
-KeyTrigger(KeyInput.KEY_UP) +
-KeyTrigger(KeyInput.KEY_LEFT), KeyTrigger(KeyInput.KEY_RIGHT) 
+a| KeyTrigger(KeyInput.KEY_DOWN), +KeyTrigger(KeyInput.KEY_UP) +KeyTrigger(KeyInput.KEY_LEFT), KeyTrigger(KeyInput.KEY_RIGHT) 
 
 a| Joystick Button: 
-a| JoyButtonTrigger(0, JoyInput.AXIS_POV_X), +
-JoyButtonTrigger(0, JoyInput.AXIS_POV_Y) ? 
+a| JoyButtonTrigger(0, JoyInput.AXIS_POV_X), +JoyButtonTrigger(0, JoyInput.AXIS_POV_Y) ? 
 
 a| Joystick Movement: Right 
 a| JoyAxisTrigger(0, JoyInput.AXIS_POV_X, true) 
@@ -127,7 +116,6 @@ a| JoyAxisTrigger(0, JoyInput.AXIS_POV_Z, false)
 In your IDE, use code completion to quickly look up Trigger literals. In the jMonkeyEngine SDK for example, press ctrl-space or ctrl-/ after `KeyInput.|` to choose from the list of all keys.
 
 
-
 == 2. Remove Default Trigger Mappings
 
 [source]
@@ -164,10 +152,8 @@ a|Closes the application by calling `stop();`. Typically you do not remove this,
 
 When initializing the application, add a Mapping for each Trigger. 
 
-
 Give the mapping a meaningful name. The name should reflect the action, not the button/key (because buttons/keys can change). Here some examples:
 
-
 [source,java]
 ----
 
@@ -179,7 +165,6 @@ inputManager.addMapping("Rotate",     new KeyTrigger(KeyInput.KEY_SPACE));
 
 There are cases where you may want to provide more then one trigger for one action. For example, some users prefer the WASD keys to navigate, while others prefer the arrow keys. Add several triggers for one mapping, by separating the Trigger objects with commas:
 
-
 [source,java]
 ----
 
@@ -196,16 +181,13 @@ inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_D),
 
 The jME3 input manager supports two types of event listeners for inputs: AnalogListener and ActionListener. You can use one or both listeners in the same application. Add one or both of the following code snippets to your main SimpleApplication-based class to activate the listeners.
 
-
 *Note:* The two input listeners do not know, and do not care, which actual key was pressed. They only know which _named input mapping_ was triggered. 
 
 
-
 === ActionListener
 
 `com.jme3.input.controls.ActionListener`
 
-
 *  Use for absolute “button pressed or released?, “on or off? actions. 
 **  Examples: Pause/unpause, a rifle or revolver shot, jump, click to select.
 
@@ -231,7 +213,6 @@ private ActionListener actionListener = new ActionListener() {
 
 `com.jme3.input.controls.AnalogListener`
 
-
 *  Use for continuous and gradual actions.
 **  Examples: Walk, run, rotate, accelerate vehicle, strafe, (semi-)automatic weapon shot
 
@@ -256,10 +237,8 @@ private AnalogListener analogListener = new AnalogListener() {
 
 To activate the mappings, you must register them to a Listener. Write your registration code after the code block where you have added the mappings to the inputManager.
 
-
 In the following example, you register the “Pause Game mapping to the `actionListener` object, because pausing a game is in “either/or decision.
 
-
 [source,java]
 ----
 inputManager.addListener(actionListener, new String[]{"Pause Game"});
@@ -267,7 +246,6 @@ inputManager.addListener(actionListener, new String[]{"Pause Game"});
 
 In the following example, you register navigational mappings to the `analogListener` object, because walking is a continuous action. Players typically keep the key pressed to express continuity, for example when they want to “walk on or “accelerate.
 
-
 [source,java]
 ----
 inputManager.addListener(analogListener, new String[]{"Left", "Right"});
@@ -276,7 +254,6 @@ inputManager.addListener(analogListener, new String[]{"Left", "Right"});
 As you see, you can add several listeners in one String array. You can call the addListener() method more than once, each time with a subset of your list, if that helps you keep you code tidy. Again, the Listeners do not care about actual which keys are configured, you only register named trigger mappings.
 
 
-
 [TIP]
 ====
 Did you register an action, but it does not work? Check the string's capitalization and spelling, it's case sensitive!
@@ -284,15 +261,12 @@ Did you register an action, but it does not work? Check the string's capitalizat
 
 
 
-
 == 5. Implement Actions in Listeners
 
 You specify the action to be triggered where it says TODO in the Listener code snippets. Typically, you write a series of if/else conditions, testing for all the mapping names, and then calling the respective action. 
 
-
 Make use of the distinction between `if` and `else if` in this conditional.
 
-
 *  If several actions can be triggered simultaneously, test for all of these with a series of bare `if`s. For example, a character can be running forward _and_ to the left.
 *  If certain actions exclude one another, test for them with `else if`, the the rest of the exclusive tests can be skipped and you save some miliseconds. For example, you either shoot or pick something up.
 
@@ -301,7 +275,6 @@ Make use of the distinction between `if` and `else if` in this conditional.
 
 In the most common case, you want an action to be triggered once, in the moment when the button or key trigger is released. For example, when the player presses a key to open a door, or clicks to pick up an item. For these cases, use an ActionListener and test for `&amp;&amp; !keyPressed`, like shown in the following example. 
 
-
 [source,java]
 ----
 private ActionListener actionListener = new ActionListener() {
@@ -323,7 +296,6 @@ private ActionListener actionListener = new ActionListener() {
 
 The following example shows how you define actions with an AnalogListener. These actions are triggered continuously, as long (intensity `value`) as the named key or mouse button is down. Use this listeners for semi-automatic weapons and navigational actions.
 
-
 [source,java]
 ----
 private AnalogListener analogListener = new AnalogListener() {
@@ -344,6 +316,4 @@ private AnalogListener analogListener = new AnalogListener() {
 
 It is likely that your players have different keyboard layouts, are used to “reversed mouse navigation, or prefer different navigational keys than the ones that you defined. You should create an options screen that lets users customize their mouse/key triggers for your mappings. Replace the trigger literals in the `inputManager.addMapping()` lines with variables, and load sets of triggers when the game starts. 
 
-
 The abstraction of separating triggers and mappings has the advantage that you can remap triggers easily. Your code only needs to remove and add some trigger mappings. The core of the code (the listeners and actions) remains unchanged. 
-

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

@@ -10,11 +10,9 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 In the <<jme3/advanced/material_definitions#,Material Definitions>> article you learned how to configure <<jme3/advanced/materials_overview#,Materials>>  programmatically in Java code. If you have certain commonly used Materials that never change, you can clean up the amount of Java code that clutters your init method, by moving material settings into .j3m files. Then later in your code, you only need to call one setter instead of several to apply the material.
 
-
 If you want to colorize simple shapes (one texture all around), then .j3m are the most easily customizable solution. J3m files can contain texture mapped materials, but as usual you have to create the textures in an external editor, especially if you use UV-mapped textures. 
 
 
-
 == Writing the .j3m File
 
 .  For every Material, create a file and give it a name that describes it: e.g. `SimpleBump.j3m`
@@ -39,7 +37,6 @@ Material shiny bumpy rock : Common/MatDefs/Light/Lighting.j3md {
 
 How to this file is structured:
 
-
 .  Header
 ..  `Material` is a fixed keyword, keep it.
 ..  `shiny bumpy rock` is a descriptive string that you can make up. Choose a name to help you remember for what you intend to use this material.
@@ -58,12 +55,10 @@ In the jMonkeyEngine SDK, use File→New File→Material→Empty Material File t
 
 
 
-
 == How to Use .j3m Materials
 
 This is how you use the prepared .j3m Material on a Spatial. Since you have saved the .j3m file to your project's Assets directory, the .j3m path is relative to `MyGame/src/assets/…`.
 
-
 [source,java]
 ----
 myGeometry.setMaterial(assetManager.loadMaterial("Materials/SimpleBump.j3m"));
@@ -72,7 +67,6 @@ myGeometry.setMaterial(assetManager.loadMaterial("Materials/SimpleBump.j3m"));
 *Tip:* In the jMonkeyEngine SDK, open Windows&gt;Palette and drag the `JME Material: Set J3M` snippet into your code.
 
 
-
 == Syntax Reference for .j3m Files
 
 
@@ -80,18 +74,14 @@ myGeometry.setMaterial(assetManager.loadMaterial("Materials/SimpleBump.j3m"));
 
 Make sure to get the paths to the textures (.png, .jpg) and material definitions (.j3md) right. 
 
-
-*  The paths to the built-in .j3md files are relative to jME3's Core Data directory. Just copy the path stated in the <<jme3/advanced/materials_overview#,Material>> table. +
-`Common/MatDefs/Misc/Unshaded.j3md` is resolved to `jme3/src/src/core-data/Common/MatDefs/Misc/Unshaded.j3md`.
-*  The paths to your textures are relative to your project's assets directory. +
-`Textures/bump_rock_normal.png` is resolved to `MyGame/src/assets/Textures/bump_rock_normal.png`
+*  The paths to the built-in .j3md files are relative to jME3's Core Data directory. Just copy the path stated in the <<jme3/advanced/materials_overview#,Material>> table. +`Common/MatDefs/Misc/Unshaded.j3md` is resolved to `jme3/src/src/core-data/Common/MatDefs/Misc/Unshaded.j3md`.
+*  The paths to your textures are relative to your project's assets directory. +`Textures/bump_rock_normal.png` is resolved to `MyGame/src/assets/Textures/bump_rock_normal.png`
 
 
 === Data Types
 
 All data types (except Color) are specified in com.jme3.shader.VarType.
 “Color is specified as Vector4 in J3MLoader.java.
-
 [cols="3", options="header"]
 |===
 
@@ -196,7 +186,6 @@ a| (Currently not supported in J3M)
 *  Enum - values depend on the enum
 
 See the link:http://jmonkeyengine.org/javadoc/com/jme3/material/RenderState.html[RenderState] javadoc for a detailed explanation of render states.
-
 [cols="3", options="header"]
 |===
 
@@ -262,7 +251,6 @@ rootNode.attachChild(signpost);
 
 The file `assets/Models/Sign Post/Sign Post.j3m` contains:
 
-
 [source]
 ----
 
@@ -284,7 +272,6 @@ Material Signpost : Common/MatDefs/Light/Lighting.j3md {
 The JPG files are in the same directory, `assets/Models/Sign Post/…`.
 
 
-
 === Example 2: Repeating Texture
 
 [source,java]
@@ -300,7 +287,6 @@ mat.setBoolean("UseMaterialColors", true);
 
 The file `assets/Textures/Terrain/Pond/Pond.j3m` contains:
 
-
 [source]
 ----
 
@@ -317,12 +303,10 @@ Material Pong Rock : Common/MatDefs/Light/Lighting.j3md {
 The PNG files are in the same directory, `assets/Textures/Terrain/Pond/`
 
 
-
 === Example 3: Transparent
 
 The file `assets/Models/Tree/Leaves.j3m` contains:
 
-
 [source]
 ----
 
@@ -352,7 +336,6 @@ Material Leaves : Common/MatDefs/Light/Lighting.j3md {
 The PNG file is in the same directory, `assets/Models/Tree/…`
 
 
-
 == Related Links
 
 *  <<jme3/advanced/material_specification#,Developer specification of the jME3 material system (.j3md,.j3m)>>

+ 0 - 6
src/docs/asciidoc/jme3/advanced/jme3_renderbuckets.adoc

@@ -9,7 +9,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 For each viewport the rendering happens as follows:
 
-
 *  For each processor call preFrame
 *  Dispatch each geometry in a corresponding renderQueue (one for each Bucket) and build shadow queues
 *  For each processor call postQueues
@@ -21,15 +20,10 @@ For each viewport the rendering happens as follows:
 
 The translucent bucket is rendered at the end. That’s where you put transparent object that you don’t want to be affected by post processing ( shadows or what ever). Self-light-emitting particle emitters (such as a fire) are a good example.
 
-
 Post processors are not applied to this bucket with one exception : the FilterPostProcessor.
 
-
 The filter post processor hijacks the rendering process and renders a full screen quad with the texture of the scene applied on it.
 
-
 Once it’s done the depth buffer is 0, so it’s impossible to render a queue over it with proper depth test so if you use a FilterPostProcessor you have to add at the end of your filter stack the TranslucentBucketFilter. It will handle the translucent bucket rendering instead of the RenderManager. (Of course the correct depth information is passed to the filter).
 
-
 The nice side effect of this is that if you want to apply a post filter to your translucent bucket (like bloom for example) you can just push up the translucent bucket filter in the filter stack.
-

+ 8 - 83
src/docs/asciidoc/jme3/advanced/jme3_shadernodes.adoc

@@ -8,39 +8,29 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== Motivations
+== Motivations
 
 jME3 material system is entirely based on shaders. While it's pretty powerful, this system has some issues and limitations : 
 
-
 *  Monolithic shaders have a serious lack of flexibility, and it can be daunting to get into the code for inexperienced users.
 *  Maintenance ease of such shaders is poor. (for example the whole lighting shaders represent around 500 lines of code, and it could be a lot worse with more features)
 *  Adding new features to those shaders decrease the ease of maintenance a lot. This point made us reluctant to do so and some feature were never added (Fog to name it, but many more).
 *  Users can't add their own feature to the shader unless they fork it, and fall back to the same issues explained in previous points.
 
 Shader Nodes were designed with this in mind and are the fruit of many long discussions in the core chat balancing the pros and cons of this or that pattern.+
-
 At first this system was referred to as “Shader injection. The basic idea was to allow users to inject code into shaders with a tag replacement system.+
-
 We finally came with a different concept called Shader Nodes, that is inspired from blender nodes system for textures and post process.+
-
 *The final shader is generated at run time by the system by assembling shader nodes together.*
 
 
-
-=== What is a Shader Node?
+== What is a Shader Node?
 
 Conceptually, it's just a self sufficient piece of glsl code that accepts inputs and produce some outputs.+
-
 Inputs are glsl variables that may be fed by previous nodes output values.+
-
 Outputs are glsl variables fed with values computed in the shader node code.+
 
-
-
 In practice it's a bit more than that.A shader node is declined in several parts :
 
-
 *  A shader node definition, defining : 
 **  The type of shader node (Vertex or Fragment for now)
 **  The minimal glsl version needed for the shader node
@@ -59,22 +49,16 @@ In practice it's a bit more than that.A shader node is declined in several parts
 
 
 
-=== Shader Node definition
+== Shader Node definition
 
 First ShaderNodes have to be defined either in a separate file (j3sn for jme3 shader node) or directly embed in the Technique block of the j3md file.+
-
 Please refer to this documentation for global structure of a j3md file 
 <<jme3/advanced/material_specification#,jMonkeyEngine3 Material Specification>>
 
-
 All is included in a *ShaderNodeDefinitions* bloc. This block can have several nodes defined (it's recommended to define nodes that have strong dependencies with each other in the same j3sn file).+
-
 A ShaderNode is declared in a *ShaderNodeDefinition* block.+
-
 global structure should look like this :+
 
-
-
 [source,java]
 ----
 
@@ -108,8 +92,6 @@ ShaderNodeDefinitions{
 
 All that is not between [] is mandatory.+
 
-
-
 *  +++<u>ShaderNodeDefinition</u>+++ : the definition block. You can have several definition in the same ShaderNodeDefinitions block.
 **  *NodeDefName* : The name of this ShaderNodeDefinition
 
@@ -136,12 +118,10 @@ All that is not between [] is mandatory.+
 * Note that if you use the same name for an input and an ouput, the generator will consider them as the SAME variable so they should be of the same glsl type.*
 
 
-
-==== Example
+=== Example
 
 Here is a typical shader node definition
 
-
 [source,java]
 ----
 
@@ -170,17 +150,13 @@ ShaderNodeDefinitions{
 ----
 
 
-==== Declare an array
+=== Declare an array
 
 To declare an array you have to specify its size between square brackets.+
-
 *Constant size*+
-
 The size can be an int constant+
-
 _Example_
 
-
 [source]
 ----
 
@@ -191,15 +167,10 @@ _Example_
 this will declare a float array with 10 elements.
 Any material parameter mapped with this array should be of FloatArray type and it's size will be assumed as 10 when the shader is generated.+
 
-
-
 *Material parameter driven size*+
-
 The size can be dynamic and driven by a material parameter. GLSL does not support non constant values for array declaration so this material parameter will be mapped to a define.+
-
 _Example_
 
-
 [source]
 ----
 
@@ -208,25 +179,18 @@ _Example_
 ----
 
 This declares a float array with the size depending on the value of the NumberOfElement material parameter.+
-
 NumberOfElement *HAS* to be declared in the material definition as a material parameter. It will be mapped to a define and used in the shader.
 Not that if this value change the shader will have to be recompiled, due to the fact that it's mapped to a define.
 
 
-
-=== Shader Node code
+== Shader Node code
 
 The shader code associated with a Shader node is similar to any shader code.+
-
 the code for a Vertex shader node should be in a .vert file and the code for a Fragment shader node should be in a .frag file.
 It has a declarative part containing variable declaration, function declaration and so on… And a main part that is embed in a “void main(){} block.+
-
 Input and output variables declared in the shader node definition can be used *without* being declared in the shader code. ( they shouldn't even or you'll have issues).+
-
 Here is a the code of the LightMap.frag shader.+
 
-
-
 [source,java]
 ----
 
@@ -237,22 +201,17 @@ void main(){
 ----
 
 Very simple, it's just a texture fetch, but of course anything can be done.+
-
 *Do not declare uniforms, attributes or varyings in a shader node code*, the Generator will handle this, just use the inputs and outputs and optional local variables you may need.
 
 
-
-=== Shader Node declaration
+== Shader Node declaration
 
 To create a shader we need to plug shader nodes to each other, but also interact with built in glsl inputs and outputs.
 Shader nodes are declared inside the Technique block. The vertex nodes are declared in the VertexShaderNodes block and the fragment nodes are declared in the FragmentShaderNodes block.+
-
 Note that if the j3md has ember shader nodes definition (in a ShaderNodesDefinitions block) it *must* be declared before the VertexShaderNodes and FragmentShaderNodes blocks.
 Of course there can be several ShaderNode declaration in those block.+
-
 Here is how a ShaderNode declaration should look :
 
-
 [source,java]
 ----
 
@@ -282,10 +241,8 @@ ShaderNode <ShaderNodeName>{
 **  *Activationcondition* : The condition for this node to be used. Today we use Defines to use different blocks of code used depending on the state of a Material Parameter. The condition here use the exact same paradigm. A valid condition must be the name of a material parameter or any combinations using logical operators “||,“&amp;&amp;,“! or grouping characters “( and “). The generator will create the corresponding define and the shader node code will be embed into and #ifdef statement.+
 
 
-
     For example, let's say we have a Color and ColorMap material parameter, this condition “Color || ColorMap will generate this statement :
 
-
 [source,java]
 ----
 
@@ -316,7 +273,7 @@ ShaderNode <ShaderNodeName>{
 
 
 
-=== Complete material definition and Shader Nodes example
+== Complete material definition and Shader Nodes example
 
 Here is an example of a very simple Material definition that just displays a solid color (controlled by a material parameter) on a mesh.
 
@@ -326,7 +283,6 @@ Shader Nodes only work if there is no shader declared in the technique. If you w
 ====
 
 
-
 [source,java]
 ----
 
@@ -368,13 +324,10 @@ MaterialDef Simple {
 ----
 
 This Material definition has one Default technique with 2 node declarations.+
-
 +++<u>*CommonVert Definition*</u>++++
-
 CommonVert is a vertex shader node that has commonly used input and outputs of a vertex shader. It also computes the position of the vertex in projection space
 here is the definition content (Common/MatDefs/ShaderNodes/Common/CommonVert.j3sn) : 
 
-
 [source,java]
 ----
 
@@ -421,7 +374,6 @@ Note that texCoord1/2 and vertColor are declared both as input and output. the g
 
 here is the shader Node code ( Common/MatDefs/ShaderNodes/Common/commonVert.vert)
 
-
 [source,java]
 ----
 
@@ -433,13 +385,9 @@ void main(){
 
 As you can see all the inputs and outputs are not used. that's because most of them are attributes meant to be passed to the fragment shader as varyings. all the wiring will be handled by the generator only if those variables are used in an input or output mapping.+
 
-
-
 +++<u>*CommonVert input mapping*</u>++++
-
 here we have the most basic yet mandatory thing in a vertex shader, computing vertex position in projection space. for this we have 2 mapping :
 
-
 *  *worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix* : the input parameter worldViewProjectionMatrix is assigned with the WorldViewProjectionMatrix World parameter declared in the WorlParameters block of the technique.
 *  *modelPosition = Global.position.xyz* : the modelPosition (understand the vertex position in the model coordinate space) is assigned with the Global position variable.
 
@@ -457,8 +405,6 @@ also note the swizzle of the Global.position variable. modelPosition is a vec3 a
 
 +++<u>*CommonVert output mapping*</u>++++
 
-
-
 *  *Global.position = projPosition* : The result of the multiplication of the worldViewProjectionMatrix  and the modelPosition is assigned to the Globale position
 
 
@@ -468,11 +414,9 @@ The Global.position variable will be assigned to the gl_Position glsl built in o
 ====
 
 +++<u>*ColorMult Definition*</u>++++
-
 ColorMult is a very basic Shader Node that takes two colors as input and multiply them.
 here is the definition content (Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn) : 
 
-
 [source,java]
 ----
 
@@ -500,7 +444,6 @@ ShaderNodeDefinitions{
 
 here is the shader Node code (Common/MatDefs/ShaderNodes/Basic/colorMult.frag)
 
-
 [source,java]
 ----
 
@@ -511,17 +454,13 @@ void main(){
 ----
 
 +++<u>*ColorMult input mapping*</u>++++
-
 All inputs are mapped here :
 
-
 *  *color1 = MatParam.Color* : The first color is assigned to the Color Material parameter declared in the MaterialParameter block of the material definition  
 *  *color2 = Global.color* : The second color is assigned with the Global color variable. this is defaulted to vec4(1.0) (opaque white). Note that in a much complex material def this variable could already have been assigned with a previous Shader Node output
 
 +++<u>*ColorMult output mapping*</u>++++
 
-
-
 *  *Global.color = outColor* : the resulting color is assigned to the Global color variable.
 
 
@@ -537,10 +476,8 @@ Also note that in case several Global variables are declared, the generator will
 ====
 
 
-
 +++<u>*Generated shader code*</u>++++
 
-
 [IMPORTANT]
 ====
 Don't take this code as carved in stone, the generated code can change as optimization of the shader generator goes on
@@ -548,7 +485,6 @@ Don't take this code as carved in stone, the generated code can change as optimi
 
 Vertex Shader (glsl 1.0)
 
-
 [source,java]
 ----
 
@@ -577,22 +513,15 @@ void main(){
 ----
 
 All materials parameter, world parameters, attributes varying are declared first. then for each shader node, the declarative part is appended.+
-
 For the main function, for each shader node, the input mappings are declared and assigned, the output are declared.+
-
 Then the variable names are replaced in the sahder node code with there complete name (NameSpace_varName), material parameters are replaced in the shader code as is.+
-
 Then, the output are mapped.+
 
-
-
 As you can see texCoord1/2 and vertColor are declared but never used. That's because the generator is not aware of that. By default it will declare all inputs in case they are used in the shaderNode code.
 Note that most glsl compiler will optimize this when compiling the shader on the GPU.
 
-
 Fragment Shader (glsl 1.0)
 
-
 [source,java]
 ----
 
@@ -618,17 +547,13 @@ void main(){
 Same as for the Vertex shader. note that the color1 is not declared, because it's directly replaced by the material parameter.
 
 
-
 [IMPORTANT]
 ====
 As a rule of thumb you should not assign a value to an input. input are likely to be material paramters or  outputs from other shaders and modifying them may cause unexpected behavior, even failure in your resulting shader.
 ====
 
 
-
 For more explanations and design decisions please refer to the +++<abbr title="specification">spec</abbr>+++ here 
 link:https://docs.google.com/document/d/1S6xO3d1TBz0xcKe_MPTqY9V-QI59AKdg1OGy3U-HeVY/edit?usp=sharing[https://docs.google.com/document/d/1S6xO3d1TBz0xcKe_MPTqY9V-QI59AKdg1OGy3U-HeVY/edit?usp=sharing]
 
-
 Thank you for the brave ones that came through all this reading. i'm not gonna offer you a prize in exchange of a password, because we ran out of JME thongs…
-

+ 3 - 91
src/docs/asciidoc/jme3/advanced/jme3_shaders.adoc

@@ -10,74 +10,49 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 +
 
 
-
-
-= Shaders Basics
+== Shaders Basics
 
 Shaders are sets of instructions that are executed on the GPU. They are used to take advantage of hardware acceleration available on the GPU for rendering purposes.+
-
 This paper only covers Vertex and Fragment shaders because they are the only ones supported by JME3 for the moment. But be aware that there are some other types of shaders (geometry, tessellation,…).+
-
 There are multiple frequently used languages that you may encounter to code shaders but as JME3 is based on OpenGL, shaders in JME use GLSL and any example in this paper will be written in GLSL.+
-
 +
 
 
-
-
 === How Does it work?
 
 To keep it Simple: The Vertex shader is executed once for each vertex in the view, then the Fragment shader (also called the Pixel shader) is executed once for each pixel on the screen.+
-
 The main purpose of the Vertex shader is to compute the screen coordinate of a vertex (where this vertex will be displayed on screen) while the main purpose of the Fragment shader is to compute the color of a pixel.+
-
 This is a very simplified graphic to describe the call stack: +
-
 image:jme3/advanced/jme3andshaders.png[jme3andshaders.png,with="",height=""]+
-
 The main program sends mesh data to the vertex shader (vertex position in object space, normals, tangents, etc..). The vertex shader computes the screen position of the vertex and sends it to the Fragment shader. The fragment shader computes the color, and the result is displayed on screen or in a texture.
 +
 
 
-
-
 === Variables scope
 
 There are different types of scope for variables in a shader :
 
-
 *  uniform : User defined variables that are passed by the main program to the vertex and fragment shader, these variables are global for a given execution of a shader.
 *  attribute : Per-vertex variables passed by the engine to the shader, like position, normal, etc (Mesh data in the graphic)
 *  varying : Variables passed from the vertex shader to the fragment shader.
 
 There is a large panel of variable types to be used, for more information about it I recommend reading the GLSL specification link:http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf[here].+
-
 +
 
 
-
-
 === Spaces and Matrices
 
 To understand the coming example you must know about the different spaces in 3D computer graphics, and the matrices used to translate coordinate from one space to another.+
-
 image:jme3/advanced/jme3andshaders-1.png[jme3andshaders-1.png,with="",height=""]+
-
 The engine passes the object space coordinates to the vertex shader. We need to compute its position in projection space. To do that we transform the object space position by the WorldViewProjectionMatrix which is a combination of the World, View, Projection matrices (who would have guessed?).+
-
 +
 
 
-
-
 === Simple example : rendering a solid color on an object
 
 Here is the simplest application to shaders, rendering a solid color.+
-
 Vertex Shader : +
 
-
-
 [source,java]
 ----
 
@@ -101,8 +76,6 @@ void main(){
 
 Fragment Shader : +
 
-
-
 [source,java]
 ----
 
@@ -116,24 +89,16 @@ void main(){
 ----
 
 For example applying this shader to a sphere would render a solid blue sphere on screen.+
-
 +
 
 
-
-
-= How to use shaders in JME3
+== How to use shaders in JME3
 
 You probably heard that JME3 is “shader oriented”, but what does that mean?+
-
 Usually to use shaders you must create what is called a program. This program specify the vertex shader and the fragment shader to use.+
-
 JME3 encloses this in the material system. Every material in JME3 uses shaders.+
-
 For example let’s have a look at the SolidColor.j3md file : +
 
-
-
 [source,java]
 ----
 
@@ -161,32 +126,22 @@ MaterialDef Solid Color {
 ----
 
 For more information on JME3 material system, i suggest you read this link:http://jmonkeyengine.org/groups/development-discussion-jme3/forum/topic/jmonkeyengine3-material-system-full-explanation[topic].+
-
 +
 
 
-
-
 === JME3 Global uniforms
 
 JME3 can expose pre-computed global uniforms to your shaders. You must specify the one that are required for your shader in the WorldParameters section of the material definition file (.j3md).+
-
 Note that in the shader the uniform names will be prefixed by a “g_”.+
-
 In the example above, WorldViewProjectionMatrix is declared as uniform mat4 g_WorldViewProjectionMatrix in the shader.+
-
 The complete list of global uniforms that can be used in JME3 can be found link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/shader/UniformBinding.java[here].+
-
 +
 
 
-
-
 === JME3 Lighting Global uniforms
 
 JME3 uses some global uniforms for lighting :
 
-
 *  g_LightDirection (vec4) : the direction of the light
 **  use for SpotLight : x,y,z contain the world direction vector of the light, the w component contains the spotlight angle cosine 
 
@@ -202,30 +157,20 @@ These uniforms are passed to the shader without having to declare them in the j3
 +
 
 
-
-
 === JME3 attributes
 
 Those are different attributes that are always passed to your shader.+
-
 You can find a complete list of those attribute in the Type enum of the VertexBuffer link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/VertexBuffer.java[here].+
-
 Note that in the shader the attributes names will be prefixed by an “in”.+
-
 +
-
 When the enumeration lists some usual types for each attribute (for example texCoord specifies two floats) then that is the format expected by all standard JME3 shaders that use that attribute. When writing your own shaders though you can use alternative formats such as placing three floats in texCoord simply by declaring the attribute as vec3 in the shader and passing 3 as the component count into the mesh setBuffer call.
 
 
-
 === User's uniforms
 
 At some point when making your own shader you'll need to pass your own uniforms+
-
 Any uniform has to be declared in the material definition file (.j3md) in the “MaterialParameters section.+
 
-
-
 [source,java]
 ----
 
@@ -237,11 +182,8 @@ Any uniform has to be declared in the material definition file (.j3md) in the 
 ----
 
 You can also pass some define to your vertex/fragment programs to know if an uniform as been declared. +
-
 You simply add it in the Defines section of your Technique in the definition file. +
 
-
-
 [source,java]
 ----
 
@@ -252,18 +194,12 @@ You simply add it in the Defines section of your Technique in the definition fil
 ----
 
 For integer and floating point parameters, the define will contain the value that was set.+
-
 For all other types of parameters, the value 1 is defined.+
-
 If no value is set for that parameter, the define is not declared in the shader.+
 
-
-
 Those material parameters will be sent from the engine to the shader as follows, 
 there are setXXXX methods for any type of uniform you want to pass.+
 
-
-
 [source,java]
 ----
 
@@ -276,8 +212,6 @@ To use this uniform in the shader, you need to declare it in the .frag or .vert
 You can make use of the defines here and later in the code:
 *Note that the “m_ prefix specifies that the uniform is a material parameter.*+
 
-
-
 [source,java]
 ----
 
@@ -291,26 +225,17 @@ You can make use of the defines here and later in the code:
 The uniforms will be populated at runtime with the value you sent.
 
 
-
 === Example: Adding Color Keying to the Lighting.j3md Material Definition
 
 Color Keying is useful in games involving many players. It consists of adding some +
-
 player-specific color on models textures. +
-
 The easiest way of doing this is to use a keyMap which will contain the amount of +
-
 color to add in its alpha channel. +
-
 Here I will use this color map: link:http://wstaw.org/m/2011/10/24/plasma-desktopxB2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopxB2787.jpg] +
-
 to blend color on this texture: link:http://wstaw.org/m/2011/10/24/plasma-desktopbq2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopbq2787.jpg] +
-
 +
-
 We need to pass 2 new parameters to the Lighting.j3md definition, MaterialParameters section :
 
-
 [source,java]
 ----
 
@@ -324,7 +249,6 @@ Color KeyColor
 
 Below, add a new Define in the main Technique section:
 
-
 [source,java]
 ----
 
@@ -334,7 +258,6 @@ KEYMAP : KeyMap
 
 In the Lighting.frag file, define the new uniforms:
 
-
 [source,java]
 ----
 
@@ -348,7 +271,6 @@ In the Lighting.frag file, define the new uniforms:
 Further, when obtaining the diffuseColor from the DiffuseMap texture, check
 if we need to blend it:
 
-
 [source,java]
 ----
 
@@ -360,15 +282,11 @@ if we need to blend it:
 ----
 
 This way, a transparent pixel in the KeyMap texture doesn't modify the color. +
-
 A black pixel replaces it for the m_KeyColor and values in between are blended.+
-
 +
-
 A result preview can be seen here: link:http://wstaw.org/m/2011/10/24/plasma-desktopuV2787.jpg[http://wstaw.org/m/2011/10/24/plasma-desktopuV2787.jpg]
 
 
-
 === Step by step
 
 *  Create a vertex shader (.vert) file
@@ -392,14 +310,9 @@ A result preview can be seen here: link:http://wstaw.org/m/2011/10/24/plasma-des
 +
 
 
-
-
 === JME3 and OpenGL 3 & 4 compatibility
 
-GLSL 1.0 to 1.2 comes with built in attributes and uniforms (ie, gl_Vertex, gl_ModelViewMatrix, etc…).+
-Those attributes are deprecated since GLSL 1.3 (opengl 3), hence JME3 global uniforms and attributes. Here is a list of deprecated attributes and their equivalent in JME3+
-
-
+GLSL 1.0 to 1.2 comes with built in attributes and uniforms (ie, gl_Vertex, gl_ModelViewMatrix, etc…).+Those attributes are deprecated since GLSL 1.3 (opengl 3), hence JME3 global uniforms and attributes. Here is a list of deprecated attributes and their equivalent in JME3+
 [cols="2", options="header"]
 |===
 
@@ -436,4 +349,3 @@ a|g_NormalMatrix
 === Useful links
 
 link:http://www.eng.utah.edu/~cs5610/lectures/GLSL-ATI-Intro.pdf[http://www.eng.utah.edu/~cs5610/lectures/GLSL-ATI-Intro.pdf]
-

+ 0 - 52
src/docs/asciidoc/jme3/advanced/jme3_srgbpipeline.adoc

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

+ 7 - 33
src/docs/asciidoc/jme3/advanced/level_of_detail.adoc

@@ -9,25 +9,20 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 A mesh with a high level of detail has lots of polygons and looks good close up. But when the mesh is further away (and the detail is not visible), the high-polygon count slows down performance unnecessarily. 
 
-
 One solution for this problem is to use high-detail meshes for objects close to the camera, and low-detail meshes for objects far from the camera. As the player moves through the scene, you must keep replacing close objects by more detailed meshes, and far objects by less detailed meshes. The goal is to keep few high-quality slow-rendering objects in the foreground, and many low-quality fast-rendering objects in the background. (Experienced users can compare this approach to <<jme3/advanced/terrain#,JME's TerraMonkey terrain system>>, which internally uses the specialized GeoMipMapping algorithm to generate a terrain's Levels of Detail.)
 
-
 You see now why you may want to be able to generate Levels of Detail for complex Geometries automatically. JME3 supports a Java implementation of the Ogre engine's LOD generator (originally by Péter Szücs and Stan Melax): You use link:https://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/tools/jme3tools/optimize/LodGenerator.java[jme3tools.optimize.LodGenerator] in conjunction with link:https://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/scene/control/LodControl.java[com.jme3.scene.control.LodControl]. 
 
-
 For a demo, run link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/stress/TestLodGeneration.java[TestLodGeneration.java] from <<sdk/sample_code#,JmeTests>>, then press +/- and spacebar to experiment. The following screenshots show a monkey model with three reduced Levels of Detail: 
 
 image::jme3/advanced/jmonkey-lod.gif[jmonkey-lod.gif,with="",height="",align="center"]
 
 
 
-
 == Usage
 
 To activate this optimization:
 
-
 .  Pick a reduction method and values for the Geometry. (Trial and error…)
 .  Generate LODs for the Geometry, either in the SDK or in code.
 .  Add an LOD control to the Geometry.
@@ -36,7 +31,6 @@ To activate this optimization:
 == Pick Reduction Methods and Values
 
 There are several reduction methods to generate a low-polygon version from a high-polygon model. Don't worry, the reduction does not modify the original model.
-
 [cols="3", options="header"]
 |===
 
@@ -61,12 +55,10 @@ a| integer
 If you don't know which to choose, experiment. For example start by trying COLLAPSE_COST and .5f-.9f.
 
 
-
 == Generate LOD
 
 You must generate and cache several LODs for each mesh, ranging from many to few polygons. The LOD generator algorithm attempts to collaps vertices automatically, while avoiding ugly artifacts. The LOD generator doesn't generate new meshes, it only creates separate reduced index buffers for the more highly reduced levels.
 
-
 *  If you create geometries manually (3D models), use the SDK to generate LODs. 
 *  If you create geometries programmatically, generate LODs from your Java code.
 
@@ -75,22 +67,17 @@ You must generate and cache several LODs for each mesh, ranging from many to few
 
 The SDK contains a user-friendly interface to generate LODs for a model (.j3o file).
 
-
 .  Open the Projects or Files window.
 .  Select the .j3o file in the Project Assets &gt; Models directory.
 .  Choose Window&gt;SceneExplorer if the SceneExplorer is not open. Info about the selected model is now displayed in the SceneExplorer.
-.  Right-click the model in SceneExplorer. Choose the “Tools &gt; Generate Levels of Detail menu. +
-image:jme3/advanced/jme-sdk-generate-lod-menu.png[The &quot;Tools&gt;Generate LOD&quot; context menu in the SceneExplorer,with="300",height="180"]
-.  The “Generate LOD settings wizard opens: +
- image:jme3/advanced/jme-sdk-generate-lod-window.png[The &quot;Generate LOD&quot; settings wizard,with="300",height="150"]
-.  Choose a reduction method and reduction values for one or more levels. +
-Tip: Enter higher reduction values for higher levels. 
+.  Right-click the model in SceneExplorer. Choose the “Tools &gt; Generate Levels of Detail menu. +image:jme3/advanced/jme-sdk-generate-lod-menu.png[The &quot;Tools&gt;Generate LOD&quot; context menu in the SceneExplorer,with="300",height="180"]
+.  The “Generate LOD settings wizard opens: + image:jme3/advanced/jme-sdk-generate-lod-window.png[The &quot;Generate LOD&quot; settings wizard,with="300",height="150"]
+.  Choose a reduction method and reduction values for one or more levels. +Tip: Enter higher reduction values for higher levels. 
 .  Click Finish to generate the LODs for this model.
 
 The LODs are saved in the .j3o model file.
 
 
-
 [TIP]
 ====
 Choose Window>Properties if the Properties window is not open. Choose the generated LODs from the dropdown in the Properties window, and verify their quality in the SceneComposer.
@@ -98,17 +85,14 @@ Choose Window>Properties if the Properties window is not open. Choose the genera
 
 
 
-
 image::jme3/advanced/jme-sdk-generate-lod-full.png[jme-sdk-generate-lod-full.png,with="",height="",align="center"]
 
 
 
-
 === Generating LODs in Code
 
 The `jme3tools.optimize.LodGenerator` utility class helps you generate LODs for an arbitrary mesh (a Geometry object) programmatically from your Java code. You create and bake one LodGenerator for each Geometry. 
 
-
 [source,java]
 ----
 LodGenerator lod = new LodGenerator(geometry);
@@ -117,10 +101,8 @@ lod.bakeLods(reductionMethod,reductionValue);
 
 The LODs are stored inside the Geometry object. 
 
-
 *Example:* How to generate an LOD of myPrettyGeo's mesh with 50% fewer polygons:
 
-
 [source,java]
 ----
 LodGenerator lod = new LodGenerator(myPrettyGeo);
@@ -132,7 +114,6 @@ lod.bakeLods(LodGenerator.TriangleReductionMethod.PROPORTIONAL,0.5f);
 
 After generating the LODs for the geometry, you create and add a `com.jme3.scene.control.LodControl` to the geometry. Adding the LodControl activates the LOD optimizaton for this geometry. 
 
-
 [source,java]
 ----
 LodControl lc = new LodControl();
@@ -143,7 +124,6 @@ rootNode.attachChild(myPrettyGeo);
 The LodControl internally gets the camera from the game's viewport to calculate the distance to this geometry. Depending on the distance, the LodControl selects an appropriate level of detail, and passes more (or less) detailed vertex data to the renderer. 
 
 
-
 == Impact on Quality and Speed
 [cols="5", options="header"]
 |===
@@ -160,17 +140,11 @@ a|Closest
 a|Slowest.
 a|Best.
 
-a|“Level 1 +
-“Level 2 +
-“Level 3 +
-…
+a|“Level 1 +“Level 2 +“Level 3 +…
 a|If you generated LODs, JME3 uses them automatically as soon as the object moves into the background.
-a|The higher the level, +
-the further away.
-a|The higher the level, +
-the faster.
-a|The higher the level, +
-the lower the quality.
+a|The higher the level, +the further away.
+a|The higher the level, +the faster.
+a|The higher the level, +the lower the quality.
 
 |===
 

+ 1 - 41
src/docs/asciidoc/jme3/advanced/light_and_shadow.adoc

@@ -9,10 +9,8 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 image:jme3/advanced/shading-ani.gif[Examples of shading and lighting.,with="",height=""]
 
-
 Light and Shadow are two separate things in 3D engines, although we percieve them together in real life:
 
-
 *  Lighting means that an object is brighter on the side facing the light direction, and darker on the backside. Computationally, this is relatively easy. 
 *  Lighting does not mean that objects cast a shadow on the floor or other objects: Activating shadow processing is an additional step described here. Since casting shadows has an impact on performance, drop shadows and ambient occlusion shading are not activated by default.
 
@@ -24,20 +22,16 @@ A light source with a direction or location is required for all Geometries with
 
 
 
-
 == Light Sources and Colors
 
 
 image::jme3/advanced/light-sources.png[A lit scene with multiple light sources,with="300",height="200",align="right"]
 
 
-
 You can add several types of light sources to a scene using `rootNode.addLight(mylight)`. 
 
-
 The available light sources in `com.​jme3.​light` are:
 
-
 *  SpotLight 
 *  PointLight
 *  AmbientLight
@@ -45,27 +39,21 @@ The available light sources in `com.​jme3.​light` are:
 
 You control the color and intensity of each light source. Typically you set the color to white (`new ColorRGBA(1.0f,1.0f,1.0f,1.0f)` or `ColorRGBA.White`), which makes all scene elements appear in their natural color. 
 
-
 You can choose to use lights in other colors than white, or darker colors. This influences the scene's atmosphere and will make the scene appear colder (e.g. `ColorRGBA.Cyan`) or warmer (`ColorRGBA.Yellow`), brighter (higher values) or darker (lower values).
 
-
 You can get a list of all lights added to a Spatial by calling `getWorldLightList()` (includes inherited lights) or `getLocalLightList()` (only directly added lights), and iterating over the result.
 
 
-
 === PointLight
 
 
 image::jme3/advanced/elephant-pointlights.png[An elephant model illuminated by pointlights,with="300",height="205",align="right"]
 
 
-
 A PointLight has a location and shines from there in all directions as far as its radius reaches. The light intensity decreases with increased distance from the light source. A PointLight can be used to cast shadows along with a PointLightShadowRenderer (see the Casting Shadows section)
 
-
 *Typical example:* Lamp, lightbulb, torch, candle.
 
-
 [source,java]
 ----
 PointLight lamp_light = new PointLight();
@@ -82,13 +70,10 @@ rootNode.addLight(lamp_light);
 image::jme3/advanced/house-directionallight.png[A house model illuminated with a sun-like directional light,with="300",height="210",align="right"]
 
 
-
 A DirectionalLight has no position, only a direction. It sends out parallel beams of light and is considered “infinitely far away. You typically have one directional light per scene. A DirectionalLight can be used together with shadows. 
 
-
 *Typically example:* Sun light.
 
-
 [source,java]
 ----
 DirectionalLight sun = new DirectionalLight();
@@ -104,13 +89,10 @@ rootNode.addLight(sun);
 image::jme3/advanced/spotlight.png[Spotlight,with="",height="",align="right"]
 
 
-
 A SpotLight sends out a distinct beam or cone of light. A SpotLight has a direction, a position, distance (range) and two angles. The inner angle is the central maximum of the light cone, the outer angle the edge of the light cone. Everything outside the light cone's angles is not affected by the light.
 
-
 *Typical Example:* Flashlight
 
-
 [source,java]
 ----
 SpotLight spot = new SpotLight();
@@ -126,15 +108,12 @@ rootNode.addLight(spot);
 If you want the spotlight to follow the flycam, repeat the setDirection(…) and setPosition(…) calls in the update loop, and kee syncing them with the camera position and direction.
 
 
-
 === AmbientLight
 
 An AmbientLight simply influences the brightness and color of the scene globally. It has no direction and no location and shines equally everywhere. An AmbientLight does not cast any shadows, and it lights all sides of Geometries evenly, which makes 3D objects look unnaturally flat; this is why you typically do not use an AmbientLight alone without one of the other lights.  
 
-
 *Typical example:* Regulate overall brightness, tinge the whole scene in a warm or cold color. 
 
-
 [source,java]
 ----
 AmbientLight al = new AmbientLight();
@@ -145,18 +124,15 @@ rootNode.addLight(al);
 
 [TIP]
 ====
-You can increase the brightness of a light source gradually by multiplying the light color to values greater than 1.0f. +
-Example: `mylight.setColor(ColorRGBA.White.mult(1.3f));`
+You can increase the brightness of a light source gradually by multiplying the light color to values greater than 1.0f. +Example: `mylight.setColor(ColorRGBA.White.mult(1.3f));`
 ====
 
 
 
-
 == Light Follows Spatial
 
 You can use a `com.jme3.scene.control.LightControl` to make a SpotLight or PointLight follow a Spatial. This can be used for a flashlight being carried by a character, or for car headlights, or an aircraft's spotlight, etc.
 
-
 [source,java]
 ----
 
@@ -170,12 +146,10 @@ spatial.addControl(lightControl); // this spatial controls the position of this
 Obviously, this does not apply to AmbientLights, which have no position.
 
 
-
 == BasicShadowRenderer (deprecated)
 
 Full code sample
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestShadow.java[TestShadow.java]
 
 
@@ -183,7 +157,6 @@ Full code sample
 
 For each type of non-ambient light source, JME3 implements two ways to simulate geometries casting shadows on other geometries:
 
-
 *  a shadow renderer (which you apply to a viewport) and
 *  a shadow filter (which you can add to a viewport's filter post-processor).
 [cols="3", options="header"]
@@ -213,10 +186,8 @@ a| (not applicable)
 
 You only need one shadow simulation per light source:  if you use shadow rendering, you won't need a shadow filter and vice versa.  Which way is more efficient depends partly on the complexity of your scene. All six shadow simulation classes have similar interfaces, so once you know how to use one, you can easily figure out the rest.
 
-
 Shadow calculations (cast and receive) have a performance impact, so use them sparingly.  With shadow renderers, you can turn off shadow casting and/or shadow receiving for individual geometries, for portions of the scene graph, or for the entire scene:
 
-
 [source,java]
 ----
 
@@ -231,15 +202,12 @@ ghost.setShadowMode(ShadowMode.Off);           // The ghost is translucent: it n
 
 Both shadow renderers and shadow filters use shadow modes to determine which objects can cast shadows. However, only the shadow renderers pay attention to shadow modes when determining which objects receive shadows.  With a shadow filter, shadow modes have no effect on which objects receive shadows.
 
-
 Here's a sample application which demonstrates both DirectionalLightShadowRenderer and DirectionalLightShadowFilter:
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestDirectionalLightShadow.java[TestDirectionalLightShadow.java]
 
 Here is the key code fragment:
 
-
 [source,java]
 ----
 
@@ -268,7 +236,6 @@ Constructor arguments:
  * size of the rendered shadow maps, in pixels per side (512, 1024, 2048, etc…)
  * the number of shadow maps rendered (more shadow maps = better quality, but slower)
 
-
 Properties you can set:
  * setDirection(Vector3f) – the direction of the light
  * setLambda(0.65f) – to reduce the split size
@@ -276,19 +243,16 @@ Properties you can set:
  * setShadowZextend(float) – distance from camera to which shadows will be computed
 
 
-
 == Parallel-Split Shadow Map (deprecated)
 
 Full sample code
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/light/TestPssmShadow.java[TestPssmShadow.java]
 
 
 image::jme3/advanced/shadow.png[A lit scene with PSSM drop shadows,with="300",height="200",align="right"]
 
 
-
 [source,java]
 ----
 private PssmShadowRenderer pssmRenderer;
@@ -306,17 +270,14 @@ public void simpleInitApp() {
 
 Full sample code
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestSSAO.java[jme3/src/test/jme3test/post/TestSSAO.java] – Screen-Space Ambient Occlusion shadows
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/post/TestTransparentSSAO.java[jme3/src/test/jme3test/post/TestTransparentSSAO.java] – Screen-Space Ambient Occlusion shadows plus transparancy
 *  link:http://hub.jmonkeyengine.org/2010/08/screen-space-ambient-occlusion-for-jmonkeyengine-3-0/[Screen Space Ambient Occlusion for jMonkeyEngine (article)]
 
 Ambient Occlusion refers to the shadows which nearby objects cast on each other under an ambient lighting. Screen Space Ambient Occlusion (SSAO) approximates how light radiates in real life.
 
-
 In JME3, SSAO is implemented by adding an instance of `com.jme3.post.SSAOFilter` to a viewport which already simulates shadows using another method such as DirectionalLightShadowRenderer.
 
-
 [source,java]
 ----
 
@@ -328,4 +289,3 @@ viewPort.addProcessor(fpp);
 ----
 
 image:jme3/advanced/shading-textured-ani.gif[Shading with and without Ambient Occlusion,with="",height=""]
-

+ 5 - 22
src/docs/asciidoc/jme3/advanced/loading_screen.adoc

@@ -8,29 +8,23 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== Nifty Loading Screen (Progress Bar)
+== 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]
 
-
 This example will use the existing hello terrain as an example.
 It will require these 2 images inside Assets/Interface/ (save them as border.png and inner.png respectively)
 
-
 image:jme3/advanced/inner1.png[inner1.png,with="",height=""]
 image:jme3/advanced/border1.png[border1.png,with="",height=""]
 
-
 This is the progress bar at 90%:
 
-
 image:jme3/advanced/loadingscreen.png[loadingscreen.png,with="",height=""]
 
-
 nifty_loading.xml
 
-
 [source,xml]
 ----
 
@@ -76,12 +70,11 @@ nifty_loading.xml
 ----
 
 
-==== Understanding Nifty XML
+=== Understanding Nifty XML
 
 The progress bar and text is done statically using nifty XML.
 A custom control is created, which represents the progress bar.
 
-
 [source,xml]
 ----
 
@@ -97,7 +90,6 @@ A custom control is created, which represents the progress bar.
 
 This screen simply displays a button in the middle of the screen, which could be seen as a simple main menu UI.
 
-
 [source,xml]
 ----
 
@@ -116,7 +108,6 @@ 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
 
-
 [source,xml]
 ----
 
@@ -133,14 +124,12 @@ This screen displays our custom progress bar control with a text control
 ----
 
 
-=== Creating the bindings to use the Nifty XML
+== Creating the bindings to use the Nifty XML
 
 There are 3 main ways to update a progress bar. To understand why these methods are necessary, an understanding of the graphics pipeline is needed. 
 
-
 Something like this in a single thread will not work:
 
-
 [source,java]
 ----
 
@@ -155,19 +144,16 @@ update_bar(100%);
 
 If you do all of this in a single frame, then it is sent to the graphics card only after the whole code block has executed. By this time the bar has reached 100% and the game has already begun – for the user, the progressbar on the screen would not have visibly changed.
 
-
 The 2 main good solutions are:
 
-
 .  Updating explicitly over many frames
 .  Multi-threading
 
 
-==== Updating progress bar over a number of frames
+=== Updating progress bar over a number of frames
 
 The idea is to break down the loading of the game into discrete parts
 
-
 [source,java]
 ----
 
@@ -349,18 +335,15 @@ public class TestLoadingScreen extends SimpleApplication implements ScreenContro
 
 Note:
 
-
 *  Try and add all controls near the end, as their update loops may begin executing
 
 
-==== Using multithreading
+=== 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*
 
-
 [source,java]
 ----
 

+ 1 - 19
src/docs/asciidoc/jme3/advanced/localization.adoc

@@ -12,27 +12,21 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Localizing an application can mean several things: 
 
-
 *  At minimum you translate all messages and dialogs in the user interface to your target languages.
 *  You should also translate the “read me, help, and other documentation.
 *  Also translating web content related to the application makes sure international users find out about your localized game.
-*  If you go the whole way of internationalization, you also “translate metaphors in icons or symbols used. +
-E.g. For localizations to right-to-left languages, you must also adjust the whole flow of the UI (order of menus and buttons).
+*  If you go the whole way of internationalization, you also “translate metaphors in icons or symbols used. +E.g. For localizations to right-to-left languages, you must also adjust the whole flow of the UI (order of menus and buttons).
 
 There are tools that assist you with localizing Java Swing GUIs. jME3 applications do not typically have a Swing +++<abbr title="Graphical User Interface">GUI</abbr>+++, so those tools are not of much help. Just stick to the normal Java rules about using Bundle Properties:
 
 
-
 == Preparing the Localization
 
 *Tip:* The jMonkeyEngine SDK supports opening and editing Bundle.properties files. Also note the Tools &gt; Localization menu.
 
-
 To prepare the application for localization, you have to first identify all hard-coded messages.
 
-
 .  Find every line in your jME3 game where you hard-coded message strings, e.g. +
-
 [source,java]
 ----
 System.out.print("Hello World!");
@@ -41,7 +35,6 @@ UiText.setText("Score: "+score);
 
 .  Create one file named `Bundle.properties` in each directory where there are Java file that contain messages.
 .  For every hard-coded message, you add one line to the `Bundle.properties` file: First specify a unique key that identifies this string; then an equal sign; and the literal string itself. +
-
 [source]
 ----
 greeting=Hello World!
@@ -59,15 +52,12 @@ UiText.setText(ResourceBundle.getBundle("Bundle").getString("score.display")+sco
 The language used in the Bundle.properties files will be the default language for your game.
 
 
-
 == Translating the Messages
 
 Each additional language comes in a set of files that is marked with a (usually) two-letter suffix. Common locales are de for German, en for English, fr for French, ja for Japanese, pt for Portuguese, etc.
 
-
 To translate the messages to another language, for example, German:
 
-
 .  Make a copy of the `Bundle.properties` files.
 .  Name the copy `Bundle_de.properties` for German. Note the added suffix _de.
 .  Translate all strings (text on the right side of the equal sign) in the `Bundle_de.properties` to German. 
@@ -79,15 +69,12 @@ score.display=Spielstand:
 
  *Important:* Do not modify any of the keys (text to the left of the equal sign)!
 
-
 .  To test the German localization, start the application from the command line with `-Duser.language=de`. Note the parameter `de`.
 
 *Tip:* In the jMonkeyEngine SDK, you set this VM Option in the Project properties under Run. Here you can also save individual run configuraions for each language you want to test.
 
-
 To get the full list of language suffixes use 
 
-
 [source,java]
 ----
 System.out.println(Arrays.toString(Locale.getISOLanguages()));
@@ -98,7 +85,6 @@ System.out.println(Arrays.toString(Locale.getISOLanguages()));
 
 *Important:* In the Bundle.properties file, do not include any strings that are asset paths, node or geometry names, input mappings, or material layers.
 
-
 *  Keep material layers: 
 [source,java]
 ----
@@ -129,12 +115,10 @@ inputManager.addListener(actionListener, "Shoot");
 Only localize messages and UI text!
 
 
-
 == Common Localization Problems
 
 Typical problems include:
 
-
 *  Localized strings will be of vastly different lengths and will totally break your UI layout. ⇒ Test every localization.
 *  Strings with variable text or numbers don't work the same in different languages. ⇒ Either work in grammatical cases/numbers/gender for each language, or use link:http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms[gettext] or link:http://userguide.icu-project.org/formatparse/messages[ICU4J].
 *  The localizer only sees the strings, without any context. E.g. does “Search History mean “display the history of searches, or “search through the history? ⇒ Use clear key labels. Work closely with the localizers if they require extra info, and add that info as comments to the translation file.
@@ -146,6 +130,4 @@ Typical problems include:
 
 link:http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles/[http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles/]
 
-
 link:http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Localisation[http://sourceforge.net/apps/mediawiki/nifty-gui/index.php?title=Localisation]
-

+ 1 - 13
src/docs/asciidoc/jme3/advanced/logging.adoc

@@ -13,12 +13,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 Many developers just use `System.out.println()` to print diagnostic strings to the terminal. The problem with that is that before the release, you have to go through all your code and make certain you removed all these `println()` calls. You do not want your customers to see them, and needlessly worry about ominous outdated debugging diagnostics. 
 
 
-
 == Logging Like a Pro
 
 Instead of `println()`, use the standard Java logger from `java.util.logging`. It has many advantages for professional game development:
 
-
 *  You tag each message with its *log level*: Severe error, informative warning, etc.
 *  You can *switch off or on printing of log messages* up to certain log level with just one line of code.
 **  During development, you would set the log level to `fine`, because you want all warnings printed.
@@ -28,15 +26,13 @@ Instead of `println()`, use the standard Java logger from `java.util.logging`. I
 
 To print comments like a pro, you use the following logger syntax.
 
-
 .  Declare the logger object once per file. In the following code, replace `HelloWorld` by the name of the class where you are using this line.
 [source,java]
 ----
 private static final Logger logger = Logger.getLogger(HelloWorld.class.getName());
 ----
 
-.  Declare the info that you want to include in the message. The variables (here `a, b, c`) can be any printable Java object. +
-Example: `Vector3f a = cam.getLocation();` 
+.  Declare the info that you want to include in the message. The variables (here `a, b, c`) can be any printable Java object. +Example: `Vector3f a = cam.getLocation();` 
 .  Put the variables in a new `Object` array. Refer to the variables as `{0},{1},{2}` etc in the message string. Variables are numbered in the order you put them into the `Object` array. 
 .  Add the logger line and specify the log level:
 **  Usecase 1: During debugging, a developer uses a warning to remind himself of a bug:
@@ -62,19 +58,15 @@ As you see in the examples, you should phrase potentially “customer facing err
 ====
 
 
-
 More details about link:http://download.oracle.com/javase/6/docs/api/java/util/logging/Level.html[Java log levels] here.
 
 
-
 == Switching the Logger on and off
 
 In the release version you will deactivate the logging output to the terminal.
 
-
 To deactivate the default logger for a release, you set the log level to only report `severe` messages:
 
-
 [source,java]
 ----
 Logger.getLogger(””).setLevel(Level.SEVERE);
@@ -82,7 +74,6 @@ Logger.getLogger(””).setLevel(Level.SEVERE);
 
 During development or a beta test, you can tune down the default logger, and set the log level to only report `warning`s:
 
-
 [source,java]
 ----
 Logger.getLogger(””).setLevel(Level.WARNING);
@@ -90,7 +81,6 @@ Logger.getLogger(””).setLevel(Level.WARNING);
 
 To activate full logging, e.g. for debugging and testing, use the `fine` level: 
 
-
 [source,java]
 ----
 Logger.getLogger(””).setLevel(Level.FINE);
@@ -101,6 +91,4 @@ Logger.getLogger(””).setLevel(Level.FINE);
 
 When an uncaught exception reaches certain parts of the jME3 system then the default response is to log the error and then exit the application. This is because an error happening every frame will rapidly fill logs with repeated failings and potentially mask or over-write the original cause of the problem or even the application may continue for a while and then suffer other errors caused by the first and make the root cause hard to determine.
 
-
 This behaviour can be partially modified by overriding the method handleError in SimpleApplication, for example to display a custom message to users, or to provide users with information on how to report a bug or even to change the way that the error is logged. 
-

+ 7 - 14
src/docs/asciidoc/jme3/advanced/makehuman_blender_ogrexml_toolchain.adoc

@@ -10,33 +10,29 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 This guide describes how to use MakeHuman Blender OgreXML toolchain.
 
 
-
-=== Tools
+== Tools
 
 The latest versions at time of writing are:
 
-
 *  MakeHuman: 1.0.2
 *  Blender: 2.72
 *  OgreXML exporter for Blender: 0.6.0
 
 The tools can be downloaded from the following URLs:
 
-
 *  MakeHuman: [link:http://www.makehuman.org/][http://www.makehuman.org/]]
 *  Blender: [link:http://www.blender.org/][http://www.blender.org/]]
 *  OgreXML exporter for Blender: [link:https://code.google.com/p/blender2ogre/downloads/list][https://code.google.com/p/blender2ogre/downloads/list]]
 
 
-=== Seed Project
+== Seed Project
 
 Public domain seed project with some preset characters and animations:
 
-
 *  JME3 Open Asset Pack: [link:https://github.com/bubblecloud/jme3-open-asset-pack][https://github.com/bubblecloud/jme3-open-asset-pack]]
 
 
-=== Preparation
+== Preparation
 
 .  Install MakeHuman and Blender.
 .  Install MakeHuman Blender importer from MakeHuman installation to Blender scripts folder and enable the script from Blender File → User Preferences → Addons.
@@ -45,7 +41,7 @@ Public domain seed project with some preset characters and animations:
 .  Locate or create character model folder (src/main/resources/character/human/female)
 
 
-=== Creating Character Model with MakeHuman
+== Creating Character Model with MakeHuman
 
 .  Create character model with MakeHuman. ([link:http://www.makehuman.org/documentation][http://www.makehuman.org/documentation]])
 **  NOTE: If you want to use JME3 Open Asset Pack animations without tweaking then use either male.mhm or female.mhm as preset and do not change the body proportions.
@@ -57,14 +53,14 @@ Public domain seed project with some preset characters and animations:
 
 
 
-=== Animating Character Model with Blender
+== Animating Character Model with Blender
 
 .  Import the character model in blender exchange format (MHX) to Blender or open preset blender file female.blend.
 .  If you use your own character you can append animations from male.blend or female.blend preset files with Blender File → Append  function. Animations are in the animation folder.
 .  Tune the character model / materials and animate the character. ([link:http://www.blender.org/support/tutorials/][http://www.blender.org/support/tutorials/]])
 
 
-=== Exporting Character Model from Blender to Ogre XML
+== Exporting Character Model from Blender to Ogre XML
 
 .  Make sure that your scene objects in Blender do not have any spaces or special characters in their names. Rename them if they do.
 .  Arrange all your animations in single NLA track after each other without overlaps or touching in the timeline.
@@ -83,13 +79,10 @@ Public domain seed project with some preset characters and animations:
 
 
 
-=== Importing Ogre XML to JME3
+== Importing Ogre XML to JME3
 
 You can load the ogre XML with asset manager or import them to SDK and hence convert them to JME3 asset format.
 
-
 You can test the animations by making your own version of AnimationPreviewer:
 
-
 link:https://github.com/bubblecloud/jme3-open-asset-pack/blob/master/src/main/java/com/jme3/asset/AnimationPreview.java[https://github.com/bubblecloud/jme3-open-asset-pack/blob/master/src/main/java/com/jme3/asset/AnimationPreview.java]
-

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

@@ -9,22 +9,18 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 When players steer a game character with 1st-person view, they directly steer the camera (`flyCam.setEnabled(true);`), and they never see the walking character itself. In a game with 3rd-person view, however, the players see the character walk, and you (the game developer) want to make the camera follow the character around when it walks.
 
-
 There are two ways how the camera can do that:
 
-
 *  Registering a chase camera to the player and the input manager.
 *  Attaching the camera to the character using a camera node.
 
 *Important:* Using third-person view requires you to deactivate the default flyCam (first-person view). This means that you have to configure your own navigation (<<jme3/advanced/input_handling#,key inputs and analogListener>>) that make your player character walk. For moving a physical player character, use `player.setWalkDirection()`, for a non-physical character you can use `player.move()`.
 
 
-
 == Code Samples
 
 Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestChaseCamera.java[TestChaseCamera.java]
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestCameraNode.java[TestCameraNode.java]
 
@@ -33,7 +29,6 @@ Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
 
 To make the camera follow a target node, add this camera node code to your init method (e.g. `simpleInitApp()`). The `target` spatial is typically the player node.
 
-
 [source,java]
 ----
 
@@ -53,7 +48,6 @@ camNode.lookAt(target.getLocalTranslation(), Vector3f.UNIT_Y);
 ----
 
 *Important:* Where the example says `camNode.setLocalTranslation(new Vector3f(0, 5, -5));`, you have to supply your own start position for the camera. This depends on the size of your target (the player character) and its position in your particular scene. Optimally, you set this to a spot a bit behind and above the target.
-
 [cols="2", options="header"]
 |===
 
@@ -61,19 +55,15 @@ a|Methods
 a|Description
 
 a|setControlDir(ControlDirection.SpatialToCamera)
-a|User input steers the target spatial, and the camera follows the spatial.+
-The spatial's transformation is copied over the camera's transformation. +
-Example: Use with <<jme3/advanced/physics#,CharacterControl>>led spatial.
+a|User input steers the target spatial, and the camera follows the spatial.+The spatial's transformation is copied over the camera's transformation. +Example: Use with <<jme3/advanced/physics#,CharacterControl>>led spatial.
 
 a|setControlDir(ControlDirection.CameraToSpatial)
-a|User input steers the camera, and the target spatial follows the camera. +
-The camera's transformation is copied over the spatial's transformation. Use with first-person flyCam.
+a|User input steers the camera, and the target spatial follows the camera. +The camera's transformation is copied over the spatial's transformation. Use with first-person flyCam.
 
 |===
 
 *Code sample:*
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestCameraNode.java[TestCameraNode.java] – Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
 
 
@@ -81,7 +71,6 @@ The camera's transformation is copied over the spatial's transformation. Use wit
 
 To activate the chase camera, add the following code to your init method (e.g. `simpleInitApp()`). The `target` spatial is typically the player node. You will be able to rotate the target by dragging (keeping the left mouse button pressed and moving the mouse).
 
-
 [source,java]
 ----
 
@@ -122,9 +111,7 @@ a|Camera looks at a point 3 world units above the target.
 a|setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE))
 a|Enable rotation by keeping the middle mouse button pressed (like in Blender). This disables the rotation on right and left mouse button click.
 
-a|setToggleRotationTrigger(new MouseButtonTrigger(+
-MouseInput.BUTTON_MIDDLE),+
-new KeyTrigger(KeyInput.KEY_SPACE))
+a|setToggleRotationTrigger(new MouseButtonTrigger(+MouseInput.BUTTON_MIDDLE),+new KeyTrigger(KeyInput.KEY_SPACE))
 a|Activate mutiple triggers for the rotation of the camera, e.g. spacebar and middle mouse button, etc.
 
 a|setRotationSensitivity(5f)
@@ -134,14 +121,12 @@ a|How fast the camera rotates. Use values around &lt;1.0f (all bigger values are
 
 *Code sample:*
 
-
 *  link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/input/TestChaseCamera.java[TestChaseCamera.java] – Press the WASD or arrow keys to move. Drag with the left mouse button to rotate.
 
 
 == Which to Choose?
 
 What is the difference of the two code samples above?
-
 [cols="2", options="header"]
 |===
 

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

@@ -10,13 +10,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 All Geometries need a Material to be visible. Every Material is based on a Material Definition. Material definitions provide the “logic for the material, and a shader draws the material according to the parameters specified in the definition. The J3MD file abstracts the shader and its configuration away from the user, allowing a simple interface where the user can simply set a few parameters on the material to change its appearance and the way its handled by the shaders. 
 
-
 The most common Material Definitions are included in the engine, advanced users can create custom ones. In this case you will also be interested in the <<jme3/advanced/material_specification#,in-depth developer specification of the jME3 material system>>.
 
-
 *Example:*
 
-
 [source,java]
 ----
 Spatial myGeometry = assetManager.loadModel("Models/Teapot/Teapot.j3o");
@@ -35,12 +32,10 @@ If you use one custom material with certain settings very often, learn about sto
 
 
 
-
 == Preparing a Material
 
 In the <<jme3/advanced/materials_overview#,Materials Overview>> list:
 
-
 .  Choose a Material Definition that has the features that you need. 
 **  Tip: If you don't know, start with `Unshaded.j3md` or `Lighting.j3md`.
 
@@ -57,7 +52,6 @@ In the <<jme3/advanced/materials_overview#,Materials Overview>> list:
 
 In your Java code,
 
-
 .  Create a Material object based on the chosen Material Definition (.j3md file): 
 [source,java]
 ----
@@ -86,12 +80,10 @@ myGeometryMesh.scaleTextureCoordinates(new Vector2f(2f, 2f));
 For details see also: <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>
 
 
-
 === Examples
 
 Here are examples of the methods that set the different data types:
 
-
 *  `mat.setColor(   “Color,       ColorRGBA.White );` 
 *  `mat.setTexture( “ColorMap,    assetManager.loadTexture(“Interface/Logo/Monkey.png ));`
 *  `mat.setFloat(   “Shininess,   5f);`
@@ -100,7 +92,6 @@ Here are examples of the methods that set the different data types:
 
 A simpled textured material.
 
-
 [source,java]
 ----
 
@@ -113,7 +104,6 @@ mat.setTexture("ColorMap", assetManager.loadTexture(
 
 A textured material with a color bleeding through transparent areas.
 
-
 [source,java]
 ----
 
@@ -127,7 +117,6 @@ mat.setColor("Color", ColorRGBA.Blue);
 
 You can test these examples within the following code snippet. It creates a box and applies the material:
 
-
 [source,java]
 ----
  Box b = new Box(Vector3f.ZERO, 1, 1, 1);
@@ -146,15 +135,12 @@ You can find these and other common code snippets in the jMonkeyEngine SDK Code
 
 
 
-
 == Creating a Custom Material Definition
 
 First read the <<jme3/advanced/material_specification#,developer specification of the jME3 material system (.j3md,.j3m)>>. Also check out the <<jme3/build_from_sources#,engine source code>> and have a look at how some Material Definitions are implemented. 
 
-
 You can create your own Material Definitions and place them in your project's `assets/MatDefs` directory.
 
-
 .  Find the existing MatDefs in `engine/src/core-data/Common/MatDefs/`. 
 .  Open a Something.j3md file in a text editor. You see that this .j3md file defines Material Parameters and Techniques.
 **  Material Parameters are the ones that you set in Materials, as shown in the examples above.

+ 0 - 47
src/docs/asciidoc/jme3/advanced/material_specification.adoc

@@ -12,10 +12,8 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 Material definitions and material instance files are formatted similarly to curly-bracket languages, in other words, you have “blocks and other “blocks nested in them, surrounded by curly-brackets. There are statements inside the blocks, the next statement begins after a new line, or a semi-colon to allow two statements on the same line. Comments are made by prefixing with two slashes, the `/* */` style comments are not allowed.
 
-
 *Example:*
 
-
 [source]
 ----
 RootBlock {
@@ -40,37 +38,29 @@ RootBlock {
 The syntax for J3MD and J3M files follows from this base format.
 
 
-
 == Material Definition files (J3MD)
 
 Material definitions provide the “logic for the material. Usually a shader that will handle drawing the object, and corresponding parameters that allow configuration of the shader. The J3MD file abstracts the shader and its configuration away from the user, allowing a simple interface where one can simply set a few parameters on the material to change its appearance and the way it's handled.
 
-
 Material definitions support multiple techniques, each technique describes a different way to draw the object. For example, currently in jME3, an additional technique is used to render shadow maps for example.
 
 
-
 === Shaders
 
 Shader support inside J3MD files is rather sophisticated. First, shaders may reference shader libraries, in a similar way to Java's “import statement, or C++'s “include pre-processor directive. Shader libraries in turn, can also reference other shader libraries this way. In the end, it is possible for a shader to use many functions together from many libraries and combine them in ways to create a more advanced effect. For example, any shader that wishes to take advantage of hardware skinning, can just import the skinning shader library and use the function, without having to write the specific logic needed for hardware skinning.
 
-
 Shaders can also take advantage of “defines that are specified inside material definitions.
 The defines “bind into material parameters, so that a change in a material parameter can apply or remove a define from the corresponding shader. This allows the shader to completely change in behavior during run-time.
 
-
 Although it is possible to use shader uniforms for the very same purpose, those may introduce slowdowns in older GPUs, that do not support branching. In that case, using defines can allow changing the way the shader works without using shader uniforms. In order to introduce a define into a shader, however, its source code must be changed, and therefore, it must be re-compiled. It is therefore not recommended to change define bound parameters often.
 
 
-
 === Syntax of a J3MD file
 
 All J3MD files begin with `MaterialDef` as the root block, following that, is the name of the material def (in this example `Test Material 123`). The name is not used for anything important currently, except for debugging. The name is typed as is without quotes, and can have spaces.
 
-
 *Example of a first line of a J3MD file:*
 
-
 [source]
 ----
 MaterialDef Test Material 123 {
@@ -78,13 +68,10 @@ MaterialDef Test Material 123 {
 
 Inside a MaterialDef block, there can be at most one MaterialParameters block, and one or more `Technique` blocks.
 
-
 Techniques may have an optional name, which specifies the name of the technique. If no name is specified for a technique, then its name is “Default, and it is used by default if the user does not specify another technique to use for the material.
 
-
 *Example of J3MD:*
 
-
 [source]
 ----
 MaterialDef Test Material 123 { 
@@ -96,10 +83,8 @@ MaterialDef Test Material 123 {
 
 Inside the MaterialParameters block, the parameters are specified. Every parameter has a type and a name. Material parameters are similar to Java variables in that aspect.
 
-
 *Example of a MaterialParameters block:*
 
-
 [source]
 ----
 MaterialParameters {
@@ -113,13 +98,10 @@ MaterialParameters {
 
 Whereas in the J3MD file, the parameter names and types are specified, in a J3M (Material instance) file, the values for these parameters are assigned, as will be shown later. This is how the materials are configured.
 
-
 At the time of writing, the following types of parameters are allowed inside J3MD files: Int, Boolean, Float, Vector2, Vector3, Vector4, Texture2D, TextureCubeMap.
 
-
 You can specify a default value for material parameters, inside material definitions, in the case that no value is specified in the material instance. 
 
-
 [source]
 ----
 MaterialParameters {
@@ -131,24 +113,18 @@ MaterialParameters {
 1 will be used as the default value and sent to the shader if it has not been set by a meterial.setFloat() call.
 
 
-
 === Techniques
 
 Techniques are more advanced blocks than the MaterialParameters block. Techniques may have nested blocks, any many types of statements.
 
-
 In this section, the statements and nested blocks that are allowed inside the Technique block will be described.
 
-
 The two most important statements, are the `FragmentShader` and `VertexShader` statements. These statements specify the shader to use for the technique, and are required inside the “Default technique. Both operate in the same way, after the statement, the language of the shader is specified, usually with a version number as well, for example `GLSL100` for OpenGL Shading Language version 1.00. Followed by a colon and an absolute path for an asset describing the actual shader source code. For GLSL, it is permitted to specify .glsl, .frag, and .vert files.
 
-
 When the material is applied to an object, the shader has its uniforms set based on the material parameter values specified in the material instance. but the parameter is prefixed with an“m_.
 
-
 For example, assuming the parameter `Shininess` is defined in the MaterialParameters block like so:
 
-
 [source]
 ----
 MaterialParameters {
@@ -158,7 +134,6 @@ MaterialParameters {
 
 The value of that parameter will map into an uniform with same name with the “m_ prefix in the GLSL shader:
 
-
 [source]
 ----
 uniform float m_Shininess;
@@ -167,12 +142,10 @@ uniform float m_Shininess;
 The letter `m` in the prefix stands for material.
 
 
-
 === World/Global parameters
 
 An important structure, that also relates to shaders, is the WorldParameters structure. It is similar in purpose to the MaterialParameters structure; it exposes various parameters to the shader, but it works differently. Whereas the user specified material parameters, world parameters are specified by the engine. In addition, the WorldParameters structure is nested in the Technique, because it is specific to the shader being used. For example, the Time world parameter specifies the time in seconds since the engine started running, the material can expose this parameter to the shader by specifying it in the WorldParameters structure like so:
 
-
 [source]
 ----
 WorldParameters {
@@ -183,7 +156,6 @@ WorldParameters {
 
 The shader will be able to access this parameter through a uniform, also named `Time` but prefixed with `g_`:
 
-
 [source]
 ----
 uniform float g_Time;
@@ -191,22 +163,17 @@ uniform float g_Time;
 
 The `g` letter stands for “global, which is considered a synonym with “world in the context of parameter scope.
 
-
 There are many world parameters available for shaders, a comprehensive list will be specified elsewhere.
 
 
-
 === RenderState
 
 The RenderState block specifies values for various render states in the rendering context. The RenderState block is nested inside the Technique block. There are many types of render states, and a comprehensive list will not be included in this document.
 
-
 The most commonly used render state is alpha blending, to specify it for a particular technique, including a RenderState block with the statement `Blend Alpha`.
 
-
 *Example:*
 
-
 [source]
 ----
 RenderState {
@@ -216,10 +183,8 @@ RenderState {
 
 *Full Example of a J3MD*
 
-
 Included is a full example of a J3MD file using all the features learned:
 
-
 [source]
 ----
 MaterialDef Test Material 123 { 
@@ -245,13 +210,10 @@ MaterialDef Test Material 123 {
 
 In comparison to J3MD files, material instance (J3M) files are significantly simpler. In most cases, the user will not have to modify or create his/her own J3MD files.
 
-
 All J3M files begin with the word `Material` followed by the name of the material (once again, used for debugging only). Following the name, is a colon and the absolute asset path to the material definition (J3MD) file extended or implemented, followed by a curly-bracket.
 
-
 *Example:*
 
-
 [source]
 ----
 Material MyGrass : Common/MatDefs/Misc/TestMaterial.j3md {
@@ -259,16 +221,12 @@ Material MyGrass : Common/MatDefs/Misc/TestMaterial.j3md {
 
 The material definition is a required component, depending on the material definition being used, the appearance and functionality of the material changes completely. Whereas the material definition provided the “logic for the material, the material instance provides the configuration for how this logic operates.
 
-
 The J3M file includes only a single structure; MaterialParameters, analogous to the same-named structure in the J3MD file. Whereas the J3MD file specified the parameter names and types, the J3M file specifies the values for these parameters. By changing the parameters, the configuration of the parent J3MD changes, allowing a different effect to be achieved.
 
-
 To specify a value for a parameter, one must specify first the parameter name, followed by a colon, and then followed by the parameter value. For texture parameters, the value is an absolute asset path pointing to the image file. Optionally, the path can be prefixed with the word “Flip in order to flip the image along the Y-axis, this may be needed for some models.
 
-
 *Example of a MaterialParameters block in J3M:*
 
-
 [source]
 ----
 MaterialParameters {
@@ -306,13 +264,10 @@ a|Textures/MyTex.jpg
 
 }
 
-
 The formatting of the value, depends on the type of the value that was specified in the J3MD file being extended. Examples are provided for every parameter type:
 
-
 *Full example of a J3M*
 
-
 [source]
 ----
 Material MyGrass : Common/MatDefs/Misc/TestMaterial.j3md { 
@@ -328,7 +283,6 @@ Material MyGrass : Common/MatDefs/Misc/TestMaterial.j3md {
 
 It is possible to generate an identical J3M file using Java code, by using the classes in the com.jme3.material package. Specifics of the link:http://jmonkeyengine.org/javadoc/com/jme3/material/Material.html[Material API] will not be provided in this document. The J3M file above is represented by this Java code:
 
-
 [source,java]
 ----
 
@@ -348,4 +302,3 @@ mat.setFloat("Shininess", 20.0f);
 == Conclusion
 
 Congratulations on being able to read this entire document! To reward your efforts, jMonkeyEngine.com will offer a free prize, please contact Momoko_Fan aka “Kirill Vainer with the password “bananapie to claim.
-

+ 20 - 154
src/docs/asciidoc/jme3/advanced/materials_overview.adoc

@@ -10,50 +10,39 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 In jMonkeyEngine 3, colors and textures are represented as Material objects.
 
-
 *  All Geometries must have Materials. To improve performance, reuse Materials for similar models, don't create a new Material object for every Geometry. (E.g. use one bark Material for several tree models.) 
 *  Each Material is based on one of jme3's default Material Definitions (.j3md files) that are included in the engine. Advanced users can create additional custom Material Definitions (see how it's done in the <<jme3/build_from_sources#,jme3 sources>>).
 
 
 [TIP]
 ====
-Find out quickly <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>, including the most commonly used code samples and RenderStates. +
-Or find more background info on <<jme3/advanced/material_definitions#,How to use Material Definitions>>.
+Find out quickly <<jme3/intermediate/how_to_use_materials#,How to Use Materials>>, including the most commonly used code samples and RenderStates. +Or find more background info on <<jme3/advanced/material_definitions#,How to use Material Definitions>>.
 ====
 
 
 
-
 == All Materials Definition Properties
 
 The following Materials table shows you the Material Definitions that jMonkeyEngine 3 supports. 
 
 
-
 [TIP]
 ====
-Looks confusing? +
-1) Start learning about `Unshaded.j3md` and `Lighting.j3md`, they cover 90% of the cases. +
-2) Use <<sdk/material_editing#,the SDK's visual material editor>> to try out and save material settings easily. +
-3) The <<sdk/code_editor#,SDK's Palette>> contains drag&drop code snippets for loading materials. 
+Looks confusing? +1) Start learning about `Unshaded.j3md` and `Lighting.j3md`, they cover 90% of the cases. +2) Use <<sdk/material_editing#,the SDK's visual material editor>> to try out and save material settings easily. +3) The <<sdk/code_editor#,SDK's Palette>> contains drag&drop code snippets for loading materials. 
 ====
 
 
-
 Most Material parameters are optional. For example, it is okay to specify solely the `DiffuseMap` and `NormalMap` when using `Lighting.j3md`, and leave the other texture maps empty. In this case, you are only using a subset of the possible features, but that's fine if it already makes in the material look the way that you want. You can always add more texture maps later.
 
 
-
 === Unshaded Coloring and Textures
 
 jMonkeyEngine supports illuminated and unshaded Material Definitions.
 
-
 *  Phong Illuminated materials look more naturalistic.
 *  Unshaded materials look more abstract. 
 
 “Unshaded materials look somewhat abstract because they ignore lighting and shading. Unshaded Materials work even if the scene does not include a light source. These Materials can be single-colored or textured. For example, they are used for cards and tiles, for the sky, billboards and UI elements, for toon-style games, or for testing. 
-
 [cols="3", options="header"]
 |===
 
@@ -62,24 +51,12 @@ a| Usage
 <a| Material Parameters  
 
 a| Common/MatDefs/Misc/Unshaded.j3md 
-a| Standard, non-illuminated Materials. +
-Use this for simple coloring and texturing, glow, and transparency. +
-See also: <<jme3/beginner/hello_material#,Hello Material>> 
-a| *Texture Maps* +
-setTexture(“ColorMap, assetManager.loadTexture(“)); +
- setBoolean(“SeparateTexCoord,true);  +
-setTexture(“LightMap, assetManager.loadTexture(“)); +
-*Colors* +
-setColor(“Color, ColorRGBA.White); +
-setBoolean(“VertexColor,true); +
-*Glow* +
-setTexture(“GlowMap, assetManager.loadTexture(“)); +
-setColor(“GlowColor, ColorRGBA.White); 
+a| Standard, non-illuminated Materials. +Use this for simple coloring and texturing, glow, and transparency. +See also: <<jme3/beginner/hello_material#,Hello Material>> 
+a| *Texture Maps* +setTexture(“ColorMap, assetManager.loadTexture(“)); + setBoolean(“SeparateTexCoord,true);  +setTexture(“LightMap, assetManager.loadTexture(“)); +*Colors* +setColor(“Color, ColorRGBA.White); +setBoolean(“VertexColor,true); +*Glow* +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); 
 
 |===
 
 Other useful, but less commonly used material definitions:
-
 [cols="3", options="header"]
 |===
 
@@ -88,57 +65,20 @@ a| Usage
 <a| Material Parameters  
 
 <a| Common/MatDefs/Misc/Sky.j3md            
-a| A solid skyblue, or use with a custom SkyDome texture. +
-See also: <<jme3/advanced/sky#,Sky>> 
-a| setTexture(“TextureCubeMap, assetManager.loadTexture(“)); +
- setBoolean(“SphereMap,true); +
-setVector3(“NormalScale, new Vector3f(0,0,0)); 
+a| A solid skyblue, or use with a custom SkyDome texture. +See also: <<jme3/advanced/sky#,Sky>> 
+a| setTexture(“TextureCubeMap, assetManager.loadTexture(“)); + setBoolean(“SphereMap,true); +setVector3(“NormalScale, new Vector3f(0,0,0)); 
 
 a| Common/MatDefs/Terrain/Terrain.j3md 
-a| Splat textures for e.g. terrains. +
-See also: <<jme3/beginner/hello_terrain#,Hello Terrain>> 
-a| setTexture(“Tex1, assetManager.loadTexture(“)); (red) +
- setFloat(“Tex1Scale,1f); +
- setTexture(“Tex2, assetManager.loadTexture(“)); (green) +
- setFloat(“Tex2Scale,1f); +
-setTexture(“Tex3, assetManager.loadTexture(“)); (blue)  +
- setFloat(“Tex3Scale,1f); +
-setTexture(“Alpha, assetManager.loadTexture(“)); 
+a| Splat textures for e.g. terrains. +See also: <<jme3/beginner/hello_terrain#,Hello Terrain>> 
+a| setTexture(“Tex1, assetManager.loadTexture(“)); (red) + setFloat(“Tex1Scale,1f); + setTexture(“Tex2, assetManager.loadTexture(“)); (green) + setFloat(“Tex2Scale,1f); +setTexture(“Tex3, assetManager.loadTexture(“)); (blue)  + setFloat(“Tex3Scale,1f); +setTexture(“Alpha, assetManager.loadTexture(“)); 
 
 a|Common/MatDefs/Terrain/HeightBasedTerrain.j3md
-a|A multi-layered texture for terrains. +
-Specify four textures and a Vector3f describing the region in which each texture should appear: +
-X = start height, +
-Y = end height, +
-Z = texture scale. +
-Texture regions can overlap. +
-For example: Specify a seafloor texture for the lowest areas, +
-a sandy texture for the beaches, +
-a grassy texure for inland areas, +
-and a rocky texture for mountain tops.
-a| setFloat(“terrainSize,512f); +
-setTexture(“region1ColorMap, assetManager.loadTexture(“)); +
-setTexture(“region2ColorMap, assetManager.loadTexture(“)); +
-setTexture(“region3ColorMap, assetManager.loadTexture(“)); +
-setTexture(“region4ColorMap, assetManager.loadTexture(“)); +
-setVector3(“region1, new Vector3f(0,0,0)); +
- setVector3(“region2, new Vector3f(0,0,0)); +
- setVector3(“region3, new Vector3f(0,0,0)); +
- setVector3(“region4, new Vector3f(0,0,0)); +
-*Settings for steep areas:* +
-setTexture(“slopeColorMap, assetManager.loadTexture(“)); +
- setFloat(“slopeTileFactor,1f);
+a|A multi-layered texture for terrains. +Specify four textures and a Vector3f describing the region in which each texture should appear: +X = start height, +Y = end height, +Z = texture scale. +Texture regions can overlap. +For example: Specify a seafloor texture for the lowest areas, +a sandy texture for the beaches, +a grassy texure for inland areas, +and a rocky texture for mountain tops.
+a| setFloat(“terrainSize,512f); +setTexture(“region1ColorMap, assetManager.loadTexture(“)); +setTexture(“region2ColorMap, assetManager.loadTexture(“)); +setTexture(“region3ColorMap, assetManager.loadTexture(“)); +setTexture(“region4ColorMap, assetManager.loadTexture(“)); +setVector3(“region1, new Vector3f(0,0,0)); + setVector3(“region2, new Vector3f(0,0,0)); + setVector3(“region3, new Vector3f(0,0,0)); + setVector3(“region4, new Vector3f(0,0,0)); +*Settings for steep areas:* +setTexture(“slopeColorMap, assetManager.loadTexture(“)); + setFloat(“slopeTileFactor,1f);
 
 <a| Common/MatDefs/Misc/Particle.j3md       
-a| Used with texture masks for particle effects, or for point sprites. +
-The Quadratic value scales the particle for perspective view (link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/effect/ParticleEmitter.java[formula]). +
-Does support an optional colored glow effect. +
-See also: <<jme3/beginner/hello_effects#,Hello Effects>> 
-a| setTexture(“Texture, assetManager.loadTexture(“)); +
-setTexture(“GlowMap, assetManager.loadTexture(“)); +
-setColor(“GlowColor, ColorRGBA.White); +
- setFloat(“Quadratic,1f); +
- setBoolean(“PointSprite,true); 
+a| Used with texture masks for particle effects, or for point sprites. +The Quadratic value scales the particle for perspective view (link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core/com/jme3/effect/ParticleEmitter.java[formula]). +Does support an optional colored glow effect. +See also: <<jme3/beginner/hello_effects#,Hello Effects>> 
+a| setTexture(“Texture, assetManager.loadTexture(“)); +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); + setFloat(“Quadratic,1f); + setBoolean(“PointSprite,true); 
 
 |===
 
@@ -147,12 +87,10 @@ setColor(“GlowColor, ColorRGBA.White); +
 
 jMonkeyEngine supports illuminated and unshaded Material Definitions.
 
-
 *  Phong Illuminated materials look more naturalistic.
 *  Unshaded materials look more abstract.
 
 Illuminated materials require a <<jme3/advanced/light_and_shadow#,light source>> added to at least one of their parent nodes! (e.g. rootNode.) Illuminated materials are darker on the sides facing away from light sources. They use Phong illumination model (default), or the Ward isotropic gaussian specular shader (WardIso) which looks more like plastic. They do not cast <<jme3/advanced/light_and_shadow#,drop shadows>> unless you use a FilterPostProcessor. 
-
 [cols="3", options="header"]
 |===
 
@@ -161,38 +99,8 @@ a| Usage
 a| Material Parameters 
 
 <a| Common/MatDefs/Light/Lighting.j3md      
-a| Commonly used Material with Phong illumination. +
-Use this material together with DiffuseMap, SpecularMap, BumpMap (NormalMaps, ParalaxMap) textures. +
-Supports shininess, transparency, and plain material colors (Diffuse, Ambient, Specular colors). +
-See also: <<jme3/beginner/hello_material#,Hello Material>> 
-<a| *Texture Maps* +
-setTexture(“DiffuseMap, assetManager.loadTexture(“)); +
-setBoolean(“UseAlpha,true);footnote:[UseAlpha specifies whether DiffuseMap uses the alpha channel]  +
-setTexture(“NormalMap, assetManager.loadTexture(“)); +
-setBoolean(“LATC,true); footnote:[LATC Specifies whether NormalMap is BC5/ATI2n/LATC/3Dc-compressed]  +
-setTexture(“SpecularMap, assetManager.loadTexture(“)); +
- setFloat(“Shininess,64f); +
-setTexture(“ParallaxMap, assetManager.loadTexture(“)); +
-setTexture(“AlphaMap, assetManager.loadTexture(“)); +
- setFloat(“AlphaDiscardThreshold,1f); +
-setTexture(“ColorRamp, assetManager.loadTexture(“)); +
-*Glow* +
-setTexture(“GlowMap, assetManager.loadTexture(“)); +
-setColor(“GlowColor, ColorRGBA.White); +
-*Performance and quality* +
-setBoolean(“VertexLighting,true); +
-  setBoolean(“UseVertexColor,true); +
- setBoolean(“LowQuality,true); +
- setBoolean(“HighQuality,true); +
-*Material Colors* +
- setBoolean(“UseMaterialColors,true); +
-setColor(“Diffuse, ColorRGBA.White); +
- setColor(“Ambient, ColorRGBA.White); +
-setColor(“Specular, ColorRGBA.White); +
-*Tangent shading:* +
- setBoolean(“VTangent,true); +
- setBoolean(“Minnaert,true);footnote:[Minnaert is a shader type.] +
-setBoolean(“WardIso,true);footnote:[WardIso is a shader type.]  
+a| Commonly used Material with Phong illumination. +Use this material together with DiffuseMap, SpecularMap, BumpMap (NormalMaps, ParalaxMap) textures. +Supports shininess, transparency, and plain material colors (Diffuse, Ambient, Specular colors). +See also: <<jme3/beginner/hello_material#,Hello Material>> 
+<a| *Texture Maps* +setTexture(“DiffuseMap, assetManager.loadTexture(“)); +setBoolean(“UseAlpha,true);footnote:[UseAlpha specifies whether DiffuseMap uses the alpha channel]  +setTexture(“NormalMap, assetManager.loadTexture(“)); +setBoolean(“LATC,true); footnote:[LATC Specifies whether NormalMap is BC5/ATI2n/LATC/3Dc-compressed]  +setTexture(“SpecularMap, assetManager.loadTexture(“)); + setFloat(“Shininess,64f); +setTexture(“ParallaxMap, assetManager.loadTexture(“)); +setTexture(“AlphaMap, assetManager.loadTexture(“)); + setFloat(“AlphaDiscardThreshold,1f); +setTexture(“ColorRamp, assetManager.loadTexture(“)); +*Glow* +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); +*Performance and quality* +setBoolean(“VertexLighting,true); +  setBoolean(“UseVertexColor,true); + setBoolean(“LowQuality,true); + setBoolean(“HighQuality,true); +*Material Colors* + setBoolean(“UseMaterialColors,true); +setColor(“Diffuse, ColorRGBA.White); + setColor(“Ambient, ColorRGBA.White); +setColor(“Specular, ColorRGBA.White); +*Tangent shading:* + setBoolean(“VTangent,true); + setBoolean(“Minnaert,true);footnote:[Minnaert is a shader type.] +setBoolean(“WardIso,true);footnote:[WardIso is a shader type.]  
 
 |===
 [cols="3", options="header"]
@@ -203,48 +111,12 @@ a| Usage
 a| Material Parameters 
 
 a|Common/MatDefs/Terrain/TerrainLighting.j3md
-a|Same kind of multi-layered splat texture as Terrain.j3md, but with illumination and shading. +
-Typically used for terrains, but works on any mesh. +
-For every 3 splat textures, you need one alpha map. +
-You can use a total of 11 texture maps in the terrain's splat texture: +
-Note that diffuse and normal maps all count against that. +
-For example, you can use a maximum of 9 diffuse textures, two of which can have normal maps; +
-or, five textures with both diffuse and normal maps.
-a|*Texture Splat Maps* +
- setTexture(“DiffuseMap, assetManager.loadTexture(“)); +
- setFloat(“DiffuseMap_0_scale,1f); +
-setTexture(“NormalMap, assetManager.loadTexture(“)); +
-setTexture(“DiffuseMap_1, assetManager.loadTexture(“)); +
- setFloat(“DiffuseMap_1_scale,1f); +
-setTexture(“NormalMap_1, assetManager.loadTexture(“)); +
-setTexture(“DiffuseMap_2, assetManager.loadTexture(“)); +
- setFloat(“DiffuseMap_2_scale,1f); +
-setTexture(“NormalMap_2, assetManager.loadTexture(“)); +
-setTexture(“DiffuseMap_3, assetManager.loadTexture(“)); +
- setFloat(“DiffuseMap_3_scale,1f); +
-setTexture(“NormalMap_3, assetManager.loadTexture(“)); +
-etc, up to 11. +
-*Alpha Maps* +
-setTexture(“AlphaMap, assetManager.loadTexture(“)); +
-setTexture(“AlphaMap_1, assetManager.loadTexture(“)); +
-setTexture(“AlphaMap_2, assetManager.loadTexture(“)); +
-*Glowing* +
-setTexture(“GlowMap, assetManager.loadTexture(“)); +
-setColor(“GlowColor, ColorRGBA.White); +
-*Miscellaneous* +
-setColor(“Diffuse, ColorRGBA.White); +
-setColor(“Ambient, ColorRGBA.White); +
-setFloat(“Shininess,64f); +
-setColor(“Specular, ColorRGBA.White); +
-setTexture(“SpecularMap, assetManager.loadTexture(“)); +
-setBoolean(“WardIso,true); +
- setBoolean(“useTriPlanarMapping,true); +
- setBoolean(“isTerrainGrid,true); 
+a|Same kind of multi-layered splat texture as Terrain.j3md, but with illumination and shading. +Typically used for terrains, but works on any mesh. +For every 3 splat textures, you need one alpha map. +You can use a total of 11 texture maps in the terrain's splat texture: +Note that diffuse and normal maps all count against that. +For example, you can use a maximum of 9 diffuse textures, two of which can have normal maps; +or, five textures with both diffuse and normal maps.
+a|*Texture Splat Maps* + setTexture(“DiffuseMap, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_0_scale,1f); +setTexture(“NormalMap, assetManager.loadTexture(“)); +setTexture(“DiffuseMap_1, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_1_scale,1f); +setTexture(“NormalMap_1, assetManager.loadTexture(“)); +setTexture(“DiffuseMap_2, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_2_scale,1f); +setTexture(“NormalMap_2, assetManager.loadTexture(“)); +setTexture(“DiffuseMap_3, assetManager.loadTexture(“)); + setFloat(“DiffuseMap_3_scale,1f); +setTexture(“NormalMap_3, assetManager.loadTexture(“)); +etc, up to 11. +*Alpha Maps* +setTexture(“AlphaMap, assetManager.loadTexture(“)); +setTexture(“AlphaMap_1, assetManager.loadTexture(“)); +setTexture(“AlphaMap_2, assetManager.loadTexture(“)); +*Glowing* +setTexture(“GlowMap, assetManager.loadTexture(“)); +setColor(“GlowColor, ColorRGBA.White); +*Miscellaneous* +setColor(“Diffuse, ColorRGBA.White); +setColor(“Ambient, ColorRGBA.White); +setFloat(“Shininess,64f); +setColor(“Specular, ColorRGBA.White); +setTexture(“SpecularMap, assetManager.loadTexture(“)); +setBoolean(“WardIso,true); + setBoolean(“useTriPlanarMapping,true); + setBoolean(“isTerrainGrid,true); 
 
 <a| Common/MatDefs/Light/Reflection.j3md    
 a| Reflective glass material with environment map (CubeMap/SphereMap). See also: link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/texture/TestCubeMap.java[TestCubeMap.java] 
-a| setTexture(“Texture, assetManager.loadTexture(“)); +
- setBoolean(“SphereMap,true); 
+a| setTexture(“Texture, assetManager.loadTexture(“)); + setBoolean(“SphereMap,true); 
 
 |===
 
@@ -285,15 +157,12 @@ a|getAdditionalRenderState().setDepthWrite(false);
 a|Disables writing of the pixel's depth value to the depth buffer.
 a|Use this on Materials if you have several transparent/translucent objects obscuring one another, but you want to see through both.
 
-a|getAdditionalRenderState().setAlphaFallOff(0.5f); +
-getAdditionalRenderState().setAlphaTest(true)
+a|getAdditionalRenderState().setAlphaFallOff(0.5f); +getAdditionalRenderState().setAlphaTest(true)
 a|Enables Alpha Testing with a “AlphaDiscardThreshold in the AlphaMap.
-a|Activate Alpha Testing for (partially) *transparent* objects such as foliage, hair, etc. +
-Deactivate Alpha Testing for gradually *translucent* objects, such as colored glass, smoked glass, ghosts.
+a|Activate Alpha Testing for (partially) *transparent* objects such as foliage, hair, etc. +Deactivate Alpha Testing for gradually *translucent* objects, such as colored glass, smoked glass, ghosts.
 
 a|getAdditionalRenderState().setBlendMode(BlendMode.Additive);
-a|Additive alpha blending adds colors in a commutative way, i.e. the result does not depend on the order of transparent layers, since it adds the scene's background pixel color to the current pixel color. This is useful if you have lots of transparent textures overlapping and don't care about the order. +
-*Note:* Viewed in front of a white background, Additive textures become fully transparent! 
+a|Additive alpha blending adds colors in a commutative way, i.e. the result does not depend on the order of transparent layers, since it adds the scene's background pixel color to the current pixel color. This is useful if you have lots of transparent textures overlapping and don't care about the order. +*Note:* Viewed in front of a white background, Additive textures become fully transparent! 
 a| This is the default for Particle.j3md-based textures that have a black color background. 
 
 a|getAdditionalRenderState().setBlendMode(BlendMode.AlphaAdditive);
@@ -320,7 +189,6 @@ a|For use with Premult Alpha textures.
 
 If the DiffuseMap has an alpha channel, use:
 
-
 [source,java]
 ----
 mat.setBoolean("UseAlpha",true);
@@ -328,7 +196,6 @@ mat.setBoolean("UseAlpha",true);
 
 Later, put the Geometry (not the Material!) in the appropriate render queue
 
-
 *  
 [source,java]
 ----
@@ -390,5 +257,4 @@ a|Use this when you have meshes that have triangles really close to each over (e
 
 *Related Links*
 
-
 *  <<jme3/advanced/material_specification#,Developer specification of the jME3 material system (.j3md,.j3m)>>

+ 0 - 5
src/docs/asciidoc/jme3/advanced/mesh.adoc

@@ -12,10 +12,8 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 image::jme3/dolphin-mesh.png[dolphin-mesh.png,with="",height="",align="right"]
 
 
-
 All visible game elements in a scene, whether it is a Model or a Shape, are made up of polygon meshes. JME3 has a com.jme3.scene.Mesh class that represents all meshes.
 
-
 *  Meshes are made up of triangles: `getTriangleCount(…)` and `getTriangle(…)`
 *  Each mesh has a unique ID: `getId()`
 *  Meshes have transformations: Location (local translation), rotation, scale.
@@ -27,7 +25,6 @@ All visible game elements in a scene, whether it is a Model or a Shape, are made
 
 You have several options when <<jme3/advanced/spatial#,creating Geometries from meshes>>:
 
-
 *  Use built-in <<jme3/advanced/shape#,Shape>>s as meshes; 
 *  Load <<jme3/advanced/3d_models#,3D models>> (that is, meshes created in external applications); or 
 *  Create free-form <<jme3/advanced/custom_meshes#,custom meshes>> programmatically. 
@@ -38,7 +35,6 @@ You have several options when <<jme3/advanced/spatial#,creating Geometries from
 The VertexBuffer contains a particular type of geometry data used by Meshes. Every VertexBuffer set on a Mesh is sent as an attribute to the vertex shader to be processed.
 
 
-
 === Mesh Vertex Buffers
 [cols="2", options="header"]
 |===
@@ -165,4 +161,3 @@ a|?
 === Level of Detail
 
 Optionally, custom meshes can have a LOD (level of detail optimization) that renders more or less detail, depending on the distance of the mesh from the camera. You have to specify several vertex buffers, one for each level of detail you want (very far away with few details, close up with all details, and something in the middle). Use `setLodLevels(VertexBuffer[] lodLevels)`. 
-

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

@@ -11,20 +11,16 @@ MonkeyBrains is a sophisticated AI Engine for jMonkeyEngine. It uses an agent fr
 Download MonkeyBrains from the GitHub link:https://github.com/QuietOne/MonkeyBrains[repository].
 
 
-
 == MonkeyBrains Wiki
 
 User guide for MonkeyBrains is moved to link:https://github.com/QuietOne/MonkeyBrains/wiki[MonkeyBrains Wiki]
 
 
-
 == Working games:
 
 For more examples of working games built with MonkeyBrains see: link:https://github.com/QuietOne/MonkeyBrainsDemoGames[https://github.com/QuietOne/MonkeyBrainsDemoGames]
 
 
-
 == Suggestions and questions:
 
 If you have suggestion or any questions, please see forum: link:http://hub.jmonkeyengine.org/forum/board/projects/monkeybrains/[http://hub.jmonkeyengine.org/forum/board/projects/monkeybrains/]
-

+ 1 - 27
src/docs/asciidoc/jme3/advanced/monkey_zone.adoc

@@ -10,7 +10,6 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 MonkeyZone is an multi-player demo game provided by the jME core developer team.
 
-
 *  link:http://monkeyzone.googlecode.com/svn/trunk/[Download source code] (Subversion Repository)
 *  link:http://www.youtube.com/watch?v=98yITEoJvqE[Watch pre-alpha video footage] (YouTube Video)
 *  link:http://jmonkeyengine.org/2011/02/13/monkeyzone-a-jme3-game-from-the-core/[Read &quot;MonkeyZone – a jME3 game from the core&quot;] (news article)
@@ -18,7 +17,6 @@ MonkeyZone is an multi-player demo game provided by the jME core developer team.
 
 This open-source demo:
 
-
 .  showcases one possible way to implement a game with jME3, and
 .  helps the jME team verify the jME3 +++<abbr title="Application Programming Interface">API</abbr>+++ in terms of usability.
 
@@ -27,23 +25,18 @@ The game was written using the jMonkeyEngine SDK, and it's based off the BasicGa
 The project design follows best practices that make it possible to edit maps, vehicles, etc, in jMonkeyEngine SDK without having to change the code – This allows 3D graphic designers to contribute models more easily. (If you feel like contributing assets or working on parts of the game code, drop us a note!)
 
 
-
 == Implementation
 
 MonkeyZone is a multi-player game with a physics simulation. Both, clients and server, run the physics simulation. The clients send input data from the player group to the server, where they control the entities, and also broadcast to the clients. Additionally, the server sends regular syncronization data for all objects in the game to prevent drifting.
 When a human user or an AI performs an action (presses a button), the actual logic is done on the server. The results are broadcast as data messages to the entities. When the entity is controlled by an AI, the actual AI code (that determines where the entity should move, and when it should perform an action) is executed on the client.
-+
-+
-
+++
 _The way MonkeyZone is implemented is just one of the many possible ways to do a game like this in jME. Some things might be done more efficiently, some might be done in another way completely. MonkeyZone tries to do things the way that are most appropriate to implement the game at hand and it shows nicely how jME3 and the standard Java +++<abbr title="Application Programming Interface">API</abbr>+++ can make game development easier and faster. Also note that the way MonkeyZone is designed is not scalable to a MMO style game, it will only work in a FPS style environment where the whole game world can be loaded at once._
 
 
-
 === Terminology
 
 The game uses certain terms that might be familiar to you but maybe used in another way, so heres a quick rundown on the terms being used.
 
-
 *  Player –	Logical human or AI player that can enter entities and generally act, only exists as PlayerData “database” with an id.
 *  Entity –	Spatial with UserData, a world object like character, vehicle, box or factory. The base form is defined only by a String pointing to the j3o which already has all userdata like hitpoints, speed etc.
 *  User –	Human player using a client
@@ -57,43 +50,36 @@ The WorldManager does the main work of organizing players, entities and the worl
 The gameplay is largely controlled by the ServerGameManager which does gameplay logic on the server, combined with the actions issued by the AI and user on the client (see below) it implements the gameplay. It extensively uses the functions exposed by the WorldManager to perform actions and gather data. This is also the class where the actions of the players are actually executed on the server to determine the outcome (ray testing for shooting etc.).
 
 
-
 === Use of Controls
 
 <<jme3/advanced/custom_controls#,Controls>> are used extensively in MonkeyZone for many aspects of the game. When a player enters an entity, the Spatials Controls are configured based on the player that enters. For example when the human user enters an entity, Controls that update the user interface (DefaultHUDControl) or user input (UserInputControl) are added to the current entity Spatial.
 
 
-
 ==== ...As entity capabilities
 
 Controls attached to Spatials are generally used like an “array of capabilities” that the entity posesses. So when an entity has a VehicleControl its expected to be a vehicle, when its got a CharacterControl its expected to be a character.
 Other Controls work completely on their own, like CharacterAnimControl which just uses the CharacterControl of the entity to check if the character is running, jumping etc. and then animates the entity if it has an AnimControl.
 
 
-
 ==== ... to abstract
 
 Furthermore theres special interfaces for Controls that allow abstraction of different Controls into one base interface. For example ManualControl and AutonomousControl are interfaces for controls that manage the movement of a spatial in a generalized way. This way AI code and e.g. the UserInputControl only have to check for a valid AutonomousControl or ManualControl on the spatial to control and move it. The details of the movement are handled by classes like ManualVehicleControl and AutonomousCharacterControl.
 
 
-
 ==== ... for AI functions
 
 A special Control called CommandControl handles the Commands that can be executed by user controlled players, see below.
 
 
-
 === Artificial Intelligence
 
 MonkeyZone includes simple AI functions based on a command queue.
 
 
-
 ==== Commands
 
 To implement autonomous AI players MonkeyZone uses a system of Commands that are managed by a CommandControl that is attached to each AI player entity controlled by the user. This CommandControl manages a list of Commands that are executed based on priority. For example theres a MoveCommand, a FollowCommand and an AttackCommand, Commands can however implement more complete behavior than that, e.g. the complete logic for a scavenging entity.
 
-
 *  Press the WASD keys and use the mouse to move
 *  press space to jump
 *  Aim and click to shoot
@@ -111,38 +97,32 @@ To implement autonomous AI players MonkeyZone uses a system of Commands that are
 The SphereTrigger is a TriggerControl that is also attached to each AI players current entity. It consists of a GhostControl that checks the overlapping entities around the entity its attached to. It can be assigned a command that is checked with every entity entering the SphereTrigger and executed if applicable (e.g. normal “attack enemy” mode).
 
 
-
 ==== NavMesh
 
 For each map a navigation mesh is generated that allows the entities to navigate the terrain. Autonomous entities automatically get a NavigationControl based on the current map. The AutonomousControl implementations automatically recognize the NavigationControl attached to the Spatial and use it for navigation. The NavMeshNavigationControl implementation contains a reference to the levels NavMesh and implements a navigation algorithm similar to the A* algorithm.
 
 
-
 === Networking
 
 Networking is realized in the PhysicsSyncManager which we hope to extend to a state where it can serve as a general sync system for physics based network games.
 The sync manager basically puts a timestamp on every message sent from the server and then buffers all arriving messages on the client within a certain time window. This allows to compensate for messages arriving too soon or too late within the constraints of the buffer, a future version might step the clients physics space different to compensate for network delays without “snapping”.
 
 
-
 == Use of jMonkeyEngine SDK tools
 
 All assets used in the game, like entity models and loaded maps can be preconfigured and edited using the jMonkeyEngine SDK. For example, to add a new vehicle type, a vehicle is created in the jMonkeyEngine SDK vehicle editor and UserData like Speed, HitPoints etc. is applied directly in the editor. When the model is loaded in the game it is automatically configured based on these settings, the same accounts for maps that are loaded, special Nodes that mark e.g. player start locations are recognized automatically etc.
 
 
-
 === UserData
 
 Entities (Nodes and Geometries) that are loaded from disk have certain UserData like HitPoints, Speed etc. that is used to configure the entity at runtime. The jMonkeyEngine SDK allows adding and editing this UserData, so entity properties are editable visually.
 
 
-
 === Physics
 
 VehicleControls, CharacterControls and RigidBodyControls with mesh collision shape for terrain and objects are generated in the jMonkeyEngine SDK and saved in the entity j3o file. When an entity is loaded, the type of entity is identified based on the available controls and UserData and it is configured accordingly.
 
 
-
 == API Info
 
 
@@ -150,21 +130,18 @@ VehicleControls, CharacterControls and RigidBodyControls with mesh collision sha
 
 Editable UserData of entity Spatials:
 
-
 *  (float) HitPoints
 *  (float) MaxHitPoints
 *  (float) Speed
 
 Entity Spatial marking Node names:
 
-
 *  AimNode
 *  CameraAttachment
 *  ShootAttachment
 
 Level Spatial marking Node names:
 
-
 *  StartPoint
 *  PowerSource
 *  MetalField
@@ -174,14 +151,12 @@ Level Spatial marking Node names:
 
 Programmatic UserData of entities:
 
-
 *  (long) entity_id
 *  (int) group_id
 *  (long) player_id
 
 Programmatic PlayerData:
 
-
 *  (long) id
 *  (int) group_id
 *  (long) entity_id
@@ -193,7 +168,6 @@ Programmatic PlayerData:
 Have a look at the code and feel free to ask about it, if you want any new features, you are free to implement them. ;)
 MonkeyZone is hosted at GoogleCode, where you can check out the jMonkeyEngine SDK-ready project via svn:
 
-
 .  jMonkeyEngine SDK→Team→Subversion→Checkout,
 .  Enter the SVN +++<abbr title="Uniform Resource Locator">URL</abbr>+++ `link:http://monkeyzone.googlecode.com/svn/trunk/[http://monkeyzone.googlecode.com/svn/trunk/]`
 .  Download, open, and build the project

+ 1 - 11
src/docs/asciidoc/jme3/advanced/motionpath.adoc

@@ -9,11 +9,9 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 A MotionPath describes the motion of a spatial between waypoints. The path can be linear or rounded. You use MotionPaths to remote-control a spatial, or the camera.
 
-
 *Tip:* If you want to remote-control a whole cutscene with several spatials moving at various times, then we recommened you use MotionPaths together with <<jme3/advanced/cinematics#,Cinematics>>.
 
 
-
 == Sample Code
 
 *  link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/animation/TestMotionPath.java[TestMotionPath.java]
@@ -24,22 +22,18 @@ A MotionPath describes the motion of a spatial between waypoints. The path can b
 
 When shooting a movie scene, the director tells actors where to walk, for example, by drawing a series of small crosses on the floor. Cameramen often mount the camera on rails (so called dolly track) so they can follow along complex scenes more easily. 
 
-
 In JME3, you use MotionPaths to specify a series of positions for a character or the camera. The MotionPath automatically updates the transformation of the spatial in each frame to make it move from one point to the next.
 
-
 *  *A way point* is one positions on a path. 
 *  *A MotionPath* contains a list of all way points of one path. 
 
 The final shape of the path is computed using a linear interpolation or a link:http://www.mvps.org/directx/articles/catmull/[Catmull-Rom] spline interpolation on the way points. 
 
 
-
 == Create a MotionPath
 
 Create a Motionpath object and add way points to it.
 
-
 [source,java]
 ----
 MotionPath path = new MotionPath();
@@ -50,7 +44,6 @@ path.addWayPoint(new Vector3f(8, -2, 1));
 ----
 
 You can configure the path as follows.
-
 [cols="2", options="header"]
 |===
 
@@ -63,8 +56,7 @@ a|Sets whether the motion along this path should be closed (true) or open-ended
 a|path.addWayPoint(vector)
 a|Adds individual waypoints to this path. The order is relevant.
 
-a|path.removeWayPoint(vector) +
-removeWayPoint(index)
+a|path.removeWayPoint(vector) +removeWayPoint(index)
 a|Removes a way point from this path. You can specify the point that you want to remove as vector or as integer index.
 
 a|path.setCurveTension(0.83f)
@@ -86,10 +78,8 @@ a|Hides the line that visualizes the path. Use this for the release build.
 
 You can hook interactions into a playing MotionPath. Register a MotionPathListener to the MotionPath to track whether way points have been reached, and then trigger a custom action. The onWayPointReach() method of the interface gives you access to the MotionTrack object `control`, and an integer value representing the current wayPointIndex.
 
-
 In this example, you just print the status at every way point. In a game you could trigger actions here: Transformations, animations, sounds, game actions (attack, open door, etc).
 
-
 [source,java]
 ----
 path.addListener( new MotionPathListener() {

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

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

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

@@ -10,19 +10,15 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 You can split the screen and look into the 3D scene from different camera angles at the same time. E.g. you can have two rootnodes with different scene graphs, and two viewPorts, each of which can only see its own subset of the scene with its own subset of port-processing filters, so you get two very different views of the scene.
 
-
 The packages used in this example are `com.jme3.renderer.Camera` and `com.jme3.renderer.ViewPort`. You can get the full sample code here: link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/renderer/TestMultiViews.java[TestMultiViews.java]
 
 
-
 == How to resize and Position ViewPorts
 
 The default viewPort is as big as the window. If you have several, they must be of different sizes, either overlapping or adjacent to one another. How do you tell jME which of the ViewPorts should appear where on the screen, and how big they should be?
 
-
 Imagine the window as a 1.0f x 1.0f rectangle. The default cam's viewPort is set to 
 
-
 [source,java]
 ----
 cam.setViewPort(0f, 1f, 0f, 1f);
@@ -30,10 +26,8 @@ cam.setViewPort(0f, 1f, 0f, 1f);
 
 This setting makes the ViewPort take up the whole rectangle. 
 
-
 The four values are read in the following order: 
 
-
 [source,java]
 ----
 cam.setViewPort(x1,x2 , y1,y2);
@@ -44,7 +38,6 @@ cam.setViewPort(x1,x2 , y1,y2);
 
 Here are a few examples:
 
-
 [source,java]
 ----
 
@@ -55,7 +48,6 @@ cam2.setViewPort( 0.5f , 1.0f   ,   0.0f , 0.5f );
 
 These viewport parameters are, (in this order) the left-right extend, and the bottom-top extend of a views's rectangle on the screen. 
 
-
 [source]
 ----
 
@@ -73,7 +65,6 @@ These viewport parameters are, (in this order) the left-right extend, and the bo
 Example: Cam2's rectangle is in the bottom right: It extends from mid (x1=0.5f) bottom (y1=0.0f), to right (x2=1.0f) mid (y2=0.5f)
 
 
-
 [IMPORTANT]
 ====
 If you scale the views in a way so that the aspect ratio of a ViewPort is different than the window's aspect ratio, then the ViewPort appears distorted. In these cases, you must recreate (not clone) the ViewPort's cam object with the right aspect ratio. For example: `Camera cam5 = new Camera(100,100);` 
@@ -81,18 +72,15 @@ If you scale the views in a way so that the aspect ratio of a ViewPort is differ
 
 
 
-
 == Four-Time Split Screen
 
 In this example, you create four views (2x2) with the same aspect ratio as the window, but each is only half the width and height. 
 
 
-
 === Set up the First View
 
 You use the preconfigured Camera `cam` and `viewPort` from `SimpleApplication` for the first view. It's in the bottom right.
 
-
 [source,java]
 ----
 
@@ -102,7 +90,6 @@ cam.setViewPort(.5f, 1f, 0f, 0.5f); // Resize the viewPort to half its size, bot
 
 Optionally, place the main camera in the scene and rotate it in its start position. 
 
-
 [source,java]
 ----
 cam.setLocation(new Vector3f(3.32f, 4.48f, 4.28f));
@@ -115,18 +102,15 @@ cam.setRotation(new Quaternion (-0.07f, 0.92f, -0.25f, -0.27f));
 
 Here is the outline for how you create the three other cams and viewPorts (link:http://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/test/jme3test/renderer/TestMultiViews.java[Full code sample is here].) In the code snippet, `cam_n` stand for `cam_2` - `cam_4`, respectively, same for `view_n`.
 
-
 .  Clone the first cam to reuse its settings
 .  Resize and position the cam's viewPort with setViewPort().
 .  (Optionally) Move the cameras in the scene and rotate them so they face what you want to see.
 .  Create a ViewPort for each camera
 .  Reset the camera's enabled statuses
-.  Attach the Node to be displayed to this ViewPort. +
-The camera doesn't have to look at the rootNode, but that is the most common use case.
+.  Attach the Node to be displayed to this ViewPort. +The camera doesn't have to look at the rootNode, but that is the most common use case.
 
 Here is the abstract code sample for camera `n`:
 
-
 [source,java]
 ----
 
@@ -144,7 +128,6 @@ view_n.setBackgroundColor(ColorRGBA.Black);
 
 To visualize what you do, use the following drawing of the viewport positions:
 
-
 [source]
 ----
 
@@ -161,7 +144,6 @@ To visualize what you do, use the following drawing of the viewport positions:
 
 This are the lines of code that set the four cameras to create a four-times split screen.
 
-
 [source,java]
 ----
 
@@ -180,7 +162,6 @@ cam4.setViewPort( 0.5f , 1.0f  ,  0.5f , 1.0f);
 
 The following code snippet sets up two views, one covers the whole screen, and the second is a small view in the top center.
 
-
 [source]
 ----
 
@@ -218,7 +199,6 @@ viewPort2.attachScene(rootNode);
 
 You can customize the camera and the viewPort of each view individually. For example, each view can have a different background color:
 
-
 [source,java]
 ----
 viewPort.setBackgroundColor(ColorRGBA.Blue);
@@ -226,7 +206,6 @@ viewPort.setBackgroundColor(ColorRGBA.Blue);
 
 You have full control to determine which Nodes the camera can see! It can see the full rootNode…
 
-
 [source,java]
 ----
 viewPort1.attachScene(rootNode);
@@ -234,7 +213,6 @@ viewPort1.attachScene(rootNode);
 
 … or you can give each camera a special node whose content it can see:
 
-
 [source,java]
 ----
 viewPort2.attachScene(spookyGhostDetectorNode);

+ 11 - 38
src/docs/asciidoc/jme3/advanced/multithreading.adoc

@@ -9,11 +9,10 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 
 
-=== The jME3 Threading Model
+== The jME3 Threading Model
 
 jME3 is similar to Swing in that, for speed and efficiency, all changes to the scene graph must be made in a single update thread. If you make changes only in Control.update(), AppState.update(), or SimpleApplication.simpleUpdate(), this will happen automatically.  However, if you pass work to another thread, you may need to pass results back to the main jME3 thread so that scene graph changes can take place there.
 
-
 [source,java]
 ----
 
@@ -29,50 +28,39 @@ public void rotateGeometry(final Geometry geo, final Quaternion rot) {
 
 Note that this example does not fetch the returned value by calling `get()` on the Future object returned from `enqueue()`. This means that the example method `rotateGeometry()` will return immediately and will not wait for the rotation to be processed before continuing.
 
-
 If the processing thread needs to wait or needs the return value then `get()` or the other methods in the returned Future object such as `isDone()` can be used.
 
-
 First, make sure you know what <<jme3/advanced/application_states#,Application States>> and <<jme3/advanced/custom_controls#,Custom Controls>> are.
 
-
 More complex games may feature complex mathematical operations or artificial intelligence calculations (such as path finding for several NPCs). If you make many time-intensive calls on the same thread (in the update loop), they will block one another, and thus slow down the game to a degree that makes it unplayable. If your game requires long running tasks, you should run them concurrently on separate threads, which speeds up the application considerably.
 
-
 Often multithreading means having separate detached logical loops going on in parallel, which communicate about their state. (For example, one thread for AI, one Sound, one Graphics). However we recommend to use a global update loop for game logic, and do multithreading within that loop when it is appropriate. This approach scales way better to multiple cores and does not break up your code logic. 
 
-
 Effectively, each for-loop in the main update loop might be a chance for multithreading, if you can break it up into self-contained tasks.
 
 
-
-== Java Multithreading
+=== Java Multithreading
 
 The java.util.concurrent package provides a good foundation for multithreading and dividing work into tasks that can be executed concurrently (hence the name). The three basic components are the Executor (supervises threads), Callable Objects (the tasks), and Future Objects (the result). You can link:http://download.oracle.com/javase/tutorial/essential/concurrency/[read about the concurrent package more here], I will give just a short introduction.
 
-
 *  A Callable is one of the classes that gets executed on a thread in the Executor. The object represents one of several concurrent tasks (e.g, one NPC's path finding task). Each Callable is started from the updateloop by calling a method named `call()`.
 *  The Executor is one central object that manages all your Callables. Every time you schedule a Callable in the Executor, the Executor returns a Future object for it. 
 *  A Future is an object that you use to check the status of an individual Callable task. The Future also gives you the return value in case one is returned.
 
 
-== Multithreading in jME3
+=== Multithreading in jME3
 
 So how do we implement multithreading in jME3?
 
-
 Let's take the example of a Control that controls an NPC Spatial. The NPC Control has to compute a lengthy pathfinding operation for each NPC. If we would execute the operations directly in the simpleUpdate() loop, it would block the game  each time a NPC wants to move from A to B. Even if we move this behaviour into the update() method of a dedicated NPC Control, we would still get annoying freeze frames, because it still runs on the same update loop thread. 
 
-
 To avoid slowdown, we decide to keep the pathfinding operations in the NPC Control, _but execute it on another thread_.
 
 
-
-=== Executor
+== Executor
 
 You create the executor object in a global AppState (or the initSimpleApp() method), in any case in a high-level place where multiple controls can access it. 
 
-
 [source,java]
 ----
 
@@ -83,11 +71,9 @@ ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(4);
 
 Pool size means the executor will keep four threads alive at any time. Having more threads in the pool means that more tasks can run concurrently. But a bigger pool only results in a speed gain if the PC can handle it! Allocating a pool  that is uselessly large just wastes memory, so you need to find a good compromise: About the same to double the size of the number of cores in the computer makes sense. 
 
-
 !!! Executor needs to be shut down when the application ends, in order to make the process die properly
 In your simple application you can override the destroy method and shutdown the executor: 
 
-
 [source,java]
 ----
 
@@ -100,11 +86,10 @@ In your simple application you can override the destroy method and shutdown the
 ----
 
 
-=== Control Class Fields
+== Control Class Fields
 
 In the NPC Control, we create the individual objects that the thread manipulates. In our example case (the pathfinding control), the task is about locations and path arrays, so we need the following variables:
 
-
 [source,Java]
 ----
 
@@ -120,12 +105,10 @@ Future future = null;
 Here we also created the Future variable to track the state of this task.
 
 
-
-=== Control Update() Method
+== Control Update() Method
 
 Next let's look at the update() call of the Control where the time-intensive task starts. In our example, the task is the `findWay` Callable (which contains the pathfinding process). So instead of spelling out the pathfinding process  in the Control's update() loop, we start the process via `future = executor.submit(findWay);`.
 
-
 [source,java]
 ----
 
@@ -163,30 +146,22 @@ public void update(float tpf) {
 
 Note how this logic makes its decision based on the Future object.
 
-
 Remember not to mess with the class fields after starting the thread, because they are being accessed and modified on the new thread. In more obvious terms: You cannot change the “desired location of the NPC while the path finder is calculating a different path. You have to cancel the current Future first.
 
 
-
-=== The Callable
+== The Callable
 
 The next code sample shows the Callable that is dedicated to performing the long-running task (here, wayfinding). This is the task that used to block the rest of the application, and is now executed on a thread of its own. You implement the task in the Callable always in an inner method named `call()`.
 
-
 The task code in the Callable should be self-contained! It should not write or read any data of objects that are managed by the scene graph or OpenGL thread directly. Even reading locations of Spatials can be problematic! So ideally all data that is needed for the wayfinding process should be available to the new thread when it starts already, possibly in a cloned version so no concurrent access to the data happens.
 
-
 In reality, you might need access to the game state. If you must read or write a current state from the scene graph, you must have a clone of the data in your thread. There are only two ways:
 
-
-*  Use the execution queue `application.enqueue()` to create a sub-thread that clones the info. Only disadvantage is, it may be slower. +
-The example below gets the `Vector3f location` from the scene object `mySpatial` using this way.
-*  Create a separate World class that allows safe access to its data via synchronized methods to access the scene graph. Alternatively it can also internally use `application.enqueue()`. +
-The following example gets the object `Data data = myWorld.getData();` using this way.
+*  Use the execution queue `application.enqueue()` to create a sub-thread that clones the info. Only disadvantage is, it may be slower. +The example below gets the `Vector3f location` from the scene object `mySpatial` using this way.
+*  Create a separate World class that allows safe access to its data via synchronized methods to access the scene graph. Alternatively it can also internally use `application.enqueue()`. +The following example gets the object `Data data = myWorld.getData();` using this way.
 
 These two ways are thread-safe, they don't mess up the game logic, and keep the Callable code readable.
 
-
 [source,java]
 ----
 
@@ -215,13 +190,11 @@ private Callable<MyWayList> findWay = new Callable<MyWayList>(){
 ----
 
 
-== Useful Links
+=== Useful Links
 
 High level description which describes how to manage the game state and the rendering in different threads: link:http://altdevblog.com/2011/07/03/threading-and-your-game-loop/[link]. A C++ example can be found at link:http://gamasutra.com/blogs/AndreaMagnorsky/20130527/193087/Multithreading_rendering_in_a_game_engine_with_CDouble_buffer_implementation.php[link]
 
 
-
-== Conclusion
+=== Conclusion
 
 The cool thing about this approach is that every entity creates one self-contained Callable for the Executor, and they are all executed in parallel. In theory, you can have one thread per entity without changing anything else but the settings of the executor.
-

+ 0 - 53
src/docs/asciidoc/jme3/advanced/networking.adoc

@@ -10,21 +10,17 @@ ifdef::env-github,env-browser[:outfilesuffix: .adoc]
 
 This document introduces you to the SpiderMonkey networking +++<abbr title="Application Programming Interface">API</abbr>+++. You use this +++<abbr title="Application Programming Interface">API</abbr>+++ when you develop games where several players compete with one another in real time. A multi-player game is made up of several clients connecting to a server:
 
-
 *  The central server (one headless SimpleApplication) coordinates the game in the background.
 *  Each player runs a game client (a standard SimpleApplication) and connects to the central server.
 
 Each Client keeps the Server informed about its player's moves and actions. The Server centrally maintains the game state and broadcasts the state info back to all connected clients. This network synchronization allows all clients to share the same game world. Each client then displays the game state to one player from this player's perspective.
 
 
-
 == SpiderMonkey API Overview
 
 The SpiderMonkey +++<abbr title="Application Programming Interface">API</abbr>+++ is a set of interfaces and helper classes in the 'com.jme3.network' package.  For most users, this package and the 'message' package is all they need to worry about.  (The 'base' and 'kernel' packages only come into play when implementing custom network transports or alternate client/server protocols, which is now possible).
 
-
 The SpiderMonkey +++<abbr title="Application Programming Interface">API</abbr>+++ assists you in creating a Server, Clients, and Messages. Once a Server instance is created and started, the Server accepts remote connections from Clients, and you can send and receive Messages. Client objects represent the client-side of the client-server connection.  Within the Server, these Client objects are referred to as HostedConnections. HostedConnections can hold application-defined client-specific session attributes that the server-side listeners and services can use to track player information, etc.
-
 [cols="3", options="header"]
 |===
 
@@ -40,7 +36,6 @@ a| com.jme3.network.HostedConnection
 
 You can register several types of listeners to be notified of changes.
 
-
 *  MessageListeners on both the Client and the Server are notified when new messages arrive.  You can use MessageListeners to be notified about only specific types of messages.
 *  ClientStateListeners inform the Client of changes in its connection state, e.g. when the client gets kicked from the server.
 *  ConnectionListeners inform the Server about HostedConnection arrivals and removals, e.g. if a client joins or quits.
@@ -54,7 +49,6 @@ You can register several types of listeners to be notified of changes.
 
 The game server is a “headless com.jme3.app.SimpleApplication:
 
-
 [source,java]
 ----
 
@@ -74,10 +68,8 @@ A `Headless` SimpleApplication executes the simpleInitApp() method and runs the
 ====
 
 
-
 Create a com.jme3.network.Server in the `simpleInitApp()` method and specify a communication port, for example 6143.
 
-
 [source,java]
 ----
 
@@ -93,12 +85,10 @@ Create a com.jme3.network.Server in the `simpleInitApp()` method and specify a c
 When you run this app on a host, the server is ready to accept clients. Let's create a client next.
 
 
-
 === Creating a Client
 
 A game client is a standard com.jme3.app.SimpleApplication.
 
-
 [source,java]
 ----
 
@@ -118,10 +108,8 @@ A standard SimpleApplication in `Display` mode executes the simpleInitApp() meth
 ====
 
 
-
 Create a com.jme3.network.Client in the `simpleInitApp()` method and specify the servers IP address, and the same communication port as for the server, here 6143.
 
-
 [source,java]
 ----
 
@@ -135,15 +123,12 @@ public void simpleInitApp() {
 
 The server address can be in the format “localhost or “127.0.0.1 (for local testing), or an IP address of a remote host in the format “123.456.78.9”. In this example, we assume the server is running on the localhost.
 
-
 When you run this client, it connects to the server.
 
 
-
 === Getting Info About a Client
 
 The server refers to a connected client as com.jme3.network.HostedConnection objects. The server can get info about clients as follows:
-
 [cols="2", options="header"]
 |===
 
@@ -162,7 +147,6 @@ a|Server gets the first (0), second (1), etc, connected HostedConnection object
 |===
 
 Your game can define its own game data based on whatever criteria you want, typically these include player ID and state. If the server needs to look up player/client-specific information, you can store this information directly on the HostedConnection object. The following examples read and write a custom Java object `MyState` in the HostedConnection object `conn`:
-
 [cols="2", options="header"]
 |===
 
@@ -185,7 +169,6 @@ a| Server can read an attribute of the HostedConnection.
 
 Each message represents data that you want to transmit between client and server. Common message examples include transformation updates or game actions. For each message type, create a message class that extends com.jme3.network.AbstractMessage. Use the @Serializable annotation from com.jme3.network.serializing.Serializable and create an empty default constructor. Custom constructors, fields, and methods are up to you and depend on the message data that you want to transmit.
 
-
 [source,java]
 ----
 
@@ -200,7 +183,6 @@ public class HelloMessage extends AbstractMessage {
 
 You must register each message type to the com.jme3.network.serializing.Serializer, in both server and client!
 
-
 [source,java]
 ----
 Serializer.registerClass(HelloMessage.class);
@@ -212,12 +194,10 @@ Serializer.registerClass(HelloMessage.class);
 After a Message was received, a Listener responds to it. The listener can access fields of the message, and send messages back, start new threads, etc. There are two listeners, one on the server, one on the client. For each message type, you implement the responses in either Listeners’ `messageReceived()` method.
 
 
-
 ==== ClientListener.java
 
 Create one ClientListener.java and make it extend `com.jme3.network.MessageListener`.
 
-
 [source,java]
 ----
 public class ClientListener implements MessageListener<Client> {
@@ -232,7 +212,6 @@ public class ClientListener implements MessageListener<Client> {
 
 For each message type, register a client listener to the client.
 
-
 [source,java]
 ----
 myClient.addMessageListener(new ClientListener(), HelloMessage.class);
@@ -243,7 +222,6 @@ myClient.addMessageListener(new ClientListener(), HelloMessage.class);
 
 Create one ServerListener.java and make it extend `com.jme3.network.MessageListener`.
 
-
 [source,java]
 ----
 public class ServerListener implements MessageListener<HostedConnection> {
@@ -258,7 +236,6 @@ public class ServerListener implements MessageListener<HostedConnection> {
 
 For each message type, register a server listener to the server:
 
-
 [source,java]
 ----
 myServer.addMessageListener(new ServerListener(), HelloMessage.class);
@@ -269,7 +246,6 @@ myServer.addMessageListener(new ServerListener(), HelloMessage.class);
 
 Let's create a new message of type HelloMessage:
 
-
 [source,java]
 ----
 Message message = new HelloMessage("Hello World!");
@@ -277,7 +253,6 @@ Message message = new HelloMessage("Hello World!");
 
 Now the client can send this message to the server:
 
-
 [source,java]
 ----
 myClient.send(message);
@@ -285,7 +260,6 @@ myClient.send(message);
 
 Or the server can broadcast this message to all HostedConnection (clients):
 
-
 [source,java]
 ----
 Message message = new HelloMessage("Welcome!");
@@ -294,7 +268,6 @@ myServer.broadcast(message);
 
 Or the server can send the message to a specific subset of clients (e.g. to HostedConnection conn1, conn2, and conn3): 
 
-
 [source,java]
 ----
 myServer.broadcast( Filters.in( conn1, conn2, conn3 ), message );
@@ -302,7 +275,6 @@ myServer.broadcast( Filters.in( conn1, conn2, conn3 ), message );
 
 Or the server can send the message to all but a few selected clients (e.g. to all HostedConnections but conn4):
 
-
 [source,java]
 ----
 myServer.broadcast( Filters.notEqualTo( conn4 ), message );
@@ -311,12 +283,10 @@ myServer.broadcast( Filters.notEqualTo( conn4 ), message );
 The last two broadcasting methods use com.jme3.network.Filters to select a subset of recipients. If you know the exact list of recipients, always send the messages directly to them using the Filters; avoid flooding the network with unnecessary broadcasts to all.
 
 
-
 == Identification and Rejection
 
 The ID of the Client and HostedConnection are the same at both ends of a connection. The ID is given out authoritatively by the Server.
 
-
 [source,java]
 ----
 ... myClient.getId() ...
@@ -325,7 +295,6 @@ The ID of the Client and HostedConnection are the same at both ends of a connect
 A server has a game version and game name property. Each client expects to communicate with a server with a certain game name and version. Test first whether the game name matches, and then whether game version matches, before sending any messages! If they do not match, SpiderMoney will reject it for you, you have no choice in the mater. This is so the client and server can avoid miscommunication.
 
 
-
 [TIP]
 ====
 Typically, your networked game defines its own attributes (such as player ID) based on whatever criteria you want. If you want to look up player/client-specific information beyond the game version, you can set this information directly on the Client/HostedConnection object (see Getting Info About a Client).
@@ -333,7 +302,6 @@ Typically, your networked game defines its own attributes (such as player ID) ba
 
 
 
-
 == Closing Clients and Server Cleanly
 
 
@@ -341,7 +309,6 @@ Typically, your networked game defines its own attributes (such as player ID) ba
 
 You must override the client's destroy() method to close the connection cleanly when the player quits the client:
 
-
 [source,java]
 ----
 
@@ -358,7 +325,6 @@ You must override the client's destroy() method to close the connection cleanly
 
 You must override the server's destroy() method to close the connection when the server quits:
 
-
 [source,java]
 ----
 
@@ -375,7 +341,6 @@ You must override the server's destroy() method to close the connection when the
 
 The server can kick a HostedConnection to make it disconnect. You should provide a String with further info (an explanation to the user what happened, e.g. “Shutting down for maintenance) for the server to send along. This info message can be used (displayed to the user) by a ClientStateListener. (See below)
 
-
 [source,java]
 ----
 conn.close("We kick cheaters.");
@@ -387,19 +352,16 @@ conn.close("We kick cheaters.");
 The server and clients are notified about connection changes.
 
 
-
 === ClientStateListener
 
 The com.jme3.network.ClientStateListener notifies the Client when the Client has fully connected to the server (including any internal handshaking), and when the Client is kicked (disconnected) from the server.
 
 
-
 [TIP]
 ====
 The ClientStateListener when it receives a network exception applies the default close action. This just stops the client and you'll have to build around it so your application knows what to do. If you need more control when a network exception happens and the client closes, you may want to investigate in a ErrorListener.
 ====
 
-
 [cols="2", options="header"]
 |===
 
@@ -416,7 +378,6 @@ a| Implement here what happens after the server kicks this client. For example,
 
 First implement the ClientStateListener interface in the Client class. Then register it to myClient in MyGameClient's simpleInitApp() method:
 
-
 [source,java]
 ----
 myClient.addClientStateListener(this);
@@ -426,7 +387,6 @@ myClient.addClientStateListener(this);
 === ConnectionListener
 
 The com.jme3.network.ConnectionListener notifies the Server whenever new HostedConnections (clients) come and go.  The listener notifies the server after the Client connection is fully established (including any internal handshaking).
-
 [cols="2", options="header"]
 |===
 
@@ -443,7 +403,6 @@ a| Implement here what happens after a HostedConnection has left. E.g. a player
 
 First implement the ConnectionListener interface in the Server class. Then register it to myServer in MyGameServer's simpleInitApp() method. 
 
-
 [source,java]
 ----
 myServer.addConnectionListener(this);
@@ -455,14 +414,12 @@ myServer.addConnectionListener(this);
 The com.jme3.network.ErrorListener is a listener for when network exception happens. This listener is built so that you can override the default actions when a network exception happens.
 
 
-
 [IMPORTANT]
 ====
 If you intend on using the default network mechanics, *don't* use this!
 If you do override this, make sure you add a mechanic that can close the client otherwise your client will get stuck open and cause errors.
 ====
 
-
 [cols="2", options="header"]
 |===
 
@@ -481,10 +438,8 @@ This interface was built for the client and server, but the code has never been
 ====
 
 
-
 First implement the ErrorListener interface in the client class. Then you need to register it to myClient in MyGameClients's simpleInitApp() method.
 
-
 [source,java]
 ----
 myClient.addErrorListener(this);
@@ -492,7 +447,6 @@ myClient.addErrorListener(this);
 
 In the class that implements the ErrorListener, a method would of been added call handleError(Client s, Throwable t). Inside this method to get you started, you going to want to listen for an error. To do this you're going to want a bit of code like this.
 
-
 [source,java]
 ----
 if(t instanceof exception) {
@@ -503,12 +457,10 @@ if(t instanceof exception) {
 Replace *exception* part in the *if* statement for the type of exception that you would like it to handle.
 
 
-
 == UDP versus TCP
 
 SpiderMonkey supports both UDP (unreliable, fast) and TCP (reliable, slow) transport of messages.
 
-
 [source,java]
 ----
 message1.setReliable(true); // TCP
@@ -528,10 +480,8 @@ message2.setReliable(false); // UDP
 ====
 
 
-
 Multithreading means that you create a Callable. A Callable is a Java class representing any (possibly time-intensive) self-contained task that has an impact on the scene graph (such as positioning the player). You enqueue the Callable in the Executor of the client's OpenGL thread. The Callable ensures to executes the modification in sync with the update loop.
 
-
 [source,java]
 ----
 app.enqueue(callable);
@@ -539,12 +489,9 @@ app.enqueue(callable);
 
 Learn more about using <<jme3/advanced/multithreading#,multithreading>> in jME3 here.
 
-
 For general advice, see the articles link:https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking[MultiPlayer Networking] and link:https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Protocol_Design_and_Optimization[Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization] by the Valve Developer Community.
 
 
-
 == Troubleshooting
 
 If you have set up a server in your home network, and the game clients cannot reach the server from the outside, it's time to learn about link:http://portforward.com/[port forwarding].
-

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio