Revision 418aa554
Added by Leszek Koltunski over 5 years ago
| src/main/java/org/distorted/objects/RubikDino.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2020 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.objects; | |
| 21 |  | |
| 22 | import android.content.res.Resources; | |
| 23 | import android.graphics.Canvas; | |
| 24 | import android.graphics.Paint; | |
| 25 |  | |
| 26 | import org.distorted.library.main.DistortedEffects; | |
| 27 | import org.distorted.library.main.DistortedTexture; | |
| 28 | import org.distorted.library.mesh.MeshBase; | |
| 29 | import org.distorted.library.mesh.MeshRectangles; | |
| 30 | import org.distorted.library.type.Static3D; | |
| 31 | import org.distorted.library.type.Static4D; | |
| 32 |  | |
| 33 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 34 |  | |
| 35 | public class RubikDino extends RubikObject | |
| 36 | {
 | |
| 37 | static final float SQ3 = (float)Math.sqrt(3); | |
| 38 |  | |
| 39 | // the four rotation axis of a RubikDino. Must be normalized. | |
| 40 | static final Static3D[] AXIS = new Static3D[] | |
| 41 |          {
 | |
| 42 | new Static3D(+SQ3/3,+SQ3/3,+SQ3/3), | |
| 43 | new Static3D(+SQ3/3,+SQ3/3,-SQ3/3), | |
| 44 | new Static3D(+SQ3/3,-SQ3/3,+SQ3/3), | |
| 45 | new Static3D(+SQ3/3,-SQ3/3,-SQ3/3) | |
| 46 | }; | |
| 47 |  | |
| 48 | private static final int[] FACE_COLORS = new int[] | |
| 49 |          {
 | |
| 50 | 0xffffff00, 0xffffffff, // AXIS[0]right (right-YELLOW) AXIS[0]left (left -WHITE) | |
| 51 | 0xff0000ff, 0xff00ff00, // AXIS[1]right (top -BLUE ) AXIS[1]left (bottom-GREEN) | |
| 52 | 0xffff0000, 0xffb5651d // AXIS[2]right (front-RED ) AXIS[2]left (back -BROWN) | |
| 53 | }; | |
| 54 |  | |
| 55 | // All legal rotation quats of a RubikDino | |
| 56 | private static final Static4D[] QUATS = new Static4D[] | |
| 57 |          {
 | |
| 58 | new Static4D( 0.0f, 0.0f, 0.0f, 1.0f ), | |
| 59 | new Static4D( 0.5f, 0.5f, 0.5f, 0.5f ), | |
| 60 | new Static4D( 0.5f, 0.5f, -0.5f, 0.5f ), | |
| 61 | new Static4D( 0.5f, -0.5f, 0.5f, 0.5f ), | |
| 62 | new Static4D( 0.5f, -0.5f, -0.5f, 0.5f ), | |
| 63 | new Static4D( 0.5f, 0.5f, 0.5f, -0.5f ), | |
| 64 | new Static4D( 0.5f, 0.5f, -0.5f, -0.5f ), | |
| 65 | new Static4D( 0.5f, -0.5f, 0.5f, -0.5f ), | |
| 66 | new Static4D( 0.5f, -0.5f, -0.5f, -0.5f ), | |
| 67 | new Static4D( 1.0f, 0.0f, 0.0f, 0.0f ), | |
| 68 | new Static4D( 0.0f, 0.0f, 1.0f, 0.0f ), | |
| 69 | new Static4D( 0.0f, -1.0f, 0.0f, 0.0f ) | |
| 70 | }; | |
| 71 |  | |
| 72 | private static MeshBase[] mMeshes; | |
| 73 |  | |
| 74 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 75 |  | |
| 76 | RubikDino(int size, Static4D quat, DistortedTexture texture, | |
| 77 | MeshRectangles mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth) | |
| 78 |     {
 | |
| 79 | super(size, 60, quat, texture, mesh, effects, moves, RubikObjectList.DINO, res, scrWidth); | |
| 80 | } | |
| 81 |  | |
| 82 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 83 |  | |
| 84 | float getScreenRatio() | |
| 85 |     {
 | |
| 86 | return 0.5f; | |
| 87 | } | |
| 88 |  | |
| 89 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 90 |  | |
| 91 | Static4D[] getQuats() | |
| 92 |     {
 | |
| 93 | return QUATS; | |
| 94 | } | |
| 95 |  | |
| 96 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 97 |  | |
| 98 | int getNumFaces() | |
| 99 |     {
 | |
| 100 | return FACE_COLORS.length; | |
| 101 | } | |
| 102 |  | |
| 103 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 104 |  | |
| 105 | Static3D[] getCubitPositions(int size) | |
| 106 |     {
 | |
| 107 | // TODO | |
| 108 |  | |
| 109 | return null; | |
| 110 | } | |
| 111 |  | |
| 112 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 113 |  | |
| 114 | MeshBase createCubitMesh(int cubit) | |
| 115 |     {
 | |
| 116 | // TODO | |
| 117 |  | |
| 118 | return null; | |
| 119 | } | |
| 120 |  | |
| 121 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 122 |  | |
| 123 | void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top, int side) | |
| 124 |     {
 | |
| 125 | float STROKE = 0.06f*side; | |
| 126 | float OFF = STROKE/2 -1; | |
| 127 | float OFF2 = 0.5f*side + OFF; | |
| 128 | float HEIGHT = side - OFF; | |
| 129 | float RADIUS = side/12.0f; | |
| 130 | float ARC1_H = 0.2f*side; | |
| 131 | float ARC1_W = side*0.5f; | |
| 132 | float ARC2_W = 0.153f*side; | |
| 133 | float ARC2_H = 0.905f*side; | |
| 134 | float ARC3_W = side-ARC2_W; | |
| 135 |  | |
| 136 | paint.setAntiAlias(true); | |
| 137 | paint.setStrokeWidth(STROKE); | |
| 138 | paint.setColor(FACE_COLORS[face]); | |
| 139 | paint.setStyle(Paint.Style.FILL); | |
| 140 |  | |
| 141 | canvas.drawRect(left,top,left+side,top+side,paint); | |
| 142 |  | |
| 143 | paint.setColor(INTERIOR_COLOR); | |
| 144 | paint.setStyle(Paint.Style.STROKE); | |
| 145 |  | |
| 146 | canvas.drawLine( left, HEIGHT, side +left, HEIGHT, paint); | |
| 147 | canvas.drawLine( OFF +left, side , OFF2 +left, 0, paint); | |
| 148 | canvas.drawLine((side-OFF)+left, side , (side-OFF2) +left, 0, paint); | |
| 149 |  | |
| 150 | canvas.drawArc( ARC1_W-RADIUS+left, ARC1_H-RADIUS, ARC1_W+RADIUS+left, ARC1_H+RADIUS, 225, 90, false, paint); | |
| 151 | canvas.drawArc( ARC2_W-RADIUS+left, ARC2_H-RADIUS, ARC2_W+RADIUS+left, ARC2_H+RADIUS, 105, 90, false, paint); | |
| 152 | canvas.drawArc( ARC3_W-RADIUS+left, ARC2_H-RADIUS, ARC3_W+RADIUS+left, ARC2_H+RADIUS, 345, 90, false, paint); | |
| 153 | } | |
| 154 |  | |
| 155 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 156 | // PUBLIC API | |
| 157 |  | |
| 158 | public Static3D[] getRotationAxis() | |
| 159 |     {
 | |
| 160 | return AXIS; | |
| 161 | } | |
| 162 |  | |
| 163 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 164 |  | |
| 165 | public int getBasicAngle() | |
| 166 |     {
 | |
| 167 | return 3; | |
| 168 | } | |
| 169 |  | |
| 170 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 171 |  | |
| 172 | public float returnMultiplier() | |
| 173 |     {
 | |
| 174 | // TODO | |
| 175 |  | |
| 176 | return 0; | |
| 177 | } | |
| 178 |  | |
| 179 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 180 |  | |
| 181 | public float returnRotationFactor(float offset) | |
| 182 |     {
 | |
| 183 | return 1.0f; | |
| 184 | } | |
| 185 |  | |
| 186 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 187 |  | |
| 188 | public float[] getRowChances() | |
| 189 |     {
 | |
| 190 | int size = getSize(); | |
| 191 | float[] chances = new float[size]; | |
| 192 |  | |
| 193 | for(int i=0; i<size; i++) | |
| 194 |       {
 | |
| 195 | chances[i] = (i+1.0f) / size; | |
| 196 | } | |
| 197 |  | |
| 198 | return chances; | |
| 199 | } | |
| 200 |  | |
| 201 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 202 | // TODO (only needed for solvers - there are no Dino solvers ATM) | |
| 203 |  | |
| 204 | public String retObjectString() | |
| 205 |     {
 | |
| 206 | return ""; | |
| 207 | } | |
| 208 |  | |
| 209 | } | |
| src/main/java/org/distorted/objects/RubikDinoMovement.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2020 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.objects; | |
| 21 |  | |
| 22 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 23 |  | |
| 24 | class RubikDinoMovement extends RubikObjectMovement | |
| 25 | {
 | |
| 26 | RubikDinoMovement() | |
| 27 |     {
 | |
| 28 | super(RubikDino.AXIS, 1.5f, 0.5f, 0.5f); | |
| 29 | } | |
| 30 |  | |
| 31 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 32 |  | |
| 33 | boolean isInsideFace(float[] p) | |
| 34 |     {
 | |
| 35 | return ( p[0]<=0.5f && p[0]>=-0.5f && p[1]<=0.5f && p[1]>=-0.5f ); | |
| 36 | } | |
| 37 | } | |
| src/main/java/org/distorted/objects/RubikObject.java | ||
|---|---|---|
| 645 | 645 |  | 
| 646 | 646 | public int getCubit(float[] point3D) | 
| 647 | 647 |     {
 | 
| 648 |     float dist, minDist = Float. MAX_VALUE;
 | |
| 648 | float dist, minDist = Float.MAX_VALUE; | |
| 649 | 649 | int currentBest=-1; | 
| 650 | 650 | float multiplier = returnMultiplier(); | 
| 651 | 651 |  | 
| src/main/java/org/distorted/objects/RubikObjectList.java | ||
|---|---|---|
| 54 | 54 | RubikPyraminx.class, | 
| 55 | 55 | new RubikPyraminxMovement() | 
| 56 | 56 | ), | 
| 57 |  | |
| 58 | DINO ( | |
| 59 |          new int[][] {
 | |
| 60 |                        {3 , 10, R.raw.pyra3, R.drawable.ui_small_pyra3, R.drawable.ui_medium_pyra3, R.drawable.ui_big_pyra3, R.drawable.ui_huge_pyra3} ,
 | |
| 61 | }, | |
| 62 | RubikDino.class, | |
| 63 | new RubikDinoMovement() | |
| 64 | ), | |
| 57 | 65 | ; | 
| 58 | 66 |  | 
| 59 | 67 | public static final int NUM_OBJECTS = values().length; | 
| ... | ... | |
| 354 | 362 |       {
 | 
| 355 | 363 | case 0: return new RubikCube (size, quat, texture, mesh, effects, moves, res, scrWidth); | 
| 356 | 364 | case 1: return new RubikPyraminx(size, quat, texture, mesh, effects, moves, res, scrWidth); | 
| 365 | case 2: return new RubikDino (size, quat, texture, mesh, effects, moves, res, scrWidth); | |
| 357 | 366 | } | 
| 358 | 367 |  | 
| 359 | 368 | return null; | 
| src/main/java/org/distorted/objects/RubikObjectMovement.java | ||
|---|---|---|
| 42 | 42 |  | 
| 43 | 43 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 44 | 44 |  | 
| 45 |   RubikObjectMovement(Static3D[] axis, int numFacesPerAxis, float distance3D, float distance2D)
 | |
