瀏覽代碼

fix smart quotes

mitm001 5 年之前
父節點
當前提交
cedb1753e8
共有 33 個文件被更改,包括 196 次插入249 次删除
  1. 1 1
      docs/modules/ROOT/pages/getting-started/jme3_source_structure.adoc
  2. 1 1
      docs/modules/ROOT/pages/report_bugs.adoc
  3. 3 3
      docs/modules/contributions/pages/es/entitysystem/detailed.adoc
  4. 11 15
      docs/modules/contributions/pages/es/entitysystem/terms.adoc
  5. 9 13
      docs/modules/contributions/pages/gui/tonegodgui/combobox.adoc
  6. 4 8
      docs/modules/contributions/pages/gui/tonegodgui/element.adoc
  7. 27 31
      docs/modules/contributions/pages/gui/tonegodgui/quickstart.adoc
  8. 7 12
      docs/modules/contributions/pages/gui/tonegodgui/styles.adoc
  9. 10 14
      docs/modules/contributions/pages/gui/tonegodgui/tonegodgui_quickstart.adoc
  10. 2 2
      docs/modules/core/pages/app/state/capture_audio_video_to_a_file.adoc
  11. 3 7
      docs/modules/core/pages/app/state/screenshots.adoc
  12. 2 2
      docs/modules/core/pages/collision/collision_and_intersection.adoc
  13. 8 8
      docs/modules/core/pages/effect/post-processor_water.adoc
  14. 12 16
      docs/modules/core/pages/gui/nifty_gui_popup_menu.adoc
  15. 1 1
      docs/modules/core/pages/gui/nifty_gui_projection.adoc
  16. 4 4
      docs/modules/core/pages/input/input_handling.adoc
  17. 1 1
      docs/modules/core/pages/light/light_and_shadow.adoc
  18. 1 1
      docs/modules/core/pages/renderer/remote-controlling_the_camera.adoc
  19. 2 2
      docs/modules/core/pages/scene/shape/shape.adoc
  20. 8 8
      docs/modules/core/pages/shader/jme3_shadernodes.adoc
  21. 5 5
      docs/modules/core/pages/shader/jme3_shaders.adoc
  22. 5 9
      docs/modules/core/pages/system/jme3_srgbpipeline.adoc
  23. 2 2
      docs/modules/core/pages/terrain/terrain.adoc
  24. 5 5
      docs/modules/networking/pages/monkey_zone.adoc
  25. 2 2
      docs/modules/physics/pages/control/vehicles.adoc
  26. 6 5
      docs/modules/physics/pages/joint/hinges_and_joints.adoc
  27. 9 9
      docs/modules/tutorials/pages/beginner/hello_picking.adoc
  28. 2 2
      docs/modules/tutorials/pages/beginner/solutions.adoc
  29. 3 3
      docs/modules/tutorials/pages/how-to/articles/pbr/pbr_part3.adoc
  30. 17 21
      docs/modules/tutorials/pages/how-to/java/localization.adoc
  31. 4 8
      docs/modules/tutorials/pages/how-to/java/logging.adoc
  32. 15 19
      docs/modules/tutorials/pages/how-to/java/read_graphic_card_capabilites.adoc
  33. 4 9
      docs/modules/tutorials/pages/how-to/java/swing_canvas.adoc

+ 1 - 1
docs/modules/ROOT/pages/getting-started/jme3_source_structure.adoc

@@ -73,7 +73,7 @@ a| Native libraries needed for bullet (not jbullet) on android.
 or
 
 * bullet
-** with one or both “natives” library
+** with one or both "`natives`" library
 *** bullet-native
 *** jme3-bullet-native-android
 

+ 1 - 1
docs/modules/ROOT/pages/report_bugs.adoc

@@ -16,7 +16,7 @@ Note that for troubleshooting, the forum is the preferred way.
 .  Fill in the form using the bug report template bellow, and click on "Submit new issue" when you're done.
 
 
-== Filing a new issue in the ‘contribution depot’
+== Filing a new issue in the '`contribution depot`'
 
 You need a registered account on link:https://hub.jmonkeyengine.org[our forum] to post a new thread.
 

+ 3 - 3
docs/modules/contributions/pages/es/entitysystem/detailed.adoc

@@ -230,7 +230,7 @@ Entity should just be interpreted as a bunch of its Component. GameObject or any
 
 From software designer POV, Relationship in COP is a sensitive topic; by nature, Component is against (or overide) Relation.
 
-The deception ‘Has’ relationship between Entity and its Component actually represent everything in various meaning from the literature ‘Is’ , or literature ‘Has’.. to ‘related to’. BUT keep in mind, this is blury and its almost always implemented as indirect acess, not like a property in an object but envolve processing-lookup under the curtain! So you may find this difficult to extract and detect these different from your tranditional OOP software design!
+The deception '`Has`' relationship between Entity and its Component actually represent everything in various meaning from the literature '`Is`' , or literature '`Has`'.. to '`related to`'. BUT keep in mind, this is blury and its almost always implemented as indirect acess, not like a property in an object but envolve processing-lookup under the curtain! So you may find this difficult to extract and detect these different from your tranditional OOP software design!
 
 
 === Some insights
@@ -421,9 +421,9 @@ Of course, ES has its mising features!!!!
 ====
 
 
-But for some reason its designs consider good for real=time application like a "`common`" video Game, or "`common`" simmulation; especially common in MMO world.
+But for some reason its design's consider good for real=time application like a "`common`" video Game, or "`common`" simmulation; especially common in MMO world.
 
-Here is a short of ‘why’ answers from a software architecture designer view, explain based on its borrowed ideas: [This is very different from various source you've read, because it's not embeded any implementation details!!!]
+Here is a short of '`why`' answers from a software architecture designer view, explain based on its borrowed ideas: [This is very different from various source you've read, because it's not embeded any implementation details!!!]
 
 .  Decoupling : each piece can work together without aware of each other.
 .  Resuable : can be easily bring to use again somewhere else.

+ 11 - 15
docs/modules/contributions/pages/es/entitysystem/terms.adoc

@@ -1,16 +1,12 @@
 = terms
-:author:
-:revnumber:
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 
 == Object Oriented Programming
 
-Object-oriented programming (OOP) is a programming paradigm that represents concepts as “objects” that have data fields (attributes that describe the object) and associated procedures known as methods.
+Object-oriented programming (OOP) is a programming paradigm that represents concepts as "`objects`" that have data fields (attributes that describe the object) and associated procedures known as methods.
 
 link:http://en.wikipedia.org/wiki/Object-oriented_programming[http://en.wikipedia.org/wiki/Object-oriented_programming]
 
@@ -28,9 +24,9 @@ link:http://en.wikipedia.org/wiki/List_of_programming_languages_by_category#Data
 
 == Component Oriented Programming
 
-This is “the rising force” we are talking about!
+This is "`the rising force`" we are talking about!
 
-It’s a “rather new” programming paradigm. Despite of its name and even the fact it’s was born from the marriage of “Component base architecture” and “Data oriented architecture”, but something different.
+It’s a "`rather new`" programming paradigm. Despite of its name and even the fact it’s was born from the marriage of "`Component base architecture`" and "`Data oriented architecture`", but something different.
 
 
 == COP’s Entity System in OOP java
@@ -45,7 +41,7 @@ We are talking about the ES within COP, but implemented by an pure OOP like Java
 
 == Data driven programming:
 
-You may refer to this “Data driven programming” incorrectly in this ES topic, you may talking about: *Data driven design* insted
+You may refer to this "`Data driven programming`" incorrectly in this ES topic, you may talking about: *Data driven design* insted
 
 In computer programming, data-driven programming is a programming paradigm in which the program statements describe the data to be matched and the processing required rather than defining a sequence of steps to be taken
 
@@ -73,19 +69,19 @@ link:http://en.wikipedia.org/wiki/Data-driven_programming[http://en.wikipedia.or
 ....
 
 ....
-  It has the “data force”, that’s why it call ‘driven’, the force sometime a “generative force”!
+  It has the "`data force`", that’s why it call '`driven`', the force sometime a "`generative force`"!
 ....
 
 
 == Data oriented (design) architecture:
 
 ....
-  Data oriented design is an approach that extracts the operations on the data from the “objects” and flattens the things that they need to run in order to be cache friendly. According to the literature (I got my first exposure in Game Engine Gems 2, Chapter 15), in many cases it actually simplifies the code.
+  Data oriented design is an approach that extracts the operations on the data from the "`objects`" and flattens the things that they need to run in order to be cache friendly. According to the literature (I got my first exposure in Game Engine Gems 2, Chapter 15), in many cases it actually simplifies the code.
 ....
 
