//版本
syntax = "proto3";
package scene;
option java_multiple_files = true;
// grpc插件生成的类的报名，随便写
option java_package = "com.fdkk.fdkkmeta.grpc";

// grpc的方法
service SceneGrpcService {
  // rpc testMethod (SceneRequest) returns (SceneReply){}
  rpc getRoute (RouteRequest) returns (RouteReply){}
  rpc init (InitRequest) returns (NormalReply){}
  rpc rotate (RotateRequest) returns (NormalReply){}
  rpc move (MoveRequest) returns (MoveReply){}
  rpc getBreakPoint (BreakPointRequest) returns (BreakPointReply){}
  rpc joystick (JoystickRequest) returns (NormalReply){} //操作杆
}
// 全局对象
message Point {
  string x=1;     //应该换成double
  string y=2;
  string z=3;
}

// 全局对象
message AngleUe4 {
  int32 pitch=1;
  int32 yaw=2;
  int32 roll=3;
}

// 全局对象
message RouteArray{
  int32 id=1;
  Point location=2;
}

// getRoute入参对象
message RouteRequest {
  Point s_location=1;
  Point e_location=2;
  string sceneCode=3;
}

// getRoute出参对象
message RouteReply{
  repeated RouteArray in=1;
}

// // 入参对象
// message SceneRequest {
//   string id=1;
//   string name=2;
// }
// // 出参对象
// message SceneReply {
//   string res=1;
// }

/***********************************************************/
message Space {
   Point position=1;
   AngleUe4 angle=2;
}

message State {
   string roomTypeId=1;
   int32 person=2;
   string avatarId=3;
   string skinId=4;
   string roomId=5;
   bool isHost=6;
   bool isFollowHost=7;
   string skinDataVersion=8;
   string avatarComponents=9;
   string nickName=10;
   int32 movingMode=11;
   string attitude=12;
   string areaName=13;
   string pathName=14;
   string pathId=15;
   int32 avatarSize=16;
   string extra=17;
   bool prioritySync=18;
   Space player=19;
   Space camera=20;
   Point cameraCenter=21;
}

message RenderInfo{
   int32 renderType=1;
   string videoFrame=2;
   int32 cameraStateType=3;
   int32 isMoving=4;
   int32 needIfr=5;
   int32 isVideo=6;
   int32 stillFrame=7;
   int32 isRotating=8;
   int32 isFollowing=9;
   repeated string clientPanoTitlesBitmap=10;
   string clientPanoTreceId=11;
   string prefetchVideoId=12;
   bool noMedia=13;
} 

message Event{
   string id=1;
   int32 type =2;
   repeated Point points=3;
   string rotateEvent=4;
   string removeVisitorEvent=5;
}

message UserState{
   string userId=1;
   State playerState=2;
   RenderInfo renderInfo=3;
   Event event=4;
   int32 relation=5;
}
/***********************************************************/

// init入参对象
message InitRequest {
  string user_id=1;
  string nick_name=2;
  string skin_id=3;
  string avatar_id=4;
  string room_id=5;
  string app_id=6;
}

/**********************************************************/
//全局对象，旋转的参数
message rotation_action{
  int32 vertical_move=1;
  double horizontal_move=2;
}

// rotate入参对象
message RotateRequest {
  int32 action_type=1;
  string rotation_action=2;
  string trace_id=3;
  string user_id=4;
}

/**********************************************************/
//正常的反馈
message NormalReply {
   repeated string traceIds=1;
   string vehicle=2;
   repeated UserState newUserStates=3;
   repeated int32 actionResponses=4;
   int32 getStateType=5;
   int32 code=6;
   string msg=7;
   string frameSrc=8;              //视频路径
}

/**********************************************************/
//
message ClickingAction {
   Point clicking_point=1;
   int32 clicking_type=2;
   string extra=3;
   string attitude=4;
}
message MoveRequest {
  int32 action_type=1;
  ClickingAction clicking_action=2;
  State clicking_state=3;
  string trace_id=4;
  string user_id=5;
}

// 开始请求漫游
message StartMoveRequest {
  int32 action_type=1;
  ClickingAction clicking_action=2;
  State clicking_state=3;
  string trace_id=4;
  string user_id=5;
}

// 请求移动下一段
message MoveNextNeighborRequest {
  int32 user_id=1;
  string trace_id=2;
  bool next=3;
}

// 结束移动下一段（一般是有新的请求）
message EndMoveNextNeighborRequest {
  int32 user_id=1;
  string trace_id=2;
  bool next=3;
}

// move出参对象
// 这需要自定义
message MoveReply {
   repeated string traceIds=1;
   string vehicle=2;
   repeated UserState newUserStates=3;      //自己的话，不要有player,camera和cameraCenter。自己对应的这三个属性在8，9，10上，到webrtc服务器上组装
   repeated int32 actionResponses=4;
   int32 getStateType=5;
   int32 code=6;
   string msg=7;
   //每一段的人物和相机坐标，第一段可能还有初始旋转
   repeated Space player=8;
   repeated Space camera=9;
   repeated Point cameraCenter=10;
   bool isEnd=11;     //false表示可以继续移动，true表示这次移动已经结束
}
/**********************************************************/

/**********************************************************/
message DirAction{
  int32 move_angle=1;
  int32 speed_level=2;
}

//控制杆移动
message JoystickRequest {
  int32 action_type=1;
  DirAction dir_action=2;
  string trace_id=3;
  string user_id=4;
  string packet_id=5;
}
/**********************************************************/

/**********************************************************/
message NeighborPointsAction{
  Point point=1;
  int32 level=2;
  bool containSelf=3;
  int32 searchRange=4;
}

// move入参对象
message BreakPointRequest{
  int32 action_type=1;
  NeighborPointsAction get_neighbor_points_action=2;
  string trace_id=3;
  string user_id=4;
}
// move出参对象
message BreakPointReply {
  int32 actionType=1;
  int32 pointType=2;
  string extra=3;
  string traceId=4;
  string packetId=5;
  repeated Point nps=6;
  int32 peopleNum=7;
  string zoneId=8;
  string echoMsg=9;
  string reserveDetail=10;
  repeated string userWithAvatarList=11;
  repeated UserState newUserStates=12;
  int32 code=13;
  string msg=14;
}
/**********************************************************/