Revision 596d62a4
Added by Leszek Koltunski over 3 years ago
src/main/java/org/distorted/helpers/FactoryCubit.java | ||
---|---|---|
298 | 298 |
return new MeshJoined(meshes); |
299 | 299 |
} |
300 | 300 |
|
301 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
302 |
|
|
303 |
MeshBase createFacesDino() |
|
304 |
{ |
|
305 |
MeshBase[] meshes = new MeshPolygon[4]; |
|
306 |
|
|
307 |
float E = 0.5f*SQ2; |
|
308 |
float F = 0.5f; |
|
309 |
float[] vertices0 = { -F,F/3, 0,-2*F/3, +F,F/3 }; |
|
310 |
float[] bands0 = computeBands(0.028f,30,F/3,0.8f,7); |
|
311 |
|
|
312 |
meshes[0] = new MeshPolygon(vertices0, bands0, 2, 5); |
|
313 |
meshes[0].setEffectAssociation(0,1,0); |
|
314 |
meshes[1] = meshes[0].copy(true); |
|
315 |
meshes[1].setEffectAssociation(0,2,0); |
|
316 |
|
|
317 |
float[] vertices1 = { -E/2,-E*(SQ3/6), E/2,-E*(SQ3/6), 0,E*(SQ3/3) }; |
|
318 |
float[] bands1 = computeBands(0.02f,45,F/3,0.2f,3); |
|
319 |
|
|
320 |
meshes[2] = new MeshPolygon(vertices1, bands1, 1, 2); |
|
321 |
meshes[2].setEffectAssociation(0,4,0); |
|
322 |
meshes[3] = meshes[2].copy(true); |
|
323 |
meshes[3].setEffectAssociation(0,8,0); |
|
324 |
|
|
325 |
return new MeshJoined(meshes); |
|
326 |
} |
|
327 |
|
|
328 | 301 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
329 | 302 |
|
330 | 303 |
MeshBase createFacesHelicopterCorner() |
... | ... | |
918 | 891 |
return effect; |
919 | 892 |
} |
920 | 893 |
|
921 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
922 |
|
|
923 |
VertexEffect[] createVertexEffectsDino() |
|
924 |
{ |
|
925 |
float E = 0.5f*SQ2; |
|
926 |
float F = 0.5f; |
|
927 |
final float ANGLE = (float)((180/Math.PI)*(Math.atan(SQ2))); |
|
928 |
|
|
929 |
Static1D angle1 = new Static1D(-ANGLE); |
|
930 |
Static1D angle2 = new Static1D(+ANGLE); |
|
931 |
Static3D axisX = new Static3D(1,0,0); |
|
932 |
Static3D axisY = new Static3D(0,1,0); |
|
933 |
Static3D axisZ = new Static3D(0,-1,1); |
|
934 |
Static3D center0= new Static3D(0,0,0); |
|
935 |
Static3D center1= new Static3D(0,-3*F,0); |
|
936 |
|
|
937 |
VertexEffect[] effect = new VertexEffect[10]; |
|
938 |
|
|
939 |
effect[0] = new VertexEffectScale ( new Static3D(3,3,3) ); |
|
940 |
effect[1] = new VertexEffectMove ( new Static3D(0,-F,0) ); |
|
941 |
effect[2] = new VertexEffectRotate( new Static1D(90), axisX, center0 ); |
|
942 |
effect[3] = new VertexEffectScale ( new Static3D(1,-1,1) ); |
|
943 |
effect[4] = new VertexEffectMove ( new Static3D(3*E/2,E*(SQ3/2)-3*F,0) ); |
|
944 |
effect[5] = new VertexEffectRotate( new Static1D(+90), axisY, center1 ); |
|
945 |
effect[6] = new VertexEffectScale ( new Static3D(-1,1,1) ); |
|
946 |
effect[7] = new VertexEffectRotate( new Static1D( 45), axisX, center1 ); |
|
947 |
effect[8] = new VertexEffectRotate( angle1 , axisZ, center1 ); |
|
948 |
effect[9] = new VertexEffectRotate( angle2 , axisZ, center1 ); |
|
949 |
|
|
950 |
effect[0].setMeshAssociation(15,-1); // apply to meshes 0,1,2,3 |
|
951 |
effect[1].setMeshAssociation( 3,-1); // apply to meshes 0,1 |
|
952 |
effect[2].setMeshAssociation( 2,-1); // apply to mesh 1 |
|
953 |
effect[3].setMeshAssociation( 2,-1); // apply to mesh 1 |
|
954 |
effect[4].setMeshAssociation(12,-1); // apply to meshes 2,3 |
|
955 |
effect[5].setMeshAssociation(12,-1); // apply to meshes 2,3 |
|
956 |
effect[6].setMeshAssociation( 8,-1); // apply to mesh 3 |
|
957 |
effect[7].setMeshAssociation(12,-1); // apply to meshes 2,3 |
|
958 |
effect[8].setMeshAssociation( 4,-1); // apply to mesh 2 |
|
959 |
effect[9].setMeshAssociation( 8,-1); // apply to mesh 3 |
|
960 |
|
|
961 |
return effect; |
|
962 |
} |
|
963 |
|
|
964 | 894 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
965 | 895 |
|
966 | 896 |
VertexEffect[] createVertexEffectsHelicopterCorner() |
... | ... | |
1588 | 1518 |
return mesh; |
1589 | 1519 |
} |
1590 | 1520 |
|
1591 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
1592 |
// DINO |
|
1593 |
|
|
1594 |
public MeshBase createDinoMesh() |
|
1595 |
{ |
|
1596 |
MeshBase mesh = createFacesDino(); |
|
1597 |
VertexEffect[] effects = createVertexEffectsDino(); |
|
1598 |
for( VertexEffect effect : effects ) mesh.apply(effect); |
|
1599 |
|
|
1600 |
float F = 0.5f; |
|
1601 |
Static3D roundingCenter = new Static3D(0.0f, -1.5f*F, -1.5f*F); |
|
1602 |
Static3D[] verticesRound = new Static3D[4]; |
|
1603 |
verticesRound[0] = new Static3D( 0,-3*F, 0 ); |
|
1604 |
verticesRound[1] = new Static3D( 0, 0, -3*F ); |
|
1605 |
verticesRound[2] = new Static3D( -3*F, 0, 0 ); |
|
1606 |
verticesRound[3] = new Static3D( +3*F, 0, 0 ); |
|
1607 |
roundCorners(mesh,roundingCenter,verticesRound,0.10f,0.40f); |
|
1608 |
|
|
1609 |
mesh.mergeEffComponents(); |
|
1610 |
|
|
1611 |
return mesh; |
|
1612 |
} |
|
1613 |
|
|
1614 | 1521 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
1615 | 1522 |
// Helicopter |
1616 | 1523 |
|
src/main/java/org/distorted/objects/TwistyDino.java | ||
---|---|---|
88 | 88 |
{-1.5f, 0.0f,-1.5f } |
89 | 89 |
}; |
90 | 90 |
|
91 |
private final double[][] VERTICES = new double[][] |
|
91 |
private static final double[][] VERTICES = new double[][]
|
|
92 | 92 |
{ |
93 |
{-0.5, 0.0, 0.0},
|
|
94 |
{ 0.5, 0.0, 0.0},
|
|
95 |
{ 0.0,-0.5, 0.0},
|
|
96 |
{ 0.0, 0.0,-0.5}
|
|
93 |
{-1.5, 0.0, 0.0},
|
|
94 |
{ 1.5, 0.0, 0.0},
|
|
95 |
{ 0.0,-1.5, 0.0},
|
|
96 |
{ 0.0, 0.0,-1.5}
|
|
97 | 97 |
}; |
98 | 98 |
|
99 |
private final int[][] VERT_INDEXES = new int[][] |
|
99 |
private static final int[][] VERT_INDEXES = new int[][]
|
|
100 | 100 |
{ |
101 | 101 |
{2,1,0}, // counterclockwise! |
102 |
{3,0,1}, |
|
102 | 103 |
{2,3,1}, |
103 | 104 |
{3,2,0}, |
104 |
{3,0,1} |
|
105 | 105 |
}; |
106 | 106 |
|
107 |
private static MeshBase mMesh; |
|
107 |
private static final float[][] STICKERS = new float[][] |
|
108 |
{ |
|
109 |
{ 0.0f, -1.0f/3, 0.5f, 1.0f/6, -0.5f, 1.0f/6 } |
|
110 |
}; |
|
111 |
|
|
112 |
private static MeshBase[] mMeshes; |
|
108 | 113 |
|
109 | 114 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
110 | 115 |
|
... | ... | |
207 | 212 |
|
208 | 213 |
int getNumStickerTypes(int numLayers) |
209 | 214 |
{ |
210 |
return 1;
|
|
215 |
return STICKERS.length;
|
|
211 | 216 |
} |
212 | 217 |
|
213 | 218 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
228 | 233 |
|
229 | 234 |
MeshBase createCubitMesh(int cubit, int numLayers) |
230 | 235 |
{ |
231 |
if( mMesh==null ) mMesh = FactoryCubit.getInstance().createDinoMesh(); |
|
236 |
if( mMeshes==null ) |
|
237 |
{ |
|
238 |
FactoryCubit factory = FactoryCubit.getInstance(); |
|
239 |
factory.clear(); |
|
240 |
mMeshes = new MeshBase[1]; |
|
241 |
} |
|
242 |
|
|
243 |
if( mMeshes[0]==null ) |
|
244 |
{ |
|
245 |
float[][] bands= new float[][] |
|
246 |
{ |
|
247 |
{0.035f,30,0.16f,0.8f,7,2,5}, |
|
248 |
{0.020f,45,0.16f,0.2f,3,1,2} |
|
249 |
}; |
|
250 |
int[] bandIndexes = new int[] { 0,0,1,1 }; |
|
251 |
float[][] corners = new float[][] { {0.07f,0.40f}, {0.05f,0.30f} }; |
|
252 |
int[] cornerIndexes = new int[] { 0,0,1,1 }; |
|
253 |
|
|
254 |
FactoryCubit factory = FactoryCubit.getInstance(); |
|
255 |
|
|
256 |
factory.createNewFaceTransform(VERTICES,VERT_INDEXES); |
|
257 |
mMeshes[0] = factory.createRoundedSolid(VERTICES, VERT_INDEXES, |
|
258 |
bands, bandIndexes, |
|
259 |
corners, cornerIndexes, |
|
260 |
getNumCubitFaces() ); |
|
261 |
} |
|
232 | 262 |
|
233 |
MeshBase mesh = mMesh.copy(true); |
|
263 |
MeshBase mesh = mMeshes[0].copy(true);
|
|
234 | 264 |
MatrixEffectQuaternion quat = new MatrixEffectQuaternion( QUATS[cubit], new Static3D(0,0,0) ); |
235 | 265 |
mesh.apply(quat,0xffffffff,0); |
236 | 266 |
|
... | ... | |
241 | 271 |
|
242 | 272 |
void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top) |
243 | 273 |
{ |
244 |
float F = 0.5f; |
|
245 | 274 |
float R = 0.025f; |
246 | 275 |
float S = 0.05f; |
247 |
float[] vertices = { -F,F/3, 0,-2*F/3, +F,F/3 }; |
|
248 | 276 |
|
249 | 277 |
FactorySticker factory = FactorySticker.getInstance(); |
250 |
factory.drawRoundedPolygon(canvas, paint, left, top, vertices, S, FACE_COLORS[face], R);
|
|
278 |
factory.drawRoundedPolygon(canvas, paint, left, top, STICKERS[0], S, FACE_COLORS[face], R);
|
|
251 | 279 |
} |
252 | 280 |
|
253 | 281 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/TwistySkewb.java | ||
---|---|---|
25 | 25 |
|
26 | 26 |
import org.distorted.helpers.FactoryCubit; |
27 | 27 |
import org.distorted.helpers.FactorySticker; |
28 |
import org.distorted.library.effect.MatrixEffect; |
|
29 | 28 |
import org.distorted.library.effect.MatrixEffectQuaternion; |
30 |
import org.distorted.library.effect.MatrixEffectScale; |
|
31 | 29 |
import org.distorted.library.main.DistortedEffects; |
32 | 30 |
import org.distorted.library.main.DistortedTexture; |
33 | 31 |
import org.distorted.library.mesh.MeshBase; |
... | ... | |
117 | 115 |
{ 17, 18,18,18,18,18 }, |
118 | 116 |
}; |
119 | 117 |
|
120 |
private static MeshBase mCornerMesh, mFaceMesh, mEdgeMesh; |
|
118 |
private static final double[][] VERTICES_CORNER = new double[][] |
|
119 |
{ |
|
120 |
// TODO |
|
121 |
}; |
|
122 |
|
|
123 |
private static final int[][] VERT_INDEXES_CORNER = new int[][] |
|
124 |
{ |
|
125 |
// TODO |
|
126 |
}; |
|
127 |
|
|
128 |
private static final double[][] VERTICES_EDGE = new double[][] |
|
129 |
{ |
|
130 |
{-0.5, 0.0, 0.0}, |
|
131 |
{ 0.5, 0.0, 0.0}, |
|
132 |
{ 0.0,-0.5, 0.0}, |
|
133 |
{ 0.0, 0.0,-0.5} |
|
134 |
}; |
|
135 |
|
|
136 |
private static final int[][] VERT_INDEXES_EDGE = new int[][] |
|
137 |
{ |
|
138 |
{2,1,0}, // counterclockwise! |
|
139 |
{3,0,1}, |
|
140 |
{2,3,1}, |
|
141 |
{3,2,0}, |
|
142 |
}; |
|
143 |
|
|
144 |
private static final double[][] VERTICES_FACE = new double[][] |
|
145 |
{ |
|
146 |
// TODO |
|
147 |
}; |
|
148 |
|
|
149 |
private static final int[][] VERT_INDEXES_FACE = new int[][] |
|
150 |
{ |
|
151 |
// TODO |
|
152 |
}; |
|
153 |
|
|
154 |
private static MeshBase[] mMeshes; |
|
121 | 155 |
|
122 | 156 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
123 | 157 |
|
... | ... | |
128 | 162 |
} |
129 | 163 |
|
130 | 164 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
131 |
// TODO |
|
132 | 165 |
|
133 | 166 |
double[][] getVertices(int cubitType) |
134 | 167 |
{ |
168 |
if( cubitType==0 ) return VERTICES_CORNER; |
|
169 |
if( cubitType==1 ) return VERTICES_EDGE; |
|
170 |
if( cubitType==2 ) return VERTICES_FACE; |
|
135 | 171 |
return null; |
136 | 172 |
} |
137 | 173 |
|
138 | 174 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
139 |
// TODO |
|
140 | 175 |
|
141 | 176 |
int[][] getVertIndexes(int cubitType) |
142 | 177 |
{ |
178 |
if( cubitType==0 ) return VERT_INDEXES_CORNER; |
|
179 |
if( cubitType==1 ) return VERT_INDEXES_EDGE; |
|
180 |
if( cubitType==2 ) return VERT_INDEXES_FACE; |
|
143 | 181 |
return null; |
144 | 182 |
} |
145 | 183 |
|
... | ... | |
425 | 463 |
|
426 | 464 |
MeshBase createCubitMesh(int cubit, int numLayers) |
427 | 465 |
{ |
466 |
if( mMeshes==null ) |
|
467 |
{ |
|
468 |
FactoryCubit factory = FactoryCubit.getInstance(); |
|
469 |
factory.clear(); |
|
470 |
mMeshes = new MeshBase[3]; |
|
471 |
} |
|
472 |
|
|
428 | 473 |
MeshBase mesh; |
429 | 474 |
|
430 | 475 |
int numCorners = getNumCorners(); |
... | ... | |
432 | 477 |
|
433 | 478 |
if( cubit<numCorners ) |
434 | 479 |
{ |
435 |
if( mCornerMesh==null ) mCornerMesh = FactoryCubit.getInstance().createSkewbCornerMesh(); |
|
436 |
mesh = mCornerMesh.copy(true); |
|
480 |
if( mMeshes[0]==null ) |
|
481 |
{ |
|
482 |
mMeshes[0] = FactoryCubit.getInstance().createSkewbCornerMesh(); |
|
483 |
} |
|
484 |
mesh = mMeshes[0].copy(true); |
|
437 | 485 |
} |
438 | 486 |
else if( cubit<numCorners+numEdges ) |
439 | 487 |
{ |
440 |
if( mEdgeMesh==null )
|
|
488 |
if( mMeshes[1]==null )
|
|
441 | 489 |
{ |
442 |
mEdgeMesh = FactoryCubit.getInstance().createDinoMesh(); |
|
443 |
MatrixEffect effect = new MatrixEffectScale(1.0f/3); |
|
444 |
mEdgeMesh.apply(effect,-1,0); |
|
445 |
mEdgeMesh.addEmptyTexComponent(); |
|
446 |
mEdgeMesh.addEmptyTexComponent(); |
|
490 |
float[][] bands= new float[][] |
|
491 |
{ |
|
492 |
{0.035f,30,0.16f,0.8f,7,2,5}, |
|
493 |
{0.020f,45,0.16f,0.2f,3,1,2} |
|
494 |
}; |
|
495 |
int[] bandIndexes = new int[] { 0,0,1,1 }; |
|
496 |
float[][] corners = new float[][] { {0.07f,0.20f}, {0.02f,0.30f} }; |
|
497 |
int[] cornerIndexes = new int[] { 0,0,1,1 }; |
|
498 |
|
|
499 |
FactoryCubit factory = FactoryCubit.getInstance(); |
|
500 |
|
|
501 |
factory.createNewFaceTransform(VERTICES_EDGE,VERT_INDEXES_EDGE); |
|
502 |
mMeshes[1] = factory.createRoundedSolid(VERTICES_EDGE, VERT_INDEXES_EDGE, |
|
503 |
bands, bandIndexes, |
|
504 |
corners, cornerIndexes, |
|
505 |
getNumCubitFaces() ); |
|
447 | 506 |
} |
448 |
mesh = mEdgeMesh.copy(true);
|
|
507 |
mesh = mMeshes[1].copy(true);
|
|
449 | 508 |
} |
450 | 509 |
else |
451 | 510 |
{ |
452 |
if( mFaceMesh==null ) mFaceMesh = FactoryCubit.getInstance().createSkewbFaceMesh(); |
|
453 |
mesh = mFaceMesh.copy(true); |
|
511 |
if( mMeshes[2]==null ) |
|
512 |
{ |
|
513 |
mMeshes[2] = FactoryCubit.getInstance().createSkewbFaceMesh(); |
|
514 |
} |
|
515 |
mesh = mMeshes[2].copy(true); |
|
454 | 516 |
} |
455 | 517 |
|
456 | 518 |
MatrixEffectQuaternion quat = new MatrixEffectQuaternion( getQuat(cubit,numLayers), new Static3D(0,0,0) ); |
Also available in: Unified diff
Convert the Dino and one of the Skewb's cubits to the new engine.