Project

General

Profile

Download (7.49 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyBandagedAbstract.java @ 074a0284

1 e7569064 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objectlib.objects;
11
12
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
13
14
import org.distorted.library.type.Static3D;
15
import org.distorted.library.type.Static4D;
16
import org.distorted.objectlib.helpers.ObjectShape;
17 ae9d9227 leszek
import org.distorted.objectlib.metadata.Metadata;
18 97a75106 leszek
import org.distorted.objectlib.signature.ObjectSignature;
19 cf93ea4e Leszek Koltunski
import org.distorted.objectlib.main.InitAssets;
20 e7569064 Leszek Koltunski
import org.distorted.objectlib.shape.ShapeHexahedron;
21
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
22
23
///////////////////////////////////////////////////////////////////////////////////////////////////
24
25
public abstract class TwistyBandagedAbstract extends ShapeHexahedron
26
{
27
  static final Static3D[] ROT_AXIS = new Static3D[]
28
         {
29
           new Static3D(1,0,0),
30
           new Static3D(0,1,0),
31
           new Static3D(0,0,1)
32
         };
33
34
  private int[][] mBasicAngle;
35
  private float[][] mCuts;
36
  private int[][] mSolvedQuatsAbstract;
37
38
  protected ObjectShape[] mTmpShapes;
39
  protected int mNumVariants;
40
  protected float[][] mPosition;
41
  protected ObjectSignature mSignature;
42
43
///////////////////////////////////////////////////////////////////////////////////////////////////
44
45 ae9d9227 leszek
  public TwistyBandagedAbstract(int iconMode, float size, Static4D quat, Static3D move, float scale, Metadata meta, InitAssets asset)
46 e7569064 Leszek Koltunski
    {
47 ae9d9227 leszek
    super(iconMode, size, quat, move, scale, meta, asset);
48 e7569064 Leszek Koltunski
    }
49
50 88411172 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
51
52
  boolean isAShapeshifter(int[] numLayers)
53
    {
54
    int x = numLayers[0];
55
    int y = numLayers[1];
56
    int z = numLayers[2];
57
58
    return ( (((x-y)%2)==0 && x!=y) || (((x-z)%2)==0 && x!=z) || (((y-z)%2)==0 && y!=z) );
59
    }
60
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62
63
  @Override
64
  public int getInternalColor()
65
    {
66
    int[] numL = getNumLayers();
67
    return isAShapeshifter(numL) ? 0xff333333 : 0xff000000;
68
    }
69
70 e7569064 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
71
// return 0 if cubit is 'external' (it has at least two walls which belong to two different faces
72
// of the cuboid, faces which do not both rotate along the same axis! So: it is an edge, a corner,
73
// or a bandaged cubit which 'comes out' in two different, non-opposite, faces.
74
// Otherwise, if the cubit only comes out in one face or in two faces which are opposite to each other,
75
// return the index of the first of the three quats which rotate stuff in this face (so right or left
76
// return 1 because quats 1,2,3 are the ones rotating along the X axis)
77
78
  private int cubitIsExternal(float[] pos, float dx, float dy, float dz)
79
    {
80
    int len = pos.length/3;
81
    int x=0, y=0, z=0;
82
83
    for(int i=0; i<len; i++)
84
      {
85
      float cx = pos[3*i  ];
86
      float cy = pos[3*i+1];
87
      float cz = pos[3*i+2];
88
89
      if( cx>dx || cx<-dx ) x=1;
90
      if( cy>dy || cy<-dy ) y=1;
91
      if( cz>dz || cz<-dz ) z=1;
92
      }
93
94
    if( x+y+z>=2 ) return 0;
95
96
    if( x==1 ) return 1;
97
    if( y==1 ) return 4;
98
    if( z==1 ) return 7;
99
100
    android.util.Log.e("D", "ERROR: unsupported: internal cubit! ");
101
    return 0;
102
    }
103
104 f925d455 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
105
106
  float[][] getPositions()
107
    {
108 ae9d9227 leszek
    if( mPosition==null ) mPosition = getMetadata().getPos();
109 f925d455 Leszek Koltunski
    return mPosition;
110
    }
111
112 e7569064 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
113
114
  public float[][] getCuts(int[] numLayers)
115
    {
116
    if( mCuts==null )
117
      {
118
      mCuts = new float[3][];
119
120
      for(int axis=0; axis<3; axis++)
121
        {
122
        int len = numLayers[axis];
123
        float start = (2-len)*0.5f;
124
125
        if( len>=2 )
126
          {
127
          mCuts[axis] = new float[len-1];
128
          for(int i=0; i<len-1; i++) mCuts[axis][i] = start+i;
129
          }
130
        }
131
      }
132
133
    return mCuts;
134
    }
135
136
///////////////////////////////////////////////////////////////////////////////////////////////////
137
138
  public boolean[][] getLayerRotatable(int[] numLayers)
139
    {
140
    int numAxis = ROT_AXIS.length;
141
    boolean[][] layerRotatable = new boolean[numAxis][];
142
143
    for(int i=0; i<numAxis; i++)
144
      {
145
      layerRotatable[i] = new boolean[numLayers[i]];
146
      for(int j=0; j<numLayers[i]; j++) layerRotatable[i][j] = true;
147
      }
148
149 88411172 leszek
    if( isAShapeshifter(numLayers) && (numLayers[0]==1 || numLayers[1]==1 || numLayers[2]==1) )
150
      {
151
      for(int i=0; i<numAxis; i++)
152
        {
153
        if( (numLayers[i]%2)==1 )
154
          {
155
          int mid = (numLayers[i]-1)/2;
156
          layerRotatable[i][mid] = false;
157
          }
158
        }
159
      }
160
161 e7569064 Leszek Koltunski
    return layerRotatable;
162
    }
163
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165
166
  public int getTouchControlSplit()
167
    {
168
    return TYPE_NOT_SPLIT;
169
    }
170
171
///////////////////////////////////////////////////////////////////////////////////////////////////
172
173
  public int[][][] getEnabled()
174
    {
175
    return new int[][][] { {{1,2}},{{1,2}},{{0,2}},{{0,2}},{{0,1}},{{0,1}} };
176
    }
177
178
///////////////////////////////////////////////////////////////////////////////////////////////////
179
180
  public Static3D[] getFaceAxis()
181
    {
182
    return TouchControlHexahedron.FACE_AXIS;
183
    }
184
185
///////////////////////////////////////////////////////////////////////////////////////////////////
186
187 ebe8c08e leszek
  public float[][][] getStickerAngles()
188 e7569064 Leszek Koltunski
    {
189 f925d455 Leszek Koltunski
    return null;
190 e7569064 Leszek Koltunski
    }
191
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193
194 f925d455 Leszek Koltunski
  public float[][] getCubitPositions(int[] numLayers)
195 e7569064 Leszek Koltunski
    {
196 f925d455 Leszek Koltunski
    return getPositions();
197 e7569064 Leszek Koltunski
    }
198
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200
201
  public Static3D[] getRotationAxis()
202
    {
203
    return ROT_AXIS;
204
    }
205
206 7ca7a08f leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
207 64f13076 leszek
// switch off shape-shifting cuboids here - problems with scrambling.
208 7ca7a08f leszek
209
  private int basicAngle(int d1, int d2)
210
    {
211 64f13076 leszek
    return d1==d2 ? 4 : 2;
212 7ca7a08f leszek
    }
213
214 e7569064 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
215
216
  public int[][] getBasicAngles()
217
    {
218
     if( mBasicAngle==null )
219
      {
220
      int[] num = getNumLayers();
221
      int numX = num[0];
222
      int numY = num[1];
223
      int numZ = num[2];
224
225 7ca7a08f leszek
      int x = basicAngle(numY,numZ);
226
      int y = basicAngle(numX,numZ);
227
      int z = basicAngle(numX,numY);
228 e7569064 Leszek Koltunski
229
      int[] tmpX = new int[numX];
230
      for(int i=0; i<numX; i++) tmpX[i] = x;
231
      int[] tmpY = new int[numY];
232
      for(int i=0; i<numY; i++) tmpY[i] = y;
233
      int[] tmpZ = new int[numZ];
234
      for(int i=0; i<numZ; i++) tmpZ[i] = z;
235
236
      mBasicAngle = new int[][] { tmpX,tmpY,tmpZ };
237
      }
238
239
    return mBasicAngle;
240
    }
241
}