Revision 3f7a4363
Added by Leszek Koltunski about 3 years ago
build.gradle | ||
---|---|---|
34 | 34 |
} |
35 | 35 |
|
36 | 36 |
dependencies { |
37 |
api project(':distorted-library') |
|
38 |
api project(':distorted-objectlib') |
|
39 |
|
|
37 | 40 |
implementation fileTree(dir: 'libs', include: ['*.jar']) |
38 | 41 |
implementation 'com.google.firebase:firebase-analytics:19.0.1' |
39 | 42 |
implementation 'com.google.firebase:firebase-crashlytics:18.2.1' |
40 | 43 |
implementation 'com.google.android.play:core:1.10.2' |
41 |
|
|
42 |
api project(':distorted-library') |
|
43 | 44 |
implementation 'androidx.appcompat:appcompat:1.3.1' |
44 | 45 |
implementation 'com.google.android.material:material:1.4.0' |
45 | 46 |
} |
src/main/java/org/distorted/control/RubikControl.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.main.DistortedScreen; |
25 | 25 |
import org.distorted.library.message.EffectListener; |
26 | 26 |
import org.distorted.library.type.Static4D; |
27 |
|
|
28 |
import org.distorted.objectlib.main.TwistyObject; |
|
29 |
|
|
27 | 30 |
import org.distorted.main.RubikActivity; |
28 | 31 |
import org.distorted.main.RubikSurfaceView; |
29 |
import org.distorted.objectlib.TwistyObject; |
|
30 | 32 |
|
31 | 33 |
import java.lang.ref.WeakReference; |
32 | 34 |
|
src/main/java/org/distorted/control/RubikControlRotate.java | ||
---|---|---|
22 | 22 |
import android.graphics.Bitmap; |
23 | 23 |
import android.graphics.BitmapFactory; |
24 | 24 |
|
25 |
import org.distorted.objectlib.QuatHelper; |
|
26 | 25 |
import org.distorted.library.effect.MatrixEffectQuaternion; |
27 | 26 |
import org.distorted.library.effect.MatrixEffectScale; |
28 | 27 |
import org.distorted.library.main.DistortedEffects; |
... | ... | |
36 | 35 |
import org.distorted.library.type.Dynamic4D; |
37 | 36 |
import org.distorted.library.type.Static3D; |
38 | 37 |
import org.distorted.library.type.Static4D; |
38 |
|
|
39 |
import org.distorted.objectlib.main.TwistyObject; |
|
40 |
import org.distorted.objectlib.main.QuatHelper; |
|
41 |
|
|
39 | 42 |
import org.distorted.main.R; |
40 | 43 |
import org.distorted.main.RubikActivity; |
41 |
import org.distorted.objectlib.TwistyObject; |
|
42 | 44 |
|
43 | 45 |
import java.io.IOException; |
44 | 46 |
import java.io.InputStream; |
src/main/java/org/distorted/control/RubikControlWhole.java | ||
---|---|---|
32 | 32 |
import org.distorted.library.type.Dynamic; |
33 | 33 |
import org.distorted.library.type.Dynamic3D; |
34 | 34 |
import org.distorted.library.type.Static3D; |
35 |
|
|
35 | 36 |
import org.distorted.main.R; |
36 | 37 |
import org.distorted.main.RubikActivity; |
37 | 38 |
import org.distorted.main.RubikSurfaceView; |
src/main/java/org/distorted/dialogs/RubikDialogEffects.java | ||
---|---|---|
51 | 51 |
|
52 | 52 |
public class RubikDialogEffects extends AppCompatDialogFragment implements SeekBar.OnSeekBarChangeListener, AdapterView.OnItemSelectedListener |
53 | 53 |
{ |
54 |
private TextView[] mDurationText; |
|
54 |
private final TextView[] mDurationText;
|
|
55 | 55 |
private float mTextSize; |
56 | 56 |
|
57 | 57 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/dialogs/RubikDialogNewRecord.java | ||
---|---|---|
35 | 35 |
import android.widget.Button; |
36 | 36 |
import android.widget.TextView; |
37 | 37 |
|
38 |
import org.distorted.objectlib.main.ObjectList; |
|
39 |
|
|
38 | 40 |
import org.distorted.main.R; |
39 | 41 |
import org.distorted.main.RubikActivity; |
40 |
import org.distorted.objectlib.ObjectList; |
|
41 | 42 |
import org.distorted.network.RubikScores; |
42 | 43 |
import org.distorted.screens.ScreenList; |
43 | 44 |
import org.distorted.screens.RubikScreenPlay; |
src/main/java/org/distorted/dialogs/RubikDialogPattern.java | ||
---|---|---|
39 | 39 |
import android.widget.ImageView; |
40 | 40 |
import android.widget.TextView; |
41 | 41 |
|
42 |
import org.distorted.objectlib.main.ObjectList; |
|
43 |
|
|
42 | 44 |
import org.distorted.main.R; |
43 | 45 |
import org.distorted.main.RubikActivity; |
44 |
import org.distorted.objectlib.ObjectList; |
|
45 | 46 |
import org.distorted.patterns.RubikPatternList; |
46 | 47 |
|
47 | 48 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/dialogs/RubikDialogPatternListAdapter.java | ||
---|---|---|
35 | 35 |
|
36 | 36 |
class RubikDialogPatternListAdapter extends BaseExpandableListAdapter |
37 | 37 |
{ |
38 |
private Context mContext; |
|
39 |
private int mTab, mWidth; |
|
38 |
private final Context mContext;
|
|
39 |
private final int mTab, mWidth;
|
|
40 | 40 |
|
41 | 41 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
42 | 42 |
|
src/main/java/org/distorted/dialogs/RubikDialogPatternPagerAdapter.java | ||
---|---|---|
33 | 33 |
|
34 | 34 |
class RubikDialogPatternPagerAdapter extends PagerAdapter |
35 | 35 |
{ |
36 |
private FragmentActivity mAct; |
|
37 |
private RubikDialogPatternView[] mViews; |
|
38 |
private RubikDialogPattern mDialog; |
|
39 |
private int mNumTabs; |
|
36 |
private final FragmentActivity mAct;
|
|
37 |
private final RubikDialogPatternView[] mViews;
|
|
38 |
private final RubikDialogPattern mDialog;
|
|
39 |
private final int mNumTabs;
|
|
40 | 40 |
|
41 | 41 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
42 | 42 |
|
src/main/java/org/distorted/dialogs/RubikDialogPatternView.java | ||
---|---|---|
26 | 26 |
import android.widget.ExpandableListView; |
27 | 27 |
import android.widget.FrameLayout; |
28 | 28 |
|
29 |
import org.distorted.objectlib.main.ObjectList; |
|
30 |
|
|
29 | 31 |
import org.distorted.main.R; |
30 | 32 |
import org.distorted.main.RubikActivity; |
31 |
import org.distorted.objectlib.ObjectList; |
|
32 | 33 |
import org.distorted.patterns.RubikPattern; |
33 | 34 |
import org.distorted.patterns.RubikPatternList; |
34 | 35 |
import org.distorted.screens.ScreenList; |
src/main/java/org/distorted/dialogs/RubikDialogPrivacy.java | ||
---|---|---|
29 | 29 |
import android.view.LayoutInflater; |
30 | 30 |
import android.view.View; |
31 | 31 |
import android.view.Window; |
32 |
import android.view.WindowManager; |
|
33 | 32 |
import android.widget.Button; |
34 | 33 |
import android.widget.TextView; |
35 | 34 |
|
src/main/java/org/distorted/dialogs/RubikDialogScores.java | ||
---|---|---|
38 | 38 |
import android.widget.ImageView; |
39 | 39 |
import android.widget.TextView; |
40 | 40 |
|
41 |
import org.distorted.objectlib.main.ObjectList; |
|
42 |
|
|
41 | 43 |
import org.distorted.main.R; |
42 | 44 |
import org.distorted.main.RubikActivity; |
43 |
import org.distorted.objectlib.ObjectList; |
|
44 | 45 |
|
45 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
46 | 47 |
|
src/main/java/org/distorted/dialogs/RubikDialogScoresPagerAdapter.java | ||
---|---|---|
30 | 30 |
import android.view.ViewGroup; |
31 | 31 |
import android.widget.LinearLayout; |
32 | 32 |
|
33 |
import org.distorted.objectlib.main.ObjectList; |
|
34 |
|
|
33 | 35 |
import org.distorted.main.R; |
34 | 36 |
import org.distorted.network.RubikScores; |
35 | 37 |
import org.distorted.network.RubikNetwork; |
36 |
import org.distorted.objectlib.ObjectList; |
|
37 | 38 |
import org.distorted.screens.RubikScreenPlay; |
38 | 39 |
|
39 | 40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/dialogs/RubikDialogScoresView.java | ||
---|---|---|
31 | 31 |
import android.widget.LinearLayout; |
32 | 32 |
import android.widget.TextView; |
33 | 33 |
|
34 |
import org.distorted.objectlib.main.ObjectList; |
|
35 |
|
|
34 | 36 |
import org.distorted.main.R; |
35 | 37 |
import org.distorted.main.RubikActivity; |
36 |
import org.distorted.objectlib.ObjectList; |
|
37 | 38 |
import org.distorted.network.RubikScores; |
38 | 39 |
|
39 | 40 |
import static org.distorted.network.RubikNetwork.MAX_PLACES; |
src/main/java/org/distorted/dialogs/RubikDialogSetName.java | ||
---|---|---|
38 | 38 |
import android.widget.EditText; |
39 | 39 |
import android.widget.TextView; |
40 | 40 |
|
41 |
import org.distorted.objectlib.main.ObjectList; |
|
42 |
|
|
41 | 43 |
import org.distorted.main.R; |
42 | 44 |
import org.distorted.main.RubikActivity; |
43 |
import org.distorted.objectlib.ObjectList; |
|
44 | 45 |
import org.distorted.network.RubikScores; |
45 | 46 |
import org.distorted.screens.ScreenList; |
46 | 47 |
import org.distorted.screens.RubikScreenPlay; |
src/main/java/org/distorted/dialogs/RubikDialogSolverError.java | ||
---|---|---|
32 | 32 |
import android.view.LayoutInflater; |
33 | 33 |
import android.view.View; |
34 | 34 |
import android.view.Window; |
35 |
import android.view.WindowManager; |
|
36 | 35 |
import android.widget.Button; |
37 | 36 |
import android.widget.TextView; |
38 | 37 |
|
src/main/java/org/distorted/dialogs/RubikDialogTutorialView.java | ||
---|---|---|
35 | 35 |
|
36 | 36 |
import com.google.firebase.analytics.FirebaseAnalytics; |
37 | 37 |
|
38 |
import org.distorted.objectlib.main.ObjectList; |
|
39 |
|
|
38 | 40 |
import org.distorted.main.BuildConfig; |
39 | 41 |
import org.distorted.main.R; |
40 | 42 |
import org.distorted.main.RubikActivity; |
41 |
import org.distorted.objectlib.ObjectList; |
|
42 | 43 |
import org.distorted.tutorials.TutorialList; |
43 | 44 |
|
44 | 45 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/effects/BaseEffect.java | ||
---|---|---|
23 | 23 |
import java.lang.reflect.Method; |
24 | 24 |
import android.content.SharedPreferences; |
25 | 25 |
|
26 |
import org.distorted.library.main.DistortedScreen; |
|
27 |
|
|
26 | 28 |
import org.distorted.effects.scramble.ScrambleEffect; |
27 | 29 |
import org.distorted.effects.objectchange.ObjectChangeEffect; |
28 | 30 |
import org.distorted.effects.solve.SolveEffect; |
29 | 31 |
import org.distorted.effects.win.WinEffect; |
30 |
import org.distorted.library.main.DistortedScreen; |
|
31 | 32 |
import org.distorted.main.R; |
32 | 33 |
|
33 | 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/effects/EffectController.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.effects; |
21 | 21 |
|
22 |
import org.distorted.helpers.MovesFinished; |
|
23 | 22 |
import org.distorted.library.message.EffectListener; |
24 |
import org.distorted.objectlib.TwistyObject; |
|
23 |
import org.distorted.objectlib.main.TwistyObject; |
|
24 |
import org.distorted.helpers.MovesFinished; |
|
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 | 27 |
|
src/main/java/org/distorted/effects/objectchange/ObjectChangeEffect.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.effects.objectchange; |
21 | 21 |
|
22 |
import org.distorted.effects.BaseEffect; |
|
22 |
import java.lang.reflect.Method; |
|
23 |
|
|
23 | 24 |
import org.distorted.library.effect.Effect; |
24 | 25 |
import org.distorted.library.main.DistortedEffects; |
25 | 26 |
import org.distorted.library.main.DistortedScreen; |
26 | 27 |
import org.distorted.library.message.EffectListener; |
27 |
import org.distorted.effects.EffectController; |
|
28 |
import org.distorted.objectlib.TwistyObject; |
|
29 | 28 |
|
30 |
import java.lang.reflect.Method; |
|
29 |
import org.distorted.objectlib.main.TwistyObject; |
|
30 |
|
|
31 |
import org.distorted.effects.BaseEffect; |
|
32 |
import org.distorted.effects.EffectController; |
|
31 | 33 |
|
32 | 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
33 | 35 |
|
src/main/java/org/distorted/effects/scramble/ScrambleEffect.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.effects.scramble; |
21 | 21 |
|
22 |
import org.distorted.effects.BaseEffect; |
|
23 |
import org.distorted.helpers.MovesFinished; |
|
22 |
import java.lang.reflect.Method; |
|
23 |
import java.util.Random; |
|
24 |
|
|
24 | 25 |
import org.distorted.library.effect.Effect; |
25 | 26 |
import org.distorted.library.main.DistortedEffects; |
26 | 27 |
import org.distorted.library.main.DistortedScreen; |
27 | 28 |
import org.distorted.library.message.EffectListener; |
28 |
import org.distorted.effects.EffectController; |
|
29 |
import org.distorted.objectlib.ObjectList; |
|
30 |
import org.distorted.objectlib.TwistyObject; |
|
31 | 29 |
|
32 |
import java.lang.reflect.Method; |
|
33 |
import java.util.Random; |
|
30 |
import org.distorted.objectlib.main.ObjectList; |
|
31 |
import org.distorted.objectlib.main.TwistyObject; |
|
32 |
|
|
33 |
import org.distorted.effects.BaseEffect; |
|
34 |
import org.distorted.effects.EffectController; |
|
35 |
import org.distorted.helpers.MovesFinished; |
|
34 | 36 |
|
35 | 37 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
36 | 38 |
|
src/main/java/org/distorted/effects/scramble/ScrambleEffectRotations.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.effects.scramble; |
21 | 21 |
|
22 |
import java.util.Random; |
|
23 |
|
|
22 | 24 |
import org.distorted.library.effect.Effect; |
23 | 25 |
import org.distorted.library.effect.MatrixEffectMove; |
24 | 26 |
import org.distorted.library.effect.MatrixEffectQuaternion; |
... | ... | |
28 | 30 |
import org.distorted.library.type.Static3D; |
29 | 31 |
import org.distorted.library.type.Static4D; |
30 | 32 |
|
31 |
import java.util.Random; |
|
32 |
|
|
33 | 33 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 34 |
|
35 | 35 |
public class ScrambleEffectRotations extends ScrambleEffect |
src/main/java/org/distorted/effects/solve/SolveEffect.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.effects.solve; |
21 | 21 |
|
22 |
import org.distorted.effects.BaseEffect; |
|
22 |
import java.lang.reflect.Method; |
|
23 |
|
|
23 | 24 |
import org.distorted.library.effect.Effect; |
24 | 25 |
import org.distorted.library.main.DistortedEffects; |
25 | 26 |
import org.distorted.library.main.DistortedScreen; |
26 | 27 |
import org.distorted.library.message.EffectListener; |
27 |
import org.distorted.effects.EffectController; |
|
28 |
import org.distorted.objectlib.TwistyObject; |
|
29 | 28 |
|
30 |
import java.lang.reflect.Method; |
|
29 |
import org.distorted.objectlib.main.TwistyObject; |
|
30 |
|
|
31 |
import org.distorted.effects.BaseEffect; |
|
32 |
import org.distorted.effects.EffectController; |
|
31 | 33 |
|
32 | 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
33 | 35 |
|
src/main/java/org/distorted/effects/win/WinEffect.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.effects.win; |
21 | 21 |
|
22 |
import org.distorted.effects.BaseEffect; |
|
22 |
import java.lang.reflect.Method; |
|
23 |
|
|
23 | 24 |
import org.distorted.library.effect.Effect; |
24 | 25 |
import org.distorted.library.main.DistortedEffects; |
25 | 26 |
import org.distorted.library.main.DistortedScreen; |
26 | 27 |
import org.distorted.library.message.EffectListener; |
27 |
import org.distorted.effects.EffectController; |
|
28 |
import org.distorted.objectlib.TwistyObject; |
|
29 | 28 |
|
30 |
import java.lang.reflect.Method; |
|
29 |
import org.distorted.objectlib.main.TwistyObject; |
|
30 |
|
|
31 |
import org.distorted.effects.BaseEffect; |
|
32 |
import org.distorted.effects.EffectController; |
|
31 | 33 |
|
32 | 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
33 | 35 |
|
src/main/java/org/distorted/helpers/BlockController.java | ||
---|---|---|
21 | 21 |
|
22 | 22 |
import com.google.firebase.crashlytics.FirebaseCrashlytics; |
23 | 23 |
|
24 |
import org.distorted.library.message.EffectMessageSender; |
|
25 |
import org.distorted.main.BuildConfig; |
|
26 |
|
|
27 | 24 |
import java.lang.ref.WeakReference; |
28 | 25 |
import java.util.Timer; |
29 | 26 |
import java.util.TimerTask; |
30 | 27 |
|
28 |
import org.distorted.library.message.EffectMessageSender; |
|
29 |
import org.distorted.main.BuildConfig; |
|
30 |
|
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
32 | 32 |
|
33 | 33 |
public class BlockController |
src/main/java/org/distorted/helpers/MovesAndLockController.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.helpers; |
21 | 21 |
|
22 |
import java.util.ArrayList; |
|
23 |
import java.util.Timer; |
|
24 |
import java.util.TimerTask; |
|
25 |
|
|
22 | 26 |
import android.view.View; |
23 | 27 |
import android.widget.ImageButton; |
24 | 28 |
import android.widget.LinearLayout; |
... | ... | |
26 | 30 |
import org.distorted.main.R; |
27 | 31 |
import org.distorted.main.RubikActivity; |
28 | 32 |
|
29 |
import java.util.ArrayList; |
|
30 |
import java.util.Timer; |
|
31 |
import java.util.TimerTask; |
|
32 |
|
|
33 | 33 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 34 |
|
35 | 35 |
public class MovesAndLockController implements MovesFinished |
src/main/java/org/distorted/main/RubikActivity.java | ||
---|---|---|
21 | 21 |
|
22 | 22 |
import android.content.Intent; |
23 | 23 |
import android.content.SharedPreferences; |
24 |
import android.content.res.Resources; |
|
25 | 24 |
import android.os.Build; |
26 | 25 |
import android.os.Bundle; |
27 | 26 |
import android.os.LocaleList; |
... | ... | |
36 | 35 |
|
37 | 36 |
import com.google.firebase.analytics.FirebaseAnalytics; |
38 | 37 |
|
38 |
import org.distorted.library.main.DistortedLibrary; |
|
39 |
import org.distorted.library.main.DistortedScreen; |
|
40 |
import org.distorted.library.type.Static4D; |
|
41 |
|
|
42 |
import org.distorted.objectlib.main.TwistyObject; |
|
43 |
import org.distorted.objectlib.main.ObjectList; |
|
44 |
|
|
39 | 45 |
import org.distorted.dialogs.RubikDialogError; |
40 | 46 |
import org.distorted.dialogs.RubikDialogPrivacy; |
41 | 47 |
import org.distorted.effects.BaseEffect; |
42 | 48 |
import org.distorted.helpers.BlockController; |
43 | 49 |
import org.distorted.helpers.TwistyActivity; |
44 | 50 |
import org.distorted.helpers.TwistyPreRender; |
45 |
import org.distorted.library.main.DistortedEffects; |
|
46 |
import org.distorted.library.main.DistortedLibrary; |
|
47 |
|
|
48 |
import org.distorted.library.main.DistortedScreen; |
|
49 |
import org.distorted.library.main.DistortedTexture; |
|
50 |
import org.distorted.library.mesh.MeshSquare; |
|
51 |
import org.distorted.library.type.Static4D; |
|
52 |
import org.distorted.objectlib.TwistyObject; |
|
53 | 51 |
import org.distorted.network.RubikScores; |
54 | 52 |
import org.distorted.network.RubikNetwork; |
55 |
import org.distorted.objectlib.ObjectList; |
|
56 |
import org.distorted.objects.TwistyBandaged2Bar; |
|
57 |
import org.distorted.objects.TwistyBandaged3Plate; |
|
58 |
import org.distorted.objects.TwistyBandagedEvil; |
|
59 |
import org.distorted.objects.TwistyBandagedFused; |
|
60 |
import org.distorted.objects.TwistyCube; |
|
61 |
import org.distorted.objects.TwistyDiamond; |
|
62 |
import org.distorted.objects.TwistyDino4; |
|
63 |
import org.distorted.objects.TwistyDino6; |
|
64 |
import org.distorted.objects.TwistyHelicopter; |
|
65 |
import org.distorted.objects.TwistyIvy; |
|
66 |
import org.distorted.objects.TwistyJing; |
|
67 |
import org.distorted.objects.TwistyKilominx; |
|
68 |
import org.distorted.objects.TwistyMegaminx; |
|
69 |
import org.distorted.objects.TwistyMirror; |
|
70 |
import org.distorted.objects.TwistyPyraminx; |
|
71 |
import org.distorted.objects.TwistyRedi; |
|
72 |
import org.distorted.objects.TwistyRex; |
|
73 |
import org.distorted.objects.TwistySkewb; |
|
74 |
import org.distorted.objects.TwistySquare1; |
|
75 |
import org.distorted.objects.TwistySquare2; |
|
76 |
import org.distorted.objects.TwistyUltimate; |
|
77 | 53 |
import org.distorted.screens.ScreenList; |
78 | 54 |
import org.distorted.screens.RubikScreenPlay; |
79 | 55 |
import org.distorted.tutorials.TutorialActivity; |
... | ... | |
674 | 650 |
myIntent.putExtra("siz", size); |
675 | 651 |
startActivity(myIntent); |
676 | 652 |
} |
677 |
|
|
678 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
679 |
|
|
680 |
public static TwistyObject create(ObjectList object, int size, Static4D quat, int[][] moves, Resources res, int scrWidth) |
|
681 |
{ |
|
682 |
DistortedTexture texture = new DistortedTexture(); |
|
683 |
DistortedEffects effects = new DistortedEffects(); |
|
684 |
MeshSquare mesh = new MeshSquare(20,20); // mesh of the node, not of the cubits |
|
685 |
|
|
686 |
switch(object.ordinal()) |
|
687 |
{ |
|
688 |
case 0: return new TwistyCube (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
689 |
case 1: return new TwistyJing (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
690 |
case 2: return new TwistyPyraminx (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
691 |
case 3: return new TwistyKilominx (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
692 |
case 4: return new TwistyMegaminx (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
693 |
case 5: return new TwistyUltimate (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
694 |
case 6: return new TwistyDiamond (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
695 |
case 7: return new TwistyDino6 (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
696 |
case 8: return new TwistyDino4 (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
697 |
case 9: return new TwistyRedi (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
698 |
case 10: return new TwistyHelicopter (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
699 |
case 11: return new TwistySkewb (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
700 |
case 12: return new TwistyIvy (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
701 |
case 13: return new TwistyRex (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
702 |
case 14: return new TwistyBandagedFused (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
703 |
case 15: return new TwistyBandaged2Bar (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
704 |
case 16: return new TwistyBandaged3Plate (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
705 |
case 17: return new TwistyBandagedEvil (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
706 |
case 18: return new TwistySquare1 (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
707 |
case 19: return new TwistySquare2 (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
708 |
case 20: return new TwistyMirror (size, quat, texture, mesh, effects, moves, res, scrWidth); |
|
709 |
} |
|
710 |
|
|
711 |
return null; |
|
712 |
} |
|
713 | 653 |
} |
src/main/java/org/distorted/main/RubikPreRender.java | ||
---|---|---|
34 | 34 |
import com.google.android.play.core.tasks.Task; |
35 | 35 |
import com.google.firebase.analytics.FirebaseAnalytics; |
36 | 36 |
|
37 |
import org.distorted.objectlib.main.TwistyObject; |
|
38 |
import org.distorted.objectlib.main.ObjectList; |
|
39 |
|
|
37 | 40 |
import org.distorted.dialogs.RubikDialogNewRecord; |
38 | 41 |
import org.distorted.dialogs.RubikDialogSolved; |
39 | 42 |
import org.distorted.effects.BaseEffect; |
... | ... | |
42 | 45 |
import org.distorted.helpers.BlockController; |
43 | 46 |
import org.distorted.helpers.MovesFinished; |
44 | 47 |
import org.distorted.helpers.TwistyPreRender; |
45 |
import org.distorted.objectlib.TwistyObject; |
|
46 |
import org.distorted.objectlib.ObjectList; |
|
47 | 48 |
import org.distorted.network.RubikScores; |
48 | 49 |
import org.distorted.screens.RubikScreenPlay; |
49 | 50 |
import org.distorted.screens.ScreenList; |
... | ... | |
124 | 125 |
Context con = mView.getContext(); |
125 | 126 |
Resources res = con.getResources(); |
126 | 127 |
|
127 |
mNewObject = RubikActivity.create(object,size, mView.getQuat(), moves, res, mScreenWidth);
|
|
128 |
mNewObject = object.create(size, mView.getQuat(), moves, res, mScreenWidth);
|
|
128 | 129 |
|
129 | 130 |
if( mNewObject!=null ) |
130 | 131 |
{ |
src/main/java/org/distorted/main/RubikSurfaceView.java | ||
---|---|---|
30 | 30 |
|
31 | 31 |
import com.google.firebase.crashlytics.FirebaseCrashlytics; |
32 | 32 |
|
33 |
import org.distorted.objectlib.QuatHelper; |
|
34 | 33 |
import org.distorted.library.type.Static2D; |
35 | 34 |
import org.distorted.library.type.Static4D; |
36 |
import org.distorted.objectlib.TwistyObject; |
|
37 |
import org.distorted.objectlib.Movement; |
|
35 |
|
|
36 |
import org.distorted.objectlib.main.QuatHelper; |
|
37 |
import org.distorted.objectlib.main.TwistyObject; |
|
38 |
import org.distorted.objectlib.main.Movement; |
|
39 |
|
|
38 | 40 |
import org.distorted.screens.RubikScreenReady; |
39 |
import org.distorted.solvers.SolverMain; |
|
40 | 41 |
import org.distorted.screens.ScreenList; |
41 | 42 |
import org.distorted.screens.RubikScreenPlay; |
42 | 43 |
import org.distorted.screens.RubikScreenSolver; |
43 | 44 |
import org.distorted.screens.RubikScreenSolving; |
45 |
import org.distorted.solvers.SolverMain; |
|
44 | 46 |
|
45 | 47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
46 | 48 |
|
src/main/java/org/distorted/network/RubikNetwork.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.network; |
21 | 21 |
|
22 |
import java.io.InputStream; |
|
23 |
import java.net.HttpURLConnection; |
|
24 |
import java.net.URL; |
|
25 |
import java.net.UnknownHostException; |
|
26 |
import java.security.MessageDigest; |
|
27 |
import java.security.NoSuchAlgorithmException; |
|
28 |
|
|
22 | 29 |
import android.app.Activity; |
23 | 30 |
import android.content.pm.PackageInfo; |
24 | 31 |
import android.content.pm.PackageManager; |
... | ... | |
27 | 34 |
import androidx.fragment.app.FragmentActivity; |
28 | 35 |
|
29 | 36 |
import org.distorted.library.main.DistortedLibrary; |
30 |
import org.distorted.objectlib.ObjectList; |
|
31 |
|
|
32 |
import java.io.InputStream; |
|
33 |
import java.net.HttpURLConnection; |
|
34 |
import java.net.URL; |
|
35 |
import java.net.UnknownHostException; |
|
36 |
import java.security.MessageDigest; |
|
37 |
import java.security.NoSuchAlgorithmException; |
|
37 |
import org.distorted.objectlib.main.ObjectList; |
|
38 | 38 |
|
39 |
import static org.distorted.objectlib.ObjectList.MAX_LEVEL; |
|
39 |
import static org.distorted.objectlib.main.ObjectList.MAX_LEVEL;
|
|
40 | 40 |
|
41 | 41 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
42 | 42 |
|
src/main/java/org/distorted/network/RubikScores.java | ||
---|---|---|
19 | 19 |
|
20 | 20 |
package org.distorted.network; |
21 | 21 |
|
22 |
import java.util.UUID; |
|
23 |
|
|
22 | 24 |
import android.content.Context; |
23 | 25 |
import android.content.SharedPreferences; |
24 | 26 |
import android.telephony.TelephonyManager; |
25 | 27 |
|
26 | 28 |
import com.google.firebase.crashlytics.FirebaseCrashlytics; |
27 | 29 |
|
28 |
import org.distorted.main.BuildConfig; |
|
29 |
import org.distorted.objectlib.ObjectList; |
|
30 |
import static org.distorted.objectlib.main.ObjectList.MAX_NUM_OBJECTS; |
|
31 |
import static org.distorted.objectlib.main.ObjectList.NUM_OBJECTS; |
|
32 |
import static org.distorted.objectlib.main.ObjectList.MAX_LEVEL; |
|
30 | 33 |
|
31 |
import java.util.UUID;
|
|
34 |
import org.distorted.objectlib.main.ObjectList;
|
|
32 | 35 |
|
33 |
import static org.distorted.objectlib.ObjectList.MAX_NUM_OBJECTS; |
|
34 |
import static org.distorted.objectlib.ObjectList.NUM_OBJECTS; |
|
35 |
import static org.distorted.objectlib.ObjectList.MAX_LEVEL; |
|
36 |
import org.distorted.main.BuildConfig; |
|
36 | 37 |
|
37 | 38 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
38 | 39 |
// hold my own scores, and some other statistics. |
src/main/java/org/distorted/objectlib/Cubit.java | ||
---|---|---|
1 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
2 |
// Copyright 2019 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.objectlib; |
|
21 |
|
|
22 |
import android.content.SharedPreferences; |
|
23 |
|
|
24 |
import org.distorted.library.type.Static4D; |
|
25 |
|
|
26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
27 |
|
|
28 |
public class Cubit |
|
29 |
{ |
|
30 |
private final float[] mOrigPosition; |
|
31 |
private final float[] mCurrentPosition; |
|
32 |
private final int mNumAxis; |
|
33 |
private final int mLen; |
|
34 |
private final int[] mRotationRow; |
|
35 |
private TwistyObject mParent; |
|
36 |
|
|
37 |
int mQuatIndex; |
|
38 |
|
|
39 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
40 |
|
|
41 |
Cubit(TwistyObject parent, float[] position, int numAxis) |
|
42 |
{ |
|
43 |
mQuatIndex= 0; |
|
44 |
mParent = parent; |
|
45 |
mLen = position.length; |
|
46 |
|
|
47 |
mOrigPosition = new float[mLen]; |
|
48 |
mCurrentPosition = new float[mLen]; |
|
49 |
|
|
50 |
for(int i=0; i<mLen; i++) |
|
51 |
{ |
|
52 |
mOrigPosition[i] = position[i]; |
|
53 |
mCurrentPosition[i] = position[i]; |
|
54 |
} |
|
55 |
|
|
56 |
mNumAxis = numAxis; |
|
57 |
mRotationRow = new int[mNumAxis]; |
|
58 |
computeRotationRow(); |
|
59 |
} |
|
60 |
|
|
61 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
62 |
// Because of quatMultiplication, errors can accumulate - so to avoid this, we |
|
63 |
// correct the value of the 'scramble' quat to what it should be - one of the legal quats from the |
|
64 |
// list QUATS. |
|
65 |
// |
|
66 |
// We also have to remember that the group of unit quaternions is a double-cover of rotations |
|
67 |
// in 3D ( q represents the same rotation as -q ) - so invert if needed. |
|
68 |
|
|
69 |
private int normalizeScrambleQuat(Static4D quat) |
|
70 |
{ |
|
71 |
float x = quat.get0(); |
|
72 |
float y = quat.get1(); |
|
73 |
float z = quat.get2(); |
|
74 |
float w = quat.get3(); |
|
75 |
float xd,yd,zd,wd; |
|
76 |
float diff, mindiff = Float.MAX_VALUE; |
|
77 |
int ret=0; |
|
78 |
int num_quats = mParent.OBJECT_QUATS.length; |
|
79 |
Static4D qt; |
|
80 |
|
|
81 |
for(int q=0; q<num_quats; q++) |
|
82 |
{ |
|
83 |
qt = mParent.OBJECT_QUATS[q]; |
|
84 |
|
|
85 |
xd = x - qt.get0(); |
|
86 |
yd = y - qt.get1(); |
|
87 |
zd = z - qt.get2(); |
|
88 |
wd = w - qt.get3(); |
|
89 |
|
|
90 |
diff = xd*xd + yd*yd + zd*zd + wd*wd; |
|
91 |
|
|
92 |
if( diff < mindiff ) |
|
93 |
{ |
|
94 |
ret = q; |
|
95 |
mindiff = diff; |
|
96 |
} |
|
97 |
|
|
98 |
xd = x + qt.get0(); |
|
99 |
yd = y + qt.get1(); |
|
100 |
zd = z + qt.get2(); |
|
101 |
wd = w + qt.get3(); |
|
102 |
|
|
103 |
diff = xd*xd + yd*yd + zd*zd + wd*wd; |
|
104 |
|
|
105 |
if( diff < mindiff ) |
|
106 |
{ |
|
107 |
ret = q; |
|
108 |
mindiff = diff; |
|
109 |
} |
|
110 |
} |
|
111 |
|
|
112 |
return ret; |
|
113 |
} |
|
114 |
|
|
115 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
116 |
|
|
117 |
private void computeRotationRow() |
|
118 |
{ |
|
119 |
for(int i=0; i<mNumAxis; i++) |
|
120 |
{ |
|
121 |
mRotationRow[i] = mParent.computeRow(mCurrentPosition,i); |
|
122 |
} |
|
123 |
} |
|
124 |
|
|
125 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
126 |
|
|
127 |
void modifyCurrentPosition(Static4D quat) |
|
128 |
{ |
|
129 |
Static4D cubitCenter; |
|
130 |
Static4D rotatedCenter; |
|
131 |
int len = mLen/3; |
|
132 |
|
|
133 |
for(int i=0; i<len; i++) |
|
134 |
{ |
|
135 |
cubitCenter = new Static4D(mCurrentPosition[3*i], mCurrentPosition[3*i+1], mCurrentPosition[3*i+2], 0); |
|
136 |
rotatedCenter = QuatHelper.rotateVectorByQuat( cubitCenter, quat); |
|
137 |
|
|
138 |
mCurrentPosition[3*i ] = rotatedCenter.get0(); |
|
139 |
mCurrentPosition[3*i+1] = rotatedCenter.get1(); |
|
140 |
mCurrentPosition[3*i+2] = rotatedCenter.get2(); |
|
141 |
|
|
142 |
mParent.clampPos(mCurrentPosition, 3*i); |
|
143 |
} |
|
144 |
|
|
145 |
computeRotationRow(); |
|
146 |
} |
|
147 |
|
|
148 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
149 |
|
|
150 |
int computeAssociation() |
|
151 |
{ |
|
152 |
int result = 0, accumulativeShift = 0; |
|
153 |
|
|
154 |
for(int axis=0; axis<mNumAxis; axis++) |
|
155 |
{ |
|
156 |
result += (mRotationRow[axis]<<accumulativeShift); |
|
157 |
accumulativeShift += ObjectList.MAX_OBJECT_SIZE; |
|
158 |
} |
|
159 |
|
|
160 |
return result; |
|
161 |
} |
|
162 |
|
|
163 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
164 |
|
|
165 |
void savePreferences(SharedPreferences.Editor editor) |
|
166 |
{ |
|
167 |
String number = mOrigPosition[0]+"_"+mOrigPosition[1]+"_"+mOrigPosition[2]; |
|
168 |
editor.putInt("q_"+number, mQuatIndex); |
|
169 |
} |
|
170 |
|
|
171 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
172 |
|
|
173 |
int restorePreferences(SharedPreferences preferences) |
|
174 |
{ |
|
175 |
String number = mOrigPosition[0]+"_"+mOrigPosition[1]+"_"+mOrigPosition[2]; |
|
176 |
mQuatIndex = preferences.getInt("q_"+number, 0); |
|
177 |
return mQuatIndex; |
|
178 |
} |
|
179 |
|
|
180 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
181 |
|
|
182 |
int removeRotationNow(Static4D quat) |
|
183 |
{ |
|
184 |
Static4D q = QuatHelper.quatMultiply(quat,mParent.OBJECT_QUATS[mQuatIndex]); |
|
185 |
mQuatIndex = normalizeScrambleQuat(q); |
|
186 |
|
|
187 |
modifyCurrentPosition(quat); |
|
188 |
|
|
189 |
return mQuatIndex; |
|
190 |
} |
|
191 |
|
|
192 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
193 |
|
|
194 |
void solve() |
|
195 |
{ |
|
196 |
mQuatIndex = 0; |
|
197 |
System.arraycopy(mOrigPosition, 0, mCurrentPosition, 0, mCurrentPosition.length); |
|
198 |
computeRotationRow(); |
|
199 |
} |
|
200 |
|
|
201 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
202 |
|
|
203 |
void releaseResources() |
|
204 |
{ |
|
205 |
mParent = null; |
|
206 |
} |
|
207 |
|
|
208 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
209 |
// this is only needed for MODE_REPLACE objects (i.e. - currently - CUBE_3), so it is enough to only |
|
210 |
// take into consideration the first position. |
|
211 |
|
|
212 |
float getDistSquared(float[] point) |
|
213 |
{ |
|
214 |
float dx = mCurrentPosition[0] - point[0]; |
|
215 |
float dy = mCurrentPosition[1] - point[1]; |
|
216 |
float dz = mCurrentPosition[2] - point[2]; |
|
217 |
|
|
218 |
return dx*dx + dy*dy + dz*dz; |
|
219 |
} |
|
220 |
|
|
221 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
222 |
|
|
223 |
public int getRotRow(int index) |
|
224 |
{ |
|
225 |
return mRotationRow[index]; |
|
226 |
} |
|
227 |
} |
src/main/java/org/distorted/objectlib/FactoryCubit.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.objectlib; |
|
21 |
|
|
22 |
import org.distorted.library.effect.MatrixEffectMove; |
|
23 |
import org.distorted.library.effect.MatrixEffectQuaternion; |
|
24 |
import org.distorted.library.effect.MatrixEffectScale; |
|
25 |
import org.distorted.library.effect.VertexEffect; |
|
26 |
import org.distorted.library.effect.VertexEffectDeform; |
|
27 |
import org.distorted.library.mesh.MeshBase; |
|
28 |
import org.distorted.library.mesh.MeshJoined; |
|
29 |
import org.distorted.library.mesh.MeshPolygon; |
|
30 |
import org.distorted.library.type.Static1D; |
|
31 |
import org.distorted.library.type.Static3D; |
|
32 |
import org.distorted.library.type.Static4D; |
|
33 |
|
|
34 |
import java.util.ArrayList; |
|
35 |
|
|
36 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
37 |
|
|
38 |
public class FactoryCubit |
|
39 |
{ |
|
40 |
private static final Static1D RADIUS = new Static1D(1); |
|
41 |
private static FactoryCubit mThis; |
|
42 |
|
|
43 |
private static final double[] mBuffer = new double[3]; |
|
44 |
private static final double[] mQuat1 = new double[4]; |
|
45 |
private static final double[] mQuat2 = new double[4]; |
|
46 |
private static final double[] mQuat3 = new double[4]; |
|
47 |
private static final double[] mQuat4 = new double[4]; |
|
48 |
|
|
49 |
private static class StickerCoords |
|
50 |
{ |
|
51 |
double[] vertices; |
|
52 |
} |
|
53 |
|
|
54 |
private static class FaceTransform |
|
55 |
{ |
|
56 |
int sticker; |
|
57 |
double vx,vy,vz; |
|
58 |
double scale; |
|
59 |
double qx,qy,qz,qw; |
|
60 |
boolean flip; |
|
61 |
} |
|
62 |
|
|
63 |
private static final ArrayList<FaceTransform> mNewFaceTransf = new ArrayList<>(); |
|
64 |
private static final ArrayList<FaceTransform> mOldFaceTransf = new ArrayList<>(); |
|
65 |
private static final ArrayList<StickerCoords> mStickerCoords = new ArrayList<>(); |
|
66 |
|
|
67 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
68 |
|
|
69 |
private FactoryCubit() |
|
70 |
{ |
|
71 |
|
|
72 |
} |
|
73 |
|
|
74 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
75 |
|
|
76 |
public static FactoryCubit getInstance() |
|
77 |
{ |
|
78 |
if( mThis==null ) mThis = new FactoryCubit(); |
|
79 |
|
|
80 |
return mThis; |
|
81 |
} |
|
82 |
|
|
83 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
84 |
// H - height of the band in the middle |
|
85 |
// alpha - angle of the edge [0,90] |
|
86 |
// dist - often in a polygon the distance from edge to center is not 1, but something else. |
|
87 |
// This is the distance. |
|
88 |
// K - where to begin the second, much more flat part of the band. [0,1] |
|
89 |
// N - number of bands. N>=3 |
|
90 |
// |
|
91 |
// theory: two distinct parts to the band: |
|
92 |
// 1) (0,B) - steep |
|
93 |
// 2) (B,1) - flat |
|
94 |
// |
|
95 |
// In first part, we have y = g(x) ; in second - y = g(f(x)) where |
|
96 |
// |
|
97 |
// g(x) = sqrt( R^2 - (x-D)^2 ) - R*cos(alpha) |
|
98 |
// f(x) = ((D-B)/(1-B)*x + B*(1-D)/(1-B) |
|
99 |
// h(x) = R*(sin(alpha) - sin(x)) |
|
100 |
// R = H/(1-cos(alpha)) |
|
101 |
// D = H*sin(alpha) |
|
102 |
// B = h(K*alpha) |
|
103 |
// |
|
104 |
// The N points are taken at: |
|
105 |
// |
|
106 |
// 1) in the second part, there are K2 = (N-3)/3 such points |
|
107 |
// 2) in the first - K1 = (N-3) - K2 |
|
108 |
// 3) also, the 3 points 0,B,1 |
|
109 |
// |
|
110 |
// so we have the sequence A[i] of N points |
|
111 |
// |
|
112 |
// 0 |
|
113 |
// h((i+1)*(1-K)*alpha/(K1+1)) (i=0,1,...,K1-1) |
|
114 |
// B |
|
115 |
// (1-B)*(i+1)/(K2+1) + B (i=0,i,...,K2-1) |
|
116 |
// 1 |
|
117 |
|
|
118 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
119 |
|
|
120 |
private float f(float D, float B, float x) |
|
121 |
{ |
|
122 |
return ((D-B)*x + B*(1-D))/(1-B); |
|
123 |
} |
|
124 |
|
|
125 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
126 |
|
|
127 |
private float g(float R, float D, float x, float cosAlpha) |
|
128 |
{ |
|
129 |
float d = x-D; |
|
130 |
return (float)(Math.sqrt(R*R-d*d)-R*cosAlpha); |
|
131 |
} |
|
132 |
|
|
133 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
134 |
|
|
135 |
private float h(float R, float sinAlpha, float x) |
|
136 |
{ |
|
137 |
return R*(sinAlpha-(float)Math.sin(x)); |
|
138 |
} |
|
139 |
|
|
140 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
141 |
|
|
142 |
private boolean areColinear(double[][] vertices, int index1, int index2, int index3) |
|
143 |
{ |
|
144 |
double x1 = vertices[index1][0]; |
|
145 |
double y1 = vertices[index1][1]; |
|
146 |
double z1 = vertices[index1][2]; |
|
147 |
double x2 = vertices[index2][0]; |
|
148 |
double y2 = vertices[index2][1]; |
|
149 |
double z2 = vertices[index2][2]; |
|
150 |
double x3 = vertices[index3][0]; |
|
151 |
double y3 = vertices[index3][1]; |
|
152 |
double z3 = vertices[index3][2]; |
|
153 |
|
|
154 |
double v1x = x2-x1; |
|
155 |
double v1y = y2-y1; |
|
156 |
double v1z = z2-z1; |
|
157 |
double v2x = x3-x1; |
|
158 |
double v2y = y3-y1; |
|
159 |
double v2z = z3-z1; |
|
160 |
|
|
161 |
double A = Math.sqrt( (v1x*v1x+v1y*v1y+v1z*v1z) / (v2x*v2x+v2y*v2y+v2z*v2z) ); |
|
162 |
|
|
163 |
return (v1x==A*v2x && v1y==A*v2y && v1z==A*v2z); |
|
164 |
} |
|
165 |
|
|
166 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
167 |
|
|
168 |
private void computeNormalVector(double[][] vertices, int index1, int index2, int index3) |
|
169 |
{ |
|
170 |
double x1 = vertices[index1][0]; |
|
171 |
double y1 = vertices[index1][1]; |
|
172 |
double z1 = vertices[index1][2]; |
|
173 |
double x2 = vertices[index2][0]; |
|
174 |
double y2 = vertices[index2][1]; |
|
175 |
double z2 = vertices[index2][2]; |
|
176 |
double x3 = vertices[index3][0]; |
|
177 |
double y3 = vertices[index3][1]; |
|
178 |
double z3 = vertices[index3][2]; |
|
179 |
|
|
180 |
double v1x = x2-x1; |
|
181 |
double v1y = y2-y1; |
|
182 |
double v1z = z2-z1; |
|
183 |
double v2x = x3-x1; |
|
184 |
double v2y = y3-y1; |
|
185 |
double v2z = z3-z1; |
|
186 |
|
|
187 |
mBuffer[0] = v1y*v2z - v2y*v1z; |
|
188 |
mBuffer[1] = v1z*v2x - v2z*v1x; |
|
189 |
mBuffer[2] = v1x*v2y - v2x*v1y; |
|
190 |
|
|
191 |
double len = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2]; |
|
192 |
len = Math.sqrt(len); |
|
193 |
mBuffer[0] /= len; |
|
194 |
mBuffer[1] /= len; |
|
195 |
mBuffer[2] /= len; |
|
196 |
} |
|
197 |
|
|
198 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
199 |
// return quat1*quat2 |
|
200 |
|
|
201 |
private static void quatMultiply( double[] quat1, double[] quat2, double[] result ) |
|
202 |
{ |
|
203 |
double qx = quat1[0]; |
|
204 |
double qy = quat1[1]; |
|
205 |
double qz = quat1[2]; |
|
206 |
double qw = quat1[3]; |
|
207 |
|
|
208 |
double rx = quat2[0]; |
|
209 |
double ry = quat2[1]; |
|
210 |
double rz = quat2[2]; |
|
211 |
double rw = quat2[3]; |
|
212 |
|
|
213 |
result[0] = rw*qx - rz*qy + ry*qz + rx*qw; |
|
214 |
result[1] = rw*qy + rz*qx + ry*qw - rx*qz; |
|
215 |
result[2] = rw*qz + rz*qw - ry*qx + rx*qy; |
|
216 |
result[3] = rw*qw - rz*qz - ry*qy - rx*qx; |
|
217 |
} |
|
218 |
|
|
219 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
220 |
|
|
221 |
private void fitInSquare(FaceTransform info, double[][] vert3D) |
|
222 |
{ |
|
223 |
double minX = Double.MAX_VALUE; |
|
224 |
double maxX =-Double.MAX_VALUE; |
|
225 |
double minY = Double.MAX_VALUE; |
|
226 |
double maxY =-Double.MAX_VALUE; |
|
227 |
|
|
228 |
for (double[] vert : vert3D) |
|
229 |
{ |
|
230 |
double x = vert[0]; |
|
231 |
double y = vert[1]; |
|
232 |
|
|
233 |
if (x > maxX) maxX = x; |
|
234 |
if (x < minX) minX = x; |
|
235 |
if (y > maxY) maxY = y; |
|
236 |
if (y < minY) minY = y; |
|
237 |
} |
|
238 |
|
|
239 |
minX = minX<0 ? -minX:minX; |
|
240 |
maxX = maxX<0 ? -maxX:maxX; |
|
241 |
minY = minY<0 ? -minY:minY; |
|
242 |
maxY = maxY<0 ? -maxY:maxY; |
|
243 |
|
|
244 |
double max1 = Math.max(minX,minY); |
|
245 |
double max2 = Math.max(maxX,maxY); |
|
246 |
double max3 = Math.max(max1,max2); |
|
247 |
|
|
248 |
info.scale = max3/0.5; |
|
249 |
|
|
250 |
int len = vert3D.length; |
|
251 |
StickerCoords sInfo = new StickerCoords(); |
|
252 |
sInfo.vertices = new double[2*len]; |
|
253 |
|
|
254 |
for( int vertex=0; vertex<len; vertex++ ) |
|
255 |
{ |
|
256 |
sInfo.vertices[2*vertex ] = vert3D[vertex][0] / info.scale; |
|
257 |
sInfo.vertices[2*vertex+1] = vert3D[vertex][1] / info.scale; |
|
258 |
} |
|
259 |
|
|
260 |
mStickerCoords.add(sInfo); |
|
261 |
|
|
262 |
info.sticker = mStickerCoords.size() -1; |
|
263 |
info.flip = false; |
|
264 |
} |
|
265 |
|
|
266 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
267 |
|
|
268 |
private FaceTransform constructNewTransform(final double[][] vert3D) |
|
269 |
{ |
|
270 |
FaceTransform ft = new FaceTransform(); |
|
271 |
|
|
272 |
// compute center of gravity |
|
273 |
ft.vx = 0.0f; |
|
274 |
ft.vy = 0.0f; |
|
275 |
ft.vz = 0.0f; |
|
276 |
int len = vert3D.length; |
|
277 |
|
|
278 |
for (double[] vert : vert3D) |
|
279 |
{ |
|
280 |
ft.vx += vert[0]; |
|
281 |
ft.vy += vert[1]; |
|
282 |
ft.vz += vert[2]; |
|
283 |
} |
|
284 |
|
|
285 |
ft.vx /= len; |
|
286 |
ft.vy /= len; |
|
287 |
ft.vz /= len; |
|
288 |
|
|
289 |
// move all vertices so that their center of gravity is at (0,0,0) |
|
290 |
for (int i=0; i<len; i++) |
|
291 |
{ |
|
292 |
vert3D[i][0] -= ft.vx; |
|
293 |
vert3D[i][1] -= ft.vy; |
|
294 |
vert3D[i][2] -= ft.vz; |
|
295 |
} |
|
296 |
|
|
297 |
// find 3 non-colinear vertices |
|
298 |
int foundIndex = -1; |
|
299 |
|
|
300 |
for(int vertex=2; vertex<len; vertex++) |
|
301 |
{ |
|
302 |
if( !areColinear(vert3D,0,1,vertex) ) |
|
303 |
{ |
|
304 |
foundIndex = vertex; |
|
305 |
break; |
|
306 |
} |
|
307 |
} |
|
308 |
|
|
309 |
// compute the normal vector |
|
310 |
if( foundIndex==-1 ) |
|
311 |
{ |
|
312 |
throw new RuntimeException("all vertices colinear"); |
|
313 |
} |
|
314 |
|
|
315 |
computeNormalVector(vert3D,0,1,foundIndex); |
|
316 |
|
|
317 |
// rotate so that the normal vector becomes (0,0,1) |
|
318 |
double axisX, axisY, axisZ; |
|
319 |
|
|
320 |
if( mBuffer[0]!=0.0f || mBuffer[1]!=0.0f ) |
|
321 |
{ |
|
322 |
axisX = -mBuffer[1]; |
|
323 |
axisY = mBuffer[0]; |
|
324 |
axisZ = 0.0f; |
|
325 |
|
|
326 |
double axiLen = axisX*axisX + axisY*axisY; |
|
327 |
axiLen = Math.sqrt(axiLen); |
|
328 |
axisX /= axiLen; |
|
329 |
axisY /= axiLen; |
|
330 |
axisZ /= axiLen; |
|
331 |
} |
|
332 |
else |
|
333 |
{ |
|
334 |
axisX = 0.0f; |
|
335 |
axisY = 1.0f; |
|
336 |
axisZ = 0.0f; |
|
337 |
} |
|
338 |
|
|
339 |
double cosTheta = mBuffer[2]; |
|
340 |
double sinTheta = Math.sqrt(1-cosTheta*cosTheta); |
|
341 |
double sinHalfTheta = computeSinHalf(cosTheta); |
|
342 |
double cosHalfTheta = computeCosHalf(sinTheta,cosTheta); |
|
343 |
|
|
344 |
mQuat1[0] = axisX*sinHalfTheta; |
|
345 |
mQuat1[1] = axisY*sinHalfTheta; |
|
346 |
mQuat1[2] = axisZ*sinHalfTheta; |
|
347 |
mQuat1[3] = cosHalfTheta; |
|
348 |
mQuat2[0] =-axisX*sinHalfTheta; |
|
349 |
mQuat2[1] =-axisY*sinHalfTheta; |
|
350 |
mQuat2[2] =-axisZ*sinHalfTheta; |
|
351 |
mQuat2[3] = cosHalfTheta; |
|
352 |
|
|
353 |
for (double[] vert : vert3D) |
|
354 |
{ |
|
355 |
quatMultiply(mQuat1, vert , mQuat3); |
|
356 |
quatMultiply(mQuat3, mQuat2, vert ); |
|
357 |
} |
|
358 |
|
|
359 |
// fit the whole thing in a square and remember the scale & 2D vertices |
|
360 |
fitInSquare(ft, vert3D); |
|
361 |
|
|
362 |
// remember the rotation |
|
363 |
ft.qx =-mQuat1[0]; |
|
364 |
ft.qy =-mQuat1[1]; |
|
365 |
ft.qz =-mQuat1[2]; |
|
366 |
ft.qw = mQuat1[3]; |
|
367 |
|
|
368 |
return ft; |
|
369 |
} |
|
370 |
|
|
371 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
372 |
|
|
373 |
private void rotateAllVertices(double[] result, int len, double[] vertices, double sin, double cos) |
|
374 |
{ |
|
375 |
for(int i=0; i<len; i++) |
|
376 |
{ |
|
377 |
result[2*i ] = vertices[2*i ]*cos - vertices[2*i+1]*sin; |
|
378 |
result[2*i+1] = vertices[2*i ]*sin + vertices[2*i+1]*cos; |
|
379 |
} |
|
380 |
} |
|
381 |
|
|
382 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
383 |
|
|
384 |
private double computeScale(double[] v1, double[] v2, int v1i, int v2i) |
|
385 |
{ |
|
386 |
double v1x = v1[2*v1i]; |
|
387 |
double v1y = v1[2*v1i+1]; |
|
388 |
double v2x = v2[2*v2i]; |
|
389 |
double v2y = v2[2*v2i+1]; |
|
390 |
|
|
391 |
double lenSq1 = v1x*v1x + v1y*v1y; |
|
392 |
double lenSq2 = v2x*v2x + v2y*v2y; |
|
393 |
|
|
394 |
return Math.sqrt(lenSq2/lenSq1); |
|
395 |
} |
|
396 |
|
|
397 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
398 |
// valid for 0<angle<2*PI |
|
399 |
|
|
400 |
private double computeSinHalf(double cos) |
|
401 |
{ |
|
402 |
return Math.sqrt((1-cos)/2); |
|
403 |
} |
|
404 |
|
|
405 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
406 |
// valid for 0<angle<2*PI |
|
407 |
|
|
408 |
private double computeCosHalf(double sin, double cos) |
|
409 |
{ |
|
410 |
double cosHalf = Math.sqrt((1+cos)/2); |
|
411 |
return sin<0 ? -cosHalf : cosHalf; |
|
412 |
} |
|
413 |
|
|
414 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
415 |
|
|
416 |
private int computeRotatedIndex(int oldVertex, int len, int rotatedVertex, boolean inverted) |
|
417 |
{ |
|
418 |
int v = (rotatedVertex + (inverted? -oldVertex : oldVertex)); |
|
419 |
if( v>=len ) v-=len; |
|
420 |
if( v< 0 ) v+=len; |
|
421 |
|
|
422 |
return v; |
|
423 |
} |
|
424 |
|
|
425 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
426 |
|
|
427 |
private boolean isScaledVersionOf(double[] newVert, double[] oldVert, int len, int vertex, boolean inverted) |
|
428 |
{ |
|
429 |
int newZeroIndex = computeRotatedIndex(0,len,vertex,inverted); |
|
430 |
double EPSILON = 0.001; |
|
431 |
double scale = computeScale(newVert,oldVert,newZeroIndex,0); |
|
432 |
|
|
433 |
for(int i=1; i<len; i++) |
|
434 |
{ |
|
435 |
int index = computeRotatedIndex(i,len,vertex,inverted); |
|
436 |
|
|
437 |
double horz = oldVert[2*i ] - scale*newVert[2*index ]; |
|
438 |
double vert = oldVert[2*i+1] - scale*newVert[2*index+1]; |
|
439 |
|
|
440 |
if( horz>EPSILON || horz<-EPSILON || vert>EPSILON || vert<-EPSILON ) return false; |
|
441 |
} |
|
442 |
|
|
443 |
return true; |
|
444 |
} |
|
445 |
|
|
446 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
447 |
|
|
448 |
private void mirrorAllVertices(double[] output, int len, double[] input) |
|
449 |
{ |
|
450 |
for(int vertex=0; vertex<len; vertex++) |
|
451 |
{ |
|
452 |
output[2*vertex ] = input[2*vertex ]; |
|
453 |
output[2*vertex+1] =-input[2*vertex+1]; |
|
454 |
} |
|
455 |
} |
|
456 |
|
|
457 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
458 |
|
|
459 |
private void correctInfo(FaceTransform info, double scale, double sin, double cos, int oldSticker, boolean flip) |
|
460 |
{ |
|
461 |
mStickerCoords.remove(info.sticker); |
|
462 |
|
|
463 |
info.flip = flip; |
|
464 |
info.sticker = oldSticker; |
|
465 |
info.scale *= scale; |
|
466 |
|
|
467 |
mQuat1[0] = info.qx; |
|
468 |
mQuat1[1] = info.qy; |
|
469 |
mQuat1[2] = info.qz; |
|
470 |
mQuat1[3] = info.qw; |
|
471 |
|
|
472 |
double sinHalf = computeSinHalf(cos); |
|
473 |
double cosHalf = computeCosHalf(sin,cos); |
|
474 |
|
|
475 |
if( flip ) |
|
476 |
{ |
|
477 |
mQuat3[0] = 0.0f; |
|
478 |
mQuat3[1] = 0.0f; |
|
479 |
mQuat3[2] = sinHalf; |
|
480 |
mQuat3[3] = cosHalf; |
|
481 |
|
|
482 |
mQuat4[0] = 1.0; |
|
483 |
mQuat4[1] = 0.0; |
|
484 |
mQuat4[2] = 0.0; |
|
485 |
mQuat4[3] = 0.0; |
|
486 |
|
|
487 |
quatMultiply( mQuat3, mQuat4, mQuat2 ); |
|
488 |
} |
|
489 |
else |
|
490 |
{ |
|
491 |
mQuat2[0] = 0.0f; |
|
492 |
mQuat2[1] = 0.0f; |
|
493 |
mQuat2[2] = sinHalf; |
|
494 |
mQuat2[3] = cosHalf; |
|
495 |
} |
|
496 |
|
|
497 |
quatMultiply( mQuat1, mQuat2, mQuat3 ); |
|
498 |
|
|
499 |
info.qx = mQuat3[0]; |
|
500 |
info.qy = mQuat3[1]; |
|
501 |
info.qz = mQuat3[2]; |
|
502 |
info.qw = mQuat3[3]; |
|
503 |
} |
|
504 |
|
|
505 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
506 |
|
|
507 |
private void printVert(double[] buffer) |
|
508 |
{ |
|
509 |
int len = buffer.length/2; |
|
510 |
String str = ""; |
|
511 |
|
|
512 |
for(int i=0; i<len; i++) |
|
513 |
{ |
|
514 |
str += (" ("+buffer[2*i]+" , "+buffer[2*i+1]+" ) "); |
|
515 |
} |
|
516 |
|
|
517 |
android.util.Log.d("D", str); |
|
518 |
} |
|
519 |
|
|
520 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
521 |
|
|
522 |
private boolean foundVertex(FaceTransform info, double[] buffer, int len, double[] newVert, |
|
523 |
double[] oldVert, double lenFirstOld, int oldSticker, boolean inverted) |
|
524 |
{ |
|
525 |
for(int vertex=0; vertex<len; vertex++) |
|
526 |
{ |
|
527 |
double newX = newVert[2*vertex ]; |
|
528 |
double newY = newVert[2*vertex+1]; |
|
529 |
double lenIthNew = Math.sqrt(newX*newX + newY*newY); |
|
530 |
double cos = QuatHelper.computeCos( oldVert[0], oldVert[1], newX, newY, lenIthNew, lenFirstOld); |
|
531 |
double sin = QuatHelper.computeSin( oldVert[0], oldVert[1], newX, newY, lenIthNew, lenFirstOld); |
|
532 |
|
Also available in: Unified diff
Remove all files that have been separated into a new library 'objectlib'