|
@@ -22,6 +22,7 @@ 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;
|
|
|
|
|
@@ -55,73 +56,215 @@ public class UpdateFrameMetaTask {
|
|
|
userEntity -> {
|
|
|
//UserEntity user = redisCache.getCacheObject("setCacheRequest:" + userEntity.getUserId());
|
|
|
// redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
|
|
|
- String userId = userEntity.getUserId();
|
|
|
- handle( userId);
|
|
|
+ List<ActionPO> list = redisCache.getCacheList("setCacheRequest"+userEntity.getUserId());
|
|
|
+ handle( userEntity,list);
|
|
|
}
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- private void handle(String userId){
|
|
|
- List<MovePO> list = redisCache.getCacheList("setCacheRequest:move:"+userId);
|
|
|
- if(list.size() == 0){
|
|
|
- createMetaDataForRotate(userId);
|
|
|
- createMetaDataForJoystick(userId);
|
|
|
- }
|
|
|
- else{
|
|
|
- MovePO movePO = list.get(0);
|
|
|
- UserEntity user = userService.findUserId(userId);
|
|
|
- //true表示可以过渡了,false表示需要继续旋转
|
|
|
- boolean flag = movePO.isRotated();
|
|
|
- if(!flag){
|
|
|
- boolean flag_rotated = rotateForMove( user, movePO);
|
|
|
- if(flag_rotated) {
|
|
|
- //矫正完成
|
|
|
- movePO.setRotated(true);
|
|
|
- }
|
|
|
- //设置
|
|
|
- /*********************************************************************************************/
|
|
|
- //redisCache.setCacheList("setCacheRequest:move:"+userId, Arrays.asList(movePO));
|
|
|
- return;
|
|
|
- }
|
|
|
- //可以过渡了
|
|
|
- else {
|
|
|
- flag = movePO.isMoving();
|
|
|
- //打断
|
|
|
- if(list.size()>1){
|
|
|
- //删除第一个元素
|
|
|
- /*********************************************************************************************/
|
|
|
- return;
|
|
|
- }
|
|
|
- //还没开始过渡,只是打算过渡
|
|
|
- if(!flag) {
|
|
|
- flag = createMetaDataForRotate(userId);
|
|
|
- if(!flag){
|
|
|
- flag = createMetaDataForJoystick(userId);
|
|
|
- }
|
|
|
- if(!flag){
|
|
|
- //开始过渡
|
|
|
- movePO.setMoving(true);
|
|
|
- //过渡中
|
|
|
- /*********************************************************************************************/
|
|
|
- }
|
|
|
- //有旋转/操作的动作,所以打断了过渡
|
|
|
- else{
|
|
|
- //删除第一个元素
|
|
|
- /*********************************************************************************************/
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- else{
|
|
|
- //开始过渡
|
|
|
- movePO.setMoving(true);
|
|
|
- //过渡中
|
|
|
- /*********************************************************************************************/
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ private void handle(UserEntity user,List<ActionPO> list){
|
|
|
+
|
|
|
+ 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();
|
|
|
+
|
|
|
+ if(firstActionType == 1014||firstActionType == 15){
|
|
|
+ rotateJoystickList.add(_actionPO);
|
|
|
+ }
|
|
|
+ else if(firstActionType == 1){
|
|
|
+ JSONArray path = _actionPO.getPath();
|
|
|
+ long startBreakPointId = path.getLongValue(0);
|
|
|
+ long endBreakPointId = path.getLongValue(1);
|
|
|
+ //过渡
|
|
|
+ if(myState.getIntValue("isMoving") == 1){
|
|
|
+ MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getMoveAngle(),_actionPO.getFrameIndex()+1);
|
|
|
+ if(moveFrameEntity==null){
|
|
|
+ path.remove(0);
|
|
|
+ //过渡下一段
|
|
|
+ if(path.size()>1){
|
|
|
+ startBreakPointId = endBreakPointId;
|
|
|
+ endBreakPointId = path.getLongValue(1);
|
|
|
+ _actionPO.setPath(path);
|
|
|
+ _actionPO.setFrameIndex(0);
|
|
|
+ moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getMoveAngle(),_actionPO.getFrameIndex()+1);
|
|
|
+ }
|
|
|
+ //过渡全部结束
|
|
|
+ else{
|
|
|
+ //删除redis里的数据
|
|
|
+ //更新user表
|
|
|
+ myState.put("isMoving",0);
|
|
|
+ redisCache.setCacheObject("UserState"+user.getUserId(),myState);
|
|
|
+ //执行下一条记录
|
|
|
+ list.remove(0);
|
|
|
+ handle( user,list);
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //更新
|
|
|
+ createMoveFrameMetadata( user, moveFrameEntity,_actionPO.getTrace_id());
|
|
|
+ _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
|
|
|
+ //更新redis里的数据
|
|
|
+ //更新user表
|
|
|
+ }
|
|
|
+ else if(myState.getIntValue("isMoving") == 0){
|
|
|
+ if(list.size()>0){
|
|
|
+ //中断
|
|
|
+ //执行下一条记录
|
|
|
+ list.remove(0);
|
|
|
+ handle( user,list);
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ //过渡
|
|
|
+ myState.put("isMoving",1);
|
|
|
+ redisCache.setCacheObject("UserState"+user.getUserId(),myState);
|
|
|
+ MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getMoveAngle(),_actionPO.getFrameIndex()+1);
|
|
|
+ //更新
|
|
|
+ createMoveFrameMetadata( user, moveFrameEntity,_actionPO.getTrace_id());
|
|
|
+ _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
|
|
|
+ //更新redis里的数据
|
|
|
+ //更新user表
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /****************************************************************************************/
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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 == 1014){
|
|
|
+ playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
|
|
|
+ }
|
|
|
+ else if(firstActionType == 15){
|
|
|
+ playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(lastActionPO.getPlayerAngle()).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);
|
|
|
+ metaDataFramePO.setNewUserStates(newUserStates);
|
|
|
+ metaDataFramePO.setActionResponses(actionResponses);
|
|
|
+ metaDataFramePO.setGetStateType(0);
|
|
|
+ metaDataFramePO.setCode(0);
|
|
|
+ metaDataFramePO.setMsg("");
|
|
|
+
|
|
|
+ redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
|
|
|
+
|
|
|
+ //删除redis里的数据
|
|
|
+ //更新user表
|
|
|
+ }
|
|
|
+
|
|
|
+//
|
|
|
+// private void handle(String userId){
|
|
|
+// List<MovePO> list = redisCache.getCacheList("setCacheRequest:move:"+userId);
|
|
|
+// if(list.size() == 0){
|
|
|
+// createMetaDataForRotate(userId);
|
|
|
+// createMetaDataForJoystick(userId);
|
|
|
+// }
|
|
|
+// else{
|
|
|
+// MovePO movePO = list.get(0);
|
|
|
+// UserEntity user = userService.findUserId(userId);
|
|
|
+// //true表示可以过渡了,false表示需要继续旋转
|
|
|
+// boolean flag = movePO.isRotated();
|
|
|
+// if(!flag){
|
|
|
+// boolean flag_rotated = rotateForMove( user, movePO);
|
|
|
+// if(flag_rotated) {
|
|
|
+// //矫正完成
|
|
|
+// movePO.setRotated(true);
|
|
|
+// }
|
|
|
+// //设置
|
|
|
+// /*********************************************************************************************/
|
|
|
+// //redisCache.setCacheList("setCacheRequest:move:"+userId, Arrays.asList(movePO));
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// //可以过渡了
|
|
|
+// else {
|
|
|
+// flag = movePO.isMoving();
|
|
|
+// //打断
|
|
|
+// if(list.size()>1){
|
|
|
+// //删除第一个元素
|
|
|
+// /*********************************************************************************************/
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// //还没开始过渡,只是打算过渡
|
|
|
+// if(!flag) {
|
|
|
+// flag = createMetaDataForRotate(userId);
|
|
|
+// if(!flag){
|
|
|
+// flag = createMetaDataForJoystick(userId);
|
|
|
+// }
|
|
|
+// if(!flag){
|
|
|
+// //开始过渡
|
|
|
+// movePO.setMoving(true);
|
|
|
+// //过渡中
|
|
|
+// /*********************************************************************************************/
|
|
|
+// }
|
|
|
+// //有旋转/操作的动作,所以打断了过渡
|
|
|
+// else{
|
|
|
+// //删除第一个元素
|
|
|
+// /*********************************************************************************************/
|
|
|
+// return;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else{
|
|
|
+// //开始过渡
|
|
|
+// movePO.setMoving(true);
|
|
|
+// //过渡中
|
|
|
+// /*********************************************************************************************/
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
|
|
|
private boolean createMetaDataForRotate(String userId){
|
|
|
List<RotatePO> list = redisCache.getCacheList("setCacheRequest:rotate:"+userId);
|
|
@@ -432,6 +575,82 @@ public class UpdateFrameMetaTask {
|
|
|
result.put("cameraCenters",cameraCenters);
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
+ 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
|
|
|
+ JSONArray newUserStates = new JSONArray();
|
|
|
+ newUserStates.add(userState);
|
|
|
+ metaDataFramePO.setNewUserStates(newUserStates);
|
|
|
+ metaDataFramePO.setActionResponses(actionResponses);
|
|
|
+ metaDataFramePO.setGetStateType(0);
|
|
|
+ metaDataFramePO.setCode(0);
|
|
|
+ metaDataFramePO.setMsg("");
|
|
|
+
|
|
|
+ redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void createMoveFrameMetadata(UserEntity user,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.getUserId(), playerState, renderInfo, null);
|
|
|
+
|
|
|
+ //newUserStates
|
|
|
+ JSONArray newUserStates = new JSONArray();
|
|
|
+ newUserStates.add(userState);
|
|
|
+ metaDataFramePO.setNewUserStates(newUserStates);
|
|
|
+ metaDataFramePO.setActionResponses(actionResponses);
|
|
|
+ metaDataFramePO.setGetStateType(0);
|
|
|
+ metaDataFramePO.setCode(0);
|
|
|
+ metaDataFramePO.setMsg("");
|
|
|
+
|
|
|
+ redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
|
|
|
+ }
|
|
|
/*
|
|
|
* {
|
|
|
"traceIds": ["d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "939087ff-4999-4551-92e4-26ecb67f8aa2"],
|