hellochasecam.html 107 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="generator" content="Asciidoctor 1.5.4">
  8. <title>Untitled</title>
  9. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
  10. <style>
  11. /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
  12. /* Remove comment around @import statement below when using as a custom stylesheet */
  13. /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
  14. article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
  15. audio,canvas,video{display:inline-block}
  16. audio:not([controls]){display:none;height:0}
  17. [hidden],template{display:none}
  18. script{display:none!important}
  19. html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
  20. body{margin:0}
  21. a{background:transparent}
  22. a:focus{outline:thin dotted}
  23. a:active,a:hover{outline:0}
  24. h1{font-size:2em;margin:.67em 0}
  25. abbr[title]{border-bottom:1px dotted}
  26. b,strong{font-weight:bold}
  27. dfn{font-style:italic}
  28. hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
  29. mark{background:#ff0;color:#000}
  30. code,kbd,pre,samp{font-family:monospace;font-size:1em}
  31. pre{white-space:pre-wrap}
  32. q{quotes:"\201C" "\201D" "\2018" "\2019"}
  33. small{font-size:80%}
  34. sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
  35. sup{top:-.5em}
  36. sub{bottom:-.25em}
  37. img{border:0}
  38. svg:not(:root){overflow:hidden}
  39. figure{margin:0}
  40. fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
  41. legend{border:0;padding:0}
  42. button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
  43. button,input{line-height:normal}
  44. button,select{text-transform:none}
  45. button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
  46. button[disabled],html input[disabled]{cursor:default}
  47. input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
  48. input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
  49. input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
  50. button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
  51. textarea{overflow:auto;vertical-align:top}
  52. table{border-collapse:collapse;border-spacing:0}
  53. *,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
  54. html,body{font-size:100%}
  55. body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
  56. a:hover{cursor:pointer}
  57. img,object,embed{max-width:100%;height:auto}
  58. object,embed{height:100%}
  59. img{-ms-interpolation-mode:bicubic}
  60. .left{float:left!important}
  61. .right{float:right!important}
  62. .text-left{text-align:left!important}
  63. .text-right{text-align:right!important}
  64. .text-center{text-align:center!important}
  65. .text-justify{text-align:justify!important}
  66. .hide{display:none}
  67. body{-webkit-font-smoothing:antialiased}
  68. img,object,svg{display:inline-block;vertical-align:middle}
  69. textarea{height:auto;min-height:50px}
  70. select{width:100%}
  71. .center{margin-left:auto;margin-right:auto}
  72. .spread{width:100%}
  73. p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
  74. .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
  75. div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
  76. a{color:#2156a5;text-decoration:underline;line-height:inherit}
  77. a:hover,a:focus{color:#1d4b8f}
  78. a img{border:none}
  79. p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
  80. p aside{font-size:.875em;line-height:1.35;font-style:italic}
  81. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
  82. h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
  83. h1{font-size:2.125em}
  84. h2{font-size:1.6875em}
  85. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
  86. h4,h5{font-size:1.125em}
  87. h6{font-size:1em}
  88. hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
  89. em,i{font-style:italic;line-height:inherit}
  90. strong,b{font-weight:bold;line-height:inherit}
  91. small{font-size:60%;line-height:inherit}
  92. code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
  93. ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
  94. ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
  95. ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
  96. ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
  97. ul.square{list-style-type:square}
  98. ul.circle{list-style-type:circle}
  99. ul.disc{list-style-type:disc}
  100. ul.no-bullet{list-style:none}
  101. ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
  102. dl dt{margin-bottom:.3125em;font-weight:bold}
  103. dl dd{margin-bottom:1.25em}
  104. abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
  105. abbr{text-transform:none}
  106. blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
  107. blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
  108. blockquote cite:before{content:"\2014 \0020"}
  109. blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
  110. blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
  111. @media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
  112. h1{font-size:2.75em}
  113. h2{font-size:2.3125em}
  114. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
  115. h4{font-size:1.4375em}}
  116. table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
  117. table thead,table tfoot{background:#f7f8f7;font-weight:bold}
  118. table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
  119. table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
  120. table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
  121. table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
  122. body{tab-size:4}
  123. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
  124. h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
  125. .clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
  126. .clearfix:after,.float-group:after{clear:both}
  127. *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
  128. pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
  129. .keyseq{color:rgba(51,51,51,.8)}
  130. kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
  131. .keyseq kbd:first-child{margin-left:0}
  132. .keyseq kbd:last-child{margin-right:0}
  133. .menuseq,.menu{color:rgba(0,0,0,.8)}
  134. b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
  135. b.button:before{content:"[";padding:0 3px 0 2px}
  136. b.button:after{content:"]";padding:0 2px 0 3px}
  137. p a>code:hover{color:rgba(0,0,0,.9)}
  138. #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
  139. #header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
  140. #header:after,#content:after,#footnotes:after,#footer:after{clear:both}
  141. #content{margin-top:1.25em}
  142. #content:before{content:none}
  143. #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
  144. #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
  145. #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
  146. #header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
  147. #header .details span:first-child{margin-left:-.125em}
  148. #header .details span.email a{color:rgba(0,0,0,.85)}
  149. #header .details br{display:none}
  150. #header .details br+span:before{content:"\00a0\2013\00a0"}
  151. #header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
  152. #header .details br+span#revremark:before{content:"\00a0|\00a0"}
  153. #header #revnumber{text-transform:capitalize}
  154. #header #revnumber:after{content:"\00a0"}
  155. #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
  156. #toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
  157. #toc>ul{margin-left:.125em}
  158. #toc ul.sectlevel0>li>a{font-style:italic}
  159. #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
  160. #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
  161. #toc li{line-height:1.3334;margin-top:.3334em}
  162. #toc a{text-decoration:none}
  163. #toc a:active{text-decoration:underline}
  164. #toctitle{color:#7a2518;font-size:1.2em}
  165. @media only screen and (min-width:768px){#toctitle{font-size:1.375em}
  166. body.toc2{padding-left:15em;padding-right:0}
  167. #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
  168. #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
  169. #toc.toc2>ul{font-size:.9em;margin-bottom:0}
  170. #toc.toc2 ul ul{margin-left:0;padding-left:1em}
  171. #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
  172. body.toc2.toc-right{padding-left:0;padding-right:15em}
  173. body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
  174. @media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
  175. #toc.toc2{width:20em}
  176. #toc.toc2 #toctitle{font-size:1.375em}
  177. #toc.toc2>ul{font-size:.95em}
  178. #toc.toc2 ul ul{padding-left:1.25em}
  179. body.toc2.toc-right{padding-left:0;padding-right:20em}}
  180. #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  181. #content #toc>:first-child{margin-top:0}
  182. #content #toc>:last-child{margin-bottom:0}
  183. #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
  184. #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
  185. .sect1{padding-bottom:.625em}
  186. @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
  187. .sect1+.sect1{border-top:1px solid #efefed}
  188. #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
  189. #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
  190. #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
  191. #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
  192. #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
  193. .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
  194. .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
  195. table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
  196. .paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
  197. table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
  198. .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
  199. .admonitionblock>table td.icon{text-align:center;width:80px}
  200. .admonitionblock>table td.icon img{max-width:none}
  201. .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
  202. .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
  203. .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
  204. .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
  205. .exampleblock>.content>:first-child{margin-top:0}
  206. .exampleblock>.content>:last-child{margin-bottom:0}
  207. .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  208. .sidebarblock>:first-child{margin-top:0}
  209. .sidebarblock>:last-child{margin-bottom:0}
  210. .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
  211. .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
  212. .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
  213. .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
  214. .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
  215. .literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
  216. @media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
  217. @media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
  218. .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
  219. .listingblock pre.highlightjs{padding:0}
  220. .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
  221. .listingblock pre.prettyprint{border-width:0}
  222. .listingblock>.content{position:relative}
  223. .listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
  224. .listingblock:hover code[data-lang]:before{display:block}
  225. .listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
  226. .listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
  227. table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
  228. table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
  229. table.pyhltable td.code{padding-left:.75em;padding-right:0}
  230. pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
  231. pre.pygments .lineno{display:inline-block;margin-right:.25em}
  232. table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
  233. .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
  234. .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
  235. .quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
  236. .quoteblock blockquote{margin:0;padding:0;border:0}
  237. .quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
  238. .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
  239. .quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
  240. .quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
  241. .quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
  242. .quoteblock .quoteblock blockquote:before{display:none}
  243. .verseblock{margin:0 1em 1.25em 1em}
  244. .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
  245. .verseblock pre strong{font-weight:400}
  246. .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
  247. .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
  248. .quoteblock .attribution br,.verseblock .attribution br{display:none}
  249. .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
  250. .quoteblock.abstract{margin:0 0 1.25em 0;display:block}
  251. .quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
  252. .quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
  253. table.tableblock{max-width:100%;border-collapse:separate}
  254. table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
  255. table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
  256. table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
  257. table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
  258. table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
  259. table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
  260. table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
  261. table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
  262. table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
  263. table.frame-all{border-width:1px}
  264. table.frame-sides{border-width:0 1px}
  265. table.frame-topbot{border-width:1px 0}
  266. th.halign-left,td.halign-left{text-align:left}
  267. th.halign-right,td.halign-right{text-align:right}
  268. th.halign-center,td.halign-center{text-align:center}
  269. th.valign-top,td.valign-top{vertical-align:top}
  270. th.valign-bottom,td.valign-bottom{vertical-align:bottom}
  271. th.valign-middle,td.valign-middle{vertical-align:middle}
  272. table thead th,table tfoot th{font-weight:bold}
  273. tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
  274. tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
  275. p.tableblock>code:only-child{background:none;padding:0}
  276. p.tableblock{font-size:1em}
  277. td>div.verse{white-space:pre}
  278. ol{margin-left:1.75em}
  279. ul li ol{margin-left:1.5em}
  280. dl dd{margin-left:1.125em}
  281. dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
  282. ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
  283. ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
  284. ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
  285. ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
  286. ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
  287. ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
  288. ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
  289. ul.inline>li>*{display:block}
  290. .unstyled dl dt{font-weight:400;font-style:normal}
  291. ol.arabic{list-style-type:decimal}
  292. ol.decimal{list-style-type:decimal-leading-zero}
  293. ol.loweralpha{list-style-type:lower-alpha}
  294. ol.upperalpha{list-style-type:upper-alpha}
  295. ol.lowerroman{list-style-type:lower-roman}
  296. ol.upperroman{list-style-type:upper-roman}
  297. ol.lowergreek{list-style-type:lower-greek}
  298. .hdlist>table,.colist>table{border:0;background:none}
  299. .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
  300. td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
  301. td.hdlist1{font-weight:bold;padding-bottom:1.25em}
  302. .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
  303. .colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
  304. .colist>table tr>td:last-of-type{padding:.25em 0}
  305. .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
  306. .imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
  307. .imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
  308. .imageblock>.title{margin-bottom:0}
  309. .imageblock.thumb,.imageblock.th{border-width:6px}
  310. .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
  311. .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
  312. .image.left{margin-right:.625em}
  313. .image.right{margin-left:.625em}
  314. a.image{text-decoration:none;display:inline-block}
  315. a.image object{pointer-events:none}
  316. sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
  317. sup.footnote a,sup.footnoteref a{text-decoration:none}
  318. sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
  319. #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
  320. #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
  321. #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
  322. #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
  323. #footnotes .footnote:last-of-type{margin-bottom:0}
  324. #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
  325. .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
  326. .gist .file-data>table td.line-data{width:99%}
  327. div.unbreakable{page-break-inside:avoid}
  328. .big{font-size:larger}
  329. .small{font-size:smaller}
  330. .underline{text-decoration:underline}
  331. .overline{text-decoration:overline}
  332. .line-through{text-decoration:line-through}
  333. .aqua{color:#00bfbf}
  334. .aqua-background{background-color:#00fafa}
  335. .black{color:#000}
  336. .black-background{background-color:#000}
  337. .blue{color:#0000bf}
  338. .blue-background{background-color:#0000fa}
  339. .fuchsia{color:#bf00bf}
  340. .fuchsia-background{background-color:#fa00fa}
  341. .gray{color:#606060}
  342. .gray-background{background-color:#7d7d7d}
  343. .green{color:#006000}
  344. .green-background{background-color:#007d00}
  345. .lime{color:#00bf00}
  346. .lime-background{background-color:#00fa00}
  347. .maroon{color:#600000}
  348. .maroon-background{background-color:#7d0000}
  349. .navy{color:#000060}
  350. .navy-background{background-color:#00007d}
  351. .olive{color:#606000}
  352. .olive-background{background-color:#7d7d00}
  353. .purple{color:#600060}
  354. .purple-background{background-color:#7d007d}
  355. .red{color:#bf0000}
  356. .red-background{background-color:#fa0000}
  357. .silver{color:#909090}
  358. .silver-background{background-color:#bcbcbc}
  359. .teal{color:#006060}
  360. .teal-background{background-color:#007d7d}
  361. .white{color:#bfbfbf}
  362. .white-background{background-color:#fafafa}
  363. .yellow{color:#bfbf00}
  364. .yellow-background{background-color:#fafa00}
  365. span.icon>.fa{cursor:default}
  366. .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
  367. .admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
  368. .admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
  369. .admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
  370. .admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
  371. .admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
  372. .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
  373. .conum[data-value] *{color:#fff!important}
  374. .conum[data-value]+b{display:none}
  375. .conum[data-value]:after{content:attr(data-value)}
  376. pre .conum[data-value]{position:relative;top:-.125em}
  377. b.conum *{color:inherit!important}
  378. .conum:not([data-value]):empty{display:none}
  379. dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
  380. h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
  381. p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
  382. p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
  383. p{margin-bottom:1.25rem}
  384. .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
  385. .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
  386. .print-only{display:none!important}
  387. @media print{@page{margin:1.25cm .75cm}
  388. *{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
  389. a{color:inherit!important;text-decoration:underline!important}
  390. a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
  391. a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
  392. abbr[title]:after{content:" (" attr(title) ")"}
  393. pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
  394. thead{display:table-header-group}
  395. svg{max-width:100%}
  396. p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
  397. h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
  398. #toc,.sidebarblock,.exampleblock>.content{background:none!important}
  399. #toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
  400. .sect1{padding-bottom:0!important}
  401. .sect1+.sect1{border:0!important}
  402. #header>h1:first-child{margin-top:1.25rem}
  403. body.book #header{text-align:center}
  404. body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
  405. body.book #header .details{border:0!important;display:block;padding:0!important}
  406. body.book #header .details span:first-child{margin-left:0!important}
  407. body.book #header .details br{display:block}
  408. body.book #header .details br+span:before{content:none!important}
  409. body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
  410. body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
  411. .listingblock code[data-lang]:before{display:block}
  412. #footer{background:none!important;padding:0 .9375em}
  413. #footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
  414. .hide-on-print{display:none!important}
  415. .print-only{display:block!important}
  416. .hide-for-print{display:none!important}
  417. .show-for-print{display:inherit!important}}
  418. </style>
  419. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
  420. <style>
  421. /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
  422. /*pre.CodeRay {background-color:#f7f7f8;}*/
  423. .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
  424. .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
  425. .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
  426. table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
  427. table.CodeRay td{vertical-align: top;line-height:1.45}
  428. table.CodeRay td.line-numbers{text-align:right}
  429. table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
  430. table.CodeRay td.code{padding:0 0 0 .5em}
  431. table.CodeRay td.code>pre{padding:0}
  432. .CodeRay .debug{color:#fff !important;background:#000080 !important}
  433. .CodeRay .annotation{color:#007}
  434. .CodeRay .attribute-name{color:#000080}
  435. .CodeRay .attribute-value{color:#700}
  436. .CodeRay .binary{color:#509}
  437. .CodeRay .comment{color:#998;font-style:italic}
  438. .CodeRay .char{color:#04d}
  439. .CodeRay .char .content{color:#04d}
  440. .CodeRay .char .delimiter{color:#039}
  441. .CodeRay .class{color:#458;font-weight:bold}
  442. .CodeRay .complex{color:#a08}
  443. .CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
  444. .CodeRay .color{color:#099}
  445. .CodeRay .class-variable{color:#369}
  446. .CodeRay .decorator{color:#b0b}
  447. .CodeRay .definition{color:#099}
  448. .CodeRay .delimiter{color:#000}
  449. .CodeRay .doc{color:#970}
  450. .CodeRay .doctype{color:#34b}
  451. .CodeRay .doc-string{color:#d42}
  452. .CodeRay .escape{color:#666}
  453. .CodeRay .entity{color:#800}
  454. .CodeRay .error{color:#808}
  455. .CodeRay .exception{color:inherit}
  456. .CodeRay .filename{color:#099}
  457. .CodeRay .function{color:#900;font-weight:bold}
  458. .CodeRay .global-variable{color:#008080}
  459. .CodeRay .hex{color:#058}
  460. .CodeRay .integer,.CodeRay .float{color:#099}
  461. .CodeRay .include{color:#555}
  462. .CodeRay .inline{color:#000}
  463. .CodeRay .inline .inline{background:#ccc}
  464. .CodeRay .inline .inline .inline{background:#bbb}
  465. .CodeRay .inline .inline-delimiter{color:#d14}
  466. .CodeRay .inline-delimiter{color:#d14}
  467. .CodeRay .important{color:#555;font-weight:bold}
  468. .CodeRay .interpreted{color:#b2b}
  469. .CodeRay .instance-variable{color:#008080}
  470. .CodeRay .label{color:#970}
  471. .CodeRay .local-variable{color:#963}
  472. .CodeRay .octal{color:#40e}
  473. .CodeRay .predefined{color:#369}
  474. .CodeRay .preprocessor{color:#579}
  475. .CodeRay .pseudo-class{color:#555}
  476. .CodeRay .directive{font-weight:bold}
  477. .CodeRay .type{font-weight:bold}
  478. .CodeRay .predefined-type{color:inherit}
  479. .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
  480. .CodeRay .key{color:#808}
  481. .CodeRay .key .delimiter{color:#606}
  482. .CodeRay .key .char{color:#80f}
  483. .CodeRay .value{color:#088}
  484. .CodeRay .regexp .delimiter{color:#808}
  485. .CodeRay .regexp .content{color:#808}
  486. .CodeRay .regexp .modifier{color:#808}
  487. .CodeRay .regexp .char{color:#d14}
  488. .CodeRay .regexp .function{color:#404;font-weight:bold}
  489. .CodeRay .string{color:#d20}
  490. .CodeRay .string .string .string{background:#ffd0d0}
  491. .CodeRay .string .content{color:#d14}
  492. .CodeRay .string .char{color:#d14}
  493. .CodeRay .string .delimiter{color:#d14}
  494. .CodeRay .shell{color:#d14}
  495. .CodeRay .shell .delimiter{color:#d14}
  496. .CodeRay .symbol{color:#990073}
  497. .CodeRay .symbol .content{color:#a60}
  498. .CodeRay .symbol .delimiter{color:#630}
  499. .CodeRay .tag{color:#008080}
  500. .CodeRay .tag-special{color:#d70}
  501. .CodeRay .variable{color:#036}
  502. .CodeRay .insert{background:#afa}
  503. .CodeRay .delete{background:#faa}
  504. .CodeRay .change{color:#aaf;background:#007}
  505. .CodeRay .head{color:#f8f;background:#505}
  506. .CodeRay .insert .insert{color:#080}
  507. .CodeRay .delete .delete{color:#800}
  508. .CodeRay .change .change{color:#66f}
  509. .CodeRay .head .head{color:#f4f}
  510. </style>
  511. </head>
  512. <body class="article">
  513. <div id="header">
  514. </div>
  515. <div id="content">
  516. <div class="paragraph">
  517. <p><a href="http://www.youtube.com/watch?v=dXGfecvI1Sk">Youtube video</a></p>
  518. </div>
  519. <div class="paragraph">
  520. <p><span class="image"><img src="images/jme3/beginner/chasecamera.png" alt="chasecamera.png" height=""></span></p>
  521. </div>
  522. <div class="ulist">
  523. <ul>
  524. <li>
  525. <p><a href="https://code.google.com/p/jmonkeyengine/source/browse/#svn%2Ftrunk%2Fengine%2Ftest-data%2FModels%2FNinja">Ninja Mesh</a></p>
  526. </li>
  527. <li>
  528. <p><a href="http://jmonkeyengine.googlecode.com/svn/trunk/engine/town.zip">Town Scene</a></p>
  529. </li>
  530. <li>
  531. <p>Walk Bugs emoji:</p>
  532. </li>
  533. <li>
  534. <p>Jump Bugs emoji:</p>
  535. </li>
  536. </ul>
  537. </div>
  538. <div class="paragraph">
  539. <p>Memo:</p>
  540. </div>
  541. <div class="olist arabic">
  542. <ol class="arabic">
  543. <li>
  544. <p>jMonkeyEngine calls the update() methods of all AppState objects in the order in which you attached them.</p>
  545. </li>
  546. <li>
  547. <p>jMonkeyEngine calls the controlUpdate() methods of all controls in the order in which you added them.</p>
  548. </li>
  549. <li>
  550. <p>jMonkeyEngine calls the simpleUpdate() method of the main SimpleApplication class.</p>
  551. </li>
  552. </ol>
  553. </div>
  554. <div class="paragraph">
  555. <p>—AbstractPhysicBodyContext</p>
  556. </div>
  557. <div class="listingblock">
  558. <div class="content">
  559. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  560. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AbstractAppState</span>;
  561. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  562. <span class="keyword">import</span> <span class="include">com.jme3.bullet.BulletAppState</span>;
  563. <span class="comment">/*
  564. Chase camera (aka 3rd person camera) example
  565. Based on official TestQ3.java
  566. @author Alex Cham aka Jcrypto
  567. */</span>
  568. <span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">AbstractPhysicBodyContext</span> <span class="directive">extends</span> AbstractAppState
  569. {
  570. <span class="directive">private</span> AppStateManager stateManager = <span class="predefined-constant">null</span>;
  571. <span class="comment">//</span>
  572. <span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> BulletAppState bulletAppState;
  573. <span class="directive">static</span>
  574. {
  575. bulletAppState = <span class="keyword">new</span> BulletAppState();
  576. }
  577. <span class="directive">public</span> AbstractPhysicBodyContext()
  578. {
  579. }
  580. <span class="comment">/**
  581. @return the bulletAppState
  582. */</span>
  583. <span class="directive">public</span> BulletAppState getBulletAppState()
  584. {
  585. <span class="keyword">return</span> bulletAppState;
  586. }
  587. <span class="comment">/**
  588. @param stateManager the stateManager to set
  589. Attaching BulletAppstate to Initialize PhysicsSpace
  590. */</span>
  591. <span class="directive">public</span> <span class="type">void</span> attachBulletAppstate(AppStateManager stateManager)
  592. {
  593. <span class="local-variable">this</span>.stateManager = stateManager;
  594. stateManager.attach(bulletAppState);
  595. }
  596. }</code></pre>
  597. </div>
  598. </div>
  599. <div class="paragraph">
  600. <p>—AbstractSpatialBodyContext.java</p>
  601. </div>
  602. <div class="listingblock">
  603. <div class="content">
  604. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  605. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AbstractAppState</span>;
  606. <span class="comment">/*
  607. Chase camera (aka 3rd person camera) example
  608. Based on official TestQ3.java
  609. @author Alex Cham aka Jcrypto
  610. */</span>
  611. <span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">AbstractSpatialBodyContext</span> <span class="directive">extends</span> AbstractAppState
  612. {
  613. <span class="directive">public</span> AbstractSpatialBodyContext()
  614. {
  615. }
  616. }</code></pre>
  617. </div>
  618. </div>
  619. <div class="paragraph">
  620. <p>—ApplicationContext.java</p>
  621. </div>
  622. <div class="listingblock">
  623. <div class="content">
  624. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  625. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  626. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AbstractAppState</span>;
  627. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  628. <span class="keyword">import</span> <span class="include">com.jme3.asset.AssetManager</span>;
  629. <span class="keyword">import</span> <span class="include">com.jme3.input.FlyByCamera</span>;
  630. <span class="keyword">import</span> <span class="include">com.jme3.input.InputManager</span>;
  631. <span class="keyword">import</span> <span class="include">com.jme3.math.ColorRGBA</span>;
  632. <span class="keyword">import</span> <span class="include">com.jme3.math.Vector3f</span>;
  633. <span class="keyword">import</span> <span class="include">com.jme3.renderer.Camera</span>;
  634. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  635. <span class="keyword">import</span> <span class="include">com.jme3.system.AppSettings</span>;
  636. <span class="keyword">import</span> <span class="include">org.jmonkey.utils.Debug</span>;
  637. <span class="comment">/*
  638. Chase camera (aka 3rd person camera) example
  639. Based on official TestQ3.java
  640. @author Alex Cham aka Jcrypto
  641. */</span>
  642. <span class="directive">public</span> <span class="type">class</span> <span class="class">ApplicationContext</span> <span class="directive">extends</span> AbstractAppState
  643. {
  644. <span class="directive">private</span> <span class="directive">final</span> Node rootNode;
  645. <span class="comment">//</span>
  646. <span class="directive">private</span> <span class="directive">final</span> CameraContext sceneCameraContext;
  647. <span class="directive">private</span> <span class="directive">final</span> AvatarBodyManager avatarBodyManager;
  648. <span class="directive">private</span> <span class="directive">final</span> SceneBodyManager sceneBodyManager;
  649. <span class="comment">/**
  650. @param stateManager
  651. @param am
  652. @param settings
  653. @param inputManager
  654. @param rootNode
  655. @param cam
  656. @param flyByCam
  657. */</span>
  658. <span class="directive">public</span> ApplicationContext(AppStateManager stateManager, AssetManager am, AppSettings settings, InputManager inputManager, Node rootNode, Camera cam, FlyByCamera flyByCam)
  659. {
  660. <span class="local-variable">this</span>.rootNode = rootNode;
  661. <span class="local-variable">this</span>.sceneCameraContext = <span class="keyword">new</span> CameraContext(settings, inputManager, cam, flyByCam);
  662. <span class="local-variable">this</span>.sceneBodyManager = <span class="keyword">new</span> SceneBodyManager(stateManager, am, rootNode);
  663. <span class="local-variable">this</span>.avatarBodyManager = <span class="keyword">new</span> AvatarBodyManager(am, rootNode, sceneCameraContext);
  664. }
  665. <span class="annotation">@Override</span>
  666. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  667. {
  668. <span class="comment">//super.initialize(stateManager, app);</span>
  669. <span class="comment">//TODO: initialize your AppState, e.g. attach spatials to rootNode</span>
  670. <span class="comment">//this is called on the OpenGL thread after the AppState has been attached</span>
  671. <span class="comment">//</span>
  672. stateManager.attach(<span class="local-variable">this</span>.sceneCameraContext);
  673. stateManager.attach(<span class="local-variable">this</span>.sceneBodyManager);<span class="comment">//initialize physic spacein constructor</span>
  674. stateManager.attach(<span class="local-variable">this</span>.avatarBodyManager);
  675. <span class="comment">//</span>
  676. Debug.showNodeAxes(app.getAssetManager(), <span class="local-variable">this</span>.rootNode, <span class="float">1024.0f</span>);
  677. Debug.attachWireFrameDebugGrid(app.getAssetManager(), rootNode, Vector3f.ZERO, <span class="integer">2048</span>, ColorRGBA.DarkGray);
  678. }
  679. <span class="annotation">@Override</span>
  680. <span class="directive">public</span> <span class="type">void</span> update(<span class="type">float</span> tpf)
  681. {
  682. }
  683. }</code></pre>
  684. </div>
  685. </div>
  686. <div class="paragraph">
  687. <p>—AvatarAnimationEventListener.java</p>
  688. </div>
  689. <div class="listingblock">
  690. <div class="content">
  691. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  692. <span class="keyword">import</span> <span class="include">com.jme3.animation.AnimChannel</span>;
  693. <span class="keyword">import</span> <span class="include">com.jme3.animation.AnimControl</span>;
  694. <span class="keyword">import</span> <span class="include">com.jme3.animation.AnimEventListener</span>;
  695. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  696. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AbstractAppState</span>;
  697. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  698. <span class="keyword">import</span> <span class="include">com.jme3.bullet.objects.PhysicsCharacter</span>;
  699. <span class="keyword">import</span> <span class="include">com.jme3.scene.Spatial</span>;
  700. <span class="comment">/*
  701. Chase camera (aka 3rd person camera) example
  702. Based on official TestQ3.java
  703. @author Alex Cham aka Jcrypto
  704. */</span>
  705. <span class="directive">public</span> <span class="type">class</span> <span class="class">AvatarAnimationEventListener</span> <span class="directive">extends</span> AbstractAppState <span class="directive">implements</span> AnimEventListener
  706. {
  707. <span class="directive">private</span> <span class="directive">final</span> AnimChannel channel;
  708. <span class="directive">private</span> <span class="directive">final</span> AnimControl control;
  709. <span class="directive">private</span> <span class="directive">final</span> PlayerInputActionListener pial;
  710. <span class="directive">private</span> <span class="directive">final</span> AvatarAnimationHelper animHelper;
  711. <span class="directive">private</span> <span class="directive">final</span> PhysicsCharacter physicBody;
  712. <span class="comment">/**
  713. @param pial
  714. @param pc
  715. @param avatarMesh
  716. */</span>
  717. <span class="directive">public</span> AvatarAnimationEventListener(PlayerInputActionListener pial, PhysicsCharacter pc, Spatial avatarMesh)
  718. {
  719. <span class="local-variable">this</span>.pial = pial;
  720. <span class="local-variable">this</span>.control = avatarMesh.getControl(AnimControl.class);
  721. <span class="keyword">assert</span> (<span class="local-variable">this</span>.control != <span class="predefined-constant">null</span>);
  722. <span class="local-variable">this</span>.channel = <span class="local-variable">this</span>.control.createChannel();
  723. <span class="local-variable">this</span>.physicBody = pc;
  724. <span class="local-variable">this</span>.animHelper = <span class="keyword">new</span> AvatarAnimationHelper(<span class="local-variable">this</span>.physicBody, <span class="local-variable">this</span>.channel);
  725. }
  726. <span class="annotation">@Override</span>
  727. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  728. {
  729. <span class="local-variable">this</span>.control.addListener(<span class="local-variable">this</span>);
  730. <span class="local-variable">this</span>.channel.setAnim(<span class="string"><span class="delimiter">&quot;</span><span class="content">Idle1</span><span class="delimiter">&quot;</span></span>);
  731. <span class="local-variable">this</span>.channel.setSpeed(<span class="float">0.5f</span>);
  732. }
  733. <span class="directive">public</span> <span class="type">void</span> onAnimCycleDone(AnimControl control, AnimChannel channel, <span class="predefined-type">String</span> animName)
  734. {
  735. <span class="comment">//throw new UnsupportedOperationException(&quot;Not supported yet.&quot;); //To change body of generated methods, choose Tools | Templates.</span>
  736. }
  737. <span class="directive">public</span> <span class="type">void</span> onAnimChange(AnimControl control, AnimChannel channel, <span class="predefined-type">String</span> animName)
  738. {
  739. <span class="comment">//throw new UnsupportedOperationException(&quot;Not supported yet.&quot;); //To change body of generated methods, choose Tools | Templates.</span>
  740. }
  741. <span class="comment">/**
  742. @return the channel
  743. */</span>
  744. <span class="directive">protected</span> AnimChannel getChannel()
  745. {
  746. <span class="keyword">return</span> channel;
  747. }
  748. <span class="comment">/**
  749. @return the control
  750. */</span>
  751. <span class="directive">protected</span> AnimControl getControl()
  752. {
  753. <span class="keyword">return</span> control;
  754. }
  755. <span class="comment">/**
  756. * @return the animHelper
  757. */</span>
  758. <span class="directive">protected</span> AvatarAnimationHelper getAnimHelper()
  759. {
  760. <span class="keyword">return</span> animHelper;
  761. }
  762. }</code></pre>
  763. </div>
  764. </div>
  765. <div class="paragraph">
  766. <p>—AvatarAnimationHelper.java</p>
  767. </div>
  768. <div class="listingblock">
  769. <div class="content">
  770. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  771. <span class="keyword">import</span> <span class="include">com.jme3.animation.AnimChannel</span>;
  772. <span class="keyword">import</span> <span class="include">com.jme3.animation.LoopMode</span>;
  773. <span class="keyword">import</span> <span class="include">com.jme3.bullet.objects.PhysicsCharacter</span>;
  774. <span class="comment">/*
  775. Chase camera (aka 3rd person camera) example
  776. Based on official TestQ3.java
  777. @author Alex Cham aka Jcrypto
  778. */</span>
  779. <span class="directive">public</span> <span class="type">class</span> <span class="class">AvatarAnimationHelper</span>
  780. {
  781. <span class="directive">private</span> <span class="directive">final</span> AnimChannel animChannel;
  782. <span class="directive">private</span> <span class="directive">final</span> PhysicsCharacter physicBody;
  783. <span class="comment">/**
  784. @param pc
  785. @param ac
  786. */</span>
  787. <span class="directive">public</span> AvatarAnimationHelper(PhysicsCharacter pc, AnimChannel ac)
  788. {
  789. <span class="local-variable">this</span>.animChannel = ac;
  790. <span class="local-variable">this</span>.physicBody = pc;
  791. }
  792. <span class="directive">protected</span> <span class="type">void</span> idle()
  793. {
  794. animChannel.setAnim(<span class="string"><span class="delimiter">&quot;</span><span class="content">Idle1</span><span class="delimiter">&quot;</span></span>);
  795. animChannel.setSpeed(<span class="float">0.5f</span>);
  796. }
  797. <span class="directive">protected</span> <span class="type">boolean</span> forward(<span class="type">boolean</span> pressed)
  798. {
  799. <span class="keyword">if</span> (pressed)
  800. {
  801. <span class="keyword">if</span> (<span class="local-variable">this</span>.physicBody.onGround())
  802. {
  803. animChannel.setAnim(<span class="string"><span class="delimiter">&quot;</span><span class="content">Walk</span><span class="delimiter">&quot;</span></span>);
  804. animChannel.setSpeed(AvatarConstants.FORWARD_MOVE_SPEED * <span class="float">2f</span>);
  805. animChannel.setLoopMode(LoopMode.Loop);
  806. }
  807. <span class="keyword">return</span> <span class="predefined-constant">true</span>;
  808. } <span class="keyword">else</span>
  809. {
  810. idle();
  811. <span class="keyword">return</span> <span class="predefined-constant">false</span>;
  812. }
  813. <span class="comment">//throw new UnsupportedOperationException(&quot;Not supported yet.&quot;); //To change body of generated methods, choose Tools | Templates.</span>
  814. }
  815. <span class="directive">protected</span> <span class="type">boolean</span> backward(<span class="type">boolean</span> pressed)
  816. {
  817. <span class="keyword">if</span> (pressed)
  818. {
  819. <span class="keyword">return</span> <span class="predefined-constant">true</span>;
  820. } <span class="keyword">else</span>
  821. {
  822. <span class="keyword">return</span> <span class="predefined-constant">false</span>;
  823. }
  824. }
  825. <span class="directive">protected</span> <span class="type">boolean</span> rightward(<span class="type">boolean</span> pressed)
  826. {
  827. <span class="keyword">if</span> (pressed)
  828. {
  829. <span class="keyword">return</span> <span class="predefined-constant">true</span>;
  830. } <span class="keyword">else</span>
  831. {
  832. <span class="keyword">return</span> <span class="predefined-constant">false</span>;
  833. }
  834. }
  835. <span class="directive">protected</span> <span class="type">boolean</span> leftward(<span class="type">boolean</span> pressed)
  836. {
  837. <span class="keyword">if</span> (pressed)
  838. {
  839. <span class="keyword">return</span> <span class="predefined-constant">true</span>;
  840. } <span class="keyword">else</span>
  841. {
  842. <span class="keyword">return</span> <span class="predefined-constant">false</span>;
  843. }
  844. }
  845. <span class="directive">protected</span> <span class="type">boolean</span> jump(<span class="type">boolean</span> pressed)
  846. {
  847. <span class="keyword">if</span> (pressed)
  848. {
  849. <span class="keyword">if</span> (<span class="local-variable">this</span>.physicBody.onGround())
  850. {
  851. animChannel.setAnim(<span class="string"><span class="delimiter">&quot;</span><span class="content">HighJump</span><span class="delimiter">&quot;</span></span>);
  852. animChannel.setSpeed(AvatarConstants.FORWARD_MOVE_SPEED / <span class="float">1.8f</span>);
  853. animChannel.setLoopMode(LoopMode.DontLoop);
  854. <span class="comment">//</span>
  855. <span class="local-variable">this</span>.physicBody.jump();
  856. }
  857. <span class="keyword">return</span> <span class="predefined-constant">true</span>;
  858. } <span class="keyword">else</span>
  859. {
  860. <span class="keyword">return</span> <span class="predefined-constant">false</span>;
  861. }
  862. }
  863. }</code></pre>
  864. </div>
  865. </div>
  866. <div class="paragraph">
  867. <p>—AvatarBodyManager.java</p>
  868. </div>
  869. <div class="listingblock">
  870. <div class="content">
  871. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  872. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  873. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  874. <span class="keyword">import</span> <span class="include">com.jme3.asset.AssetManager</span>;
  875. <span class="keyword">import</span> <span class="include">com.jme3.bullet.control.BetterCharacterControl</span>;
  876. <span class="keyword">import</span> <span class="include">com.jme3.bullet.objects.PhysicsCharacter</span>;
  877. <span class="keyword">import</span> <span class="include">com.jme3.input.ChaseCamera</span>;
  878. <span class="keyword">import</span> <span class="include">com.jme3.input.InputManager</span>;
  879. <span class="keyword">import</span> <span class="include">com.jme3.renderer.Camera</span>;
  880. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  881. <span class="keyword">import</span> <span class="include">org.jmonkey.utils.Debug</span>;
  882. <span class="comment">/*
  883. Chase camera (aka 3rd person camera) example
  884. Based on official TestQ3.java
  885. @author Alex Cham aka Jcrypto
  886. */</span>
  887. <span class="directive">public</span> <span class="type">class</span> <span class="class">AvatarBodyManager</span> <span class="directive">extends</span> AbstractPhysicBodyContext
  888. {
  889. <span class="directive">private</span> InputManager inputManager;
  890. <span class="directive">private</span> <span class="directive">final</span> Node rootNode;
  891. <span class="comment">//</span>
  892. <span class="directive">private</span> <span class="directive">final</span> CameraContext cc;
  893. <span class="directive">private</span> <span class="directive">final</span> Camera cam;
  894. <span class="directive">private</span> <span class="directive">final</span> ChaseCamera chaseCam;
  895. <span class="comment">//</span>
  896. <span class="directive">private</span> <span class="directive">final</span> AvatarPhysicBodyContext apbc;
  897. <span class="directive">private</span> <span class="directive">final</span> AvatarSpatialBodyContext asbc;
  898. <span class="comment">//</span>
  899. <span class="directive">private</span> <span class="directive">final</span> PhysicsCharacter physicBody;
  900. <span class="directive">private</span> <span class="directive">final</span> Node avatar;
  901. <span class="directive">private</span> <span class="directive">final</span> BetterCharacterControl bcc;
  902. <span class="comment">//</span>
  903. <span class="directive">private</span> <span class="directive">final</span> PlayerInputActionListener playerInputListener;
  904. <span class="comment">/**
  905. @param am
  906. @param rootNode
  907. @param cc
  908. */</span>
  909. <span class="directive">public</span> AvatarBodyManager(AssetManager am, Node rootNode, CameraContext cc)
  910. {
  911. <span class="comment">//</span>
  912. <span class="local-variable">this</span>.rootNode = rootNode;
  913. <span class="comment">//</span>
  914. <span class="local-variable">this</span>.asbc = <span class="keyword">new</span> AvatarSpatialBodyContext(am, rootNode);
  915. <span class="local-variable">this</span>.apbc = <span class="keyword">new</span> AvatarPhysicBodyContext();
  916. <span class="comment">//</span>
  917. <span class="local-variable">this</span>.physicBody = apbc.getPhysicBody();
  918. <span class="local-variable">this</span>.avatar = asbc.getAvatar();
  919. <span class="local-variable">this</span>.bcc = <span class="keyword">new</span> BetterCharacterControl(AvatarConstants.COLLISION_SHAPE_RADIUS, AvatarConstants.COLLISION_SHAPE_RADIUS * <span class="integer">2</span>, AvatarConstants.PHYSIC_BODY_MASS);
  920. <span class="comment">//</span>
  921. <span class="local-variable">this</span>.playerInputListener = <span class="keyword">new</span> PlayerInputActionListener(<span class="local-variable">this</span>.physicBody, <span class="local-variable">this</span>.asbc.getAvatarMesh());
  922. <span class="comment">//</span>
  923. <span class="local-variable">this</span>.cc = cc;
  924. <span class="local-variable">this</span>.cam = cc.getCam();
  925. <span class="local-variable">this</span>.chaseCam = cc.getChaseCam();
  926. }
  927. <span class="annotation">@Override</span>
  928. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  929. {
  930. <span class="comment">//TODO: initialize your AppState, e.g. attach spatials to rootNode</span>
  931. <span class="comment">//this is called on the OpenGL thread after the AppState has been attached</span>
  932. stateManager.attach(<span class="local-variable">this</span>.asbc);
  933. stateManager.attach(<span class="local-variable">this</span>.apbc);
  934. stateManager.attach(<span class="local-variable">this</span>.playerInputListener);
  935. <span class="comment">//</span>
  936. <span class="local-variable">this</span>.avatar.addControl(<span class="keyword">new</span> AvatarBodyMoveControl(playerInputListener, physicBody, cam));
  937. <span class="local-variable">this</span>.avatar.addControl(chaseCam);
  938. <span class="local-variable">this</span>.avatar.addControl(bcc);
  939. <span class="comment">//DEBUG</span>
  940. Debug.showNodeAxes(app.getAssetManager(), avatar, <span class="integer">4</span>);
  941. getBulletAppState().getPhysicsSpace().enableDebug(app.getAssetManager());
  942. }
  943. <span class="annotation">@Override</span>
  944. <span class="directive">public</span> <span class="type">void</span> update(<span class="type">float</span> tpf)
  945. {
  946. <span class="comment">//assert (sceneCameraContext != null);</span>
  947. <span class="comment">//correctDirectionVectors(cam.getDirection(), cam.getLeft());</span>
  948. }
  949. }</code></pre>
  950. </div>
  951. </div>
  952. <div class="paragraph">
  953. <p>—AvatarBodyMoveControl.java</p>
  954. </div>
  955. <div class="listingblock">
  956. <div class="content">
  957. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  958. <span class="keyword">import</span> <span class="include">com.jme3.bullet.control.BetterCharacterControl</span>;
  959. <span class="keyword">import</span> <span class="include">com.jme3.bullet.objects.PhysicsCharacter</span>;
  960. <span class="keyword">import</span> <span class="include">com.jme3.math.Vector3f</span>;
  961. <span class="keyword">import</span> <span class="include">com.jme3.renderer.Camera</span>;
  962. <span class="keyword">import</span> <span class="include">com.jme3.renderer.RenderManager</span>;
  963. <span class="keyword">import</span> <span class="include">com.jme3.renderer.ViewPort</span>;
  964. <span class="keyword">import</span> <span class="include">com.jme3.scene.control.AbstractControl</span>;
  965. <span class="comment">/*
  966. Chase camera (aka 3rd person camera) example
  967. Based on official TestQ3.java
  968. @author Alex Cham aka Jcrypto
  969. */</span>
  970. <span class="directive">public</span> <span class="type">class</span> <span class="class">AvatarBodyMoveControl</span> <span class="directive">extends</span> AbstractControl
  971. {
  972. <span class="directive">private</span> <span class="directive">final</span> Camera cam;
  973. <span class="directive">private</span> <span class="directive">final</span> PhysicsCharacter physicBody;
  974. <span class="directive">private</span> <span class="directive">final</span> PlayerInputActionListener pial;
  975. <span class="comment">/**
  976. @param pial
  977. @param physicBody
  978. @param cam
  979. */</span>
  980. <span class="directive">public</span> AvatarBodyMoveControl(PlayerInputActionListener pial, PhysicsCharacter physicBody, Camera cam)
  981. {
  982. <span class="local-variable">this</span>.pial = pial;
  983. <span class="local-variable">this</span>.physicBody = physicBody;
  984. <span class="local-variable">this</span>.cam = cam;
  985. }
  986. <span class="directive">private</span> <span class="directive">final</span> Vector3f walkDirection = <span class="keyword">new</span> Vector3f();
  987. <span class="annotation">@Override</span>
  988. <span class="directive">protected</span> <span class="type">void</span> controlUpdate(<span class="type">float</span> tpf)
  989. {
  990. <span class="comment">//throw new UnsupportedOperationException(&quot;Not supported yet.&quot;); //To change body of generated methods, choose Tools | Templates.</span>
  991. correctDirectionVectors();
  992. }
  993. <span class="annotation">@Override</span>
  994. <span class="directive">protected</span> <span class="type">void</span> controlRender(RenderManager rm, ViewPort vp)
  995. {
  996. <span class="comment">//throw new UnsupportedOperationException(&quot;Not supported yet.&quot;); //To change body of generated methods, choose Tools | Templates.</span>
  997. }
  998. <span class="comment">/**
  999. @param camDir
  1000. @param camLeft
  1001. */</span>
  1002. <span class="directive">public</span> <span class="type">void</span> correctDirectionVectors()
  1003. {
  1004. <span class="comment">// assert (camDir != null);</span>
  1005. <span class="comment">// assert (camLeft != null);</span>
  1006. <span class="comment">// assert (walkDirection != null);</span>
  1007. <span class="comment">//Affect forward, backward move speed 0.6f lower - 1.0f faster</span>
  1008. Vector3f camDirVector = cam.getDirection().clone().multLocal(AvatarConstants.FORWARD_MOVE_SPEED);
  1009. <span class="comment">//Affect left, right move speed 0.6f lower - 1.0f faster</span>
  1010. Vector3f camLeftVector = cam.getLeft().clone().multLocal(AvatarConstants.SIDEWARD_MOVE_SPEED);
  1011. walkDirection.set(<span class="integer">0</span>, <span class="integer">0</span>, <span class="integer">0</span>);<span class="comment">//critical</span>
  1012. <span class="keyword">if</span> (pial.isLeftward())
  1013. {
  1014. walkDirection.addLocal(camLeftVector);
  1015. }
  1016. <span class="keyword">if</span> (pial.isRightward())
  1017. {
  1018. walkDirection.addLocal(camLeftVector.negate());
  1019. }
  1020. <span class="keyword">if</span> (pial.isForward())
  1021. {
  1022. walkDirection.addLocal(camDirVector);
  1023. }
  1024. <span class="keyword">if</span> (pial.isBackward())
  1025. {
  1026. <span class="comment">//@TODO Bug if cam direction (0, -n, 0) - character fly upwards ;)</span>
  1027. walkDirection.addLocal(camDirVector.negate());
  1028. }
  1029. physicBody.setWalkDirection(walkDirection);<span class="comment">//Critical</span>
  1030. <span class="comment">//Avoid vibration</span>
  1031. spatial.setLocalTranslation(physicBody.getPhysicsLocation());
  1032. <span class="comment">//Translate Node accordingly</span>
  1033. spatial.getControl(BetterCharacterControl.class).warp(physicBody.getPhysicsLocation());
  1034. <span class="comment">//Rotate Node accordingly to camera</span>
  1035. spatial.getControl(
  1036. BetterCharacterControl.class).setViewDirection(
  1037. cam.getDirection().negate());
  1038. }
  1039. }</code></pre>
  1040. </div>
  1041. </div>
  1042. <div class="paragraph">
  1043. <p>—AvatarConstants.java</p>
  1044. </div>
  1045. <div class="listingblock">
  1046. <div class="content">
  1047. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1048. <span class="comment">/*
  1049. Chase camera (aka 3rd person camera) example
  1050. Based on official TestQ3.java
  1051. @author Alex Cham aka Jcrypto
  1052. */</span>
  1053. <span class="directive">public</span> <span class="type">class</span> <span class="class">AvatarConstants</span>
  1054. {
  1055. <span class="directive">public</span> <span class="directive">static</span> <span class="directive">final</span> <span class="type">float</span> COLLISION_SHAPE_CENTERAL_POINT = <span class="float">0.0f</span>;
  1056. <span class="directive">public</span> <span class="directive">static</span> <span class="directive">final</span> <span class="type">float</span> COLLISION_SHAPE_RADIUS = <span class="float">4.0f</span>;
  1057. <span class="comment">//</span>
  1058. <span class="directive">public</span> <span class="directive">static</span> <span class="directive">final</span> <span class="type">float</span> PHYSIC_BODY_MASS = <span class="float">1.0f</span>;
  1059. <span class="directive">public</span> <span class="directive">static</span> <span class="type">float</span> FORWARD_MOVE_SPEED = <span class="float">0.8f</span>;
  1060. <span class="directive">public</span> <span class="directive">static</span> <span class="type">float</span> SIDEWARD_MOVE_SPEED = <span class="float">0.6f</span>;
  1061. }</code></pre>
  1062. </div>
  1063. </div>
  1064. <div class="paragraph">
  1065. <p>—AvatarPhysicBodyContext.java</p>
  1066. </div>
  1067. <div class="listingblock">
  1068. <div class="content">
  1069. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1070. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  1071. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  1072. <span class="keyword">import</span> <span class="include">com.jme3.bullet.collision.shapes.SphereCollisionShape</span>;
  1073. <span class="keyword">import</span> <span class="include">com.jme3.bullet.objects.PhysicsCharacter</span>;
  1074. <span class="keyword">import</span> <span class="include">com.jme3.math.Vector3f</span>;
  1075. <span class="comment">/*
  1076. Chase camera (aka 3rd person camera) example
  1077. Based on official TestQ3.java
  1078. @author Alex Cham aka Jcrypto
  1079. */</span>
  1080. <span class="directive">public</span> <span class="type">class</span> <span class="class">AvatarPhysicBodyContext</span> <span class="directive">extends</span> AbstractPhysicBodyContext
  1081. {
  1082. <span class="directive">private</span> <span class="directive">final</span> PhysicsCharacter physicBody;
  1083. <span class="directive">public</span> AvatarPhysicBodyContext()
  1084. {
  1085. <span class="local-variable">this</span>.physicBody = <span class="keyword">new</span> PhysicsCharacter(<span class="keyword">new</span> SphereCollisionShape(AvatarConstants.COLLISION_SHAPE_RADIUS), <span class="float">.01f</span>);
  1086. }
  1087. <span class="annotation">@Override</span>
  1088. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  1089. {
  1090. <span class="comment">//</span>
  1091. <span class="keyword">assert</span> (getBulletAppState() != <span class="predefined-constant">null</span>);
  1092. <span class="predefined-type">System</span>.out.println(<span class="local-variable">this</span>.getClass().getName() + <span class="string"><span class="delimiter">&quot;</span><span class="content">.getBulletAppState().hashCode() = </span><span class="delimiter">&quot;</span></span> + getBulletAppState().hashCode());
  1093. <span class="comment">//</span>
  1094. <span class="local-variable">this</span>.physicBody.setJumpSpeed(<span class="integer">32</span>);
  1095. <span class="local-variable">this</span>.physicBody.setFallSpeed(<span class="integer">32</span>);
  1096. <span class="local-variable">this</span>.physicBody.setGravity(<span class="integer">32</span>);
  1097. <span class="local-variable">this</span>.physicBody.setPhysicsLocation(<span class="keyword">new</span> Vector3f(<span class="integer">0</span>, <span class="integer">10</span>, <span class="integer">0</span>));
  1098. <span class="comment">//</span>
  1099. getBulletAppState().getPhysicsSpace().add(<span class="local-variable">this</span>.physicBody);
  1100. }
  1101. <span class="annotation">@Override</span>
  1102. <span class="directive">public</span> <span class="type">void</span> update(<span class="type">float</span> tpf)
  1103. {
  1104. }
  1105. <span class="annotation">@Override</span>
  1106. <span class="directive">public</span> <span class="type">void</span> cleanup()
  1107. {
  1108. <span class="local-variable">super</span>.cleanup();
  1109. }
  1110. <span class="comment">/**
  1111. @return the physicBody
  1112. */</span>
  1113. <span class="directive">public</span> PhysicsCharacter getPhysicBody()
  1114. {
  1115. <span class="keyword">return</span> <span class="local-variable">this</span>.physicBody;
  1116. }
  1117. }</code></pre>
  1118. </div>
  1119. </div>
  1120. <div class="paragraph">
  1121. <p>—AvatarSpatialBodyContext.java</p>
  1122. </div>
  1123. <div class="listingblock">
  1124. <div class="content">
  1125. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1126. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  1127. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  1128. <span class="keyword">import</span> <span class="include">com.jme3.asset.AssetManager</span>;
  1129. <span class="keyword">import</span> <span class="include">com.jme3.math.Vector3f</span>;
  1130. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  1131. <span class="keyword">import</span> <span class="include">com.jme3.scene.Spatial</span>;
  1132. <span class="comment">/*
  1133. Chase camera (aka 3rd person camera) example
  1134. Based on official TestQ3.java
  1135. @author Alex Cham aka Jcrypto
  1136. */</span>
  1137. <span class="directive">public</span> <span class="type">class</span> <span class="class">AvatarSpatialBodyContext</span> <span class="directive">extends</span> AbstractSpatialBodyContext
  1138. {
  1139. <span class="comment">//</span>
  1140. <span class="directive">private</span> <span class="directive">final</span> Node rootNode;
  1141. <span class="comment">//</span>
  1142. <span class="directive">private</span> <span class="directive">final</span> Node avatar;
  1143. <span class="directive">private</span> <span class="directive">final</span> Spatial avatarMesh;
  1144. <span class="directive">private</span> <span class="directive">final</span> Vector3f correction;
  1145. <span class="comment">/**
  1146. @param am
  1147. @param rootNode
  1148. */</span>
  1149. <span class="directive">public</span> AvatarSpatialBodyContext(AssetManager am, Node rootNode)
  1150. {
  1151. <span class="local-variable">this</span>.rootNode = rootNode;
  1152. <span class="comment">//</span>
  1153. <span class="local-variable">this</span>.avatar = <span class="keyword">new</span> Node();
  1154. <span class="local-variable">this</span>.avatarMesh = am.loadModel(<span class="string"><span class="delimiter">&quot;</span><span class="content">Models/Ninja/Ninja.mesh.xml</span><span class="delimiter">&quot;</span></span>);
  1155. <span class="local-variable">this</span>.correction = <span class="keyword">new</span> Vector3f(
  1156. <span class="integer">0</span>,
  1157. AvatarConstants.COLLISION_SHAPE_CENTERAL_POINT - AvatarConstants.COLLISION_SHAPE_RADIUS,
  1158. <span class="integer">0</span>);
  1159. }
  1160. <span class="annotation">@Override</span>
  1161. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  1162. {
  1163. <span class="local-variable">this</span>.avatarMesh.setLocalScale(<span class="keyword">new</span> Vector3f(<span class="float">0.05f</span>, <span class="float">0.05f</span>, <span class="float">0.05f</span>));<span class="comment">//Trouble with scales?</span>
  1164. <span class="local-variable">this</span>.avatarMesh.setLocalTranslation(<span class="local-variable">this</span>.correction);
  1165. <span class="local-variable">this</span>.avatar.attachChild(<span class="local-variable">this</span>.avatarMesh);
  1166. <span class="local-variable">this</span>.rootNode.attachChild(<span class="local-variable">this</span>.avatar);
  1167. <span class="comment">//super.initialize(stateManager, app); //To change body of generated methods, choose Tools | Templates.</span>
  1168. }
  1169. <span class="comment">/**
  1170. @return the avatar
  1171. */</span>
  1172. <span class="directive">public</span> Node getAvatar()
  1173. {
  1174. <span class="keyword">return</span> avatar;
  1175. }
  1176. <span class="comment">/**
  1177. * @return the avatarMesh
  1178. */</span>
  1179. <span class="directive">public</span> Spatial getAvatarMesh()
  1180. {
  1181. <span class="keyword">return</span> avatarMesh;
  1182. }
  1183. }</code></pre>
  1184. </div>
  1185. </div>
  1186. <div class="paragraph">
  1187. <p>—CameraContext.java</p>
  1188. </div>
  1189. <div class="listingblock">
  1190. <div class="content">
  1191. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1192. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  1193. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AbstractAppState</span>;
  1194. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  1195. <span class="keyword">import</span> <span class="include">com.jme3.input.ChaseCamera</span>;
  1196. <span class="keyword">import</span> <span class="include">com.jme3.input.FlyByCamera</span>;
  1197. <span class="keyword">import</span> <span class="include">com.jme3.input.InputManager</span>;
  1198. <span class="keyword">import</span> <span class="include">com.jme3.renderer.Camera</span>;
  1199. <span class="keyword">import</span> <span class="include">com.jme3.system.AppSettings</span>;
  1200. <span class="comment">/*
  1201. Chase camera (aka 3rd person camera) example
  1202. Based on official TestQ3.java
  1203. @author Alex Cham aka Jcrypto
  1204. */</span>
  1205. <span class="directive">public</span> <span class="type">class</span> <span class="class">CameraContext</span> <span class="directive">extends</span> AbstractAppState
  1206. {
  1207. <span class="directive">private</span> <span class="directive">final</span> AppSettings settings;
  1208. <span class="directive">private</span> <span class="directive">final</span> InputManager inputManager;
  1209. <span class="comment">/*
  1210. http://hub.jmonkeyengine.org/javadoc/com/jme3/renderer/Camera.html
  1211. public class Camera
  1212. extends java.lang.Object
  1213. implements Savable, java.lang.Cloneable
  1214. Width and height are set to the current Application's settings.getWidth() and settings.getHeight() values.
  1215. Frustum Perspective:
  1216. Frame of view angle of 45° along the Y axis
  1217. Aspect ratio of width divided by height
  1218. Near view plane of 1 wu
  1219. Far view plane of 1000 wu
  1220. Start location at (0f, 0f, 10f).
  1221. Start direction is looking at the origin.
  1222. */</span>
  1223. <span class="directive">private</span> <span class="directive">final</span> Camera cam;
  1224. <span class="comment">/*
  1225. http://hub.jmonkeyengine.org/javadoc/com/jme3/input/ChaseCamera.html
  1226. public class ChaseCamera
  1227. extends java.lang.Object
  1228. implements ActionListener, AnalogListener, Control
  1229. A camera that follows a spatial and can turn around it by dragging the mouse
  1230. Constructs the chase camera, and registers inputs if you use this
  1231. constructor you have to attach the cam later to a spatial doing
  1232. spatial.addControl(chaseCamera);
  1233. */</span>
  1234. <span class="directive">private</span> <span class="directive">final</span> ChaseCamera chaseCam;
  1235. <span class="directive">private</span> <span class="directive">final</span> FlyByCamera flyByCam;
  1236. <span class="comment">/**
  1237. @param settings
  1238. @param inputManager
  1239. @param cam
  1240. @param flyByCam
  1241. */</span>
  1242. <span class="directive">public</span> CameraContext(AppSettings settings, InputManager inputManager, Camera cam, FlyByCamera flyByCam)
  1243. {
  1244. <span class="keyword">assert</span> (settings != <span class="predefined-constant">null</span>);
  1245. <span class="local-variable">this</span>.settings = settings;
  1246. <span class="keyword">assert</span> (inputManager != <span class="predefined-constant">null</span>);
  1247. <span class="local-variable">this</span>.inputManager = inputManager;
  1248. <span class="keyword">assert</span> (cam != <span class="predefined-constant">null</span>);
  1249. <span class="local-variable">this</span>.cam = cam;
  1250. <span class="keyword">assert</span> (flyByCam != <span class="predefined-constant">null</span>);
  1251. <span class="local-variable">this</span>.flyByCam = flyByCam;
  1252. <span class="local-variable">this</span>.chaseCam = <span class="keyword">new</span> ChaseCamera(<span class="local-variable">this</span>.cam, <span class="local-variable">this</span>.inputManager);
  1253. }
  1254. <span class="annotation">@Override</span>
  1255. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  1256. {
  1257. <span class="local-variable">super</span>.initialize(stateManager, app);
  1258. <span class="comment">//TODO: initialize your AppState, e.g. attach spatials to rootNode</span>
  1259. <span class="comment">//this is called on the OpenGL thread after the AppState has been attached</span>
  1260. <span class="local-variable">this</span>.cam.setFrustumPerspective(<span class="float">116.0f</span>, (settings.getWidth() / settings.getHeight()), <span class="float">1.0f</span>, <span class="float">2000.0f</span>);
  1261. <span class="comment">//this.flyByCam.setMoveSpeed(100);</span>
  1262. <span class="local-variable">this</span>.flyByCam.setEnabled(<span class="predefined-constant">false</span>);
  1263. }
  1264. <span class="comment">/**
  1265. @return the cam
  1266. */</span>
  1267. <span class="directive">public</span> Camera getCam()
  1268. {
  1269. <span class="keyword">return</span> cam;
  1270. }
  1271. <span class="comment">/**
  1272. @return the chaseCam
  1273. */</span>
  1274. <span class="directive">public</span> ChaseCamera getChaseCam()
  1275. {
  1276. <span class="keyword">return</span> chaseCam;
  1277. }
  1278. }</code></pre>
  1279. </div>
  1280. </div>
  1281. <div class="paragraph">
  1282. <p>—PlayerInputActionListener.java</p>
  1283. </div>
  1284. <div class="listingblock">
  1285. <div class="content">
  1286. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1287. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  1288. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AbstractAppState</span>;
  1289. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  1290. <span class="keyword">import</span> <span class="include">com.jme3.bullet.objects.PhysicsCharacter</span>;
  1291. <span class="keyword">import</span> <span class="include">com.jme3.input.KeyInput</span>;
  1292. <span class="keyword">import</span> <span class="include">com.jme3.input.controls.ActionListener</span>;
  1293. <span class="keyword">import</span> <span class="include">com.jme3.input.controls.KeyTrigger</span>;
  1294. <span class="keyword">import</span> <span class="include">com.jme3.scene.Spatial</span>;
  1295. <span class="comment">/*
  1296. Chase camera (aka 3rd person camera) example
  1297. Based on official TestQ3.java
  1298. @author Alex Cham aka Jcrypto
  1299. */</span>
  1300. <span class="directive">public</span> <span class="type">class</span> <span class="class">PlayerInputActionListener</span> <span class="directive">extends</span> AbstractAppState <span class="directive">implements</span> <span class="predefined-type">ActionListener</span>
  1301. {
  1302. <span class="directive">private</span> <span class="directive">final</span> PhysicsCharacter physicBody;
  1303. <span class="comment">//</span>
  1304. <span class="directive">private</span> <span class="type">boolean</span> leftward = <span class="predefined-constant">false</span>;
  1305. <span class="directive">private</span> <span class="type">boolean</span> rightward = <span class="predefined-constant">false</span>;
  1306. <span class="directive">private</span> <span class="type">boolean</span> forward = <span class="predefined-constant">false</span>;
  1307. <span class="directive">private</span> <span class="type">boolean</span> backward = <span class="predefined-constant">false</span>;
  1308. <span class="directive">private</span> <span class="type">boolean</span> jump = <span class="predefined-constant">false</span>;
  1309. <span class="directive">private</span> <span class="directive">final</span> AvatarAnimationEventListener aael;
  1310. <span class="comment">/**
  1311. @param pc
  1312. @param avatar
  1313. */</span>
  1314. <span class="directive">public</span> PlayerInputActionListener(PhysicsCharacter pc, Spatial avatar)
  1315. {
  1316. <span class="local-variable">this</span>.physicBody = pc;
  1317. <span class="local-variable">this</span>.aael = <span class="keyword">new</span> AvatarAnimationEventListener(<span class="local-variable">this</span>, <span class="local-variable">this</span>.physicBody, avatar);
  1318. }
  1319. <span class="annotation">@Override</span>
  1320. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  1321. {
  1322. stateManager.attach(<span class="local-variable">this</span>.aael);
  1323. <span class="comment">//</span>
  1324. app.getInputManager().addMapping(<span class="string"><span class="delimiter">&quot;</span><span class="content">LEFTWARD</span><span class="delimiter">&quot;</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_A));
  1325. app.getInputManager().addMapping(<span class="string"><span class="delimiter">&quot;</span><span class="content">RIGHTWARD</span><span class="delimiter">&quot;</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_D));
  1326. app.getInputManager().addMapping(<span class="string"><span class="delimiter">&quot;</span><span class="content">FORWARD</span><span class="delimiter">&quot;</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_W));
  1327. app.getInputManager().addMapping(<span class="string"><span class="delimiter">&quot;</span><span class="content">BACKWARD</span><span class="delimiter">&quot;</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_S));
  1328. app.getInputManager().addMapping(<span class="string"><span class="delimiter">&quot;</span><span class="content">JUMP</span><span class="delimiter">&quot;</span></span>, <span class="keyword">new</span> KeyTrigger(KeyInput.KEY_SPACE));
  1329. app.getInputManager().addListener(<span class="local-variable">this</span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">LEFTWARD</span><span class="delimiter">&quot;</span></span>);
  1330. app.getInputManager().addListener(<span class="local-variable">this</span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">RIGHTWARD</span><span class="delimiter">&quot;</span></span>);
  1331. app.getInputManager().addListener(<span class="local-variable">this</span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">FORWARD</span><span class="delimiter">&quot;</span></span>);
  1332. app.getInputManager().addListener(<span class="local-variable">this</span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">BACKWARD</span><span class="delimiter">&quot;</span></span>);
  1333. app.getInputManager().addListener(<span class="local-variable">this</span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">JUMP</span><span class="delimiter">&quot;</span></span>);
  1334. <span class="comment">//</span>
  1335. }
  1336. <span class="comment">/**
  1337. @param binding
  1338. @param keyPressed
  1339. @param tpf
  1340. */</span>
  1341. <span class="directive">public</span> <span class="type">void</span> onAction(<span class="predefined-type">String</span> binding, <span class="type">boolean</span> keyPressed, <span class="type">float</span> tpf)
  1342. {
  1343. <span class="keyword">if</span> (binding.equals(<span class="string"><span class="delimiter">&quot;</span><span class="content">LEFTWARD</span><span class="delimiter">&quot;</span></span>))
  1344. {
  1345. <span class="local-variable">this</span>.leftward = <span class="local-variable">this</span>.aael.getAnimHelper().leftward(keyPressed);
  1346. } <span class="keyword">else</span> <span class="keyword">if</span> (binding.equals(<span class="string"><span class="delimiter">&quot;</span><span class="content">RIGHTWARD</span><span class="delimiter">&quot;</span></span>))
  1347. {
  1348. <span class="local-variable">this</span>.rightward = <span class="local-variable">this</span>.aael.getAnimHelper().rightward(keyPressed);
  1349. } <span class="keyword">else</span> <span class="keyword">if</span> (binding.equals(<span class="string"><span class="delimiter">&quot;</span><span class="content">FORWARD</span><span class="delimiter">&quot;</span></span>))
  1350. {
  1351. <span class="local-variable">this</span>.forward = <span class="local-variable">this</span>.aael.getAnimHelper().forward(keyPressed);
  1352. } <span class="keyword">else</span> <span class="keyword">if</span> (binding.equals(<span class="string"><span class="delimiter">&quot;</span><span class="content">BACKWARD</span><span class="delimiter">&quot;</span></span>))
  1353. {
  1354. <span class="local-variable">this</span>.backward = <span class="local-variable">this</span>.aael.getAnimHelper().backward(keyPressed);
  1355. } <span class="keyword">else</span> <span class="keyword">if</span> (binding.equals(<span class="string"><span class="delimiter">&quot;</span><span class="content">JUMP</span><span class="delimiter">&quot;</span></span>))
  1356. {
  1357. <span class="local-variable">this</span>.jump = <span class="local-variable">this</span>.aael.getAnimHelper().jump(keyPressed);
  1358. }
  1359. }
  1360. <span class="comment">/**
  1361. @return the leftward
  1362. */</span>
  1363. <span class="directive">public</span> <span class="type">boolean</span> isLeftward()
  1364. {
  1365. <span class="keyword">return</span> <span class="local-variable">this</span>.leftward;
  1366. }
  1367. <span class="comment">/**
  1368. @return the rightward
  1369. */</span>
  1370. <span class="directive">public</span> <span class="type">boolean</span> isRightward()
  1371. {
  1372. <span class="keyword">return</span> <span class="local-variable">this</span>.rightward;
  1373. }
  1374. <span class="comment">/**
  1375. @return the forward
  1376. */</span>
  1377. <span class="directive">public</span> <span class="type">boolean</span> isForward()
  1378. {
  1379. <span class="keyword">return</span> <span class="local-variable">this</span>.forward;
  1380. }
  1381. <span class="comment">/**
  1382. @return the backward
  1383. */</span>
  1384. <span class="directive">public</span> <span class="type">boolean</span> isBackward()
  1385. {
  1386. <span class="keyword">return</span> <span class="local-variable">this</span>.backward;
  1387. }
  1388. <span class="comment">/**
  1389. @return the jump
  1390. */</span>
  1391. <span class="directive">public</span> <span class="type">boolean</span> isJump()
  1392. {
  1393. <span class="keyword">return</span> <span class="local-variable">this</span>.jump;
  1394. }
  1395. }</code></pre>
  1396. </div>
  1397. </div>
  1398. <div class="paragraph">
  1399. <p>—SceneBodyManager.java</p>
  1400. </div>
  1401. <div class="listingblock">
  1402. <div class="content">
  1403. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1404. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  1405. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  1406. <span class="keyword">import</span> <span class="include">com.jme3.asset.AssetManager</span>;
  1407. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  1408. <span class="comment">/*
  1409. Chase camera (aka 3rd person camera) example
  1410. Based on official TestQ3.java
  1411. @author Alex Cham aka Jcrypto
  1412. */</span>
  1413. <span class="directive">public</span> <span class="type">class</span> <span class="class">SceneBodyManager</span> <span class="directive">extends</span> AbstractPhysicBodyContext
  1414. {
  1415. <span class="directive">private</span> <span class="directive">final</span> ScenePhysicBodyContext spbc;
  1416. <span class="directive">private</span> <span class="directive">final</span> SceneSpatialBodyContext ssbc;
  1417. <span class="comment">/**
  1418. @param stateManager
  1419. @param am
  1420. @param rootNode
  1421. */</span>
  1422. <span class="directive">public</span> SceneBodyManager(AppStateManager stateManager, AssetManager am, Node rootNode)
  1423. {
  1424. <span class="local-variable">this</span>.ssbc = <span class="keyword">new</span> SceneSpatialBodyContext(am, rootNode);
  1425. <span class="local-variable">this</span>.spbc = <span class="keyword">new</span> ScenePhysicBodyContext(ssbc.getScene());
  1426. }
  1427. <span class="annotation">@Override</span>
  1428. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  1429. {
  1430. <span class="comment">//PhysicsSpace Initialization</span>
  1431. attachBulletAppstate(stateManager);
  1432. <span class="comment">//</span>
  1433. stateManager.attach(<span class="local-variable">this</span>.ssbc);
  1434. stateManager.attach(<span class="local-variable">this</span>.spbc);
  1435. }
  1436. }</code></pre>
  1437. </div>
  1438. </div>
  1439. <div class="paragraph">
  1440. <p>—ScenePhysicBodyContext.java</p>
  1441. </div>
  1442. <div class="listingblock">
  1443. <div class="content">
  1444. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1445. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  1446. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  1447. <span class="keyword">import</span> <span class="include">com.jme3.bullet.control.RigidBodyControl</span>;
  1448. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  1449. <span class="comment">/*
  1450. Chase camera (aka 3rd person camera) example
  1451. Based on official TestQ3.java
  1452. @author Alex Cham aka Jcrypto
  1453. */</span>
  1454. <span class="directive">public</span> <span class="type">class</span> <span class="class">ScenePhysicBodyContext</span> <span class="directive">extends</span> AbstractPhysicBodyContext
  1455. {
  1456. <span class="directive">private</span> <span class="directive">final</span> RigidBodyControl rigidBodyControl;
  1457. <span class="directive">private</span> <span class="directive">final</span> Node scene;
  1458. <span class="comment">/**
  1459. @param scene
  1460. */</span>
  1461. <span class="directive">public</span> ScenePhysicBodyContext(Node scene)
  1462. {
  1463. <span class="local-variable">this</span>.scene = scene;
  1464. <span class="local-variable">this</span>.rigidBodyControl = <span class="keyword">new</span> RigidBodyControl(<span class="float">.0f</span>);
  1465. }
  1466. <span class="annotation">@Override</span>
  1467. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  1468. {
  1469. <span class="comment">//</span>
  1470. <span class="comment">//Add scene to PhysicsSpace</span>
  1471. <span class="predefined-type">System</span>.out.println(<span class="local-variable">this</span>.getClass().getName() + <span class="string"><span class="delimiter">&quot;</span><span class="content">.getBulletAppState().hashCode() = </span><span class="delimiter">&quot;</span></span> + getBulletAppState().hashCode());
  1472. scene.addControl(rigidBodyControl);
  1473. getBulletAppState().getPhysicsSpace().addAll(scene);
  1474. }
  1475. }</code></pre>
  1476. </div>
  1477. </div>
  1478. <div class="paragraph">
  1479. <p>—SceneSpatialBodyContext.java</p>
  1480. </div>
  1481. <div class="listingblock">
  1482. <div class="content">
  1483. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1484. <span class="keyword">import</span> <span class="include">com.jme3.app.Application</span>;
  1485. <span class="keyword">import</span> <span class="include">com.jme3.app.state.AppStateManager</span>;
  1486. <span class="keyword">import</span> <span class="include">com.jme3.asset.AssetManager</span>;
  1487. <span class="keyword">import</span> <span class="include">com.jme3.asset.plugins.ZipLocator</span>;
  1488. <span class="keyword">import</span> <span class="include">com.jme3.light.AmbientLight</span>;
  1489. <span class="keyword">import</span> <span class="include">com.jme3.light.DirectionalLight</span>;
  1490. <span class="keyword">import</span> <span class="include">com.jme3.math.Vector3f</span>;
  1491. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  1492. <span class="comment">/*
  1493. Chase camera (aka 3rd person camera) example
  1494. Based on official TestQ3.java
  1495. @author Alex Cham aka Jcrypto
  1496. */</span>
  1497. <span class="directive">public</span> <span class="type">class</span> <span class="class">SceneSpatialBodyContext</span> <span class="directive">extends</span> AbstractSpatialBodyContext
  1498. {
  1499. <span class="directive">private</span> <span class="directive">final</span> Node rootNode;
  1500. <span class="comment">//</span>
  1501. <span class="directive">private</span> <span class="directive">final</span> Node scene;
  1502. <span class="directive">private</span> AmbientLight ambient;
  1503. <span class="directive">private</span> DirectionalLight sun;
  1504. <span class="comment">/**
  1505. @param am
  1506. @param rootNode
  1507. */</span>
  1508. <span class="directive">public</span> SceneSpatialBodyContext(AssetManager am, Node rootNode)
  1509. {
  1510. <span class="local-variable">this</span>.rootNode = rootNode;
  1511. <span class="comment">//</span>
  1512. am.registerLocator(<span class="string"><span class="delimiter">&quot;</span><span class="content">town.zip</span><span class="delimiter">&quot;</span></span>, ZipLocator.class);
  1513. <span class="local-variable">this</span>.scene = (Node) am.loadModel(<span class="string"><span class="delimiter">&quot;</span><span class="content">main.scene</span><span class="delimiter">&quot;</span></span>);
  1514. <span class="local-variable">this</span>.ambient = <span class="keyword">new</span> AmbientLight();
  1515. <span class="local-variable">this</span>.sun = <span class="keyword">new</span> DirectionalLight();
  1516. }
  1517. <span class="annotation">@Override</span>
  1518. <span class="directive">public</span> <span class="type">void</span> initialize(AppStateManager stateManager, Application app)
  1519. {
  1520. <span class="comment">//Main Scene loading</span>
  1521. <span class="local-variable">this</span>.scene.setLocalScale(<span class="float">0.1f</span>);
  1522. <span class="local-variable">this</span>.scene.scale(<span class="float">32.0f</span>);
  1523. <span class="comment">//</span>
  1524. <span class="local-variable">this</span>.sun.setDirection(<span class="keyword">new</span> Vector3f(<span class="float">1.4f</span>, -<span class="float">1.4f</span>, -<span class="float">1.4f</span>));
  1525. <span class="local-variable">this</span>.scene.setLocalTranslation(Vector3f.ZERO);
  1526. <span class="comment">//</span>
  1527. rootNode.attachChild(<span class="local-variable">this</span>.scene);
  1528. rootNode.addLight(<span class="local-variable">this</span>.ambient);
  1529. rootNode.addLight(<span class="local-variable">this</span>.sun);
  1530. }
  1531. <span class="comment">/**
  1532. @return the scene
  1533. */</span>
  1534. <span class="directive">public</span> Node getScene()
  1535. {
  1536. <span class="keyword">return</span> scene;
  1537. }
  1538. }</code></pre>
  1539. </div>
  1540. </div>
  1541. <div class="paragraph">
  1542. <p>—TheGame.java</p>
  1543. </div>
  1544. <div class="listingblock">
  1545. <div class="content">
  1546. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey3.chasecam</span>;
  1547. <span class="keyword">import</span> <span class="include">com.jme3.app.SimpleApplication</span>;
  1548. <span class="comment">/*
  1549. Chase camera (aka 3rd person camera) example
  1550. Based on official TestQ3.java
  1551. @author Alex Cham aka Jcrypto
  1552. */</span>
  1553. <span class="directive">public</span> <span class="type">class</span> <span class="class">TheGame</span> <span class="directive">extends</span> SimpleApplication
  1554. {
  1555. <span class="directive">private</span> ApplicationContext applicationContext;
  1556. <span class="directive">public</span> TheGame()
  1557. {
  1558. }
  1559. <span class="comment">//</span>
  1560. <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> main(<span class="predefined-type">String</span><span class="type">[]</span> args)
  1561. {
  1562. TheGame game = <span class="keyword">new</span> TheGame();
  1563. game.setShowSettings(<span class="predefined-constant">false</span>);
  1564. game.start();
  1565. }
  1566. <span class="annotation">@Override</span>
  1567. <span class="directive">public</span> <span class="type">void</span> simpleInitApp()
  1568. {
  1569. <span class="local-variable">this</span>.applicationContext = <span class="keyword">new</span> ApplicationContext(stateManager, assetManager, settings, inputManager, rootNode, cam, flyCam);
  1570. <span class="comment">//</span>
  1571. stateManager.attach(applicationContext);
  1572. }
  1573. }</code></pre>
  1574. </div>
  1575. </div>
  1576. <div class="paragraph">
  1577. <p>—Debug.java</p>
  1578. </div>
  1579. <div class="listingblock">
  1580. <div class="content">
  1581. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey.utils</span>;
  1582. <span class="keyword">import</span> <span class="include">com.jme3.animation.AnimControl</span>;
  1583. <span class="keyword">import</span> <span class="include">com.jme3.asset.AssetManager</span>;
  1584. <span class="keyword">import</span> <span class="include">com.jme3.material.Material</span>;
  1585. <span class="keyword">import</span> <span class="include">com.jme3.math.ColorRGBA</span>;
  1586. <span class="keyword">import</span> <span class="include">com.jme3.math.Vector3f</span>;
  1587. <span class="keyword">import</span> <span class="include">com.jme3.scene.Geometry</span>;
  1588. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  1589. <span class="keyword">import</span> <span class="include">com.jme3.scene.debug.Arrow</span>;
  1590. <span class="keyword">import</span> <span class="include">com.jme3.scene.debug.Grid</span>;
  1591. <span class="keyword">import</span> <span class="include">com.jme3.scene.debug.SkeletonDebugger</span>;
  1592. <span class="keyword">import</span> <span class="include">com.jme3.scene.shape.Line</span>;
  1593. <span class="keyword">import</span> <span class="include">static</span> <span class="include">org.jmonkey.utils.SpatialUtils.makeGeometry</span>;
  1594. <span class="comment">/*
  1595. Chase camera (aka 3rd person camera) example
  1596. Based on official TestQ3.java
  1597. @author Alex Cham aka Jcrypto
  1598. */</span>
  1599. <span class="directive">public</span> <span class="type">class</span> <span class="class">Debug</span>
  1600. {
  1601. <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> showNodeAxes(AssetManager am, Node n, <span class="type">float</span> axisLen)
  1602. {
  1603. Vector3f v = <span class="keyword">new</span> Vector3f(axisLen, <span class="integer">0</span>, <span class="integer">0</span>);
  1604. Arrow a = <span class="keyword">new</span> Arrow(v);
  1605. Material mat = <span class="keyword">new</span> Material(am, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/Unshaded.j3md</span><span class="delimiter">&quot;</span></span>);
  1606. mat.setColor(<span class="string"><span class="delimiter">&quot;</span><span class="content">Color</span><span class="delimiter">&quot;</span></span>, ColorRGBA.Red);
  1607. Geometry geom = <span class="keyword">new</span> Geometry(n.getName() + <span class="string"><span class="delimiter">&quot;</span><span class="content">XAxis</span><span class="delimiter">&quot;</span></span>, a);
  1608. geom.setMaterial(mat);
  1609. n.attachChild(geom);
  1610. <span class="comment">//</span>
  1611. v = <span class="keyword">new</span> Vector3f(<span class="integer">0</span>, axisLen, <span class="integer">0</span>);
  1612. a = <span class="keyword">new</span> Arrow(v);
  1613. mat = <span class="keyword">new</span> Material(am, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/Unshaded.j3md</span><span class="delimiter">&quot;</span></span>);
  1614. mat.setColor(<span class="string"><span class="delimiter">&quot;</span><span class="content">Color</span><span class="delimiter">&quot;</span></span>, ColorRGBA.Green);
  1615. geom = <span class="keyword">new</span> Geometry(n.getName() + <span class="string"><span class="delimiter">&quot;</span><span class="content">YAxis</span><span class="delimiter">&quot;</span></span>, a);
  1616. geom.setMaterial(mat);
  1617. n.attachChild(geom);
  1618. <span class="comment">//</span>
  1619. v = <span class="keyword">new</span> Vector3f(<span class="integer">0</span>, <span class="integer">0</span>, axisLen);
  1620. a = <span class="keyword">new</span> Arrow(v);
  1621. mat = <span class="keyword">new</span> Material(am, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/Unshaded.j3md</span><span class="delimiter">&quot;</span></span>);
  1622. mat.setColor(<span class="string"><span class="delimiter">&quot;</span><span class="content">Color</span><span class="delimiter">&quot;</span></span>, ColorRGBA.Blue);
  1623. geom = <span class="keyword">new</span> Geometry(n.getName() + <span class="string"><span class="delimiter">&quot;</span><span class="content">ZAxis</span><span class="delimiter">&quot;</span></span>, a);
  1624. geom.setMaterial(mat);
  1625. n.attachChild(geom);
  1626. }
  1627. <span class="comment">//</span>
  1628. <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> showVector3fArrow(AssetManager am, Node n, Vector3f v, ColorRGBA color, <span class="predefined-type">String</span> name)
  1629. {
  1630. Arrow a = <span class="keyword">new</span> Arrow(v);
  1631. Material mat = MaterialUtils.makeMaterial(am, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/Unshaded.j3md</span><span class="delimiter">&quot;</span></span>, color);
  1632. Geometry geom = makeGeometry(a, mat, name);
  1633. n.attachChild(geom);
  1634. }
  1635. <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> showVector3fLine(AssetManager am, Node n, Vector3f v, ColorRGBA color, <span class="predefined-type">String</span> name)
  1636. {
  1637. <span class="predefined-type">Line</span> l = <span class="keyword">new</span> <span class="predefined-type">Line</span>(v.subtract(v), v);
  1638. Material mat = MaterialUtils.makeMaterial(am, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/Unshaded.j3md</span><span class="delimiter">&quot;</span></span>, color);
  1639. Geometry geom = makeGeometry(l, mat, name);
  1640. n.attachChild(geom);
  1641. }
  1642. <span class="comment">//Skeleton Debugger</span>
  1643. <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> attachSkeleton(AssetManager am, Node player, AnimControl control)
  1644. {
  1645. SkeletonDebugger skeletonDebug = <span class="keyword">new</span> SkeletonDebugger(<span class="string"><span class="delimiter">&quot;</span><span class="content">skeleton</span><span class="delimiter">&quot;</span></span>, control.getSkeleton());
  1646. Material mat2 = <span class="keyword">new</span> Material(am, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/Unshaded.j3md</span><span class="delimiter">&quot;</span></span>);
  1647. mat2.setColor(<span class="string"><span class="delimiter">&quot;</span><span class="content">Color</span><span class="delimiter">&quot;</span></span>, ColorRGBA.Yellow);
  1648. mat2.getAdditionalRenderState().setDepthTest(<span class="predefined-constant">false</span>);
  1649. skeletonDebug.setMaterial(mat2);
  1650. player.attachChild(skeletonDebug);
  1651. }
  1652. <span class="comment">///</span>
  1653. <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> attachWireFrameDebugGrid(AssetManager assetManager, Node n, Vector3f pos, <span class="predefined-type">Integer</span> size, ColorRGBA color)
  1654. {
  1655. Geometry g = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">wireFrameDebugGrid</span><span class="delimiter">&quot;</span></span>, <span class="keyword">new</span> Grid(size, size, <span class="float">1.0f</span>));<span class="comment">//1WU</span>
  1656. Material mat = <span class="keyword">new</span> Material(assetManager, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/Unshaded.j3md</span><span class="delimiter">&quot;</span></span>);
  1657. mat.getAdditionalRenderState().setWireframe(<span class="predefined-constant">true</span>);
  1658. mat.setColor(<span class="string"><span class="delimiter">&quot;</span><span class="content">Color</span><span class="delimiter">&quot;</span></span>, color);
  1659. g.setMaterial(mat);
  1660. g.center().move(pos);
  1661. n.attachChild(g);
  1662. }
  1663. }</code></pre>
  1664. </div>
  1665. </div>
  1666. <div class="paragraph">
  1667. <p>—MaterialUtils.java</p>
  1668. </div>
  1669. <div class="listingblock">
  1670. <div class="content">
  1671. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey.utils</span>;
  1672. <span class="keyword">import</span> <span class="include">com.jme3.asset.AssetManager</span>;
  1673. <span class="keyword">import</span> <span class="include">com.jme3.material.Material</span>;
  1674. <span class="keyword">import</span> <span class="include">com.jme3.math.ColorRGBA</span>;
  1675. <span class="comment">/*
  1676. Chase camera (aka 3rd person camera) example
  1677. Based on official TestQ3.java
  1678. @author Alex Cham aka Jcrypto
  1679. */</span>
  1680. <span class="directive">public</span> <span class="type">class</span> <span class="class">MaterialUtils</span>
  1681. {
  1682. <span class="directive">public</span> MaterialUtils()
  1683. {
  1684. }
  1685. <span class="comment">//&quot;Common/MatDefs/Misc/Unshaded.j3md&quot;</span>
  1686. <span class="directive">public</span> <span class="directive">static</span> Material makeMaterial(AssetManager am, <span class="predefined-type">String</span> name, ColorRGBA color)
  1687. {
  1688. Material mat = <span class="keyword">new</span> Material(am, name);
  1689. mat.setColor(<span class="string"><span class="delimiter">&quot;</span><span class="content">Color</span><span class="delimiter">&quot;</span></span>, color);
  1690. <span class="keyword">return</span> mat;
  1691. }
  1692. }</code></pre>
  1693. </div>
  1694. </div>
  1695. <div class="paragraph">
  1696. <p>—SpatialUtils.java</p>
  1697. </div>
  1698. <div class="listingblock">
  1699. <div class="content">
  1700. <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.jmonkey.utils</span>;
  1701. <span class="keyword">import</span> <span class="include">com.jme3.material.Material</span>;
  1702. <span class="keyword">import</span> <span class="include">com.jme3.math.Vector3f</span>;
  1703. <span class="keyword">import</span> <span class="include">com.jme3.scene.Geometry</span>;
  1704. <span class="keyword">import</span> <span class="include">com.jme3.scene.Mesh</span>;
  1705. <span class="keyword">import</span> <span class="include">com.jme3.scene.Node</span>;
  1706. <span class="comment">/**
  1707. @author java
  1708. */</span>
  1709. <span class="directive">public</span> <span class="type">class</span> <span class="class">SpatialUtils</span>
  1710. {
  1711. <span class="comment">//</span>
  1712. <span class="directive">public</span> <span class="directive">static</span> Node makeNode(<span class="predefined-type">String</span> name)
  1713. {
  1714. Node n = <span class="keyword">new</span> Node(name);
  1715. <span class="keyword">return</span> n;
  1716. }
  1717. <span class="comment">//</span>
  1718. <span class="directive">public</span> <span class="directive">static</span> Geometry makeGeometry(Mesh mesh, Material mat, <span class="predefined-type">String</span> name)
  1719. {
  1720. Geometry geom = <span class="keyword">new</span> Geometry(name, mesh);
  1721. geom.setMaterial(mat);
  1722. <span class="keyword">return</span> geom;
  1723. }
  1724. <span class="comment">//</span>
  1725. <span class="directive">public</span> <span class="directive">static</span> Geometry makeGeometry(Vector3f loc, Vector3f scl, Mesh mesh, Material mat, <span class="predefined-type">String</span> name)
  1726. {
  1727. Geometry geom = <span class="keyword">new</span> Geometry(name, mesh);
  1728. geom.setMaterial(mat);
  1729. geom.setLocalTranslation(loc);
  1730. geom.setLocalScale(scl);
  1731. <span class="keyword">return</span> geom;
  1732. }
  1733. }</code></pre>
  1734. </div>
  1735. </div>
  1736. </div>
  1737. <div id="footer">
  1738. <div id="footer-text">
  1739. Last updated 2016-05-21 23:44:18 UTC
  1740. </div>
  1741. </div>
  1742. </body>
  1743. </html>