-From atomixs overview:
+From atomix's overview:
 
-Data oriented architecture is focus in Data arrangement and process(delay of data and the dataflow) and everything is Data, with a repository! It have more aspects than Data driven architecture and not talking about “the force of generative data”.
+Data oriented architecture is focus in Data arrangement and process(delay of data and the dataflow) and everything is Data, with a repository! It have more aspects than Data driven architecture and not talking about "`the force of generative data`".
 
 In hardware level, data oriented appear in structure and operations of chip set, when input and output are carefullly design to get batch/cache efficient.
 
@@ -104,4 +100,4 @@ So normally Data oriented architecture go along with Data driven… but they are
 
 === Why so much people in java world get this wrong at first?
 
-But of course Oracle solution are much more complex than a single chipset, as it also envolve EJB, SOAP… with also an candidate for “Data driven architecture”… That’s . But EJB and SOAP are essential pieces of BPM “Data oriented architecture”!!!
+But of course Oracle solution are much more complex than a single chipset, as it also envolve EJB, SOAP… with also an candidate for "`Data driven architecture`"… That’s . But EJB and SOAP are essential pieces of BPM "`Data oriented architecture`"!!!

+ 9 - 13
docs/modules/contributions/pages/gui/tonegodgui/combobox.adoc

@@ -1,10 +1,6 @@
 = combobox
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/25
 
 
 
@@ -24,15 +20,15 @@ The combo box and select box works exactly like any other combo box or select bo
 
 ComboBox combo = new ComboBox(
     screen,
-    “SomeID”,
+    "SomeID",
     new Vector2f(5,5)
 );
-combo.addListItem(“Some caption”, “Some value”);
-combo.addListItem(“Some caption”, “Some value”);
-combo.addListItem(“Some caption”, “Some value”);
-combo.addListItem(“Some caption”, “Some value”);
-combo.addListItem(“Some caption”, “Some value”);
-combo.addListItem(“Some caption”, “Some value”);
+combo.addListItem("Some caption", "Some value");
+combo.addListItem("Some caption", "Some value");
+combo.addListItem("Some caption", "Some value");
+combo.addListItem("Some caption", "Some value");
+combo.addListItem("Some caption", "Some value");
+combo.addListItem("Some caption", "Some value");
 
 ----
 

+ 4 - 8
docs/modules/contributions/pages/gui/tonegodgui/element.adoc

@@ -1,10 +1,6 @@
 = element
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/25
 
 
 
@@ -32,11 +28,11 @@ The Element class only provides a single constructor using all 6 of the common p
   */
 Element el = new Element(
     screen,
-    “SomeID”,
+    "SomeID",
     new Vector2f(5,5),
     new Vector2f(100,100),
     new Vector4f(5,5,5,5),
-    “someImgPath.png”
+    "someImgPath.png"
 );
 
 ----

+ 27 - 31
docs/modules/contributions/pages/gui/tonegodgui/quickstart.adoc

@@ -1,10 +1,6 @@
 = quickstart
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 
@@ -35,7 +31,7 @@ guiNode.addControl(screen);
 ----
 
 // this = any JME Application
-Screen screen = new Screen(this, “tonegod/gui/style/def/style_map.xml”);
+Screen screen = new Screen(this, "tonegod/gui/style/def/style_map.xml");
 guiNode.addControl(screen);
 
 ----
@@ -62,8 +58,8 @@ Here are the three contrustor choices for creating the window:
   * String UID,
   * Vector2f position
   */
- 
-Window win = new Window(screen, “win”, new Vector2f(15, 15));
+
+Window win = new Window(screen, "win", new Vector2f(15, 15));
 screen.addElement(win);
 
 ----
@@ -78,8 +74,8 @@ The second adds a 4th parameter to specify the windows dimensions, like such:
 
 /** Additional Parameter:
   * Vector2f dimensions  */
