Project

General

Profile

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

magiccube / src / main / java / org / distorted / bandaged / BandagedObjectPyraminx.java @ 6c295be1

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.bandaged;
11

    
12
import static org.distorted.objectlib.main.TwistyObject.SQ2;
13
import static org.distorted.objectlib.main.TwistyObject.SQ3;
14
import static org.distorted.objectlib.main.TwistyObject.SQ6;
15

    
16
import org.distorted.library.main.DistortedScreen;
17
import org.distorted.library.mesh.MeshBase;
18
import org.distorted.library.type.Static3D;
19
import org.distorted.objectlib.helpers.FactoryBandagedPyraminx;
20
import org.distorted.objectlib.main.InitData;
21
import org.distorted.objectlib.main.TwistyObject;
22
import org.distorted.objectlib.objects.TwistyBandagedPyraminx;
23
import org.distorted.objectlib.shape.ShapeTetrahedron;
24
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
25

    
26
///////////////////////////////////////////////////////////////////////////////////////////////////
27

    
28
public class BandagedObjectPyraminx extends BandagedObject
29
{
30
   BandagedObjectPyraminx(DistortedScreen screen)
31
     {
32
     super(screen);
33
     }
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

    
37
  private boolean isFaceInverted(int face)
38
    {
39
    return face>1;
40
    }
41

    
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43

    
44
  private void addTetrahedralLattice(int size, float[][] pos)
45
    {
46
    final float DX = 1.0f;
47
    final float DY = SQ2/2;
48
    final float DZ = 1.0f;
49

    
50
    float startX = 0.0f;
51
    float startY =-DY*(size-1)/2;
52
    float startZ = DZ*(size-1)/2;
53

    
54
    int index = 0;
55

    
56
    for(int layer=0; layer<size; layer++)
57
      {
58
      float currX = startX;
59
      float currY = startY;
60

    
61
      for(int x=0; x<layer+1; x++)
62
        {
63
        float currZ = startZ;
64

    
65
        for(int z=0; z<size-layer; z++)
66
          {
67
          pos[index] = new float[] {currX,currY,currZ};
68
          index++;
69
          currZ -= DZ;
70
          }
71

    
72
        currX += DX;
73
        }
74

    
75
      startX-=DX/2;
76
      startY+=DY;
77
      startZ-=DZ/2;
78
      }
79
    }
80

    
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82

    
83
   float[] getDist3D()
84
     {
85
     float d = mSize[0]*SQ6/12;
86
     return new float[] {d,d,d,d};
87
     }
88

    
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90

    
91
   float getDist2D()
92
     {
93
     return SQ3/6;
94
     }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
   int[] getColors()
99
     {
100
     return ShapeTetrahedron.FACE_COLORS;
101
     }
102

    
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

    
105
  Static3D[] getFaceAxis()
106
    {
107
    return TouchControlTetrahedron.FACE_AXIS;
108
    }
109

    
110
///////////////////////////////////////////////////////////////////////////////////////////////////
111

    
112
  boolean tryChangeObject(int x, int y, int z)
113
     {
114
     if( mSize[0]!=x )
115
       {
116
       mSize[0] = x;
117
       mMax = mSize[0];
118
       int numOcta = (x-1)*x*(x+1)/6;
119
       int numTetra= x*(x+1)*(x+2)/6;
120
       mNumCubits = numOcta + numTetra;
121
       return true;
122
       }
123

    
124
     return false;
125
     }
126

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

    
129
  int computeProjectionAngle()
130
     {
131
     return 120;
132
     }
133

    
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135

    
136
  boolean isAdjacent(float dx, float dy, float dz)
137
    {
138
    return dx*dx + dy*dy + dz*dz < (SQ3/4)*1.01f;
139
    }
140

    
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142
// TODO
143

    
144
  void getTouchedPosition(float[] output, int face, float pointX, float pointY)
145
    {
146

    
147
    }
148

    
149
///////////////////////////////////////////////////////////////////////////////////////////////////
150

    
151
  float[][][] getPositions()
152
    {
153
    int num = mSize[0];
154
    int numO= (num-1)*num*(num+1)/6;
155
    int numT= (num+1)*num*(num+2)/6;
156

    
157
    float[][] retO = new float[numO][];
158
    float[][] retT = new float[numT][];
159

    
160
    addTetrahedralLattice(num-1,retO);
161
    addTetrahedralLattice(num  ,retT);
162

    
163
    return new float[][][] { retO,retT };
164
    }
165

    
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167

    
168
  boolean isInsideFace(int face, float[] p)
169
    {
170
    float y = (isFaceInverted(face) ? p[1] : -p[1]);
171
    float x = p[0];
172
    return (y >= -mDist2D) && (y <= mDist2D*(2-6*x)) && (y <= mDist2D*(2+6*x));
173
    }
174

    
175
///////////////////////////////////////////////////////////////////////////////////////////////////
176

    
177
  MeshBase createMesh(int variant, float[] pos, boolean round)
178
     {
179
     FactoryBandagedPyraminx factory = FactoryBandagedPyraminx.getInstance();
180
     return factory.createMesh(variant,pos,mSize[0],false,round);
181
     }
182

    
183
///////////////////////////////////////////////////////////////////////////////////////////////////
184

    
185
  TwistyObject createObject(int mode, float size)
186
     {
187
     float[][] pos = getCubitPositions();
188
     InitData data = new InitData( mSize,pos);
189
     return new TwistyBandagedPyraminx( TwistyObject.MESH_NICE, mode, ShapeTetrahedron.DEFAULT_ROT, new Static3D(0,0,0), size, data, null );
190
     }
191
}
(11-11/16)