Project

General

Profile

Download (10.7 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / bandaged / BandagedCubit.java @ e5c9982e

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2022 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.bandaged;
21

    
22
import android.graphics.Bitmap;
23
import android.graphics.Canvas;
24
import android.graphics.Paint;
25

    
26
import org.distorted.library.effect.FragmentEffectBrightness;
27
import org.distorted.library.effect.MatrixEffectMove;
28
import org.distorted.library.effect.MatrixEffectQuaternion;
29
import org.distorted.library.effect.MatrixEffectScale;
30
import org.distorted.library.main.DistortedEffects;
31
import org.distorted.library.main.DistortedNode;
32
import org.distorted.library.main.DistortedTexture;
33
import org.distorted.library.main.QuatHelper;
34
import org.distorted.library.mesh.MeshBase;
35
import org.distorted.library.type.Static1D;
36
import org.distorted.library.type.Static3D;
37
import org.distorted.library.type.Static4D;
38
import org.distorted.objectlib.helpers.FactoryBandaged3x3Cubit;
39
import org.distorted.objectlib.helpers.FactoryCubit;
40

    
41
import static org.distorted.objectlib.main.TwistyObject.COLOR_BLUE;
42
import static org.distorted.objectlib.main.TwistyObject.COLOR_GREEN;
43
import static org.distorted.objectlib.main.TwistyObject.COLOR_ORANGE;
44
import static org.distorted.objectlib.main.TwistyObject.COLOR_RED;
45
import static org.distorted.objectlib.main.TwistyObject.COLOR_WHITE;
46
import static org.distorted.objectlib.main.TwistyObject.COLOR_YELLOW;
47

    
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49

    
50
public class BandagedCubit
51
{
52
    private static final Static3D CENTER = new Static3D(0,0,0);
53
    private static final float[] mTmp = new float[4];
54
    private static final Static1D mAlpha = new Static1D(2.0f);
55
    private static Bitmap mBitmap;
56
    private static Static4D[] mTextureMaps;
57

    
58
    private final DistortedNode mNode;
59
    private final DistortedEffects mEffects;
60
    private final Static3D mMove;
61
    private final boolean mRoundCorners;
62

    
63
    private float mUnscaledX, mUnscaledY, mUnscaledZ;
64
    private float[] mPosition;
65
    private boolean mIsAttached;
66
    private long mMarkedEffectID;
67

    
68
///////////////////////////////////////////////////////////////////////////////////////////////////
69

    
70
    private static void createBitmap()
71
      {
72
      final int[] FACE_COLORS = new int[]
73
         {
74
           COLOR_YELLOW, COLOR_WHITE,
75
           COLOR_BLUE  , COLOR_GREEN,
76
           COLOR_RED   , COLOR_ORANGE
77
         };
78
      final int NUM = FACE_COLORS.length;
79
      final int SIZE= 32;
80

    
81
      mTextureMaps = new Static4D[NUM];
82

    
83
      Paint paint = new Paint();
84
      paint.setStyle(Paint.Style.FILL);
85
      mBitmap = Bitmap.createBitmap( NUM*SIZE, SIZE, Bitmap.Config.ARGB_4444);
86
      Canvas canvas = new Canvas(mBitmap);
87

    
88
      for(int color=0; color<NUM; color++)
89
        {
90
        paint.setColor(FACE_COLORS[color]);
91
        canvas.drawRect(color*SIZE, 0, (color+1)*SIZE, SIZE, paint);
92
        mTextureMaps[color] = new Static4D( ((float)color)/NUM, 0.0f, 1.0f/NUM, 1.0f );
93
        }
94
      }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97
// (x,y,z) ==
98
//
99
// ( 1,0,0) --> 0
100
// (-1,0,0) --> 1
101
// (0, 1,0) --> 2
102
// (0,-1,0) --> 3
103
// (0,0, 1) --> 4
104
// (0,0,-1) --> 5
105

    
106
    private int computeMapsIndex(float x, float y, float z)
107
      {
108
      int ix = x>0 ? (int)(x+0.5f) : (int)(x-0.5f);
109
      int iy = y>0 ? (int)(y+0.5f) : (int)(y-0.5f);
110
      int iz = z>0 ? (int)(z+0.5f) : (int)(z-0.5f);
111

    
112
      if( ix== 1 ) return 0;
113
      if( ix==-1 ) return 1;
114
      if( iy== 1 ) return 2;
115
      if( iy==-1 ) return 3;
116
      if( iz== 1 ) return 4;
117
      if( iz==-1 ) return 5;
118

    
119
      return 0;
120
      }
121

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

    
124
    private void resetTextureMaps(MeshBase mesh)
125
      {
126
      FactoryCubit fact = FactoryCubit.getInstance();
127
      int numComponents = mesh.getNumTexComponents();
128
      Static4D[] maps = new Static4D[numComponents];
129

    
130
      for(int i=0; i<numComponents; i++)
131
        {
132
        Static4D q = fact.getQuaternion(i);
133
        QuatHelper.rotateVectorByQuat(mTmp,0,0,1,0,q);
134
        int index = computeMapsIndex(mTmp[0], mTmp[1], mTmp[2]);
135
        maps[i] = mTextureMaps[index];
136
        }
137

    
138
      mesh.setTextureMap(maps,0);
139
      }
140

    
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142

    
143
    private void computeMove(float[] position)
144
      {
145
      int numCenters = position.length/3;
146
      mUnscaledX=0.0f;
147
      mUnscaledY=0.0f;
148
      mUnscaledZ=0.0f;
149

    
150
      for(int center=0; center<numCenters; center++)
151
        {
152
        mUnscaledX += position[3*center  ];
153
        mUnscaledY += position[3*center+1];
154
        mUnscaledZ += position[3*center+2];
155
        }
156

    
157
      mUnscaledX /= numCenters;
158
      mUnscaledY /= numCenters;
159
      mUnscaledZ /= numCenters;
160
      }
161

    
162
///////////////////////////////////////////////////////////////////////////////////////////////////
163
// PUBLIC API
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165

    
166
    public BandagedCubit(float[] position, Static4D quat1, Static4D quat2, Static3D scale, boolean roundCorners)
167
      {
168
      mRoundCorners = roundCorners;
169
      mPosition = position;
170
      mIsAttached = true;
171
      mMarkedEffectID = -1;
172

    
173
      computeMove(mPosition);
174
      mMove = new Static3D(0,0,0);
175

    
176
      FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
177
      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
178

    
179
      DistortedTexture texture = new DistortedTexture();
180
      if( mBitmap==null ) createBitmap();
181
      texture.setTextureAlreadyInverted(mBitmap);
182

    
183
      resetTextureMaps(mesh);
184

    
185
      MatrixEffectScale scaleEffect = new MatrixEffectScale(scale);
186
      MatrixEffectQuaternion quat1Effect = new MatrixEffectQuaternion(quat1, CENTER);
187
      MatrixEffectQuaternion quat2Effect = new MatrixEffectQuaternion(quat2, CENTER);
188
      MatrixEffectMove moveEffect = new MatrixEffectMove(mMove);
189

    
190
      mEffects = new DistortedEffects();
191
      mEffects.apply(scaleEffect);
192
      mEffects.apply(moveEffect);
193
      mEffects.apply(quat2Effect);
194
      mEffects.apply(quat1Effect);
195

    
196
      mNode = new DistortedNode(texture,mEffects,mesh);
197
      }
198

    
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200

    
201
    public void join(float[] position, float scale)
202
      {
203
      int len1 = mPosition.length;
204
      int len2 = position.length;
205

    
206
      float[] tmpPosition = new float[len1+len2];
207

    
208
      System.arraycopy(mPosition, 0, tmpPosition,    0, len1);
209
      System.arraycopy(position , 0, tmpPosition, len1, len2);
210

    
211
      computeMove(tmpPosition);
212
      mPosition = tmpPosition;
213

    
214
      FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
215
      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
216
      resetTextureMaps(mesh);
217
      mNode.setMesh(mesh);
218
      mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
219
      }
220

    
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222

    
223
    public void reset(float scale)
224
      {
225
      float x0 = mPosition[0];
226
      float x1 = mPosition[1];
227
      float x2 = mPosition[2];
228

    
229
      mPosition = new float[3];
230
      mPosition[0] = x0;
231
      mPosition[1] = x1;
232
      mPosition[2] = x2;
233

    
234
      computeMove(mPosition);
235

    
236
      FactoryBandaged3x3Cubit factory = FactoryBandaged3x3Cubit.getInstance();
237
      MeshBase mesh = factory.createMesh(mPosition,false,mRoundCorners);
238
      resetTextureMaps(mesh);
239
      mNode.setMesh(mesh);
240
      mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
241
      }
242

    
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244

    
245
    public void scaleMove(float scale)
246
      {
247
      mMove.set( scale*mUnscaledX, scale*mUnscaledY, scale*mUnscaledZ);
248
      }
249

    
250
///////////////////////////////////////////////////////////////////////////////////////////////////
251

    
252
    public void setMarked()
253
      {
254
      FragmentEffectBrightness effect = new FragmentEffectBrightness(mAlpha);
255
      mMarkedEffectID = effect.getID();
256
      mEffects.apply(effect);
257
      }
258

    
259
///////////////////////////////////////////////////////////////////////////////////////////////////
260

    
261
    public void setUnmarked()
262
      {
263
      if( mMarkedEffectID>=0 ) mEffects.abortById(mMarkedEffectID);
264
      }
265

    
266
///////////////////////////////////////////////////////////////////////////////////////////////////
267

    
268
    public void detach()
269
      {
270
      mIsAttached = false;
271
      }
272

    
273
///////////////////////////////////////////////////////////////////////////////////////////////////
274

    
275
    public void attach()
276
      {
277
      mIsAttached = true;
278
      }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
    public boolean isAttached()
283
      {
284
      return mIsAttached;
285
      }
286

    
287
///////////////////////////////////////////////////////////////////////////////////////////////////
288

    
289
    public float[] getPosition()
290
      {
291
      return mPosition;
292
      }
293

    
294
///////////////////////////////////////////////////////////////////////////////////////////////////
295

    
296
    public DistortedNode getNode()
297
      {
298
      return mNode;
299
      }
300
}
301

    
(8-8/13)