Project

General

Profile

« Previous | Next » 

Revision c4cfd83a

Added by Leszek Koltunski 2 days ago

Glow cubits involved in the phase.

View differences:

src/main/java/org/distorted/phasedsolver/SolverActivity.java
123 123
      {
124 124
      mCurrSolver = pos;
125 125
      String[] phaseNames = createSolver();
126
      mLowerPane.updateNames(this,phaseNames);
126
      mLowerPane.updateNames(phaseNames);
127 127
      int ordinal = getObjectOrdinal();
128 128
      ObjectControl control = getControl();
129 129
      control.changeObject(ordinal, MODE_NORM, mAsset);
......
172 172

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

  
175
  public void Left(View v)       { mLowerPane.backMove(this); }
176
  public void Right(View v)      { mLowerPane.nextMove(this); }
177
  public void PhaseLeft(View v)  { mLowerPane.backPhase(this); }
178
  public void PhaseRight(View v) { mLowerPane.nextPhase(this); }
175
  public void Left(View v)       { mLowerPane.backMove(); }
176
  public void Right(View v)      { mLowerPane.nextMove(); }
177
  public void PhaseLeft(View v)  { mLowerPane.backPhase(); }
178
  public void PhaseRight(View v) { mLowerPane.nextPhase(); }
179 179

  
180 180
///////////////////////////////////////////////////////////////////////////////////////////////////
181 181

  
......
226 226
      for(int m=1; m<=numMoves; m++)
227 227
        moves[index++] = mObject.findMove(solution[m]);
228 228

  
229
      mLowerPane.setSolution(this, moves, phase, mSolver.getSubPhases(phase));
229
      mLowerPane.setSolution(moves, phase, mSolver.getSubPhases(phase));
230 230
      }
231 231

  
232 232
    long time = System.currentTimeMillis();
