Project

General

Profile

« Previous | Next » 

Revision 3a0a23bf

Added by Leszek Koltunski almost 2 years ago

Beginnings of support for 'sticker overrides' - possibility to override the color of an individual face of an individual cubit. Ultimately this will enable overriding with any bitmap; so far only a solid color.

Also, fixes for two crashers.

View differences:

src/main/java/org/distorted/objectlib/helpers/ObjectStickerOverride.java
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.objectlib.helpers;
21

  
22
public class ObjectStickerOverride
23
{
24
  private final int mCubit;
25
  private final int mFace;
26
  private final int mColor;
27

  
28
///////////////////////////////////////////////////////////////////////////////////////////////////
29

  
30
  public ObjectStickerOverride(int cubit, int face, int color)
31
    {
32
    mCubit = cubit;
33
    mFace  = face;
34
    mColor = color; // ARGB
35
    }
36

  
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38

  
39
  public int getCubit()
40
    {
41
    return mCubit;
42
    }
43

  
44
///////////////////////////////////////////////////////////////////////////////////////////////////
45

  
46
  public int getFace()
47
    {
48
    return mFace;
49
    }
50

  
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

  
53
  public int getColor()
54
    {
55
    return mColor;
56
    }
57
}
src/main/java/org/distorted/objectlib/json/JsonReader.java
32 32

  
33 33
import org.distorted.objectlib.helpers.ObjectFaceShape;
34 34
import org.distorted.objectlib.helpers.ObjectSignature;
35
import org.distorted.objectlib.helpers.ObjectStickerOverride;
35 36
import org.distorted.objectlib.main.Cubit;
36 37
import org.distorted.objectlib.objects.TwistyBandagedCuboid;
37 38
import org.json.JSONArray;
......
84 85
  private ObjectSignature mSignature;
85 86
  private int[] mCubitType;
86 87
  private float[][] mCubitRowOffset;
88
  private ObjectStickerOverride[] mStickerOverrides;
87 89

  
88 90
  private static JsonReader mThis;
89 91

  
......
372 374
      }
373 375
    }
374 376

  
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378

  
379
  private void parseOverrides(JSONArray object) throws JSONException
380
    {
381
    int numOverrides = object.length();
382
    mStickerOverrides= new ObjectStickerOverride[numOverrides];
383

  
384
    for(int i=0; i<numOverrides; i++)
385
      {
386
      JSONObject override = object.getJSONObject(i);
387
      int cubit = override.getInt("cubit");
388
      int face  = override.getInt("face");
389
      int color = override.getInt("color");
390
      mStickerOverrides[i] = new ObjectStickerOverride(cubit,face,color);
391
      }
392
    }
393

  
375 394
///////////////////////////////////////////////////////////////////////////////////////////////////
376 395

  
377 396
  private void parseMesh(JSONObject object) throws JSONException
......
382 401
    parseShapes(shapes);
383 402
    JSONArray stickers = object.getJSONArray("stickers");
384 403
    parseStickers(stickers);
404

  
405
    JSONArray overrides= object.optJSONArray("overrides");
406
    if( overrides!=null ) parseOverrides(overrides);
385 407
    }
386 408

  
387 409
///////////////////////////////////////////////////////////////////////////////////////////////////
......
1011 1033
    return mObjectSticker[sticker];
1012 1034
    }
1013 1035

  
1036
///////////////////////////////////////////////////////////////////////////////////////////////////
1037

  
1038
  public ObjectStickerOverride[] getStickerOverrides()
1039
    {
1040
    return mStickerOverrides;
1041
    }
1042

  
1014 1043
///////////////////////////////////////////////////////////////////////////////////////////////////
1015 1044

  
1016 1045
  public Static3D[] getRotationAxis()
src/main/java/org/distorted/objectlib/json/JsonWriter.java
27 27

  
28 28
import org.distorted.objectlib.helpers.ObjectFaceShape;
29 29
import org.distorted.objectlib.helpers.ObjectSignature;
30
import org.distorted.objectlib.helpers.ObjectStickerOverride;
30 31
import org.json.JSONArray;
31 32
import org.json.JSONException;
32 33
import org.json.JSONObject;
......
339 340
    return stickers;