| 45 |   RubikObjectMovement(Static3D[] axis, float numFacesPerAxis, float distance3D, float distance2D)
 | |
| 46 | 46 |     {
 | 
| 47 | 47 | mPoint = new float[3]; | 
| 48 | 48 | mCamera= new float[3]; | 
| ... | ... | |
| 53 | 53 |  | 
| 54 | 54 | mAxis = axis; | 
| 55 | 55 | mNumAxis = mAxis.length; | 
| 56 |     mNumFacesPerAxis = numFacesPerAxis;
 | |
| 56 |     mNumFacesPerAxis = (int)numFacesPerAxis;  // TODO
 | |
| 57 | 57 | mDistanceCenterFace3D = distance3D; // distance from the center of the object to each of its faces | 
| 58 | 58 | mDistanceCenterFace2D = distance2D; // distance from the center of a face to its edge | 
| 59 | 59 |  | 
| src/main/java/org/distorted/objects/RubikPyraminx.java | ||
|---|---|---|
| 420 | 420 | } | 
| 421 | 421 |  | 
| 422 | 422 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| 423 | // TODO | |
| 423 | // TODO  (only needed for solvers - there are no Pyraminx solvers ATM)
 | |
| 424 | 424 |  | 
| 425 | 425 | public String retObjectString() | 
| 426 | 426 |     {
 | 
| src/main/res/raw/compute_quats.c | ||
|---|---|---|
| 2 | 2 | #include <math.h> | 
| 3 | 3 | #include <stdlib.h> | 
| 4 | 4 |  | 
| 5 | #define PYRAMIX
 | |
| 5 | #define DINO
 | |
| 6 | 6 |  | 
| 7 | 7 | #define SQ2 1.41421356237f | 
| 8 | 8 | #define SQ3 1.73205080757f | 
| ... | ... | |
| 20 | 20 | #endif | 
| 21 | 21 |  | 
| 22 | 22 | #ifdef CUBE | 
| 23 | #define NUM_AXIS 3 | |
| 23 | #define NUM_AXIS    3
 | |
| 24 | 24 | #define BASIC_ANGLE 4 | 
| 25 |  | |
| 25 | 26 | float axis[NUM_AXIS][3] = { { 1,0,0 }, {0,1,0}, {0,0,1} };
 | 
| 26 | 27 | #endif | 
| 27 | 28 |  | 
| 29 | #ifdef DINO | |
| 30 | #define NUM_AXIS 4 | |
| 31 | #define BASIC_ANGLE 3 | |
| 32 |  | |
| 33 | float axis[NUM_AXIS][3] = { {+SQ3/3,+SQ3/3,+SQ3/3} , 
 | |
| 34 |                             {+SQ3/3,+SQ3/3,-SQ3/3} , 
 | |
| 35 |                             {+SQ3/3,-SQ3/3,+SQ3/3} , 
 | |
| 36 |                             {+SQ3/3,-SQ3/3,-SQ3/3} };
 | |
| 37 | #endif | |
| 38 |  | |
| 28 | 39 | float* quats; | 
| 29 | 40 | float* table; | 
| 30 | 41 | int inserted=0; | 
Also available in: Unified diff
Beginnings of support for a new Object: the Dino.