XStateMachine.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import Logger from "./Logger.js"
  2. const logger = new Logger('XStateMachine')
  3. export default class XStateMachine {
  4. constructor(e) {
  5. E(this, "state");
  6. E(this, "isMoving");
  7. E(this, "isRotating");
  8. E(this, "_observer");
  9. E(this, "_movingObserver");
  10. E(this, "_scene");
  11. this._scene = e
  12. }
  13. rotateTo(e, t, r, n) {
  14. return new Promise((o,a)=>{
  15. var h;
  16. const s = e.avatarManager.scene;
  17. if (r && e.setRotation(r),
  18. t == r)
  19. return o();
  20. e.priority === 0 && logger.info(`avatar ${e.id} starts to rotate from ${r} to ${t}`);
  21. let l = 0;
  22. const u = 1e3 / 25
  23. , c = calcDistance3DAngle(t, e.rotation) / u;
  24. this._movingObserver && s.onBeforeRenderObservable.remove(this._movingObserver),
  25. (h = e.controller) == null || h.playAnimation(n || "Walking", !0),
  26. this._movingObserver = s == null ? void 0 : s.onBeforeRenderObservable.add(()=>{
  27. var f;
  28. if (l < 1) {
  29. if (!e.rootNode)
  30. return e.setRotation(t),
  31. o();
  32. const d = BABYLON.Vector3.Lerp(e.rootNode.rotation, ue4Rotation2Xverse(t), l);
  33. e.setRotation(xverseRotation2Ue4(d)),
  34. l += u / (c * 1e3)
  35. } else
  36. return s.onBeforeRenderObservable.remove(this._movingObserver),
  37. (f = e.controller) == null || f.playAnimation("Idle", !0),
  38. o()
  39. }
  40. )
  41. }
  42. )
  43. }
  44. _filterPathPoint(e) {
  45. let t = 0;
  46. const r = 1e-4;
  47. if (e.length <= 1)
  48. return [];
  49. for (; t < e.length - 1; )
  50. calcDistance3D(e[t], e[t + 1]) < r ? e.splice(t, 1) : t++;
  51. return e
  52. }
  53. moveTo(e, t, r, n, o, a) {
  54. return new Promise((s,l)=>{
  55. var m;
  56. const u = e.avatarManager.scene;
  57. e.priority === 0 && logger.info(`avatar ${e.id} starts to move from ${t} to ${r}`);
  58. let c = 0;
  59. a ? a = a.concat(r) : a = [r],
  60. a = this._filterPathPoint(a);
  61. let h = t
  62. , f = a.shift();
  63. if (!f)
  64. return l("[Engine input path error]");
  65. let d = calcDistance3D(h, f) / n;
  66. const _ = 1e3 / 25;
  67. e.rootNode.lookAt(ue4Position2Xverse(f));
  68. const g = xverseRotation2Ue4({
  69. x: e.rootNode.rotation.x,
  70. y: e.rootNode.rotation.y,
  71. z: e.rootNode.rotation.z
  72. });
  73. g && (g.roll = 0,
  74. g.pitch = 0,
  75. e.setRotation(g)),
  76. this._movingObserver && u.onBeforeRenderObservable.remove(this._movingObserver),
  77. (m = e.controller) == null || m.playAnimation(o, !0),
  78. this._movingObserver = u == null ? void 0 : u.onBeforeRenderObservable.add(()=>{
  79. var v;
  80. if (c < 1) {
  81. const y = BABYLON.Vector3.Lerp(ue4Position2Xverse(h), ue4Position2Xverse(f), c);
  82. if (e.setPosition(xversePosition2Ue4(y)),
  83. !e.rootNode)
  84. return e.setPosition(r),
  85. s();
  86. c += _ / (d * 1e3)
  87. } else if (h = f,
  88. f = a.shift(),
  89. f) {
  90. d = calcDistance3D(h, f) / n,
  91. e.rootNode.lookAt(ue4Position2Xverse(f));
  92. const y = xverseRotation2Ue4({
  93. x: e.rootNode.rotation.x,
  94. y: e.rootNode.rotation.y,
  95. z: e.rootNode.rotation.z
  96. });
  97. y && (y.roll = 0,
  98. y.pitch = 0,
  99. e.setRotation(y)),
  100. c = 0
  101. } else
  102. return u.onBeforeRenderObservable.remove(this._movingObserver),
  103. (v = e.controller) == null || v.playAnimation("Idle", !0),
  104. s()
  105. }
  106. )
  107. }
  108. )
  109. }
  110. lookAt(e, t, r) {
  111. return new Promise(n=>{
  112. var _, g;
  113. const o = ue4Position2Xverse(t)
  114. , s = e.rootNode.position.subtract(o).length()
  115. , l = new BABYLON.Vector3(s * Math.sin(e.rootNode.rotation.y),0,s * Math.cos(e.rootNode.rotation.y))
  116. , u = (_ = e.rootNode) == null ? void 0 : _.position.add(l);
  117. let c = 0;
  118. const h = r || 1 / 100
  119. , f = (g = e.rootNode) == null ? void 0 : g.getScene()
  120. , d = f == null ? void 0 : f.onBeforeRenderObservable.add(()=>{
  121. var y, b;
  122. const m = (y = e.controller) == null ? void 0 : y.animations.find(T=>T.name == "Idle");
  123. (m == null ? void 0 : m.isPlaying) != !0 && (m == null || m.play());
  124. const v = BABYLON.Vector3.Lerp(u, o, c);
  125. c < 1 ? ((b = e.rootNode) == null || b.lookAt(v),
  126. c += h) : (d && f.onBeforeRenderObservable.remove(d),
  127. n())
  128. }
  129. )
  130. }
  131. )
  132. }
  133. sendObjectTo(e, t, r, n=2, o=10, a={
  134. x: 0,
  135. y: 0,
  136. z: 150
  137. }) {
  138. return new Promise((s,l)=>{
  139. var u;
  140. if (!r.loaded)
  141. l("Gift has not inited!");
  142. else {
  143. const c = (u = e.rootNode) == null ? void 0 : u.getScene();
  144. let h = 0;
  145. const f = 1 / (n * 25)
  146. , d = f
  147. , _ = o / 100
  148. , g = 8 * _ * f * f;
  149. let m = .5 * g / f
  150. , v = ue4Position2Xverse(e.position);
  151. const y = ue4Position2Xverse(a)
  152. , b = ue4Position2Xverse(e.position)
  153. , T = c == null ? void 0 : c.onBeforeRenderObservable.add(()=>{
  154. (!t || !e.position || !t.position) && (T && c.onBeforeRenderObservable.remove(T),
  155. l("Invalid receiver when shoot gift!")),
  156. r.loaded || (T && c.onBeforeRenderObservable.remove(T),
  157. s());
  158. const C = ue4Position2Xverse(t.position)
  159. , A = new BABYLON.Vector3((C.x - b.x) * f,m,(C.z - b.z) * f);
  160. m = m - g,
  161. h < 1 ? (v = v.add(A),
  162. r.setPositionVector(v.add(y)),
  163. h += d) : (s(),
  164. T && c.onBeforeRenderObservable.remove(T))
  165. }
  166. )
  167. }
  168. }
  169. )
  170. }
  171. roll(e, t, r, n) {
  172. var o, a;
  173. this._observer && ((o = this._scene) == null || o.onBeforeRenderObservable.remove(this._observer)),
  174. t && (r = r != null ? r : 1,
  175. n = n != null ? n : 1,
  176. this._observer = (a = this._scene) == null ? void 0 : a.onBeforeRenderObservable.add(()=>{
  177. e.rootNode.rotation.y += r * .1 * n,
  178. e.rootNode.rotation.y %= Math.PI * 2
  179. }
  180. ))
  181. }
  182. disposeObsever() {
  183. this._movingObserver && this._scene.onBeforeRenderObservable.remove(this._movingObserver)
  184. }
  185. }