340 341
    }
341 342

  
343
///////////////////////////////////////////////////////////////////////////////////////////////////
344

  
345
  private JSONArray generateOverrides(TwistyObject object) throws JSONException
346
    {
347
    ObjectStickerOverride[] overrides = object.getStickerOverrides();
348

  
349
    if( overrides!=null )
350
      {
351
      JSONArray overrideArray = new JSONArray();
352

  
353
      for (ObjectStickerOverride objectStickerOverride : overrides)
354
        {
355
        JSONObject override = new JSONObject();
356
        int cubit = objectStickerOverride.getCubit();
357
        int face  = objectStickerOverride.getFace();
358
        int color = objectStickerOverride.getColor();
359

  
360
        override.put("cubit", cubit);
361
        override.put("face" , face );
362
        override.put("color", color);
363

  
364
        overrideArray.put(override);
365
        }
366

  
367
      return overrideArray;
368
      }
369

  
370
    return null;
371
    }
372

  
342 373
///////////////////////////////////////////////////////////////////////////////////////////////////
343 374

  
344 375
  private JSONObject generateMesh(TwistyObject object) throws JSONException
......
353 384
    mesh.put("cubits"  , cubits);
354 385
    mesh.put("stickers", stickers);
355 386

  
387
    JSONArray overrides = generateOverrides(object);
388
    if( overrides!=null ) mesh.put("overrides", overrides);
389

  
356 390
    return mesh;
357 391
    }
358 392

  
src/main/java/org/distorted/objectlib/main/Cubit.java
63 63
    mTrackingPoint= mParent.getTrackingPoint(cubitIndex,mCubitType);
64 64
    int face      = mParent.computeCurrentPuzzleFace(mCubitType,mTrackingPoint);
65 65

  
66
    mOrigOffsetX = mRowOffset[0];
67
    mOrigOffsetY = mRowOffset[1];
68
    mOrigOffsetZ = mRowOffset[2];
69

  
70
    if( mCubitType==TYPE_DECIDER ) mParent.setRotationRowOffset(face,mRowOffset);
66
    if( mRowOffset!=null )
67
      {
68
      mOrigOffsetX = mRowOffset[0];
69
      mOrigOffsetY = mRowOffset[1];
70
      mOrigOffsetZ = mRowOffset[2];
71
      if( mCubitType==TYPE_DECIDER ) mParent.setRotationRowOffset(face,mRowOffset);
72
      }
73
    else
74
      {
75
      mOrigOffsetX = 0;
76
      mOrigOffsetY = 0;
77
      mOrigOffsetZ = 0;
78
      }
71 79

  
72 80
    mCubitIndex       = cubitIndex;
73 81
    mOrigPuzzleFace   = face;
src/main/java/org/distorted/objectlib/main/ObjectPreRender.java
538 538

  
539 539
  public void addRotation(MovesFinished listener, int axis, int rowBitmap, int bareAngle, int millPreDegree)
