Revision 48fec01e
Added by Leszek Koltunski over 2 years ago
src/main/java/org/distorted/objects/TwistyPyraminx.java | ||
---|---|---|
37 | 37 |
|
38 | 38 |
public class TwistyPyraminx extends TwistyObject |
39 | 39 |
{ |
40 |
static final float SCREEN_RATIO = 0.88f; |
|
41 |
|
|
42 | 40 |
static final Static3D[] ROT_AXIS = new Static3D[] |
43 | 41 |
{ |
44 | 42 |
new Static3D( 0,-SQ3/3,-SQ6/3), |
... | ... | |
47 | 45 |
new Static3D(-SQ6/3,+SQ3/3, 0), |
48 | 46 |
}; |
49 | 47 |
|
50 |
private static final int[] BASIC_ANGLE = new int[] { 3,3,3,3 }; |
|
51 |
|
|
52 | 48 |
private static final int[] FACE_COLORS = new int[] |
53 | 49 |
{ |
54 | 50 |
COLOR_GREEN , COLOR_YELLOW, |
55 | 51 |
COLOR_BLUE , COLOR_RED |
56 | 52 |
}; |
57 | 53 |
|
58 |
// computed with res/raw/compute_quats.c |
|
59 |
private static final Static4D[] QUATS = new Static4D[] |
|
60 |
{ |
|
61 |
new Static4D( 0.0f, 0.0f, 0.0f, 1.0f), |
|
62 |
new Static4D( 0.0f, 1.0f, 0.0f, 0.0f), |
|
63 |
new Static4D( SQ2/2, 0.5f, 0.0f, 0.5f), |
|
64 |
new Static4D(-SQ2/2, 0.5f, 0.0f, 0.5f), |
|
65 |
new Static4D( 0.0f, -0.5f, -SQ2/2, 0.5f), |
|
66 |
new Static4D( 0.0f, -0.5f, SQ2/2, 0.5f), |
|
67 |
new Static4D( SQ2/2, 0.5f, 0.0f, -0.5f), |
|
68 |
new Static4D(-SQ2/2, 0.5f, 0.0f, -0.5f), |
|
69 |
new Static4D( 0.0f, -0.5f, -SQ2/2, -0.5f), |
|
70 |
new Static4D( 0.0f, -0.5f, SQ2/2, -0.5f), |
|
71 |
new Static4D( SQ2/2, 0.0f, SQ2/2, 0.0f), |
|
72 |
new Static4D(-SQ2/2, 0.0f, SQ2/2, 0.0f) |
|
73 |
}; |
|
74 |
|
|
75 |
private static final double[][] VERTICES_TETRA = new double[][] |
|
76 |
{ |
|
77 |
{-0.5, SQ2/4, 0.0}, |
|
78 |
{ 0.5, SQ2/4, 0.0}, |
|
79 |
{ 0.0,-SQ2/4, 0.5}, |
|
80 |
{ 0.0,-SQ2/4,-0.5} |
|
81 |
}; |
|
82 |
|
|
83 |
private static final int[][] VERT_INDEXES_TETRA = new int[][] |
|
84 |
{ |
|
85 |
{2,1,0}, // counterclockwise! |
|
86 |
{3,0,1}, |
|
87 |
{3,2,0}, |
|
88 |
{2,3,1} |
|
89 |
}; |
|
90 |
|
|
91 |
private static final double[][] VERTICES_OCTA = new double[][] |
|
92 |
{ |
|
93 |
{ 0.5, 0.0, 0.5}, |
|
94 |
{ 0.5, 0.0,-0.5}, |
|
95 |
{-0.5, 0.0,-0.5}, |
|
96 |
{-0.5, 0.0, 0.5}, |
|
97 |
{ 0.0, SQ2/2, 0.0}, |
|
98 |
{ 0.0,-SQ2/2, 0.0} |
|
99 |
}; |
|
100 |
|
|
101 |
private static final int[][] VERT_INDEXES_OCTA = new int[][] |
|
102 |
{ |
|
103 |
{3,0,4}, // counterclockwise! |
|
104 |
{0,1,4}, |
|
105 |
{1,2,4}, |
|
106 |
{2,3,4}, |
|
107 |
{5,0,3}, |
|
108 |
{5,1,0}, |
|
109 |
{5,2,1}, |
|
110 |
{5,3,2} |
|
111 |
}; |
|
112 |
|
|
113 |
private static final float[][] STICKERS = new float[][] |
|
114 |
{ |
|
115 |
{ -0.4330127f, -0.25f, 0.4330127f, -0.25f, 0.0f, 0.5f } |
|
116 |
}; |
|
117 |
|
|
118 |
private static final ObjectSticker[] mStickers; |
|
119 |
|
|
120 |
static |
|
121 |
{ |
|
122 |
mStickers = new ObjectSticker[STICKERS.length]; |
|
123 |
final float stroke = 0.08f; |
|
124 |
final float radius = 0.06f; |
|
125 |
final float[] radii= {radius,radius,radius}; |
|
126 |
mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke); |
|
127 |
} |
|
128 |
|
|
129 | 54 |
private int mCurrState; |
130 | 55 |
private int mIndexExcluded; |
131 | 56 |
private ScrambleState[] mStates; |
132 | 57 |
private int[][] mScrambleTable; |
133 | 58 |
private int[] mNumOccurences; |
59 |
private int[] mBasicAngle; |
|
60 |
private Static4D[] mQuats; |
|
61 |
private ObjectSticker[] mStickers; |
|
134 | 62 |
|
135 | 63 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
136 | 64 |
|
... | ... | |
142 | 70 |
initializeScrambleStates(size); |
143 | 71 |
} |
144 | 72 |
|
73 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
74 |
|
|
75 |
private void initializeQuats() |
|
76 |
{ |
|
77 |
mQuats = new Static4D[] |
|
78 |
{ |
|
79 |
new Static4D( 0.0f, 0.0f, 0.0f, 1.0f), |
|
80 |
new Static4D( 0.0f, 1.0f, 0.0f, 0.0f), |
|
81 |
new Static4D( SQ2/2, 0.5f, 0.0f, 0.5f), |
|
82 |
new Static4D(-SQ2/2, 0.5f, 0.0f, 0.5f), |
|
83 |
new Static4D( 0.0f, -0.5f, -SQ2/2, 0.5f), |
|
84 |
new Static4D( 0.0f, -0.5f, SQ2/2, 0.5f), |
|
85 |
new Static4D( SQ2/2, 0.5f, 0.0f, -0.5f), |
|
86 |
new Static4D(-SQ2/2, 0.5f, 0.0f, -0.5f), |
|
87 |
new Static4D( 0.0f, -0.5f, -SQ2/2, -0.5f), |
|
88 |
new Static4D( 0.0f, -0.5f, SQ2/2, -0.5f), |
|
89 |
new Static4D( SQ2/2, 0.0f, SQ2/2, 0.0f), |
|
90 |
new Static4D(-SQ2/2, 0.0f, SQ2/2, 0.0f) |
|
91 |
}; |
|
92 |
} |
|
93 |
|
|
145 | 94 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
146 | 95 |
|
147 | 96 |
private int[][] generateState(int start, int end) |
... | ... | |
182 | 131 |
|
183 | 132 |
int[] getSolvedQuats(int cubit, int numLayers) |
184 | 133 |
{ |
134 |
if( mQuats==null ) initializeQuats(); |
|
185 | 135 |
int status = retCubitSolvedStatus(cubit,numLayers); |
186 |
return status<0 ? null : buildSolvedQuats(MovementPyraminx.FACE_AXIS[status],QUATS);
|
|
136 |
return status<0 ? null : buildSolvedQuats(MovementPyraminx.FACE_AXIS[status],mQuats);
|
|
187 | 137 |
} |
188 | 138 |
|
189 | 139 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
242 | 192 |
|
243 | 193 |
Static4D[] getQuats() |
244 | 194 |
{ |
245 |
return QUATS; |
|
195 |
if( mQuats==null ) initializeQuats(); |
|
196 |
return mQuats; |
|
246 | 197 |
} |
247 | 198 |
|
248 | 199 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
263 | 214 |
|
264 | 215 |
int getNumStickerTypes(int numLayers) |
265 | 216 |
{ |
266 |
return STICKERS.length;
|
|
217 |
return 1;
|
|
267 | 218 |
} |
268 | 219 |
|
269 | 220 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
295 | 246 |
|
296 | 247 |
float getScreenRatio() |
297 | 248 |
{ |
298 |
return SCREEN_RATIO;
|
|
249 |
return 0.88f;
|
|
299 | 250 |
} |
300 | 251 |
|
301 | 252 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
348 | 299 |
|
349 | 300 |
if( variant==0 ) |
350 | 301 |
{ |
302 |
double[][] vertices = new double[][] { { 0.5,0.0,0.5},{ 0.5,0.0,-0.5},{-0.5,0.0,-0.5},{-0.5,0.0,0.5},{ 0.0,SQ2/2,0.0},{ 0.0,-SQ2/2,0.0} }; |
|
303 |
int[][] vert_indices = new int[][] { {3,0,4},{0,1,4},{1,2,4},{2,3,4},{5,0,3},{5,1,0},{5,2,1},{5,3,2} }; |
|
351 | 304 |
int N = numLayers==3? 6 : 5; |
352 | 305 |
int E = numLayers==3? 2 : 1; |
353 | 306 |
float[][] bands = new float[][] { {0.05f,35,0.5f,0.8f,N,E,E} }; |
... | ... | |
356 | 309 |
int[] cornerIndices = new int[] { 0,0,0,0,0,0 }; |
357 | 310 |
float[][] centers = new float[][] { {0.0f, 0.0f, 0.0f} }; |
358 | 311 |
int[] centerIndices = new int[] { 0,0,0,0,0,0 }; |
359 |
return new ObjectShape(VERTICES_OCTA,VERT_INDEXES_OCTA,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
312 |
return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
360 | 313 |
} |
361 | 314 |
else |
362 | 315 |
{ |
316 |
double[][] vertices = new double[][] { {-0.5, SQ2/4, 0.0},{ 0.5, SQ2/4, 0.0},{ 0.0,-SQ2/4, 0.5},{ 0.0,-SQ2/4,-0.5} }; |
|
317 |
int[][] vert_indices = new int[][] { {2,1,0},{3,0,1},{3,2,0},{2,3,1} }; |
|
363 | 318 |
int N = numLayers==3? 6 : 5; |
364 | 319 |
int E = numLayers==3? 2 : 1; |
365 | 320 |
float[][] bands = new float[][] { {0.05f,35,0.5f,0.8f,N,E,E} }; |
... | ... | |
368 | 323 |
int[] cornerIndices = new int[] { 0,0,0,0 }; |
369 | 324 |
float[][] centers = new float[][] { {0.0f, 0.0f, 0.0f} }; |
370 | 325 |
int[] centerIndices = new int[] { 0,0,0,0 }; |
371 |
return new ObjectShape(VERTICES_TETRA,VERT_INDEXES_TETRA,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
326 |
return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
372 | 327 |
} |
373 | 328 |
} |
374 | 329 |
|
... | ... | |
376 | 331 |
|
377 | 332 |
Static4D getQuat(int cubit, int numLayers) |
378 | 333 |
{ |
379 |
return QUATS[0]; |
|
334 |
if( mQuats==null ) initializeQuats(); |
|
335 |
return mQuats[0]; |
|
380 | 336 |
} |
381 | 337 |
|
382 | 338 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
404 | 360 |
|
405 | 361 |
ObjectSticker retSticker(int face) |
406 | 362 |
{ |
363 |
if( mStickers==null ) |
|
364 |
{ |
|
365 |
float[][] STICKERS = new float[][] { { -0.4330127f, -0.25f, 0.4330127f, -0.25f, 0.0f, 0.5f } }; |
|
366 |
final float stroke = 0.08f; |
|
367 |
final float radius = 0.06f; |
|
368 |
final float[] radii= {radius,radius,radius}; |
|
369 |
mStickers = new ObjectSticker[STICKERS.length]; |
|
370 |
mStickers[0] = new ObjectSticker(STICKERS[0],null,radii,stroke); |
|
371 |
} |
|
372 |
|
|
407 | 373 |
return mStickers[face/NUM_FACES]; |
408 | 374 |
} |
409 | 375 |
|
... | ... | |
475 | 441 |
|
476 | 442 |
public int[] getBasicAngle() |
477 | 443 |
{ |
478 |
return BASIC_ANGLE; |
|
444 |
if( mBasicAngle ==null ) mBasicAngle = new int[] { 3,3,3,3 }; |
|
445 |
return mBasicAngle; |
|
479 | 446 |
} |
480 | 447 |
|
481 | 448 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
Also available in: Unified diff
Remove statics from the Pyraminx class.