Project

General

Profile

« Previous | Next » 

Revision b2de7562

Added by Leszek Koltunski over 1 year ago

Progress with BandagedObject.

View differences:

src/main/java/org/distorted/bandaged/BandagedCreatorTouchControl.java
138 138
        float az = mFaceAxis[mLastTouchedFace].get2();
139 139

  
140 140
        convertTo2Dcoords(mTouch, ax,ay,az, mPoint2D);
141
        mObject.stretchPoint(mLastTouchedFace,mPoint2D);
141

  
142 142
        if( mObject.isInsideFace(mLastTouchedFace,mPoint2D) ) return true;
143 143
        }
144 144
      }
src/main/java/org/distorted/bandaged/BandagedObject.java
22 22
{
23 23
    private final DistortedScreen mScreen;
24 24
    private final float[][] mFaceAxis;
25
    private final float[] mTmp;
26
    private BandagedCubit[] mCubits;
27

  
25 28
    final int[] mSize;
26 29
    final float mDist2D;
27 30

  
28
    BandagedCubit[] mCubits;
29 31
    int mMax;
30 32
    int mNumCubits;
31 33

  
......
36 38
     mScreen = screen;
37 39
     mSize = new int[3];
38 40
     mDist2D = getDist2D();
39

  
41
     mTmp = new float[3];
40 42
     Static3D[] axis = getFaceAxis();
41 43
     int numAxis = axis.length;
42 44
     mFaceAxis = new float[numAxis][];
......
49 51
   abstract float[] getDist3D();
50 52
   abstract int[] getColors();
51 53
   abstract Static3D[] getFaceAxis();
52
   abstract void createCubits(Static4D quatT, Static4D quatA, Static3D scale);
53
   abstract boolean isAdjacent(float[] pos1, float[] pos2);
54
   abstract float[][] getPositions();
55
   abstract boolean isAdjacent(float dx, float dy, float dz);
54 56
   abstract int computeProjectionAngle();
55 57
   abstract boolean tryChangeObject(int x, int y, int z);
56
   abstract void stretchPoint(int face, float[] output);
57
   abstract int whichCubitTouched(int face, float pointX, float pointY);
58
   abstract void getTouchedPosition(float[] output, int face, float pointX, float pointY);
58 59
   abstract boolean isInsideFace(int face, float[] p);
59 60
   abstract TwistyObject createObject(int mode, float scale );
60 61
   abstract MeshBase createMesh(float[] pos, boolean round);
......
66 67
     return mSize;
67 68
     }
68 69

  
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

  
72
   void createCubits(Static4D quatT, Static4D quatA, Static3D scale)
73
     {
74
     mCubits = new BandagedCubit[mNumCubits];
75
     int c=0;
76
     for(float[] p : getPositions() ) mCubits[c++] = new BandagedCubit(this,p,quatT,quatA,scale,false);
77
     }
78

  
69 79
///////////////////////////////////////////////////////////////////////////////////////////////////
70 80

  
71 81
   int computeMapsIndex(float[] faceAx)
......
223 233
    {
224 234
    if( index>=0 && index<mNumCubits && mCubits[index]!=null ) mCubits[index].setUnmarked();
225 235
    }
236

  
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238

  
239
  int whichCubitTouched(int face, float pointX, float pointY)
240
    {
241
    getTouchedPosition(mTmp, face, pointX, pointY);
242

  
243
    for(int c=0; c<mNumCubits; c++)
244
      if( mCubits[c].isAttached() )
245
        {
246
        float[] pos = mCubits[c].getPosition();
247
        int len = pos.length/3;
248

  
249
        for(int p=0; p<len; p++)
250
          if( pos[3*p]==mTmp[0] && pos[3*p+1]==mTmp[1] && pos[3*p+2]==mTmp[2] ) return c;
251
        }
252

  
253
    android.util.Log.e("D", "whichCubitTouched: IMPOSSIBLE!!");
254
    return -1;
255
    }
256

  
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258

  
259
  boolean isAdjacent(float[] pos1, float[] pos2)
