Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(360)

Side by Side Diff: lib/src/particle/particle_system.dart

Issue 1138063003: pkg/box2d: 0.2.0 release (Closed) Base URL: https://github.com/google/dbox2d.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/src/dynamics/world.dart ('k') | lib/src/particle/stack_queue.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /******************************************************************************* 1 /*******************************************************************************
2 * Copyright (c) 2015, Daniel Murphy, Google 2 * Copyright (c) 2015, Daniel Murphy, Google
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without modificati on, 5 * Redistribution and use in source and binary forms, with or without modificati on,
6 * are permitted provided that the following conditions are met: 6 * are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright notice, 7 * * Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer. 8 * this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright notice, 9 * * Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation 10 * this list of conditions and the following disclaimer in the documentation
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 int a = system.proxyBuffer[proxy].index; 171 int a = system.proxyBuffer[proxy].index;
172 Vector2 ap = system.positionBuffer.data[a]; 172 Vector2 ap = system.positionBuffer.data[a];
173 if (aabblowerBoundx <= ap.x && 173 if (aabblowerBoundx <= ap.x &&
174 ap.x <= aabbupperBoundx && 174 ap.x <= aabbupperBoundx &&
175 aabblowerBoundy <= ap.y && 175 aabblowerBoundy <= ap.y &&
176 ap.y <= aabbupperBoundy) { 176 ap.y <= aabbupperBoundy) {
177 double d; 177 double d;
178 final Vector2 n = _tempVec; 178 final Vector2 n = _tempVec;
179 d = fixture.computeDistance(ap, childIndex, n); 179 d = fixture.computeDistance(ap, childIndex, n);
180 if (d < system.particleDiameter) { 180 if (d < system.particleDiameter) {
181 double invAm = (system.flagsBuffer.data[a] & 181 double invAm =
182 ParticleType.b2_wallParticle) != 182 (system.flagsBuffer.data[a] & ParticleType.b2_wallParticle) != 0
183 0 ? 0 : system.getParticleInvMass(); 183 ? 0
184 : system.getParticleInvMass();
184 final double rpx = ap.x - bp.x; 185 final double rpx = ap.x - bp.x;
185 final double rpy = ap.y - bp.y; 186 final double rpy = ap.y - bp.y;
186 double rpn = rpx * n.y - rpy * n.x; 187 double rpn = rpx * n.y - rpy * n.x;
187 if (system.bodyContactCount >= system.bodyContactCapacity) { 188 if (system.bodyContactCount >= system.bodyContactCapacity) {
188 int oldCapacity = system.bodyContactCapacity; 189 int oldCapacity = system.bodyContactCapacity;
189 int newCapacity = system.bodyContactCount != 0 190 int newCapacity = system.bodyContactCount != 0
190 ? 2 * system.bodyContactCount 191 ? 2 * system.bodyContactCount
191 : Settings.minParticleBufferCapacity; 192 : Settings.minParticleBufferCapacity;
192 system.bodyContactBuffer = BufferUtils 193 system.bodyContactBuffer = BufferUtils.reallocateBufferWithAlloc(
193 .reallocateBufferWithAlloc(system.bodyContactBuffer, 194 system.bodyContactBuffer, oldCapacity, newCapacity,
194 oldCapacity, newCapacity, allocParticleBodyContact); 195 allocParticleBodyContact);
195 system.bodyContactCapacity = newCapacity; 196 system.bodyContactCapacity = newCapacity;
196 } 197 }
197 ParticleBodyContact contact = 198 ParticleBodyContact contact =
198 system.bodyContactBuffer[system.bodyContactCount]; 199 system.bodyContactBuffer[system.bodyContactCount];
199 contact.index = a; 200 contact.index = a;
200 contact.body = b; 201 contact.body = b;
201 contact.weight = 1 - d * system.inverseDiameter; 202 contact.weight = 1 - d * system.inverseDiameter;
202 contact.normal.x = -n.x; 203 contact.normal.x = -n.x;
203 contact.normal.y = -n.y; 204 contact.normal.y = -n.y;
204 contact.mass = 1 / (invAm + invBm + invBI * rpn * rpn); 205 contact.mass = 1 / (invAm + invBm + invBI * rpn * rpn);
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 capacity = limitCapacity(capacity, colorBuffer.userSuppliedCapacity); 564 capacity = limitCapacity(capacity, colorBuffer.userSuppliedCapacity);
564 capacity = limitCapacity(capacity, userDataBuffer.userSuppliedCapacity); 565 capacity = limitCapacity(capacity, userDataBuffer.userSuppliedCapacity);
565 if (internalAllocatedCapacity < capacity) { 566 if (internalAllocatedCapacity < capacity) {
566 flagsBuffer.data = reallocateBufferInt( 567 flagsBuffer.data = reallocateBufferInt(
567 flagsBuffer, internalAllocatedCapacity, capacity, false); 568 flagsBuffer, internalAllocatedCapacity, capacity, false);
568 positionBuffer.data = reallocateBuffer( 569 positionBuffer.data = reallocateBuffer(
569 positionBuffer, internalAllocatedCapacity, capacity, false); 570 positionBuffer, internalAllocatedCapacity, capacity, false);
570 velocityBuffer.data = reallocateBuffer( 571 velocityBuffer.data = reallocateBuffer(
571 velocityBuffer, internalAllocatedCapacity, capacity, false); 572 velocityBuffer, internalAllocatedCapacity, capacity, false);
572 accumulationBuffer = BufferUtils.reallocateBufferFloat64Deferred( 573 accumulationBuffer = BufferUtils.reallocateBufferFloat64Deferred(
573 accumulationBuffer, 0, internalAllocatedCapacity, capacity, 574 accumulationBuffer, 0, internalAllocatedCapacity, capacity, false);
574 false);
575 accumulation2Buffer = BufferUtils.reallocateBufferWithAllocDeferred( 575 accumulation2Buffer = BufferUtils.reallocateBufferWithAllocDeferred(
576 accumulation2Buffer, 0, internalAllocatedCapacity, capacity, 576 accumulation2Buffer, 0, internalAllocatedCapacity, capacity, true,
577 true, allocVec2); 577 allocVec2);
578 depthBuffer = BufferUtils.reallocateBufferFloat64Deferred( 578 depthBuffer = BufferUtils.reallocateBufferFloat64Deferred(
579 depthBuffer, 0, internalAllocatedCapacity, capacity, true); 579 depthBuffer, 0, internalAllocatedCapacity, capacity, true);
580 colorBuffer.data = reallocateBuffer( 580 colorBuffer.data = reallocateBuffer(
581 colorBuffer, internalAllocatedCapacity, capacity, true); 581 colorBuffer, internalAllocatedCapacity, capacity, true);
582 groupBuffer = BufferUtils.reallocateBufferWithAllocDeferred( 582 groupBuffer = BufferUtils.reallocateBufferWithAllocDeferred(groupBuffer,
583 groupBuffer, 0, internalAllocatedCapacity, capacity, false, 583 0, internalAllocatedCapacity, capacity, false, allocParticleGroup);
584 allocParticleGroup);
585 userDataBuffer.data = reallocateBuffer( 584 userDataBuffer.data = reallocateBuffer(
586 userDataBuffer, internalAllocatedCapacity, capacity, true); 585 userDataBuffer, internalAllocatedCapacity, capacity, true);
587 internalAllocatedCapacity = capacity; 586 internalAllocatedCapacity = capacity;
588 } 587 }
589 } 588 }
590 if (count >= internalAllocatedCapacity) { 589 if (count >= internalAllocatedCapacity) {
591 return Settings.invalidParticleIndex; 590 return Settings.invalidParticleIndex;
592 } 591 }
593 int index = count++; 592 int index = count++;
594 flagsBuffer.data[index] = def.flags; 593 flagsBuffer.data[index] = def.flags;
595 positionBuffer.data[index].setFrom(def.position); 594 positionBuffer.data[index].setFrom(def.position);
596 // assertNotSamePosition(); 595 // assertNotSamePosition();
597 velocityBuffer.data[index].setFrom(def.velocity); 596 velocityBuffer.data[index].setFrom(def.velocity);
598 groupBuffer[index] = null; 597 groupBuffer[index] = null;
599 if (depthBuffer != null) { 598 if (depthBuffer != null) {
600 depthBuffer[index] = 0.0; 599 depthBuffer[index] = 0.0;
601 } 600 }
602 if (colorBuffer.data != null || def.color != null) { 601 if (colorBuffer.data != null || def.color != null) {
603 colorBuffer.data = 602 colorBuffer.data =
604 requestParticleBuffer(colorBuffer.data, colorBuffer.allocClosure); 603 requestParticleBuffer(colorBuffer.data, colorBuffer.allocClosure);
605 colorBuffer.data[index].setParticleColor(def.color); 604 colorBuffer.data[index].setParticleColor(def.color);
606 } 605 }
607 if (userDataBuffer.data != null || def.userData != null) { 606 if (userDataBuffer.data != null || def.userData != null) {
608 userDataBuffer.data = requestParticleBuffer( 607 userDataBuffer.data = requestParticleBuffer(
609 userDataBuffer.data, userDataBuffer.allocClosure); 608 userDataBuffer.data, userDataBuffer.allocClosure);
610 userDataBuffer.data[index] = def.userData; 609 userDataBuffer.data[index] = def.userData;
611 } 610 }
612 if (proxyCount >= proxyCapacity) { 611 if (proxyCount >= proxyCapacity) {
613 int oldCapacity = proxyCapacity; 612 int oldCapacity = proxyCapacity;
614 int newCapacity = proxyCount != 0 613 int newCapacity =
615 ? 2 * proxyCount 614 proxyCount != 0 ? 2 * proxyCount : Settings.minParticleBufferCapacity;
616 : Settings.minParticleBufferCapacity;
617 proxyBuffer = BufferUtils.reallocateBufferWithAlloc( 615 proxyBuffer = BufferUtils.reallocateBufferWithAlloc(
618 proxyBuffer, oldCapacity, newCapacity, allocPsProxy); 616 proxyBuffer, oldCapacity, newCapacity, allocPsProxy);
619 proxyCapacity = newCapacity; 617 proxyCapacity = newCapacity;
620 } 618 }
621 proxyBuffer[proxyCount++].index = index; 619 proxyBuffer[proxyCount++].index = index;
622 return index; 620 return index;
623 } 621 }
624 622
625 // reallocate a buffer 623 // reallocate a buffer
626 static List reallocateBuffer( 624 static List reallocateBuffer(
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 contact.normal.y = invD * dy; 1010 contact.normal.y = invD * dy;
1013 contactCount++; 1011 contactCount++;
1014 } 1012 }
1015 } 1013 }
1016 1014
1017 void updateContacts(bool exceptZombie) { 1015 void updateContacts(bool exceptZombie) {
1018 for (int p = 0; p < proxyCount; p++) { 1016 for (int p = 0; p < proxyCount; p++) {
1019 PsProxy proxy = proxyBuffer[p]; 1017 PsProxy proxy = proxyBuffer[p];
1020 int i = proxy.index; 1018 int i = proxy.index;
1021 Vector2 pos = positionBuffer.data[i]; 1019 Vector2 pos = positionBuffer.data[i];
1022 proxy.tag = 1020 proxy.tag = computeTag(inverseDiameter * pos.x, inverseDiameter * pos.y);
1023 computeTag(inverseDiameter * pos.x, inverseDiameter * pos.y);
1024 } 1021 }
1025 BufferUtils.sort(proxyBuffer, 0, proxyCount); 1022 BufferUtils.sort(proxyBuffer, 0, proxyCount);
1026 contactCount = 0; 1023 contactCount = 0;
1027 int c_index = 0; 1024 int c_index = 0;
1028 for (int i = 0; i < proxyCount; i++) { 1025 for (int i = 0; i < proxyCount; i++) {
1029 PsProxy a = proxyBuffer[i]; 1026 PsProxy a = proxyBuffer[i];
1030 int rightTag = computeRelativeTag(a.tag, 1, 0); 1027 int rightTag = computeRelativeTag(a.tag, 1, 0);
1031 for (int j = i + 1; j < proxyCount; j++) { 1028 for (int j = i + 1; j < proxyCount; j++) {
1032 PsProxy b = proxyBuffer[j]; 1029 PsProxy b = proxyBuffer[j];
1033 if (rightTag < b.tag) { 1030 if (rightTag < b.tag) {
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 final Vector2 vb = velocityBuffer.data[b]; 1435 final Vector2 vb = velocityBuffer.data[b];
1439 va.x -= fx; 1436 va.x -= fx;
1440 va.y -= fy; 1437 va.y -= fy;
1441 vb.x += fx; 1438 vb.x += fx;
1442 vb.y += fy; 1439 vb.y += fy;
1443 } 1440 }
1444 } 1441 }
1445 } 1442 }
1446 1443
1447 void solveTensile(final TimeStep step) { 1444 void solveTensile(final TimeStep step) {
1448 accumulation2Buffer = 1445 accumulation2Buffer = requestParticleBuffer(accumulation2Buffer, allocVec2);
1449 requestParticleBuffer(accumulation2Buffer, allocVec2);
1450 for (int i = 0; i < count; i++) { 1446 for (int i = 0; i < count; i++) {
1451 accumulationBuffer[i] = 0.0; 1447 accumulationBuffer[i] = 0.0;
1452 accumulation2Buffer[i].setZero(); 1448 accumulation2Buffer[i].setZero();
1453 } 1449 }
1454 for (int k = 0; k < contactCount; k++) { 1450 for (int k = 0; k < contactCount; k++) {
1455 final ParticleContact contact = contactBuffer[k]; 1451 final ParticleContact contact = contactBuffer[k];
1456 if ((contact.flags & ParticleType.b2_tensileParticle) != 0) { 1452 if ((contact.flags & ParticleType.b2_tensileParticle) != 0) {
1457 int a = contact.indexA; 1453 int a = contact.indexA;
1458 int b = contact.indexB; 1454 int b = contact.indexB;
1459 double w = contact.weight; 1455 double w = contact.weight;
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1666 newIndices[i] = newCount; 1662 newIndices[i] = newCount;
1667 if (i != newCount) { 1663 if (i != newCount) {
1668 flagsBuffer.data[newCount] = flagsBuffer.data[i]; 1664 flagsBuffer.data[newCount] = flagsBuffer.data[i];
1669 positionBuffer.data[newCount].setFrom(positionBuffer.data[i]); 1665 positionBuffer.data[newCount].setFrom(positionBuffer.data[i]);
1670 velocityBuffer.data[newCount].setFrom(velocityBuffer.data[i]); 1666 velocityBuffer.data[newCount].setFrom(velocityBuffer.data[i]);
1671 groupBuffer[newCount] = groupBuffer[i]; 1667 groupBuffer[newCount] = groupBuffer[i];
1672 if (depthBuffer != null) { 1668 if (depthBuffer != null) {
1673 depthBuffer[newCount] = depthBuffer[i]; 1669 depthBuffer[newCount] = depthBuffer[i];
1674 } 1670 }
1675 if (colorBuffer.data != null) { 1671 if (colorBuffer.data != null) {
1676 colorBuffer.data[newCount] 1672 colorBuffer.data[newCount].setParticleColor(colorBuffer.data[i]);
1677 .setParticleColor(colorBuffer.data[i]);
1678 } 1673 }
1679 if (userDataBuffer.data != null) { 1674 if (userDataBuffer.data != null) {
1680 userDataBuffer.data[newCount] = userDataBuffer.data[i]; 1675 userDataBuffer.data[newCount] = userDataBuffer.data[i];
1681 } 1676 }
1682 } 1677 }
1683 newCount++; 1678 newCount++;
1684 } 1679 }
1685 } 1680 }
1686 1681
1687 // update proxies 1682 // update proxies
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
1982 return velocityBuffer.data; 1977 return velocityBuffer.data;
1983 } 1978 }
1984 1979
1985 List<ParticleColor> getParticleColorBuffer() { 1980 List<ParticleColor> getParticleColorBuffer() {
1986 colorBuffer.data = 1981 colorBuffer.data =
1987 requestParticleBuffer(colorBuffer.data, colorBuffer.allocClosure); 1982 requestParticleBuffer(colorBuffer.data, colorBuffer.allocClosure);
1988 return colorBuffer.data; 1983 return colorBuffer.data;
1989 } 1984 }
1990 1985
1991 List<Object> getParticleUserDataBuffer() { 1986 List<Object> getParticleUserDataBuffer() {
1992 userDataBuffer.data = requestParticleBuffer( 1987 userDataBuffer.data =
1993 userDataBuffer.data, userDataBuffer.allocClosure); 1988 requestParticleBuffer(userDataBuffer.data, userDataBuffer.allocClosure);
1994 return userDataBuffer.data; 1989 return userDataBuffer.data;
1995 } 1990 }
1996 1991
1997 int getParticleMaxCount() { 1992 int getParticleMaxCount() {
1998 return maxCount; 1993 return maxCount;
1999 } 1994 }
2000 1995
2001 void setParticleMaxCount(int count) { 1996 void setParticleMaxCount(int count) {
2002 assert(count <= count); 1997 assert(count <= count);
2003 maxCount = count; 1998 maxCount = count;
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
2192 final double vx = vb.x - va.x; 2187 final double vx = vb.x - va.x;
2193 final double vy = vb.y - va.y; 2188 final double vy = vb.y - va.y;
2194 double vn = vx * n.x + vy * n.y; 2189 double vn = vx * n.x + vy * n.y;
2195 if (vn < 0) { 2190 if (vn < 0) {
2196 sum_v2 += vn * vn; 2191 sum_v2 += vn * vn;
2197 } 2192 }
2198 } 2193 }
2199 return 0.5 * getParticleMass() * sum_v2; 2194 return 0.5 * getParticleMass() * sum_v2;
2200 } 2195 }
2201 } 2196 }
OLDNEW
« no previous file with comments | « lib/src/dynamics/world.dart ('k') | lib/src/particle/stack_queue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698