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); } } }