mage-engine 3.24.4 → 3.24.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/.github/workflows/test.yml +29 -0
  2. package/__mocks__/three.js +178 -0
  3. package/coverage/clover.xml +3094 -0
  4. package/coverage/coverage-final.json +60 -0
  5. package/coverage/lcov-report/base.css +224 -0
  6. package/coverage/lcov-report/block-navigation.js +87 -0
  7. package/coverage/lcov-report/entities/Element.js.html +3463 -0
  8. package/coverage/lcov-report/entities/Entity.js.html +2740 -0
  9. package/coverage/lcov-report/entities/animations/AnimationHandler.js.html +1006 -0
  10. package/coverage/lcov-report/entities/animations/SpriteAnimationHandler.js.html +91 -0
  11. package/coverage/lcov-report/entities/animations/index.html +131 -0
  12. package/coverage/lcov-report/entities/animations/lib/NodeFrame.js.html +214 -0
  13. package/coverage/lcov-report/entities/animations/lib/index.html +116 -0
  14. package/coverage/lcov-report/entities/base/AnimatedSprite.js.html +220 -0
  15. package/coverage/lcov-report/entities/base/Axes.js.html +316 -0
  16. package/coverage/lcov-report/entities/base/Box.js.html +253 -0
  17. package/coverage/lcov-report/entities/base/Cone.js.html +304 -0
  18. package/coverage/lcov-report/entities/base/Cube.js.html +217 -0
  19. package/coverage/lcov-report/entities/base/CurveLine.js.html +166 -0
  20. package/coverage/lcov-report/entities/base/Cylinder.js.html +259 -0
  21. package/coverage/lcov-report/entities/base/Grid.js.html +190 -0
  22. package/coverage/lcov-report/entities/base/HelperSprite.js.html +163 -0
  23. package/coverage/lcov-report/entities/base/Label.js.html +373 -0
  24. package/coverage/lcov-report/entities/base/Line.js.html +334 -0
  25. package/coverage/lcov-report/entities/base/Plane.js.html +265 -0
  26. package/coverage/lcov-report/entities/base/Sphere.js.html +217 -0
  27. package/coverage/lcov-report/entities/base/Sprite.js.html +445 -0
  28. package/coverage/lcov-report/entities/base/index.html +326 -0
  29. package/coverage/lcov-report/entities/base/index.js.html +172 -0
  30. package/coverage/lcov-report/entities/camera.js.html +751 -0
  31. package/coverage/lcov-report/entities/constants.js.html +655 -0
  32. package/coverage/lcov-report/entities/index.html +176 -0
  33. package/coverage/lcov-report/entities/index.js.html +187 -0
  34. package/coverage/lcov-report/favicon.png +0 -0
  35. package/coverage/lcov-report/images/Images.js.html +724 -0
  36. package/coverage/lcov-report/images/index.html +116 -0
  37. package/coverage/lcov-report/index.html +266 -0
  38. package/coverage/lcov-report/lib/Color.js.html +187 -0
  39. package/coverage/lcov-report/lib/array.js.html +97 -0
  40. package/coverage/lcov-report/lib/colliders.js.html +217 -0
  41. package/coverage/lcov-report/lib/constants.js.html +1171 -0
  42. package/coverage/lcov-report/lib/dom.js.html +202 -0
  43. package/coverage/lcov-report/lib/easing.js.html +229 -0
  44. package/coverage/lcov-report/lib/features.js.html +826 -0
  45. package/coverage/lcov-report/lib/functions.js.html +130 -0
  46. package/coverage/lcov-report/lib/index.html +401 -0
  47. package/coverage/lcov-report/lib/location.js.html +127 -0
  48. package/coverage/lcov-report/lib/map.js.html +172 -0
  49. package/coverage/lcov-report/lib/math.js.html +511 -0
  50. package/coverage/lcov-report/lib/meshUtils.js.html +685 -0
  51. package/coverage/lcov-report/lib/messages.js.html +415 -0
  52. package/coverage/lcov-report/lib/network.js.html +136 -0
  53. package/coverage/lcov-report/lib/object.js.html +187 -0
  54. package/coverage/lcov-report/lib/palettes.js.html +259 -0
  55. package/coverage/lcov-report/lib/query.js.html +172 -0
  56. package/coverage/lcov-report/lib/strings.js.html +139 -0
  57. package/coverage/lcov-report/lib/url.js.html +85 -0
  58. package/coverage/lcov-report/lib/utils/assets.js.html +94 -0
  59. package/coverage/lcov-report/lib/utils/index.html +116 -0
  60. package/coverage/lcov-report/lib/uuid.js.html +112 -0
  61. package/coverage/lcov-report/models/Models.js.html +1489 -0
  62. package/coverage/lcov-report/models/SkeletonUtils.js.html +1879 -0
  63. package/coverage/lcov-report/models/index.html +131 -0
  64. package/coverage/lcov-report/physics/constants.js.html +307 -0
  65. package/coverage/lcov-report/physics/hitbox.js.html +235 -0
  66. package/coverage/lcov-report/physics/index.html +176 -0
  67. package/coverage/lcov-report/physics/index.js.html +1324 -0
  68. package/coverage/lcov-report/physics/messages.js.html +238 -0
  69. package/coverage/lcov-report/physics/utils.js.html +679 -0
  70. package/coverage/lcov-report/physics/worker/effects.js.html +325 -0
  71. package/coverage/lcov-report/physics/worker/elements.js.html +694 -0
  72. package/coverage/lcov-report/physics/worker/index.html +176 -0
  73. package/coverage/lcov-report/physics/worker/lib/dispatcher.js.html +160 -0
  74. package/coverage/lcov-report/physics/worker/lib/index.html +131 -0
  75. package/coverage/lcov-report/physics/worker/lib/math.js.html +109 -0
  76. package/coverage/lcov-report/physics/worker/player.js.html +301 -0
  77. package/coverage/lcov-report/physics/worker/vehicles.js.html +832 -0
  78. package/coverage/lcov-report/physics/worker/world.js.html +796 -0
  79. package/coverage/lcov-report/prettify.css +1 -0
  80. package/coverage/lcov-report/prettify.js +2 -0
  81. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  82. package/coverage/lcov-report/sorter.js +210 -0
  83. package/coverage/lcov.info +6368 -0
  84. package/dist/mage.js +7993 -9021
  85. package/eslint.config.js +73 -0
  86. package/jest.config.js +31 -0
  87. package/package.json +17 -5