540 540
    {
541
    int[][] basicAngles = mNewObject.getBasicAngles();
541
    int[][] basicAngles = mNewObject==null ? null : mNewObject.getBasicAngles();
542
    int length = basicAngles==null ? 0 : basicAngles.length;
542 543

  
543
    if( axis<basicAngles.length )
544
    if( axis<length )
544 545
      {
545 546
      mAddRotation = true;
546 547
      int row = computeRowFromBitmap(rowBitmap);
src/main/java/org/distorted/objectlib/main/ObjectType.java
177 177
  public static TwistyObject create(int ordinal, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream meshStream)
178 178
    {
179 179
    /*
180
    if( ordinal==CRA1_2.ordinal() )
180
    if( ordinal==CRA1_3.ordinal() )
181 181
      {
182
      InitData data = CRA1_2.mInitData;
183
      return new TwistyCrazy2x2(data,meshState,iconMode,quat,move,scale,meshStream);
182
      return new TwistyCrazy3x3(objects[ordinal].mInitData,meshState,iconMode,quat,move,scale,meshStream);
184 183
      }
185 184
    */
186 185
    Class<? extends TwistyObject> clazz = objects[ordinal].mClass;
src/main/java/org/distorted/objectlib/main/TwistyJson.java
27 27
import org.distorted.objectlib.helpers.ObjectShape;
28 28
import org.distorted.objectlib.helpers.ObjectSignature;
29 29
import org.distorted.objectlib.helpers.ObjectSticker;
30
import org.distorted.objectlib.helpers.ObjectStickerOverride;
30 31
import org.distorted.objectlib.scrambling.ScrambleState;
31 32
import org.distorted.objectlib.json.JsonReader;
32 33
import org.distorted.objectlib.touchcontrol.TouchControlDodecahedron;
......
135 136
    return mReader.retSticker(sticker);
136 137
    }
137 138

  
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140

  
141
  @Override
142
  public ObjectStickerOverride[] getStickerOverrides()
143
    {
144
    return mReader.getStickerOverrides();
145
    }
146

  
138 147
///////////////////////////////////////////////////////////////////////////////////////////////////
139 148

  
140 149
  @Override
src/main/java/org/distorted/objectlib/main/TwistyObject.java
56 56
import org.distorted.objectlib.helpers.ObjectShape;
57 57
import org.distorted.objectlib.helpers.ObjectSignature;
58 58
import org.distorted.objectlib.helpers.ObjectSticker;
59
import org.distorted.objectlib.helpers.ObjectStickerOverride;
59 60
import org.distorted.objectlib.helpers.QuatGroupGenerator;
60 61
import org.distorted.objectlib.scrambling.ScrambleState;
61 62
import org.distorted.objectlib.scrambling.ObjectScrambler;
......
107 108
  private float[] mStickerScales;
108 109
  private Cubit[] mCubits;
109 110
  private MeshBase[] mMeshes;
110
  private int mNumCubits, mNumQuats, mNumFaceColors, mNumTextures;
111
  private int mNumCubits, mNumQuats, mNumFaceColors, mNumTextures, mNumOverrides;
111 112
  private int mNumCubitFaces, mNumStickerTypes;
112 113
  private Static3D[] mAxis;
113 114
  private float[][] mCuts;
......
155 156
  private boolean[] mBelongs;
156 157
  private float[] mTmp;
157 158
  private int mNumPuzzleFaces;
159
  private ObjectStickerOverride[] mStickerOverrides;
158 160

  
159 161
  //////////////////// SOLVED1 ////////////////////////
160 162

  
......
466 468
      mNumStickerTypes = (mStickerCoords==null ? 0 : mStickerCoords.length);
467 469
      }
468 470

  
469
    mNumTextures= mNumFaceColors *mNumStickerTypes;
471
    mStickerOverrides = getStickerOverrides();
472
    mNumOverrides = mStickerOverrides==null ? 0 : mStickerOverrides.length;
473

  
474
    mNumTextures= mNumFaceColors*mNumStickerTypes + mNumOverrides;
470 475
    mNumTexCols = NUM_STICKERS_IN_ROW;
471 476
    mNumTexRows = (mNumTextures+1)/NUM_STICKERS_IN_ROW;
472 477
    if( mNumTexCols*mNumTexRows < mNumTextures+1 ) mNumTexRows++;
......
1522 1527
        {
1523 1528
        cubColor = getCubitFaceColor(cubit,face);
1524 1529
        varColor = getVariantFaceColor(variant,face);
1525
        color    = cubColor<0 || varColor<0 ? mNumTextures : varColor*mNumFaceColors + cubColor;
1530
        color    = cubColor<0 || varColor<0 ? mNumTextures-mNumOverrides : varColor*mNumFaceColors + cubColor;
1526 1531
        row      = (mNumTexRows-1) - color/mNumTexCols;
1527 1532
        col      = color%mNumTexCols;
1528 1533

  
......
1707 1712
    }
1708 1713

  
1709 1714
///////////////////////////////////////////////////////////////////////////////////////////////////
1710
// the getFaceColors + final black in a grid (so that we do not exceed the maximum texture size)
1715
// the getFaceColors + final INTERNAL_COLOR in a grid (so that we do not exceed the maximum texture size)
1711 1716

  
1712 1717
  private void createTexture()
1713 1718
    {
......
1728 1733
    for(int row=0; row<mNumTexRows; row++)
1729 1734
      for(int col=0; col<mNumTexCols; col++)
1730 1735
        {
1731
        if( texture>=mNumTextures ) break;
1732
        ObjectSticker sticker = retSticker(texture/mNumFaceColors);
1733
        int color = getColor(texture% mNumFaceColors);
1734
        factory.drawRoundedPolygon(canvas, paint, col*TEXTURE_HEIGHT, (mNumTexRows-row)*TEXTURE_HEIGHT, color, sticker);
1735
        texture++;
1736
        if( texture<mNumTextures-mNumOverrides )
1737
          {
1738
          ObjectSticker sticker = retSticker(texture/mNumFaceColors);
1739
          int color = getColor(texture% mNumFaceColors);
1740
          factory.drawRoundedPolygon(canvas, paint, col*TEXTURE_HEIGHT, (mNumTexRows-row)*TEXTURE_HEIGHT, color, sticker);
1741
          texture++;
1742
          }
1743
        else if( texture<mNumTextures )
1744
          {
1745
          int color = mStickerOverrides[mNumTextures-texture-1].getColor();
1746
          int left = col*TEXTURE_HEIGHT;
1747
          int bottom = (mNumTexRows-row)*TEXTURE_HEIGHT;
1748
          paint.setColor(color);
1749
          canvas.drawRect(left,bottom-TEXTURE_HEIGHT,left+TEXTURE_HEIGHT,bottom,paint);
1750
          }
1736 1751
        }
1737 1752
    }
1738 1753

  
......
1882 1897
    return mCubits[cubit].getOffset();
1883 1898
    }
