Revision 9aabc9eb
Added by Leszek Koltunski over 3 years ago
src/main/java/org/distorted/library/type/Dynamic.java | ||
---|---|---|
55 | 55 |
|
56 | 56 |
public abstract class Dynamic |
57 | 57 |
{ |
58 |
/** |
|
59 |
* Keep the speed of interpolation always changing. Time to cover one segment (distance between |
|
60 |
* two consecutive points) always the same. Smoothly interpolate the speed between two segments. |
|
61 |
*/ |
|
62 |
public static final int SPEED_MODE_SMOOTH = 0; |
|
63 |
/** |
|
64 |
* Make each segment have constant speed. Time to cover each segment is still the same, thus the |
|
65 |
* speed will jump when passing through a point and then keep constant. |
|
66 |
*/ |
|
67 |
public static final int SPEED_MODE_SEGMENT_CONSTANT = 1; |
|
68 |
/** |
|
69 |
* Have the speed be always, globally the same across all segments. Time to cover one segment will |
|
70 |
* thus generally no longer be the same. |
|
71 |
*/ |
|
72 |
public static final int SPEED_MODE_GLOBALLY_CONSTANT = 2; |
|
73 |
|
|
58 | 74 |
/** |
59 | 75 |
* One revolution takes us from the first point to the last and back to first through the shortest path. |
60 | 76 |
*/ |
... | ... | |
92 | 108 |
protected float mCount; // number of loops/paths we will do; mCount = 1.5 means we go from the first vector to the last, back to first, and to the last again. |
93 | 109 |
protected double mLastPos; |
94 | 110 |
protected int mAccessType; |
111 |
protected int mSpeedMode; |
|
95 | 112 |
|
96 | 113 |
protected class VectorNoise |
97 | 114 |
{ |
... | ... | |
123 | 140 |
protected float[][] baseV; |
124 | 141 |
|
125 | 142 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
126 |
// the coefficients of the X(t), Y(t) and Z(t) polynomials: X(t) = ax*T^3 + bx*T^2 + cx*t + dx etc.
|
|
127 |
// (tangent) is the vector tangent to the path.
|
|
143 |
// the coefficients of the X(t), Y(t) and Z(t) polynomials: X(t) = a[0]*T^3 + b[0]*T^2 + c[0]*t + d[0] etc.
|
|
144 |
// (velocity) is the velocity vector.
|
|
128 | 145 |
// (cached) is the original vector from vv (copied here so when interpolating we can see if it is |
129 | 146 |
// still valid and if not - rebuild the Cache |
130 | 147 |
|
... | ... | |
134 | 151 |
float[] b; |
135 | 152 |
float[] c; |
136 | 153 |
float[] d; |
137 |
float[] tangent;
|
|
154 |
float[] velocity;
|
|
138 | 155 |
float[] cached; |
156 |
float[] path_ratio; |
|
139 | 157 |
|
140 | 158 |
VectorCache() |
141 | 159 |
{ |
... | ... | |
143 | 161 |
b = new float[mDimension]; |
144 | 162 |
c = new float[mDimension]; |
145 | 163 |
d = new float[mDimension]; |
146 |
tangent = new float[mDimension]; |
|
147 |
cached = new float[mDimension]; |
|
164 |
|
|
165 |
velocity = new float[mDimension]; |
|
166 |
cached = new float[mDimension]; |
|
167 |
path_ratio = new float[NUM_RATIO]; |
|
148 | 168 |
} |
149 | 169 |
} |
150 | 170 |
|
151 | 171 |
protected Vector<VectorCache> vc; |
152 |
protected VectorCache tmp1, tmp2;
|
|
172 |
protected VectorCache tmpCache1, tmpCache2;
|
|
153 | 173 |
protected float mConvexity; |
154 | 174 |
|
175 |
private static final int NUM_RATIO = 10; // we attempt to 'smooth out' the speed in each segment - |
|
176 |
// remember this many 'points' inside the Cache for each segment. |
|
177 |
|
|
178 |
protected static final float[] mTmpRatio = new float[NUM_RATIO]; |
|
179 |
|
|
155 | 180 |
private float[] buf; |
156 | 181 |
private float[] old; |
157 | 182 |
private static final Random mRnd = new Random(); |
... | ... | |
184 | 209 |
mSegment = -1; |
185 | 210 |
mLastPos = -1; |
186 | 211 |
mAccessType= ACCESS_TYPE_RANDOM; |
212 |
mSpeedMode = SPEED_MODE_SMOOTH; |
|
187 | 213 |
mConvexity = 1.0f; |
188 | 214 |
mStartTime = -1; |
189 | 215 |
mCorrectedTime = 0; |
... | ... | |
208 | 234 |
mPausedTime = System.currentTimeMillis(); |
209 | 235 |
} |
210 | 236 |
|
237 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
238 |
|
|
239 |
private float valueAtPoint(float t, VectorCache cache) |
|
240 |
{ |
|
241 |
float tmp,sum = 0.0f; |
|
242 |
|
|
243 |
for(int d=0; d<mDimension; d++) |
|
244 |
{ |
|
245 |
tmp = (3*cache.a[d]*t + 2*cache.b[d])*t + cache.c[d]; |
|
246 |
sum += tmp*tmp; |
|
247 |
} |
|
248 |
|
|
249 |
return (float)Math.sqrt(sum); |
|
250 |
} |
|
251 |
|
|
252 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
253 |
|
|
254 |
protected float smoothSpeed(float time, VectorCache cache) |
|
255 |
{ |
|
256 |
float fndex = time*NUM_RATIO; |
|
257 |
int index = (int)fndex; |
|
258 |
float prev = index==0 ? 0.0f : cache.path_ratio[index-1]; |
|
259 |
float next = cache.path_ratio[index]; |
|
260 |
|
|
261 |
return prev + (next-prev)*(fndex-index); |
|
262 |
} |
|
263 |
|
|
264 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
265 |
// First, compute the approx length of the segment from time=0 to time=(i+1)/NUM_TIME and store this |
|
266 |
// in cache.path_ratio[i]. Then the last path_ratio is the length from 0 to 1, i.e. the total length |
|
267 |
// of the segment. |
|
268 |
// We do this by computing the integral from 0 to 1 of sqrt( (dx/dt)^2 + (dy/dt)^2 ) (i.e. the length |
|
269 |
// of the segment) using the approx 'trapezoids' integration method. |
|
270 |
// |
|
271 |
// Then, for every i, divide path_ratio[i] by the total length to get the percentage of total path |
|
272 |
// length covered at time i. At this time, path_ratio[3] = 0.45 means 'at time 3/NUM_RATIO, we cover |
|
273 |
// 0.45 = 45% of the total length of the segment. |
|
274 |
// |
|
275 |
// Finally, invert this function (for quicker lookups in smoothSpeed) so that after this step, |
|
276 |
// path_ratio[3] = 0.45 means 'at 45% of the time, we cover 3/NUM_RATIO distance'. |
|
277 |
|
|
278 |
protected void smoothOutSegment(VectorCache cache) |
|
279 |
{ |
|
280 |
float vPrev, sum = 0.0f; |
|
281 |
float vNext = valueAtPoint(0.0f,cache); |
|
282 |
|
|
283 |
for(int i=0; i<NUM_RATIO; i++) |
|
284 |
{ |
|
285 |
vPrev = vNext; |
|
286 |
vNext = valueAtPoint( (float)(i+1)/NUM_RATIO,cache); |
|
287 |
sum += (vPrev+vNext); |
|
288 |
cache.path_ratio[i] = sum; |
|
289 |
} |
|
290 |
|
|
291 |
float total = cache.path_ratio[NUM_RATIO-1]; |
|
292 |
|
|
293 |
for(int i=0; i<NUM_RATIO; i++) cache.path_ratio[i] /= total; |
|
294 |
|
|
295 |
int writeIndex = 0; |
|
296 |
float prev=0.0f, next, ratio= 1.0f/NUM_RATIO; |
|
297 |
|
|
298 |
for(int readIndex=0; readIndex<NUM_RATIO; readIndex++) |
|
299 |
{ |
|
300 |
next = cache.path_ratio[readIndex]; |
|
301 |
|
|
302 |
while( prev<ratio && ratio<=next ) |
|
303 |
{ |
|
304 |
float a = (next-ratio)/(next-prev); |
|
305 |
mTmpRatio[writeIndex] = (readIndex+1-a)/NUM_RATIO; |
|
306 |
writeIndex++; |
|
307 |
ratio = (writeIndex+1.0f)/NUM_RATIO; |
|
308 |
} |
|
309 |
|
|
310 |
prev = next; |
|
311 |
} |
|
312 |
|
|
313 |
System.arraycopy(mTmpRatio, 0, cache.path_ratio, 0, NUM_RATIO); |
|
314 |
} |
|
315 |
|
|
211 | 316 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
212 | 317 |
|
213 | 318 |
protected float noise(float time,int vecNum) |
... | ... | |
340 | 445 |
|
341 | 446 |
if( cosA<0.0f ) |
342 | 447 |
{ |
343 |
/* |
|
344 |
/// DEBUGGING //// |
|
345 |
String s = index+" ("; |
|
346 |
float t; |
|
347 |
|
|
348 |
for(int j=0; j<mDimension; j++) |
|
349 |
{ |
|
350 |
t = ((int)(100*baseV[index][j]))/(100.0f); |
|
351 |
s+=(" "+t); |
|
352 |
} |
|
353 |
s += ") ("; |
|
354 |
|
|
355 |
for(int j=0; j<mDimension; j++) |
|
356 |
{ |
|
357 |
t = ((int)(100*old[j]))/(100.0f); |
|
358 |
s+=(" "+t); |
|
359 |
} |
|
360 |
s+= ")"; |
|
361 |
|
|
362 |
android.util.Log.e("dynamic", "kat: " + s); |
|
363 |
/// END DEBUGGING /// |
|
364 |
*/ |
|
365 | 448 |
for(int j=0; j<mDimension; j++) |
366 | 449 |
baseV[index][j] = -baseV[index][j]; |
367 | 450 |
} |
... | ... | |
658 | 741 |
mLastPos = -1; |
659 | 742 |
} |
660 | 743 |
|
744 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
745 |
/** |
|
746 |
* @return See {@link Dynamic#setSpeedMode(int)} |
|
747 |
*/ |
|
748 |
public float getSpeedMode() |
|
749 |
{ |
|
750 |
return mSpeedMode; |
|
751 |
} |
|
752 |
|
|
753 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
754 |
/** |
|
755 |
* Sets the way we compute the interpolation speed. |
|
756 |
* |
|
757 |
* @param mode {@link Dynamic#SPEED_MODE_SMOOTH} or {@link Dynamic#SPEED_MODE_SEGMENT_CONSTANT} or |
|
758 |
* {@link Dynamic#SPEED_MODE_GLOBALLY_CONSTANT} |
|
759 |
*/ |
|
760 |
public void setSpeedMode(int mode) |
|
761 |
{ |
|
762 |
if( mSpeedMode!=mode ) |
|
763 |
{ |
|
764 |
if( mSpeedMode==SPEED_MODE_SMOOTH ) |
|
765 |
{ |
|
766 |
for(int i=0; i<numPoints; i++) |
|
767 |
{ |
|
768 |
tmpCache1 = vc.elementAt(i); |
|
769 |
smoothOutSegment(tmpCache1); |
|
770 |
} |
|
771 |
} |
|
772 |
|
|
773 |
mSpeedMode = mode; |
|
774 |
} |
|
775 |
} |
|
776 |
|
|
661 | 777 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
662 | 778 |
/** |
663 | 779 |
* Return the Dimension, ie number of floats in a single Point this Dynamic interpolates through. |
src/main/java/org/distorted/library/type/Dynamic1D.java | ||
---|---|---|
44 | 44 |
curr = vv.elementAt(c); |
45 | 45 |
next = vv.elementAt(n); |
46 | 46 |
|
47 |
tmp1 = vc.elementAt(c); |
|
47 |
tmpCache1 = vc.elementAt(c);
|
|
48 | 48 |
|
49 | 49 |
float px = curr.x - prev.x; |
50 | 50 |
float nx = next.x - curr.x; |
... | ... | |
57 | 57 |
|
58 | 58 |
if( q>1 ) |
59 | 59 |
{ |
60 |
tmp1.tangent[0] = nx+px/q;
|
|
60 |
tmpCache1.velocity[0] = nx+px/q;
|
|
61 | 61 |
} |
62 | 62 |
else |
63 | 63 |
{ |
64 |
tmp1.tangent[0] = px+nx*q;
|
|
64 |
tmpCache1.velocity[0] = px+nx*q;
|
|
65 | 65 |
} |
66 | 66 |
} |
67 | 67 |
else |
68 | 68 |
{ |
69 |
tmp1.tangent[0] = 0.0f;
|
|
69 |
tmpCache1.velocity[0] = 0.0f;
|
|
70 | 70 |
} |
71 | 71 |
} |
72 | 72 |
|
... | ... | |
76 | 76 |
{ |
77 | 77 |
if( numPoints==1 ) |
78 | 78 |
{ |
79 |
tmp1= vc.elementAt(0);
|
|
79 |
tmpCache1 = vc.elementAt(0);
|
|
80 | 80 |
curr= vv.elementAt(0); |
81 | 81 |
|
82 |
tmp1.a[0] = 0.0f; |
|
83 |
tmp1.b[0] = 0.0f; |
|
84 |
tmp1.c[0] = curr.x; |
|
85 |
tmp1.d[0] = 0.0f; |
|
82 |
tmpCache1.a[0] = 0.0f;
|
|
83 |
tmpCache1.b[0] = 0.0f;
|
|
84 |
tmpCache1.c[0] = curr.x;
|
|
85 |
tmpCache1.d[0] = 0.0f;
|
|
86 | 86 |
} |
87 | 87 |
else if( numPoints==2 ) |
88 | 88 |
{ |
89 |
tmp1= vc.elementAt(0);
|
|
90 |
tmp2= vc.elementAt(1);
|
|
89 |
tmpCache1 = vc.elementAt(0);
|
|
90 |
tmpCache2 = vc.elementAt(1);
|
|
91 | 91 |
curr= vv.elementAt(0); |
92 | 92 |
next= vv.elementAt(1); |
93 | 93 |
|
94 |
tmp1.a[0] = 0.0f; |
|
95 |
tmp1.b[0] = 0.0f; |
|
96 |
tmp1.c[0] = next.x - curr.x; |
|
97 |
tmp1.d[0] = curr.x; |
|
94 |
tmpCache1.a[0] = 0.0f;
|
|
95 |
tmpCache1.b[0] = 0.0f;
|
|
96 |
tmpCache1.c[0] = next.x - curr.x;
|
|
97 |
tmpCache1.d[0] = curr.x;
|
|
98 | 98 |
|
99 |
tmp2.a[0] = 0.0f; |
|
100 |
tmp2.b[0] = 0.0f; |
|
101 |
tmp2.c[0] = curr.x - next.x; |
|
102 |
tmp2.d[0] = next.x; |
|
99 |
tmpCache2.a[0] = 0.0f;
|
|
100 |
tmpCache2.b[0] = 0.0f;
|
|
101 |
tmpCache2.c[0] = curr.x - next.x;
|
|
102 |
tmpCache2.d[0] = next.x;
|
|
103 | 103 |
} |
104 | 104 |
else |
105 | 105 |
{ |
... | ... | |
111 | 111 |
{ |
112 | 112 |
n = i<numPoints-1 ? i+1:0; |
113 | 113 |
|
114 |
tmp1= vc.elementAt(i);
|
|
115 |
tmp2= vc.elementAt(n);
|
|
114 |
tmpCache1 = vc.elementAt(i);
|
|
115 |
tmpCache2 = vc.elementAt(n);
|
|
116 | 116 |
curr= vv.elementAt(i); |
117 | 117 |
next= vv.elementAt(n); |
118 | 118 |
|
119 |
tmp1.cached[0] = curr.x; |
|
119 |
tmpCache1.cached[0] = curr.x;
|
|
120 | 120 |
|
121 |
tmp1.a[0] = mConvexity*( 2*curr.x + tmp1.tangent[0] - 2*next.x + tmp2.tangent[0]); |
|
122 |
tmp1.b[0] = mConvexity*(-3*curr.x - 2*tmp1.tangent[0] + 3*next.x - tmp2.tangent[0]); |
|
123 |
tmp1.c[0] = mConvexity*(tmp1.tangent[0]) + (1.0f-mConvexity)*(next.x-curr.x); |
|
124 |
tmp1.d[0] = curr.x; |
|
121 |
tmpCache1.a[0] = mConvexity*( 2*curr.x + tmpCache1.velocity[0] - 2*next.x + tmpCache2.velocity[0]); |
|
122 |
tmpCache1.b[0] = mConvexity*(-3*curr.x - 2* tmpCache1.velocity[0] + 3*next.x - tmpCache2.velocity[0]); |
|
123 |
tmpCache1.c[0] = mConvexity*(tmpCache1.velocity[0]) + (1.0f-mConvexity)*(next.x-curr.x); |
|
124 |
tmpCache1.d[0] = curr.x; |
|
125 |
|
|
126 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) smoothOutSegment(tmpCache1); |
|
125 | 127 |
} |
126 | 128 |
} |
127 | 129 |
|
... | ... | |
442 | 444 |
{ |
443 | 445 |
int vecNext = getNext(vecCurr,t); |
444 | 446 |
next = vv.elementAt(vecNext); |
445 |
tmp2 = vc.elementAt(vecNext); |
|
447 |
tmpCache2 = vc.elementAt(vecNext);
|
|
446 | 448 |
|
447 |
if( tmp2.cached[0]!=next.x ) recomputeCache(); |
|
449 |
if( tmpCache2.cached[0]!=next.x ) recomputeCache();
|
|
448 | 450 |
} |
449 | 451 |
|
450 | 452 |
if( mSegment!= segment && vn!=null ) vn.elementAt(vecCurr).computeNoise(); |
451 | 453 |
|
452 | 454 |
mSegment = segment; |
453 |
|
|
454 | 455 |
time = time-vecCurr; |
455 |
|
|
456 |
tmp1 = vc.elementAt(vecCurr);
|
|
456 |
tmpCache1 = vc.elementAt(vecCurr); |
|
457 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) time = smoothSpeed(time, tmpCache1);
|
|
457 | 458 |
|
458 | 459 |
if( vn!=null ) |
459 | 460 |
{ |
460 | 461 |
time = noise(time,vecCurr); |
461 | 462 |
} |
462 | 463 |
|
463 |
buffer[offset] = ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0];
|
|
464 |
buffer[offset] = ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0];
|
|
464 | 465 |
break; |
465 | 466 |
} |
466 | 467 |
} |
src/main/java/org/distorted/library/type/Dynamic2D.java | ||
---|---|---|
44 | 44 |
curr = vv.elementAt(c); |
45 | 45 |
next = vv.elementAt(n); |
46 | 46 |
|
47 |
tmp1 = vc.elementAt(c); |
|
47 |
tmpCache1 = vc.elementAt(c);
|
|
48 | 48 |
|
49 | 49 |
float px = curr.x - prev.x; |
50 | 50 |
float py = curr.y - prev.y; |
... | ... | |
59 | 59 |
|
60 | 60 |
if( q>1 ) |
61 | 61 |
{ |
62 |
tmp1.tangent[0] = nx+px/q;
|
|
63 |
tmp1.tangent[1] = ny+py/q;
|
|
62 |
tmpCache1.velocity[0] = nx+px/q;
|
|
63 |
tmpCache1.velocity[1] = ny+py/q;
|
|
64 | 64 |
} |
65 | 65 |
else |
66 | 66 |
{ |
67 |
tmp1.tangent[0] = px+nx*q;
|
|
68 |
tmp1.tangent[1] = py+ny*q;
|
|
67 |
tmpCache1.velocity[0] = px+nx*q;
|
|
68 |
tmpCache1.velocity[1] = py+ny*q;
|
|
69 | 69 |
} |
70 | 70 |
} |
71 | 71 |
else |
72 | 72 |
{ |
73 |
tmp1.tangent[0] = 0.0f;
|
|
74 |
tmp1.tangent[1] = 0.0f;
|
|
73 |
tmpCache1.velocity[0] = 0.0f;
|
|
74 |
tmpCache1.velocity[1] = 0.0f;
|
|
75 | 75 |
} |
76 | 76 |
} |
77 | 77 |
|
... | ... | |
81 | 81 |
{ |
82 | 82 |
if( numPoints==1 ) |
83 | 83 |
{ |
84 |
tmp1= vc.elementAt(0);
|
|
84 |
tmpCache1 = vc.elementAt(0);
|
|
85 | 85 |
curr= vv.elementAt(0); |
86 | 86 |
|
87 |
tmp1.a[0] = tmp1.a[1] = 0.0f;
|
|
88 |
tmp1.b[0] = tmp1.b[1] = 0.0f;
|
|
89 |
tmp1.c[0] = curr.x; |
|
90 |
tmp1.c[1] = curr.y; |
|
91 |
tmp1.d[0] = tmp1.d[1] = 0.0f;
|
|
87 |
tmpCache1.a[0] = tmpCache1.a[1] = 0.0f;
|
|
88 |
tmpCache1.b[0] = tmpCache1.b[1] = 0.0f;
|
|
89 |
tmpCache1.c[0] = curr.x;
|
|
90 |
tmpCache1.c[1] = curr.y;
|
|
91 |
tmpCache1.d[0] = tmpCache1.d[1] = 0.0f;
|
|
92 | 92 |
} |
93 | 93 |
else if( numPoints==2 ) |
94 | 94 |
{ |
95 |
tmp1= vc.elementAt(0);
|
|
96 |
tmp2= vc.elementAt(1);
|
|
95 |
tmpCache1 = vc.elementAt(0);
|
|
96 |
tmpCache2 = vc.elementAt(1);
|
|
97 | 97 |
curr= vv.elementAt(0); |
98 | 98 |
next= vv.elementAt(1); |
99 | 99 |
|
100 |
tmp1.a[0] = tmp1.a[1] = 0.0f;
|
|
101 |
tmp1.b[0] = tmp1.b[1] = 0.0f;
|
|
102 |
tmp1.c[0] = next.x - curr.x; |
|
103 |
tmp1.c[1] = next.y - curr.y; |
|
104 |
tmp1.d[0] = curr.x; |
|
105 |
tmp1.d[1] = curr.y; |
|
100 |
tmpCache1.a[0] = tmpCache1.a[1] = 0.0f;
|
|
101 |
tmpCache1.b[0] = tmpCache1.b[1] = 0.0f;
|
|
102 |
tmpCache1.c[0] = next.x - curr.x;
|
|
103 |
tmpCache1.c[1] = next.y - curr.y;
|
|
104 |
tmpCache1.d[0] = curr.x;
|
|
105 |
tmpCache1.d[1] = curr.y;
|
|
106 | 106 |
|
107 |
tmp2.a[0] = tmp2.a[1] = 0.0f;
|
|
108 |
tmp2.b[0] = tmp2.b[1] = 0.0f;
|
|
109 |
tmp2.c[0] = curr.x - next.x; |
|
110 |
tmp2.c[1] = curr.y - next.y; |
|
111 |
tmp2.d[0] = next.x; |
|
112 |
tmp2.d[1] = next.y; |
|
107 |
tmpCache2.a[0] = tmpCache2.a[1] = 0.0f;
|
|
108 |
tmpCache2.b[0] = tmpCache2.b[1] = 0.0f;
|
|
109 |
tmpCache2.c[0] = curr.x - next.x;
|
|
110 |
tmpCache2.c[1] = curr.y - next.y;
|
|
111 |
tmpCache2.d[0] = next.x;
|
|
112 |
tmpCache2.d[1] = next.y;
|
|
113 | 113 |
} |
114 | 114 |
else |
115 | 115 |
{ |
... | ... | |
121 | 121 |
{ |
122 | 122 |
n = i<numPoints-1 ? i+1:0; |
123 | 123 |
|
124 |
tmp1= vc.elementAt(i);
|
|
125 |
tmp2= vc.elementAt(n);
|
|
124 |
tmpCache1 = vc.elementAt(i);
|
|
125 |
tmpCache2 = vc.elementAt(n);
|
|
126 | 126 |
curr= vv.elementAt(i); |
127 | 127 |
next= vv.elementAt(n); |
128 | 128 |
|
129 |
tmp1.cached[0] = curr.x; |
|
130 |
tmp1.cached[1] = curr.y; |
|
131 |
|
|
132 |
tmp1.a[0] = mConvexity*( 2*curr.x + tmp1.tangent[0] - 2*next.x + tmp2.tangent[0]); |
|
133 |
tmp1.b[0] = mConvexity*(-3*curr.x - 2*tmp1.tangent[0] + 3*next.x - tmp2.tangent[0]); |
|
134 |
tmp1.c[0] = mConvexity*(tmp1.tangent[0]) + (1.0f-mConvexity)*(next.x-curr.x); |
|
135 |
tmp1.d[0] = curr.x; |
|
136 |
|
|
137 |
tmp1.a[1] = mConvexity*( 2*curr.y + tmp1.tangent[1] - 2*next.y + tmp2.tangent[1]); |
|
138 |
tmp1.b[1] = mConvexity*(-3*curr.y - 2*tmp1.tangent[1] + 3*next.y - tmp2.tangent[1]); |
|
139 |
tmp1.c[1] = mConvexity*(tmp1.tangent[1]) + (1.0f-mConvexity)*(next.y-curr.y); |
|
140 |
tmp1.d[1] = curr.y; |
|
129 |
tmpCache1.cached[0] = curr.x; |
|
130 |
tmpCache1.cached[1] = curr.y; |
|
131 |
|
|
132 |
tmpCache1.a[0] = mConvexity*( 2*curr.x + tmpCache1.velocity[0] - 2*next.x + tmpCache2.velocity[0]); |
|
133 |
tmpCache1.b[0] = mConvexity*(-3*curr.x - 2* tmpCache1.velocity[0] + 3*next.x - tmpCache2.velocity[0]); |
|
134 |
tmpCache1.c[0] = mConvexity*(tmpCache1.velocity[0]) + (1.0f-mConvexity)*(next.x-curr.x); |
|
135 |
tmpCache1.d[0] = curr.x; |
|
136 |
|
|
137 |
tmpCache1.a[1] = mConvexity*( 2*curr.y + tmpCache1.velocity[1] - 2*next.y + tmpCache2.velocity[1]); |
|
138 |
tmpCache1.b[1] = mConvexity*(-3*curr.y - 2* tmpCache1.velocity[1] + 3*next.y - tmpCache2.velocity[1]); |
|
139 |
tmpCache1.c[1] = mConvexity*(tmpCache1.velocity[1]) + (1.0f-mConvexity)*(next.y-curr.y); |
|
140 |
tmpCache1.d[1] = curr.y; |
|
141 |
|
|
142 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) smoothOutSegment(tmpCache1); |
|
141 | 143 |
} |
142 | 144 |
} |
143 | 145 |
|
... | ... | |
475 | 477 |
{ |
476 | 478 |
int vecNext = getNext(vecCurr,t); |
477 | 479 |
next = vv.elementAt(vecNext); |
478 |
tmp2 = vc.elementAt(vecNext); |
|
480 |
tmpCache2 = vc.elementAt(vecNext);
|
|
479 | 481 |
|
480 |
if( tmp2.cached[0]!=next.x || tmp2.cached[1]!=next.y ) recomputeCache();
|
|
482 |
if( tmpCache2.cached[0]!=next.x || tmpCache2.cached[1]!=next.y ) recomputeCache();
|
|
481 | 483 |
} |
482 | 484 |
|
483 | 485 |
if( mSegment!= segment && vn!=null ) vn.elementAt(vecCurr).computeNoise(); |
484 | 486 |
|
485 | 487 |
mSegment = segment; |
486 |
|
|
487 | 488 |
time = time-vecCurr; |
488 |
tmp1 = vc.elementAt(vecCurr); |
|
489 |
tmpCache1 = vc.elementAt(vecCurr); |
|
490 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) time = smoothSpeed(time, tmpCache1); |
|
489 | 491 |
|
490 | 492 |
if( vn!=null ) |
491 | 493 |
{ |
492 | 494 |
time = noise(time,vecCurr); |
493 | 495 |
|
494 |
baseV[1][0] = (3*tmp1.a[0]*time+2*tmp1.b[0])*time + tmp1.c[0];
|
|
495 |
baseV[1][1] = (3*tmp1.a[1]*time+2*tmp1.b[1])*time + tmp1.c[1];
|
|
496 |
baseV[1][0] = (3* tmpCache1.a[0]*time+2* tmpCache1.b[0])*time + tmpCache1.c[0];
|
|
497 |
baseV[1][1] = (3* tmpCache1.a[1]*time+2* tmpCache1.b[1])*time + tmpCache1.c[1];
|
|
496 | 498 |
|
497 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0] +baseV[1][1]*mFactor[0];
|
|
498 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1] -baseV[1][0]*mFactor[0];
|
|
499 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0] +baseV[1][1]*mFactor[0];
|
|
500 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1] -baseV[1][0]*mFactor[0];
|
|
499 | 501 |
} |
500 | 502 |
else |
501 | 503 |
{ |
502 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0];
|
|
503 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1];
|
|
504 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0];
|
|
505 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1];
|
|
504 | 506 |
} |
505 | 507 |
|
506 | 508 |
break; |
src/main/java/org/distorted/library/type/Dynamic3D.java | ||
---|---|---|
44 | 44 |
curr = vv.elementAt(c); |
45 | 45 |
next = vv.elementAt(n); |
46 | 46 |
|
47 |
tmp1 = vc.elementAt(c); |
|
47 |
tmpCache1 = vc.elementAt(c);
|
|
48 | 48 |
|
49 | 49 |
float px = curr.x - prev.x; |
50 | 50 |
float py = curr.y - prev.y; |
... | ... | |
61 | 61 |
|
62 | 62 |
if( q>1 ) |
63 | 63 |
{ |
64 |
tmp1.tangent[0] = nx+px/q;
|
|
65 |
tmp1.tangent[1] = ny+py/q;
|
|
66 |
tmp1.tangent[2] = nz+pz/q;
|
|
64 |
tmpCache1.velocity[0] = nx+px/q;
|
|
65 |
tmpCache1.velocity[1] = ny+py/q;
|
|
66 |
tmpCache1.velocity[2] = nz+pz/q;
|
|
67 | 67 |
} |
68 | 68 |
else |
69 | 69 |
{ |
70 |
tmp1.tangent[0] = px+nx*q;
|
|
71 |
tmp1.tangent[1] = py+ny*q;
|
|
72 |
tmp1.tangent[2] = pz+nz*q;
|
|
70 |
tmpCache1.velocity[0] = px+nx*q;
|
|
71 |
tmpCache1.velocity[1] = py+ny*q;
|
|
72 |
tmpCache1.velocity[2] = pz+nz*q;
|
|
73 | 73 |
} |
74 | 74 |
} |
75 | 75 |
else |
76 | 76 |
{ |
77 |
tmp1.tangent[0] = 0.0f;
|
|
78 |
tmp1.tangent[1] = 0.0f;
|
|
79 |
tmp1.tangent[2] = 0.0f;
|
|
77 |
tmpCache1.velocity[0] = 0.0f;
|
|
78 |
tmpCache1.velocity[1] = 0.0f;
|
|
79 |
tmpCache1.velocity[2] = 0.0f;
|
|
80 | 80 |
} |
81 | 81 |
} |
82 | 82 |
|
... | ... | |
86 | 86 |
{ |
87 | 87 |
if( numPoints==1 ) |
88 | 88 |
{ |
89 |
tmp1= vc.elementAt(0);
|
|
89 |
tmpCache1 = vc.elementAt(0);
|
|
90 | 90 |
curr= vv.elementAt(0); |
91 | 91 |
|
92 |
tmp1.a[0] = tmp1.a[1] = tmp1.a[2] = 0.0f;
|
|
93 |
tmp1.b[0] = tmp1.b[1] = tmp1.b[2] = 0.0f;
|
|
94 |
tmp1.c[0] = curr.x; |
|
95 |
tmp1.c[1] = curr.y; |
|
96 |
tmp1.c[2] = curr.z; |
|
97 |
tmp1.d[0] = tmp1.d[1] = tmp1.d[2] = 0.0f;
|
|
92 |
tmpCache1.a[0] = tmpCache1.a[1] = tmpCache1.a[2] = 0.0f;
|
|
93 |
tmpCache1.b[0] = tmpCache1.b[1] = tmpCache1.b[2] = 0.0f;
|
|
94 |
tmpCache1.c[0] = curr.x;
|
|
95 |
tmpCache1.c[1] = curr.y;
|
|
96 |
tmpCache1.c[2] = curr.z;
|
|
97 |
tmpCache1.d[0] = tmpCache1.d[1] = tmpCache1.d[2] = 0.0f;
|
|
98 | 98 |
} |
99 | 99 |
else if( numPoints==2 ) |
100 | 100 |
{ |
101 |
tmp1= vc.elementAt(0);
|
|
102 |
tmp2= vc.elementAt(1);
|
|
101 |
tmpCache1 = vc.elementAt(0);
|
|
102 |
tmpCache2 = vc.elementAt(1);
|
|
103 | 103 |
curr= vv.elementAt(0); |
104 | 104 |
next= vv.elementAt(1); |
105 | 105 |
|
106 |
tmp1.a[0] = tmp1.a[1] = tmp1.a[2] = 0.0f;
|
|
107 |
tmp1.b[0] = tmp1.b[1] = tmp1.b[2] = 0.0f;
|
|
108 |
tmp1.c[0] = next.x - curr.x; |
|
109 |
tmp1.c[1] = next.y - curr.y; |
|
110 |
tmp1.c[2] = next.z - curr.z; |
|
111 |
tmp1.d[0] = curr.x; |
|
112 |
tmp1.d[1] = curr.y; |
|
113 |
tmp1.d[2] = curr.z; |
|
106 |
tmpCache1.a[0] = tmpCache1.a[1] = tmpCache1.a[2] = 0.0f;
|
|
107 |
tmpCache1.b[0] = tmpCache1.b[1] = tmpCache1.b[2] = 0.0f;
|
|
108 |
tmpCache1.c[0] = next.x - curr.x;
|
|
109 |
tmpCache1.c[1] = next.y - curr.y;
|
|
110 |
tmpCache1.c[2] = next.z - curr.z;
|
|
111 |
tmpCache1.d[0] = curr.x;
|
|
112 |
tmpCache1.d[1] = curr.y;
|
|
113 |
tmpCache1.d[2] = curr.z;
|
|
114 | 114 |
|
115 |
tmp2.a[0] = tmp2.a[1] = tmp2.a[2] = 0.0f;
|
|
116 |
tmp2.b[0] = tmp2.b[1] = tmp2.b[2] = 0.0f;
|
|
117 |
tmp2.c[0] = curr.x - next.x; |
|
118 |
tmp2.c[1] = curr.y - next.y; |
|
119 |
tmp2.c[2] = curr.z - next.z; |
|
120 |
tmp2.d[0] = next.x; |
|
121 |
tmp2.d[1] = next.y; |
|
122 |
tmp2.d[2] = next.z; |
|
115 |
tmpCache2.a[0] = tmpCache2.a[1] = tmpCache2.a[2] = 0.0f;
|
|
116 |
tmpCache2.b[0] = tmpCache2.b[1] = tmpCache2.b[2] = 0.0f;
|
|
117 |
tmpCache2.c[0] = curr.x - next.x;
|
|
118 |
tmpCache2.c[1] = curr.y - next.y;
|
|
119 |
tmpCache2.c[2] = curr.z - next.z;
|
|
120 |
tmpCache2.d[0] = next.x;
|
|
121 |
tmpCache2.d[1] = next.y;
|
|
122 |
tmpCache2.d[2] = next.z;
|
|
123 | 123 |
} |
124 | 124 |
else |
125 | 125 |
{ |
... | ... | |
131 | 131 |
{ |
132 | 132 |
n = i<numPoints-1 ? i+1:0; |
133 | 133 |
|
134 |
tmp1= vc.elementAt(i);
|
|
135 |
tmp2= vc.elementAt(n);
|
|
134 |
tmpCache1 = vc.elementAt(i);
|
|
135 |
tmpCache2 = vc.elementAt(n);
|
|
136 | 136 |
curr= vv.elementAt(i); |
137 | 137 |
next= vv.elementAt(n); |
138 | 138 |
|
139 |
tmp1.cached[0] = curr.x; |
|
140 |
tmp1.cached[1] = curr.y; |
|
141 |
tmp1.cached[2] = curr.z; |
|
139 |
tmpCache1.cached[0] = curr.x;
|
|
140 |
tmpCache1.cached[1] = curr.y;
|
|
141 |
tmpCache1.cached[2] = curr.z;
|
|
142 | 142 |
|
143 |
tmp1.a[0] = mConvexity*( 2*curr.x + tmp1.tangent[0] - 2*next.x + tmp2.tangent[0]);
|
|
144 |
tmp1.b[0] = mConvexity*(-3*curr.x - 2*tmp1.tangent[0] + 3*next.x - tmp2.tangent[0]);
|
|
145 |
tmp1.c[0] = mConvexity*(tmp1.tangent[0]) + (1.0f-mConvexity)*(next.x-curr.x);
|
|
146 |
tmp1.d[0] = curr.x; |
|
143 |
tmpCache1.a[0] = mConvexity*( 2*curr.x + tmpCache1.velocity[0] - 2*next.x + tmpCache2.velocity[0]);
|
|
144 |
tmpCache1.b[0] = mConvexity*(-3*curr.x - 2* tmpCache1.velocity[0] + 3*next.x - tmpCache2.velocity[0]);
|
|
145 |
tmpCache1.c[0] = mConvexity*(tmpCache1.velocity[0]) + (1.0f-mConvexity)*(next.x-curr.x);
|
|
146 |
tmpCache1.d[0] = curr.x;
|
|
147 | 147 |
|
148 |
tmp1.a[1] = mConvexity*( 2*curr.y + tmp1.tangent[1] - 2*next.y + tmp2.tangent[1]);
|
|
149 |
tmp1.b[1] = mConvexity*(-3*curr.y - 2*tmp1.tangent[1] + 3*next.y - tmp2.tangent[1]);
|
|
150 |
tmp1.c[1] = mConvexity*(tmp1.tangent[1]) + (1.0f-mConvexity)*(next.y-curr.y);
|
|
151 |
tmp1.d[1] = curr.y; |
|
148 |
tmpCache1.a[1] = mConvexity*( 2*curr.y + tmpCache1.velocity[1] - 2*next.y + tmpCache2.velocity[1]);
|
|
149 |
tmpCache1.b[1] = mConvexity*(-3*curr.y - 2* tmpCache1.velocity[1] + 3*next.y - tmpCache2.velocity[1]);
|
|
150 |
tmpCache1.c[1] = mConvexity*(tmpCache1.velocity[1]) + (1.0f-mConvexity)*(next.y-curr.y);
|
|
151 |
tmpCache1.d[1] = curr.y;
|
|
152 | 152 |
|
153 |
tmp1.a[2] = mConvexity*( 2*curr.z + tmp1.tangent[2] - 2*next.z + tmp2.tangent[2]); |
|
154 |
tmp1.b[2] = mConvexity*(-3*curr.z - 2*tmp1.tangent[2] + 3*next.z - tmp2.tangent[2]); |
|
155 |
tmp1.c[2] = mConvexity*(tmp1.tangent[2]) + (1.0f-mConvexity)*(next.z-curr.z); |
|
156 |
tmp1.d[2] = curr.z; |
|
153 |
tmpCache1.a[2] = mConvexity*( 2*curr.z + tmpCache1.velocity[2] - 2*next.z + tmpCache2.velocity[2]); |
|
154 |
tmpCache1.b[2] = mConvexity*(-3*curr.z - 2* tmpCache1.velocity[2] + 3*next.z - tmpCache2.velocity[2]); |
|
155 |
tmpCache1.c[2] = mConvexity*(tmpCache1.velocity[2]) + (1.0f-mConvexity)*(next.z-curr.z); |
|
156 |
tmpCache1.d[2] = curr.z; |
|
157 |
|
|
158 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) smoothOutSegment(tmpCache1); |
|
157 | 159 |
} |
158 | 160 |
} |
159 | 161 |
|
... | ... | |
499 | 501 |
{ |
500 | 502 |
int vecNext = getNext(vecCurr,t); |
501 | 503 |
next = vv.elementAt(vecNext); |
502 |
tmp2 = vc.elementAt(vecNext); |
|
504 |
tmpCache2 = vc.elementAt(vecNext);
|
|
503 | 505 |
|
504 |
if( tmp2.cached[0]!=next.x || tmp2.cached[1]!=next.y || tmp2.cached[2]!=next.z ) recomputeCache();
|
|
506 |
if( tmpCache2.cached[0]!=next.x || tmpCache2.cached[1]!=next.y || tmpCache2.cached[2]!=next.z ) recomputeCache();
|
|
505 | 507 |
} |
506 | 508 |
|
507 | 509 |
if( mSegment!= segment && vn!=null ) vn.elementAt(vecCurr).computeNoise(); |
508 | 510 |
|
509 | 511 |
mSegment = segment; |
510 |
|
|
511 | 512 |
time = time-vecCurr; |
512 |
|
|
513 |
tmp1 = vc.elementAt(vecCurr);
|
|
513 |
tmpCache1 = vc.elementAt(vecCurr); |
|
514 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) time = smoothSpeed(time, tmpCache1);
|
|
514 | 515 |
|
515 | 516 |
if( vn!=null ) |
516 | 517 |
{ |
517 | 518 |
time = noise(time,vecCurr); |
518 | 519 |
|
519 |
computeOrthonormalBaseMore(time,tmp1);
|
|
520 |
computeOrthonormalBaseMore(time, tmpCache1);
|
|
520 | 521 |
|
521 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0] + (baseV[1][0]*mFactor[0] + baseV[2][0]*mFactor[1]);
|
|
522 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1] + (baseV[1][1]*mFactor[0] + baseV[2][1]*mFactor[1]);
|
|
523 |
buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2] + (baseV[1][2]*mFactor[0] + baseV[2][2]*mFactor[1]);
|
|
522 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0] + (baseV[1][0]*mFactor[0] + baseV[2][0]*mFactor[1]);
|
|
523 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1] + (baseV[1][1]*mFactor[0] + baseV[2][1]*mFactor[1]);
|
|
524 |
buffer[offset+2]= ((tmpCache1.a[2]*time+ tmpCache1.b[2])*time+ tmpCache1.c[2])*time+ tmpCache1.d[2] + (baseV[1][2]*mFactor[0] + baseV[2][2]*mFactor[1]);
|
|
524 | 525 |
} |
525 | 526 |
else |
526 | 527 |
{ |
527 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0];
|
|
528 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1];
|
|
529 |
buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2];
|
|
528 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0];
|
|
529 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1];
|
|
530 |
buffer[offset+2]= ((tmpCache1.a[2]*time+ tmpCache1.b[2])*time+ tmpCache1.c[2])*time+ tmpCache1.d[2];
|
|
530 | 531 |
} |
531 | 532 |
|
532 | 533 |
break; |
src/main/java/org/distorted/library/type/Dynamic4D.java | ||
---|---|---|
44 | 44 |
curr = vv.elementAt(c); |
45 | 45 |
next = vv.elementAt(n); |
46 | 46 |
|
47 |
tmp1 = vc.elementAt(c); |
|
47 |
tmpCache1 = vc.elementAt(c);
|
|
48 | 48 |
|
49 | 49 |
float px = curr.x - prev.x; |
50 | 50 |
float py = curr.y - prev.y; |
... | ... | |
63 | 63 |
|
64 | 64 |
if( q>1 ) |
65 | 65 |
{ |
66 |
tmp1.tangent[0] = nx+px/q;
|
|
67 |
tmp1.tangent[1] = ny+py/q;
|
|
68 |
tmp1.tangent[2] = nz+pz/q;
|
|
69 |
tmp1.tangent[3] = nw+pw/q;
|
|
66 |
tmpCache1.velocity[0] = nx+px/q;
|
|
67 |
tmpCache1.velocity[1] = ny+py/q;
|
|
68 |
tmpCache1.velocity[2] = nz+pz/q;
|
|
69 |
tmpCache1.velocity[3] = nw+pw/q;
|
|
70 | 70 |
} |
71 | 71 |
else |
72 | 72 |
{ |
73 |
tmp1.tangent[0] = px+nx*q;
|
|
74 |
tmp1.tangent[1] = py+ny*q;
|
|
75 |
tmp1.tangent[2] = pz+nz*q;
|
|
76 |
tmp1.tangent[3] = pw+nw*q;
|
|
73 |
tmpCache1.velocity[0] = px+nx*q;
|
|
74 |
tmpCache1.velocity[1] = py+ny*q;
|
|
75 |
tmpCache1.velocity[2] = pz+nz*q;
|
|
76 |
tmpCache1.velocity[3] = pw+nw*q;
|
|
77 | 77 |
} |
78 | 78 |
} |
79 | 79 |
else |
80 | 80 |
{ |
81 |
tmp1.tangent[0] = 0.0f;
|
|
82 |
tmp1.tangent[1] = 0.0f;
|
|
83 |
tmp1.tangent[2] = 0.0f;
|
|
84 |
tmp1.tangent[3] = 0.0f;
|
|
81 |
tmpCache1.velocity[0] = 0.0f;
|
|
82 |
tmpCache1.velocity[1] = 0.0f;
|
|
83 |
tmpCache1.velocity[2] = 0.0f;
|
|
84 |
tmpCache1.velocity[3] = 0.0f;
|
|
85 | 85 |
} |
86 | 86 |
} |
87 | 87 |
|
... | ... | |
91 | 91 |
{ |
92 | 92 |
if( numPoints==1 ) |
93 | 93 |
{ |
94 |
tmp1= vc.elementAt(0);
|
|
94 |
tmpCache1 = vc.elementAt(0);
|
|
95 | 95 |
curr= vv.elementAt(0); |
96 | 96 |
|
97 |
tmp1.a[0] = tmp1.a[1] = tmp1.a[2] = tmp1.a[3] = 0.0f;
|
|
98 |
tmp1.b[0] = tmp1.b[1] = tmp1.b[2] = tmp1.b[3] = 0.0f;
|
|
99 |
tmp1.c[0] = curr.x; |
|
100 |
tmp1.c[1] = curr.y; |
|
101 |
tmp1.c[2] = curr.z; |
|
102 |
tmp1.c[3] = curr.w; |
|
103 |
tmp1.d[0] = tmp1.d[1] = tmp1.d[3] = tmp1.d[3] = 0.0f;
|
|
97 |
tmpCache1.a[0] = tmpCache1.a[1] = tmpCache1.a[2] = tmpCache1.a[3] = 0.0f;
|
|
98 |
tmpCache1.b[0] = tmpCache1.b[1] = tmpCache1.b[2] = tmpCache1.b[3] = 0.0f;
|
|
99 |
tmpCache1.c[0] = curr.x;
|
|
100 |
tmpCache1.c[1] = curr.y;
|
|
101 |
tmpCache1.c[2] = curr.z;
|
|
102 |
tmpCache1.c[3] = curr.w;
|
|
103 |
tmpCache1.d[0] = tmpCache1.d[1] = tmpCache1.d[3] = tmpCache1.d[3] = 0.0f;
|
|
104 | 104 |
} |
105 | 105 |
else if( numPoints==2 ) |
106 | 106 |
{ |
107 |
tmp1= vc.elementAt(0);
|
|
108 |
tmp2= vc.elementAt(1);
|
|
107 |
tmpCache1 = vc.elementAt(0);
|
|
108 |
tmpCache2 = vc.elementAt(1);
|
|
109 | 109 |
curr= vv.elementAt(0); |
110 | 110 |
next= vv.elementAt(1); |
111 | 111 |
|
112 |
tmp1.a[0] = tmp1.a[1] = tmp1.a[2] = tmp1.a[3] = 0.0f;
|
|
113 |
tmp1.b[0] = tmp1.b[1] = tmp1.b[2] = tmp1.b[3] = 0.0f;
|
|
114 |
tmp1.c[0] = next.x - curr.x; |
|
115 |
tmp1.c[1] = next.y - curr.y; |
|
116 |
tmp1.c[2] = next.z - curr.z; |
|
117 |
tmp1.c[3] = next.w - curr.w; |
|
118 |
tmp1.d[0] = curr.x; |
|
119 |
tmp1.d[1] = curr.y; |
|
120 |
tmp1.d[2] = curr.z; |
|
121 |
tmp1.d[3] = curr.w; |
|
112 |
tmpCache1.a[0] = tmpCache1.a[1] = tmpCache1.a[2] = tmpCache1.a[3] = 0.0f;
|
|
113 |
tmpCache1.b[0] = tmpCache1.b[1] = tmpCache1.b[2] = tmpCache1.b[3] = 0.0f;
|
|
114 |
tmpCache1.c[0] = next.x - curr.x;
|
|
115 |
tmpCache1.c[1] = next.y - curr.y;
|
|
116 |
tmpCache1.c[2] = next.z - curr.z;
|
|
117 |
tmpCache1.c[3] = next.w - curr.w;
|
|
118 |
tmpCache1.d[0] = curr.x;
|
|
119 |
tmpCache1.d[1] = curr.y;
|
|
120 |
tmpCache1.d[2] = curr.z;
|
|
121 |
tmpCache1.d[3] = curr.w;
|
|
122 | 122 |
|
123 |
tmp2.a[0] = tmp2.a[1] = tmp2.a[2] = tmp2.a[3] = 0.0f;
|
|
124 |
tmp2.b[0] = tmp2.b[1] = tmp2.b[2] = tmp2.b[3] = 0.0f;
|
|
125 |
tmp2.c[0] = curr.x - next.x; |
|
126 |
tmp2.c[1] = curr.y - next.y; |
|
127 |
tmp2.c[2] = curr.z - next.z; |
|
128 |
tmp2.c[3] = curr.w - next.w; |
|
129 |
tmp2.d[0] = next.x; |
|
130 |
tmp2.d[1] = next.y; |
|
131 |
tmp2.d[2] = next.z; |
|
132 |
tmp2.d[3] = next.w; |
|
123 |
tmpCache2.a[0] = tmpCache2.a[1] = tmpCache2.a[2] = tmpCache2.a[3] = 0.0f;
|
|
124 |
tmpCache2.b[0] = tmpCache2.b[1] = tmpCache2.b[2] = tmpCache2.b[3] = 0.0f;
|
|
125 |
tmpCache2.c[0] = curr.x - next.x;
|
|
126 |
tmpCache2.c[1] = curr.y - next.y;
|
|
127 |
tmpCache2.c[2] = curr.z - next.z;
|
|
128 |
tmpCache2.c[3] = curr.w - next.w;
|
|
129 |
tmpCache2.d[0] = next.x;
|
|
130 |
tmpCache2.d[1] = next.y;
|
|
131 |
tmpCache2.d[2] = next.z;
|
|
132 |
tmpCache2.d[3] = next.w;
|
|
133 | 133 |
} |
134 | 134 |
else |
135 | 135 |
{ |
... | ... | |
141 | 141 |
{ |
142 | 142 |
n = i<numPoints-1 ? i+1:0; |
143 | 143 |
|
144 |
tmp1= vc.elementAt(i);
|
|
145 |
tmp2= vc.elementAt(n);
|
|
144 |
tmpCache1 = vc.elementAt(i);
|
|
145 |
tmpCache2 = vc.elementAt(n);
|
|
146 | 146 |
curr= vv.elementAt(i); |
147 | 147 |
next= vv.elementAt(n); |
148 | 148 |
|
149 |
tmp1.cached[0] = curr.x; |
|
150 |
tmp1.cached[1] = curr.y; |
|
151 |
tmp1.cached[2] = curr.z; |
|
152 |
tmp1.cached[3] = curr.w; |
|
149 |
tmpCache1.cached[0] = curr.x;
|
|
150 |
tmpCache1.cached[1] = curr.y;
|
|
151 |
tmpCache1.cached[2] = curr.z;
|
|
152 |
tmpCache1.cached[3] = curr.w;
|
|
153 | 153 |
|
154 |
tmp1.a[0] = mConvexity*( 2*curr.x + tmp1.tangent[0] - 2*next.x + tmp2.tangent[0]);
|
|
155 |
tmp1.b[0] = mConvexity*(-3*curr.x - 2*tmp1.tangent[0] + 3*next.x - tmp2.tangent[0]);
|
|
156 |
tmp1.c[0] = mConvexity*(tmp1.tangent[0]) + (1.0f-mConvexity)*(next.x-curr.x);
|
|
157 |
tmp1.d[0] = curr.x; |
|
154 |
tmpCache1.a[0] = mConvexity*( 2*curr.x + tmpCache1.velocity[0] - 2*next.x + tmpCache2.velocity[0]);
|
|
155 |
tmpCache1.b[0] = mConvexity*(-3*curr.x - 2* tmpCache1.velocity[0] + 3*next.x - tmpCache2.velocity[0]);
|
|
156 |
tmpCache1.c[0] = mConvexity*(tmpCache1.velocity[0]) + (1.0f-mConvexity)*(next.x-curr.x);
|
|
157 |
tmpCache1.d[0] = curr.x;
|
|
158 | 158 |
|
159 |
tmp1.a[1] = mConvexity*( 2*curr.y + tmp1.tangent[1] - 2*next.y + tmp2.tangent[1]);
|
|
160 |
tmp1.b[1] = mConvexity*(-3*curr.y - 2*tmp1.tangent[1] + 3*next.y - tmp2.tangent[1]);
|
|
161 |
tmp1.c[1] = mConvexity*(tmp1.tangent[1]) + (1.0f-mConvexity)*(next.y-curr.y);
|
|
162 |
tmp1.d[1] = curr.y; |
|
159 |
tmpCache1.a[1] = mConvexity*( 2*curr.y + tmpCache1.velocity[1] - 2*next.y + tmpCache2.velocity[1]);
|
|
160 |
tmpCache1.b[1] = mConvexity*(-3*curr.y - 2* tmpCache1.velocity[1] + 3*next.y - tmpCache2.velocity[1]);
|
|
161 |
tmpCache1.c[1] = mConvexity*(tmpCache1.velocity[1]) + (1.0f-mConvexity)*(next.y-curr.y);
|
|
162 |
tmpCache1.d[1] = curr.y;
|
|
163 | 163 |
|
164 |
tmp1.a[2] = mConvexity*( 2*curr.z + tmp1.tangent[2] - 2*next.z + tmp2.tangent[2]);
|
|
165 |
tmp1.b[2] = mConvexity*(-3*curr.z - 2*tmp1.tangent[2] + 3*next.z - tmp2.tangent[2]);
|
|
166 |
tmp1.c[2] = mConvexity*(tmp1.tangent[2]) + (1.0f-mConvexity)*(next.z-curr.z);
|
|
167 |
tmp1.d[2] = curr.z; |
|
164 |
tmpCache1.a[2] = mConvexity*( 2*curr.z + tmpCache1.velocity[2] - 2*next.z + tmpCache2.velocity[2]);
|
|
165 |
tmpCache1.b[2] = mConvexity*(-3*curr.z - 2* tmpCache1.velocity[2] + 3*next.z - tmpCache2.velocity[2]);
|
|
166 |
tmpCache1.c[2] = mConvexity*(tmpCache1.velocity[2]) + (1.0f-mConvexity)*(next.z-curr.z);
|
|
167 |
tmpCache1.d[2] = curr.z;
|
|
168 | 168 |
|
169 |
tmp1.a[3] = mConvexity*( 2*curr.w + tmp1.tangent[3] - 2*next.w + tmp2.tangent[3]); |
|
170 |
tmp1.b[3] = mConvexity*(-3*curr.w - 2*tmp1.tangent[3] + 3*next.w - tmp2.tangent[3]); |
|
171 |
tmp1.c[3] = mConvexity*(tmp1.tangent[3]) + (1.0f-mConvexity)*(next.w-curr.w); |
|
172 |
tmp1.d[3] = curr.w; |
|
169 |
tmpCache1.a[3] = mConvexity*( 2*curr.w + tmpCache1.velocity[3] - 2*next.w + tmpCache2.velocity[3]); |
|
170 |
tmpCache1.b[3] = mConvexity*(-3*curr.w - 2* tmpCache1.velocity[3] + 3*next.w - tmpCache2.velocity[3]); |
|
171 |
tmpCache1.c[3] = mConvexity*(tmpCache1.velocity[3]) + (1.0f-mConvexity)*(next.w-curr.w); |
|
172 |
tmpCache1.d[3] = curr.w; |
|
173 |
|
|
174 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) smoothOutSegment(tmpCache1); |
|
173 | 175 |
} |
174 | 176 |
} |
175 | 177 |
|
... | ... | |
522 | 524 |
{ |
523 | 525 |
int vecNext = getNext(vecCurr,t); |
524 | 526 |
next = vv.elementAt(vecNext); |
525 |
tmp2 = vc.elementAt(vecNext); |
|
527 |
tmpCache2 = vc.elementAt(vecNext);
|
|
526 | 528 |
|
527 |
if( tmp2.cached[0]!=next.x || tmp2.cached[1]!=next.y || tmp2.cached[2]!=next.z || tmp2.cached[3]!=next.w ) recomputeCache();
|
|
529 |
if( tmpCache2.cached[0]!=next.x || tmpCache2.cached[1]!=next.y || tmpCache2.cached[2]!=next.z || tmpCache2.cached[3]!=next.w ) recomputeCache();
|
|
528 | 530 |
} |
529 | 531 |
|
530 | 532 |
if( mSegment!= segment && vn!=null ) vn.elementAt(vecCurr).computeNoise(); |
531 | 533 |
|
532 | 534 |
mSegment = segment; |
533 |
|
|
534 | 535 |
time = time-vecCurr; |
535 |
|
|
536 |
tmp1 = vc.elementAt(vecCurr);
|
|
537 |
|
|
536 |
tmpCache1 = vc.elementAt(vecCurr); |
|
537 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) time = smoothSpeed(time, tmpCache1);
|
|
538 |
|
|
538 | 539 |
if( vn!=null ) |
539 | 540 |
{ |
540 | 541 |
time = noise(time,vecCurr); |
541 | 542 |
|
542 |
computeOrthonormalBaseMore(time,tmp1);
|
|
543 |
computeOrthonormalBaseMore(time, tmpCache1);
|
|
543 | 544 |
|
544 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0] + (baseV[1][0]*mFactor[0] + baseV[2][0]*mFactor[1] + baseV[3][0]*mFactor[2]);
|
|
545 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1] + (baseV[1][1]*mFactor[0] + baseV[2][1]*mFactor[1] + baseV[3][1]*mFactor[2]);
|
|
546 |
buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2] + (baseV[1][2]*mFactor[0] + baseV[2][2]*mFactor[1] + baseV[3][2]*mFactor[2]);
|
|
547 |
buffer[offset+3]= ((tmp1.a[3]*time+tmp1.b[3])*time+tmp1.c[3])*time+tmp1.d[3] + (baseV[1][3]*mFactor[0] + baseV[2][3]*mFactor[1] + baseV[3][3]*mFactor[2]);
|
|
545 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0] + (baseV[1][0]*mFactor[0] + baseV[2][0]*mFactor[1] + baseV[3][0]*mFactor[2]);
|
|
546 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1] + (baseV[1][1]*mFactor[0] + baseV[2][1]*mFactor[1] + baseV[3][1]*mFactor[2]);
|
|
547 |
buffer[offset+2]= ((tmpCache1.a[2]*time+ tmpCache1.b[2])*time+ tmpCache1.c[2])*time+ tmpCache1.d[2] + (baseV[1][2]*mFactor[0] + baseV[2][2]*mFactor[1] + baseV[3][2]*mFactor[2]);
|
|
548 |
buffer[offset+3]= ((tmpCache1.a[3]*time+ tmpCache1.b[3])*time+ tmpCache1.c[3])*time+ tmpCache1.d[3] + (baseV[1][3]*mFactor[0] + baseV[2][3]*mFactor[1] + baseV[3][3]*mFactor[2]);
|
|
548 | 549 |
} |
549 | 550 |
else |
550 | 551 |
{ |
551 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0];
|
|
552 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1];
|
|
553 |
buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2];
|
|
554 |
buffer[offset+3]= ((tmp1.a[3]*time+tmp1.b[3])*time+tmp1.c[3])*time+tmp1.d[3];
|
|
552 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0];
|
|
553 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1];
|
|
554 |
buffer[offset+2]= ((tmpCache1.a[2]*time+ tmpCache1.b[2])*time+ tmpCache1.c[2])*time+ tmpCache1.d[2];
|
|
555 |
buffer[offset+3]= ((tmpCache1.a[3]*time+ tmpCache1.b[3])*time+ tmpCache1.c[3])*time+ tmpCache1.d[3];
|
|
555 | 556 |
} |
556 | 557 |
|
557 | 558 |
break; |
src/main/java/org/distorted/library/type/Dynamic5D.java | ||
---|---|---|
44 | 44 |
curr = vv.elementAt(c); |
45 | 45 |
next = vv.elementAt(n); |
46 | 46 |
|
47 |
tmp1 = vc.elementAt(c); |
|
47 |
tmpCache1 = vc.elementAt(c);
|
|
48 | 48 |
|
49 | 49 |
float px = curr.x - prev.x; |
50 | 50 |
float py = curr.y - prev.y; |
... | ... | |
65 | 65 |
|
66 | 66 |
if( q>1 ) |
67 | 67 |
{ |
68 |
tmp1.tangent[0] = nx+px/q;
|
|
69 |
tmp1.tangent[1] = ny+py/q;
|
|
70 |
tmp1.tangent[2] = nz+pz/q;
|
|
71 |
tmp1.tangent[3] = nw+pw/q;
|
|
72 |
tmp1.tangent[4] = nv+pv/q;
|
|
68 |
tmpCache1.velocity[0] = nx+px/q;
|
|
69 |
tmpCache1.velocity[1] = ny+py/q;
|
|
70 |
tmpCache1.velocity[2] = nz+pz/q;
|
|
71 |
tmpCache1.velocity[3] = nw+pw/q;
|
|
72 |
tmpCache1.velocity[4] = nv+pv/q;
|
|
73 | 73 |
} |
74 | 74 |
else |
75 | 75 |
{ |
76 |
tmp1.tangent[0] = px+nx*q;
|
|
77 |
tmp1.tangent[1] = py+ny*q;
|
|
78 |
tmp1.tangent[2] = pz+nz*q;
|
|
79 |
tmp1.tangent[3] = pw+nw*q;
|
|
80 |
tmp1.tangent[4] = pv+nv*q;
|
|
76 |
tmpCache1.velocity[0] = px+nx*q;
|
|
77 |
tmpCache1.velocity[1] = py+ny*q;
|
|
78 |
tmpCache1.velocity[2] = pz+nz*q;
|
|
79 |
tmpCache1.velocity[3] = pw+nw*q;
|
|
80 |
tmpCache1.velocity[4] = pv+nv*q;
|
|
81 | 81 |
} |
82 | 82 |
} |
83 | 83 |
else |
84 | 84 |
{ |
85 |
tmp1.tangent[0] = 0.0f;
|
|
86 |
tmp1.tangent[1] = 0.0f;
|
|
87 |
tmp1.tangent[2] = 0.0f;
|
|
88 |
tmp1.tangent[3] = 0.0f;
|
|
89 |
tmp1.tangent[4] = 0.0f;
|
|
85 |
tmpCache1.velocity[0] = 0.0f;
|
|
86 |
tmpCache1.velocity[1] = 0.0f;
|
|
87 |
tmpCache1.velocity[2] = 0.0f;
|
|
88 |
tmpCache1.velocity[3] = 0.0f;
|
|
89 |
tmpCache1.velocity[4] = 0.0f;
|
|
90 | 90 |
} |
91 | 91 |
} |
92 | 92 |
|
... | ... | |
96 | 96 |
{ |
97 | 97 |
if( numPoints==1 ) |
98 | 98 |
{ |
99 |
tmp1= vc.elementAt(0);
|
|
99 |
tmpCache1 = vc.elementAt(0);
|
|
100 | 100 |
curr= vv.elementAt(0); |
101 | 101 |
|
102 |
tmp1.a[0] = tmp1.a[1] = tmp1.a[2] = tmp1.a[3] = tmp1.a[4] = 0.0f;
|
|
103 |
tmp1.b[0] = tmp1.b[1] = tmp1.b[2] = tmp1.b[3] = tmp1.b[4] = 0.0f;
|
|
104 |
tmp1.c[0] = curr.x; |
|
105 |
tmp1.c[1] = curr.y; |
|
106 |
tmp1.c[2] = curr.z; |
|
107 |
tmp1.c[3] = curr.w; |
|
108 |
tmp1.c[4] = curr.v; |
|
109 |
tmp1.d[0] = tmp1.d[1] = tmp1.d[2] = tmp1.d[3] = tmp1.d[4] = 0.0f;
|
|
102 |
tmpCache1.a[0] = tmpCache1.a[1] = tmpCache1.a[2] = tmpCache1.a[3] = tmpCache1.a[4] = 0.0f;
|
|
103 |
tmpCache1.b[0] = tmpCache1.b[1] = tmpCache1.b[2] = tmpCache1.b[3] = tmpCache1.b[4] = 0.0f;
|
|
104 |
tmpCache1.c[0] = curr.x;
|
|
105 |
tmpCache1.c[1] = curr.y;
|
|
106 |
tmpCache1.c[2] = curr.z;
|
|
107 |
tmpCache1.c[3] = curr.w;
|
|
108 |
tmpCache1.c[4] = curr.v;
|
|
109 |
tmpCache1.d[0] = tmpCache1.d[1] = tmpCache1.d[2] = tmpCache1.d[3] = tmpCache1.d[4] = 0.0f;
|
|
110 | 110 |
} |
111 | 111 |
else if( numPoints==2 ) |
112 | 112 |
{ |
113 |
tmp1= vc.elementAt(0);
|
|
114 |
tmp2= vc.elementAt(1);
|
|
113 |
tmpCache1 = vc.elementAt(0);
|
|
114 |
tmpCache2 = vc.elementAt(1);
|
|
115 | 115 |
curr= vv.elementAt(0); |
116 | 116 |
next= vv.elementAt(1); |
117 | 117 |
|
118 |
tmp1.a[0] = tmp1.a[1] = tmp1.a[2] = tmp1.a[3] = tmp1.a[4] = 0.0f;
|
|
119 |
tmp1.b[0] = tmp1.b[1] = tmp1.b[2] = tmp1.b[3] = tmp1.b[4] = 0.0f;
|
|
120 |
tmp1.c[0] = next.x - curr.x; |
|
121 |
tmp1.c[1] = next.y - curr.y; |
|
122 |
tmp1.c[2] = next.z - curr.z; |
|
123 |
tmp1.c[3] = next.w - curr.w; |
|
124 |
tmp1.c[4] = next.v - curr.v; |
|
125 |
tmp1.d[0] = curr.x; |
|
126 |
tmp1.d[1] = curr.y; |
|
127 |
tmp1.d[2] = curr.z; |
|
128 |
tmp1.d[3] = curr.w; |
|
129 |
tmp1.d[4] = curr.v; |
|
118 |
tmpCache1.a[0] = tmpCache1.a[1] = tmpCache1.a[2] = tmpCache1.a[3] = tmpCache1.a[4] = 0.0f;
|
|
119 |
tmpCache1.b[0] = tmpCache1.b[1] = tmpCache1.b[2] = tmpCache1.b[3] = tmpCache1.b[4] = 0.0f;
|
|
120 |
tmpCache1.c[0] = next.x - curr.x;
|
|
121 |
tmpCache1.c[1] = next.y - curr.y;
|
|
122 |
tmpCache1.c[2] = next.z - curr.z;
|
|
123 |
tmpCache1.c[3] = next.w - curr.w;
|
|
124 |
tmpCache1.c[4] = next.v - curr.v;
|
|
125 |
tmpCache1.d[0] = curr.x;
|
|
126 |
tmpCache1.d[1] = curr.y;
|
|
127 |
tmpCache1.d[2] = curr.z;
|
|
128 |
tmpCache1.d[3] = curr.w;
|
|
129 |
tmpCache1.d[4] = curr.v;
|
|
130 | 130 |
|
131 |
tmp2.a[0] = tmp2.a[1] = tmp2.a[2] = tmp2.a[3] = tmp2.a[4] = 0.0f;
|
|
132 |
tmp2.b[0] = tmp2.b[1] = tmp2.b[2] = tmp2.b[3] = tmp2.b[4] = 0.0f;
|
|
133 |
tmp2.c[0] = curr.x - next.x; |
|
134 |
tmp2.c[1] = curr.y - next.y; |
|
135 |
tmp2.c[2] = curr.z - next.z; |
|
136 |
tmp2.c[3] = curr.w - next.w; |
|
137 |
tmp2.c[4] = curr.v - next.v; |
|
138 |
tmp2.d[0] = next.x; |
|
139 |
tmp2.d[1] = next.y; |
|
140 |
tmp2.d[2] = next.z; |
|
141 |
tmp2.d[3] = next.w; |
|
142 |
tmp2.d[4] = next.v; |
|
131 |
tmpCache2.a[0] = tmpCache2.a[1] = tmpCache2.a[2] = tmpCache2.a[3] = tmpCache2.a[4] = 0.0f;
|
|
132 |
tmpCache2.b[0] = tmpCache2.b[1] = tmpCache2.b[2] = tmpCache2.b[3] = tmpCache2.b[4] = 0.0f;
|
|
133 |
tmpCache2.c[0] = curr.x - next.x;
|
|
134 |
tmpCache2.c[1] = curr.y - next.y;
|
|
135 |
tmpCache2.c[2] = curr.z - next.z;
|
|
136 |
tmpCache2.c[3] = curr.w - next.w;
|
|
137 |
tmpCache2.c[4] = curr.v - next.v;
|
|
138 |
tmpCache2.d[0] = next.x;
|
|
139 |
tmpCache2.d[1] = next.y;
|
|
140 |
tmpCache2.d[2] = next.z;
|
|
141 |
tmpCache2.d[3] = next.w;
|
|
142 |
tmpCache2.d[4] = next.v;
|
|
143 | 143 |
} |
144 | 144 |
else |
145 | 145 |
{ |
... | ... | |
151 | 151 |
{ |
152 | 152 |
n = i<numPoints-1 ? i+1:0; |
153 | 153 |
|
154 |
tmp1= vc.elementAt(i);
|
|
155 |
tmp2= vc.elementAt(n);
|
|
154 |
tmpCache1 = vc.elementAt(i);
|
|
155 |
tmpCache2 = vc.elementAt(n);
|
|
156 | 156 |
curr= vv.elementAt(i); |
157 | 157 |
next= vv.elementAt(n); |
158 | 158 |
|
159 |
tmp1.cached[0] = curr.x; |
|
160 |
tmp1.cached[1] = curr.y; |
|
161 |
tmp1.cached[2] = curr.z; |
|
162 |
tmp1.cached[3] = curr.w; |
|
163 |
tmp1.cached[4] = curr.v; |
|
159 |
tmpCache1.cached[0] = curr.x;
|
|
160 |
tmpCache1.cached[1] = curr.y;
|
|
161 |
tmpCache1.cached[2] = curr.z;
|
|
162 |
tmpCache1.cached[3] = curr.w;
|
|
163 |
tmpCache1.cached[4] = curr.v;
|
|
164 | 164 |
|
165 |
tmp1.a[0] = mConvexity*( 2*curr.x + tmp1.tangent[0] - 2*next.x + tmp2.tangent[0]);
|
|
166 |
tmp1.b[0] = mConvexity*(-3*curr.x - 2*tmp1.tangent[0] + 3*next.x - tmp2.tangent[0]);
|
|
167 |
tmp1.c[0] = mConvexity*(tmp1.tangent[0]) + (1.0f-mConvexity)*(next.x-curr.x);
|
|
168 |
tmp1.d[0] = curr.x; |
|
165 |
tmpCache1.a[0] = mConvexity*( 2*curr.x + tmpCache1.velocity[0] - 2*next.x + tmpCache2.velocity[0]);
|
|
166 |
tmpCache1.b[0] = mConvexity*(-3*curr.x - 2* tmpCache1.velocity[0] + 3*next.x - tmpCache2.velocity[0]);
|
|
167 |
tmpCache1.c[0] = mConvexity*(tmpCache1.velocity[0]) + (1.0f-mConvexity)*(next.x-curr.x);
|
|
168 |
tmpCache1.d[0] = curr.x;
|
|
169 | 169 |
|
170 |
tmp1.a[1] = mConvexity*( 2*curr.y + tmp1.tangent[1] - 2*next.y + tmp2.tangent[1]);
|
|
171 |
tmp1.b[1] = mConvexity*(-3*curr.y - 2*tmp1.tangent[1] + 3*next.y - tmp2.tangent[1]);
|
|
172 |
tmp1.c[1] = mConvexity*(tmp1.tangent[1]) + (1.0f-mConvexity)*(next.y-curr.y);
|
|
173 |
tmp1.d[1] = curr.y; |
|
170 |
tmpCache1.a[1] = mConvexity*( 2*curr.y + tmpCache1.velocity[1] - 2*next.y + tmpCache2.velocity[1]);
|
|
171 |
tmpCache1.b[1] = mConvexity*(-3*curr.y - 2* tmpCache1.velocity[1] + 3*next.y - tmpCache2.velocity[1]);
|
|
172 |
tmpCache1.c[1] = mConvexity*(tmpCache1.velocity[1]) + (1.0f-mConvexity)*(next.y-curr.y);
|
|
173 |
tmpCache1.d[1] = curr.y;
|
|
174 | 174 |
|
175 |
tmp1.a[2] = mConvexity*( 2*curr.z + tmp1.tangent[2] - 2*next.z + tmp2.tangent[2]);
|
|
176 |
tmp1.b[2] = mConvexity*(-3*curr.z - 2*tmp1.tangent[2] + 3*next.z - tmp2.tangent[2]);
|
|
177 |
tmp1.c[2] = mConvexity*(tmp1.tangent[2]) + (1.0f-mConvexity)*(next.z-curr.z);
|
|
178 |
tmp1.d[2] = curr.z; |
|
175 |
tmpCache1.a[2] = mConvexity*( 2*curr.z + tmpCache1.velocity[2] - 2*next.z + tmpCache2.velocity[2]);
|
|
176 |
tmpCache1.b[2] = mConvexity*(-3*curr.z - 2* tmpCache1.velocity[2] + 3*next.z - tmpCache2.velocity[2]);
|
|
177 |
tmpCache1.c[2] = mConvexity*(tmpCache1.velocity[2]) + (1.0f-mConvexity)*(next.z-curr.z);
|
|
178 |
tmpCache1.d[2] = curr.z;
|
|
179 | 179 |
|
180 |
tmp1.a[3] = mConvexity*( 2*curr.w + tmp1.tangent[3] - 2*next.w + tmp2.tangent[3]);
|
|
181 |
tmp1.b[3] = mConvexity*(-3*curr.w - 2*tmp1.tangent[3] + 3*next.w - tmp2.tangent[3]);
|
|
182 |
tmp1.c[3] = mConvexity*(tmp1.tangent[3]) + (1.0f-mConvexity)*(next.w-curr.w);
|
|
183 |
tmp1.d[3] = curr.w; |
|
180 |
tmpCache1.a[3] = mConvexity*( 2*curr.w + tmpCache1.velocity[3] - 2*next.w + tmpCache2.velocity[3]);
|
|
181 |
tmpCache1.b[3] = mConvexity*(-3*curr.w - 2* tmpCache1.velocity[3] + 3*next.w - tmpCache2.velocity[3]);
|
|
182 |
tmpCache1.c[3] = mConvexity*(tmpCache1.velocity[3]) + (1.0f-mConvexity)*(next.w-curr.w);
|
|
183 |
tmpCache1.d[3] = curr.w;
|
|
184 | 184 |
|
185 |
tmp1.a[4] = mConvexity*( 2*curr.v + tmp1.tangent[4] - 2*next.v + tmp2.tangent[4]); |
|
186 |
tmp1.b[4] = mConvexity*(-3*curr.v - 2*tmp1.tangent[4] + 3*next.v - tmp2.tangent[4]); |
|
187 |
tmp1.c[4] = mConvexity*(tmp1.tangent[4]) + (1.0f-mConvexity)*(next.v-curr.v); |
|
188 |
tmp1.d[4] = curr.v; |
|
185 |
tmpCache1.a[4] = mConvexity*( 2*curr.v + tmpCache1.velocity[4] - 2*next.v + tmpCache2.velocity[4]); |
|
186 |
tmpCache1.b[4] = mConvexity*(-3*curr.v - 2* tmpCache1.velocity[4] + 3*next.v - tmpCache2.velocity[4]); |
|
187 |
tmpCache1.c[4] = mConvexity*(tmpCache1.velocity[4]) + (1.0f-mConvexity)*(next.v-curr.v); |
|
188 |
tmpCache1.d[4] = curr.v; |
|
189 |
|
|
190 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) smoothOutSegment(tmpCache1); |
|
189 | 191 |
} |
190 | 192 |
} |
191 | 193 |
|
... | ... | |
545 | 547 |
{ |
546 | 548 |
int vecNext= getNext(vecCurr,t); |
547 | 549 |
next = vv.elementAt(vecNext); |
548 |
tmp2 = vc.elementAt(vecNext); |
|
550 |
tmpCache2 = vc.elementAt(vecNext);
|
|
549 | 551 |
|
550 |
if( tmp2.cached[0]!=next.x || tmp2.cached[1]!=next.y || tmp2.cached[2]!=next.z || tmp2.cached[3]!=next.w || tmp2.cached[4]!=next.v ) recomputeCache();
|
|
552 |
if( tmpCache2.cached[0]!=next.x || tmpCache2.cached[1]!=next.y || tmpCache2.cached[2]!=next.z || tmpCache2.cached[3]!=next.w || tmpCache2.cached[4]!=next.v ) recomputeCache();
|
|
551 | 553 |
} |
552 | 554 |
|
553 | 555 |
if( mSegment!= segment && vn!=null ) vn.elementAt(vecCurr).computeNoise(); |
554 | 556 |
|
555 | 557 |
mSegment = segment; |
556 |
|
|
557 | 558 |
time = time-vecCurr; |
558 |
|
|
559 |
tmp1 = vc.elementAt(vecCurr);
|
|
560 |
|
|
559 |
tmpCache1 = vc.elementAt(vecCurr); |
|
560 |
if( mSpeedMode==SPEED_MODE_SEGMENT_CONSTANT ) time = smoothSpeed(time, tmpCache1);
|
|
561 |
|
|
561 | 562 |
if( vn!=null ) |
562 | 563 |
{ |
563 | 564 |
time = noise(time,vecCurr); |
564 | 565 |
|
565 |
computeOrthonormalBaseMore(time,tmp1);
|
|
566 |
computeOrthonormalBaseMore(time, tmpCache1);
|
|
566 | 567 |
|
567 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0] + (baseV[1][0]*mFactor[0] + baseV[2][0]*mFactor[1] + baseV[3][0]*mFactor[2] + baseV[4][0]*mFactor[3]);
|
|
568 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1] + (baseV[1][1]*mFactor[0] + baseV[2][1]*mFactor[1] + baseV[3][1]*mFactor[2] + baseV[4][1]*mFactor[3]);
|
|
569 |
buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2] + (baseV[1][2]*mFactor[0] + baseV[2][2]*mFactor[1] + baseV[3][2]*mFactor[2] + baseV[4][2]*mFactor[3]);
|
|
570 |
buffer[offset+3]= ((tmp1.a[3]*time+tmp1.b[3])*time+tmp1.c[3])*time+tmp1.d[3] + (baseV[1][3]*mFactor[0] + baseV[2][3]*mFactor[1] + baseV[3][3]*mFactor[2] + baseV[4][3]*mFactor[3]);
|
|
571 |
buffer[offset+4]= ((tmp1.a[4]*time+tmp1.b[4])*time+tmp1.c[4])*time+tmp1.d[4] + (baseV[1][4]*mFactor[0] + baseV[2][4]*mFactor[1] + baseV[3][4]*mFactor[2] + baseV[4][4]*mFactor[3]);
|
|
568 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0] + (baseV[1][0]*mFactor[0] + baseV[2][0]*mFactor[1] + baseV[3][0]*mFactor[2] + baseV[4][0]*mFactor[3]);
|
|
569 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1] + (baseV[1][1]*mFactor[0] + baseV[2][1]*mFactor[1] + baseV[3][1]*mFactor[2] + baseV[4][1]*mFactor[3]);
|
|
570 |
buffer[offset+2]= ((tmpCache1.a[2]*time+ tmpCache1.b[2])*time+ tmpCache1.c[2])*time+ tmpCache1.d[2] + (baseV[1][2]*mFactor[0] + baseV[2][2]*mFactor[1] + baseV[3][2]*mFactor[2] + baseV[4][2]*mFactor[3]);
|
|
571 |
buffer[offset+3]= ((tmpCache1.a[3]*time+ tmpCache1.b[3])*time+ tmpCache1.c[3])*time+ tmpCache1.d[3] + (baseV[1][3]*mFactor[0] + baseV[2][3]*mFactor[1] + baseV[3][3]*mFactor[2] + baseV[4][3]*mFactor[3]);
|
|
572 |
buffer[offset+4]= ((tmpCache1.a[4]*time+ tmpCache1.b[4])*time+ tmpCache1.c[4])*time+ tmpCache1.d[4] + (baseV[1][4]*mFactor[0] + baseV[2][4]*mFactor[1] + baseV[3][4]*mFactor[2] + baseV[4][4]*mFactor[3]);
|
|
572 | 573 |
} |
573 | 574 |
else |
574 | 575 |
{ |
575 |
buffer[offset ]= ((tmp1.a[0]*time+tmp1.b[0])*time+tmp1.c[0])*time+tmp1.d[0];
|
|
576 |
buffer[offset+1]= ((tmp1.a[1]*time+tmp1.b[1])*time+tmp1.c[1])*time+tmp1.d[1];
|
|
577 |
buffer[offset+2]= ((tmp1.a[2]*time+tmp1.b[2])*time+tmp1.c[2])*time+tmp1.d[2];
|
|
578 |
buffer[offset+3]= ((tmp1.a[3]*time+tmp1.b[3])*time+tmp1.c[3])*time+tmp1.d[3];
|
|
579 |
buffer[offset+4]= ((tmp1.a[4]*time+tmp1.b[4])*time+tmp1.c[4])*time+tmp1.d[4];
|
|
576 |
buffer[offset ]= ((tmpCache1.a[0]*time+ tmpCache1.b[0])*time+ tmpCache1.c[0])*time+ tmpCache1.d[0];
|
|
577 |
buffer[offset+1]= ((tmpCache1.a[1]*time+ tmpCache1.b[1])*time+ tmpCache1.c[1])*time+ tmpCache1.d[1];
|
|
578 |
buffer[offset+2]= ((tmpCache1.a[2]*time+ tmpCache1.b[2])*time+ tmpCache1.c[2])*time+ tmpCache1.d[2];
|
|
579 |
buffer[offset+3]= ((tmpCache1.a[3]*time+ tmpCache1.b[3])*time+ tmpCache1.c[3])*time+ tmpCache1.d[3];
|
|
580 |
buffer[offset+4]= ((tmpCache1.a[4]*time+ tmpCache1.b[4])*time+ tmpCache1.c[4])*time+ tmpCache1.d[4];
|
|
580 | 581 |
} |
581 | 582 |
|
582 | 583 |
break; |
src/main/java/org/distorted/library/type/DynamicQuat.java | ||
---|---|---|
50 | 50 |
float vx,vy,vz,vw; |
51 | 51 |
} |
52 | 52 |
|
53 |
private Vector<VectorCacheQuat> vc; |
|
53 |
private final Vector<VectorCacheQuat> vc;
|
|
54 | 54 |
private VectorCacheQuat tmp1, tmp2; |
55 | 55 |
|
56 |
private Vector<Static4D> vv; |
|
56 |
private final Vector<Static4D> vv;
|
|
57 | 57 |
private Static4D curr, next; |
58 | 58 |
|
59 | 59 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
Also available in: Unified diff
Dynamics: introduce two speed modes - smooth and segment_constant.
Prepare the third mode - globally_constant.