public void SyncPlayersAsync() { foreach (var kv in objects) { var id = kv.Key; var data = kv.Value; var body = data.rb; var pos = body.Position; var vel = body.LinearVelocity; var ori = body.Orientation; var ang_vel = body.AngularVelocity; var pos_distance = VectorOps.Distance(data.last_pos, pos); var vel_distance = VectorOps.Distance(data.last_vel, vel); var ang_distance = VectorOps.Distance(data.last_ang_vel, vel); if (pos_distance > 0.1f || vel_distance > 0.1f || MatrixOps.CmpExact(data.last_ori, ori) || //TODO: Do some approximation ang_distance > 0.1f) { data.last_pos = body.Position; data.last_vel = body.LinearVelocity; data.last_ori = body.Orientation; data.last_ang_vel = body.AngularVelocity; var ev = new Event3D { ObjectTransformChanged = new Event3D_ObjectTransformChanged { Id = id, NewTransform = new Transform { Position = ArenaServiceConv.ToArenaData(pos), Velocity = ArenaServiceConv.ToArenaData(vel), Rotation = ArenaServiceConv.ToArenaData(ori), AngularVelocity = ArenaServiceConv.ToArenaData(ang_vel) } } }; send_to_all_players(ev); } } }
private void send_spawned_objects_to_player(Player player) { foreach (var kv in objects) { if (kv.Key >= startobject_high_edge) //Is a spawned object { var ev = new Event3D { ObjectNotification = new Event3D_ObjectNotification { Id = kv.Key, SpawnId = kv.Value.spawn_id, Spawn = false, Transform = ArenaServiceConv.ToArenaTransform(kv.Value.rb) } }; send_to_all_players(ev); } } }
private Task subscription_handler(Event3D ev) { switch (ev.EventCase) { case Event3D.EventOneofCase.None: Debug.LogError("Got event without any event case"); break; case Event3D.EventOneofCase.ObjectTransformChanged: OnMainThread(() => OnTransformChanged(ev.ObjectTransformChanged)); break; case Event3D.EventOneofCase.ObjectNotification: OnMainThread(() => OnObjectNotification(ev.ObjectNotification)); break; default: throw new Exception("Unhandled enum value " + ev.EventCase); } return(null); }
/// <summary> /// Single threaded. /// </summary> /// <param name="spawnable_idx"></param> /// <returns></returns> protected KeyValuePair <int, RigidBody> SpawnObject(int spawnable_idx, JVector?pos = null, JVector?vel = null, JQuaternion?ori = null) { var rb = new RigidBody(spawnable_rigid_bodies[spawnable_idx].Shape); if (pos.HasValue) { rb.Position = pos.Value; } if (vel.HasValue) { rb.LinearVelocity = vel.Value; } if (ori.HasValue) { rb.Orientation = JMatrix.CreateFromQuaternion(ori.Value); } for (;;) { var id = random.Next(startobject_high_edge, int.MaxValue); if (!objects.ContainsKey(id)) { add_to_world(id, spawnable_idx, rb); var ev = new Event3D { ObjectNotification = new Event3D_ObjectNotification { Id = id, SpawnId = spawnable_idx, Spawn = true, Transform = ArenaServiceConv.ToArenaTransform(rb) } }; send_to_all_players(ev); return(new KeyValuePair <int, RigidBody>(id, rb)); } } }
private void send_to_all_players_in_list(AtomicData <List <Player> > players, Event3D ev) { players.Access((list) => { foreach (var player in list) { player.stream_3d.Enqueue(ev); } }); }
private void send_to_all_players(Event3D ev) { send_to_all_players_in_list(left_players, ev); send_to_all_players_in_list(right_players, ev); }