UpdateFrameMetaTask.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. package com.fdkk.fdkkmeta.task;
  2. import cn.hutool.core.util.ArrayUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
  6. import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity;
  7. import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
  8. import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
  9. import com.fdkk.fdkkmeta.domain.po.*;
  10. import com.fdkk.fdkkmeta.grpc.*;
  11. import com.fdkk.fdkkmeta.grpcService.SceneGrpcService;
  12. import com.fdkk.fdkkmeta.redis.RedisCache;
  13. import com.fdkk.fdkkmeta.service.BreakpointsService;
  14. import com.fdkk.fdkkmeta.service.MoveFrameService;
  15. import com.fdkk.fdkkmeta.service.UserService;
  16. import com.fdkk.fdkkmeta.service.RotateFrameService;
  17. import com.fdkk.fdkkmeta.util.kesar.GetRoute;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.scheduling.annotation.Scheduled;
  21. import org.springframework.stereotype.Component;
  22. import java.io.File;
  23. import java.util.ArrayList;
  24. import java.util.Arrays;
  25. import java.util.List;
  26. /**
  27. * @author Xiewj
  28. * @date 2022/3/30
  29. */
  30. @Component
  31. @Slf4j
  32. public class UpdateFrameMetaTask {
  33. @Autowired
  34. RedisCache redisCache;
  35. @Autowired
  36. UserService userService;
  37. @Autowired
  38. RotateFrameService rotateFrameService;
  39. @Autowired
  40. MoveFrameService moveFrameService;
  41. @Autowired
  42. SceneGrpcService sceneGrpcService;
  43. @Autowired
  44. BreakpointsService breakpointsService;
  45. @Scheduled(initialDelay=1000, fixedDelay=1000/30)
  46. public void updateFrameMetadata(){
  47. List<UserEntity> userOnline = userService.findUserOnline(true);
  48. log.info("进入定时任务{}", ArrayUtil.isNotEmpty(userOnline)?userOnline.size():0);
  49. // JSONObject a=new JSONObject();
  50. // a.put("123123",123123);
  51. //使用并行流处理数据
  52. userOnline.parallelStream().forEach(
  53. userEntity -> {
  54. //UserEntity user = redisCache.getCacheObject("setCacheRequest:" + userEntity.getUserId());
  55. // redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
  56. List<ActionPO> list = redisCache.getCacheList("setCacheRequest"+userEntity.getUserId());
  57. handle( userEntity,list);
  58. }
  59. );
  60. }
  61. private void handle(UserEntity user,List<ActionPO> list){
  62. try {
  63. if(list.size() == 0){
  64. //写入一个默认数据到redis里
  65. createDefaultFrameMetadata( user);
  66. return;
  67. }
  68. List<ActionPO> rotateJoystickList = new ArrayList<ActionPO>();
  69. JSONObject myState = redisCache.getCacheObject("UserState"+user.getUserId());
  70. ActionPO _actionPO = list.get(0);
  71. int firstActionType = _actionPO.getAction_type();
  72. JSONArray path = _actionPO.getPath();
  73. if(firstActionType == 1014||firstActionType == 15){
  74. rotateJoystickList.add(_actionPO);
  75. }
  76. else if(firstActionType == 1){
  77. long startBreakPointId = path.getLongValue(0);
  78. long endBreakPointId = path.getLongValue(1);
  79. BreakpointsEntity startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  80. BreakpointsEntity endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  81. //过渡
  82. if(myState.getIntValue("isMoving") == 1){
  83. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  84. //准备过渡下一段
  85. if(moveFrameEntity==null){
  86. RotateFrameEntity rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),endBreakPointId,_actionPO.getCameraAngle().getYaw());
  87. path.remove(0);
  88. if(path.size()>1){
  89. startBreakPointId = endBreakPointId;
  90. endBreakPointId = path.getLongValue(1);
  91. _actionPO.setPath(path);
  92. _actionPO.setFrameIndex(0);
  93. _actionPO.setStartPostion(null);
  94. _actionPO.setEndPosition(null);
  95. int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),startBreakPointId,endBreakPointId, _actionPO.getCameraAngle().getYaw()%45);
  96. _actionPO.setSubFrameIndex(subFrameIndex);
  97. _actionPO.setPlayerPosition(endBreakpointsEntity.getPosition());
  98. startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  99. endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  100. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  101. AnglePO playerAngle = user.getPlayerAngle();
  102. playerAngle.setYaw(_angle);
  103. _actionPO.setPlayerAngle(playerAngle);
  104. //更新redis记录
  105. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  106. myState.put("isMoving",0);
  107. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  108. //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),0);
  109. user.setFrameId(rotateFrameEntity.getId());
  110. user.setPlayerAngle(playerAngle);
  111. user.setBreakPointId(startBreakPointId);
  112. user.setPlayerPosition(startBreakpointsEntity.getPosition());
  113. userService.updateById(user);
  114. }
  115. //过渡全部结束
  116. else{
  117. //删除redis里的数据
  118. redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
  119. //更新user表
  120. //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex());
  121. user.setPlayerPosition(endBreakpointsEntity.getPosition());
  122. user.setFrameId(rotateFrameEntity.getId());
  123. user.setPlayerAngle(_actionPO.getPlayerAngle());
  124. user.setBreakPointId(endBreakPointId);
  125. userService.updateById(user);
  126. myState.put("isMoving",0);
  127. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  128. //执行下一条记录
  129. list.remove(0);
  130. }
  131. handle( user,list);
  132. return ;
  133. }
  134. //更新
  135. if(_actionPO.getStartPostion() == null){
  136. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  137. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  138. }
  139. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  140. PointPO playerPosition = new PointPO();
  141. playerPosition.setX((_actionPO.getEndPosition().getX() - _actionPO.getStartPostion().getX())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  142. playerPosition.setY((_actionPO.getEndPosition().getY() - _actionPO.getStartPostion().getY())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  143. playerPosition.setZ((_actionPO.getEndPosition().getZ() - _actionPO.getStartPostion().getZ())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  144. createMoveFrameMetadata(user.getUserId(),_actionPO.getPlayerAngle(), playerPosition, moveFrameEntity,_actionPO.getTrace_id());
  145. //更新redis里的数据
  146. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  147. }
  148. else if(myState.getIntValue("isMoving") == 0){
  149. if(list.size()>0){
  150. //中断,执行下一条记录
  151. list.remove(0);
  152. redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
  153. handle( user,list);
  154. return ;
  155. }
  156. else{
  157. //过渡
  158. myState.put("isMoving",1);
  159. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  160. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  161. //更新
  162. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  163. AnglePO playerAngle = user.getPlayerAngle();
  164. playerAngle.setYaw(_angle);
  165. createMoveFrameMetadata( user.getUserId(),playerAngle,startBreakpointsEntity.getPosition(), moveFrameEntity,_actionPO.getTrace_id());
  166. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  167. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  168. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  169. //更新redis里的数据
  170. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  171. }
  172. }
  173. /****************************************************************************************/
  174. return;
  175. }
  176. long lastFrameId = _actionPO.getFrameId();
  177. for(int i=1;i<list.size();++i){
  178. ActionPO actionPO = list.get(i);
  179. // if(firstActionType != actionPO.getAction_type()){
  180. // break;
  181. // }
  182. //旋转
  183. if(actionPO.getAction_type() == 1014||actionPO.getAction_type() == 15){
  184. rotateJoystickList.add(actionPO);
  185. lastFrameId = actionPO.getFrameId();
  186. continue;
  187. }
  188. else{
  189. break;
  190. }
  191. }
  192. createRotateFrameMetadata( user, rotateJoystickList, firstActionType);
  193. //删除redis里的数据
  194. redisCache.lTrim("setCacheRequest"+user.getUserId(),rotateJoystickList.size(),-1);
  195. //更新user表
  196. user.setFrameId(lastFrameId);
  197. userService.updateById(user);
  198. }catch (Exception e){
  199. e.printStackTrace();
  200. log.info("handleException{}",e.getMessage());
  201. }
  202. }
  203. private void createDefaultFrameMetadata(UserEntity user){
  204. String[] traceIds = new String[1];
  205. traceIds[0] = "";
  206. JSONArray actionResponses = new JSONArray();
  207. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  208. PointPO playerPosition = user.getPlayerPosition();
  209. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  210. AnglePO playerAngle = user.getPlayerAngle();
  211. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  212. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  213. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  214. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  215. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  216. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  217. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  218. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  219. metaDataFramePO.setTraceIds(traceIds);
  220. metaDataFramePO.setVehicle(null);
  221. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  222. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  223. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  224. //newUserStates
  225. UserState[] newUserStates = new UserState[1];
  226. newUserStates[0] = userState;
  227. metaDataFramePO.setNewUserStates(newUserStates);
  228. metaDataFramePO.setActionResponses(actionResponses);
  229. metaDataFramePO.setGetStateType(0);
  230. metaDataFramePO.setCode(0);
  231. metaDataFramePO.setMsg("");
  232. redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
  233. }
  234. private void createMoveFrameMetadata(String user_id,AnglePO playerAngle,PointPO playerPosition,MoveFrameEntity moveFrameEntity,String traceId){
  235. String[] traceIds = new String[1];
  236. traceIds[0] = traceId;
  237. JSONArray actionResponses = new JSONArray();
  238. //RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  239. //PointPO playerPosition = user.getPlayerPosition();
  240. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  241. //AnglePO playerAngle = user.getPlayerAngle();
  242. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  243. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  244. PointPO cameraPoint = moveFrameEntity.getCameraPosition();
  245. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  246. AnglePO cameraAnglePO = moveFrameEntity.getCameraAngle();
  247. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  248. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  249. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  250. metaDataFramePO.setTraceIds(traceIds);
  251. metaDataFramePO.setVehicle(null);
  252. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  253. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  254. UserState userState = sceneGrpcService.createUserState( user_id, playerState, renderInfo, null);
  255. //newUserStates
  256. // JSONArray newUserStates = new JSONArray();
  257. // newUserStates.add(userState);
  258. UserState[] newUserStates = new UserState[1];
  259. newUserStates[0] = userState;
  260. metaDataFramePO.setNewUserStates(newUserStates);
  261. metaDataFramePO.setActionResponses(actionResponses);
  262. metaDataFramePO.setGetStateType(0);
  263. metaDataFramePO.setCode(0);
  264. metaDataFramePO.setMsg("");
  265. redisCache.setCacheObject("updateFrameMetadata:"+user_id,metaDataFramePO);
  266. }
  267. private void createRotateFrameMetadata(UserEntity user,List<ActionPO> rotateJoystickList,int firstActionType){
  268. JSONArray actionResponses = new JSONArray();
  269. String[] traceIds = new String[rotateJoystickList.size()];
  270. if(rotateJoystickList.size()>0){
  271. for(int j=0;j<rotateJoystickList.size();++j){
  272. ActionPO actionPO = rotateJoystickList.get(j);
  273. JSONObject actionResponse = sceneGrpcService.createActionResponse(actionPO.getAction_type(),actionPO.getTrace_id());
  274. actionResponses.add(actionResponse);
  275. traceIds[j] = actionPO.getTrace_id();
  276. }
  277. }
  278. ActionPO lastActionPO = rotateJoystickList.get(rotateJoystickList.size()-1);
  279. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(lastActionPO.getFrameId());
  280. PointPO playerPosition = user.getPlayerPosition();
  281. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  282. AnglePO playerAngle = user.getPlayerAngle();
  283. AngleUe4 playerAg = null;
  284. if(firstActionType == 15){
  285. playerAngle.setYaw(lastActionPO.getPlayerAngle().getYaw());
  286. }
  287. playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  288. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  289. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  290. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  291. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  292. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  293. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  294. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  295. metaDataFramePO.setTraceIds(traceIds);
  296. metaDataFramePO.setVehicle(null);
  297. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  298. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  299. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  300. //newUserStates
  301. // JSONArray newUserStates = new JSONArray();
  302. //// newUserStates.add(userState);
  303. UserState[] newUserStates = new UserState[1];
  304. newUserStates[0] = userState;
  305. metaDataFramePO.setNewUserStates(newUserStates);
  306. metaDataFramePO.setActionResponses(actionResponses);
  307. metaDataFramePO.setGetStateType(0);
  308. metaDataFramePO.setCode(0);
  309. metaDataFramePO.setMsg("");
  310. redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
  311. //更新user表
  312. user.setFrameId(lastActionPO.getFrameId());
  313. user.setPlayerAngle(playerAngle);
  314. }
  315. /*
  316. * {
  317. "traceIds": ["d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "939087ff-4999-4551-92e4-26ecb67f8aa2"],
  318. "vehicle": null,
  319. "newUserStates": [{
  320. "userId": "dcff36ae4fc1d",
  321. "playerState": {
  322. "roomTypeId": "",
  323. "person": 0,
  324. "avatarId": "",
  325. "skinId": "",
  326. "roomId": ""
  327. "isHost": false,
  328. "isFollowHost": false,
  329. "skinDataVersion": "",
  330. "avatarComponents": "",
  331. "nickName": "",
  332. "movingMode": 0,
  333. "attitude": "",
  334. "areaName": "",
  335. "pathName": "",
  336. "pathId": "",
  337. "avatarSize": 1,
  338. "extra": "",
  339. "prioritySync": false,
  340. "player": {
  341. "position": {
  342. "x": -421.30057,
  343. "y": -1434.4198,
  344. "z": -34
  345. },
  346. "angle": {
  347. "pitch": 0,
  348. "yaw": 47,
  349. "roll": 0
  350. }
  351. },
  352. "camera": {
  353. "position": {
  354. "x": -436.2,
  355. "y": -1408.8,
  356. "z": 130.7
  357. },
  358. "angle": {
  359. "pitch": 0,
  360. "yaw": 315,
  361. "roll": 0
  362. }
  363. },
  364. "cameraCenter": {
  365. "x": -400,
  366. "y": -1450,
  367. "z": 10.610336
  368. }
  369. },
  370. "renderInfo": {
  371. "renderType": 0,
  372. "videoFrame": null,
  373. "cameraStateType": 3,
  374. "isMoving": 1,
  375. "needIfr": 0,
  376. "isVideo": 0,
  377. "stillFrame": 0,
  378. "isRotating": 0,
  379. "isFollowing": 0,
  380. "clientPanoTitlesBitmap": [],
  381. "clientPanoTreceId": "",
  382. "prefetchVideoId": "",
  383. "noMedia": false
  384. },
  385. "event": null,
  386. "relation": 1
  387. }],
  388. "actionResponses": [{
  389. "actionType": 15,
  390. "pointType": 100,
  391. "extra": "",
  392. "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
  393. "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
  394. "nps": [],
  395. "peopleNum": 0,
  396. "zoneId": "",
  397. "echoMsg": "",
  398. "reserveDetail": null,
  399. "userWithAvatarList": [],
  400. "newUserStates": [],
  401. "code": 0,
  402. "msg": ""
  403. }, {
  404. "actionType": 1,
  405. "pointType": 0,
  406. "extra": "",
  407. "traceId": "939087ff-4999-4551-92e4-26ecb67f8aa2",
  408. "packetId": "",
  409. "nps": [],
  410. "peopleNum": 0,
  411. "zoneId": "",
  412. "echoMsg": "",
  413. "reserveDetail": null,
  414. "userWithAvatarList": [],
  415. "newUserStates": [],
  416. "code": 0,
  417. "msg": ""
  418. }],
  419. "getStateType": 0,
  420. "code": 0,
  421. "msg": "OK"
  422. }
  423. * */
  424. }