SpriteManager.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. 
  2. var sprite = function (uncheckedImg, checkedImg, spriteButtonImage, spriteButtonText, execute) {
  3. this.UncheckedImg = uncheckedImg;
  4. this.CheckedImg = checkedImg;
  5. this.SpriteButtonImage = spriteButtonImage;
  6. this.SpriteButtonText = spriteButtonText;
  7. this.display = function () {
  8. this.SpriteButtonImage.visible = true;
  9. this.SpriteButtonText.visible = true;
  10. };
  11. this.isVisible = function(){
  12. return this.SpriteButtonImage.visible;
  13. };
  14. this.hide = function () {
  15. this.SpriteButtonImage.visible = false;
  16. this.SpriteButtonText.visible = false;
  17. };
  18. this.checked = function () {
  19. EventCenter.emit("SelectedSpriteChanged", this);
  20. this.SpriteButtonImage.material.map = this.CheckedImg;
  21. execute();
  22. };
  23. this.hightLight = function () {
  24. this.SpriteButtonImage.material.map = this.CheckedImg;
  25. };
  26. this.unchecked = function () {
  27. this.SpriteButtonImage.material.map = this.UncheckedImg;
  28. };
  29. };
  30. var SpriteManager = {
  31. spriteMaxCount: 7,
  32. spriteInterval: 20,
  33. spriteRotateL: undefined,
  34. spriteRotateR: undefined,
  35. spriteQuickClip: undefined,
  36. spriteMove:undefined,
  37. spriteClip:undefined,
  38. isSpriteButtonAdded: false,
  39. spriteAreaWidth: undefined,
  40. spriteWidth: undefined,
  41. spriteHeight: undefined,
  42. clipType: undefined,
  43. allowClip: false,
  44. sprites:[],
  45. hightLightSprite:undefined,
  46. selectedSprite:undefined,
  47. infoHideTask: undefined,
  48. quickClipExecute: false,
  49. init: function () {
  50. this.initSpriteSize();
  51. EventCenter.addEventHandler("SelectedSpriteChanged", this.selectSpriteChanged);
  52. this.spriteMove = this.createSprite("3DWeb/ButtonImage/move.png", "3DWeb/ButtonImage/moveMouseDown.png", this.moveClipPlaneChecked, languageContent.Move);
  53. this.spriteClip = this.createSprite("3DWeb/ButtonImage/clip.png", "3DWeb/ButtonImage/clipMouseDown.png", this.drawLineChecked, languageContent.Clip);
  54. this.spriteQuickClip = this.createSprite("3DWeb/ButtonImage/AI.png", "3DWeb/ButtonImage/AIDown.png", this.quickClipChecked, languageContent.QuickClip);
  55. this.createSprite("3DWeb/ButtonImage/reset.png", "3DWeb/ButtonImage/resetMouseDown.png", this.resetChecked, languageContent.Reset);
  56. this.createSprite("3DWeb/ButtonImage/delete.png", "3DWeb/ButtonImage/deleteMouseDown.png", this.deleteChecked, languageContent.Delete);
  57. this.spriteRotateR = this.createSprite("3DWeb/ButtonImage/rotate-.png", "3DWeb/ButtonImage/rotate-MouseDown.png", this.rotateRChecked, languageContent.RotateR);
  58. this.spriteRotateL = this.createSprite("3DWeb/ButtonImage/rotate+.png", "3DWeb/ButtonImage/rotate+MouseDown.png", this.rotateLChecked, languageContent.RotateL);
  59. },
  60. initSpriteSize: function () {
  61. let windowWidth = window.innerWidth < OSHelper.windowWidthDefault ? OSHelper.windowWidthDefault : window.innerWidth;
  62. this.spriteAreaWidth = OSHelper.isPC ? windowWidth * 0.4 : windowWidth;
  63. this.spriteWidth = this.spriteAreaWidth / this.spriteMaxCount - this.spriteInterval;
  64. this.spriteHeight = this.spriteWidth;
  65. },
  66. selectSpriteChanged: function (selectItem) {
  67. if (SpriteManager.selectedSprite != undefined) {
  68. SpriteManager.selectedSprite.unchecked();
  69. }
  70. SpriteManager.selectedSprite = selectItem;
  71. },
  72. createSprite: function (originalImage, clickImage, execute, name) {
  73. let checkedTexture = LoaderUtility.loadTexture(originalImage);
  74. let uncheckedTexture = LoaderUtility.loadTexture(clickImage);
  75. let material = new THREE.SpriteMaterial({ map: checkedTexture });
  76. let spriteImage = new THREE.Sprite(material);
  77. spriteImage.scale.set(this.spriteWidth, this.spriteHeight, 1);
  78. let spriteText = this.createSpriteText(name);
  79. let info = new sprite(checkedTexture, uncheckedTexture, spriteImage, spriteText, execute);
  80. sceneOrtho.add(info.SpriteButtonImage);
  81. sceneOrtho.add(info.SpriteButtonText);
  82. info.hide();
  83. this.sprites.push(info);
  84. return info;
  85. },
  86. createSpriteText: function (text) {
  87. let canvas = document.createElement("canvas");
  88. canvas.width = 512;
  89. canvas.height = 512;
  90. let textCanvas = canvas.getContext("2d");
  91. textCanvas.textAlign = "center";
  92. textCanvas.fillStyle = "#FFF";
  93. textCanvas.font = "800 132px Microsoft YaHei";
  94. textCanvas.lineWidth = 1;
  95. textCanvas.fillText(text, 256, 128);
  96. let texture = new THREE.Texture(canvas);
  97. texture.needsUpdate = true;
  98. let material = new THREE.SpriteMaterial({ map: texture });
  99. let textObj = new THREE.Sprite(material);
  100. let size = this.spriteWidth + this.spriteInterval / 2;
  101. textObj.scale.set(size, size, 1);
  102. return textObj;
  103. },
  104. mdlFileLoaded: function (sourceenum, docarotidaiclip) {
  105. var hasAIClip = sourceenum == "Carotid" && docarotidaiclip=="True";
  106. if (!hasAIClip) {
  107. this.sprites.splice(2, 1);
  108. }
  109. this.resetSpritePosition();
  110. this.sprites.forEach(m => {
  111. if (m != this.spriteRotateL && m != this.spriteRotateR) {
  112. m.display();
  113. }
  114. });
  115. this.sprites[0].checked();
  116. this.allowClip = true;
  117. //hide loading image
  118. var img = document.getElementById("image");
  119. img.style.display = "none";
  120. },
  121. waitMdlFileLoading: function () {
  122. this.sprites.forEach(m => {
  123. m.hide();
  124. });
  125. //show loading image
  126. var img = document.getElementById("image");
  127. img.style.display = "block";
  128. },
  129. resetSpritePosition: function () {
  130. let spriteCount = this.sprites.length;
  131. if(!this.spriteRotateR.isVisible())
  132. {
  133. spriteCount -= 2;
  134. }
  135. for (let i = 0; i < spriteCount; i++) {
  136. let positionX = (0.5 + i - spriteCount / 2) * (this.spriteWidth + this.spriteInterval);
  137. let positionY = window.innerHeight / 2 - 50;
  138. this.sprites[i].SpriteButtonImage.position.set(positionX, positionY, 1);
  139. this.sprites[i].SpriteButtonText.position.set(positionX, positionY - this.spriteHeight - 10, 1);
  140. }
  141. },
  142. showRotateSprite: function () {
  143. if(!this.spriteRotateR.isVisible())
  144. {
  145. this.spriteRotateR.display();
  146. this.spriteRotateL.display();
  147. this.resetSpritePosition();
  148. }
  149. },
  150. hideRotateSprite: function () {
  151. if(this.spriteRotateR.isVisible()) {
  152. this.spriteRotateR.hide();
  153. this.spriteRotateL.hide();
  154. this.resetSpritePosition();
  155. }
  156. },
  157. mouseDown: function (rayCaster) {
  158. let intersectSprite = this.getIntersectSprite(rayCaster);
  159. if (intersectSprite != undefined) {
  160. intersectSprite.checked();
  161. document.addEventListener(OSHelper.touchEnd, this.mouseUp, false);
  162. return true;
  163. }
  164. return false;
  165. },
  166. mouseUp: function()
  167. {
  168. if(SpriteManager.clipType == ClipType.DrawLine)
  169. {
  170. SpriteManager.spriteClip.checked();
  171. }
  172. if(SpriteManager.clipType == ClipType.MoveClipPlane)
  173. {
  174. SpriteManager.spriteMove.checked();
  175. }
  176. document.removeEventListener(OSHelper.touchEnd, this.mouseUp, false);
  177. document.body.style.cursor = 'default';
  178. },
  179. mouseMove: function (rayCaster) {
  180. if (this.hightLightSprite != undefined && this.hightLightSprite != this.selectedSprite) {
  181. let intersects = rayCaster.intersectObject(this.hightLightSprite.SpriteButtonImage);
  182. if (intersects.length > 0) {
  183. return;
  184. } else {
  185. this.hightLightSprite.unchecked();
  186. document.body.style.cursor = 'default';
  187. this.hightLightSprite = undefined;
  188. }
  189. }
  190. let intersectSprite = this.getIntersectSprite(rayCaster);
  191. if (intersectSprite != undefined) {
  192. if (this.hightLightSprite == intersectSprite)
  193. return;
  194. this.hightLightSprite = intersectSprite;
  195. if (this.hightLightSprite != this.selectedSprite) {
  196. document.body.style.cursor = 'pointer';
  197. intersectSprite.hightLight();
  198. }
  199. }
  200. },
  201. getIntersectSprite: function (rayCaster) {
  202. let intersects;
  203. for (let i = 0; i < this.sprites.length; i++) {
  204. intersects = rayCaster.intersectObject(this.sprites[i].SpriteButtonImage);
  205. if (intersects.length > 0) {
  206. return this.sprites[i];
  207. }
  208. }
  209. return undefined;
  210. },
  211. rotateLChecked: function () {
  212. addRotateTask(-1);
  213. },
  214. rotateRChecked: function () {
  215. addRotateTask(1);
  216. },
  217. resetChecked: function () {
  218. ClipPlaneManager.resetClipInfo();
  219. resetCubePosition();
  220. ClipPlaneManager.meshIsInactive();
  221. },
  222. quickClipChecked: async function () {
  223. if (!SpriteManager.quickClipExecute) {
  224. SpriteManager.quickClipExecute = true;
  225. var success = await SpriteManager.executeQuickClip();
  226. if (!success) {
  227. //show info
  228. var info = document.getElementById("info");
  229. info.style.display = "block";
  230. SpriteManager.infoHideTask = setInterval(function () {
  231. var info = document.getElementById("info");
  232. info.style.display = "none";
  233. clearInterval(SpriteManager.infoHideTask);
  234. }, 5000);
  235. // jsObj.AIClipStateCallBack(success);
  236. SpriteManager.quickClipExecute = false;
  237. }
  238. else {
  239. ClipPlaneManager.meshIsActive();
  240. }
  241. }
  242. },
  243. executeQuickClip: async function () {
  244. let json = await Dart_GetVesselClipPlanePoints();
  245. let clipPlaneData = JSON.parse(json);
  246. if (clipPlaneData.ErrorCode != 1000) {
  247. return false;
  248. }
  249. convertBackToWorldPoints(clipPlaneData.WorldPoints);
  250. let verticesPoints = [];
  251. clipPlaneData.WorldPoints.forEach(item => verticesPoints.push(new THREE.Vector3(item.X, item.Y, item.Z)));
  252. return ClipPlaneManager.generateClipPlaneByPoints(verticesPoints,
  253. function () {
  254. SpriteManager.quickClipExecute = false;
  255. });
  256. },
  257. deleteChecked: function () {
  258. ClipPlaneManager.removeClipPlane();
  259. removeRotateInfo();
  260. LinesDrawingManager.hideClipLine();
  261. LinesDrawingManager.hideAll();
  262. ClipPlaneManager.meshIsInactive();
  263. },
  264. drawLineChecked: function () {
  265. SpriteManager.clipType = ClipType.DrawLine;
  266. },
  267. moveClipPlaneChecked: function () {
  268. SpriteManager.clipType = ClipType.MoveClipPlane;
  269. }
  270. };