......
263 263
    {
264 264
    ObjectControl control = getControl();
265 265
    control.fastScrambleObject(1000,20);
266
    mLowerPane.clearMoves(this);
266
    mLowerPane.clearMoves();
267 267

  
268 268
    mNumMoves = 0;
269 269
    mMoves = "";
......
276 276
    {
277 277
    ObjectControl control = getControl();
278 278
    control.solveObject();
279
    mLowerPane.clearMoves(this);
279
    mLowerPane.clearMoves();
280 280

  
281 281
    mNumMoves = 0;
282 282
    mMoves = "";
src/main/java/org/distorted/phasedsolver/SolverLowerPane.java
11 11

  
12 12
import android.widget.TextView;
13 13

  
14
import org.distorted.library.effect.PostprocessEffectGlow;
15
import org.distorted.library.main.DistortedEffects;
16
import org.distorted.library.mesh.MeshBase;
17
import org.distorted.library.message.EffectListener;
18
import org.distorted.library.type.Dynamic2D;
19
import org.distorted.library.type.Dynamic4D;
20
import org.distorted.library.type.Static2D;
21
import org.distorted.library.type.Static4D;
14 22
import org.distorted.objectlib.helpers.MovesFinished;
15 23
import org.distorted.objectlib.main.ObjectControl;
24
import org.distorted.objectlib.main.TwistyObject;
25

  
26
import java.lang.ref.WeakReference;
16 27

  
17 28
///////////////////////////////////////////////////////////////////////////////////////////////////
18 29

  
19
public class SolverLowerPane implements MovesFinished
30
public class SolverLowerPane implements MovesFinished, EffectListener
20 31
{
21 32
  private static final int MOVES_PLACE_0 = 100;
22 33
  private static final int MOVES_PLACE_1 = 101;
23 34
  private static final int MILLIS_PER_DEGREE = 6;
35
  private static final int FLASH_TIME = 1200;
24 36

  
25 37
  private final TextView mText, mPhase;
26 38
  private String[] mPhaseNames;
27 39
  private int mNumPhases;
28 40
  private int[][][] mMoves;
29
  private int[][] mCubitsInvolved;
41
  private int[][] mCubitsNotInvolved;
30 42
  private int mNumMoves,mCurrMove,mCurrPhase;
31 43
  private boolean mCanMove;
32
  private ObjectControl mControl;
44

  
45
  private final Dynamic2D mHaloAndRadiusDyn;
46
  private final Dynamic4D mColorDyn;
47
  private final PostprocessEffectGlow mGlow;
48
  private final WeakReference<SolverActivity> mAct;
49
  private boolean mEffectWorking;
33 50

  
34 51
///////////////////////////////////////////////////////////////////////////////////////////////////
35 52

  
36 53
  SolverLowerPane(SolverActivity act, String[] names)
37 54
    {
55
    mAct = new WeakReference<>(act);
56

  
38 57
    mText  = act.findViewById(R.id.solverText);
39 58
    mPhase = act.findViewById(R.id.solverPhaseName);
40 59

  
60
    mHaloAndRadiusDyn = new Dynamic2D(FLASH_TIME,1.0f);
61
    mHaloAndRadiusDyn.add(new Static2D( 0, 0));
62
    mHaloAndRadiusDyn.add(new Static2D(10,5));
63

  
64
    mColorDyn = new Dynamic4D(FLASH_TIME,1.0f);
65

  
66
    final int[] colors  = new int[] {1,1,1}; // white
67

  
68
    Static4D P1 = new Static4D(colors[0],colors[1],colors[2], 0.0f);
69
    Static4D P2 = new Static4D(colors[0],colors[1],colors[2], 1.0f);
70
    mColorDyn.add(P1);
71
    mColorDyn.add(P2);
72

  
73
    mGlow = new PostprocessEffectGlow(mHaloAndRadiusDyn,mColorDyn);
74

  
41 75
    mPhaseNames = names;
42 76
    mNumPhases = names.length;
43 77
    mMoves = new int[mNumPhases][][];
44
    mCubitsInvolved = new int[mNumPhases][];
78
    mCubitsNotInvolved = new int[mNumPhases][];
45 79
    mCanMove = true;
46
    setSolution(act,null,0,null);
80
    setSolution(null,0,null);
47 81
    }
48 82

  
49 83
///////////////////////////////////////////////////////////////////////////////////////////////////
50 84

  
51
  void updateNames(SolverActivity act, String[] names)
85
  void updateNames(String[] names)
52 86
    {
53 87
    mPhaseNames = names;
54 88
    mNumPhases = names.length;
55 89
    mMoves = new int[mNumPhases][][];
56
    mCubitsInvolved = new int[mNumPhases][];
90
    mCubitsNotInvolved = new int[mNumPhases][];
57 91
    mCanMove = true;
58
    setSolution(act,null,0,null);
92
    setSolution(null,0,null);
59 93
    }
60 94

  
61 95
///////////////////////////////////////////////////////////////////////////////////////////////////
62 96

  
63
  void backPhase(SolverActivity act)
97
  void backPhase()
64 98
    {
99
    SolverActivity act = mAct.get();
100
    ObjectControl control = act.getControl();
101

  
65 102
    if( mCurrMove>0 )
66 103
      {
67 104
      int[][] moves = transformMoves(mMoves[mCurrPhase],0,mCurrMove, false);
68
      mControl = act.getControl();
69
      mControl.applyScrambles(moves);
105
      control.applyScrambles(moves);
70 106
      mCurrMove = 0;
71 107
      }
72 108
    else if( mCurrPhase>0 )
......
74 110
      mCurrPhase--;
75 111
      mNumMoves = mMoves[mCurrPhase]==null ? 0 : mMoves[mCurrPhase].length;
76 112
      int[][] moves = transformMoves(mMoves[mCurrPhase],0,mNumMoves, false);
77
      mControl = act.getControl();
78
      mControl.applyScrambles(moves);
113
      control.applyScrambles(moves);
79 114
      }
80 115
    else
81 116
      {
82 117
      mCurrPhase = mNumPhases-1;
83 118
      mNumMoves = mMoves[mCurrPhase]==null ? 0 : mMoves[mCurrPhase].length;
84 119
      mCurrMove = mNumMoves;
85
      mControl = act.getControl();
86 120
      int[][] moves = transformMoves(mMoves, true);
87
      mControl.applyScrambles(moves);
121
      control.applyScrambles(moves);
88 122
      }
89 123

  
90 124
    setText(act);
......
92 126

  
93 127
///////////////////////////////////////////////////////////////////////////////////////////////////
94 128

  
95
  void nextPhase(SolverActivity act)
129
  void nextPhase()
96 130
    {
131
    SolverActivity act = mAct.get();
132
    ObjectControl control = act.getControl();
133

  
97 134
    if( mCurrPhase<mNumPhases-1 )
98 135
      {
99
      mControl = act.getControl();
100
      glowCubits(mControl,mCubitsInvolved[mCurrPhase]);
101 136
      int[][] moves = transformMoves(mMoves[mCurrPhase],mCurrMove,mNumMoves, true);
102
      mControl.applyScrambles(moves);
137
      control.applyScrambles(moves);
103 138
      mCurrPhase++;
104 139
      mNumMoves = mMoves[mCurrPhase]==null ? 0 : mMoves[mCurrPhase].length;
105 140
      mCurrMove = 0;
141
      glowCubits(mCubitsNotInvolved[mCurrPhase-1]);
106 142
      }
107 143
    else if( mCurrMove<mNumMoves )
108 144
      {
109
      mControl = act.getControl();
110
      glowCubits(mControl,mCubitsInvolved[mCurrPhase]);
111 145
      int[][] moves = transformMoves(mMoves[mCurrPhase],mCurrMove,mNumMoves, true);
112
      mControl.applyScrambles(moves);
146
      control.applyScrambles(moves);
113 147
      mCurrMove = mNumMoves;
148
      glowCubits(mCubitsNotInvolved[mCurrPhase]);
114 149
      }
115 150
    else
116 151
      {
117
      mControl = act.getControl();
118 152
      mCurrPhase = 0;
119 153
      mNumMoves = mMoves[mCurrPhase]==null ? 0 : mMoves[mCurrPhase].length;
120 154
      mCurrMove = 0;
121 155
      int[][] moves = transformMoves(mMoves, false);
122
      mControl.applyScrambles(moves);
156
      control.applyScrambles(moves);
123 157
      }
124 158

  
125 159
    setText(act);
......
207 241

  
208 242
///////////////////////////////////////////////////////////////////////////////////////////////////
209 243

  
210
  private void glowCubits(ObjectControl control, int[] cubits)
244
  private void glowCubits(int[] cubits)
211 245
    {
212
    StringBuilder sb = new StringBuilder();
213
    sb.append("Glowing: ");
214

  
215
    for( int c: cubits )
246
    if( !mEffectWorking )
216 247
      {
217
      sb.append(' ');
218
      sb.append(c);
248
      mEffectWorking = true;
249
      SolverActivity act=mAct.get();
250
      ObjectControl control = act.getControl();
251
      TwistyObject object=control.getObject();
252
      DistortedEffects effects=object.getObjectEffects();
253
      effects.apply(mGlow);
254

  
255
      MeshBase mesh=object.getObjectMesh();
256
      mesh.setComponentsNotAffectedByPostprocessing(cubits);
257

  
258
      mHaloAndRadiusDyn.resetToBeginning();
259
      mColorDyn.resetToBeginning();
260
      mGlow.notifyWhenFinished(this);
219 261
      }
220

  
221
    android.util.Log.e("D", sb.toString() );
222 262
    }
223 263

  
224 264
///////////////////////////////////////////////////////////////////////////////////////////////////
225 265

  
226
  private int[] computeCubitsInvolved(int[][] subphases)
266
  public void effectFinished(long id)
227 267
    {
228
    int numCubits = 0;
229
    for(int[] sub : subphases) numCubits += (sub==null ? 0 : sub.length);
268
    SolverActivity act=mAct.get();
269
    ObjectControl control = act.getControl();
270
    TwistyObject object=control.getObject();
271
    DistortedEffects effects=object.getObjectEffects();
272
    effects.abortById(id);
230 273

  
231
    int[] ret = new int[numCubits];
232
    int index = 0;
274
    mEffectWorking = false;
275
    }
276

  
277
///////////////////////////////////////////////////////////////////////////////////////////////////
278

  
279
  private int[] computeCubitsNotInvolved(int[][] subphases, int numCubits)
280
    {
281
    int numCubitsInvolved = 0;
282
    boolean[] involved = new boolean[numCubits];
233 283

  
234 284
    for(int[] sub : subphases)
235 285
      if( sub!=null )
236 286
        for(int s : sub)
237
          ret[index++] = s;
287
          {
288
          numCubitsInvolved++;
289
          involved[s] = true;
290
          }
291

  
292
    int[] ret = new int[numCubits-numCubitsInvolved];
293
    int index = 0;
294

  
295
    for(int c=0; c<numCubits; c++)
296
      if( !involved[c] ) ret[index++] = c;
238 297

  
239 298
    return ret;
240 299
    }
241 300

  
242 301
///////////////////////////////////////////////////////////////////////////////////////////////////
243 302

  
244
  void setSolution(SolverActivity act, int[][] moves, int phase, int[][] subphases)
303
  void setSolution(int[][] moves, int phase, int[][] subphases)
245 304
    {
246
    mCubitsInvolved[phase] = subphases==null ? null : computeCubitsInvolved(subphases);
305
    SolverActivity act=mAct.get();
306

  
307
    if( subphases!=null )
308
      {
309
      ObjectControl control=act.getControl();
310
      TwistyObject object=control.getObject();
311
      int numCubits=object.getNumCubits();
312
      mCubitsNotInvolved[phase]= computeCubitsNotInvolved(subphases, numCubits);
313
      }
314

  
247 315
    mMoves[phase] = moves;
248 316
    if( phase==0 ) mNumMoves = (moves==null ? 0 : moves.length);
249 317
    mCurrPhase = 0;
......
254 322

  
255 323
///////////////////////////////////////////////////////////////////////////////////////////////////
256 324

  
257
  void clearMoves(SolverActivity act)
325
  void clearMoves()
258 326
    {
259 327
    for(int p=0; p<mNumPhases; p++) mMoves[p] = null;
260 328
    mNumMoves = 0;
261 329
    mCurrPhase= 0;
262 330
    mCurrMove = 0;
263 331

  
264
    setText(act);
332
    setText(mAct.get());
265 333
    }
266 334

  
267 335
///////////////////////////////////////////////////////////////////////////////////////////////////
268 336

  
269
  void backMove(SolverActivity act)
337
  void backMove()
270 338
    {
271 339
    if( mMoves!=null && mCanMove )
272 340
      {
341
      SolverActivity act=mAct.get();
342

  
273 343
      if( mCurrMove>0 )
274 344
        {
275 345
        mCanMove = false;
276 346
        int[] move = mMoves[mCurrPhase][--mCurrMove];
277
        mControl = act.getControl();
278
        mControl.blockTouch(MOVES_PLACE_0);
279
        mControl.addRotation(this, move[0], (1<<move[1]), -move[2], MILLIS_PER_DEGREE);
347
        ObjectControl control = act.getControl();
348
        control.blockTouch(MOVES_PLACE_0);
349
        control.addRotation(this, move[0], (1<<move[1]), -move[2], MILLIS_PER_DEGREE);
280 350
        }
281 351
      else if( mCurrPhase>0 )
282 352
        {
......
289 359
        mCurrPhase = mNumPhases-1;
290 360
        mNumMoves = mMoves[mCurrPhase]==null ? 0 : mMoves[mCurrPhase].length;
291 361
        mCurrMove = mNumMoves;
292
        mControl = act.getControl();
293

  
294 362
        int[][] moves = transformMoves(mMoves, true);
295
        mControl.applyScrambles(moves);
363
        ObjectControl control = act.getControl();
364
        control.applyScrambles(moves);
296 365
        }
297 366

  
298 367
      setText(act);
......
301 370

  
302 371
///////////////////////////////////////////////////////////////////////////////////////////////////
303 372

  
304
  void nextMove(SolverActivity act)
373
  void nextMove()
305 374
    {
306 375
    if( mMoves!=null && mCanMove )
307 376
      {
377
      SolverActivity act=mAct.get();
378

  
308 379
      if( mCurrMove<mNumMoves )
309 380
        {
310 381
        mCanMove = false;
311 382
        int[] move = mMoves[mCurrPhase][mCurrMove++];
312
        mControl = act.getControl();
313
        mControl.blockTouch(MOVES_PLACE_1);
314
        mControl.addRotation(this, move[0], (1<<move[1]), move[2], MILLIS_PER_DEGREE);
383
        ObjectControl control = act.getControl();
384
        control.blockTouch(MOVES_PLACE_1);
385
        control.addRotation(this, move[0], (1<<move[1]), move[2], MILLIS_PER_DEGREE);
315 386

  
316 387
        if( mCurrPhase==mNumPhases-1 && mCurrMove==mNumMoves )
317
          glowCubits(mControl,mCubitsInvolved[mCurrPhase]);
388
          glowCubits(mCubitsNotInvolved[mCurrPhase]);
318 389
        }
319 390
      else if( mCurrPhase<mNumPhases-1 )
320 391
        {
321
        glowCubits(mControl,mCubitsInvolved[mCurrPhase]);
392
        glowCubits(mCubitsNotInvolved[mCurrPhase]);
322 393
        mCurrPhase++;
323 394
        mNumMoves = mMoves[mCurrPhase]==null ? 0 : mMoves[mCurrPhase].length;
324 395
        mCurrMove = 0;
......
329 400
        mNumMoves = mMoves[mCurrPhase]==null ? 0 : mMoves[mCurrPhase].length;
330 401
        mCurrMove = 0;
331 402
        int[][] moves = transformMoves(mMoves, false);
332
        mControl = act.getControl();
333
        mControl.applyScrambles(moves);
403
        ObjectControl control = act.getControl();
404
        control.applyScrambles(moves);
334 405
        }
335 406

  
336 407
      setText(act);
......
342 413
  public void onActionFinished(final long effectID)
343 414
    {
344 415
    mCanMove = true;
345
    mControl.unblockRotation();
416

  
417
    SolverActivity act=mAct.get();
418
    ObjectControl control = act.getControl();
419
    control.unblockRotation();
346 420
    }
347 421
}
src/main/java/org/distorted/phasedsolver/SolverRenderer.java
13 13
import android.opengl.GLSurfaceView;
14 14

  
15 15
import org.distorted.library.effect.EffectType;
16
import org.distorted.library.effect.PostprocessEffectBorder;
16
import org.distorted.library.effect.PostprocessEffectGlow;
17 17
import org.distorted.library.effect.VertexEffectQuaternion;
18 18
import org.distorted.library.effect.VertexEffectRotate;
19 19
import org.distorted.library.main.DistortedLibrary;
20 20
import org.distorted.library.main.DistortedScreen;
21 21
import org.distorted.library.mesh.MeshBase;
22
import org.distorted.objectlib.effects.BaseEffect;
23 22
import org.distorted.objectlib.main.ObjectControl;
24 23

  
25 24
import java.io.InputStream;
......
80 79

  
81 80
      VertexEffectRotate.enable();
82 81
      VertexEffectQuaternion.enable();
83
      PostprocessEffectBorder.enable();
84
      BaseEffect.Type.enableEffects();
82
      PostprocessEffectGlow.enable();
85 83

  
86 84
      DistortedLibrary.onSurfaceCreated(this);
87 85
      }

Also available in: Unified diff