1 |
a7c10d03
|
Leszek Koltunski
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
2 |
|
|
// Copyright 2020 Leszek Koltunski //
|
3 |
|
|
// //
|
4 |
|
|
// This file is part of Magic Cube. //
|
5 |
|
|
// //
|
6 |
a7a40b3c
|
Leszek Koltunski
|
// 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 |
a7c10d03
|
Leszek Koltunski
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
9 |
|
|
|
10 |
|
|
package org.distorted.objectlib.helpers;
|
11 |
|
|
|
12 |
786098dd
|
Leszek Koltunski
|
import org.distorted.library.type.Static3D;
|
13 |
|
|
import org.distorted.objectlib.touchcontrol.TouchControlHexahedron;
|
14 |
|
|
|
15 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
16 |
|
|
|
17 |
4a9f01f9
|
leszek
|
public class FactoryBandagedCuboid extends FactoryBandaged
|
18 |
a7c10d03
|
Leszek Koltunski
|
{
|
19 |
c18507d9
|
Leszek Koltunski
|
private static FactoryBandagedCuboid mThis;
|
20 |
4a9f01f9
|
leszek
|
|
21 |
a7c10d03
|
Leszek Koltunski
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
22 |
|
|
|
23 |
c18507d9
|
Leszek Koltunski
|
private FactoryBandagedCuboid()
|
24 |
a7c10d03
|
Leszek Koltunski
|
{
|
25 |
b1f0d55d
|
Leszek Koltunski
|
|
26 |
a7c10d03
|
Leszek Koltunski
|
}
|
27 |
|
|
|
28 |
c65d5889
|
Leszek Koltunski
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
29 |
|
|
|
30 |
c7c72305
|
leszek
|
public float[] elementVertices(int ax, boolean left, int element)
|
31 |
c65d5889
|
Leszek Koltunski
|
{
|
32 |
c7c72305
|
leszek
|
float[] pos = mElements[element].getPos();
|
33 |
|
|
float[] ret = new float[12];
|
34 |
c65d5889
|
Leszek Koltunski
|
|
35 |
c7c72305
|
leszek
|
switch(ax)
|
36 |
c65d5889
|
Leszek Koltunski
|
{
|
37 |
c7c72305
|
leszek
|
case 0: if( left )
|
38 |
|
|
{
|
39 |
|
|
ret[ 0] = pos[0]-0.5f;
|
40 |
|
|
ret[ 1] = pos[1]+0.5f;
|
41 |
|
|
ret[ 2] = pos[2]-0.5f;
|
42 |
|
|
ret[ 3] = pos[0]-0.5f;
|
43 |
|
|
ret[ 4] = pos[1]-0.5f;
|
44 |
|
|
ret[ 5] = pos[2]-0.5f;
|
45 |
|
|
ret[ 6] = pos[0]-0.5f;
|
46 |
|
|
ret[ 7] = pos[1]-0.5f;
|
47 |
|
|
ret[ 8] = pos[2]+0.5f;
|
48 |
|
|
ret[ 9] = pos[0]-0.5f;
|
49 |
|
|
ret[10] = pos[1]+0.5f;
|
50 |
|
|
ret[11] = pos[2]+0.5f;
|
51 |
|
|
}
|
52 |
|
|
else
|
53 |
|
|
{
|
54 |
|
|
ret[ 0] = pos[0]+0.5f;
|
55 |
|
|
ret[ 1] = pos[1]+0.5f;
|
56 |
|
|
ret[ 2] = pos[2]+0.5f;
|
57 |
|
|
ret[ 3] = pos[0]+0.5f;
|
58 |
|
|
ret[ 4] = pos[1]-0.5f;
|
59 |
|
|
ret[ 5] = pos[2]+0.5f;
|
60 |
|
|
ret[ 6] = pos[0]+0.5f;
|
61 |
|
|
ret[ 7] = pos[1]-0.5f;
|
62 |
|
|
ret[ 8] = pos[2]-0.5f;
|
63 |
|
|
ret[ 9] = pos[0]+0.5f;
|
64 |
|
|
ret[10] = pos[1]+0.5f;
|
65 |
|
|
ret[11] = pos[2]-0.5f;
|
66 |
|
|
}
|
67 |
|
|
break;
|
68 |
|
|
case 1: if( left )
|
69 |
|
|
{
|
70 |
|
|
ret[ 0] = pos[0]-0.5f;
|
71 |
|
|
ret[ 1] = pos[1]-0.5f;
|
72 |
|
|
ret[ 2] = pos[2]+0.5f;
|
73 |
|
|
ret[ 3] = pos[0]-0.5f;
|
74 |
|
|
ret[ 4] = pos[1]-0.5f;
|
75 |
|
|
ret[ 5] = pos[2]-0.5f;
|
76 |
|
|
ret[ 6] = pos[0]+0.5f;
|
77 |
|
|
ret[ 7] = pos[1]-0.5f;
|
78 |
|
|
ret[ 8] = pos[2]-0.5f;
|
79 |
|
|
ret[ 9] = pos[0]+0.5f;
|
80 |
|
|
ret[10] = pos[1]-0.5f;
|
81 |
|
|
ret[11] = pos[2]+0.5f;
|
82 |
|
|
}
|
83 |
|
|
else
|
84 |
|
|
{
|
85 |
|
|
ret[ 0] = pos[0]-0.5f;
|
86 |
|
|
ret[ 1] = pos[1]+0.5f;
|
87 |
|
|
ret[ 2] = pos[2]-0.5f;
|
88 |
|
|
ret[ 3] = pos[0]-0.5f;
|
89 |
|
|
ret[ 4] = pos[1]+0.5f;
|
90 |
|
|
ret[ 5] = pos[2]+0.5f;
|
91 |
|
|
ret[ 6] = pos[0]+0.5f;
|
92 |
|
|
ret[ 7] = pos[1]+0.5f;
|
93 |
|
|
ret[ 8] = pos[2]+0.5f;
|
94 |
|
|
ret[ 9] = pos[0]+0.5f;
|
95 |
|
|
ret[10] = pos[1]+0.5f;
|
96 |
|
|
ret[11] = pos[2]-0.5f;
|
97 |
|
|
}
|
98 |
|
|
break;
|
99 |
|
|
case 2: if( left )
|
100 |
|
|
{
|
101 |
|
|
ret[ 0] = pos[0]+0.5f;
|
102 |
|
|
ret[ 1] = pos[1]+0.5f;
|
103 |
|
|
ret[ 2] = pos[2]-0.5f;
|
104 |
|
|
ret[ 3] = pos[0]+0.5f;
|
105 |
|
|
ret[ 4] = pos[1]-0.5f;
|
106 |
|
|
ret[ 5] = pos[2]-0.5f;
|
107 |
|
|
ret[ 6] = pos[0]-0.5f;
|
108 |
|
|
ret[ 7] = pos[1]-0.5f;
|
109 |
|
|
ret[ 8] = pos[2]-0.5f;
|
110 |
|
|
ret[ 9] = pos[0]-0.5f;
|
111 |
|
|
ret[10] = pos[1]+0.5f;
|
112 |
|
|
ret[11] = pos[2]-0.5f;
|
113 |
|
|
}
|
114 |
|
|
else
|
115 |
|
|
{
|
116 |
|
|
ret[ 0] = pos[0]-0.5f;
|
117 |
|
|
ret[ 1] = pos[1]+0.5f;
|
118 |
|
|
ret[ 2] = pos[2]+0.5f;
|
119 |
|
|
ret[ 3] = pos[0]-0.5f;
|
120 |
|
|
ret[ 4] = pos[1]-0.5f;
|
121 |
|
|
ret[ 5] = pos[2]+0.5f;
|
122 |
|
|
ret[ 6] = pos[0]+0.5f;
|
123 |
|
|
ret[ 7] = pos[1]-0.5f;
|
124 |
|
|
ret[ 8] = pos[2]+0.5f;
|
125 |
|
|
ret[ 9] = pos[0]+0.5f;
|
126 |
|
|
ret[10] = pos[1]+0.5f;
|
127 |
|
|
ret[11] = pos[2]+0.5f;
|
128 |
|
|
}
|
129 |
|
|
break;
|
130 |
c65d5889
|
Leszek Koltunski
|
}
|
131 |
a7c10d03
|
Leszek Koltunski
|
|
132 |
c7c72305
|
leszek
|
return ret;
|
133 |
a7c10d03
|
Leszek Koltunski
|
}
|
134 |
|
|
|
135 |
786098dd
|
Leszek Koltunski
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
136 |
b1f0d55d
|
Leszek Koltunski
|
// (vertices,indices) define a cubit face, i.e. a connected subset of the NxN grid.
|
137 |
786098dd
|
Leszek Koltunski
|
// Return its 'diameter', i.e. max(width,height)
|
138 |
|
|
|
139 |
4a9f01f9
|
leszek
|
public float faceDiameter(float[][] vertices, int[][] indices)
|
140 |
786098dd
|
Leszek Koltunski
|
{
|
141 |
4a9f01f9
|
leszek
|
float maxX = -Float.MAX_VALUE;
|
142 |
|
|
float minX = Float.MAX_VALUE;
|
143 |
|
|
float maxY = -Float.MAX_VALUE;
|
144 |
|
|
float minY = Float.MAX_VALUE;
|
145 |
|
|
float maxZ = -Float.MAX_VALUE;
|
146 |
|
|
float minZ = Float.MAX_VALUE;
|
147 |
786098dd
|
Leszek Koltunski
|
|
148 |
b76da174
|
leszek
|
for (int[] ind : indices)
|
149 |
|
|
for(int index : ind)
|
150 |
|
|
{
|
151 |
|
|
float[] v = vertices[index];
|
152 |
|
|
|
153 |
|
|
if (v[0] > maxX) maxX = v[0];
|
154 |
|
|
if (v[0] < minX) minX = v[0];
|
155 |
|
|
if (v[1] > maxY) maxY = v[1];
|
156 |
|
|
if (v[1] < minY) minY = v[1];
|
157 |
|
|
if (v[2] > maxZ) maxZ = v[2];
|
158 |
|
|
if (v[2] < minZ) minZ = v[2];
|
159 |
|
|
}
|
160 |
786098dd
|
Leszek Koltunski
|
|
161 |
|
|
float diffX = maxX-minX;
|
162 |
|
|
float diffY = maxY-minY;
|
163 |
|
|
float diffZ = maxZ-minZ;
|
164 |
|
|
|
165 |
4a9f01f9
|
leszek
|
return diffX>diffY ? Math.max(diffX,diffZ) : Math.max(diffY,diffZ);
|
166 |
5987822f
|
Leszek Koltunski
|
}
|
167 |
|
|
|
168 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
169 |
4a9f01f9
|
leszek
|
// PUBLIC API
|
170 |
5987822f
|
Leszek Koltunski
|
|
171 |
4a9f01f9
|
leszek
|
public static FactoryBandagedCuboid getInstance()
|
172 |
5987822f
|
Leszek Koltunski
|
{
|
173 |
4a9f01f9
|
leszek
|
if( mThis==null ) mThis = new FactoryBandagedCuboid();
|
174 |
|
|
return mThis;
|
175 |
5987822f
|
Leszek Koltunski
|
}
|
176 |
|
|
|
177 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
178 |
|
|
|
179 |
4a9f01f9
|
leszek
|
public float[][] getCuts(int[] numLayers)
|
180 |
a7c10d03
|
Leszek Koltunski
|
{
|
181 |
36d67a7e
|
leszek
|
int numAxis = numLayers.length;
|
182 |
|
|
float[][] cuts = new float[numAxis][];
|
183 |
5987822f
|
Leszek Koltunski
|
|
184 |
36d67a7e
|
leszek
|
for(int axis=0; axis<numAxis; axis++)
|
185 |
5987822f
|
Leszek Koltunski
|
{
|
186 |
36d67a7e
|
leszek
|
int len = numLayers[axis];
|
187 |
4a9f01f9
|
leszek
|
float start = 1-len*0.5f;
|
188 |
b76da174
|
leszek
|
|
189 |
4a9f01f9
|
leszek
|
if( len>=2 )
|
190 |
b76da174
|
leszek
|
{
|
191 |
4a9f01f9
|
leszek
|
cuts[axis] = new float[len-1];
|
192 |
|
|
for(int i=0; i<len-1; i++) cuts[axis][i] = start+i;
|
193 |
b76da174
|
leszek
|
}
|
194 |
|
|
}
|
195 |
|
|
|
196 |
4a9f01f9
|
leszek
|
return cuts;
|
197 |
b76da174
|
leszek
|
}
|
198 |
|
|
|
199 |
5987822f
|
Leszek Koltunski
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
200 |
|
|
|
201 |
4a9f01f9
|
leszek
|
public Static3D[] getNormals()
|
202 |
5987822f
|
Leszek Koltunski
|
{
|
203 |
4a9f01f9
|
leszek
|
return TouchControlHexahedron.FACE_AXIS;
|
204 |
a7c10d03
|
Leszek Koltunski
|
}
|
205 |
|
|
|
206 |
36d67a7e
|
leszek
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
207 |
|
|
|
208 |
|
|
public float[][] getRotAxis()
|
209 |
|
|
{
|
210 |
|
|
return new float[][] { {1,0,0},{0,1,0},{0,0,1} };
|
211 |
|
|
}
|
212 |
|
|
|
213 |
262d3b6a
|
leszek
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
214 |
|
|
|
215 |
4a9f01f9
|
leszek
|
public float[] getDist3D()
|
216 |
262d3b6a
|
leszek
|
{
|
217 |
4a9f01f9
|
leszek
|
float dx = mNumLayers[0]/2.0f;
|
218 |
|
|
float dy = mNumLayers[1]/2.0f;
|
219 |
|
|
float dz = mNumLayers[2]/2.0f;
|
220 |
262d3b6a
|
leszek
|
|
221 |
4a9f01f9
|
leszek
|
return new float[] {dx,dx,dy,dy,dz,dz};
|
222 |
262d3b6a
|
leszek
|
}
|
223 |
|
|
|
224 |
a7c10d03
|
Leszek Koltunski
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
225 |
|
|
|
226 |
4a9f01f9
|
leszek
|
public float[][] getBands(boolean iconMode)
|
227 |
a7c10d03
|
Leszek Koltunski
|
{
|
228 |
84a17011
|
Leszek Koltunski
|
float height= iconMode ? 0.001f : 0.048f;
|
229 |
4cdeca60
|
leszek
|
int[] angle = {60,50,40,32,28,23};
|
230 |
49cfdaa6
|
leszek
|
float R = 0.3f;
|
231 |
84a17011
|
Leszek Koltunski
|
float S = 0.5f;
|
232 |
|
|
int extraI = 0;
|
233 |
|
|
int extraV = 0;
|
234 |
a7c10d03
|
Leszek Koltunski
|
|
235 |
4a9f01f9
|
leszek
|
int sum = mNumLayers[0]+mNumLayers[1]+mNumLayers[2];
|
236 |
3821ebef
|
leszek
|
int numVertA= sum>=19 ? 3 : (sum>=16 ? 4:5);
|
237 |
5655d3a9
|
leszek
|
int numVertI= sum>=13 ? 2 : 3;
|
238 |
3821ebef
|
leszek
|
|
239 |
4a9f01f9
|
leszek
|
return new float[][] { { 0.001f,angle[0],R,S,numVertI,extraV,extraI},
|
240 |
|
|
{height ,angle[1],R,S,numVertA,extraV,extraI},
|
241 |
|
|
{height/2,angle[2],R,S,numVertA,extraV,extraI},
|
242 |
|
|
{height/3,angle[3],R,S,numVertA,extraV,extraI},
|
243 |
|
|
{height/4,angle[4],R,S,numVertA,extraV,extraI},
|
244 |
|
|
{height/5,angle[5],R,S,numVertA,extraV,extraI} };
|
245 |
a7c10d03
|
Leszek Koltunski
|
}
|
246 |
|
|
}
|