123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 |
- package com.fdkk.fdkkmeta.task;
- import cn.hutool.core.util.ArrayUtil;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
- import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity;
- import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
- import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
- import com.fdkk.fdkkmeta.domain.po.*;
- import com.fdkk.fdkkmeta.grpc.*;
- import com.fdkk.fdkkmeta.grpcService.SceneGrpcService;
- import com.fdkk.fdkkmeta.redis.RedisCache;
- import com.fdkk.fdkkmeta.service.BreakpointsService;
- import com.fdkk.fdkkmeta.service.MoveFrameService;
- import com.fdkk.fdkkmeta.service.UserService;
- import com.fdkk.fdkkmeta.service.RotateFrameService;
- import com.fdkk.fdkkmeta.util.kesar.GetRoute;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Component;
- import java.io.File;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- /**
- * @author Xiewj
- * @date 2022/3/30
- */
- @Component
- @Slf4j
- public class UpdateFrameMetaTask {
- @Autowired
- RedisCache redisCache;
- @Autowired
- UserService userService;
- @Autowired
- RotateFrameService rotateFrameService;
- @Autowired
- MoveFrameService moveFrameService;
- @Autowired
- SceneGrpcService sceneGrpcService;
- @Autowired
- BreakpointsService breakpointsService;
- @Scheduled(initialDelay=1000, fixedDelay=1000/30)
- public void updateFrameMetadata(){
- List<UserEntity> userOnline = userService.findUserOnline(true);
- log.info("进入定时任务{}", ArrayUtil.isNotEmpty(userOnline)?userOnline.size():0);
- // JSONObject a=new JSONObject();
- // a.put("123123",123123);
- //使用并行流处理数据
- userOnline.parallelStream().forEach(
- userEntity -> {
- //UserEntity user = redisCache.getCacheObject("setCacheRequest:" + userEntity.getUserId());
- // redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
- List<ActionPO> list = redisCache.getCacheList("setCacheRequest"+userEntity.getUserId());
- handle( userEntity,list);
- }
- );
- }
- private void handle(UserEntity user,List<ActionPO> list){
- try {
- if(list.size() == 0){
- //写入一个默认数据到redis里
- createDefaultFrameMetadata( user);
- return;
- }
- List<ActionPO> rotateJoystickList = new ArrayList<ActionPO>();
- JSONObject myState = redisCache.getCacheObject("UserState"+user.getUserId());
- ActionPO _actionPO = list.get(0);
- int firstActionType = _actionPO.getAction_type();
- JSONArray path = _actionPO.getPath();
- if(firstActionType == 1014||firstActionType == 15){
- rotateJoystickList.add(_actionPO);
- }
- else if(firstActionType == 1){
- long startBreakPointId = path.getLongValue(0);
- long endBreakPointId = path.getLongValue(1);
- BreakpointsEntity startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
- BreakpointsEntity endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
- //过渡
- if(myState.getIntValue("isMoving") == 1){
- MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
- //准备过渡下一段
- if(moveFrameEntity==null){
- RotateFrameEntity rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),endBreakPointId,_actionPO.getCameraAngle().getYaw());
- path.remove(0);
- if(path.size()>1){
- startBreakPointId = endBreakPointId;
- endBreakPointId = path.getLongValue(1);
- _actionPO.setPath(path);
- _actionPO.setFrameIndex(0);
- _actionPO.setStartPostion(null);
- _actionPO.setEndPosition(null);
- int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),startBreakPointId,endBreakPointId, _actionPO.getCameraAngle().getYaw()%45);
- _actionPO.setSubFrameIndex(subFrameIndex);
- _actionPO.setPlayerPosition(endBreakpointsEntity.getPosition());
- startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
- endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
- int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
- AnglePO playerAngle = user.getPlayerAngle();
- playerAngle.setYaw(_angle);
- _actionPO.setPlayerAngle(playerAngle);
- //更新redis记录
- redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
- myState.put("isMoving",0);
- redisCache.setCacheObject("UserState"+user.getUserId(),myState);
- //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),0);
- user.setFrameId(rotateFrameEntity.getId());
- user.setPlayerAngle(playerAngle);
- user.setBreakPointId(startBreakPointId);
- user.setPlayerPosition(startBreakpointsEntity.getPosition());
- userService.updateById(user);
- }
- //过渡全部结束
- else{
- //删除redis里的数据
- redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
- //更新user表
- //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex());
- user.setPlayerPosition(endBreakpointsEntity.getPosition());
- user.setFrameId(rotateFrameEntity.getId());
- user.setPlayerAngle(_actionPO.getPlayerAngle());
- user.setBreakPointId(endBreakPointId);
- userService.updateById(user);
- myState.put("isMoving",0);
- redisCache.setCacheObject("UserState"+user.getUserId(),myState);
- //执行下一条记录
- list.remove(0);
- }
- handle( user,list);
- return ;
- }
- //更新
- if(_actionPO.getStartPostion() == null){
- _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
- _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
- }
- _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
- PointPO playerPosition = new PointPO();
- playerPosition.setX((_actionPO.getEndPosition().getX() - _actionPO.getStartPostion().getX())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
- playerPosition.setY((_actionPO.getEndPosition().getY() - _actionPO.getStartPostion().getY())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
- playerPosition.setZ((_actionPO.getEndPosition().getZ() - _actionPO.getStartPostion().getZ())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
- createMoveFrameMetadata(user.getUserId(),_actionPO.getPlayerAngle(), playerPosition, moveFrameEntity,_actionPO.getTrace_id());
- //更新redis里的数据
- redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
- }
- else if(myState.getIntValue("isMoving") == 0){
- if(list.size()>0){
- //中断,执行下一条记录
- list.remove(0);
- redisCache.lTrim("setCacheRequest"+user.getUserId(),1,-1);
- handle( user,list);
- return ;
- }
- else{
- //过渡
- myState.put("isMoving",1);
- redisCache.setCacheObject("UserState"+user.getUserId(),myState);
- MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
- //更新
- int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
- AnglePO playerAngle = user.getPlayerAngle();
- playerAngle.setYaw(_angle);
- createMoveFrameMetadata( user.getUserId(),playerAngle,startBreakpointsEntity.getPosition(), moveFrameEntity,_actionPO.getTrace_id());
- _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
- _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
- _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
- //更新redis里的数据
- redisCache.setCacheListByIndex("setCacheRequest"+user.getUserId(),0,_actionPO);
- }
- }
- /****************************************************************************************/
- return;
- }
- long lastFrameId = _actionPO.getFrameId();
- for(int i=1;i<list.size();++i){
- ActionPO actionPO = list.get(i);
- // if(firstActionType != actionPO.getAction_type()){
- // break;
- // }
- //旋转
- if(actionPO.getAction_type() == 1014||actionPO.getAction_type() == 15){
- rotateJoystickList.add(actionPO);
- lastFrameId = actionPO.getFrameId();
- continue;
- }
- else{
- break;
- }
- }
- createRotateFrameMetadata( user, rotateJoystickList, firstActionType);
- //删除redis里的数据
- redisCache.lTrim("setCacheRequest"+user.getUserId(),rotateJoystickList.size(),-1);
- //更新user表
- user.setFrameId(lastFrameId);
- userService.updateById(user);
- }catch (Exception e){
- e.printStackTrace();
- log.info("handleException{}",e.getMessage());
- }
- }
- private void createDefaultFrameMetadata(UserEntity user){
- String[] traceIds = new String[1];
- traceIds[0] = "";
- JSONArray actionResponses = new JSONArray();
- RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
- PointPO playerPosition = user.getPlayerPosition();
- Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
- AnglePO playerAngle = user.getPlayerAngle();
- AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
- Space player = sceneGrpcService.createSpace(playerPt,playerAg);
- PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
- Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
- AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
- AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
- Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
- MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
- metaDataFramePO.setTraceIds(traceIds);
- metaDataFramePO.setVehicle(null);
- State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
- RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
- UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
- //newUserStates
- UserState[] newUserStates = new UserState[1];
- newUserStates[0] = userState;
- metaDataFramePO.setNewUserStates(newUserStates);
- metaDataFramePO.setActionResponses(actionResponses);
- metaDataFramePO.setGetStateType(0);
- metaDataFramePO.setCode(0);
- metaDataFramePO.setMsg("");
- redisCache.delete("updateFrameMetadata:"+user.getUserId());
- redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
- }
- private void createMoveFrameMetadata(String user_id,AnglePO playerAngle,PointPO playerPosition,MoveFrameEntity moveFrameEntity,String traceId){
- String[] traceIds = new String[1];
- traceIds[0] = traceId;
- JSONArray actionResponses = new JSONArray();
- //RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
- //PointPO playerPosition = user.getPlayerPosition();
- Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
- //AnglePO playerAngle = user.getPlayerAngle();
- AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
- Space player = sceneGrpcService.createSpace(playerPt,playerAg);
- PointPO cameraPoint = moveFrameEntity.getCameraPosition();
- Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
- AnglePO cameraAnglePO = moveFrameEntity.getCameraAngle();
- AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
- Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
- MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
- metaDataFramePO.setTraceIds(traceIds);
- metaDataFramePO.setVehicle(null);
- State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
- RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
- UserState userState = sceneGrpcService.createUserState( user_id, playerState, renderInfo, null);
- //newUserStates
- // JSONArray newUserStates = new JSONArray();
- // newUserStates.add(userState);
- UserState[] newUserStates = new UserState[1];
- newUserStates[0] = userState;
- metaDataFramePO.setNewUserStates(newUserStates);
- metaDataFramePO.setActionResponses(actionResponses);
- metaDataFramePO.setGetStateType(0);
- metaDataFramePO.setCode(0);
- metaDataFramePO.setMsg("");
- redisCache.delete("updateFrameMetadata:"+user_id);
- redisCache.setCacheObject("updateFrameMetadata:"+user_id,metaDataFramePO);
- }
- private void createRotateFrameMetadata(UserEntity user,List<ActionPO> rotateJoystickList,int firstActionType){
- JSONArray actionResponses = new JSONArray();
- String[] traceIds = new String[rotateJoystickList.size()];
- if(rotateJoystickList.size()>0){
- for(int j=0;j<rotateJoystickList.size();++j){
- ActionPO actionPO = rotateJoystickList.get(j);
- JSONObject actionResponse = sceneGrpcService.createActionResponse(actionPO.getAction_type(),actionPO.getTrace_id());
- actionResponses.add(actionResponse);
- traceIds[j] = actionPO.getTrace_id();
- }
- }
- ActionPO lastActionPO = rotateJoystickList.get(rotateJoystickList.size()-1);
- RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(lastActionPO.getFrameId());
- PointPO playerPosition = user.getPlayerPosition();
- Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
- AnglePO playerAngle = user.getPlayerAngle();
- AngleUe4 playerAg = null;
- if(firstActionType == 15){
- playerAngle.setYaw(lastActionPO.getPlayerAngle().getYaw());
- }
- playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
- Space player = sceneGrpcService.createSpace(playerPt,playerAg);
- PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
- Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
- AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
- AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
- Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
- MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
- metaDataFramePO.setTraceIds(traceIds);
- metaDataFramePO.setVehicle(null);
- State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
- RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
- UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
- //newUserStates
- // JSONArray newUserStates = new JSONArray();
- //// newUserStates.add(userState);
- UserState[] newUserStates = new UserState[1];
- newUserStates[0] = userState;
- metaDataFramePO.setNewUserStates(newUserStates);
- metaDataFramePO.setActionResponses(actionResponses);
- metaDataFramePO.setGetStateType(0);
- metaDataFramePO.setCode(0);
- metaDataFramePO.setMsg("");
- redisCache.delete("updateFrameMetadata:"+user.getUserId());
- redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
- //更新user表
- user.setFrameId(lastActionPO.getFrameId());
- user.setPlayerAngle(playerAngle);
- }
- /*
- * {
- "traceIds": ["d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "939087ff-4999-4551-92e4-26ecb67f8aa2"],
- "vehicle": 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": -421.30057,
- "y": -1434.4198,
- "z": -34
- },
- "angle": {
- "pitch": 0,
- "yaw": 47,
- "roll": 0
- }
- },
- "camera": {
- "position": {
- "x": -436.2,
- "y": -1408.8,
- "z": 130.7
- },
- "angle": {
- "pitch": 0,
- "yaw": 315,
- "roll": 0
- }
- },
- "cameraCenter": {
- "x": -400,
- "y": -1450,
- "z": 10.610336
- }
- },
- "renderInfo": {
- "renderType": 0,
- "videoFrame": null,
- "cameraStateType": 3,
- "isMoving": 1,
- "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": ""
- }, {
- "actionType": 1,
- "pointType": 0,
- "extra": "",
- "traceId": "939087ff-4999-4551-92e4-26ecb67f8aa2",
- "packetId": "",
- "nps": [],
- "peopleNum": 0,
- "zoneId": "",
- "echoMsg": "",
- "reserveDetail": null,
- "userWithAvatarList": [],
- "newUserStates": [],
- "code": 0,
- "msg": ""
- }],
- "getStateType": 0,
- "code": 0,
- "msg": "OK"
- }
- * */
- }
|