Project

General

Profile

« Previous | Next » 

Revision afd7e804

Added by Leszek Koltunski 12 months ago

Everything about the nature of an object being bandaged should now hopefully be abstracted out in the single class - 'BandagedObject'

View differences:

src/main/java/org/distorted/bandaged/BandagedCreatorRenderer.java
429 429

  
430 430
   private void rescaleObject()
431 431
     {
432
     float size = mObject.getSize();
432
     float size = mObject.getMaxSize();
433 433
     final float Q = mObjectScreenRatio/size;
434 434
     mScaleValue = mWidth<mHeight ? Q*mWidth : Q*mHeight;
435 435
     mScale.set( mScaleValue,mScaleValue,mScaleValue );
src/main/java/org/distorted/bandaged/BandagedCubit.java
26 26
import org.distorted.library.type.Static1D;
27 27
import org.distorted.library.type.Static3D;
28 28
import org.distorted.library.type.Static4D;
29
import org.distorted.objectlib.helpers.FactoryBandagedCubit;
30 29
import org.distorted.objectlib.helpers.FactoryCubit;
31 30

  
32
import static org.distorted.objectlib.main.TwistyObject.COLOR_BLUE;
33
import static org.distorted.objectlib.main.TwistyObject.COLOR_GREEN;
34
import static org.distorted.objectlib.main.TwistyObject.COLOR_ORANGE;
35
import static org.distorted.objectlib.main.TwistyObject.COLOR_RED;
36
import static org.distorted.objectlib.main.TwistyObject.COLOR_WHITE;
37
import static org.distorted.objectlib.main.TwistyObject.COLOR_YELLOW;
38

  
39 31
///////////////////////////////////////////////////////////////////////////////////////////////////
40 32

  
41 33
public class BandagedCubit
......
46 38
    private static Bitmap mBitmap;
47 39
    private static Static4D[] mTextureMaps;
48 40

  
41
    private final BandagedObject mObject;
49 42
    private final DistortedNode mNode;
50 43
    private final DistortedEffects mEffects;
51 44
    private final DistortedTexture mTexture;
52 45
    private final Static3D mMove;
53 46
    private final boolean mRoundCorners;
54
    private final int mX, mY, mZ;
55 47

  
56 48
    private float mUnscaledX, mUnscaledY, mUnscaledZ;
57 49
    private float[] mPosition;
......
60 52

  
61 53
///////////////////////////////////////////////////////////////////////////////////////////////////
62 54

  
63
    private static void createBitmap()
55
    private static void createBitmap(int[] colors)
64 56
      {
65
      final int[] FACE_COLORS = new int[]
66
         {
67
           COLOR_YELLOW, COLOR_WHITE,
68
           COLOR_BLUE  , COLOR_GREEN,
69
           COLOR_RED   , COLOR_ORANGE
70
         };
71
      final int NUM = FACE_COLORS.length;
57
      final int NUM = colors.length;
72 58
      final int SIZE= 32;
73 59

  
74 60
      mTextureMaps = new Static4D[NUM];
......
80 66

  
81 67
      for(int color=0; color<NUM; color++)
82 68
        {
83
        paint.setColor(FACE_COLORS[color]);
69
        paint.setColor(colors[color]);
84 70
        canvas.drawRect(color*SIZE, 0, (color+1)*SIZE, SIZE, paint);
85 71
        mTextureMaps[color] = new Static4D( ((float)color)/NUM, 0.0f, 1.0f/NUM, 1.0f );
86 72
        }
87 73
      }
88 74

  
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90
// (x,y,z) ==
91
//
92
// ( 1,0,0) --> 0
93
// (-1,0,0) --> 1
94
// (0, 1,0) --> 2
95
// (0,-1,0) --> 3
96
// (0,0, 1) --> 4
97
// (0,0,-1) --> 5
98

  
99
    private int computeMapsIndex(float x, float y, float z)
100
      {
101
      int ix = x>0 ? (int)(x+0.5f) : (int)(x-0.5f);
102
      int iy = y>0 ? (int)(y+0.5f) : (int)(y-0.5f);
103
      int iz = z>0 ? (int)(z+0.5f) : (int)(z-0.5f);
104

  
105
      if( ix== 1 ) return 0;
106
      if( ix==-1 ) return 1;
107
      if( iy== 1 ) return 2;
108
      if( iy==-1 ) return 3;
109
      if( iz== 1 ) return 4;
110
      if( iz==-1 ) return 5;
111

  
112
      return 0;
113
      }
114

  
115 75
///////////////////////////////////////////////////////////////////////////////////////////////////
116 76

  
117 77
    private void resetTextureMaps(MeshBase mesh)
......
124 84
        {
125 85
        Static4D q = fact.getQuaternion(i);
126 86
        QuatHelper.rotateVectorByQuat(mTmp,0,0,1,0,q);
127
        int index = computeMapsIndex(mTmp[0], mTmp[1], mTmp[2]);
87
        int index = mObject.computeMapsIndex(mTmp);
128 88
        maps[i] = mTextureMaps[index];
129 89
        }
130 90

  
......
156 116
// PUBLIC API
157 117
///////////////////////////////////////////////////////////////////////////////////////////////////
158 118

  
159
    public BandagedCubit(float[] position, int x, int y, int z, Static4D quat1,
119
    public BandagedCubit(BandagedObject object, float[] position, Static4D quat1,
160 120
                         Static4D quat2, Static3D scale, boolean roundCorners)
161 121
      {
162
      mX = x;
163
      mY = y;
164
      mZ = z;
122
      mObject = object;
165 123
      mRoundCorners = roundCorners;
166 124
      mPosition = position;
167 125
      mIsAttached = true;
......
169 127

  
170 128
      computeMove(mPosition);
171 129
      mMove = new Static3D(0,0,0);
172

  
173
      FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
174
      MeshBase mesh = factory.createMesh(mPosition,mX,mY,mZ,false,mRoundCorners);
130
      MeshBase mesh = mObject.createMesh(mPosition,mRoundCorners);
175 131

  
176 132
      mTexture = new DistortedTexture();
177
      if( mBitmap==null ) createBitmap();
133
      if( mBitmap==null ) createBitmap(mObject.getColors());
178 134
      mTexture.setTextureAlreadyInverted(mBitmap);
179 135

  
180 136
      resetTextureMaps(mesh);
......
207 163

  
208 164
      computeMove(tmpPosition);
209 165
      mPosition = tmpPosition;
210

  
211
      FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
212
      MeshBase mesh = factory.createMesh(mPosition,mX,mY,mZ,false,mRoundCorners);
166
      MeshBase mesh = mObject.createMesh(mPosition,mRoundCorners);
213 167
      resetTextureMaps(mesh);
214 168
      mNode.setMesh(mesh);
215 169
      mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
......
229 183
      mPosition[2] = z;
230 184

  
231 185
      computeMove(mPosition);
232

  
233
      FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
234
      MeshBase mesh = factory.createMesh(mPosition,mX,mY,mZ,false,mRoundCorners);
186
      MeshBase mesh = mObject.createMesh(mPosition,mRoundCorners);
235 187
      resetTextureMaps(mesh);
236 188
      mNode.setMesh(mesh);
237 189
      mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
......
241 193

  
242 194
    public void recreateBitmap()
243 195
      {
244
      if( mBitmap==null ) createBitmap();
196
      if( mBitmap==null ) createBitmap(mObject.getColors());
245 197
      mTexture.setTextureAlreadyInverted(mBitmap);
246 198
      }
247 199

  
src/main/java/org/distorted/bandaged/BandagedObject.java
9 9

  
10 10
package org.distorted.bandaged;
11 11

  
12
import static org.distorted.objectlib.main.TwistyObject.COLOR_BLUE;
13
import static org.distorted.objectlib.main.TwistyObject.COLOR_GREEN;
14
import static org.distorted.objectlib.main.TwistyObject.COLOR_ORANGE;
15
import static org.distorted.objectlib.main.TwistyObject.COLOR_RED;
16
import static org.distorted.objectlib.main.TwistyObject.COLOR_WHITE;
17
import static org.distorted.objectlib.main.TwistyObject.COLOR_YELLOW;
18

  
12 19
import org.distorted.library.main.DistortedNode;
13 20
import org.distorted.library.main.DistortedScreen;
21
import org.distorted.library.mesh.MeshBase;
14 22
import org.distorted.library.type.Static3D;
15 23
import org.distorted.library.type.Static4D;
24
import org.distorted.objectlib.helpers.FactoryBandagedCubit;
16 25
import org.distorted.objectlib.main.InitData;
17 26
import org.distorted.objectlib.main.TwistyObject;
18 27
import org.distorted.objectlib.objects.TwistyBandagedCuboid;
......
23 32

  
24 33
public class BandagedObject
25 34
{
26
    private static final float DIST2D = 0.5f;
27

  
28 35
    private final DistortedScreen mScreen;
29 36
    private final float[] mPos;
37
    private final int[] mSize;
38
    private final float mDist2D;
30 39

  
31 40
    private BandagedCubit[] mCubits;
32
    private int mX, mY, mZ;
41
    private int mMax;
33 42
    private int mNumCubits;
34 43

  
35 44
///////////////////////////////////////////////////////////////////////////////////////////////////
......
38 47
     {
39 48
     mScreen = screen;
40 49
     mPos = new float[3];
50
     mSize = new int[3];
51
     mDist2D = getDist2D();
52
     }
53

  
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55

  
56
   int[] getSize()
57
     {
58
     return mSize;
41 59
     }
42 60

  
43 61
///////////////////////////////////////////////////////////////////////////////////////////////////
......
88 106

  
89 107
///////////////////////////////////////////////////////////////////////////////////////////////////
90 108

  
91
   float getSize()
109
   float getMaxSize()
92 110
     {
93
     return mX>mY ? Math.max(mX, mZ) : Math.max(mY, mZ);
111
     return mMax;
94 112
     }
95 113

  
96 114
///////////////////////////////////////////////////////////////////////////////////////////////////
......
119 137
   TwistyObject createObject(int mode, float size)
120 138
     {
121 139
     float[][] pos = getCubitPositions();
122
     InitData data = new InitData( new int[] {mX,mY,mZ},pos);
140
     InitData data = new InitData( mSize,pos);
123 141
     return new TwistyBandagedCuboid( TwistyObject.MESH_NICE, mode, ShapeHexahedron.DEFAULT_ROT, new Static3D(0,0,0), size, data, null );
124 142
     }
125 143

  
......
174 192

  
175 193
   boolean tryChangeObject(int x, int y, int z)
176 194
     {
177
     if( mX!=x || mY!=y || mZ!=z )
195
     if( mSize[0]!=x || mSize[1]!=y || mSize[2]!=z )
178 196
       {
179
       mX = x;
180
       mY = y;
181
       mZ = z;
182
       mNumCubits = computeNumCubits(mX,mY,mZ);
197
       mSize[0] = x;
198
       mSize[1] = y;
199
       mSize[2] = z;
200
       mMax = x>y ? Math.max(x,z) : Math.max(y,z);
201
       mNumCubits = computeNumCubits(x,y,z);
183 202
       return true;
184 203
       }
185 204

  
......
190 209

  
191 210
   int computeProjectionAngle()
192 211
     {
193
     float quot1 = mZ/ (float)mX;
194
     float quot2 = mZ/ (float)mY;
195
     float quot3 = mX/ (float)mZ;
196
     float quot4 = mX/ (float)mY;
212
     float quot1 = mSize[2]/ (float)mSize[0];
213
     float quot2 = mSize[2]/ (float)mSize[1];
214
     float quot3 = mSize[0]/ (float)mSize[2];
215
     float quot4 = mSize[0]/ (float)mSize[1];
197 216

  
198 217
     float quot5 = Math.max(quot1,quot2);
199 218
     float quot6 = Math.max(quot3,quot4);
......
230 249

  
231 250
   float[] getDist3D()
232 251
     {
233
     float max = getSize();
252
     float max = getMaxSize();
234 253

  
235
     float x = 0.5f*(mX/max);
236
     float y = 0.5f*(mY/max);
237
     float z = 0.5f*(mZ/max);
254
     float x = 0.5f*(mSize[0]/max);
255
     float y = 0.5f*(mSize[1]/max);
256
     float z = 0.5f*(mSize[2]/max);
238 257

  
239 258
     return new float[] {x,x,y,y,z,z};
240 259
     }
241 260

  
261

  
262
///////////////////////////////////////////////////////////////////////////////////////////////////
263

  
264
   float getDist2D()
265
     {
266
     return 0.5f;
267
     }
268

  
269
///////////////////////////////////////////////////////////////////////////////////////////////////
270
// (x,y,z) ==
271
//
272
// ( 1,0,0) --> 0
273
// (-1,0,0) --> 1
274
// (0, 1,0) --> 2
275
// (0,-1,0) --> 3
276
// (0,0, 1) --> 4
277
// (0,0,-1) --> 5
278

  
279
   int computeMapsIndex(float[] faceAxis)
280
      {
281
      float x = faceAxis[0];
282
      float y = faceAxis[1];
283
      float z = faceAxis[2];
284

  
285
      int ix = x>0 ? (int)(x+0.5f) : (int)(x-0.5f);
286
      int iy = y>0 ? (int)(y+0.5f) : (int)(y-0.5f);
287
      int iz = z>0 ? (int)(z+0.5f) : (int)(z-0.5f);
288

  
289
      if( ix== 1 ) return 0;
290
      if( ix==-1 ) return 1;
291
      if( iy== 1 ) return 2;
292
      if( iy==-1 ) return 3;
293
      if( iz== 1 ) return 4;
294
      if( iz==-1 ) return 5;
295

  
296
      return 0;
297
      }
298

  
299
///////////////////////////////////////////////////////////////////////////////////////////////////
300

  
301
   MeshBase createMesh(float[] pos, boolean round)
302
      {
303
      FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
304
      int[] size = getSize();
305
      return factory.createMesh(pos,size[0],size[1],size[2],false,round);
306
      }
307

  
308
///////////////////////////////////////////////////////////////////////////////////////////////////
309

  
310
   int[] getColors()
311
     {
312
     return new int[]
313
         {
314
           COLOR_YELLOW, COLOR_WHITE,
315
           COLOR_BLUE  , COLOR_GREEN,
316
           COLOR_RED   , COLOR_ORANGE
317
         };
318
     }
319

  
242 320
///////////////////////////////////////////////////////////////////////////////////////////////////
243 321

  
244 322
   void createCubits(Static4D quatT, Static4D quatA, Static3D scale)
245 323
     {
246 324
     mCubits = new BandagedCubit[mNumCubits];
247 325
     int c=0;
248

  
249
     float begX = 0.5f*(1-mX);
250
     float begY = 0.5f*(1-mY);
251
     float begZ = 0.5f*(1-mZ);
252

  
253
     for(int x=0; x<mX; x++)
254
       for(int y=0; y<mY; y++)
255
          for(int z=0; z<mZ; z++)
256
            if( x==0 || x==mX-1 || y==0 || y==mY-1 || z==0 || z==mZ-1 )
326
     int sx = mSize[0];
327
     int sy = mSize[1];
328
     int sz = mSize[2];
329

  
330
     float begX = 0.5f*(1-sx);
331
     float begY = 0.5f*(1-sy);
332
     float begZ = 0.5f*(1-sz);
333

  
334
     for(int x=0; x<sx; x++)
335
       for(int y=0; y<sy; y++)
336
          for(int z=0; z<sz; z++)
337
            if( x==0 || x==sx-1 || y==0 || y==sy-1 || z==0 || z==sz-1 )
257 338
              {
258 339
              float[] pos = new float[] { begX+x,begY+y,begZ+z };
259
              mCubits[c] = new BandagedCubit(pos,mX,mY,mZ,quatT,quatA,scale,false);
340
              mCubits[c] = new BandagedCubit(this,pos,quatT,quatA,scale,false);
260 341
              c++;
261 342
              }
262 343
    }
......
286 367

  
287 368
  void stretchPoint(int face, float[] output)
288 369
    {
289
    float max = getSize();
370
    float max = getMaxSize();
290 371

  
291 372
    switch(face/2)
292 373
      {
293
      case 0: output[0] *= (max/mZ); output[1] *= (max/mY); break;
294
      case 1: output[0] *= (max/mX); output[1] *= (max/mZ); break;
295
      case 2: output[0] *= (max/mX); output[1] *= (max/mY); break;
374
      case 0: output[0] *= (max/mSize[2]); output[1] *= (max/mSize[1]); break;
375
      case 1: output[0] *= (max/mSize[0]); output[1] *= (max/mSize[2]); break;
376
      case 2: output[0] *= (max/mSize[0]); output[1] *= (max/mSize[1]); break;
296 377
      }
297 378
    }
298 379

  
......
300 381

  
301 382
  int whichCubitTouched(int face, float pointX, float pointY)
302 383
    {
384
    float x = mSize[0];
385
    float y = mSize[1];
386
    float z = mSize[2];
387

  
303 388
    switch(face)
304 389
      {
305
      case 0: mPos[0] = (mX-1)/2.0f;
306
              mPos[1] = (int)( mY*pointY+mY/2.0f)-(mY-1)/2.0f;
307
              mPos[2] = (int)(-mZ*pointX-mZ/2.0f)+(mZ-1)/2.0f;
390
      case 0: mPos[0] = (x-1)/2;
391
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
392
              mPos[2] = (int)(-z*pointX-z/2)+(z-1)/2;
308 393
              break;
309
      case 1: mPos[0] =-(mX-1)/2.0f;
310
              mPos[1] = (int)( mY*pointY+mY/2.0f)-(mY-1)/2.0f;
311
              mPos[2] = (int)( mZ*pointX+mZ/2.0f)-(mZ-1)/2.0f;
394
      case 1: mPos[0] =-(x-1)/2;
395
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
396
              mPos[2] = (int)( z*pointX+z/2)-(z-1)/2;
312 397
              break;
313
      case 2: mPos[0] = (int)( mX*pointX+mX/2.0f)-(mX-1)/2.0f;
314
              mPos[1] = (mY-1)/2.0f;
315
              mPos[2] = (int)(-mZ*pointY-mZ/2.0f)+(mZ-1)/2.0f;
398
      case 2: mPos[0] = (int)( x*pointX+x/2)-(x-1)/2;
399
              mPos[1] = (y-1)/2;
400
              mPos[2] = (int)(-z*pointY-z/2)+(z-1)/2;
316 401
              break;
317
      case 3: mPos[0] = (int)( mX*pointX+mX/2.0f)-(mX-1)/2.0f;
318
              mPos[1] =-(mY-1)/2.0f;
319
              mPos[2] = (int)( mZ*pointY+mZ/2.0f)-(mZ-1)/2.0f;
402
      case 3: mPos[0] = (int)( x*pointX+x/2)-(x-1)/2;
403
              mPos[1] =-(y-1)/2;
404
              mPos[2] = (int)( z*pointY+z/2)-(z-1)/2;
320 405
              break;
321
      case 4: mPos[0] = (int)( mX*pointX+mX/2.0f)-(mX-1)/2.0f;
322
              mPos[1] = (int)( mY*pointY+mY/2.0f)-(mY-1)/2.0f;
323
              mPos[2] = (mZ-1)/2.0f;
406
      case 4: mPos[0] = (int)( x*pointX+x/2)-(x-1)/2;
407
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
408
              mPos[2] = (z-1)/2;
324 409
              break;
325
      case 5: mPos[0] = (int)(-mX*pointX-mX/2.0f)+(mX-1)/2.0f;
326
              mPos[1] = (int)( mY*pointY+mY/2.0f)-(mY-1)/2.0f;
327
              mPos[2] =-(mZ-1)/2.0f;
410
      case 5: mPos[0] = (int)(-x*pointX-x/2)+(x-1)/2;
411
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
412
              mPos[2] =-(z-1)/2;
328 413
              break;
329 414
      }
330 415

  
......
346 431

  
347 432
  boolean isInsideFace(int face, float[] p)
348 433
    {
349
    return ( p[0]<=DIST2D && p[0]>=-DIST2D && p[1]<=DIST2D && p[1]>=-DIST2D );
434
    return ( p[0]<=mDist2D && p[0]>=-mDist2D && p[1]<=mDist2D && p[1]>=-mDist2D );
350 435
    }
351 436
}

Also available in: Unified diff