Revision 10a2e360
Added by Leszek Koltunski over 5 years ago
| src/main/java/org/distorted/object/Cubit.java | ||
|---|---|---|
| 52 | 52 |
DistortedNode mNode; |
| 53 | 53 |
DistortedEffects mEffect; |
| 54 | 54 |
Static4D mQuatScramble; |
| 55 |
int[] mRotationRow; |
|
| 55 | 56 |
|
| 56 | 57 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 57 | 58 |
// Because of quatMultiplication, errors can accumulate - so to avoid this, we |
| ... | ... | |
| 149 | 150 |
int roundedZ = (int)(rotatedZ+0.1f); |
| 150 | 151 |
|
| 151 | 152 |
currentPosition.set(roundedX, roundedY, roundedZ); |
| 153 |
computeRotationRow(); |
|
| 154 |
} |
|
| 155 |
|
|
| 156 |
|
|
| 157 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 158 |
// TODO: this is only right in case of RubikCube |
|
| 159 |
|
|
| 160 |
private void computeRotationRow() |
|
| 161 |
{
|
|
| 162 |
mRotationRow[0] = (int)mCurrentPosition.get0(); |
|
| 163 |
mRotationRow[1] = (int)mCurrentPosition.get1(); |
|
| 164 |
mRotationRow[2] = (int)mCurrentPosition.get2(); |
|
| 152 | 165 |
} |
| 153 | 166 |
|
| 154 | 167 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 171 | 184 |
mCurrentPosition = position; |
| 172 | 185 |
mRotateEffect = new MatrixEffectRotate(mRotationAngle, mRotationAxis, matrCenter); |
| 173 | 186 |
|
| 187 |
mRotationRow = new int[mParent.ROTATION_AXIS.length]; |
|
| 188 |
computeRotationRow(); |
|
| 189 |
|
|
| 174 | 190 |
mEffect = new DistortedEffects(); |
| 175 | 191 |
mEffect.apply(mParent.mSinkEffect); |
| 176 | 192 |
mEffect.apply( new MatrixEffectMove(vector) ); |
| src/main/java/org/distorted/object/RubikCube.java | ||
|---|---|---|
| 82 | 82 |
|
| 83 | 83 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 84 | 84 |
|
| 85 |
int[][] getCubitPositions(int size)
|
|
| 85 |
Static3D[] getCubitPositions(int size)
|
|
| 86 | 86 |
{
|
| 87 |
int[][] tmp = new int[getNumCubits(size)][3]; |
|
| 87 |
int numCubits = size>1 ? 6*size*size - 12*size + 8 : 1; |
|
| 88 |
Static3D[] tmp = new Static3D[numCubits]; |
|
| 88 | 89 |
|
| 89 | 90 |
int currentPosition = 0; |
| 90 | 91 |
|
| 91 | 92 |
for(int x = 0; x<size; x++) |
| 92 | 93 |
for(int y = 0; y<size; y++) |
| 93 | 94 |
for(int z = 0; z<size; z++) |
| 94 |
{
|
|
| 95 | 95 |
if( x==0 || x==size-1 || y==0 || y==size-1 || z==0 || z==size-1 ) |
| 96 | 96 |
{
|
| 97 |
tmp[currentPosition][0] = x; |
|
| 98 |
tmp[currentPosition][1] = y; |
|
| 99 |
tmp[currentPosition][2] = z; |
|
| 100 |
|
|
| 101 |
currentPosition++; |
|
| 97 |
tmp[currentPosition++] = new Static3D(x,y,z); |
|
| 102 | 98 |
} |
| 103 |
} |
|
| 104 | 99 |
|
| 105 | 100 |
return tmp; |
| 106 | 101 |
} |
| 107 | 102 |
|
| 108 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 109 |
// i.e. size^3 - (size-2)^3 - number of cubits in the outside wall of the Cube (we don't create or |
|
| 110 |
// render the inside) |
|
| 111 |
|
|
| 112 |
int getNumCubits(int size) |
|
| 113 |
{
|
|
| 114 |
return size>1 ? 6*size*size - 12*size + 8 : 1; |
|
| 115 |
} |
|
| 116 |
|
|
| 117 | 103 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 118 | 104 |
|
| 119 | 105 |
float[] getLegalQuats() |
| src/main/java/org/distorted/object/RubikObject.java | ||
|---|---|---|
| 76 | 76 |
|
| 77 | 77 |
resizeFBO(NODE_FBO_SIZE, NODE_FBO_SIZE); |
| 78 | 78 |
|
| 79 |
Static3D[] positions = getCubitPositions(size); |
|
| 80 |
|
|
| 79 | 81 |
LEGAL_QUATS = getLegalQuats(); |
| 80 |
NUM_CUBITS = getNumCubits(size);
|
|
| 82 |
NUM_CUBITS = positions.length;
|
|
| 81 | 83 |
ROTATION_AXIS = getRotationAxis(); |
| 82 | 84 |
|
| 83 | 85 |
mSize = size; |
| ... | ... | |
| 106 | 108 |
mTexture = new DistortedTexture(); |
| 107 | 109 |
|
| 108 | 110 |
int vertices = (int)(24.0f/mSize + 2.0f); |
| 109 |
int[][] positions = getCubitPositions(size); |
|
| 110 | 111 |
|
| 111 | 112 |
for(int i=0; i<NUM_CUBITS; i++) |
| 112 | 113 |
{
|
| 113 |
Static3D pos = new Static3D(positions[i][0],positions[i][1],positions[i][2]); |
|
| 114 | 114 |
MeshBase cubitMesh = createCubitMesh(vertices); |
| 115 |
mCubits[i] = new Cubit(this,cubitMesh,pos); |
|
| 115 |
mCubits[i] = new Cubit(this,cubitMesh,positions[i]);
|
|
| 116 | 116 |
textureCubitMesh(cubitMesh,i); |
| 117 | 117 |
|
| 118 | 118 |
attach(mCubits[i].mNode); |
| ... | ... | |
| 149 | 149 |
} |
| 150 | 150 |
|
| 151 | 151 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 152 |
// TODO: only works for RubikCube |
|
| 153 | 152 |
|
| 154 | 153 |
private boolean belongsToRotation( int cubit, int axis, int row) |
| 155 | 154 |
{
|
| 156 |
Static3D position = mCubits[cubit].mCurrentPosition; |
|
| 157 |
|
|
| 158 |
if( axis==0 ) return position.get0()==row; |
|
| 159 |
if( axis==1 ) return position.get1()==row; |
|
| 160 |
if( axis==2 ) return position.get2()==row; |
|
| 161 |
|
|
| 162 |
return false; |
|
| 155 |
return mCubits[cubit].mRotationRow[axis]==row; |
|
| 163 | 156 |
} |
| 164 | 157 |
|
| 165 | 158 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 403 | 396 |
|
| 404 | 397 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 405 | 398 |
|
| 406 |
abstract int getNumCubits(int size); |
|
| 407 |
abstract int[][] getCubitPositions(int size); |
|
| 399 |
public int getNumRotations() |
|
| 400 |
{
|
|
| 401 |
return ROTATION_AXIS.length; |
|
| 402 |
} |
|
| 403 |
|
|
| 404 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 405 |
|
|
| 406 |
abstract Static3D[] getCubitPositions(int size); |
|
| 408 | 407 |
abstract float[] getLegalQuats(); |
| 409 | 408 |
abstract int getNumFaces(); |
| 410 | 409 |
abstract void createFaceTexture(Canvas canvas, Paint paint, int face); |
Also available in: Unified diff
Progress towards generalizing belongsToRotation()