- 
-Window win = new Window(screen, “win”, new Vector2f(15, 15),
+
+Window win = new Window(screen, "win", new Vector2f(15, 15),
     new Vector2f(400, 300)
 );
 screen.addElement(win);
@@ -96,10 +92,10 @@ The third option adds 2 more parameters and looks like this:
   * Vector4f resizeBorders,
   * String defaultImg
   */
- 
-Window win = new Window(screen, “win”, new Vector2f(15, 15), new Vector2f(400, 300),
+
+Window win = new Window(screen, "win", new Vector2f(15, 15), new Vector2f(400, 300),
     new Vector4f(14,14,14,14),
-    “tonegod/gui/style/def/Window/panel_x.png”
+    "tonegod/gui/style/def/Window/panel_x.png"
 );
 screen.addElement(win);
 
@@ -137,11 +133,11 @@ First, lets setup a method to create new windows:
 ----
 
 private int winCount = 0;
- 
+
 public final void createNewWindow(String someWindowTitle) {
     Window nWin = new Window(
         screen,
-        “Window” + winCount,
+        "Window" + winCount,
         new Vector2f( (screen.getWidth()/2)-175, (screen.getHeight()/2)-100 )
     );
     nWin.setWindowTitle(someWindowTitle);
@@ -161,14 +157,14 @@ Now we can add the button will call our create window method.
   * String UID,
   * Vector2f position
   */
- 
-ButtonAdapter makeWindow = new ButtonAdapter( screen, “Btn1″, new Vector2f(15, 55) ) {
+
+ButtonAdapter makeWindow = new ButtonAdapter( screen, "Btn1", new Vector2f(15, 55) ) {
     @Override
     public void onButtonMouseLeftUp(MouseButtonEvent evt, boolean toggled) {
-        createNewWindow(“New Window ” + winCount);
+        createNewWindow("New Window " + winCount);
     }
 };
- 
+
 // Add it to out initial window
 win.addChild(makeWindow);
 
@@ -233,37 +229,37 @@ There are more behaviors, however, these are the most critical when creating cus
 
 public int winCount = 0;
 private Screen screen;
- 
+
 public final void createNewWindow(String someWindowTitle) {
     Window nWin = new Window(
         screen,
-        “Window” + winCount,
+        "Window" + winCount,
         new Vector2f( (screen.getWidth()/2)-175, (screen.getHeight()/2)-100 )
     );
     nWin.setWindowTitle(someWindowTitle);
     screen.addElement(nWin);
     winCount++;
 }
- 
+
 public void simpleInitApp() {
-    screen = new Screen(this, “tonegod/gui/style/def/style_map.xml”);
+    screen = new Screen(this, "tonegod/gui/style/def/style_map.xml");
     screen.initialize();
     guiNode.addControl(screen);
- 
+
     // Add window
-    Window win = new Window(screen, “win”, new Vector2f(15, 15));
- 
+    Window win = new Window(screen, "win", new Vector2f(15, 15));
+
     // create button and add to window
-    ButtonAdapter makeWindow = new ButtonAdapter( screen, “Btn1″, new Vector2f(15, 55) ) {
+    ButtonAdapter makeWindow = new ButtonAdapter( screen, "Btn1", new Vector2f(15, 55) ) {
         @Override
         public void onButtonMouseLeftUp(MouseButtonEvent evt, boolean toggled) {
-            createNewWindow(“New Window ” + winCount);
+            createNewWindow("New Window " + winCount);
         }
     };
- 
+
     // Add it to our initial window
     win.addChild(makeWindow);
- 
+
     // Add window to the screen
    screen.addElement(win);
 }

+ 7 - 12
docs/modules/contributions/pages/gui/tonegodgui/styles.adoc

@@ -1,10 +1,6 @@
 = styles
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../../
-:imagesdir: ../../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 
@@ -33,7 +29,7 @@ To retrieve a tag from a style you must use the get method for the data type you
 [source,java]
 ----
 
-screen.getStyle(“StyleName”).getColorRGBA(“TagNameInStyle”);
+screen.getStyle("StyleName").getColorRGBA("TagNameInStyle");
 
 ----
 
@@ -146,10 +142,10 @@ The tags for storing properties are fomatted as follows:
 ----
 
 <property name="ID" type="Vector4f />
-    <x value="0.5 /> 
-    <y value="0.5 /> 
-    <z value="0.5 /> 
-    <w value="0.5 /> 
+    <x value="0.5 />
+    <y value="0.5 />
+    <z value="0.5 />
+    <w value="0.5 />
 </property>
 
 ----
@@ -248,4 +244,3 @@ You can now copy the existing XML docs for each listed in the style_map.xml file
 ====
 Don't forget to update the path in the style_map.xml file to point to your local copy for each control XML file you copy/edit.
 ====
-

+ 10 - 14
docs/modules/contributions/pages/gui/tonegodgui/tonegodgui_quickstart.adoc

@@ -1,10 +1,6 @@
 = tonegodgui_quickstart
-:author:
-:revnumber:
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 
@@ -32,7 +28,7 @@ guiNode.addControl(screen);
 ----
 
 // this = any JME Application
-Screen screen = new Screen(this, “tonegod/gui/style/def/style_map.xml”);
+Screen screen = new Screen(this, "tonegod/gui/style/def/style_map.xml");
 screen.initialize();
 guiNode.addControl(screen);
 
@@ -51,7 +47,7 @@ Next, we add a control. Might as well start with something interesting as all co
   * Vector2f position
   */
 
-Window win = new Window(screen, “win”, new Vector2f(15, 15));
+Window win = new Window(screen, "win", new Vector2f(15, 15));
 screen.addElement(win);
 
 ----
@@ -66,7 +62,7 @@ The second adds a 4th parameter to specify the windows dimensions, like such:
 /** Additional Parameter:
   * Vector2f dimensions  */
 
-Window win = new Window(screen, “win”, new Vector2f(15, 15),
+Window win = new Window(screen, "win", new Vector2f(15, 15),
     new Vector2f(400, 300)
 );
 screen.addElement(win);
@@ -83,9 +79,9 @@ The third option adds 2 more parameters and looks like this:
   * String defaultImg
   */
 
-Window win = new Window(screen, “win”, new Vector2f(15, 15), new Vector2f(400, 300),
+Window win = new Window(screen, "win", new Vector2f(15, 15), new Vector2f(400, 300),
     new Vector4f(14,14,14,14),
-    “tonegod/gui/style/def/Window/panel_x.png”
+    "tonegod/gui/style/def/Window/panel_x.png"
 );
 screen.addElement(win);
 
@@ -111,7 +107,7 @@ private int winCount = 0;
 public final void createNewWindow(String someWindowTitle) {
     Window nWin = new Window(
         screen,
-        “Window” + winCount,
+        "Window " + winCount,
         new Vector2f( (screen.getWidth()/2)-175, (screen.getHeight()/2)-100 )
     );
     nWin.setWindowTitle(someWindowTitle);
@@ -132,10 +128,10 @@ Now lets add the button to allow users to create new window:
   * Vector2f position
   */
 
-ButtonAdapter makeWindow = new ButtonAdapter( screen, “Btn1″, new Vector2f(15, 55) ) {
+ButtonAdapter makeWindow = new ButtonAdapter( screen, "Btn1", new Vector2f(15, 55) ) {
     @Override
     public void onButtonMouseLeftUp(MouseButtonEvent evt, boolean toggled) {
-        createNewWindow(“New Window ” + winCount);
+        createNewWindow("New Window " + winCount);
     }
 };
 

+ 2 - 2
docs/modules/core/pages/app/state/capture_audio_video_to_a_file.adoc

@@ -105,7 +105,7 @@ 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
+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
 your preferred container/codec format.  Be advised that some
@@ -116,7 +116,7 @@ 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
+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

+ 3 - 7
docs/modules/core/pages/app/state/screenshots.adoc

@@ -1,10 +1,6 @@
 = Taking Screenshots
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/25
 
 
 The com.jme3.app.state.ScreenshotAppState enables your users to take screenshots of the running game.
@@ -19,6 +15,6 @@ this.stateManager.attach(screenShotState);
 
 ----
 
-The default screenshot key is KeyInput.KEY_SYSRQ, alos known as “System Request / Print Screen key. On Mac keyboards, this key does not exist, so on Mac +++<abbr title="Operating System">OS</abbr>+++ you take screenshots using Command+Shift+3 (fullscreen) or Command+Shift+4 (windowed: press space to select a window and then click).
+The default screenshot key is KeyInput.KEY_SYSRQ, also known as "`System Request / Print Screen`" key. On Mac keyboards, this key does not exist, so on Mac +++<abbr title="Operating System">OS</abbr>+++ you take screenshots using Command+Shift+3 (fullscreen) or Command+Shift+4 (windowed: press space to select a window and then click).
 
 The screenshot is saved to the user directory.

+ 2 - 2
docs/modules/core/pages/collision/collision_and_intersection.adoc

@@ -137,7 +137,7 @@ Supported types:
 *  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.)
-*  Type.Capsule = Cylinder with rounded ends, also called “swept sphere. Typically used for mobile characters. (Currently not supported.)
+*  Type.Capsule = Cylinder with rounded ends, also called "`swept`" sphere. Typically used for mobile characters. (Currently not supported.)
 
 
 [NOTE]
@@ -167,7 +167,7 @@ One of the supported ``Collidable``s are meshes and scene graph objects. To exec
 
 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.
+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.

+ 8 - 8
docs/modules/core/pages/effect/post-processor_water.adoc

@@ -23,7 +23,7 @@ The SeaMonkey WaterFilter is ideal for oceans and lakes, and especially for unde
 
 The effect is part of a deferred rendering process, taking advantage of the pre-computed position buffer and back buffer (a texture representing the screen’s pixels position in view space, and a texture of the rendered scene).
 
-After some calculation, this allows to reconstruct the position in world space for each pixel on the screen. If a pixel is under a given water height, let’s render it as a blue pixel! Blue pixel? Not exactly, we want waves, we want ripples, we want foam, we want reflection and refraction.
+After some calculation, this allows to reconstruct the position in world space for each pixel on the screen. If a pixel is under a given water height, let’s render it as a blue pixel! Blue pixel? Not exactly, we want waves, we want ripples, we want foam, we want reflection and refraction.
 
 The GameDev.net article describes how those effects are achieved, but the main idea is to generate waves from a height map, create ripples from a normal map, blend in the foam texture when the water depth is below a certain height, compute the refraction color with a clever color extinction algorithm, and then, display the reflection and specular effect by computing a Fresnel term (like in the simple water effect). In addition, this effect allows to blend the water shore with the ground to avoid the hard edges of classic water effects based on grids or quads.
 
@@ -135,14 +135,14 @@ a|How fast the waves move. Set it to 0.0f for still water.
 a|1.0f
 
 a|water.setHeightTexture( (Texture2D) +
-manager.loadTexture(“Textures/waveheight.png) )
+manager.loadTexture("Textures/waveheight.png") )
 a|This height map describes the shape of the waves
-a|“Common/MatDefs/Water/Textures/heightmap.jpg
+a|"Common/MatDefs/Water/Textures/heightmap.jpg"
 
 a|water.setNormalTexture( (Texture2D) +
-manager.loadTexture(“Textures/wavenormals.png) )
+manager.loadTexture("Textures/wavenormals.png") )
 a|This normal map describes the shape of the waves
-a|“Common/MatDefs/Water/Textures/gradient_map.jpg
+a|"Common/MatDefs/Water/Textures/gradient_map.jpg"
 
 a|water.setUseRipples(false);
 a|Switches the ripples effect on or off.
@@ -184,7 +184,7 @@ a|Sets how fast colors fade out. use this to control how clear (e.g. 0.05f) or m
 a| 0.1f
 
 a|water.setColorExtinction(new Vector3f(10f,20f,30f));
-a|Sets At what depth the refraction color extincts. The three values are RGB (red, green, blue) in this order. Play with these parameters to “muddy the water.
+a|Sets At what depth the refraction color extincts. The three values are RGB (red, green, blue) in this order. Play with these parameters to "`muddy`" the water.
 a|Vector3f(5f,20f,30f)
 
 |===
@@ -231,9 +231,9 @@ a|The three values describe what depth foam starts to fade out, at what depth it
 a|Vector3f(0.45f,4.35f,1.0f)
 
 a|water.setFoamTexture( (Texture2D) +
-manager.loadTexture(“Textures/foam.png) )
+manager.loadTexture("Textures/foam.png") )
 a|This foam texture will be used with WrapMode.Repeat
-a|“Common/MatDefs/Water/Textures/foam.jpg
+a|"Common/MatDefs/Water/Textures/foam.jpg"
 
 |===
 

+ 12 - 16
docs/modules/core/pages/gui/nifty_gui_popup_menu.adoc

@@ -1,13 +1,9 @@
 = Nifty GUI: Create a PopUp Menu
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
-Even though you create and populate the popup menu in Java, you still need a “placeholder in your XML file.
+Even though you create and populate the popup menu in Java, you still need a "`placeholder`" in your XML file.
 The popup element needs to be placed _outside_ of any screen!
 
 [source,xml]
@@ -41,21 +37,21 @@ public void createMyPopupMenu(){
   popup = nifty.createPopup("niftyPopupMenu");
   Menu myMenu = popup.findNiftyControl("#menu", Menu.class);
   myMenu.setWidth(new SizeValue("100px")); // must be set
-  myMenu.addMenuItem("Click me!", "menuItemIcon.png", 
+  myMenu.addMenuItem("Click me!", "menuItemIcon.png",
     new menuItem("menuItemid", "blah blah")); // menuItem is a custom class
   nifty.subscribe(
-    nifty.getCurrentScreen(), 
-    myMenu.getId(), 
-    MenuItemActivatedEvent.class, 
+    nifty.getCurrentScreen(),
+    myMenu.getId(),
+    MenuItemActivatedEvent.class,
     new MenuItemActivatedEventSubscriber());
 }
 
 public void showMenu() { // the method to trigger the menu
   // If this is a menu that is going to be used many times, then
-  // call this in your constructor rather than here   
-  createMyPopupMenu() 
+  // call this in your constructor rather than here
+  createMyPopupMenu()
   // call the popup to screen of your choice:
-  nifty.showPopup(nifty.getCurrentScreen(), popup.getId(), null); 
+  nifty.showPopup(nifty.getCurrentScreen(), popup.getId(), null);
 }
 
 private class menuItem {
@@ -78,9 +74,9 @@ To handle menu item events (i.e. calling a method when you click on a menu item)
 [source,java]
 ----
 
-  private class MenuItemActivatedEventSubscriber 
+  private class MenuItemActivatedEventSubscriber
     implements EventTopicSubscriber<MenuItemActivatedEvent> {
-    
+
     @Override
     public void onEvent(final String id, final MenuItemActivatedEvent event) {
     	menuItem item = (menuItem) event.getItem();

+ 1 - 1
docs/modules/core/pages/gui/nifty_gui_projection.adoc

@@ -16,7 +16,7 @@ image::gui/nifty-gui.png[nifty-gui.png,width="310",height="250",align="left"]
 
 Typically you define a key (for example escape) to switch the +++<abbr title="Graphical User Interface">GUI</abbr>+++ on and off. Then you xref:gui/nifty_gui_overlay.adoc[overlay] the running game with the +++<abbr title="Graphical User Interface">GUI</abbr>+++ (you will most likely pause the game then).
 
-Alternatively, you can also project the +++<abbr title="Graphical User Interface">GUI</abbr>+++ as a texture onto a mesh textures inside the game. Allthough this looks cool and “immersive, this approach is rarely used since it is difficult to record clicks this way. You can only interact with this projected +++<abbr title="Graphical User Interface">GUI</abbr>+++ by keyboard, or programmatically. You can select input fields using the arrow keys, and trigger actions using the return key.
+Alternatively, you can also project the +++<abbr title="Graphical User Interface">GUI</abbr>+++ as a texture onto a mesh textures inside the game. Allthough this looks cool and "`immersive`", this approach is rarely used since it is difficult to record clicks this way. You can only interact with this projected +++<abbr title="Graphical User Interface">GUI</abbr>+++ by keyboard, or programmatically. You can select input fields using the arrow keys, and trigger actions using the return key.
 
 This +++<abbr title="Graphical User Interface">GUI</abbr>+++ projection variant is less commonly used than the +++<abbr title="Graphical User Interface">GUI</abbr>+++ overlay variant. Usecases for +++<abbr title="Graphical User Interface">GUI</abbr>+++ projection are, for example, a player avatar using an in-game computer screen.
 

+ 4 - 4
docs/modules/core/pages/input/input_handling.adoc

@@ -199,7 +199,7 @@ The two input listeners do not know, and do not care, which actual key was press
 
 `com.jme3.input.controls.ActionListener`
 
-*  Use for absolute “button pressed or released?, “on or off? actions.
+*  Use for absolute "`button`" pressed or released?, on or off? actions.
 **  Examples: Pause/unpause, a rifle or revolver shot, jump, click to select.
 
 *  JME gives you access to:
@@ -246,14 +246,14 @@ 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.
+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"});
 ----
 
-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.
+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]
 ----
@@ -323,7 +323,7 @@ private AnalogListener analogListener = new AnalogListener() {
 
 == Let Users Remap Keys
 
-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.
+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.
 

+ 1 - 1
docs/modules/core/pages/light/light_and_shadow.adoc

@@ -63,7 +63,7 @@ rootNode.addLight(lamp_light);
 image::light/house-directionallight.png[A house model illuminated with a sun-like directional light,width="300",height="210"]
 
 
-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.
+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.
 

+ 1 - 1
docs/modules/core/pages/renderer/remote-controlling_the_camera.adoc

@@ -18,7 +18,7 @@ CameraNode camNode = cinematic.bindCamera("topView", cam);
 ----
 
 .  Position the camera node in its start location.
-.  Use activateCamera() to give the control of the camera to this node. You now see the scene from this camera's point of view. For example to see through the camera node named “topView, 6 seconds after the start of the cinematic, you'd write
+.  Use activateCamera() to give the control of the camera to this node. You now see the scene from this camera's point of view. For example to see through the camera node named "`topView`", 6 seconds after the start of the cinematic, you'd write
 +
 [source,java]
 ----

+ 2 - 2
docs/modules/core/pages/scene/shape/shape.adoc

@@ -57,7 +57,7 @@ image::scene/shape/pyramid.png[pyramid.png,width="108",height=""]
 --
 [.right.text-left]
 image::http://i204.photobucket.com/albums/bb19/mike_ch_1/torus.png[Torus,width="108",height="80"]
-*  com.jme3.scene.shape.Torus – An single-holed torus or “donut.
+*  com.jme3.scene.shape.Torus – An single-holed torus or "`donut`".
 --
 
 [.float-group]
@@ -116,7 +116,7 @@ Create one static shape as mesh and use it in several geometries, or clone() the
 
 === Complex Shapes
 
-You can compose more complex custom Geometries out of simple Shapes. Think of the buildings in games like Angry Birds, or the building blocks in Second Life (prims) and in Tetris (Tetrominos).
+You can compose more complex custom Geometries out of simple Shapes. Think of the buildings in games like Angry Birds, or the building blocks in Second Life (prims) and in Tetris (Tetrominos).
 
 .  Create a Node. By default it is located at the origin (0/0/0) – leave the Node there for now.
 .  Create your shapes and wrap each into a Geometry, as just described.

+ 8 - 8
docs/modules/core/pages/shader/jme3_shadernodes.adoc

@@ -14,7 +14,7 @@ jME3 material system is entirely based on shaders. While it's pretty powerful, t
 *  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. +
+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.*
 
@@ -92,7 +92,7 @@ All that is not between [] is mandatory.
 **  *NodeDefName* : The name of this ShaderNodeDefinition
 
 *  +++<u>Type</u>+++ : define the type of this shader node
-**  *ShaderType* : The type of shader for this definition. For now only “Vertex and “Fragment are supported.
+**  *ShaderType* : The type of shader for this definition. For now only "`Vertex`" and "`Fragment`" are supported.
 
 *  +++<u>Shader</u>+++ : the version and path of the shader code to use. note that you can have several shader with different GLSL version. The generator will pick the relevant one according to GPU capabilities.
 **  *ShaderLangAndVersion* : follows the same syntax than the shader declaration in the j3md file : GLSL&lt;version&gt;, version being 100 for glsl 1.0 , 130 for glsl 1.3, 150 for glsl 1.5 and so on. Note that this is the *minimum* glsl version this shader supports
@@ -103,11 +103,11 @@ All that is not between [] is mandatory.
 **  *@output* can be use to prefix an output name so the sdk recognize it and format it accordingly. the syntax id @output &lt;inputName&gt; &lt;description&gt;
 
 *  +++<u>Input</u>+++ : The input block containing all the inputs of this node. A node can have 1 or several inputs.
-**  *GlslVarType* : a valid glsl variable type that will be used in the shader for this input. see link:https://www.khronos.org/opengl/wiki/GLSL_Type[https://www.khronos.org/opengl/wiki/GLSL_Type] and the “Declare an array chapter
+**  *GlslVarType* : a valid glsl variable type that will be used in the shader for this input. see link:https://www.khronos.org/opengl/wiki/GLSL_Type[https://www.khronos.org/opengl/wiki/GLSL_Type] and the "`Declare`" an array chapter
 **  *VarName* : the name of the variable. Note that you can't have several inputs with the same name.
 
 *  +++<u>Output</u>+++ : The output block containing all the outputs of this node. A node can have 1 or several outputs.
-**  *GlslVarType* : a valid glsl variable type that will be used in the shader for this input. see link:https://www.khronos.org/opengl/wiki/GLSL_Type[https://www.khronos.org/opengl/wiki/GLSL_Type] and the “Declare an array chapter
+**  *GlslVarType* : a valid glsl variable type that will be used in the shader for this input. see link:https://www.khronos.org/opengl/wiki/GLSL_Type[https://www.khronos.org/opengl/wiki/GLSL_Type] and the "`Declare`" an array chapter
 **  *VarName* : the name of the variable. Note that you can't have several outputs with the same name.
 
 [NOTE]
@@ -189,7 +189,7 @@ If this value change the shader will have to be recompiled, due to the fact that
 
 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. +
+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.
 
@@ -240,9 +240,9 @@ ShaderNode <ShaderNodeName>{
 **  *DefinitionPath* : in case the definition is declared in it's own j3sn file, you have to set the path to this file here.
 
 *  +++<u>Condition</u>+++ a condition that dictates if the node is active or not.
-**  *ActivationCondition* : The condition for this node to be used. Today we use Defines to use different blocks of code used depending on the state of a Material Parameter. The condition here use the exact same paradigm. A valid condition must be the name of a material parameter or any combinations using logical operators &#8220;||,“&amp;&amp;,“! or grouping characters “( and “). The generator will create the corresponding define and the shader node code will be embed into and #ifdef statement.
+**  *ActivationCondition* : The condition for this node to be used. Today we use Defines to use different blocks of code used depending on the state of a Material Parameter. The condition here use the exact same paradigm. A valid condition must be the name of a material parameter or any combinations using logical operators &#8220;||,"`&amp;&amp;`", "`!`" or grouping characters "`(`" and "`)`". The generator will create the corresponding define and the shader node code will be embed into and #ifdef statement.
 
-For example, let's say we have a Color and ColorMap material parameter, this condition “Color || ColorMap will generate this statement :
+For example, let's say we have a Color and ColorMap material parameter, this condition "`Color || ColorMap`" will generate this statement :
 
 [source,java]
 ----
@@ -267,7 +267,7 @@ For example, let's say we have a Color and ColorMap material parameter, this con
 **  *MappingCondition* : Follows the same rules as the activation condition for the shaderNode, this mapping will be embed in a #ifdef statement n the resulting shader.
 
 *  +++<u>OutputMapping</u>+++ : This block is optional, as mapping of output will be done in input mapping block of following shaderNodes, ecept if you want to output a value to the Global output of the shader.
-**  *NameSpace* : the name space of the output to assign, this can only be “Global here.
+**  *NameSpace* : the name space of the output to assign, this can only be "`Global`" here.
 **  *VarName* : the name of a global output (can be anything, just be aware that 2 different names result in 2 different outputs).
 **  *OutputVariable* : Must be an output of the current node's definition.
 **  *MappingCondition* : Same as before.

+ 5 - 5
docs/modules/core/pages/shader/jme3_shaders.adoc

@@ -134,7 +134,7 @@ JME3 can expose pre-computed global uniforms to your shaders. You must specify t
 
 [NOTE]
 ====
-In the shader, the uniform names will be prefixed by a “g_”.
+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.
@@ -155,7 +155,7 @@ JME3 uses some global uniforms for lighting:
 **  use for DirectionalLight: strangely enough it's used for the direction of the light…this might change though. The fourth component contains -1 and it's used in the lighting shader to know if it's a directionalLight or not.
 *  g_AmbientLightColor: the color of the ambient light.
 
-These uniforms are passed to the shader without having to declare them in the j3md file, but you have to specify in the technique definition “ LightMode MultiPass see lighting.j3md for more information.
+These uniforms are passed to the shader without having to declare them in the j3md file, but you have to specify in the technique definition "`LightMode MultiPass`" see lighting.j3md for more information.
 
 
 === JME3 attributes
@@ -166,7 +166,7 @@ You can find a complete list of those attribute in the Type enum of the VertexBu
 
 [NOTE]
 ====
-In the shader the attributes names will be prefixed by an “in”.
+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.
@@ -176,7 +176,7 @@ When the enumeration lists some usual types for each attribute (for example texC
 
 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.
+Any uniform has to be declared in the material definition file (.j3md) in the "`MaterialParameters`" section.
 
 [source,java]
 ----
@@ -219,7 +219,7 @@ there are setXXXX methods for any type of uniform you want to pass.
 ----
 
 To use this uniform in the shader, you need to declare it in the .frag or .vert files (depending on where you need it).
-You can make use of the defines here and later in the code: *Note that the “m_ prefix specifies that the uniform is a material parameter.*
+You can make use of the defines here and later in the code: *Note that the "`m_`" prefix specifies that the uniform is a material parameter.*
 
 [source,java]
 ----

+ 5 - 9
docs/modules/core/pages/system/jme3_srgbpipeline.adoc

@@ -1,10 +1,6 @@
 = Gamma Correction or sRGB pipeline
-:author:
-:revnumber:
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 
@@ -20,7 +16,7 @@ Gamma Correction is the technique that tends to correct the issue. Gamma is an p
 
 *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).
+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.
@@ -90,7 +86,7 @@ This uses Opengl hardware gamma correction that uses an approximated Gamma value
 [NOTE]
 ====
 This will not yield exact results, as the real gamma can vary depending on the monitor. +
-If this is a problem, please refer to the “handling gamma correction in a post process section.
+If this is a problem, please refer to the "`handling gamma correction`" in a post process section.
 ====
 
 
@@ -163,7 +159,7 @@ For example here is how the NormalMap parameter is declared in the lighting mate
 
 ----
 
-When a texture is assigned to this material param by using material.setTexture(“NormalMap, myNormalTexture), the color space of this texture's image will be forced to linear. So if you make your own material and want to use Gamma Correction, make sure you properly mark your textures as in the proper color space.
+When a texture is assigned to this material param by using material.setTexture("NormalMap", myNormalTexture), the color space of this texture's image will be forced to linear. So if you make your own material and want to use Gamma Correction, make sure you properly mark your textures as in the proper color space.
 
 This can sound complicated, but you just have to answer this question :  Does my image represent color data? if the answer is no, then you have to set the -Linear flag.
 

+ 2 - 2
docs/modules/core/pages/terrain/terrain.adoc

@@ -51,7 +51,7 @@ image::terrain/terrain-lod-high-medium-low.png[The wiremesh of a terrain with vi
 
 You have seen GeoMipMapping implemented in games before. This is where the farther away terrain has fewer polygons, and as you move closer, more polygons fill in. The whole terrain is divided into a grid of patches, and each one has its own level of detail (LOD). The GeoMipMapping algorithm looks at each patch, and its neighbours, to determine how to render the geometry. It will seam the edges between two patches with different LOD.
 
-GeoMipMapping often leads to “popping where you see the terrain switch from one LOD to another. TerraMonkey has been designed so you can swap out different LOD calculation algorithms based on what will look best for your game. You can do this with the LodCalculator interface.
+GeoMipMapping often leads to "`popping`" where you see the terrain switch from one LOD to another. TerraMonkey has been designed so you can swap out different LOD calculation algorithms based on what will look best for your game. You can do this with the LodCalculator interface.
 
 GeoMipMapping in TerraMonkey has been split into several parts: the terrain quad tree, and the LODGeomap. The geomap deals with the actual LOD and seaming algorithm. So if you want a different data structure for your terrain system, you can re-use this piece of code. The quad tree (TerrainQuad and TerrainPatch) provide a means to organize the LODGeomaps, notify them of their neighbour's LOD change, and to update the geometry when the LOD does change. To change the LOD it does this by changing the index buffer of the triangle strip, so the whole geometry doesn't have to be re-loaded onto the video card. If you are eager for more detail on how GeoMipMapping works read: link:http://www.flipcode.com/archives/article_geomipmaps.pdf[Fast Terrain Rendering Using Geometrical MipMapping
 ].
@@ -64,7 +64,7 @@ TerraMonkey is a quad tree. Each node is a TerrainQuad, and each leaf is a Terra
 
 == Texture Splatting
 
-When you '`slap`' a texture on a mesh, the whole mesh looks the same. For big meshes (such as terrains) that is undesirable because it looks very boring (your whole landscape would be all rock, or all grass, or all sand). Texture Splatting is a technique that lets you “paint several textures into one combined texure. Each of the splat textures has an opacity value so you can define where it is visible in the final overall texture.
+When you '`slap`' a texture on a mesh, the whole mesh looks the same. For big meshes (such as terrains) that is undesirable because it looks very boring (your whole landscape would be all rock, or all grass, or all sand). Texture Splatting is a technique that lets you "`paint`" several textures into one combined texure. Each of the splat textures has an opacity value so you can define where it is visible in the final overall texture.
 
 The default material for TerraMonkey is TerrainLighting.j3md. This material combines several texture maps to produce the final custom texture. Remember, Diffuse Maps are the main textures that define the look; optionally, each Diffuse Map can be enhanced with a Normal Map; Alpha Maps describe the opacity of each Diffuse Map used (one color –red, green, blue, or alpha– stands for one Diffuse Map's opacity); Glow and Specular Maps define optional effects.
 

+ 5 - 5
docs/modules/networking/pages/monkey_zone.adoc

@@ -16,7 +16,7 @@ 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.
 
-The game idea is based on “BattleZone” arcade game from the 1980s, a first-person shooter the with real-time strategy elements.
+The game idea is based on "`BattleZone`" arcade game from the 1980s, a first-person shooter the with real-time strategy elements.
 The game was written using the jMonkeyEngine SDK, and it's based off the BasicGame project template. It took us one week to create a playable pre-alpha, including networking.
 The project design follows best practices that make it possible to edit maps, vehicles, etc, in jMonkeyEngine SDK without having to change the code – This allows 3D graphic designers to contribute models more easily. (If you feel like contributing assets or working on parts of the game code, drop us a note!)
 
@@ -33,7 +33,7 @@ _The way MonkeyZone is implemented is just one of the many possible ways to do a
 
 The game uses certain terms that might be familiar to you but maybe used in another way, so heres a quick rundown on the terms being used.
 
-*  Player –	Logical human or AI player that can enter entities and generally act, only exists as PlayerData “database” with an id.
+*  Player –	Logical human or AI player that can enter entities and generally act, only exists as PlayerData "`database`" with an id.
 *  Entity –	Spatial with UserData, a world object like character, vehicle, box or factory. The base form is defined only by a String pointing to the j3o which already has all userdata like hitpoints, speed etc.
 *  User –	Human player using a client
 *  Player Group – Group of players that play together (e.g. one human player and one AI companion per client). For now that's the same as client_id of human player for all AIControl’ed players originating from that client.
@@ -53,7 +53,7 @@ xref:core:scene/control/custom_controls.adoc[Controls] are used extensively in M
 
 ==== ...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.
+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.
 
 
@@ -90,7 +90,7 @@ To implement autonomous AI players MonkeyZone uses a system of Commands that are
 
 ==== Triggers
 
-The SphereTrigger is a TriggerControl that is also attached to each AI players current entity. It consists of a GhostControl that checks the overlapping entities around the entity its attached to. It can be assigned a command that is checked with every entity entering the SphereTrigger and executed if applicable (e.g. normal “attack enemy” mode).
+The SphereTrigger is a TriggerControl that is also attached to each AI players current entity. It consists of a GhostControl that checks the overlapping entities around the entity its attached to. It can be assigned a command that is checked with every entity entering the SphereTrigger and executed if applicable (e.g. normal "`attack enemy`" mode).
 
 
 ==== NavMesh
@@ -101,7 +101,7 @@ For each map a navigation mesh is generated that allows the entities to navigate
 === 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”.
+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

+ 2 - 2
docs/modules/physics/pages/control/vehicles.adoc

@@ -50,7 +50,7 @@ The goal is to create a physical vehicle with wheels that can be steered and tha
 
 == Creating the Vehicle Chassis
 
-The vehicle that we create here in the link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsCar.java[TestPhysicsCar.java] example is just a “box on wheels, a basic vehicle shape that you can replace with a fancy car model, as demonstrated in link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestFancyCar.java[TestFancyCar.java].
+The vehicle that we create here in the link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestPhysicsCar.java[TestPhysicsCar.java] example is just a "`box`" on wheels, a basic vehicle shape that you can replace with a fancy car model, as demonstrated in link:https://github.com/jMonkeyEngine/jmonkeyengine/blob/master/jme3-examples/src/main/java/jme3test/bullet/TestFancyCar.java[TestFancyCar.java].
 
 Every physical object must have a collision shape, that we prepare first. For the vehicle, we choose a compound collision shape that is made up of a box-shaped body of the right size for the vehicle. We will add the wheels later.
 
@@ -105,7 +105,7 @@ vehicle.setSuspensionStiffness(stiffness);
 vehicle.setMaxSuspensionForce(10000.0f);
 ----
 
-We now have a node `vehicleNode` with a visible “car geometry, which acts like a vehicle. One thing that's missing are wheels.
+We now have a node `vehicleNode` with a visible "`car`" geometry, which acts like a vehicle. One thing that's missing are wheels.
 
 
 == Adding the Wheels

+ 6 - 5
docs/modules/physics/pages/joint/hinges_and_joints.adoc

@@ -22,10 +22,10 @@ In this example, we will create a pendulum. The joint is the (invisible) connect
 **  This gives us a PhysicsSpace for PhysicsControls
 
 .  For the pendulum, we use a Spatial with a PhysicsControl, and we apply physical forces to them.
-**  The parts of the “pendulum are Physics Control'ed Spatials with Collision Shapes.
+**  The parts of the "`pendulum`" are Physics Control'ed Spatials with Collision Shapes.
 **  We create a fixed `hookNode` and a dynamic `pendulumNode`.
 
-.  We can “crank the handle and rotate the joint like a hinge, or we can let loose and expose the joints freely to gravity.
+.  We can "`crank`" the handle and rotate the joint like a hinge, or we can let loose and expose the joints freely to gravity.
 **  For physical forces we will use the method `joint.enableMotor();`
 
 
@@ -71,7 +71,7 @@ For a rope bridge, each set of planks would be one dynamic node.
 
 A PhysicsHingeJoint is an invisible connection between two nodes – here between the pendulum body and the hook. Why are hinges and joints represented by the same class? Hinges and joints have something in common: They constrain the _mechanical degree of freedom_ (DOF) of another object.
 
-Consider a free falling, “unchained object in physical 3D space: It has 6 DOFs:
+Consider a free falling, "`unchained`" object in physical 3D space: It has 6 DOFs:
 
 *  It translates along 3 axes
 *  It rotates around 3 axes
@@ -105,7 +105,8 @@ private HingeJoint joint;
                      new Vector3f(0f, 1f, 0f),  // pivot point local to B
                      Vector3f.UNIT_Z,           // DoF Axis of A (Z axis)
                      Vector3f.UNIT_Z  );        // DoF Axis of B (Z axis)
-
+...
+}
 ----
 
 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)`.
@@ -132,7 +133,7 @@ bulletAppState.getPhysicsSpace().add(joint);
 
 == 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.
+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.
 

+ 9 - 9
docs/modules/tutorials/pages/beginner/hello_picking.adoc

@@ -183,21 +183,21 @@ Keep an eye on the application's output stream, it will give you more details: T
 
 The methods `makeCube()`,  `makeFloor()`, `initMark()`, and `initCrossHairs`, are custom helper methods. We call them from  `simpleInitApp()` to initialize the scenegraph with sample content.
 
-.  `makeCube()` creates simple colored boxes for “target practice.
-.  `makeFloor()` creates a gray floor node for “target practice.
-.  `initMark()` creates a red sphere (mark). We will use it later to mark the spot that was hit.
+.  `makeCube()` creates simple colored boxes for "`target`" practice.
+.  `makeFloor()` creates a gray floor node for "`target`" practice.
+.  `initMark()` creates a red sphere (mark). We will use it later to mark the spot that was hit.
 **  Note that the mark is not attached and therefor not visible at the start!
 
-.  `initCrossHairs()` creates simple cross-hairs by printing a “+ sign in the middle of the screen.
+.  `initCrossHairs()` creates simple cross-hairs by printing a "`+`" sign in the middle of the screen.
 **  Note that the cross-hairs are attached to the `guiNode`, not to the `rootNode`.
 
 
-In this example, we attached all “shootable objects to one custom node, `Shootables`. This is an optimization so the engine only has to calculate intersections with objects we are actually interested in.  The `Shootables` node is attached to the `rootNode` as usual.
+In this example, we attached all "`shootable`" objects to one custom node, `Shootables`. This is an optimization so the engine only has to calculate intersections with objects we are actually interested in.  The `Shootables` node is attached to the `rootNode` as usual.
 
 
 == Understanding Ray Casting for Hit Testing
 
-Our goal is to determine which box the user “shot (picked). In general, we want to determine which mesh the user has selected by aiming the cross-hairs at it. Mathematically, we draw a line from the camera and see whether it intersects with objects in the 3D scene. This line is called a ray.
+Our goal is to determine which box the user "`shot`" (picked). In general, we want to determine which mesh the user has selected by aiming the cross-hairs at it. Mathematically, we draw a line from the camera and see whether it intersects with objects in the 3D scene. This line is called a ray.
 
 Here is our simple ray casting algorithm for picking objects:
 
@@ -310,7 +310,7 @@ Note how it prints a lot of output to show you which hits were registered.
   };
 ----
 
-TIP: Notice how you use the provided method `results.getClosestCollision().getContactPoint()` to determine the _closest_ hit's location. If your game includes a “weapon or “spell that can hit multiple targets, you could also loop over the list of results, and interact with each of them.
+TIP: Notice how you use the provided method `results.getClosestCollision().getContactPoint()` to determine the _closest_ hit's location. If your game includes a "`weapon`" or "`spell`" that can hit multiple targets, you could also loop over the list of results, and interact with each of them.
 
 
 === Picking Action Using Mouse Pointer
@@ -366,7 +366,7 @@ Here are some tips:
 
 Shooting boxes isn't very exciting – can you add code that loads and positions a model in the scene, and shoot at it?
 
-*  Tip: You can use `Spatial golem = assetManager.loadModel(“Models/Oto/Oto.mesh.xml);` from the engine's jme3-test-data.jar.
+*  Tip: You can use `Spatial golem = assetManager.loadModel("Models/Oto/Oto.mesh.xml");` from the engine's jme3-test-data.jar.
 *  Tip: Models are shaded! You need some light!
 
 
@@ -377,7 +377,7 @@ Change the code as follows to simulate the player picking up objects into the in
 .  Create an inventory node to store the detached nodes temporarily.
 .  The inventory node is not attached to the rootNode.
 .  You can make the inventory visible by attaching the inventory node to the guiNode (which attaches it to the HUD). Note the following caveats:
-**  If your nodes use a lit Material (not “Unshaded.j3md), also add a light to the guiNode.
+**  If your nodes use a lit Material (not "`Unshaded.j3md`"), also add a light to the guiNode.
 **  Size units are pixels in the HUD, therefor a 2-wu cube is displayed only 2 pixels wide in the HUD. – Scale it bigger!
 **  Position the nodes: The bottom left corner of the HUD is (0f,0f), and the top right corner is at (settings.getWidth(),settings.getHeight()).
 

+ 2 - 2
docs/modules/tutorials/pages/beginner/solutions.adoc

@@ -274,7 +274,7 @@ flyCam.setEnabled(true);
 
 === Exercise 1
 
-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:
+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]
 ----
@@ -284,7 +284,7 @@ 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!
+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:
 

+ 3 - 3
docs/modules/tutorials/pages/how-to/articles/pbr/pbr_part3.adoc

@@ -4,7 +4,7 @@
 
 
 image::how-to/articles/pbr/irradianceMap.png[irradianceMap,width="320",height="250",align="center"]
-*Note* : after several discussions in the team, I realized that some points were not clear in the  “PBR for artists” post. I’ve made an update with additional information on how to handle metalness and specular. I invite you to read it.
+*Note* : after several discussions in the team, I realized that some points were not clear in the  "`PBR for artists`" post. I’ve made an update with additional information on how to handle metalness and specular. I invite you to read it.
 
 xref:how-to/articles/pbr/pbr_part1.adoc[Physically Based Rendering – Part one]
 
@@ -95,7 +95,7 @@ Here is the diffuse effect of indirect lighting using an irradiance cube map
 
 === IBL Specular
 
-Indirect diffuse is cool, but we want “shiny”!! Shiny implies specular lighting.
+Indirect diffuse is cool, but we want "`shiny`"!! Shiny implies specular lighting.
 
 It’s important to understand what we want as a specular reflection. We want it to be very neat when the roughness is low and very blurry when it’s high.
 
@@ -122,7 +122,7 @@ As explained before, we need the reflection to be more blurry as the roughness i
 
 From mip levels to mip levels we’re going to convolve (blur) the images depending on the roughness. The more the roughness increase the more samples we’re going to use, and the more spread out they will be.
 
-But that’s not all, we also want to “bake” the specular BRDF in the map, so for each pixel we are going to compute the Cook-Torrentz microfacet BRDF (remember last post).
+But that’s not all, we also want to "`bake`" the specular BRDF in the map, so for each pixel we are going to compute the Cook-Torrentz microfacet BRDF (remember last post).
 
 But, as we are preprocessing the map, we don’t have any information about the shaded surface normal and view direction. So we are going to assume they are all the same, and equal to the envVector we’ll use to fetch pixels from the map. Also we assume that the shading point is exactly at the center of the cube map.
 

+ 17 - 21
docs/modules/tutorials/pages/how-to/java/localization.adoc

@@ -1,21 +1,17 @@
 = Localizing jME 3 Games
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 
 == Scope
 
-Localizing an application can mean several things: 
+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.
+*  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. +
+*  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:
@@ -30,7 +26,7 @@ The jMonkeyEngine SDK supports opening and editing Bundle.properties files. Also
 
 To prepare the application for localization, you have to first identify all hard-coded messages.
 
-.  Find every line in your jME3 game where you hard-coded message strings, e.g. 
+.  Find every line in your jME3 game where you hard-coded message strings, e.g.
 +
 [source,java]
 ----
@@ -39,15 +35,15 @@ UiText.setText("Score: " + score);
 ----
 
 .  Create one file named `Bundle.properties` in each directory where there are Java file that contain messages.
-.  For every hard-coded message, you add one line to the `Bundle.properties` file: First specify a unique key that identifies this string; then an equal sign; and the literal string itself. 
+.  For every hard-coded message, you add one line to the `Bundle.properties` file: First specify a unique key that identifies this string; then an equal sign; and the literal string itself.
 +
 [source]
 ----
 greeting=Hello World!
-score.display=Score: 
+score.display=Score:
 ----
 
-.  In the source code, replace every occurence of a hard-coded message with the appropriate Resource Bundle call to its unique key: 
+.  In the source code, replace every occurence of a hard-coded message with the appropriate Resource Bundle call to its unique key:
 +
 [source,java]
 ----
@@ -67,12 +63,12 @@ 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. 
+.  Translate all strings (text on the right side of the equal sign) in the `Bundle_de.properties` to German.
 +
 [source]
 ----
 greeting=Hallo Welt!
-score.display=Spielstand: 
+score.display=Spielstand:
 ----
 +
 [IMPORTANT]
@@ -87,7 +83,7 @@ Do not modify any of the keys (text to the left of the equal sign)!
 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 
+To get the full list of language suffixes use
 
 [source,java]
 ----
@@ -102,21 +98,21 @@ System.out.println(Arrays.toString(Locale.getISOLanguages()));
 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: 
+*  Keep material layers:
 +
 [source,java]
 ----
 mat.setTexture("ColorMap", tex);
 ----
 
-*  Keep paths: 
+*  Keep paths:
 +
 [source,java]
 ----
 teapot = assetManager.loadModel("Models/Teapot/Teapot.obj");
 ----
 
-*  Keep geometry and node names: 
+*  Keep geometry and node names:
 +
 [source,java]
 ----
@@ -124,7 +120,7 @@ Geometry thing=new Geometry("A thing", mesh);
 Node vehicle = new Node("Vehicle");
 ----
 
-*  Keep mappings: 
+*  Keep mappings:
 +
 [source,java]
 ----
@@ -142,7 +138,7 @@ 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.
+*  The localizer only sees the strings, without any context. E.g. does "`Search History`" mean "`display`" the history of searches, or "`search`" through the history? ⇒ Use clear key labels. Work closely with the localizers if they require extra info, and add that info as comments to the translation file.
 *  Broken international characters ⇒ Make sure the files are saved with the same character encoding as the font file(s) you're using. Nowadays, that usually means UTF-8 since font files tend to come for Unicode.
 *  Missing international characters ⇒ Make sure that there's a glyph for every needed character in your font, either by using more complete font files or by having the translation changed.
 

+ 4 - 8
docs/modules/tutorials/pages/how-to/java/logging.adoc

@@ -1,10 +1,6 @@
 = Logging and Monitoring
-:author:
-:revnumber:
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 
@@ -35,7 +31,7 @@ private static final Logger LOGGER = Logger.getLogger(HelloWorld.class.getName()
 
 .  Declare the info that you want to include in the message. The variables (here `a, b, c`) can be any printable Java object. +
 Example: `Vector3f a = cam.getLocation();`
-.  Put the variables in a new `Object` array. Refer to the variables as `++{0},{1},{2}++` etc in the message string. Variables are numbered in the order you put them into the `Object` array. 
+.  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:
 +
@@ -55,7 +51,7 @@ LOGGER.log(Level.SEVERE, "MyGame error: {0} must not be {1} after {2}! Adjust fl
 
 [IMPORTANT]
 ====
-As you see in the examples, you should phrase potentially customer facing errors in a neutral way and offer _a reason and a solution_ for the error (if you don't, it has no value to your customer). If your deveopment team uses WARNINGs as replacement for casual printlns, make sure you deactivate them for the release.
+As you see in the examples, you should phrase potentially customer facing errors in a neutral way and offer _a reason and a solution_ for the error (if you don't, it has no value to your customer). If your deveopment team uses WARNINGs as replacement for casual printlns, make sure you deactivate them for the release.
 ====
 
 

+ 15 - 19
docs/modules/tutorials/pages/how-to/java/read_graphic_card_capabilites.adoc

@@ -1,10 +1,6 @@
 = Read Graphic Card Capabilites
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 When different people test your new game, you may get feedback that the game doesn't run on their hardware, or that some details don't look as expected. You need to detect which fetaures the user's hardware supports, and offer a replacement for non-supported features on olde hardware (or deactivate them automatically).
@@ -15,7 +11,7 @@ You can read (and print) the capabilities of the user's graphic card using the `
 ----
 
 Collection<Caps> caps = renderer.getCaps();
-Logger.getLogger(HelloWorld.class.getName()).log(Level.INFO, “Caps: {0}”, caps.toString());
+Logger.getLogger(HelloWorld.class.getName()).log(Level.INFO, "Caps: {0}", caps.toString());
 ----
 
 [NOTE]
@@ -26,12 +22,12 @@ Replace `HelloWorld` by the name of the class where you are using this line.
 
 == Examples
 
-A newer graphic card has modern capabilities, for example OpenGL 2.1 and NonPowerOfTwoTextures: 
+A newer graphic card has modern capabilities, for example OpenGL 2.1 and NonPowerOfTwoTextures:
 
 [source]
 ----
 
-INFO: Running on jMonkeyEngine 3.0.0 
+INFO: Running on jMonkeyEngine 3.0.0
 INFO: Using LWJGL 2.8.2
 INFO: Selected display mode: 1280 x 720 x 0 @0Hz
 INFO: Adapter: null
@@ -41,10 +37,10 @@ INFO: OpenGL Version: 2.1 ATI-7.14.5
 INFO: Renderer: AMD Radeon HD 6770M OpenGL Engine
 INFO: GLSL Ver: 1.20
 INFO: Timer resolution: 1.000 ticks per second
-INFO: Capabilities: [FrameBuffer, FrameBufferMRT, FrameBufferMultisample, 
-OpenGL20, OpenGL21, ARBprogram, GLSL100, GLSL110, GLSL120, 
-VertexTextureFetch, TextureArray, FloatTexture, 
-FloatColorBuffer, FloatDepthBuffer, PackedFloatTexture, SharedExponentTexture, PackedFloatColorBuffer, 
+INFO: Capabilities: [FrameBuffer, FrameBufferMRT, FrameBufferMultisample,
+OpenGL20, OpenGL21, ARBprogram, GLSL100, GLSL110, GLSL120,
+VertexTextureFetch, TextureArray, FloatTexture,
+FloatColorBuffer, FloatDepthBuffer, PackedFloatTexture, SharedExponentTexture, PackedFloatColorBuffer,
 TextureCompressionLATC, NonPowerOfTwoTextures, MeshInstancing]
 
 ----
@@ -53,7 +49,7 @@ Here is an example of the capabilities of an semi-old graphic card that only sup
 
 [source]
 ----
-INFO: Running on jMonkey Engine 3 
+INFO: Running on jMonkey Engine 3
 INFO: Using LWJGL 2.7.1
 INFO: Selected display mode: 1024 x 768 x 0 @0Hz
 INFO: Adapter: null
@@ -64,19 +60,19 @@ INFO: Renderer: ATI Radeon X1600 OpenGL Engine
 INFO: GLSL Ver: 1.20
 INFO: Timer resolution: 1.000 ticks per second
 INFO: Capabilities: [FrameBuffer, FrameBufferMRT, FrameBufferMultisample,
-OpenGL20, ARBprogram, GLSL100, GLSL110, GLSL120, 
-VertexTextureFetch, FloatTexture, 
+OpenGL20, ARBprogram, GLSL100, GLSL110, GLSL120,
+VertexTextureFetch, FloatTexture,
 TextureCompressionLATC, NonPowerOfTwoTextures]
 
 ----
 
-This next example is lacking `NonPowerOfTwoTextures`, this tells you that this user's graphic card cannot handle textures with sizes that are not square powers of two (such as “128x128).
+This next example is lacking `NonPowerOfTwoTextures`, this tells you that this user's graphic card cannot handle textures with sizes that are not square powers of two (such as "`128x128`").
 
 [source]
 ----
 
-INFO: Capabilities: [FrameBuffer, FrameBufferMRT, FrameBufferMultisample, 
-OpenGL20, ARBprogram, GLSL100, GLSL110, GLSL120, 
+INFO: Capabilities: [FrameBuffer, FrameBufferMRT, FrameBufferMultisample,
+OpenGL20, ARBprogram, GLSL100, GLSL110, GLSL120,
 VertexTextureFetch, FloatTexture, TextureCompressionLATC]
 
 ----

+ 4 - 9
docs/modules/tutorials/pages/how-to/java/swing_canvas.adoc

@@ -1,11 +1,6 @@
 = JME3 Canvas in a Swing GUI
-:author: 
-:revnumber: 
-:revdate: 2016/03/17 20:48
-:keywords: documentation, gui
-:relfileprefix: ../../
-:imagesdir: ../..
-ifdef::env-github,env-browser[:outfilesuffix: .adoc]
+:revnumber: 2.0
+:revdate: 2020/07/27
 
 
 3D games are typically played full-screen, or in a window that takes over the mouse and all inputs. However it is also possible to embed a jME 3 canvas in a standard Swing application. +
@@ -43,7 +38,7 @@ In short: The first thing that is different is the `main()` method. We don't cal
 
 == Main() and Runnable()
 
-The Swing isn't thread-safe and doesn't allow us to keep the jME3 canvas up-to-date. This is why we create a runnable for the jME canvas and queue it in the AWT event thread, so it can be invoked “later in the loop, when Swing is ready with updating its own stuff. +
+The Swing isn't thread-safe and doesn't allow us to keep the jME3 canvas up-to-date. This is why we create a runnable for the jME canvas and queue it in the AWT event thread, so it can be invoked "`later`" in the loop, when Swing is ready with updating its own stuff. +
 In the SwingCanvasTest's main() method, create a queued runnable(). It will contain the jME canvas and the Swing frame.
 
 [source,java]
@@ -106,7 +101,7 @@ JFrame window = new JFrame("Swing Application");
 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 ----
 
-We create a standard JPanel inside the JFrame. Give it any Layout you wish – here we use a simple Flow Layout. Where the code sample says “Some Swing Component, this is where you add your buttons and controls. +
+We create a standard JPanel inside the JFrame. Give it any Layout you wish – here we use a simple Flow Layout. Where the code sample says "`Some Swing Component`", this is where you add your buttons and controls. +
 The important step is to add() the canvas component into the panel, like all the other Swing components.
 
 [source,java]