Project

General

Profile

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

magiccube / src / main / java / org / distorted / tutorial / TutorialPreRender.java @ 36b9ee93

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 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.tutorial;
21

    
22
import android.content.Context;
23
import android.content.res.Resources;
24

    
25
import org.distorted.effects.BaseEffect;
26
import org.distorted.effects.EffectController;
27
import org.distorted.objects.ObjectList;
28
import org.distorted.objects.TwistyObject;
29
import org.distorted.main.RubikPreRender.ActionFinishedListener;
30
import org.distorted.scores.RubikScores;
31

    
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

    
34
public class TutorialPreRender implements EffectController
35
  {
36
  private ActionFinishedListener mAddActionListener;
37
  private final TutorialSurfaceView mView;
38
  private boolean mFinishRotation, mRemoveRotation, mAddRotation,
39
                  mSetQuat, mChangeObject, mSetupObject, mSolveObject, mScrambleObject,
40
                  mInitializeObject, mResetAllTextureMaps, mRemovePatternRotation;
41
  private boolean mCanPlay;
42
  private boolean mIsSolved;
43
  private ObjectList mNextObject;
44
  private int mNextSize;
45
  private long mRotationFinishedID;
46
  private int mScreenWidth;
47
  private int[][] mNextMoves;
48
  private TwistyObject mOldObject, mNewObject;
49
  private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle;
50
  private long mAddRotationDuration;
51
  private long mAddRotationID, mRemoveRotationID;
52
  private int mNearestAngle;
53
  private int mScrambleObjectNum;
54

    
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56

    
57
  TutorialPreRender(TutorialSurfaceView view)
58
    {
59
    mView = view;
60

    
61
    mFinishRotation = false;
62
    mRemoveRotation = false;
63
    mAddRotation    = false;
64
    mSetQuat        = false;
65
    mChangeObject   = false;
66
    mSetupObject    = false;
67
    mSolveObject    = false;
68
    mScrambleObject = false;
69

    
70
    mCanPlay        = true;
71
    mOldObject      = null;
72
    mNewObject      = null;
73

    
74
    mScreenWidth       = 0;
75
    mScrambleObjectNum = 0;
76

    
77
    mRemovePatternRotation= false;
78
    }
79

    
80
///////////////////////////////////////////////////////////////////////////////////////////////////
81

    
82
  private void createObjectNow(ObjectList object, int size, int[][] moves)
83
    {
84
    if( mOldObject!=null ) mOldObject.releaseResources();
85
    mOldObject = mNewObject;
86

    
87
    Context con = mView.getContext();
88
    Resources res = con.getResources();
89

    
90
    mNewObject = object.create(size, mView.getQuat(), moves, res, mScreenWidth);
91

    
92
    if( mNewObject!=null )
93
      {
94
      mNewObject.createTexture();
95
      mView.setMovement(object.getObjectMovementClass());
96

    
97
      if( mScreenWidth!=0 )
98
        {
99
        mNewObject.recomputeScaleFactor(mScreenWidth);
100
        }
101

    
102
      mIsSolved = mNewObject.isSolved();
103
      }
104
    }
105

    
106
///////////////////////////////////////////////////////////////////////////////////////////////////
107

    
108
  private void doEffectNow(BaseEffect.Type type)
109
    {
110
    try
111
      {
112
      type.startEffect(mView.getRenderer().getScreen(),this);
113
      }
114
    catch( Exception ex )
115
      {
116
      mCanPlay= true;
117
      }
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121

    
122
  private void removePatternRotation()
123
    {
124
    mRemovePatternRotation = true;
125
    }
126

    
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128

    
129
  private void removePatternRotationNow()
130
    {
131
    mRemovePatternRotation=false;
132
    mNewObject.removeRotationNow();
133
    mAddActionListener.onActionFinished(mRemoveRotationID);
134
    }
135

    
136
///////////////////////////////////////////////////////////////////////////////////////////////////
137

    
138
  private void removeRotationNow()
139
    {
140
    mRemoveRotation=false;
141
    mNewObject.removeRotationNow();
142

    
143
    boolean solved = mNewObject.isSolved();
144

    
145
    if( solved && !mIsSolved )
146
      {
147
      doEffectNow( BaseEffect.Type.WIN );
148
      }
149
    else
150
      {
151
      mCanPlay = true;
152
      }
153

    
154
    mIsSolved = solved;
155
    }
156

    
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158

    
159
  private void removeRotation()
160
    {
161
    mRemoveRotation = true;
162
    }
163

    
164
///////////////////////////////////////////////////////////////////////////////////////////////////
165

    
166
  private void addRotationNow()
167
    {
168
    mAddRotation = false;
169
    mAddRotationID = mNewObject.addNewRotation( mAddRotationAxis, mAddRotationRowBitmap,
170
                                                mAddRotationAngle, mAddRotationDuration, this);
171
    }
172

    
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

    
175
  private void finishRotationNow()
176
    {
177
    mFinishRotation = false;
178
    mCanPlay        = false;
179
    mRotationFinishedID = mNewObject.finishRotationNow(this, mNearestAngle);
180

    
181
    if( mRotationFinishedID==0 ) // failed to add effect - should never happen
182
      {
183
      mCanPlay   = true;
184
      }
185
    }
186

    
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188

    
189
  private void changeObjectNow()
190
    {
191
    mChangeObject = false;
192

    
193
    if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
194
      {
195
      mCanPlay  = false;
196
      createObjectNow(mNextObject, mNextSize, null);
197
      doEffectNow( BaseEffect.Type.SIZECHANGE );
198
      }
199
    }
200

    
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202

    
203
  private void setupObjectNow()
204
    {
205
    mSetupObject = false;
206

    
207
    if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
208
      {
209
      mCanPlay  = false;
210
      createObjectNow(mNextObject, mNextSize, mNextMoves);
211
      doEffectNow( BaseEffect.Type.SIZECHANGE );
212
      }
213
    else
214
      {
215
      mNewObject.initializeObject(mNextMoves);
216
      }
217
    }
218

    
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

    
221
  private void solveObjectNow()
222
    {
223
    mSolveObject = false;
224
    mCanPlay     = false;
225
    doEffectNow( BaseEffect.Type.SOLVE );
226
    }
227

    
228
///////////////////////////////////////////////////////////////////////////////////////////////////
229

    
230
  private void scrambleObjectNow()
231
    {
232
    mScrambleObject = false;
233
    mCanPlay        = false;
234
    mIsSolved       = false;
235
    RubikScores.getInstance().incrementNumPlays();
236
    doEffectNow( BaseEffect.Type.SCRAMBLE );
237
    }
238

    
239
///////////////////////////////////////////////////////////////////////////////////////////////////
240

    
241
  private void initializeObjectNow()
242
    {
243
    mInitializeObject = false;
244
    mNewObject.initializeObject(mNextMoves);
245
    }
246

    
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248

    
249
  private void resetAllTextureMapsNow()
250
    {
251
    mResetAllTextureMaps = false;
252

    
253
    if( mNewObject!=null ) mNewObject.resetAllTextureMaps();
254
    }
255

    
256
///////////////////////////////////////////////////////////////////////////////////////////////////
257

    
258
  private void setQuatNow()
259
    {
260
    mSetQuat = false;
261
    mView.setQuat();
262
    }
263

    
264
///////////////////////////////////////////////////////////////////////////////////////////////////
265
//
266
///////////////////////////////////////////////////////////////////////////////////////////////////
267

    
268
  void setScreenSize(int width)
269
    {
270
    if( mNewObject!=null )
271
      {
272
      mNewObject.createTexture();
273
      mNewObject.recomputeScaleFactor(width);
274
      }
275

    
276
    mScreenWidth  = width;
277
    }
278

    
279
///////////////////////////////////////////////////////////////////////////////////////////////////
280

    
281
  void finishRotation(int nearestAngle)
282
    {
283
    mNearestAngle   = nearestAngle;
284
    mFinishRotation = true;
285
    }
286

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

    
289
  void changeObject(ObjectList object, int size)
290
    {
291
    if( size>0 )
292
      {
293
      mChangeObject = true;
294
      mNextObject = object;
295
      mNextSize   = size;
296
      }
297
    }
298

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

    
301
  void setQuatOnNextRender()
302
    {
303
    mSetQuat = true;
304
    }
305

    
306
///////////////////////////////////////////////////////////////////////////////////////////////////
307

    
308
  void preRender()
309
    {
310
    if( mSetQuat               ) setQuatNow();
311
    if( mFinishRotation        ) finishRotationNow();
312
    if( mRemoveRotation        ) removeRotationNow();
313
    if( mChangeObject          ) changeObjectNow();
314
    if( mSetupObject           ) setupObjectNow();
315
    if( mSolveObject           ) solveObjectNow();
316
    if( mScrambleObject        ) scrambleObjectNow();
317
    if( mAddRotation           ) addRotationNow();
318
    if( mInitializeObject      ) initializeObjectNow();
319
    if( mResetAllTextureMaps   ) resetAllTextureMapsNow();
320
    if( mRemovePatternRotation ) removePatternRotationNow();
321
    }
322

    
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324
// PUBLIC API
325
///////////////////////////////////////////////////////////////////////////////////////////////////
326

    
327
  public void addRotation(ActionFinishedListener listener, int axis, int rowBitmap, int angle, long duration)
328
    {
329
    mAddRotation = true;
330

    
331
    mAddActionListener    = listener;
332
    mAddRotationAxis      = axis;
333
    mAddRotationRowBitmap = rowBitmap;
334
    mAddRotationAngle     = angle;
335
    mAddRotationDuration  = duration;
336
    }
337

    
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339

    
340
  public int getNumScrambles()
341
    {
342
    return mScrambleObjectNum;
343
    }
344

    
345
///////////////////////////////////////////////////////////////////////////////////////////////////
346

    
347
  public void solveObject()
348
    {
349
    if( mCanPlay )
350
      {
351
      mSolveObject = true;
352
      }
353
    }
354

    
355
///////////////////////////////////////////////////////////////////////////////////////////////////
356

    
357
  public void scrambleObject(int num)
358
    {
359
    if( mCanPlay )
360
      {
361
      mScrambleObject = true;
362
      mScrambleObjectNum = num;
363
      }
364
    }
365

    
366
///////////////////////////////////////////////////////////////////////////////////////////////////
367

    
368
  public TwistyObject getObject()
369
    {
370
    return mNewObject;
371
    }
372

    
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374

    
375
  public TwistyObject getOldObject()
376
    {
377
    return null;
378
    }
379

    
380
///////////////////////////////////////////////////////////////////////////////////////////////////
381

    
382
  public void effectFinished(final long effectID)
383
    {
384
    if( effectID == mRotationFinishedID )
385
      {
386
      mRotationFinishedID = 0;
387
      removeRotation();
388
      }
389
    else if( effectID == mAddRotationID )
390
      {
391
      mAddRotationID = 0;
392
      mRemoveRotationID = effectID;
393
      removePatternRotation();
394
      }
395
    else
396
      {
397
      mCanPlay   = true;
398
      }
399
    }
400
  }
(3-3/7)