Ejemplo n.º 1
0
 public static Task <List <PContact> > GetContactsAsync(CancellationToken token)
 {
     return(Task.Run(() =>
     {
         List <PContact> contacts = new List <PContact>();
         try
         {
             using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
             {
                 token.ThrowIfCancellationRequested();
                 var fileNames = store.GetFileNames(Directories.Contacts + "\\*");
                 foreach (var fileName in fileNames)
                 {
                     token.ThrowIfCancellationRequested();
                     string filePath = Path.Combine(Directories.Contacts, fileName);
                     StoredContact scontact = new StoredContact(null); // (await DeserializeAndOpenAsync(filePath, FileMode.Open, FileAccess.ReadWrite)) as StoredContact;
                     token.ThrowIfCancellationRequested();
                     PContact contact = new PContact();
                     contact.Name = fileName;
                     contact.Path = filePath;
                     contact.Contact = scontact;
                     token.ThrowIfCancellationRequested();
                     contacts.Add(contact);
                 }
             }
             token.ThrowIfCancellationRequested();
             return contacts;
         }
         catch
         {
             return contacts;
         }
     }, token));
 }
Ejemplo n.º 2
0
		public PContact[] GetContacts() {
			PContact[] c = new PContact[numContacts];
			for (int i = 0; i < numContacts; i++)
				c[i] = cs[i];
	
			return c;
		}
Ejemplo n.º 3
0
		public PSolver(PShape shape1, PShape shape2, PContact[] contacts, int num) {
			s1 = shape1;
			s2 = shape2;
			b1 = s1._parent;
			b2 = s2._parent;
			fric = (float) System.Math.Sqrt(s1._fric * s2._fric);
			rest = (float) System.Math.Sqrt(s1._rest * s2._rest);
			cs = contacts;
			numContacts = num;
			for (int i = 0; i < numContacts; i++) {
				PContact c = cs[i];
				c.rel1 = c.pos.Sub(b1.pos);
				c.rel2 = c.pos.Sub(b2.pos);
				c.massN = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
						c.normal);
				c.massT = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
						c.tangent);
				c.relVel = PTransformer
						.CalcRelativeVelocity(b1, b2, c.rel1, c.rel2);
				float rvn = c.relVel.Dot(c.normal);
				if (rvn < -0.5F)
					c.targetVelocity = System.Math.Max(rest * -rvn,0.0F);
				else
					c.targetVelocity = 0.0F;
				c.tangent.Set(c.normal.y, -c.normal.x);
				c.localRel1.Set(c.rel1.x, c.rel1.y);
				c.localRel2.Set(c.rel2.x, c.rel2.y);
				b1.mAng.Transpose().MulEqual(c.localRel1);
				b2.mAng.Transpose().MulEqual(c.localRel2);
			}
	
		}
Ejemplo n.º 4
0
        public PContact[] GetContacts()
        {
            PContact[] c = new PContact[numContacts];
            for (int i = 0; i < numContacts; i++)
            {
                c[i] = cs[i];
            }

            return(c);
        }
Ejemplo n.º 5
0
		public virtual int Collide(PShape s1, PShape s2, PContact[] cs) {
			PCollider collider = null;
			bool flip = false;
			switch (s1._type) {
			case Physics.PShapeType.BOX_SHAPE:
			case Physics.PShapeType.CONVEX_SHAPE:
				switch (s2._type) {
				case Physics.PShapeType.BOX_SHAPE:
				case Physics.PShapeType.CONVEX_SHAPE:
					collider = new PPolygonPolygonCollider();
					break;
				case Physics.PShapeType.CIRCLE_SHAPE:
					collider = new PCirclePolygonCollider();
					flip = true;
					break;
				case Physics.PShapeType.CONCAVE_SHAPE:
				default:
					break;
				}
				break;
			case Physics.PShapeType.CIRCLE_SHAPE:
				switch (s2._type) {
				case Physics.PShapeType.BOX_SHAPE:
				case Physics.PShapeType.CONVEX_SHAPE:
					collider = new PCirclePolygonCollider();
					break;
				case Physics.PShapeType.CIRCLE_SHAPE:
					collider = new PCircleCirlceCollider();
					break;
				case Physics.PShapeType.CONCAVE_SHAPE:
				default:
					break;
				}
				break;
			case Physics.PShapeType.CONCAVE_SHAPE:
			default:
				break;
			}
			if (collider == null) {
				return 0;
			}
			if (flip) {
				int res = collider.Collide(s2, s1, cs);
				if (res > 0) {
					for (int i = 0; i < res; i++) {
						cs[i].normal.NegateLocal();
					}
				}
				return res;
			}
			return collider.Collide(s1, s2, cs);
		}