1884 1899

  
1900
///////////////////////////////////////////////////////////////////////////////////////////////////
1901

  
1902
  public ObjectStickerOverride[] getStickerOverrides()
1903
    {
1904
    return null;
1905
    }
1906

  
1885 1907
///////////////////////////////////////////////////////////////////////////////////////////////////
1886 1908
// PUBLIC API
1887 1909
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/objectlib/objects/TwistyCrazy3x3.java
26 26
import org.distorted.objectlib.helpers.ObjectFaceShape;
27 27
import org.distorted.objectlib.helpers.ObjectShape;
28 28
import org.distorted.objectlib.helpers.ObjectSignature;
29
import org.distorted.objectlib.helpers.ObjectStickerOverride;
29 30
import org.distorted.objectlib.main.Cubit;
30 31
import org.distorted.objectlib.main.InitData;
31 32
import org.distorted.objectlib.main.ObjectType;
......
99 100
      };
100 101
    }
101 102

  
103

  
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105

  
106
  @Override
107
  public ObjectStickerOverride[] getStickerOverrides()
108
    {
109
    ObjectStickerOverride[] overrides = new ObjectStickerOverride[6];
110

  
111
    for(int i=0; i<6; i++)
112
      {
113
      int cubit = 20+i;
114
      float[] offset = getCubitRowOffset(cubit);
115
      float isX = offset[0]*offset[0]+offset[1]*offset[1]+offset[2]*offset[2];
116
      overrides[i] = new ObjectStickerOverride(cubit,6,isX==0 ? 0xff0f0000 : 0xff000000 );
117
      }
118

  
119
    return overrides;
120
    }
121

  
102 122
///////////////////////////////////////////////////////////////////////////////////////////////////
103 123

  
104 124
  @Override
......
581 601

  
582 602
  private ObjectShape getCenterShape(float D)
583 603
    {
604
    final float A = 0.1f;
605
    final float B = 0.2f;
606
    final float C = 0.55f+D;
607

  
584 608
    float[][] vertices = new float[][]
585 609
        {
586 610
            {-0.5f,-0.5f,-0.5f+D},
......
591 615
            {+0.5f,-0.5f,+0.5f+D},
592 616
            {+0.5f,+0.5f,-0.5f+D},
593 617
            {+0.5f,+0.5f,+0.5f+D},
618

  
619
            {   0,-A  , C},
620
            {   B,-A-B, C},
621
            { A+B,  -B, C},
622
            { A  ,   0, C},
623
            { A+B,   B, C},
624
            {   B, A+B, C},
625
            {   0, A  , C},
626
            {  -B, A+B, C},
627
            {-A-B,   B, C},
628
            {-A  ,   0, C},
629
            {-A-B,  -B, C},
630
            {  -B,-A-B, C},
594 631
        };
595 632

  
596 633
    int[][] indices = new int[][]
......
600 637
            {0,1,3,2},
601 638
            {3,7,6,2},
602 639
            {0,4,5,1},
603
            {4,0,2,6}
640
            {4,0,2,6},
641

  
642
            {8,9,10,11,12,13,14,15,16,17,18,19}
604 643
        };
