Revision 693cc52e
Added by Leszek Koltunski 12 months ago
src/main/java/org/distorted/objectlib/tablebases/TablebasesAbstract.java | ||
---|---|---|
32 | 32 |
private final int mNumQuats; |
33 | 33 |
private final float[][] mCuts; |
34 | 34 |
private final int[] mNumCuts; |
35 |
private final int[][] mCubitRows; |
|
36 |
private final int[][] mCubitQuatMap; |
|
37 |
private final float[][] mQuats; |
|
38 |
private final float[][] mPosition; |
|
35 | 39 |
|
36 | 40 |
private int[][] mQuatMult; |
37 | 41 |
private int[] mInvertedQuat; |
... | ... | |
39 | 43 |
Tablebase mTablebase; |
40 | 44 |
boolean mInitialized; |
41 | 45 |
|
42 |
final float[][] mQuats; |
|
43 | 46 |
final int mScalingFactor; |
44 | 47 |
final int mNumAxis; |
45 |
final float[][] mPosition; |
|
46 | 48 |
final int[][] mRotRow; |
47 | 49 |
final int mNumCubits; |
48 | 50 |
final boolean[][] mRotatable; |
49 | 51 |
|
50 |
static final float[] mTmp = new float[4]; |
|
52 |
private static final float[] mTmp = new float[4];
|
|
51 | 53 |
|
52 | 54 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
53 | 55 |
|
... | ... | |
102 | 104 |
|
103 | 105 |
mScalingFactor = scaling; |
104 | 106 |
mRotRow = new int[mNumCubits][mNumAxis]; |
107 |
|
|
108 |
mCubitRows = new int[mNumCubits][mNumAxis]; |
|
109 |
mCubitQuatMap = new int[mNumCubits][mNumQuats]; |
|
110 |
|
|
111 |
for(int i=0; i<mNumCubits; i++) |
|
112 |
{ |
|
113 |
computeInitRow(i,mCubitRows[i]); |
|
114 |
for(int j=0; j<mNumQuats; j++) mCubitQuatMap[i][j] = computeMap(i,j); |
|
115 |
} |
|
116 |
|
|
105 | 117 |
mInitialized = false; |
106 | 118 |
} |
107 | 119 |
|
... | ... | |
135 | 147 |
} |
136 | 148 |
} |
137 | 149 |
|
150 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
151 |
|
|
152 |
private int computeMap(int cubit, int quat) |
|
153 |
{ |
|
154 |
float[] pos = mPosition[cubit]; |
|
155 |
float[] q = mQuats[quat]; |
|
156 |
|
|
157 |
QuatHelper.rotateVectorByQuat(mTmp,pos[0],pos[1],pos[2],1.0f,q); |
|
158 |
float dist = Float.MAX_VALUE; |
|
159 |
int min = 0; |
|
160 |
|
|
161 |
for(int i=0; i<mNumCubits; i++) |
|
162 |
{ |
|
163 |
float[] p = mPosition[i]; |
|
164 |
float dx = p[0]-mTmp[0]; |
|
165 |
float dy = p[1]-mTmp[1]; |
|
166 |
float dz = p[2]-mTmp[2]; |
|
167 |
|
|
168 |
float d = dx*dx + dy*dy + dz*dz; |
|
169 |
|
|
170 |
if( d<dist ) |
|
171 |
{ |
|
172 |
dist = d; |
|
173 |
min = i; |
|
174 |
} |
|
175 |
} |
|
176 |
|
|
177 |
return min; |
|
178 |
} |
|
179 |
|
|
138 | 180 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
139 | 181 |
|
140 | 182 |
int computeBitLayer(int ax, int layer) |
... | ... | |
144 | 186 |
|
145 | 187 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
146 | 188 |
|
147 |
void computeRow(float[] pos, int quat, int[] output)
|
|
189 |
void computeInitRow(int cubit, int[] output)
|
|
148 | 190 |
{ |
149 |
int len = pos.length/3; |
|
150 |
float[] q = mQuats[quat]; |
|
191 |
float[] pos = mPosition[cubit]; |
|
151 | 192 |
int num = output.length; |
152 | 193 |
|
153 |
for(int i=0; i<len; i++)
|
|
194 |
for(int i=0; i<num; i++)
|
|
154 | 195 |
{ |
155 |
QuatHelper.rotateVectorByQuat(mTmp,pos[3*i],pos[3*i+1],pos[3*i+2],1.0f,q); |
|
156 |
|
|
157 |
for(int j=0; j<num; j++) |
|
158 |
{ |
|
159 |
output[j] = 0; |
|
160 |
Static3D axis = mAxis[j]; |
|
161 |
float axisX = axis.get0(); |
|
162 |
float axisY = axis.get1(); |
|
163 |
float axisZ = axis.get2(); |
|
164 |
float casted = mTmp[0]*axisX + mTmp[1]*axisY + mTmp[2]*axisZ; |
|
165 |
output[j] |= computeSingleRow(j,casted); |
|
166 |
} |
|
196 |
Static3D axis = mAxis[i]; |
|
197 |
float axisX = axis.get0(); |
|
198 |
float axisY = axis.get1(); |
|
199 |
float axisZ = axis.get2(); |
|
200 |
float casted = pos[0]*axisX + pos[1]*axisY + pos[2]*axisZ; |
|
201 |
output[i] = computeSingleRow(i,casted); |
|
167 | 202 |
} |
168 | 203 |
} |
169 | 204 |
|
... | ... | |
181 | 216 |
return (1<<num); |
182 | 217 |
} |
183 | 218 |
|
219 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
220 |
|
|
221 |
int[] computeRow(int cubit, int quat) |
|
222 |
{ |
|
223 |
int newPos = mCubitQuatMap[cubit][quat]; |
|
224 |
return mCubitRows[newPos]; |
|
225 |
} |
|
226 |
|
|
184 | 227 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
185 | 228 |
// remember about the double cover or unit quaternions! |
186 | 229 |
|
... | ... | |
281 | 324 |
byte newLevel = (byte)(level+1); |
282 | 325 |
int quatBasis = 0; |
283 | 326 |
|
284 |
for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
|
|
327 |
for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
|
|
285 | 328 |
|
286 | 329 |
for(int ax=0; ax<mNumAxis; ax++) |
287 | 330 |
{ |
... | ... | |
482 | 525 |
data[2]=1; |
483 | 526 |
data[3]=1; |
484 | 527 |
|
485 |
for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
|
|
528 |
for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
|
|
486 | 529 |
|
487 | 530 |
for(int s=0; s<mScalingFactor && !found; s++) |
488 | 531 |
{ |
... | ... | |
586 | 629 |
data[2]=1; |
587 | 630 |
data[3]=1; |
588 | 631 |
|
589 |
for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
|
|
632 |
for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
|
|
590 | 633 |
|
591 | 634 |
for(int s=0; s<mScalingFactor; s++) |
592 | 635 |
{ |
Also available in: Unified diff
speedup