260
     {
261
     int len1 = pos1.length/3;
262
     int len2 = pos2.length/3;
263

  
264
     for(int i=0; i<len1; i++)
265
       for(int j=0; j<len2; j++)
266
         {
267
         float dx = pos1[3*i  ] - pos2[3*j  ];
268
         float dy = pos1[3*i+1] - pos2[3*j+1];
269
         float dz = pos1[3*i+2] - pos2[3*j+2];
270

  
271
         if( isAdjacent(dx,dy,dz) ) return true;
272
         }
273

  
274
     return false;
275
     }
226 276
}
src/main/java/org/distorted/bandaged/BandagedObjectCuboid.java
12 12
import org.distorted.library.main.DistortedScreen;
13 13
import org.distorted.library.mesh.MeshBase;
14 14
import org.distorted.library.type.Static3D;
15
import org.distorted.library.type.Static4D;
16 15
import org.distorted.objectlib.helpers.FactoryBandagedCubit;
17 16
import org.distorted.objectlib.main.InitData;
18 17
import org.distorted.objectlib.main.TwistyObject;
......
24 23

  
25 24
public class BandagedObjectCuboid extends BandagedObject
26 25
{
27
   private final float[] mPos;
28

  
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

  
31 26
   BandagedObjectCuboid(DistortedScreen screen)
32 27
     {
33 28
     super(screen);
34
     mPos = new float[3];
35 29
     }
36 30

  
37 31
///////////////////////////////////////////////////////////////////////////////////////////////////
38 32

  
39
   boolean isAdjacent(float[] pos1, float[] pos2)
33
   float[] getDist3D()
40 34
     {
41
     int len1 = pos1.length/3;
42
     int len2 = pos2.length/3;
35
     float max = mMax;
43 36

  
44
     for(int i=0; i<len1; i++)
45
       for(int j=0; j<len2; j++)
46
         {
47
         float d0 = pos1[3*i  ] - pos2[3*j  ];
48
         float d1 = pos1[3*i+1] - pos2[3*j+1];
49
         float d2 = pos1[3*i+2] - pos2[3*j+2];
37
     float x = 0.5f*(mSize[0]/max);
38
     float y = 0.5f*(mSize[1]/max);
39
     float z = 0.5f*(mSize[2]/max);
40

  
41
     return new float[] {x,x,y,y,z,z};
42
     }
50 43

  
51
         if( d0*d0 + d1*d1 + d2*d2 == 1 ) return true;
52
         }
44
///////////////////////////////////////////////////////////////////////////////////////////////////
53 45

  
54
     return false;
46
   float getDist2D()
47
     {
48
     return 0.5f;
55 49
     }
56 50

  
57 51
///////////////////////////////////////////////////////////////////////////////////////////////////
58 52

  
59
   TwistyObject createObject(int mode, float size)
53
   int[] getColors()
60 54
     {
61
     float[][] pos = getCubitPositions();
62
     InitData data = new InitData( mSize,pos);
63
     return new TwistyBandagedCuboid( TwistyObject.MESH_NICE, mode, ShapeHexahedron.DEFAULT_ROT, new Static3D(0,0,0), size, data, null );
55
     return ShapeHexahedron.FACE_COLORS;
64 56
     }
65 57

  
66 58
///////////////////////////////////////////////////////////////////////////////////////////////////
67 59

  
68
   boolean tryChangeObject(int x, int y, int z)
60
  Static3D[] getFaceAxis()
61
    {
62
    return TouchControlHexahedron.FACE_AXIS;
63
    }
64

  
65
///////////////////////////////////////////////////////////////////////////////////////////////////
66

  
67
  boolean isAdjacent(float dx, float dy, float dz)
68
    {
69
    return dx*dx + dy*dy + dz*dz == 1;
70
    }
71

  
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73

  
74
  boolean tryChangeObject(int x, int y, int z)
69 75
     {
70 76
     if( mSize[0]!=x || mSize[1]!=y || mSize[2]!=z )
71 77
       {
......
82 88

  
83 89
///////////////////////////////////////////////////////////////////////////////////////////////////
84 90

  
85
   int computeProjectionAngle()
91
  int computeProjectionAngle()
86 92
     {
87 93
     float quot1 = mSize[2]/ (float)mSize[0];
88 94
     float quot2 = mSize[2]/ (float)mSize[1];
......
101 107

  
102 108
///////////////////////////////////////////////////////////////////////////////////////////////////
103 109

  
104
   float[] getDist3D()
105
     {
106
     float max = mMax;
107

  
108
     float x = 0.5f*(mSize[0]/max);
109
     float y = 0.5f*(mSize[1]/max);
110
     float z = 0.5f*(mSize[2]/max);
111

  
112
     return new float[] {x,x,y,y,z,z};
113
     }
114

  
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

  
117
   float getDist2D()
118
     {
119
     return 0.5f;
120
     }
121

  
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123

  
124
   MeshBase createMesh(float[] pos, boolean round)
125
      {
126
      FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
127
      int[] size = getSize();
128
      return factory.createMesh(pos,size[0],size[1],size[2],false,round);
129
      }
130

  
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

  
133
   int[] getColors()
134
     {
135
     return ShapeHexahedron.FACE_COLORS;
136
     }
137

  
138
///////////////////////////////////////////////////////////////////////////////////////////////////
139

  
140
   void createCubits(Static4D quatT, Static4D quatA, Static3D scale)
141
     {
142
     mCubits = new BandagedCubit[mNumCubits];
143
     int c=0;
144
     int sx = mSize[0];
145
     int sy = mSize[1];
146
     int sz = mSize[2];
147

  
148
     float begX = 0.5f*(1-sx);
149
     float begY = 0.5f*(1-sy);
150
     float begZ = 0.5f*(1-sz);
151

  
152
     for(int x=0; x<sx; x++)
153
       for(int y=0; y<sy; y++)
154
          for(int z=0; z<sz; z++)
155
            if( x==0 || x==sx-1 || y==0 || y==sy-1 || z==0 || z==sz-1 )
110
  float[][] getPositions()
111
    {
112
    float[][] pos = new float[mNumCubits][];
113
    int c=0;
114
    int sx = mSize[0];
115
    int sy = mSize[1];
116
    int sz = mSize[2];
117

  
118
    float begX = 0.5f*(1-sx);
119
    float begY = 0.5f*(1-sy);
120
    float begZ = 0.5f*(1-sz);
121

  
122
    for(int x=0; x<sx; x++)
123
      for(int y=0; y<sy; y++)
124
         for(int z=0; z<sz; z++)
125
           if( x==0 || x==sx-1 || y==0 || y==sy-1 || z==0 || z==sz-1 )
156 126
              {
157
              float[] pos = new float[] { begX+x,begY+y,begZ+z };
158
              mCubits[c] = new BandagedCubit(this,pos,quatT,quatA,scale,false);
159
              c++;
127
              pos[c++] = new float[] { begX+x,begY+y,begZ+z };
160 128
              }
161
    }
162 129

  
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164

  
165
  Static3D[] getFaceAxis()
166
    {
167
    return TouchControlHexahedron.FACE_AXIS;
130
    return pos;
168 131
    }
169 132

  
170 133
///////////////////////////////////////////////////////////////////////////////////////////////////
171 134

  
172
  void stretchPoint(int face, float[] output)
173
    {
174
    float max = getMaxSize();
175

  
176
    switch(face/2)
177
      {
178
      case 0: output[0] *= (max/mSize[2]); output[1] *= (max/mSize[1]); break;
179
      case 1: output[0] *= (max/mSize[0]); output[1] *= (max/mSize[2]); break;
180
      case 2: output[0] *= (max/mSize[0]); output[1] *= (max/mSize[1]); break;
181
      }
182
    }
183

  
184
///////////////////////////////////////////////////////////////////////////////////////////////////
185

  
186
  int whichCubitTouched(int face, float pointX, float pointY)
135
  void getTouchedPosition(float[] output, int face, float pointX, float pointY)
187 136
    {
188 137
    float x = mSize[0];
189 138
    float y = mSize[1];
......
191 140

  
192 141
    switch(face)
193 142
      {
194
      case 0: mPos[0] = (x-1)/2;
195
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
196
              mPos[2] = (int)(-z*pointX-z/2)+(z-1)/2;
143
      case 0: output[0] = (x-1)/2;
144
              output[1] = (int)( y*pointY+y/2)-(y-1)/2;
145
              output[2] = (int)(-z*pointX-z/2)+(z-1)/2;
197 146
              break;
198
      case 1: mPos[0] =-(x-1)/2;
199
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
200
              mPos[2] = (int)( z*pointX+z/2)-(z-1)/2;
147
      case 1: output[0] =-(x-1)/2;
148
              output[1] = (int)( y*pointY+y/2)-(y-1)/2;
149
              output[2] = (int)( z*pointX+z/2)-(z-1)/2;
201 150
              break;
202
      case 2: mPos[0] = (int)( x*pointX+x/2)-(x-1)/2;
203
              mPos[1] = (y-1)/2;
204
              mPos[2] = (int)(-z*pointY-z/2)+(z-1)/2;
151
      case 2: output[0] = (int)( x*pointX+x/2)-(x-1)/2;
152
              output[1] = (y-1)/2;
153
              output[2] = (int)(-z*pointY-z/2)+(z-1)/2;
205 154
              break;
206
      case 3: mPos[0] = (int)( x*pointX+x/2)-(x-1)/2;
207
              mPos[1] =-(y-1)/2;
208
              mPos[2] = (int)( z*pointY+z/2)-(z-1)/2;
155
      case 3: output[0] = (int)( x*pointX+x/2)-(x-1)/2;
156
              output[1] =-(y-1)/2;
157
              output[2] = (int)( z*pointY+z/2)-(z-1)/2;
209 158
              break;
210
      case 4: mPos[0] = (int)( x*pointX+x/2)-(x-1)/2;
211
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
212
              mPos[2] = (z-1)/2;
159
      case 4: output[0] = (int)( x*pointX+x/2)-(x-1)/2;
160
              output[1] = (int)( y*pointY+y/2)-(y-1)/2;
161
              output[2] = (z-1)/2;
213 162
              break;
214
      case 5: mPos[0] = (int)(-x*pointX-x/2)+(x-1)/2;
215
              mPos[1] = (int)( y*pointY+y/2)-(y-1)/2;
216
              mPos[2] =-(z-1)/2;
163
      case 5: output[0] = (int)(-x*pointX-x/2)+(x-1)/2;
164
              output[1] = (int)( y*pointY+y/2)-(y-1)/2;
165
              output[2] =-(z-1)/2;
217 166
              break;
218 167
      }
219

  
220
    for(int c=0; c<mNumCubits; c++)
221
      if( mCubits[c].isAttached() )
222
        {
223
        float[] pos = mCubits[c].getPosition();
224
        int len = pos.length/3;
225

  
226
        for(int p=0; p<len; p++)
227
          if( pos[3*p]==mPos[0] && pos[3*p+1]==mPos[1] && pos[3*p+2]==mPos[2] ) return c;
228
        }
229

  
230
    android.util.Log.e("D", "whichCubitTouched: IMPOSSIBLE!!");
231
    return -1;
232 168
    }
233 169

  
234 170
///////////////////////////////////////////////////////////////////////////////////////////////////
235 171

  
236 172
  boolean isInsideFace(int face, float[] p)
237 173
    {
174
    float max = mMax;
175

  
176
    switch(face/2)
177
      {
178
      case 0: p[0] *= (max/mSize[2]); p[1] *= (max/mSize[1]); break;
179
      case 1: p[0] *= (max/mSize[0]); p[1] *= (max/mSize[2]); break;
180
      case 2: p[0] *= (max/mSize[0]); p[1] *= (max/mSize[1]); break;
181
      }
182

  
238 183
    return ( p[0]<=mDist2D && p[0]>=-mDist2D && p[1]<=mDist2D && p[1]>=-mDist2D );
239 184
    }
185

  
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187

  
188
  MeshBase createMesh(float[] pos, boolean round)
189
     {
190
     FactoryBandagedCubit factory = FactoryBandagedCubit.getInstance();
191
     int[] size = getSize();
192
     return factory.createMesh(pos,size[0],size[1],size[2],false,round);
193
     }
194

  
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196

  
197
  TwistyObject createObject(int mode, float size)
198
     {
199
     float[][] pos = getCubitPositions();
200
     InitData data = new InitData( mSize,pos);
201
     return new TwistyBandagedCuboid( TwistyObject.MESH_NICE, mode, ShapeHexahedron.DEFAULT_ROT, new Static3D(0,0,0), size, data, null );
202
     }
240 203
}

Also available in: Unified diff