605 644

  
606 645
    return new ObjectShape(vertices,indices);
......
758 797
      {
759 798
      float h1 = isInIconMode() ? 0.001f : 0.04f;
760 799
      float h2 = 0.001f;
761
      float[][] bands   = { {h1,45,0.3f,0.7f,5,0,0}, {h2,5,0.3f,0.2f,2,0,0} };
800
      float[][] bands   = { {h1,45,0.3f,0.7f,5,0,0}, {h2,5,0.3f,0.2f,5,0,0}, {h2,5,0.3f,0.2f,2,0,0} };
762 801
      final int NUM_BANDS = 6+3*NUMBER_CORNER_SEGMENTS;
763 802
      int[] bandIndices = new int[NUM_BANDS];
764 803
      bandIndices[0] = bandIndices[1] = bandIndices[2] = 0;
765
      for(int i=3; i<NUM_BANDS; i++) bandIndices[i] = 1;
804
      bandIndices[3] = bandIndices[4] = bandIndices[5] = 1;
805
      for(int i=6; i<NUM_BANDS; i++) bandIndices[i] = 2;
766 806
      float[][] corners = { {0.02f,0.09f} };
767 807
      float[][] centers = { { 0.0f, 0.0f, 0.0f } };
768 808
      final int SINGLE_ARC = NUMBER_CORNER_SEGMENTS+1;
......
794 834
      {
795 835
      float h1 = isInIconMode() ? 0.001f : 0.05f;
796 836
      float[][] bands   = { {h1,45,0.2f,0.4f,5,0,0}, {0.001f,1,0.3f,0.5f,2,0,0} };
797
      int[] bandIndices = new int[] {0,1,1,1,1,1};
837
      int[] bandIndices = new int[] {0,1,1,1,1,1,1};
798 838
      float[][] corners = { {0.02f,0.09f} };
799 839
      float[][] centers = { { 0.0f, 0.0f, 1.0f } };
800
      int[] indices = new int[] {0,0,0,0,-1,-1,-1,-1};
840
      int[] indices = new int[] {0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
801 841
      return new ObjectFaceShape(bands,bandIndices,corners,indices,centers,indices,null);
802 842
      }
803 843
    if( variant==3 )
src/main/java/org/distorted/objectlib/touchcontrol/TouchControlShapeChanging.java
476 476
    float closestSoFar = NOT_TOUCHED;
477 477
    mTouchedCubit = -1;
478 478
    mTouchedFace  = -1;
479
    int numQuats = mQuats.length;
479 480

  
480 481
    for(int cubit=0; cubit<mNumCubits; cubit++)
481 482
      {
482 483
      int quatIndex = mObject.getCubitQuatIndex(cubit);
483
      float[] quat = mQuats[quatIndex];
484 484

  
485
      for(int face=0; face<mNumFaces[cubit]; face++)
485
      if( quatIndex<numQuats )
486 486
        {
487
        float dist = cubitFaceTouched(mInfos[cubit][face],quat,closestSoFar);
487
        float[] quat = mQuats[quatIndex];
488 488

  
489
        if( dist!=NOT_TOUCHED )
489
        for(int face=0; face<mNumFaces[cubit]; face++)
490 490
          {
491
          mTouchedCubit= cubit;
492
          mTouchedFace = face;
493
          closestSoFar = dist;
491
          float dist = cubitFaceTouched(mInfos[cubit][face],quat,closestSoFar);
492

  
493
          if( dist!=NOT_TOUCHED )
494
            {
495
            mTouchedCubit= cubit;
496
            mTouchedFace = face;
497
            closestSoFar = dist;
498
            }
494 499
          }
495 500
        }
496 501
      }

Also available in: Unified diff