@@ -0,0 +1,751 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for entities/camera.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">entities</a> camera.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/86</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/52</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/20</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/85</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-neutral">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-no">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-no">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-no">&nbsp;</span>
310
+ <span class="cline-any cline-no">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-no">&nbsp;</span>
313
+ <span class="cline-any cline-no">&nbsp;</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-no">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-no">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-no">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-no">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-no">&nbsp;</span>
337
+ <span class="cline-any cline-no">&nbsp;</span>
338
+ <span class="cline-any cline-no">&nbsp;</span>
339
+ <span class="cline-any cline-no">&nbsp;</span>
340
+ <span class="cline-any cline-no">&nbsp;</span>
341
+ <span class="cline-any cline-no">&nbsp;</span>
342
+ <span class="cline-any cline-no">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-no">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-no">&nbsp;</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-no">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-no">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-no">&nbsp;</span>
371
+ <span class="cline-any cline-no">&nbsp;</span>
372
+ <span class="cline-any cline-no">&nbsp;</span>
373
+ <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-no">&nbsp;</span>
381
+ <span class="cline-any cline-no">&nbsp;</span>
382
+ <span class="cline-any cline-no">&nbsp;</span>
383
+ <span class="cline-any cline-no">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-no">&nbsp;</span>
387
+ <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-no">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-no">&nbsp;</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-no">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-no">&nbsp;</span>
404
+ <span class="cline-any cline-no">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-no">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-no">&nbsp;</span>
415
+ <span class="cline-any cline-no">&nbsp;</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-no">&nbsp;</span>
420
+ <span class="cline-any cline-no">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-no">&nbsp;</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span>
441
+ <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-neutral">&nbsp;</span>
446
+ <span class="cline-any cline-neutral">&nbsp;</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-no">&nbsp;</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-no">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-neutral">&nbsp;</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-no">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-no">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-no">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-no">&nbsp;</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
502
+ <span class="cline-any cline-neutral">&nbsp;</span>
503
+ <span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { PerspectiveCamera, Vector3, CameraHelper } from "three";
511
+ import config from "../core/config";
512
+ import Scene from "../core/Scene";
513
+ import { ENTITY_TYPES } from "./constants";
514
+ import Entity from "./Entity";
515
+ import HelperSprite from "./base/HelperSprite";
516
+ import { TAGS } from "../lib/constants";
517
+ &nbsp;
518
+ export default class Camera extends Entity {
519
+ <span class="fstat-no" title="function not covered" > co</span>nstructor(options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
520
+ const {
521
+ name = <span class="branch-0 cbranch-no" title="branch not covered" >"Main PerspectiveCamera",</span>
522
+ fov = <span class="branch-0 cbranch-no" title="branch not covered" >config.camera().fov,</span>
523
+ ratio = <span class="branch-0 cbranch-no" title="branch not covered" >config.screen().ratio,</span>
524
+ near = <span class="branch-0 cbranch-no" title="branch not covered" >config.camera().near,</span>
525
+ far = <span class="branch-0 cbranch-no" title="branch not covered" >config.camera().far,</span>
526
+ serializable = <span class="branch-0 cbranch-no" title="branch not covered" >true,</span>
527
+ } = <span class="cstat-no" title="statement not covered" >options;</span>
528
+ &nbsp;
529
+ <span class="cstat-no" title="statement not covered" > super({ name, serializable });</span>
530
+ &nbsp;
531
+ <span class="cstat-no" title="statement not covered" > this.extendOptions(options);</span>
532
+ const body = <span class="cstat-no" title="statement not covered" >new PerspectiveCamera(fov, ratio, near, far);</span>
533
+ &nbsp;
534
+ <span class="cstat-no" title="statement not covered" > this.setBody({ body });</span>
535
+ <span class="cstat-no" title="statement not covered" > this.setEntityType(ENTITY_TYPES.CAMERA.TYPE);</span>
536
+ <span class="cstat-no" title="statement not covered" > this.setEntitySubtype(ENTITY_TYPES.CAMERA.SUBTYPES.MAIN);</span>
537
+ <span class="cstat-no" title="statement not covered" > this.setName(name);</span>
538
+ &nbsp;
539
+ // Helper body for this camera
540
+ <span class="cstat-no" title="statement not covered" > this.isUsingHelper = false;</span>
541
+ // Holder body representing the camera (for selection in editor)
542
+ <span class="cstat-no" title="statement not covered" > this.holder = null;</span>
543
+ // THREE.js CameraHelper for visual feedback
544
+ <span class="cstat-no" title="statement not covered" > this.helper = null;</span>
545
+ }
546
+ &nbsp;
547
+ <span class="fstat-no" title="function not covered" > ha</span>sHolder() {
548
+ <span class="cstat-no" title="statement not covered" > return !!this.holder;</span>
549
+ }
550
+ &nbsp;
551
+ <span class="fstat-no" title="function not covered" > us</span>ingHelper() {
552
+ <span class="cstat-no" title="statement not covered" > return this.isUsingHelper;</span>
553
+ }
554
+ &nbsp;
555
+ <span class="fstat-no" title="function not covered" > ad</span>dHolder(name = <span class="branch-0 cbranch-no" title="branch not covered" >"cameraholder",</span> size = <span class="branch-0 cbranch-no" title="branch not covered" >0.05)</span> {
556
+ const holderSprite = <span class="cstat-no" title="statement not covered" >new HelperSprite(size, size, name, { name });</span>
557
+ &nbsp;
558
+ <span class="cstat-no" title="statement not covered" > if (holderSprite) {</span>
559
+ <span class="cstat-no" title="statement not covered" > holderSprite.setSizeAttenuation(false);</span>
560
+ <span class="cstat-no" title="statement not covered" > holderSprite.setDepthTest(false);</span>
561
+ <span class="cstat-no" title="statement not covered" > holderSprite.setDepthWrite(false);</span>
562
+ <span class="cstat-no" title="statement not covered" > holderSprite.setSerializable(false);</span>
563
+ <span class="cstat-no" title="statement not covered" > holderSprite.setPosition(this.getPosition());</span>
564
+ <span class="cstat-no" title="statement not covered" > holderSprite.addTags([TAGS.HELPER, TAGS.CAMERA_HELPER, name]);</span>
565
+ &nbsp;
566
+ <span class="cstat-no" title="statement not covered" > holderSprite.setHelperTarget(this);</span>
567
+ &nbsp;
568
+ <span class="cstat-no" title="statement not covered" > this.holder = holderSprite;</span>
569
+ &nbsp;
570
+ <span class="cstat-no" title="statement not covered" > return true;</span>
571
+ }
572
+ &nbsp;
573
+ <span class="cstat-no" title="statement not covered" > console.warn("[Mage] Camera holder texture not found");</span>
574
+ <span class="cstat-no" title="statement not covered" > return false;</span>
575
+ }
576
+ &nbsp;
577
+ <span class="fstat-no" title="function not covered" > ad</span>dHelpers({ holderName = <span class="branch-0 cbranch-no" title="branch not covered" >"cameraholder",</span> holderSize = <span class="branch-0 cbranch-no" title="branch not covered" >0.05 </span>} = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
578
+ // Add THREE.js CameraHelper for visual feedback
579
+ <span class="cstat-no" title="statement not covered" > this.helper = new CameraHelper(this.getBody());</span>
580
+ &nbsp;
581
+ // Set to layer 1 ONLY so mirrors don't render camera helper
582
+ <span class="cstat-no" title="statement not covered" > this.helper.layers.set(1);</span>
583
+ &nbsp;
584
+ // Disable depth test so helper always renders on top of sky/water
585
+ <span class="cstat-no" title="statement not covered" > this.helper.renderOrder = 999;</span>
586
+ &nbsp;
587
+ // Helper function to set depth properties on materials
588
+ const setMaterialDepth = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(m</span>aterial) =&gt; {</span>
589
+ <span class="cstat-no" title="statement not covered" > if (!material) <span class="cstat-no" title="statement not covered" >return;</span></span>
590
+ const mats = <span class="cstat-no" title="statement not covered" >Array.isArray(material) ? material : [material];</span>
591
+ <span class="cstat-no" title="statement not covered" > mats.forEach(<span class="fstat-no" title="function not covered" >ma</span>t =&gt; {</span>
592
+ <span class="cstat-no" title="statement not covered" > mat.depthTest = false;</span>
593
+ <span class="cstat-no" title="statement not covered" > mat.depthWrite = false;</span>
594
+ <span class="cstat-no" title="statement not covered" > mat.transparent = true;</span>
595
+ <span class="cstat-no" title="statement not covered" > mat.needsUpdate = true;</span>
596
+ });
597
+ };
598
+ &nbsp;
599
+ <span class="cstat-no" title="statement not covered" > setMaterialDepth(this.helper.material);</span>
600
+ &nbsp;
601
+ // Also apply to all children
602
+ <span class="cstat-no" title="statement not covered" > this.helper.traverse(<span class="fstat-no" title="function not covered" >ch</span>ild =&gt; {</span>
603
+ <span class="cstat-no" title="statement not covered" > child.layers.set(1);</span>
604
+ <span class="cstat-no" title="statement not covered" > child.renderOrder = 999;</span>
605
+ <span class="cstat-no" title="statement not covered" > setMaterialDepth(child.material);</span>
606
+ });
607
+ &nbsp;
608
+ <span class="cstat-no" title="statement not covered" > Scene.add(this.helper, null, false);</span>
609
+ &nbsp;
610
+ // Add holder sprite for selection
611
+ <span class="cstat-no" title="statement not covered" > this.addHolder(holderName, holderSize);</span>
612
+ &nbsp;
613
+ <span class="cstat-no" title="statement not covered" > this.isUsingHelper = true;</span>
614
+ }
615
+ &nbsp;
616
+ <span class="fstat-no" title="function not covered" > ge</span>tPosition() {
617
+ <span class="cstat-no" title="statement not covered" > return {</span>
618
+ x: this.body.position.x,
619
+ y: this.body.position.y,
620
+ z: this.body.position.z,
621
+ };
622
+ }
623
+ &nbsp;
624
+ <span class="fstat-no" title="function not covered" > ge</span>tDirection() {
625
+ const vector = <span class="cstat-no" title="statement not covered" >new Vector3();</span>
626
+ const { x, y, z } = <span class="cstat-no" title="statement not covered" >this.getBody().getWorldDirection(vector);</span>
627
+ &nbsp;
628
+ <span class="cstat-no" title="statement not covered" > return {</span>
629
+ x,
630
+ y,
631
+ z,
632
+ };
633
+ }
634
+ &nbsp;
635
+ <span class="fstat-no" title="function not covered" > lo</span>okAt(position = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
636
+ const { x = <span class="branch-0 cbranch-no" title="branch not covered" >0,</span> y = <span class="branch-0 cbranch-no" title="branch not covered" >0,</span> z = <span class="branch-0 cbranch-no" title="branch not covered" >0 </span>} = <span class="cstat-no" title="statement not covered" >position;</span>
637
+ <span class="cstat-no" title="statement not covered" > this.body.lookAt(x, y, z);</span>
638
+ }
639
+ &nbsp;
640
+ <span class="fstat-no" title="function not covered" > se</span>tPosition(where, { updateHolder = <span class="branch-0 cbranch-no" title="branch not covered" >true </span>} = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
641
+ const currentPos = <span class="cstat-no" title="statement not covered" >this.getPosition();</span>
642
+ const position = <span class="cstat-no" title="statement not covered" >{</span>
643
+ x: currentPos.x,
644
+ y: currentPos.y,
645
+ z: currentPos.z,
646
+ ...where,
647
+ };
648
+ &nbsp;
649
+ const { x, y, z } = <span class="cstat-no" title="statement not covered" >position;</span>
650
+ &nbsp;
651
+ <span class="cstat-no" title="statement not covered" > if (this.hasBody()) {</span>
652
+ <span class="cstat-no" title="statement not covered" > this.body.position.set(x, y, z);</span>
653
+ }
654
+ &nbsp;
655
+ <span class="cstat-no" title="statement not covered" > if (this.hasHolder() &amp;&amp; updateHolder) {</span>
656
+ <span class="cstat-no" title="statement not covered" > this.holder.setPosition({ x, y, z });</span>
657
+ }
658
+ }
659
+ &nbsp;
660
+ <span class="fstat-no" title="function not covered" > up</span>date(dt) {
661
+ <span class="cstat-no" title="statement not covered" > super.update &amp;&amp; super.update(dt);</span>
662
+ &nbsp;
663
+ // Update the THREE.js CameraHelper
664
+ <span class="cstat-no" title="statement not covered" > if (this.usingHelper() &amp;&amp; this.helper) {</span>
665
+ <span class="cstat-no" title="statement not covered" > this.helper.update();</span>
666
+ }
667
+ &nbsp;
668
+ // Sync camera position from holder (when user drags the holder)
669
+ <span class="cstat-no" title="statement not covered" > if (this.hasHolder()) {</span>
670
+ // Read directly from the holder's THREE.js body position
671
+ const holderBody = <span class="cstat-no" title="statement not covered" >this.holder.getBody();</span>
672
+ const holderPos = <span class="cstat-no" title="statement not covered" >{</span>
673
+ x: holderBody.position.x,
674
+ y: holderBody.position.y,
675
+ z: holderBody.position.z,
676
+ };
677
+ const cameraPos = <span class="cstat-no" title="statement not covered" >this.getPosition();</span>
678
+ // Only update if positions differ significantly
679
+ const threshold = <span class="cstat-no" title="statement not covered" >0.001;</span>
680
+ <span class="cstat-no" title="statement not covered" > if (Math.abs(holderPos.x - cameraPos.x) &gt; threshold ||</span>
681
+ Math.abs(holderPos.y - cameraPos.y) &gt; threshold ||
682
+ Math.abs(holderPos.z - cameraPos.z) &gt; threshold) {
683
+ <span class="cstat-no" title="statement not covered" > this.setPosition(holderPos, { updateHolder: false });</span>
684
+ }
685
+ }
686
+ }
687
+ &nbsp;
688
+ <span class="fstat-no" title="function not covered" > ge</span>tFov() {
689
+ <span class="cstat-no" title="statement not covered" > return this.getBody().fov;</span>
690
+ }
691
+ &nbsp;
692
+ <span class="fstat-no" title="function not covered" > se</span>tFov(fov) {
693
+ const num = <span class="cstat-no" title="statement not covered" >Number(fov);</span>
694
+ const numericFov = <span class="cstat-no" title="statement not covered" >Number.isFinite(num) ? num : 75;</span>
695
+ <span class="cstat-no" title="statement not covered" > this.getBody().fov = numericFov;</span>
696
+ <span class="cstat-no" title="statement not covered" > this.getBody().updateProjectionMatrix();</span>
697
+ }
698
+ &nbsp;
699
+ <span class="fstat-no" title="function not covered" > ge</span>tNear() {
700
+ <span class="cstat-no" title="statement not covered" > return this.getBody().near;</span>
701
+ }
702
+ &nbsp;
703
+ <span class="fstat-no" title="function not covered" > se</span>tNear(near) {
704
+ const num = <span class="cstat-no" title="statement not covered" >Number(near);</span>
705
+ const numericNear = <span class="cstat-no" title="statement not covered" >Number.isFinite(num) ? num : 0.1;</span>
706
+ <span class="cstat-no" title="statement not covered" > this.getBody().near = numericNear;</span>
707
+ <span class="cstat-no" title="statement not covered" > this.getBody().updateProjectionMatrix();</span>
708
+ }
709
+ &nbsp;
710
+ <span class="fstat-no" title="function not covered" > ge</span>tFar() {
711
+ <span class="cstat-no" title="statement not covered" > return this.getBody().far;</span>
712
+ }
713
+ &nbsp;
714
+ <span class="fstat-no" title="function not covered" > se</span>tFar(far) {
715
+ const num = <span class="cstat-no" title="statement not covered" >Number(far);</span>
716
+ const numericFar = <span class="cstat-no" title="statement not covered" >Number.isFinite(num) ? num : 3000000;</span>
717
+ <span class="cstat-no" title="statement not covered" > this.getBody().far = numericFar;</span>
718
+ <span class="cstat-no" title="statement not covered" > this.getBody().updateProjectionMatrix();</span>
719
+ }
720
+ &nbsp;
721
+ <span class="fstat-no" title="function not covered" > to</span>JSON(parseJSON = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span> {
722
+ <span class="cstat-no" title="statement not covered" > if (this.isSerializable()) {</span>
723
+ <span class="cstat-no" title="statement not covered" > return {</span>
724
+ ...super.toJSON(parseJSON),
725
+ fov: this.getFov(),
726
+ near: this.getNear(),
727
+ far: this.getFar(),
728
+ };
729
+ }
730
+ }
731
+ }
732
+ &nbsp;</pre></td></tr></table></pre>
733
+
734
+ <div class='push'></div><!-- for sticky footer -->
735
+ </div><!-- /wrapper -->
736
+ <div class='footer quiet pad2 space-top1 center small'>
737
+ Code coverage generated by
738
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
739
+ at 2026-03-02T17:28:15.675Z
740
+ </div>
741
+ <script src="../prettify.js"></script>
742
+ <script>
743
+ window.onload = function () {
744
+ prettyPrint();
745
+ };
746
+ </script>
747
+ <script src="../sorter.js"></script>
748
+ <script src="../block-navigation.js"></script>
749
+ </body>
750
+ </html>
751
+