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/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