debugging.html 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <title>Debugging :: jMonkeyEngine Docs</title>
  7. <link rel="canonical" href="https://wiki.jmonkeyengine.org/docs/jme3/advanced/debugging.html">
  8. <meta name="generator" content="Antora 2.3.3">
  9. <link rel="stylesheet" href="../../../_/css/site.css">
  10. <meta property="og:image" content="https://mitm001.github.io/docs.jmonkeyengine.org/_/img/iconx128.png">
  11. <meta property="og:description" content="Debugging">
  12. <meta property="og:title" content="jMonkeyEngine Docs">
  13. <link rel="icon" href="../../../_/img/favicon.ico" type="image/x-icon">
  14. </head>
  15. <body class="article">
  16. <header class="header">
  17. <nav class="navbar">
  18. <div class="navbar-brand">
  19. <a class="navbar-item" href="https://wiki.jmonkeyengine.org">
  20. <img alt="" src="../../../_/img/iconx128.png" width="32" type="image/x-icon" style="margin-right:16px">
  21. jMonkeyEngine Docs
  22. </a>
  23. <button class="navbar-burger" data-target="topbar-nav">
  24. <span></span>
  25. <span></span>
  26. <span></span>
  27. </button>
  28. </div>
  29. <div id="topbar-nav" class="navbar-menu">
  30. <div class="navbar-end">
  31. <div class="navbar-item theme-switch-wrapper">
  32. <label class="theme-switch" for="checkbox">
  33. <input type="checkbox" id="checkbox" />
  34. <div class="slider round"></div>
  35. </label>
  36. <p class="navlabel">Dark Mode</p>
  37. </div>
  38. <a class="navbar-item" href="https://github.com/jmonkeyengine/wiki">Github</a>
  39. </div>
  40. </div>
  41. </nav>
  42. </header>
  43. <div class="body">
  44. <div class="nav-container" data-component="docs" data-version="master">
  45. <aside class="nav">
  46. <div class="panels">
  47. <div class="nav-panel-menu is-active" data-panel="menu">
  48. <nav class="nav-menu">
  49. <h3 class="title"><a href="../../documentation.html">Docs</a></h3>
  50. <ul class="nav-list">
  51. <li class="nav-item" data-depth="0">
  52. <ul class="nav-list">
  53. <li class="nav-item" data-depth="1">
  54. <a class="nav-link" href="../../documentation.html">Getting Started</a>
  55. </li>
  56. <li class="nav-item" data-depth="1">
  57. <a class="nav-link" href="https://javadoc.jmonkeyengine.org/v3.3.2-stable">JavaDoc</a>
  58. </li>
  59. <li class="nav-item" data-depth="1">
  60. <button class="nav-item-toggle"></button>
  61. <a class="nav-link" href="../../jme3.html">jMonkeyEngine 3</a>
  62. <ul class="nav-list">
  63. <li class="nav-item" data-depth="2">
  64. <button class="nav-item-toggle"></button>
  65. <span class="nav-text">Beginner Tutorials</span>
  66. <ul class="nav-list">
  67. <li class="nav-item" data-depth="3">
  68. <a class="nav-link" href="../beginner/hello_simpleapplication.html">Hello SimpleApplication</a>
  69. </li>
  70. <li class="nav-item" data-depth="3">
  71. <a class="nav-link" href="../beginner/hello_node.html">Hello Node</a>
  72. </li>
  73. <li class="nav-item" data-depth="3">
  74. <a class="nav-link" href="../beginner/hello_asset.html">Hello Asset</a>
  75. </li>
  76. <li class="nav-item" data-depth="3">
  77. <a class="nav-link" href="../beginner/hello_main_event_loop.html">Hello Main Event Loop</a>
  78. </li>
  79. <li class="nav-item" data-depth="3">
  80. <a class="nav-link" href="../beginner/hello_input_system.html">Hello Input System</a>
  81. </li>
  82. <li class="nav-item" data-depth="3">
  83. <a class="nav-link" href="../beginner/hello_material.html">Hello Material</a>
  84. </li>
  85. <li class="nav-item" data-depth="3">
  86. <a class="nav-link" href="../beginner/hello_animation.html">Hello Animation</a>
  87. </li>
  88. <li class="nav-item" data-depth="3">
  89. <a class="nav-link" href="../beginner/hello_picking.html">Hello Picking</a>
  90. </li>
  91. <li class="nav-item" data-depth="3">
  92. <a class="nav-link" href="../beginner/hello_collision.html">Hello Collision</a>
  93. </li>
  94. <li class="nav-item" data-depth="3">
  95. <a class="nav-link" href="../beginner/hello_terrain.html">Hello Terrain</a>
  96. </li>
  97. <li class="nav-item" data-depth="3">
  98. <a class="nav-link" href="../beginner/hello_audio.html">Hello Audio</a>
  99. </li>
  100. <li class="nav-item" data-depth="3">
  101. <a class="nav-link" href="../beginner/hello_effects.html">Hello Effects</a>
  102. </li>
  103. <li class="nav-item" data-depth="3">
  104. <a class="nav-link" href="../beginner/hello_physics.html">Hello Physics</a>
  105. </li>
  106. </ul>
  107. </li>
  108. <li class="nav-item" data-depth="2">
  109. <button class="nav-item-toggle"></button>
  110. <span class="nav-text">Intermediate Tutorials</span>
  111. <ul class="nav-list">
  112. <li class="nav-item" data-depth="3">
  113. <button class="nav-item-toggle"></button>
  114. <span class="nav-text">Concepts</span>
  115. <ul class="nav-list">
  116. <li class="nav-item" data-depth="4">
  117. <a class="nav-link" href="../intermediate/best_practices.html">Best Practices</a>
  118. </li>
  119. <li class="nav-item" data-depth="4">
  120. <a class="nav-link" href="../intermediate/simpleapplication.html">Simple Application</a>
  121. </li>
  122. <li class="nav-item" data-depth="4">
  123. <a class="nav-link" href="../features.html">Features</a>
  124. </li>
  125. <li class="nav-item" data-depth="4">
  126. <a class="nav-link" href="../intermediate/optimization.html">Optimization</a>
  127. </li>
  128. <li class="nav-item" data-depth="4">
  129. <a class="nav-link" href="../faq.html">FAQ</a>
  130. </li>
  131. </ul>
  132. </li>
  133. <li class="nav-item" data-depth="3">
  134. <button class="nav-item-toggle"></button>
  135. <span class="nav-text">Math Concepts</span>
  136. <ul class="nav-list">
  137. <li class="nav-item" data-depth="4">
  138. <a class="nav-link" href="../math_for_dummies.html">Math For Dummies</a>
  139. </li>
  140. <li class="nav-item" data-depth="4">
  141. <a class="nav-link" href="../intermediate/math.html">Math</a>
  142. </li>
  143. <li class="nav-item" data-depth="4">
  144. <a class="nav-link" href="../math.html">More Math</a>
  145. </li>
  146. <li class="nav-item" data-depth="4">
  147. <a class="nav-link" href="../rotate.html">Rotate</a>
  148. </li>
  149. <li class="nav-item" data-depth="4">
  150. <a class="nav-link" href="../math_video_tutorials.html">Math Video Tutorials</a>
  151. </li>
  152. </ul>
  153. </li>
  154. <li class="nav-item" data-depth="3">
  155. <button class="nav-item-toggle"></button>
  156. <span class="nav-text">3D Graphics Concepts</span>
  157. <ul class="nav-list">
  158. <li class="nav-item" data-depth="4">
  159. <a class="nav-link" href="../intermediate/multi-media_asset_pipeline.html">Multi-Media Asset Pipeline</a>
  160. </li>
  161. <li class="nav-item" data-depth="4">
  162. <a class="nav-link" href="../scenegraph_for_dummies.html">Scenegraph for Dummies</a>
  163. </li>
  164. <li class="nav-item" data-depth="4">
  165. <a class="nav-link" href="../beginner/hellovector.html">Hello Vector</a>
  166. </li>
  167. <li class="nav-item" data-depth="4">
  168. <a class="nav-link" href="../terminology.html">Terminology</a>
  169. </li>
  170. <li class="nav-item" data-depth="4">
  171. <a class="nav-link" href="../intermediate/how_to_use_materials.html">How to Use Materials</a>
  172. </li>
  173. <li class="nav-item" data-depth="4">
  174. <a class="nav-link" href="../intermediate/transparency_sorting.html">Transparency and Sorting</a>
  175. </li>
  176. <li class="nav-item" data-depth="4">
  177. <a class="nav-link" href="../external/blender.html">Importing from Blender</a>
  178. </li>
  179. <li class="nav-item" data-depth="4">
  180. <a class="nav-link" href="../external/3dsmax.html">Importing from 3DS Max</a>
  181. </li>
  182. </ul>
  183. </li>
  184. </ul>
  185. </li>
  186. </ul>
  187. </li>
  188. <li class="nav-item" data-depth="1">
  189. <a class="nav-link" href="../../logo.html">Logo Usage</a>
  190. </li>
  191. <li class="nav-item" data-depth="1">
  192. <a class="nav-link" href="../../bsd_license.html">License</a>
  193. </li>
  194. <li class="nav-item" data-depth="1">
  195. <a class="nav-link" href="../../github_tips.html">Github Tips</a>
  196. </li>
  197. </ul>
  198. </li>
  199. <li class="nav-item" data-depth="0">
  200. <button class="nav-item-toggle"></button>
  201. <span class="nav-text">SDK</span>
  202. <ul class="nav-list">
  203. <li class="nav-item" data-depth="1">
  204. <a class="nav-link" href="../../sdk.html">jMonkeyEngine SDK</a>
  205. </li>
  206. </ul>
  207. </li>
  208. </ul>
  209. </nav>
  210. </div>
  211. <div class="nav-panel-explore" data-panel="explore">
  212. <div class="context">
  213. <span class="title">Docs</span>
  214. <span class="version">master</span>
  215. </div>
  216. <ul class="components">
  217. <li class="component is-current">
  218. <span class="title">Docs</span>
  219. <ul class="versions">
  220. <li class="version is-current is-latest">
  221. <a href="../../documentation.html">master</a>
  222. </li>
  223. </ul>
  224. </li>
  225. <li class="component">
  226. <span class="title">Wiki UI</span>
  227. <ul class="versions">
  228. <li class="version is-latest">
  229. <a href="../../../wiki-ui/index.html">master</a>
  230. </li>
  231. </ul>
  232. </li>
  233. </ul>
  234. </div>
  235. </div>
  236. </aside>
  237. </div>
  238. <main class="article">
  239. <div class="toolbar" role="navigation">
  240. <button class="nav-toggle"></button>
  241. <nav class="breadcrumbs" aria-label="breadcrumbs">
  242. <ul>
  243. <li><a href="../../documentation.html">Docs</a></li>
  244. <li><a href="debugging.html">Debugging</a></li>
  245. </ul>
  246. </nav>
  247. <div class="edit-this-page"><a href="https://github.com/jMonkeyEngine/wiki/edit/master/docs/modules/ROOT/pages/jme3/advanced/debugging.adoc">Edit this Page</a></div>
  248. </div>
  249. <div class="content">
  250. <article class="doc">
  251. <h1 class="page">Debugging</h1>
  252. <div id="preamble">
  253. <div class="sectionbody">
  254. <div class="paragraph">
  255. <p>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&#8217;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.</p>
  256. </div>
  257. <div class="paragraph">
  258. <p>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 &#8220;hasslefree&#8221; simple shapes, and a &#8220;hasslefree&#8221; unshaded material or wireframe: No model, no light source, no materials are needed to see them in your test scene.</p>
  259. </div>
  260. <div class="paragraph">
  261. <p>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&#8217;s material (missing?) – and not the positioning code.</p>
  262. </div>
  263. <div class="paragraph">
  264. <p>Here are some different debug shapes:</p>
  265. </div>
  266. <div class="imageblock text-center">
  267. <div class="content">
  268. <img src="../../_images/jme3/advanced/debug-shapes.png" alt="debug-shapes.png" width="600" height="220">
  269. </div>
  270. </div>
  271. </div>
  272. </div>
  273. <div class="sect1">
  274. <h2 id="debug-shapes"><a class="anchor" href="#debug-shapes"></a>Debug Shapes</h2>
  275. <div class="sectionbody">
  276. <div class="sect2">
  277. <h3 id="coordinate-axes"><a class="anchor" href="#coordinate-axes"></a>Coordinate Axes</h3>
  278. <div class="paragraph">
  279. <p>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 &#8220;ruler&#8221; for a certain length.</p>
  280. </div>
  281. <div class="listingblock">
  282. <div class="content">
  283. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">private void attachCoordinateAxes(Vector3f pos) {
  284. Arrow arrow = new Arrow(Vector3f.UNIT_X);
  285. putShape(arrow, ColorRGBA.Red).setLocalTranslation(pos);
  286. arrow = new Arrow(Vector3f.UNIT_Y);
  287. putShape(arrow, ColorRGBA.Green).setLocalTranslation(pos);
  288. arrow = new Arrow(Vector3f.UNIT_Z);
  289. putShape(arrow, ColorRGBA.Blue).setLocalTranslation(pos);
  290. }
  291. private Geometry putShape(Mesh shape, ColorRGBA color) {
  292. Geometry g = new Geometry("coordinate axis", shape);
  293. Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
  294. mat.getAdditionalRenderState().setWireframe(true);
  295. mat.getAdditionalRenderState().setLineWidth(4);
  296. mat.setColor("Color", color);
  297. g.setMaterial(mat);
  298. rootNode.attachChild(g);
  299. return g;
  300. }</code></pre>
  301. </div>
  302. </div>
  303. </div>
  304. <div class="sect2">
  305. <h3 id="wireframe-grid"><a class="anchor" href="#wireframe-grid"></a>Wireframe Grid</h3>
  306. <div class="paragraph">
  307. <p>Use a wireframe grid (com.jme3.scene.debug.Grid) as a ruler or simple floor.</p>
  308. </div>
  309. <div class="listingblock">
  310. <div class="content">
  311. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">private Geometry attachGrid(Vector3f pos, int size, ColorRGBA color) {
  312. Geometry g = new Geometry("wireframe grid", new Grid(size, size, 0.2f));
  313. Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
  314. mat.getAdditionalRenderState().setWireframe(true);
  315. mat.setColor("Color", color);
  316. g.setMaterial(mat);
  317. g.center().move(pos);
  318. rootNode.attachChild(g);
  319. return g;
  320. }</code></pre>
  321. </div>
  322. </div>
  323. </div>
  324. <div class="sect2">
  325. <h3 id="wireframe-cube"><a class="anchor" href="#wireframe-cube"></a>Wireframe Cube</h3>
  326. <div class="paragraph">
  327. <p>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.</p>
  328. </div>
  329. <div class="listingblock">
  330. <div class="content">
  331. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">public Geometry attachWireBox(Vector3f pos, float size, ColorRGBA color) {
  332. Geometry g = new Geometry("wireframe cube", new WireBox(size, size, size));
  333. Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
  334. mat.getAdditionalRenderState().setWireframe(true);
  335. mat.setColor("Color", color);
  336. g.setMaterial(mat);
  337. g.setLocalTranslation(pos);
  338. rootNode.attachChild(g);
  339. return g;
  340. }</code></pre>
  341. </div>
  342. </div>
  343. </div>
  344. <div class="sect2">
  345. <h3 id="wireframe-sphere"><a class="anchor" href="#wireframe-sphere"></a>Wireframe Sphere</h3>
  346. <div class="paragraph">
  347. <p>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.</p>
  348. </div>
  349. <div class="listingblock">
  350. <div class="content">
  351. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">private Geometry attachWireSphere(Vector3f pos, float size, ColorRGBA color) {
  352. Geometry g = new Geometry("wireframe sphere", new WireSphere(size));
  353. Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
  354. mat.getAdditionalRenderState().setWireframe(true);
  355. mat.setColor("Color", color);
  356. g.setMaterial(mat);
  357. g.setLocalTranslation(pos);
  358. rootNode.attachChild(g);
  359. return g;
  360. }</code></pre>
  361. </div>
  362. </div>
  363. </div>
  364. </div>
  365. </div>
  366. <div class="sect1">
  367. <h2 id="wireframe-for-physics"><a class="anchor" href="#wireframe-for-physics"></a>Wireframe for Physics</h2>
  368. <div class="sectionbody">
  369. <div class="paragraph">
  370. <p>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.</p>
  371. </div>
  372. <div class="listingblock">
  373. <div class="content">
  374. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">//Create the physics space.
  375. bulletAppState = new BulletAppState();
  376. bulletAppState.setDebugEnabled(true);
  377. getStateManager().attach(bulletAppState);</code></pre>
  378. </div>
  379. </div>
  380. <div class="paragraph">
  381. <p>With debugging enabled, colors are used to indicate various types of physical objects:</p>
  382. </div>
  383. <div class="ulist">
  384. <ul>
  385. <li>
  386. <p>A magenta wire mesh indicates an active rigid body.</p>
  387. </li>
  388. <li>
  389. <p>A blue wire mesh indicates a rigid body which is either new or inactive.</p>
  390. </li>
  391. <li>
  392. <p>A yellow wire mesh indicates a ghost.</p>
  393. </li>
  394. <li>
  395. <p>Two green arrows indicate a joint.</p>
  396. </li>
  397. <li>
  398. <p>A pink wire mesh indicates a character.</p>
  399. </li>
  400. </ul>
  401. </div>
  402. </div>
  403. </div>
  404. <div class="sect1">
  405. <h2 id="wireframe-for-animations"><a class="anchor" href="#wireframe-for-animations"></a>Wireframe for Animations</h2>
  406. <div class="sectionbody">
  407. <div class="paragraph">
  408. <p>Making the skeleton visible inside animated models can be handy for debugging animations. The <code>control</code> object is an AnimControl, <code>player</code> is the loaded model.</p>
  409. </div>
  410. <div class="listingblock">
  411. <div class="title">AnimControl is known to be in the main node</div>
  412. <div class="content">
  413. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", control.getSkeleton());
  414. Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
  415. mat.setColor("Color", ColorRGBA.Green);
  416. mat.getAdditionalRenderState().setDepthTest(false);
  417. skeletonDebug.setMaterial(mat);
  418. player.attachChild(skeletonDebug);</code></pre>
  419. </div>
  420. </div>
  421. <div class="listingblock">
  422. <div class="title">AnimControl is nested somewhere</div>
  423. <div class="content">
  424. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">private void debugSkeleton(Node player) {
  425. player.depthFirstTraversal(new SceneGraphVisitorAdapter() {
  426. @Override
  427. public void visit(Node node) {
  428. if (node.getControl(AnimControl.class) != null) {
  429. AnimControl control = node.getControl(AnimControl.class);
  430. SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton",
  431. control.getSkeleton());
  432. Material mat = new Material(getApplication().getAssetManager(),
  433. "Common/MatDefs/Misc/Unshaded.j3md");
  434. mat.setColor("Color", ColorRGBA.Green);
  435. mat.getAdditionalRenderState().setDepthTest(false);
  436. skeletonDebug.setMaterial(mat);
  437. player.attachChild(skeletonDebug);
  438. }
  439. }
  440. });
  441. }</code></pre>
  442. </div>
  443. </div>
  444. </div>
  445. </div>
  446. <div class="sect1">
  447. <h2 id="example-toggle-wireframe-on-model"><a class="anchor" href="#example-toggle-wireframe-on-model"></a>Example: Toggle Wireframe on Model</h2>
  448. <div class="sectionbody">
  449. <div class="paragraph">
  450. <p>We assume that you have loaded a model with a material <code>mat</code>.</p>
  451. </div>
  452. <div class="paragraph">
  453. <p>Then you can add a switch to toggle the model&#8217;s wireframe on and off, like this:</p>
  454. </div>
  455. <div class="olist arabic">
  456. <ol class="arabic">
  457. <li>
  458. <p>Create a key input trigger that switches between the two materials: E.g. we toggle when the T key is pressed.</p>
  459. <div class="listingblock">
  460. <div class="content">
  461. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">inputManager.addMapping("toggle wireframe", new KeyTrigger(KeyInput.KEY_T));
  462. inputManager.addListener(actionListener, "toggle wireframe");</code></pre>
  463. </div>
  464. </div>
  465. </li>
  466. <li>
  467. <p>Now add the toggle action to the action listener.</p>
  468. <div class="listingblock">
  469. <div class="content">
  470. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">private ActionListener actionListener = new ActionListener() {
  471. @Override
  472. public void onAction(String name, boolean pressed, float tpf) {
  473. // toggle wireframe
  474. if (name.equals("toggle wireframe") &amp;&amp; !pressed) {
  475. wireframe = !wireframe; // toggle boolean
  476. mat.getAdditionalRenderState().setWireframe(wireframe);
  477. }
  478. // else ... other input tests.
  479. }
  480. };</code></pre>
  481. </div>
  482. </div>
  483. </li>
  484. <li>
  485. <p>Alternatively, you could traverse over the whole scene and toggle for all Geometry objects in there if you don&#8217;t want to create a new SceneProcessor.</p>
  486. <div class="listingblock">
  487. <div class="content">
  488. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">private ActionListener actionListener = new ActionListener() {
  489. boolean wireframe = false;
  490. @Override
  491. public void onAction(String name, boolean pressed, float tpf) {
  492. // toggle wireframe
  493. if (name.equals("toggle wireframe") &amp;&amp; !pressed) {
  494. wireframe = !wireframe; // toggle boolean
  495. rootNode.depthFirstTraversal(new SceneGraphVisitor() {
  496. @Override
  497. public void visit(Spatial spatial) {
  498. if (spatial instanceof Geometry) {
  499. ((Geometry) spatial).getMaterial()
  500. .getAdditionalRenderState().setWireframe(wireframe);
  501. }
  502. }
  503. });
  504. }
  505. // else ... other input tests.
  506. }
  507. };</code></pre>
  508. </div>
  509. </div>
  510. </li>
  511. </ol>
  512. </div>
  513. <div class="admonitionblock tip">
  514. <table>
  515. <tr>
  516. <td class="icon">
  517. <i class="fa icon-tip" title="Tip"></i>
  518. </td>
  519. <td class="content">
  520. To set the line width of wireframe display, use mesh.setLineWidth(lineWidth). Default line width is 1.
  521. </td>
  522. </tr>
  523. </table>
  524. </div>
  525. </div>
  526. </div>
  527. <div class="sect1">
  528. <h2 id="example-toggle-wireframe-on-the-scene"><a class="anchor" href="#example-toggle-wireframe-on-the-scene"></a>Example: Toggle Wireframe on the scene</h2>
  529. <div class="sectionbody">
  530. <div class="paragraph">
  531. <p>To display the wireframe of the entire scene instead on one material at a time, first create the following Scene Processor.</p>
  532. </div>
  533. <div class="listingblock">
  534. <div class="content">
  535. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">public class WireProcessor implements SceneProcessor {
  536. RenderManager renderManager;
  537. Material wireMaterial;
  538. public WireProcessor(AssetManager assetManager) {
  539. wireMaterial = new Material(assetManager, "/Common/MatDefs/Misc/Unshaded.j3md");
  540. wireMaterial.setColor("Color", ColorRGBA.Blue);
  541. wireMaterial.getAdditionalRenderState().setWireframe(true);
  542. }
  543. @Override
  544. public void initialize(RenderManager rm, ViewPort vp) {
  545. renderManager = rm;
  546. }
  547. @Override
  548. public void reshape(ViewPort vp, int w, int h) {
  549. throw new UnsupportedOperationException("Not supported yet.");
  550. }
  551. @Override
  552. public boolean isInitialized() {
  553. return renderManager != null;
  554. }
  555. @Override
  556. public void preFrame(float tpf) {
  557. }
  558. @Override
  559. public void postQueue(RenderQueue rq) {
  560. renderManager.setForcedMaterial(wireMaterial);
  561. }
  562. @Override
  563. public void postFrame(FrameBuffer out) {
  564. renderManager.setForcedMaterial(null);
  565. }
  566. @Override
  567. public void cleanup() {
  568. renderManager.setForcedMaterial(null);
  569. }
  570. }</code></pre>
  571. </div>
  572. </div>
  573. <div class="paragraph">
  574. <p>Then attach the scene processor to the <abbr title="Graphical User Interface">GUI</abbr> Viewport.</p>
  575. </div>
  576. <div class="listingblock">
  577. <div class="content">
  578. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">getViewPort().addProcessor(new WireProcessor());</code></pre>
  579. </div>
  580. </div>
  581. </div>
  582. </div>
  583. <div class="sect1">
  584. <h2 id="see-also"><a class="anchor" href="#see-also"></a>See also</h2>
  585. <div class="sectionbody">
  586. <div class="ulist">
  587. <ul>
  588. <li>
  589. <p><a href="spatial.html" class="page">Spatial</a> – if you can&#8217;t see certain spatials, you can modify the culling behaviour to identify problems (such as inside-out custom meshes)</p>
  590. </li>
  591. </ul>
  592. </div>
  593. </div>
  594. </div>
  595. </article>
  596. <aside class="toc sidebar" data-title="Contents" data-levels="2">
  597. <div class="toc-menu"></div>
  598. </aside>
  599. </div>
  600. </main>
  601. </div>
  602. <footer class="footer">
  603. <p>Copyright 2020 jMonkeyEngine Wiki Contributors. Licensed BSD-3.</p>
  604. </footer>
  605. <script src="../../../_/js/site.js"></script>
  606. <script async src="../../../_/js/vendor/highlight.js"></script>
  607. </body>
  608. </html>