Ejemplo n.º 6
0
 internal void PreSolve()
 {
     rem = true;
     for (int i = 0; i < numContacts; i++)
     {
         PContact c = cs[i];
         b1.ApplyImpulse(c.normal.x * c.norI + c.tangent.x * c.tanI,
                         c.normal.y * c.norI + c.tangent.y * c.tanI, c.pos.x,
                         c.pos.y);
         b2.ApplyImpulse(c.normal.x * -c.norI + c.tangent.x * -c.tanI,
                         c.normal.y * -c.norI + c.tangent.y * -c.tanI, c.pos.x,
                         c.pos.y);
         c.corI = 0.0F;
     }
 }
Ejemplo n.º 7
0
 internal void SolvePosition()
 {
     for (int i = 0; i < numContacts; i++)
     {
         PContact c = cs[i];
         c.relPosVel = PTransformer.CalcRelativeCorrectVelocity(b1, b2,
                                                                c.rel1, c.rel2);
         float rvn         = c.normal.Dot(c.relPosVel);
         float subCorrectI = -c.massN * 0.2F * (rvn + c.overlap + 0.002F);
         float newCorrectI = Max(c.corI + subCorrectI, 0.0F);
         subCorrectI = newCorrectI - c.corI;
         float forceX = c.normal.x * subCorrectI;
         float forceY = c.normal.y * subCorrectI;
         b1.PositionCorrection(forceX, forceY, c.pos.x, c.pos.y);
         b2.PositionCorrection(-forceX, -forceY, c.pos.x, c.pos.y);
         c.corI = newCorrectI;
     }
 }
Ejemplo n.º 8
0
        internal void Update(PContact[] contacts, int num)
        {
            PContact[] old            = cs;
            int        oldNumContacts = numContacts;

            fric        = (float)System.Math.Sqrt(s1._fric * s2._fric);
            rest        = (float)System.Math.Sqrt(s1._rest * s2._rest);
            cs          = contacts;
            numContacts = num;
            for (int i = 0; i < numContacts; i++)
            {
                PContact c = cs[i];
                c.rel1  = c.pos.Sub(b1.pos);
                c.rel2  = c.pos.Sub(b2.pos);
                c.massN = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                         c.normal);
                c.massT = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                         c.tangent);
                c.tangent.Set(c.normal.y, -c.normal.x);
                c.localRel1.Set(c.rel1.x, c.rel1.y);
                c.localRel2.Set(c.rel2.x, c.rel2.y);
                b1.mAng.Transpose().MulEqual(c.localRel1);
                b2.mAng.Transpose().MulEqual(c.localRel2);
            }

            for (int i_0 = 0; i_0 < oldNumContacts; i_0++)
            {
                for (int j = 0; j < numContacts; j++)
                {
                    if (old[i_0].data.id == cs[j].data.id &&
                        old[i_0].data.flip == cs[j].data.flip)
                    {
                        cs[j].norI = old[i_0].norI;
                        cs[j].tanI = old[i_0].tanI;
                    }
                }
            }

            rem = false;
        }
