Revision 1c7eebdc
Added by Leszek Koltunski over 1 year ago
| src/main/java/org/distorted/objectlib/touchcontrol/TouchControlBarrel.java | ||
|---|---|---|
| 32 | 32 |
private final float[][] mCastedRotAxis; |
| 33 | 33 |
private float[][] mTouchBorders; |
| 34 | 34 |
|
| 35 |
private float mLongitude, mLatitude;
|
|
| 35 |
private float mRadius, mHeight;
|
|
| 36 | 36 |
private float mX, mY, mZ; |
| 37 | 37 |
|
| 38 | 38 |
private static final float X = (float)Math.sqrt( (2-SQ2)/(6+SQ2) ); |
| ... | ... | |
| 78 | 78 |
mTouch = new float[3]; |
| 79 | 79 |
|
| 80 | 80 |
int numRotAxis = mRotAxis.length; |
| 81 |
mEnabledRotAxis = new int[numRotAxis+1];
|
|
| 81 |
mEnabledRotAxis= new int[numRotAxis+1]; |
|
| 82 | 82 |
mCastedRotAxis = new float[numRotAxis][2]; |
| 83 | 83 |
|
| 84 | 84 |
mGhostAxisEnabled = -1; |
| ... | ... | |
| 155 | 155 |
return len; |
| 156 | 156 |
} |
| 157 | 157 |
|
| 158 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 159 |
// Longitude spans from 0 (at Guinea Bay) increasing to the east all the way to 2PI |
|
| 160 |
// Latitude - from -PI/2 (South Pole) to +PI/2 (North Pole) |
|
| 161 |
|
|
| 162 |
private void computeLongitudeAndLatitude(float A, float B, float C) |
|
| 163 |
{
|
|
| 164 |
float sqrt = (float)Math.sqrt(B*B - 4*A*C); |
|
| 165 |
float alpha= (-B+sqrt)/(2*A); // this is the closer point |
|
| 166 |
|
|
| 167 |
float cx = mCamera[0]; |
|
| 168 |
float cy = mCamera[1]; |
|
| 169 |
float cz = mCamera[2]; |
|
| 170 |
|
|
| 171 |
float vx = mCamera[0]-mPoint[0]; |
|
| 172 |
float vy = mCamera[1]-mPoint[1]; |
|
| 173 |
float vz = mCamera[2]-mPoint[2]; |
|
| 174 |
|
|
| 175 |
mX = cx + alpha*vx; |
|
| 176 |
mY = cy + alpha*vy; |
|
| 177 |
mZ = cz + alpha*vz; |
|
| 178 |
|
|
| 179 |
mLongitude = mZ==0 ? 0 : (float)Math.atan(mX/mZ); |
|
| 180 |
mLatitude = (float)Math.asin(2*mY); |
|
| 181 |
|
|
| 182 |
if( mZ<0 ) mLongitude += Math.PI; |
|
| 183 |
else if( mX<0 ) mLongitude += 2*Math.PI; |
|
| 184 |
} |
|
| 185 |
|
|
| 186 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 187 |
// this is Masterball-specific. See TwistyMasterball.getEnabled() |
|
| 188 |
|
|
| 189 |
private int returnTouchedFace() |
|
| 190 |
{
|
|
| 191 |
float t = (float)(mLongitude + Math.PI/8); |
|
| 192 |
if( t>2*Math.PI ) t-=(2*Math.PI); |
|
| 193 |
int ret = (int)(t/(Math.PI/4)); |
|
| 194 |
return ret<8 ? ret : 7; |
|
| 195 |
} |
|
| 196 |
|
|
| 197 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 198 |
// this is Masterball-specific. No parts in any faces. |
|
| 199 |
|
|
| 200 |
private int returnTouchedPart() |
|
| 201 |
{
|
|
| 202 |
return 0; |
|
| 203 |
} |
|
| 204 |
|
|
| 205 | 158 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 206 | 159 |
|
| 207 | 160 |
private float computeOffset(int rotIndex) |
| ... | ... | |
| 216 | 169 |
{
|
| 217 | 170 |
if( mGhostAxisEnabled<0 ) |
| 218 | 171 |
{
|
| 219 |
int face = returnTouchedFace(); |
|
| 220 |
int part = returnTouchedPart(); |
|
| 172 |
int face = 0;//returnTouchedFace();
|
|
| 173 |
int part = 0;//returnTouchedPart();
|
|
| 221 | 174 |
int num = mEnabled[face][0].length; |
| 222 | 175 |
mEnabledRotAxis[0] = num; |
| 223 | 176 |
System.arraycopy(mEnabled[face][part], 0, mEnabledRotAxis, 1, num); |
| ... | ... | |
| 229 | 182 |
} |
| 230 | 183 |
} |
| 231 | 184 |
|
| 185 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 186 |
|
|
| 187 |
private boolean crossesPipe(float radius, float vx, float vy, float vz) |
|
| 188 |
{
|
|
| 189 |
return false; |
|
| 190 |
} |
|
| 191 |
|
|
| 192 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 193 |
|
|
| 194 |
private boolean crossesPlane(float nx, float ny, float nz, float d, float vx, float vy, float vz) |
|
| 195 |
{
|
|
| 196 |
return false; |
|
| 197 |
} |
|
| 198 |
|
|
| 199 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 200 |
|
|
| 201 |
public boolean axisAndFaceAgree(int axisIndex) |
|
| 202 |
{
|
|
| 203 |
return false; |
|
| 204 |
} |
|
| 205 |
|
|
| 232 | 206 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 233 | 207 |
|
| 234 | 208 |
public int getTouchedCubitFace() |
| ... | ... | |
| 250 | 224 |
return 0; |
| 251 | 225 |
} |
| 252 | 226 |
|
| 227 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 228 |
// simply cast the appropriate rotational axis of the object to the screen surface. |
|
| 229 |
|
|
| 230 |
public void getCastedRotAxis(float[] output, Static4D quat, int axisIndex) |
|
| 231 |
{
|
|
| 232 |
Static3D a = mRotAxis[axisIndex]; |
|
| 233 |
getCastedRotAxis(output,quat,a.get0(),a.get1(),a.get2(),0); |
|
| 234 |
} |
|
| 235 |
|
|
| 253 | 236 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 254 | 237 |
|
| 255 | 238 |
public boolean objectTouched(Static4D rotatedTouchPoint, Static4D rotatedCamera) |
| ... | ... | |
| 265 | 248 |
float vx = mCamera[0]-mPoint[0]; |
| 266 | 249 |
float vy = mCamera[1]-mPoint[1]; |
| 267 | 250 |
float vz = mCamera[2]-mPoint[2]; |
| 251 |
float x1=0,y1=0,z1=0; |
|
| 252 |
float x2=0,y2=0,z2=0; |
|
| 253 |
float x3=0,y3=0,z3=0; |
|
| 254 |
float len1=Float.MAX_VALUE; |
|
| 255 |
float len2=Float.MAX_VALUE; |
|
| 256 |
float len3=Float.MAX_VALUE; |
|
| 257 |
|
|
| 258 |
if( crossesPipe(mRadius,vx,vy,vz) ) |
|
| 259 |
{
|
|
| 260 |
x1 = mX; |
|
| 261 |
y1 = mY; |
|
| 262 |
z1 = mZ; |
|
| 263 |
float dx = mX-mCamera[0]; |
|
| 264 |
float dy = mY-mCamera[1]; |
|
| 265 |
float dz = mZ-mCamera[2]; |
|
| 266 |
len1 = dx*dx + dy*dy + dz*dz; |
|
| 267 |
} |
|
| 268 |
if( crossesPlane(0,1,0,mHeight,vx,vy,vz) ) |
|
| 269 |
{
|
|
| 270 |
x2 = mX; |
|
| 271 |
y2 = mY; |
|
| 272 |
z2 = mZ; |
|
| 273 |
float dx = mX-mCamera[0]; |
|
| 274 |
float dy = mY-mCamera[1]; |
|
| 275 |
float dz = mZ-mCamera[2]; |
|
| 276 |
len2 = dx*dx + dy*dy + dz*dz; |
|
| 277 |
} |
|
| 278 |
if( crossesPlane(0,-1,0,mHeight,vx,vy,vz) ) |
|
| 279 |
{
|
|
| 280 |
x3 = mX; |
|
| 281 |
y3 = mY; |
|
| 282 |
z3 = mZ; |
|
| 283 |
float dx = mX-mCamera[0]; |
|
| 284 |
float dy = mY-mCamera[1]; |
|
| 285 |
float dz = mZ-mCamera[2]; |
|
| 286 |
len3 = dx*dx + dy*dy + dz*dz; |
|
| 287 |
} |
|
| 268 | 288 |
|
| 269 |
float R = 0.5f; |
|
| 270 |
float A = vx*vx + vy*vy + vz*vz; |
|
| 271 |
float B = 2*(vx*mCamera[0] + vy*mCamera[1] + vz*mCamera[2]); |
|
| 272 |
float C = (mCamera[0]*mCamera[0] + mCamera[1]*mCamera[1] + mCamera[2]*mCamera[2]) - R*R; |
|
| 273 |
|
|
| 274 |
if( B*B >= 4*A*C ) |
|
| 289 |
if( len1<len2 && len1<len3 ) |
|
| 275 | 290 |
{
|
| 276 |
computeLongitudeAndLatitude(A,B,C); |
|
| 291 |
mX = x1; |
|
| 292 |
mY = y1; |
|
| 293 |
mZ = z1; |
|
| 294 |
return true; |
|
| 295 |
} |
|
| 296 |
if( len2<len1 && len2<len3 ) |
|
| 297 |
{
|
|
| 298 |
mX = x2; |
|
| 299 |
mY = y2; |
|
| 300 |
mZ = z2; |
|
| 301 |
return true; |
|
| 302 |
} |
|
| 303 |
if( len3<len1 && len3<len2 ) |
|
| 304 |
{
|
|
| 305 |
mX = x3; |
|
| 306 |
mY = y3; |
|
| 307 |
mZ = z3; |
|
| 277 | 308 |
return true; |
| 278 | 309 |
} |
| 279 | 310 |
|
| ... | ... | |
| 329 | 360 |
output[0] = rotIndex; |
| 330 | 361 |
output[1] = row; |
| 331 | 362 |
} |
| 332 |
|
|
| 333 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 334 |
// simply cast the appropriate rotational axis of the object to the screen surface. |
|
| 335 |
|
|
| 336 |
public void getCastedRotAxis(float[] output, Static4D quat, int axisIndex) |
|
| 337 |
{
|
|
| 338 |
Static3D a = mRotAxis[axisIndex]; |
|
| 339 |
Static4D result = QuatHelper.rotateVectorByQuat(a.get0(),a.get1(),a.get2(),0,quat); |
|
| 340 |
|
|
| 341 |
float cx = result.get0(); |
|
| 342 |
float cy = result.get1(); |
|
| 343 |
float len= (float)Math.sqrt(cx*cx+cy*cy); |
|
| 344 |
|
|
| 345 |
if( len!=0 ) |
|
| 346 |
{
|
|
| 347 |
output[0] = cx/len; |
|
| 348 |
output[1] = cy/len; |
|
| 349 |
} |
|
| 350 |
else |
|
| 351 |
{
|
|
| 352 |
output[0] = 1; |
|
| 353 |
output[1] = 0; |
|
| 354 |
} |
|
| 355 |
} |
|
| 356 |
|
|
| 357 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 358 |
|
|
| 359 |
public boolean axisAndFaceAgree(int axisIndex) |
|
| 360 |
{
|
|
| 361 |
return false; |
|
| 362 |
} |
|
| 363 | 363 |
} |
Also available in: Unified diff
common code from all activities to one BaseActivity