Project

General

Profile

Download (5.76 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / bandaged / BandagedObjectOctahedron.java @ b5db1f7a

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.objectlib.bandaged;
11

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

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

    
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28

    
29
public class BandagedObjectOctahedron extends BandagedObject
30
{
31
  private boolean isFaceInverted(int face)
32
    {
33
    return (face%2)==0;
34
    }
35

    
36
///////////////////////////////////////////////////////////////////////////////////////////////////
37

    
38
  private float[][] getCuts(int[] numLayers)
39
    {
40
    int numL = numLayers[0];
41
    if( numL<2 ) return null;
42
    float[][] ret = new float[4][numL-1];
43
    float cut = (SQ6/6)*(2-numL);
44

    
45
    for(int i=0; i<numL-1; i++)
46
      {
47
      ret[0][i] = cut;
48
      ret[1][i] = cut;
49
      ret[2][i] = cut;
50
      ret[3][i] = cut;
51
      cut += SQ6/3;
52
      }
53

    
54
    return ret;
55
    }
56

    
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58

    
59
  float[][] getRotAxis()
60
    {
61
    return new float[][]
62
      {
63
        { SQ6/3, SQ3/3,     0},
64
        {-SQ6/3, SQ3/3,     0},
65
        {     0,-SQ3/3,-SQ6/3},
66
        {     0,-SQ3/3, SQ6/3}
67
      };
68
    }
69

    
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

    
72
  float getDist2D()
73
    {
74
    return SQ3/6;
75
    }
76

    
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78

    
79
  int[] getColors()
80
    {
81
    return ShapeOctahedron.FACE_COLORS;
82
    }
83

    
84
///////////////////////////////////////////////////////////////////////////////////////////////////
85

    
86
  boolean isAdjacent(float dx, float dy, float dz)
87
    {
88
    return dx*dx + dy*dy + dz*dz < (SQ3/4)*1.01f;
89
    }
90

    
91
///////////////////////////////////////////////////////////////////////////////////////////////////
92

    
93
  float[][][] getPositions()
94
    {
95
    FactoryBandagedOctahedron factory = FactoryBandagedOctahedron.getInstance();
96
    return factory.getPositions(mSize);
97
    }
98

    
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100

    
101
  MeshBase createMesh(float[] pos, boolean round)
102
    {
103
    FactoryBandagedOctahedron factory = FactoryBandagedOctahedron.getInstance();
104
    return factory.createMesh(pos,mSize,false,round);
105
    }
106

    
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108
// PUBLIC API
109

    
110
  public BandagedObjectOctahedron(DistortedScreen screen)
111
    {
112
    super(screen);
113
    }
114

    
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116

    
117
  public float getScreenRatio()
118
    {
119
    return 0.64f;
120
    }
121

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

    
124
  public float[] getDist3D()
125
    {
126
    float d = SQ6/6;
127
    return new float[] {d,d,d,d,d,d,d,d};
128
    }
129

    
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131

    
132
  public Static3D[] getFaceAxis()
133
    {
134
    return TouchControlOctahedron.FACE_AXIS;
135
    }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138

    
139
  public boolean tryChangeObject(int x, int y, int z)
140
    {
141
    if( mSize[0]!=x )
142
      {
143
      mSize[0] = x;
144
      mSize[1] = x;
145
      mSize[2] = x;
146
      mSize[3] = x;
147

    
148
      mMax = x;
149
      int numOcta = FactoryBandagedOctahedron.getNumOctahedrons(x);
150
      int numTetra= FactoryBandagedOctahedron.getNumTetrahedrons(x);
151
      mNumCubits = numOcta + numTetra;
152
      mCuts = getCuts(mSize);
153
      return true;
154
      }
155

    
156
    return false;
157
    }
158

    
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

    
161
  public int computeProjectionAngle()
162
    {
163
    return 40;
164
    }
165

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

    
168
  public 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
  public TwistyObject createObject(int mode, float size)
178
    {
179
    float[][] pos = getCubitPositions();
180
    InitData data = new InitData( mSize,pos);
181
    return new TwistyBandagedDiamond( TwistyObject.MESH_NICE, mode, ShapeTetrahedron.DEFAULT_ROT, new Static3D(0,0,0), size, data, null );
182
    }
183
}
(6-6/13)