Ejemplo n.º 9
0
 public PSolver(PShape shape1, PShape shape2, PContact[] contacts, int num)
 {
     s1          = shape1;
     s2          = shape2;
     b1          = s1._parent;
     b2          = s2._parent;
     fric        = (float)System.Math.Sqrt(s1._fric * s2._fric);
     rest        = (float)System.Math.Sqrt(s1._rest * s2._rest);
     cs          = contacts;
     numContacts = num;
     for (int i = 0; i < numContacts; i++)
     {
         PContact c = cs[i];
         c.rel1  = c.pos.Sub(b1.pos);
         c.rel2  = c.pos.Sub(b2.pos);
         c.massN = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                  c.normal);
         c.massT = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                  c.tangent);
         c.relVel = PTransformer
                    .CalcRelativeVelocity(b1, b2, c.rel1, c.rel2);
         float rvn = c.relVel.Dot(c.normal);
         if (rvn < -0.5F)
         {
             c.targetVelocity = System.Math.Max(rest * -rvn, 0.0F);
         }
         else
         {
             c.targetVelocity = 0.0F;
         }
         c.tangent.Set(c.normal.y, -c.normal.x);
         c.localRel1.Set(c.rel1.x, c.rel1.y);
         c.localRel2.Set(c.rel2.x, c.rel2.y);
         b1.mAng.Transpose().MulEqual(c.localRel1);
         b2.mAng.Transpose().MulEqual(c.localRel2);
     }
 }
Ejemplo n.º 10
0
        internal void SolveVelocity()
        {
            for (int i = 0; i < numContacts; i++)
            {
                PContact c = cs[i];
                c.relVel = PTransformer
                           .CalcRelativeVelocity(b1, b2, c.rel1, c.rel2);
                float rvn        = c.normal.x * c.relVel.x + c.normal.y * c.relVel.y;
                float subNormalI = -c.massN * (rvn - c.targetVelocity);
                float newNormalI = Max(c.norI + subNormalI, 0.0F);
                subNormalI = newNormalI - c.norI;
                float forceX = c.normal.x * subNormalI;
                float forceY = c.normal.y * subNormalI;
                b1.ApplyImpulse(forceX, forceY, c.pos.x, c.pos.y);
                b2.ApplyImpulse(-forceX, -forceY, c.pos.x, c.pos.y);
                c.norI = newNormalI;
            }

            for (int i_0 = 0; i_0 < numContacts; i_0++)
            {
                PContact c_1 = cs[i_0];
                c_1.relVel = PTransformer
                             .CalcRelativeVelocity(b1, b2, c_1.rel1, c_1.rel2);
                float rvt         = c_1.tangent.x * c_1.relVel.x + c_1.tangent.y * c_1.relVel.y;
                float maxFriction = c_1.norI * fric;
                float subTangentI = c_1.massT * -rvt;
                float newTangentI = Clamp(c_1.tanI + subTangentI, -maxFriction,
                                          maxFriction);
                subTangentI = newTangentI - c_1.tanI;
                float forceX_2 = c_1.tangent.x * subTangentI;
                float forceY_3 = c_1.tangent.y * subTangentI;
                b1.ApplyImpulse(forceX_2, forceY_3, c_1.pos.x, c_1.pos.y);
                b2.ApplyImpulse(-forceX_2, -forceY_3, c_1.pos.x, c_1.pos.y);
                c_1.tanI = newTangentI;
            }
        }
