sceneGrpcServer.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. package com.fdkk.fdkkmeta.grpcService;
  2. import cn.hutool.core.util.ArrayUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.fdkk.fdkkmeta.config.MetaConfig;
  8. import com.fdkk.fdkkmeta.domain.dto.RouteDto;
  9. import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
  10. import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity;
  11. import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
  12. import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
  13. import com.fdkk.fdkkmeta.domain.po.*;
  14. import com.fdkk.fdkkmeta.grpc.*;
  15. import com.fdkk.fdkkmeta.redis.RedisCache;
  16. import com.fdkk.fdkkmeta.redis.RedisPublishService;
  17. import com.fdkk.fdkkmeta.service.BreakpointsService;
  18. import com.fdkk.fdkkmeta.service.MoveFrameService;
  19. import com.fdkk.fdkkmeta.service.RotateFrameService;
  20. import com.fdkk.fdkkmeta.service.UserService;
  21. import com.fdkk.fdkkmeta.util.ProtoJsonUtils;
  22. import com.fdkk.fdkkmeta.util.kesar.GetRoute;
  23. import constants.RedisQueueConstant;
  24. import io.grpc.stub.StreamObserver;
  25. import lombok.extern.slf4j.Slf4j;
  26. import net.devh.boot.grpc.server.service.GrpcService;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import java.io.File;
  29. import java.util.Arrays;
  30. import java.util.List;
  31. /**
  32. * @author Xiewj
  33. * @date 2022/5/9
  34. */
  35. @GrpcService
  36. @Slf4j
  37. public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBase {
  38. @Autowired
  39. MetaConfig metaConfig;
  40. @Autowired
  41. UserService userService;
  42. @Autowired
  43. BreakpointsService breakpointsService;
  44. @Autowired
  45. RotateFrameService rotateFrameService;
  46. @Autowired
  47. MoveFrameService moveFrameService;
  48. @Autowired
  49. RedisCache redisCache;
  50. @Autowired
  51. SceneGrpcService sceneGrpcService;
  52. @Autowired
  53. private RedisPublishService redisPublishService;
  54. /***
  55. * 回复 案例
  56. * SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  57. * responseObserver.onNext(res);
  58. */
  59. /*
  60. @Override
  61. public void testMethod(SceneRequest request, StreamObserver<SceneReply> responseObserver) {
  62. // grpc服务端获取调用端请求参数
  63. String id = request.getId();
  64. String name = request.getName();
  65. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  66. SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  67. responseObserver.onNext(res);
  68. responseObserver.onCompleted();
  69. log.info("回复{}",res);
  70. }
  71. */
  72. @Override
  73. public void getRoute(RouteRequest request, StreamObserver<RouteReply> responseObserver) {
  74. // grpc服务端获取调用端请求参数
  75. String sceneCode = request.getSceneCode();
  76. Point sLocation = request.getSLocation();
  77. Point eLocation = request.getELocation();
  78. RouteDto po=new RouteDto();
  79. PointPO s=new PointPO();
  80. s.setX(Double.parseDouble(sLocation.getX()));
  81. s.setY(Double.parseDouble(sLocation.getY()));
  82. s.setZ(Double.parseDouble(sLocation.getY()));
  83. PointPO e=new PointPO();
  84. e.setX(Double.parseDouble(eLocation.getX()));
  85. e.setY(Double.parseDouble(eLocation.getY()));
  86. e.setZ(Double.parseDouble(eLocation.getY()));
  87. po.setE_location(e);
  88. po.setS_location(s);
  89. po.setSceneCode(sceneCode);
  90. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +"target_freespace.json", po);
  91. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  92. RouteReply.Builder builder = RouteReply.newBuilder();
  93. if (ArrayUtil.isNotEmpty(maps)) {
  94. for (int i = 0; i < maps.size(); i++) {
  95. RouteArray.Builder addInBuilder = builder.addInBuilder();
  96. ProtoJsonUtils.toProtoBean(addInBuilder, maps.get(i).toString());
  97. }
  98. }
  99. responseObserver.onNext(builder.build());
  100. responseObserver.onCompleted();
  101. }
  102. @Override
  103. public void init(InitRequest request, StreamObserver<CommonReply> responseObserver) {
  104. try {
  105. log.info("开始初始化!");
  106. String user_id = request.getUserId();
  107. String nick_name = request.getNickName();
  108. String skin_id = request.getSkinId();
  109. String avatar_id = request.getAvatarId();
  110. String room_id = request.getRoomId();
  111. String app_id = request.getAppId();
  112. Space player =request.getPlayer();
  113. //保存user
  114. UserEntity userEntity=new UserEntity();
  115. long firstFrameId = 1081L;
  116. long firstBreakPointId = 100L;
  117. userEntity.setAppId(app_id);
  118. userEntity.setUserId(user_id);
  119. userEntity.setAvatarId(avatar_id);
  120. userEntity.setNickName(nick_name);
  121. userEntity.setRoomId(room_id);
  122. userEntity.setSkinId(skin_id);
  123. userEntity.setFrameId(firstFrameId);
  124. userEntity.setBreakPointId(firstBreakPointId);
  125. userEntity.setOnline(true);
  126. //Point playerPoint = player.getPosition();
  127. BreakpointsEntity breakpointsEntity = breakpointsService.findById(firstBreakPointId);
  128. AngleUe4 playerAngle = player.getAngle();
  129. //初始化的时候可以写死
  130. AnglePO player_angle = new AnglePO();
  131. player_angle.setPitch(playerAngle.getPitch());
  132. player_angle.setYaw(playerAngle.getYaw());
  133. player_angle.setRoll(playerAngle.getRoll());
  134. userEntity.setPlayerAngle(player_angle);
  135. PointPO player_position = new PointPO();
  136. player_position.setX(breakpointsEntity.getPosition().getX());
  137. player_position.setY(breakpointsEntity.getPosition().getY());
  138. player_position.setZ(breakpointsEntity.getPosition().getZ());
  139. userEntity.setPlayerPosition(player_position);
  140. //数据库user表中创建用户记录
  141. userService.save(userEntity);
  142. JSONObject myState = new JSONObject();
  143. myState.put("isMoving",0);
  144. myState.put("horizontalMove",0);
  145. myState.put("frameId",firstFrameId);
  146. myState.put("breakPointId",firstBreakPointId);
  147. myState.put("appId",app_id);
  148. //redis中写入用户状态信息
  149. redisCache.setCacheObject("UserState:"+userEntity.getUserId(),myState);
  150. MetaDataFramePO metaDataFramePO = createDefaultFrameMetadata(userEntity);
  151. //返回
  152. CommonReply.Builder builder = CommonReply.newBuilder();
  153. //初始化的情况下,没有traceId
  154. // String[] traceIds = metaDataFramePO.getTraceIds();
  155. // for(int i=0;i<traceIds.length;++i){
  156. // builder.addTraceIds(traceIds[i]);
  157. // }
  158. if (ObjectUtil.isNotNull(metaDataFramePO.getVehicle())){
  159. builder.setVehicle(metaDataFramePO.getVehicle());
  160. }
  161. UserState[] userStates = metaDataFramePO.getNewUserStates();
  162. for(int i=0;i<userStates.length;++i){
  163. builder.addNewUserStates(userStates[i]);
  164. }
  165. builder.setGetStateType(metaDataFramePO.getGetStateType());
  166. builder.setCode(metaDataFramePO.getCode());
  167. builder.setMsg(metaDataFramePO.getMsg());
  168. responseObserver.onNext(builder.build());
  169. responseObserver.onCompleted();
  170. }
  171. catch(Exception e) {
  172. e.printStackTrace();
  173. // responseObserver.onNext(NormalReply.newBuilder().setCode(500).build());
  174. // responseObserver.onCompleted();
  175. log.error("initException{}",e.getMessage());
  176. }
  177. }
  178. @Override
  179. public void rotate(RotateRequest request, StreamObserver<NormalReply> responseObserver) {
  180. try {
  181. redisPublishService.sendProtocolMessage(RedisQueueConstant.ROTATE_QUEUE,request.toBuilder());
  182. ActionPO rotateRequestPO = new ActionPO();
  183. int action_type = request.getActionType();
  184. String trace_id = request.getTraceId();
  185. String user_id = request.getUserId();
  186. RotationAction rotationAction = request.getRotationAction();
  187. JSONObject myState = redisCache.getCacheObject("UserState:"+user_id);
  188. //UserEntity user = userService.findUserId(user_id);
  189. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(myState.getLong("frameId"));
  190. rotateRequestPO.setAction_type(action_type);
  191. rotateRequestPO.setTrace_id(trace_id);
  192. rotateRequestPO.setUser_id(user_id);
  193. double horizontalMove = myState.getDouble("horizontalMove");
  194. horizontalMove += rotationAction.getHorizontalMove();
  195. double hAngle = horizontalMove * 90;
  196. log.info("旋转的角度:"+hAngle+",旋转距离:"+rotationAction.getHorizontalMove()+",积累的距离:"+horizontalMove);
  197. int offFrameIndex = (int)Math.ceil(hAngle);
  198. if(Math.abs(offFrameIndex)<1){
  199. myState.put("horizontalMove",horizontalMove);
  200. //redis中写入用户状态信息
  201. redisCache.setCacheObject("UserState:"+user_id,myState);
  202. log.info("没有旋转,更新了redis的UserState表");
  203. NormalReply.Builder builder = NormalReply.newBuilder();
  204. builder.setCode(200);
  205. responseObserver.onNext(builder.build());
  206. responseObserver.onCompleted();
  207. return;
  208. }
  209. else{
  210. myState.put("horizontalMove",0);
  211. }
  212. int currentFrame = rotateFrameEntity.getFrameIndex(); //从数据库里读取
  213. currentFrame +=offFrameIndex;
  214. if(currentFrame<0){
  215. currentFrame+=360;
  216. }
  217. else{
  218. currentFrame = currentFrame % 359;
  219. }
  220. rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(myState.getString("appId"),myState.getLong("breakPointId"),currentFrame);
  221. rotateRequestPO.setFrameId(rotateFrameEntity.getId());
  222. log.info("存储请求:"+rotateFrameEntity.getId());
  223. //每次存一帧
  224. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(rotateRequestPO));
  225. //redis中写入用户状态信息
  226. myState.put("frameId",rotateFrameEntity.getId());
  227. redisCache.setCacheObject("UserState:"+user_id,myState);
  228. NormalReply.Builder builder = NormalReply.newBuilder();
  229. builder.setCode(200);
  230. responseObserver.onNext(builder.build());
  231. responseObserver.onCompleted();
  232. }
  233. catch(Exception e) {
  234. e.printStackTrace();
  235. responseObserver.onNext(NormalReply.newBuilder().setCode(500).build());
  236. responseObserver.onCompleted();
  237. log.error("rotateException{}",e.getMessage());
  238. }
  239. }
  240. @Override
  241. public void echo(EchoRequest request, StreamObserver<EchoReply> responseObserver){
  242. try{
  243. int action_type = request.getActionType();
  244. String trace_id = request.getTraceId();
  245. EchoReply.Builder builder = EchoReply.newBuilder();
  246. builder.setActionType(action_type);
  247. builder.setPointType(100);
  248. builder.setExtra("");
  249. builder.setTraceId(trace_id);
  250. builder.setPacketId("");
  251. //builder.setNps(nps);
  252. builder.setPeopleNum(0);
  253. builder.setZoneId("");
  254. builder.setEchoMsg("");
  255. builder.setReserveDetail(null);
  256. //builder.setUserWithAvatarList();
  257. //builder.setNewUserStates();
  258. builder.setCode(0);
  259. builder.setMsg("");
  260. responseObserver.onNext(builder.build());
  261. responseObserver.onCompleted();
  262. }
  263. catch(Exception e) {
  264. e.printStackTrace();
  265. log.error("echoException{}",e.getMessage());
  266. }
  267. }
  268. @Override
  269. public void usersState(GetNewUserStateRequest request, StreamObserver<GetNewUserStateReply> responseObserver){
  270. try{
  271. int action_type = request.getActionType();
  272. String trace_id = request.getTraceId();
  273. String user_id = request.getUserId();
  274. //从数据库中取全部在线的user表
  275. List<UserEntity> list = userService.findUserOnline(true);
  276. GetNewUserStateReply.Builder builder = GetNewUserStateReply.newBuilder();
  277. builder.setActionType(action_type);
  278. builder.setPointType(100);
  279. builder.setExtra("");
  280. builder.setTraceId(trace_id);
  281. builder.setPacketId("");
  282. //builder.setNps(nps);
  283. builder.setPeopleNum(0);
  284. builder.setZoneId("");
  285. builder.setEchoMsg("");
  286. builder.setReserveDetail(null);
  287. //builder.setUserWithAvatarList();
  288. if(list.size()>0){
  289. for(int i=0;i<list.size();++i){
  290. UserEntity user = list.get(i);
  291. JSONObject userInfo = new JSONObject();
  292. userInfo.put("roomTypeId","");
  293. userInfo.put("person",0);
  294. userInfo.put("avatarId",user.getAvatarId());
  295. userInfo.put("skinId",user.getSkinId());
  296. userInfo.put("roomId",user.getRoomId());
  297. userInfo.put("isHost",false);
  298. userInfo.put("isFollowHost",false);
  299. userInfo.put("skinDataVersion",user.getSkinDataVersion());
  300. userInfo.put("avatarComponents","");
  301. userInfo.put("nickName",user.getNickName());
  302. userInfo.put("movingMode",0); //后续会修改
  303. userInfo.put("attitude","walk");
  304. userInfo.put("areaName","");
  305. userInfo.put("pathName","");
  306. userInfo.put("pathId","thirdwalk");
  307. userInfo.put("avatarSize",1);
  308. userInfo.put("extra","{\"removeWhenDisconnected\":true}");
  309. userInfo.put("prioritySync",false);
  310. Space.Builder player = Space.newBuilder();
  311. PointPO playerPosition = user.getPlayerPosition();
  312. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  313. player.setPosition(playerPt);
  314. AnglePO playerAngle = user.getPlayerAngle();
  315. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  316. player.setAngle(playerAg);
  317. userInfo.put("player",player);
  318. userInfo.put("camera",null);
  319. userInfo.put("cameraCenter",null);
  320. State playerState = sceneGrpcService.createPlayerState(userInfo);
  321. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  322. Event event = sceneGrpcService.createEvent();
  323. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, event);
  324. builder.addNewUserStates(userState);
  325. }
  326. }
  327. //builder.setNewUserStates();
  328. builder.setCode(200);
  329. builder.setMsg("");
  330. responseObserver.onNext(builder.build());
  331. responseObserver.onCompleted();
  332. }
  333. catch (Exception e){
  334. e.printStackTrace();
  335. responseObserver.onNext(GetNewUserStateReply.newBuilder().setCode(500).build());
  336. responseObserver.onCompleted();
  337. log.error("usersStateException{}",e.getMessage());
  338. }
  339. }
  340. @Override
  341. public void move(MoveRequest request, StreamObserver<NormalReply> responseObserver){
  342. try{
  343. //int action_type= request.getActionType();
  344. ClickingAction clicking_action = request.getClickingAction();
  345. //State clicking_state = request.getClickingState();
  346. String trace_id = request.getTraceId();
  347. String user_id = request.getUserId();
  348. UserEntity user = userService.findUserId(user_id);
  349. String appId = user.getAppId();
  350. Long breakPointId = user.getBreakPointId();
  351. BreakpointsEntity currentBreakpointsEntity = breakpointsService.getById(breakPointId);
  352. Point end = clicking_action.getClickingPoint();
  353. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  354. //计算路径
  355. RouteDto po=new RouteDto();
  356. PointPO s= user.getPlayerPosition();
  357. PointPO e=new PointPO();
  358. e.setX(Double.parseDouble(end.getX()));
  359. e.setY(Double.parseDouble(end.getY()));
  360. e.setZ(Double.parseDouble(end.getZ()));
  361. po.setE_location(e);
  362. po.setS_location(s);
  363. po.setSceneCode(appId);
  364. JSONArray path = new JSONArray();
  365. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +appId+"_target_freespace.json", po);
  366. ActionPO movePO = new ActionPO();
  367. if (maps!=null&&maps.size()>=2){
  368. for(int i=0;i< maps.size();++i){
  369. Long _breakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(i)).toString()).getLong("id");
  370. path.add(_breakPointId);
  371. //旋转矫正
  372. if(i == 1){
  373. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  374. //旋转矫正:不仅存入redis,而且返回矫正后的角度
  375. cameraAnglePO = setRotateForMove( user, trace_id, cameraAnglePO);
  376. movePO.setCameraAngle(cameraAnglePO);
  377. }
  378. }
  379. movePO.setAction_type(1);
  380. movePO.setTrace_id(trace_id);
  381. movePO.setUser_id(user_id);
  382. movePO.setPath(path);
  383. Long lastBreakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(maps.size() -1)).toString()).getLong("id");
  384. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(appId,lastBreakPointId);
  385. int playerAngleYaw = sceneGrpcService.calAngleForBreakPointId(currentBreakpointsEntity,breakpointsEntity);
  386. AnglePO playerAngle = user.getPlayerAngle();
  387. playerAngle.setYaw(playerAngleYaw);
  388. movePO.setPlayerAngle(playerAngle);
  389. int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),path.getLongValue(0),path.getLongValue(1), movePO.getCameraAngle().getYaw()%45);
  390. movePO.setSubFrameIndex(subFrameIndex);
  391. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(movePO));
  392. }
  393. NormalReply.Builder builder = NormalReply.newBuilder();
  394. builder.setCode(200);
  395. }
  396. catch (Exception e){
  397. e.printStackTrace();
  398. //builder.setCode(0);
  399. responseObserver.onNext(NormalReply.newBuilder().setCode(500).build());
  400. responseObserver.onCompleted();
  401. log.error("moveException{}",e.getMessage());
  402. }
  403. }
  404. private AnglePO setRotateForMove(UserEntity user,String trace_id,AnglePO cameraAngle){
  405. int angle = cameraAngle.getYaw();
  406. int offAngle = 0;
  407. offAngle = angle%45;
  408. //先简单来,就累加。后续要再调试
  409. //存储矫正的一组帧
  410. offAngle = Math.abs(45 - offAngle);
  411. RotateFrameEntity _rotateFrameEntity = null;
  412. for(int j=0;j<offAngle;++j){
  413. ActionPO rotateRequestPO = new ActionPO();
  414. rotateRequestPO.setAction_type(1014);
  415. rotateRequestPO.setTrace_id(trace_id);
  416. rotateRequestPO.setUser_id(user.getUserId());
  417. _rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),user.getBreakPointId(),angle+j);
  418. rotateRequestPO.setFrameId(_rotateFrameEntity.getId());
  419. redisCache.setCacheList("setCacheRequest:"+user.getUserId(), Arrays.asList(rotateRequestPO));
  420. }
  421. if(_rotateFrameEntity == null){
  422. AnglePO cameraAnglePO = new AnglePO();
  423. cameraAnglePO.setPitch(0);
  424. cameraAnglePO.setYaw(angle);
  425. cameraAnglePO.setRoll(0);
  426. return cameraAnglePO;
  427. }
  428. else{
  429. return _rotateFrameEntity.getCameraAngle();
  430. }
  431. }
  432. @Override
  433. public void getBreakPoint(BreakPointRequest request, StreamObserver<BreakPointReply> responseObserver) {
  434. try {
  435. log.info("进入{}",request);
  436. int action_type = request.getActionType();
  437. NeighborPointsAction get_neighbor_points_action = request.getGetNeighborPointsAction();
  438. String trace_id = request.getTraceId();
  439. String user_id = request.getUserId();
  440. //从表breakpoints里获取所有的呼吸点,并且是数组
  441. //TODO 根据查询所有
  442. UserEntity userEntity = userService.findUserId(user_id);
  443. List<BreakpointsEntity> allList = breakpointsService.findByAppId(userEntity.getAppId());
  444. BreakPointReply.Builder res = BreakPointReply.newBuilder();
  445. res.setActionType(action_type);
  446. res.setPointType(100);
  447. res.setExtra("");
  448. res.setTraceId(trace_id);
  449. res.setPacketId("");
  450. for(int i=0;i<allList.size();++i){
  451. BreakpointsEntity breakpointsEntity = allList.get(i);
  452. PointPO breakpointsEntityPosition = breakpointsEntity.getPosition();
  453. Point nps = Point.newBuilder().setX(String.valueOf(breakpointsEntityPosition.getX())).setY(String.valueOf(breakpointsEntityPosition.getY())).setZ(String.valueOf(breakpointsEntityPosition.getZ())).build();
  454. res.addNps(nps);
  455. }
  456. res.setPeopleNum(0);
  457. res.setZoneId("");
  458. res.setEchoMsg("");
  459. res.setReserveDetail(null);
  460. //.setUserWithAvatarList()
  461. //.setNewUserStates()
  462. res.setCode(200);
  463. res.setMsg("");
  464. responseObserver.onNext(res.build());
  465. responseObserver.onCompleted();
  466. log.info("回复{}",res);
  467. }
  468. catch(Exception e) {
  469. e.printStackTrace();
  470. responseObserver.onNext(BreakPointReply.newBuilder().setCode(500).build());
  471. responseObserver.onCompleted();
  472. log.error("BreakPointException{}",e.getMessage());
  473. }
  474. }
  475. //操作杆
  476. @Override
  477. public void joystick(JoystickRequest request, StreamObserver<NormalReply> responseObserver) {
  478. try {
  479. log.info("进入{}",request);
  480. int actionType = request.getActionType();
  481. DirAction dirAction = request.getDirAction();
  482. String trace_id = request.getTraceId();
  483. String user_id = request.getUserId();
  484. String packet_id = request.getPacketId();
  485. ActionPO joystickPO = new ActionPO();
  486. joystickPO.setAction_type(actionType);
  487. joystickPO.setTrace_id(trace_id);
  488. joystickPO.setUser_id(user_id);
  489. joystickPO.setPacket_id(packet_id);
  490. AnglePO playerAngle = joystickPO.getPlayerAngle();
  491. playerAngle.setYaw(dirAction.getMoveAngle());
  492. joystickPO.setPlayerAngle(playerAngle);
  493. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(joystickPO));
  494. //速度不够,只是让人旋转
  495. if(dirAction.getSpeedLevel()<7){
  496. return;
  497. }
  498. UserEntity user = userService.findUserId(user_id);
  499. //邻居点里找角度最合适的点
  500. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), user.getBreakPointId());
  501. BreakpointsEntity targetBreakpointsEntity = null;
  502. List<Integer> neighBreakPointIds = breakpointsEntity.getContact();
  503. double offAngle = 1000;
  504. double moveAngle = dirAction.getMoveAngle();
  505. int playerAngleYaw = 0;
  506. if(neighBreakPointIds.size()>0){
  507. for(int j=0;j<neighBreakPointIds.size();++j){
  508. BreakpointsEntity _breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), (long)neighBreakPointIds.get(j));
  509. playerAngleYaw = sceneGrpcService.calAngleForBreakPointId(breakpointsEntity,_breakpointsEntity);
  510. if(Math.abs(playerAngleYaw - moveAngle)<offAngle){
  511. offAngle = Math.abs(playerAngleYaw - moveAngle);
  512. targetBreakpointsEntity = _breakpointsEntity;
  513. }
  514. }
  515. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  516. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  517. cameraAnglePO = setRotateForMove( user, trace_id,cameraAnglePO);
  518. JSONArray path = new JSONArray();
  519. path.add(user.getBreakPointId());
  520. path.add(targetBreakpointsEntity.getBreakPointId());
  521. ActionPO movePO = new ActionPO();
  522. movePO.setAction_type(1);
  523. movePO.setTrace_id(trace_id);
  524. movePO.setUser_id(user_id);
  525. movePO.setPath(path);
  526. playerAngle.setYaw(playerAngleYaw);
  527. movePO.setPlayerAngle(playerAngle);
  528. movePO.setCameraAngle(cameraAnglePO);
  529. int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),user.getBreakPointId(),targetBreakpointsEntity.getBreakPointId(), cameraAnglePO.getYaw()%45);
  530. movePO.setSubFrameIndex(subFrameIndex);
  531. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(movePO));
  532. }
  533. //找到与角度move_angle最近的邻居点
  534. //移动player,并且更新相机角度
  535. NormalReply.Builder builder = NormalReply.newBuilder();
  536. builder.setCode(200);
  537. responseObserver.onNext(builder.build());
  538. responseObserver.onCompleted();
  539. }
  540. catch(Exception e) {
  541. e.printStackTrace();
  542. responseObserver.onNext(NormalReply.newBuilder().setCode(500).build());
  543. responseObserver.onCompleted();
  544. log.info("joystickException{}",e.getMessage());
  545. }
  546. }
  547. @Override
  548. public void exit(ExitRequest request, StreamObserver<NormalReply> responseObserver){
  549. try{
  550. log.info("进入{}",request);
  551. //删除redis:"setCacheRequest:"+user_id
  552. redisCache.delete("setCacheRequest:"+request.getUserId());
  553. //删除redis:"UserState:"+user.getUserId()
  554. redisCache.delete("UserState:"+request.getUserId());
  555. //删除redis:"updateFrameMetadata:"+user.getUserId()
  556. redisCache.delete("updateFrameMetadata:"+request.getUserId());
  557. //删除user表的记录
  558. String user_id = request.getUserId();
  559. userService.removeByUserId(user_id);
  560. NormalReply.Builder builder = NormalReply.newBuilder();
  561. builder.setCode(200);
  562. responseObserver.onNext(builder.build());
  563. responseObserver.onCompleted();
  564. }
  565. catch(Exception e){
  566. e.printStackTrace();
  567. responseObserver.onNext(NormalReply.newBuilder().setCode(500).build());
  568. responseObserver.onCompleted();
  569. log.info("exitException{}",e.getMessage());
  570. }
  571. }
  572. private MetaDataFramePO createDefaultFrameMetadata(UserEntity user){
  573. String[] traceIds = new String[1];
  574. traceIds[0] = "";
  575. JSONArray actionResponses = new JSONArray();
  576. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  577. PointPO playerPosition = user.getPlayerPosition();
  578. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  579. AnglePO playerAngle = user.getPlayerAngle();
  580. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  581. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  582. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  583. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  584. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  585. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  586. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  587. MetaDataFramePO metaDataFramePO = new MetaDataFramePO();
  588. metaDataFramePO.setTraceIds(traceIds);
  589. metaDataFramePO.setVehicle(null);
  590. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  591. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  592. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  593. //newUserStates
  594. UserState[] newUserStates = new UserState[1];
  595. //JSONArray newUserStates = new JSONArray();
  596. newUserStates[0] = userState;
  597. metaDataFramePO.setNewUserStates(newUserStates);
  598. metaDataFramePO.setActionResponses(actionResponses);
  599. metaDataFramePO.setGetStateType(0);
  600. metaDataFramePO.setCode(0);
  601. metaDataFramePO.setMsg("");
  602. return metaDataFramePO;
  603. //redisCache.setCacheObject("updateFrameMetadata:"+user.getUserId(),metaDataFramePO);
  604. }
  605. }