rotate.service.ts 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. import { Injectable } from '@nestjs/common';
  2. import { CacheService } from 'src/cache/cache.service';
  3. @Injectable()
  4. export class RotateService {
  5. constructor(private cacheService: CacheService) {}
  6. private actionRequestPool = {};
  7. private Actions = {
  8. Clicking: 1,
  9. Rotation: 1014,
  10. Joystick: 15,
  11. };
  12. private users = {};
  13. private replys = {};
  14. init(app_id, userId) {
  15. const user = {
  16. appId: null,
  17. userId: null,
  18. breakPointId: null,
  19. player: {
  20. position: { x: -700, y: 0, z: 0 },
  21. angle: {
  22. pitch: 0,
  23. yaw: 0,
  24. roll: 0,
  25. },
  26. },
  27. camera: {
  28. position: { x: -1145, y: 0, z: 160 },
  29. angle: {
  30. pitch: 0,
  31. yaw: 0,
  32. roll: 0,
  33. },
  34. },
  35. rotateInfo: {
  36. frameIndex: 0,
  37. horizontal_move: 0,
  38. mediaSrc: null,
  39. },
  40. moveInfo: {},
  41. // traceIds: [],
  42. // actionResponses:[]
  43. };
  44. user.appId = app_id;
  45. user.userId = userId;
  46. user.breakPointId = 100;
  47. this.users[userId] = user;
  48. const reply = {
  49. traceIds: [],
  50. vehicle: null,
  51. mediaSrc: null,
  52. newUserStates: [
  53. {
  54. userId: 'dcff36ae4fc1d',
  55. playerState: {
  56. roomTypeId: '',
  57. person: 0,
  58. avatarId: '',
  59. skinId: '',
  60. roomId: '',
  61. isHost: false,
  62. isFollowHost: false,
  63. skinDataVersion: '',
  64. avatarComponents: '',
  65. nickName: '',
  66. movingMode: 0,
  67. attitude: '',
  68. areaName: '',
  69. pathName: '',
  70. pathId: '',
  71. avatarSize: 1,
  72. extra: '',
  73. prioritySync: false,
  74. player: {
  75. position: { x: -700, y: 0, z: 0 },
  76. angle: {
  77. pitch: 0,
  78. yaw: 0,
  79. roll: 0,
  80. },
  81. },
  82. camera: {
  83. position: { x: -1145, y: 0, z: 160 },
  84. angle: {
  85. pitch: 0,
  86. yaw: 0,
  87. roll: 0,
  88. },
  89. },
  90. cameraCenter: { x: -700, y: 0, z: 0 },
  91. },
  92. renderInfo: {
  93. renderType: 0,
  94. videoFrame: null,
  95. cameraStateType: 3,
  96. isMoving: 0,
  97. needIfr: 0,
  98. isVideo: 0,
  99. stillFrame: 0,
  100. isRotating: 0,
  101. isFollowing: 0,
  102. clientPanoTitlesBitmap: [],
  103. clientPanoTreceId: '',
  104. prefetchVideoId: '',
  105. noMedia: false,
  106. },
  107. event: null,
  108. relation: 1,
  109. },
  110. ],
  111. actionResponses: [
  112. // {
  113. // "actionType": 15,
  114. // "pointType": 100,
  115. // "extra": "",
  116. // "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
  117. // "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
  118. // "nps": [],
  119. // "peopleNum": 0,
  120. // "zoneId": "",
  121. // "echoMsg": "",
  122. // "reserveDetail": null,
  123. // "userWithAvatarList": [],
  124. // "newUserStates": [],
  125. // "code": 0,
  126. // "msg": ""
  127. // }
  128. ],
  129. getStateType: 0,
  130. code: 0,
  131. msg: 'OK',
  132. };
  133. reply['newUserStates'][0]['userId'] = userId;
  134. this.replys[userId] = reply;
  135. return reply;
  136. }
  137. async rotate(actionRequest) {
  138. try {
  139. const userId = actionRequest['user_id'];
  140. if (this.actionRequestPool[userId]) {
  141. this.actionRequestPool[userId].push(actionRequest);
  142. } else {
  143. this.actionRequestPool[userId] = [];
  144. this.actionRequestPool[userId].push(actionRequest);
  145. }
  146. const reply = this.replys[userId];
  147. const actionRequests = this.actionRequestPool[userId];
  148. const user = this.users[userId];
  149. // debugger;
  150. let horizontal_move = user.rotateInfo.horizontal_move;
  151. //const traceIds = user.traceIds;
  152. let sub = 0;
  153. for (let i = 0; i < actionRequests.length; ++i) {
  154. if (actionRequests[i].action_type == this.Actions.Rotation) {
  155. horizontal_move += actionRequests[i].rotation_action.horizontal_move;
  156. reply.traceIds.push(actionRequests[i].trace_id);
  157. const actionResponse = this.createActionResponse(
  158. actionRequests[i].action_type,
  159. actionRequests[i].trace_id,
  160. );
  161. reply.actionResponses.push(actionResponse);
  162. ++sub;
  163. } else {
  164. break;
  165. }
  166. }
  167. actionRequests.splice(0, sub);
  168. const hAngle = horizontal_move * 90;
  169. if (Math.abs(hAngle) < 1) {
  170. user.rotateInfo.horizontal_move = horizontal_move;
  171. //user.traceIds = traceIds;
  172. this.replys[userId] = reply;
  173. return null;
  174. }
  175. return this.rotateForAngle(userId, hAngle);
  176. /*
  177. user.rotateInfo.frameIndex += Math.floor(hAngle);
  178. if (user.rotateInfo.frameIndex < 0) {
  179. user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
  180. } else if (user.rotateInfo.frameIndex > 359) {
  181. user.rotateInfo.frameIndex -= 360;
  182. }
  183. reply['traceIds'] = traceIds;
  184. reply['newUserStates'][0]['userId'] = userId;
  185. //从redis里取
  186. //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
  187. const key =
  188. 'rotateframe:app_id:' +
  189. user.appId +
  190. ':frame_index:' +
  191. user.rotateInfo.frameIndex +
  192. ':break_point_id:' +
  193. user.breakPointId;
  194. // const value = null;
  195. const redisData = await this.cacheService.get(key);
  196. const value = JSON.parse(redisData);
  197. console.log('redis', value);
  198. user.camera['position'] = value ? value.cameraPosition : '';
  199. user.camera['angle'] = value ? value.cameraAngle : '';
  200. //this.reply['newUserStates'][0]['playerState'] .player
  201. reply['newUserStates'][0]['playerState'].camera.position =
  202. user.camera['position'];
  203. reply['newUserStates'][0]['playerState'].camera.angle =
  204. user.camera['angle'];
  205. reply['newUserStates'][0]['playerState'].cameraCenter =
  206. user.player.position;
  207. // debugger
  208. reply.mediaSrc =
  209. '/' +
  210. '0000000001' +
  211. '/' +
  212. user.breakPointId +
  213. '/' +
  214. value.directory +
  215. '/' +
  216. value.fileName +
  217. '?m=' +
  218. new Date().getTime();
  219. this.replys[userId].traceIds = [];
  220. this.replys[userId].actionResponses = [];
  221. return reply;
  222. */
  223. } catch (error) {
  224. console.log('RotateService', error);
  225. }
  226. }
  227. async rotateForAngle(userId, hAngle) {
  228. try {
  229. const user = this.users[userId];
  230. user.rotateInfo.frameIndex += Math.floor(hAngle);
  231. if (user.rotateInfo.frameIndex < 0) {
  232. user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
  233. } else if (user.rotateInfo.frameIndex > 359) {
  234. user.rotateInfo.frameIndex -= 360;
  235. }
  236. const reply = JSON.parse(JSON.stringify(this.replys[userId]));
  237. reply['newUserStates'][0]['userId'] = userId;
  238. //从redis里取
  239. //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
  240. const key =
  241. 'rotateframe:app_id:' +
  242. user.appId +
  243. ':frame_index:' +
  244. user.rotateInfo.frameIndex +
  245. ':break_point_id:' +
  246. user.breakPointId;
  247. // const value = null;
  248. const redisData = await this.cacheService.get(key);
  249. const value = JSON.parse(redisData);
  250. console.log('redis', value);
  251. user.camera['position'] = value ? value.cameraPosition : '';
  252. user.camera['angle'] = value ? value.cameraAngle : '';
  253. //this.reply['newUserStates'][0]['playerState'] .player
  254. reply['newUserStates'][0]['playerState'].camera.position =
  255. user.camera['position'];
  256. reply['newUserStates'][0]['playerState'].camera.angle =
  257. user.camera['angle'];
  258. reply['newUserStates'][0]['playerState'].cameraCenter =
  259. user.player.position;
  260. // debugger
  261. reply.mediaSrc =
  262. '/' +
  263. '0000000001' +
  264. '/' +
  265. user.breakPointId +
  266. '/' +
  267. value.directory +
  268. '/' +
  269. value.fileName +
  270. '?m=' +
  271. new Date().getTime();
  272. this.replys[userId].traceIds = [];
  273. this.replys[userId].actionResponses = [];
  274. user.rotateInfo.horizontal_move = 0;
  275. return reply;
  276. } catch (error) {
  277. console.log('RotateService', error);
  278. }
  279. }
  280. createActionResponse(actionType, traceId) {
  281. const actionResponse = {
  282. actionType: actionType,
  283. pointType: 100,
  284. extra: '',
  285. traceId: traceId,
  286. packetId: '',
  287. nps: [],
  288. peopleNum: 0,
  289. zoneId: '',
  290. echoMsg: '',
  291. reserveDetail: null,
  292. userWithAvatarList: [],
  293. newUserStates: [],
  294. code: 0,
  295. msg: '',
  296. };
  297. return actionResponse;
  298. }
  299. }