UpdateFrameMetaTask.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  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=2000)
  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. if(list.size() == 0){
  63. //写入一个默认数据到redis里
  64. createDefaultFrameMetadata( user);
  65. return;
  66. }
  67. List<ActionPO> rotateJoystickList = new ArrayList<ActionPO>();
  68. JSONObject myState = redisCache.getCacheObject("UserState"+user.getUserId());
  69. ActionPO _actionPO = list.get(0);
  70. int firstActionType = _actionPO.getAction_type();
  71. JSONArray path = _actionPO.getPath();
  72. if(firstActionType == 1014||firstActionType == 15){
  73. rotateJoystickList.add(_actionPO);
  74. }
  75. else if(firstActionType == 1){
  76. long startBreakPointId = path.getLongValue(0);
  77. long endBreakPointId = path.getLongValue(1);
  78. BreakpointsEntity startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  79. BreakpointsEntity endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  80. //过渡
  81. if(myState.getIntValue("isMoving") == 1){
  82. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  83. if(moveFrameEntity==null){
  84. path.remove(0);
  85. //过渡下一段
  86. if(path.size()>1){
  87. startBreakPointId = endBreakPointId;
  88. endBreakPointId = path.getLongValue(1);
  89. _actionPO.setPath(path);
  90. _actionPO.setFrameIndex(0);
  91. _actionPO.setStartPostion(null);
  92. _actionPO.setEndPosition(null);
  93. moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),1);
  94. user.setFrameId(moveFrameEntity.getId());
  95. startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  96. endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  97. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  98. AnglePO playerAngle = user.getPlayerAngle();
  99. playerAngle.setYaw(_angle);
  100. user.setPlayerAngle(playerAngle);
  101. user.setBreakPointId(startBreakPointId);
  102. user.setPlayerPosition(startBreakpointsEntity.getPosition());
  103. userService.updateById(user);
  104. }
  105. //过渡全部结束
  106. else{
  107. //删除redis里的数据
  108. redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
  109. //更新user表
  110. moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex());
  111. user.setPlayerPosition(endBreakpointsEntity.getPosition());
  112. user.setFrameId(moveFrameEntity.getId());
  113. user.setPlayerAngle(_actionPO.getPlayerAngle());
  114. user.setBreakPointId(endBreakPointId);
  115. userService.updateById(user);
  116. myState.put("isMoving",0);
  117. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  118. //执行下一条记录
  119. list.remove(0);
  120. handle( user,list);
  121. return ;
  122. }
  123. }
  124. //更新
  125. if(_actionPO.getStartPostion() == null){
  126. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  127. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  128. }
  129. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  130. PointPO playerPosition = new PointPO();
  131. playerPosition.setX((_actionPO.getEndPosition().getX() - _actionPO.getStartPostion().getX())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  132. playerPosition.setY((_actionPO.getEndPosition().getY() - _actionPO.getStartPostion().getY())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  133. playerPosition.setZ((_actionPO.getEndPosition().getZ() - _actionPO.getStartPostion().getZ())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  134. createMoveFrameMetadata(user.getUserId(),_actionPO.getPlayerAngle(), playerPosition, moveFrameEntity,_actionPO.getTrace_id());
  135. //更新redis里的数据
  136. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  137. }
  138. else if(myState.getIntValue("isMoving") == 0){
  139. if(list.size()>0){
  140. //中断
  141. //执行下一条记录
  142. list.remove(0);
  143. redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
  144. handle( user,list);
  145. return ;
  146. }
  147. else{
  148. //过渡
  149. myState.put("isMoving",1);
  150. redisCache.setCacheObject("UserState"+user.getUserId(),myState);
  151. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  152. //更新
  153. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  154. AnglePO playerAngle = user.getPlayerAngle();
  155. playerAngle.setYaw(_angle);
  156. createMoveFrameMetadata( user.getUserId(),playerAngle,startBreakpointsEntity.getPosition(), moveFrameEntity,_actionPO.getTrace_id());
  157. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  158. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  159. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  160. //更新redis里的数据
  161. redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
  162. }
  163. }
  164. /****************************************************************************************/
  165. return;
  166. }
  167. for(int i=1;i<list.size();++i){
  168. ActionPO actionPO = list.get(i);
  169. if(firstActionType != actionPO.getAction_type()){
  170. break;
  171. }
  172. //旋转
  173. if(actionPO.getAction_type() == 1014||actionPO.getAction_type() == 15){
  174. rotateJoystickList.add(actionPO);
  175. continue;
  176. }
  177. }
  178. createRotateFrameMetadata( user, rotateJoystickList, firstActionType);
  179. //删除redis里的数据
  180. redisCache.lTrim("setCacheRequest"+user.getUserId(),rotateJoystickList.size(),-1);
  181. }
  182. private void createDefaultFrameMetadata(UserEntity user){
  183. String[] traceIds = new String[1];
  184. traceIds[0] = "";
  185. JSONArray actionResponses = new JSONArray();
  186. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  187. PointPO playerPosition = user.getPlayerPosition();
  188. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  189. AnglePO playerAngle = user.getPlayerAngle();
  190. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  191. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  192. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  193. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  194. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  195. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  196. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  197. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  198. metaDataFramePO.setTraceIds(traceIds);
  199. metaDataFramePO.setVehicle(null);
  200. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  201. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  202. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  203. //newUserStates
  204. JSONArray newUserStates = new JSONArray();
  205. newUserStates.add(userState);
  206. metaDataFramePO.setNewUserStates(newUserStates);
  207. metaDataFramePO.setActionResponses(actionResponses);
  208. metaDataFramePO.setGetStateType(0);
  209. metaDataFramePO.setCode(0);
  210. metaDataFramePO.setMsg("");
  211. redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
  212. }
  213. private void createMoveFrameMetadata(String user_id,AnglePO playerAngle,PointPO playerPosition,MoveFrameEntity moveFrameEntity,String traceId){
  214. String[] traceIds = new String[1];
  215. traceIds[0] = traceId;
  216. JSONArray actionResponses = new JSONArray();
  217. //RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  218. //PointPO playerPosition = user.getPlayerPosition();
  219. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  220. //AnglePO playerAngle = user.getPlayerAngle();
  221. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  222. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  223. PointPO cameraPoint = moveFrameEntity.getCameraPosition();
  224. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  225. AnglePO cameraAnglePO = moveFrameEntity.getCameraAngle();
  226. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  227. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  228. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  229. metaDataFramePO.setTraceIds(traceIds);
  230. metaDataFramePO.setVehicle(null);
  231. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  232. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  233. UserState userState = sceneGrpcService.createUserState( user_id, playerState, renderInfo, null);
  234. //newUserStates
  235. JSONArray newUserStates = new JSONArray();
  236. newUserStates.add(userState);
  237. metaDataFramePO.setNewUserStates(newUserStates);
  238. metaDataFramePO.setActionResponses(actionResponses);
  239. metaDataFramePO.setGetStateType(0);
  240. metaDataFramePO.setCode(0);
  241. metaDataFramePO.setMsg("");
  242. redisCache.setCacheObject("updateFrameMetadata:"+user_id,metaDataFramePO);
  243. }
  244. private void createRotateFrameMetadata(UserEntity user,List<ActionPO> rotateJoystickList,int firstActionType){
  245. JSONArray actionResponses = new JSONArray();
  246. String[] traceIds = new String[rotateJoystickList.size()];
  247. if(rotateJoystickList.size()>0){
  248. for(int j=0;j<rotateJoystickList.size();++j){
  249. ActionPO actionPO = rotateJoystickList.get(j);
  250. JSONObject actionResponse = sceneGrpcService.createActionResponse(actionPO.getAction_type(),actionPO.getTrace_id());
  251. actionResponses.add(actionResponse);
  252. traceIds[j] = actionPO.getTrace_id();
  253. }
  254. }
  255. ActionPO lastActionPO = rotateJoystickList.get(rotateJoystickList.size()-1);
  256. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(lastActionPO.getFrameId());
  257. PointPO playerPosition = user.getPlayerPosition();
  258. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  259. AnglePO playerAngle = user.getPlayerAngle();
  260. AngleUe4 playerAg = null;
  261. if(firstActionType == 15){
  262. playerAngle.setYaw(lastActionPO.getPlayerAngle().getYaw());
  263. }
  264. playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  265. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  266. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  267. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  268. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  269. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  270. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  271. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  272. metaDataFramePO.setTraceIds(traceIds);
  273. metaDataFramePO.setVehicle(null);
  274. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  275. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  276. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  277. //newUserStates
  278. JSONArray newUserStates = new JSONArray();
  279. newUserStates.add(userState);
  280. metaDataFramePO.setNewUserStates(newUserStates);
  281. metaDataFramePO.setActionResponses(actionResponses);
  282. metaDataFramePO.setGetStateType(0);
  283. metaDataFramePO.setCode(0);
  284. metaDataFramePO.setMsg("");
  285. redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
  286. //更新user表
  287. user.setFrameId(lastActionPO.getFrameId());
  288. user.setPlayerAngle(playerAngle);
  289. }
  290. /*
  291. * {
  292. "traceIds": ["d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "939087ff-4999-4551-92e4-26ecb67f8aa2"],
  293. "vehicle": null,
  294. "newUserStates": [{
  295. "userId": "dcff36ae4fc1d",
  296. "playerState": {
  297. "roomTypeId": "",
  298. "person": 0,
  299. "avatarId": "",
  300. "skinId": "",
  301. "roomId": "",
  302. "isHost": false,
  303. "isFollowHost": false,
  304. "skinDataVersion": "",
  305. "avatarComponents": "",
  306. "nickName": "",
  307. "movingMode": 0,
  308. "attitude": "",
  309. "areaName": "",
  310. "pathName": "",
  311. "pathId": "",
  312. "avatarSize": 1,
  313. "extra": "",
  314. "prioritySync": false,
  315. "player": {
  316. "position": {
  317. "x": -421.30057,
  318. "y": -1434.4198,
  319. "z": -34
  320. },
  321. "angle": {
  322. "pitch": 0,
  323. "yaw": 47,
  324. "roll": 0
  325. }
  326. },
  327. "camera": {
  328. "position": {
  329. "x": -436.2,
  330. "y": -1408.8,
  331. "z": 130.7
  332. },
  333. "angle": {
  334. "pitch": 0,
  335. "yaw": 315,
  336. "roll": 0
  337. }
  338. },
  339. "cameraCenter": {
  340. "x": -400,
  341. "y": -1450,
  342. "z": 10.610336
  343. }
  344. },
  345. "renderInfo": {
  346. "renderType": 0,
  347. "videoFrame": null,
  348. "cameraStateType": 3,
  349. "isMoving": 1,
  350. "needIfr": 0,
  351. "isVideo": 0,
  352. "stillFrame": 0,
  353. "isRotating": 0,
  354. "isFollowing": 0,
  355. "clientPanoTitlesBitmap": [],
  356. "clientPanoTreceId": "",
  357. "prefetchVideoId": "",
  358. "noMedia": false
  359. },
  360. "event": null,
  361. "relation": 1
  362. }],
  363. "actionResponses": [{
  364. "actionType": 15,
  365. "pointType": 100,
  366. "extra": "",
  367. "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
  368. "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
  369. "nps": [],
  370. "peopleNum": 0,
  371. "zoneId": "",
  372. "echoMsg": "",
  373. "reserveDetail": null,
  374. "userWithAvatarList": [],
  375. "newUserStates": [],
  376. "code": 0,
  377. "msg": ""
  378. }, {
  379. "actionType": 1,
  380. "pointType": 0,
  381. "extra": "",
  382. "traceId": "939087ff-4999-4551-92e4-26ecb67f8aa2",
  383. "packetId": "",
  384. "nps": [],
  385. "peopleNum": 0,
  386. "zoneId": "",
  387. "echoMsg": "",
  388. "reserveDetail": null,
  389. "userWithAvatarList": [],
  390. "newUserStates": [],
  391. "code": 0,
  392. "msg": ""
  393. }],
  394. "getStateType": 0,
  395. "code": 0,
  396. "msg": "OK"
  397. }
  398. * */
  399. }