|
@@ -0,0 +1,317 @@
|
|
|
+import { Injectable } from '@nestjs/common';
|
|
|
+import { CacheService } from 'src/cache/cache.service';
|
|
|
+
|
|
|
+@Injectable()
|
|
|
+export class RotateService {
|
|
|
+ constructor(private cacheService: CacheService) {}
|
|
|
+ private actionRequestPool = {};
|
|
|
+ private Actions = {
|
|
|
+ Clicking: 1,
|
|
|
+ Rotation: 1014,
|
|
|
+ Joystick: 15,
|
|
|
+ };
|
|
|
+ private users = {};
|
|
|
+ private replys = {};
|
|
|
+
|
|
|
+ init(app_id, userId) {
|
|
|
+ const user = {
|
|
|
+ appId: null,
|
|
|
+ userId: null,
|
|
|
+ breakPointId: null,
|
|
|
+ player: {
|
|
|
+ position: { x: -700, y: 0, z: 0 },
|
|
|
+ angle: {
|
|
|
+ pitch: 0,
|
|
|
+ yaw: 0,
|
|
|
+ roll: 0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ camera: {
|
|
|
+ position: { x: -1145, y: 0, z: 160 },
|
|
|
+ angle: {
|
|
|
+ pitch: 0,
|
|
|
+ yaw: 0,
|
|
|
+ roll: 0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ rotateInfo: {
|
|
|
+ frameIndex: 0,
|
|
|
+ horizontal_move: 0,
|
|
|
+ mediaSrc: null,
|
|
|
+ },
|
|
|
+ moveInfo: {},
|
|
|
+ // traceIds: [],
|
|
|
+ // actionResponses:[]
|
|
|
+ };
|
|
|
+
|
|
|
+ user.appId = app_id;
|
|
|
+ user.userId = userId;
|
|
|
+ user.breakPointId = 100;
|
|
|
+ this.users[userId] = user;
|
|
|
+
|
|
|
+ const reply = {
|
|
|
+ traceIds: [],
|
|
|
+ vehicle: null,
|
|
|
+ mediaSrc: null,
|
|
|
+ newUserStates: [
|
|
|
+ {
|
|
|
+ userId: 'dcff36ae4fc1d',
|
|
|
+ playerState: {
|
|
|
+ roomTypeId: '',
|
|
|
+ person: 0,
|
|
|
+ avatarId: '',
|
|
|
+ skinId: '',
|
|
|
+ roomId: '',
|
|
|
+ isHost: false,
|
|
|
+ isFollowHost: false,
|
|
|
+ skinDataVersion: '',
|
|
|
+ avatarComponents: '',
|
|
|
+ nickName: '',
|
|
|
+ movingMode: 0,
|
|
|
+ attitude: '',
|
|
|
+ areaName: '',
|
|
|
+ pathName: '',
|
|
|
+ pathId: '',
|
|
|
+ avatarSize: 1,
|
|
|
+ extra: '',
|
|
|
+ prioritySync: false,
|
|
|
+ player: {
|
|
|
+ position: { x: -700, y: 0, z: 0 },
|
|
|
+ angle: {
|
|
|
+ pitch: 0,
|
|
|
+ yaw: 0,
|
|
|
+ roll: 0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ camera: {
|
|
|
+ position: { x: -1145, y: 0, z: 160 },
|
|
|
+ angle: {
|
|
|
+ pitch: 0,
|
|
|
+ yaw: 0,
|
|
|
+ roll: 0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ cameraCenter: { x: -700, y: 0, z: 0 },
|
|
|
+ },
|
|
|
+ renderInfo: {
|
|
|
+ renderType: 0,
|
|
|
+ videoFrame: null,
|
|
|
+ cameraStateType: 3,
|
|
|
+ isMoving: 0,
|
|
|
+ needIfr: 0,
|
|
|
+ isVideo: 0,
|
|
|
+ stillFrame: 0,
|
|
|
+ isRotating: 0,
|
|
|
+ isFollowing: 0,
|
|
|
+ clientPanoTitlesBitmap: [],
|
|
|
+ clientPanoTreceId: '',
|
|
|
+ prefetchVideoId: '',
|
|
|
+ noMedia: false,
|
|
|
+ },
|
|
|
+ event: null,
|
|
|
+ relation: 1,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ actionResponses: [
|
|
|
+ // {
|
|
|
+ // "actionType": 15,
|
|
|
+ // "pointType": 100,
|
|
|
+ // "extra": "",
|
|
|
+ // "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
|
|
|
+ // "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
|
|
|
+ // "nps": [],
|
|
|
+ // "peopleNum": 0,
|
|
|
+ // "zoneId": "",
|
|
|
+ // "echoMsg": "",
|
|
|
+ // "reserveDetail": null,
|
|
|
+ // "userWithAvatarList": [],
|
|
|
+ // "newUserStates": [],
|
|
|
+ // "code": 0,
|
|
|
+ // "msg": ""
|
|
|
+ // }
|
|
|
+ ],
|
|
|
+ getStateType: 0,
|
|
|
+ code: 0,
|
|
|
+ msg: 'OK',
|
|
|
+ };
|
|
|
+
|
|
|
+ reply['newUserStates'][0]['userId'] = userId;
|
|
|
+ this.replys[userId] = reply;
|
|
|
+ return reply;
|
|
|
+ }
|
|
|
+
|
|
|
+ async rotate(actionRequest) {
|
|
|
+ try {
|
|
|
+ const userId = actionRequest['user_id'];
|
|
|
+ if (this.actionRequestPool[userId]) {
|
|
|
+ this.actionRequestPool[userId].push(actionRequest);
|
|
|
+ } else {
|
|
|
+ this.actionRequestPool[userId] = [];
|
|
|
+ this.actionRequestPool[userId].push(actionRequest);
|
|
|
+ }
|
|
|
+
|
|
|
+ let reply = this.replys[userId];
|
|
|
+
|
|
|
+ const actionRequests = this.actionRequestPool[userId];
|
|
|
+ const user = this.users[userId];
|
|
|
+ // debugger;
|
|
|
+ let horizontal_move = user.rotateInfo.horizontal_move;
|
|
|
+ //const traceIds = user.traceIds;
|
|
|
+ let sub = 0;
|
|
|
+ for (let i = 0; i < actionRequests.length; ++i) {
|
|
|
+ if (actionRequests[i].action_type == this.Actions.Rotation) {
|
|
|
+ horizontal_move += actionRequests[i].rotation_action.horizontal_move;
|
|
|
+ reply.traceIds.push(actionRequests[i].trace_id);
|
|
|
+ let actionResponse = this.createActionResponse(actionRequests[i].action_type,actionRequests[i].trace_id);
|
|
|
+ reply.actionResponses.push(actionResponse);
|
|
|
+ ++sub;
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ actionRequests.splice(0, sub);
|
|
|
+ const hAngle = horizontal_move * 90;
|
|
|
+ if (Math.abs(hAngle) < 1) {
|
|
|
+ user.rotateInfo.horizontal_move = horizontal_move;
|
|
|
+ //user.traceIds = traceIds;
|
|
|
+ this.replys[userId] = reply;
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return this.rotateForAngle(userId,hAngle);
|
|
|
+ /*
|
|
|
+ user.rotateInfo.frameIndex += Math.floor(hAngle);
|
|
|
+ if (user.rotateInfo.frameIndex < 0) {
|
|
|
+ user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
|
|
|
+ } else if (user.rotateInfo.frameIndex > 359) {
|
|
|
+ user.rotateInfo.frameIndex -= 360;
|
|
|
+ }
|
|
|
+ reply['traceIds'] = traceIds;
|
|
|
+ reply['newUserStates'][0]['userId'] = userId;
|
|
|
+ //从redis里取
|
|
|
+ //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
|
|
|
+ const key =
|
|
|
+ 'rotateframe:app_id:' +
|
|
|
+ user.appId +
|
|
|
+ ':frame_index:' +
|
|
|
+ user.rotateInfo.frameIndex +
|
|
|
+ ':break_point_id:' +
|
|
|
+ user.breakPointId;
|
|
|
+ // const value = null;
|
|
|
+
|
|
|
+ const redisData = await this.cacheService.get(key);
|
|
|
+ const value = JSON.parse(redisData);
|
|
|
+ console.log('redis', value);
|
|
|
+ user.camera['position'] = value ? value.cameraPosition : '';
|
|
|
+ user.camera['angle'] = value ? value.cameraAngle : '';
|
|
|
+
|
|
|
+ //this.reply['newUserStates'][0]['playerState'] .player
|
|
|
+ reply['newUserStates'][0]['playerState'].camera.position =
|
|
|
+ user.camera['position'];
|
|
|
+ reply['newUserStates'][0]['playerState'].camera.angle =
|
|
|
+ user.camera['angle'];
|
|
|
+ reply['newUserStates'][0]['playerState'].cameraCenter =
|
|
|
+ user.player.position;
|
|
|
+ // debugger
|
|
|
+ reply.mediaSrc =
|
|
|
+ '/' +
|
|
|
+ '0000000001' +
|
|
|
+ '/' +
|
|
|
+ user.breakPointId +
|
|
|
+ '/' +
|
|
|
+ value.directory +
|
|
|
+ '/' +
|
|
|
+ value.fileName +
|
|
|
+ '?m=' +
|
|
|
+ new Date().getTime();
|
|
|
+
|
|
|
+ this.replys[userId].traceIds = [];
|
|
|
+ this.replys[userId].actionResponses = [];
|
|
|
+
|
|
|
+ return reply;
|
|
|
+ */
|
|
|
+ } catch (error) {
|
|
|
+ console.log('RotateService', error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ async rotateForAngle(userId,hAngle){
|
|
|
+ try{
|
|
|
+ const user = this.users[userId];
|
|
|
+ user.rotateInfo.frameIndex += Math.floor(hAngle);
|
|
|
+ if (user.rotateInfo.frameIndex < 0) {
|
|
|
+ user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
|
|
|
+ } else if (user.rotateInfo.frameIndex > 359) {
|
|
|
+ user.rotateInfo.frameIndex -= 360;
|
|
|
+ }
|
|
|
+
|
|
|
+ let reply = JSON.parse(JSON.stringify(this.replys[userId]));
|
|
|
+ reply['newUserStates'][0]['userId'] = userId;
|
|
|
+ //从redis里取
|
|
|
+ //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
|
|
|
+ const key =
|
|
|
+ 'rotateframe:app_id:' +
|
|
|
+ user.appId +
|
|
|
+ ':frame_index:' +
|
|
|
+ user.rotateInfo.frameIndex +
|
|
|
+ ':break_point_id:' +
|
|
|
+ user.breakPointId;
|
|
|
+ // const value = null;
|
|
|
+
|
|
|
+ const redisData = await this.cacheService.get(key);
|
|
|
+ const value = JSON.parse(redisData);
|
|
|
+ console.log('redis', value);
|
|
|
+ user.camera['position'] = value ? value.cameraPosition : '';
|
|
|
+ user.camera['angle'] = value ? value.cameraAngle : '';
|
|
|
+
|
|
|
+ //this.reply['newUserStates'][0]['playerState'] .player
|
|
|
+ reply['newUserStates'][0]['playerState'].camera.position =
|
|
|
+ user.camera['position'];
|
|
|
+ reply['newUserStates'][0]['playerState'].camera.angle =
|
|
|
+ user.camera['angle'];
|
|
|
+ reply['newUserStates'][0]['playerState'].cameraCenter =
|
|
|
+ user.player.position;
|
|
|
+ // debugger
|
|
|
+ reply.mediaSrc =
|
|
|
+ '/' +
|
|
|
+ '0000000001' +
|
|
|
+ '/' +
|
|
|
+ user.breakPointId +
|
|
|
+ '/' +
|
|
|
+ value.directory +
|
|
|
+ '/' +
|
|
|
+ value.fileName +
|
|
|
+ '?m=' +
|
|
|
+ new Date().getTime();
|
|
|
+
|
|
|
+ this.replys[userId].traceIds = [];
|
|
|
+ this.replys[userId].actionResponses = [];
|
|
|
+
|
|
|
+ user.rotateInfo.horizontal_move = 0;
|
|
|
+
|
|
|
+ return reply;
|
|
|
+ } catch (error) {
|
|
|
+ console.log('RotateService', error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ createActionResponse(actionType,traceId){
|
|
|
+ let actionResponse = {
|
|
|
+ "actionType": actionType,
|
|
|
+ "pointType": 100,
|
|
|
+ "extra": "",
|
|
|
+ "traceId": traceId,
|
|
|
+ "packetId": "",
|
|
|
+ "nps": [],
|
|
|
+ "peopleNum": 0,
|
|
|
+ "zoneId": "",
|
|
|
+ "echoMsg": "",
|
|
|
+ "reserveDetail": null,
|
|
|
+ "userWithAvatarList": [],
|
|
|
+ "newUserStates": [],
|
|
|
+ "code": 0,
|
|
|
+ "msg": ""
|
|
|
+ }
|
|
|
+ return actionResponse;
|
|
|
+ }
|
|
|
+}
|