Ejemplo n.º 11
0
        public async static Task SaveItems(List <Models.CollectionControlModel> list)
        {
            var data = list.First().Data;

            if (data is PictureAlbum)
            {
                foreach (var album in list)
                {
                    var pictureAlbum = album.Data as PictureAlbum;
                    if (await CreatePhotoAlbumAsync(pictureAlbum.Name, pictureAlbum.Pictures.First().GetThumbnail()))
                    {
                        List <PPhoto> photos = new List <PPhoto>();
                        foreach (var picture in pictureAlbum.Pictures)
                        {
                            PPhoto photo = new PPhoto();
                            photo.AlbumName = pictureAlbum.Name;
                            photo.Name      = picture.Name;
                            photo.Path      = Path.Combine(Directories.AlbumRoot, photo.AlbumName, photo.Name);
                            await Task.Run(async() =>
                            {
                                using (var source = picture.GetImage())
                                {
                                    byte[] arr = new byte[source.Length];
                                    await source.ReadAsync(arr, 0, arr.Length);
                                    photo.Data = new MemoryStream();
                                    await photo.Data.WriteAsync(arr, 0, arr.Length);
                                }
                            });

                            photos.Add(photo);
                        }
                        await FileManager.AddPhotosAsync(photos, CancellationToken.None);
                    }
                    else
                    {
                        ShellToast toast = new ShellToast();
                        toast.Content = "Album is already imported";
                    }
                }
            }
            else
            {
                if (data is Picture)
                {
                    string albumName = (data as Picture).Album.Name;
                    if (!PhotoAlbumExcists(albumName))
                    {
                        await CreatePhotoAlbumAsync(albumName, (data as Picture).GetThumbnail());
                    }
                    List <PPhoto> photos = new List <PPhoto>();
                    foreach (var p in list)
                    {
                        Picture picture = p.Data as Picture;
                        PPhoto  photo   = new PPhoto();
                        photo.AlbumName = albumName;
                        photo.Name      = picture.Name;
                        photo.Path      = Path.Combine(Directories.AlbumRoot, photo.AlbumName, photo.Name);
                        await Task.Run(async() =>
                        {
                            using (var source = picture.GetImage())
                            {
                                byte[] arr = new byte[source.Length];
                                await source.ReadAsync(arr, 0, arr.Length);
                                photo.Data = new MemoryStream();
                                await photo.Data.WriteAsync(arr, 0, arr.Length);
                            }
                        });

                        photos.Add(photo);
                    }
                    await FileManager.AddPhotosAsync(photos, CancellationToken.None);
                }
                else
                {
                    if (data is StoredContact)
                    {
                        List <PContact> contacts = new List <PContact>();
                        foreach (var c in list)
                        {
                            var      contact = c.Data as StoredContact;
                            PContact pc      = new PContact();
                            pc.Name    = contact.DisplayName;
                            pc.Path    = Path.Combine(Directories.Contacts, pc.Name);
                            pc.Contact = contact;
                            contacts.Add(pc);
                        }
                        FileManager.AddContactsAsync(contacts, CancellationToken.None);
                    }
                }
            }
        }
Ejemplo n.º 12
0
		internal void Update(PContact[] contacts, int num) {
			PContact[] old = cs;
			int oldNumContacts = numContacts;
			fric = (float) System.Math.Sqrt(s1._fric * s2._fric);
			rest = (float) System.Math.Sqrt(s1._rest * s2._rest);
			cs = contacts;
			numContacts = num;
			for (int i = 0; i < numContacts; i++) {
				PContact c = cs[i];
				c.rel1 = c.pos.Sub(b1.pos);
				c.rel2 = c.pos.Sub(b2.pos);
				c.massN = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
						c.normal);
				c.massT = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
						c.tangent);
				c.tangent.Set(c.normal.y, -c.normal.x);
				c.localRel1.Set(c.rel1.x, c.rel1.y);
				c.localRel2.Set(c.rel2.x, c.rel2.y);
				b1.mAng.Transpose().MulEqual(c.localRel1);
				b2.mAng.Transpose().MulEqual(c.localRel2);
			}
	
			for (int i_0 = 0; i_0 < oldNumContacts; i_0++) {
				for (int j = 0; j < numContacts; j++)
					if (old[i_0].data.id == cs[j].data.id
							&& old[i_0].data.flip == cs[j].data.flip) {
						cs[j].norI = old[i_0].norI;
						cs[j].tanI = old[i_0].tanI;
					}
	
			}
	
			rem = false;
		}