Revision 140f2c4e
Added by Leszek Koltunski over 3 years ago
src/main/java/org/distorted/examples/meshfile/FactoryCubit.java | ||
---|---|---|
263 | 263 |
mBuffer[1] = v1z*v2x - v2z*v1x; |
264 | 264 |
mBuffer[2] = v1x*v2y - v2x*v1y; |
265 | 265 |
|
266 |
android.util.Log.e("D", " buffer: "+mBuffer[0]+" "+mBuffer[1]+" "+mBuffer[2]); |
|
266 |
float len = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2]; |
|
267 |
len = (float)Math.sqrt(len); |
|
268 |
mBuffer[0] /= len; |
|
269 |
mBuffer[1] /= len; |
|
270 |
mBuffer[2] /= len; |
|
267 | 271 |
|
268 |
|
|
269 |
if( mBuffer[2]<0.0f ) |
|
270 |
{ |
|
271 |
mBuffer[0] *= -1.0f; |
|
272 |
mBuffer[1] *= -1.0f; |
|
273 |
mBuffer[2] *= -1.0f; |
|
274 |
} |
|
272 |
//android.util.Log.e("D", " normal: "+mBuffer[0]+" "+mBuffer[1]+" "+mBuffer[2]); |
|
275 | 273 |
} |
276 | 274 |
|
277 | 275 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
378 | 376 |
|
379 | 377 |
computeNormalVector(vert3D,0,1,foundIndex); |
380 | 378 |
|
379 |
// rotate so that the normal vector becomes (0,0,1) |
|
380 |
float axisX, axisY, axisZ; |
|
381 |
|
|
381 | 382 |
if( mBuffer[0]!=0.0f || mBuffer[1]!=0.0f ) |
382 | 383 |
{ |
383 |
// rotate so that the normal vector becomes (0,0,1) |
|
384 |
float axisX = -mBuffer[1]; |
|
385 |
float axisY = mBuffer[0]; |
|
386 |
float axisZ = 0.0f; |
|
387 |
|
|
388 |
float vecLen = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2]; |
|
389 |
vecLen = (float)Math.sqrt(vecLen); |
|
390 |
mBuffer[0] /= vecLen; |
|
391 |
mBuffer[1] /= vecLen; |
|
392 |
mBuffer[2] /= vecLen; |
|
384 |
axisX = -mBuffer[1]; |
|
385 |
axisY = mBuffer[0]; |
|
386 |
axisZ = 0.0f; |
|
393 | 387 |
|
394 | 388 |
float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ; |
395 | 389 |
axiLen = (float)Math.sqrt(axiLen); |
396 | 390 |
axisX /= axiLen; |
397 | 391 |
axisY /= axiLen; |
398 | 392 |
axisZ /= axiLen; |
393 |
} |
|
394 |
else |
|
395 |
{ |
|
396 |
axisX = 0.0f; |
|
397 |
axisY = 1.0f; |
|
398 |
axisZ = 0.0f; |
|
399 |
} |
|
399 | 400 |
|
400 |
float cosTheta = mBuffer[2];
|
|
401 |
//float sinTheta = axiLen / vecLen;
|
|
401 |
float cosTheta = mBuffer[2]; |
|
402 |
//float sinTheta = axiLen / vecLen; |
|
402 | 403 |
|
403 |
float sinHalfTheta = (float)Math.sqrt(0.5f*(1-cosTheta));
|
|
404 |
float cosHalfTheta = (float)Math.sqrt(0.5f*(1+cosTheta));
|
|
404 |
float sinHalfTheta = (float)Math.sqrt(0.5f*(1-cosTheta)); |
|
405 |
float cosHalfTheta = (float)Math.sqrt(0.5f*(1+cosTheta)); |
|
405 | 406 |
|
406 |
mQuat1[0] = axisX*sinHalfTheta;
|
|
407 |
mQuat1[1] = axisY*sinHalfTheta;
|
|
408 |
mQuat1[2] = axisZ*sinHalfTheta;
|
|
409 |
mQuat1[3] = cosHalfTheta;
|
|
410 |
mQuat2[0] = axisX*sinHalfTheta;
|
|
411 |
mQuat2[1] = axisY*sinHalfTheta;
|
|
412 |
mQuat2[2] = axisZ*sinHalfTheta;
|
|
413 |
mQuat2[3] = -cosHalfTheta;
|
|
407 |
mQuat1[0] = axisX*sinHalfTheta; |
|
408 |
mQuat1[1] = axisY*sinHalfTheta; |
|
409 |
mQuat1[2] = axisZ*sinHalfTheta; |
|
410 |
mQuat1[3] = cosHalfTheta; |
|
411 |
mQuat2[0] = axisX*sinHalfTheta; |
|
412 |
mQuat2[1] = axisY*sinHalfTheta; |
|
413 |
mQuat2[2] = axisZ*sinHalfTheta; |
|
414 |
mQuat2[3] = -cosHalfTheta; |
|
414 | 415 |
|
415 |
for (float[] vert : vert3D) |
|
416 |
{ |
|
417 |
quatMultiply(mQuat1, vert, mQuat3); |
|
418 |
quatMultiply(mQuat3, mQuat2, vert); |
|
419 |
} |
|
416 |
for (float[] vert : vert3D) |
|
417 |
{ |
|
418 |
quatMultiply(mQuat1, vert, mQuat3); |
|
419 |
quatMultiply(mQuat3, mQuat2, vert); |
|
420 | 420 |
} |
421 | 421 |
|
422 | 422 |
// fit the whole thing in a square and remember the scale & 2D vertices |
... | ... | |
594 | 594 |
for(int previous=0; previous<face; previous++) |
595 | 595 |
{ |
596 | 596 |
info = mFaceInfo.get(previous); |
597 |
if( tryFindingRotation(info,newInfo.vertices) ) break; |
|
597 |
if( tryFindingRotation(newInfo,info.vertices) ) |
|
598 |
{ |
|
599 |
android.util.Log.e("D", "comparing face "+face+" to "+previous+" SUCCESS!!"); |
|
600 |
break; |
|
601 |
} |
|
598 | 602 |
} |
599 | 603 |
|
600 | 604 |
mFaceInfo.add(newInfo); |
... | ... | |
637 | 641 |
for(int face=0; face<numFaces; face++) |
638 | 642 |
{ |
639 | 643 |
info = mFaceInfo.get(face); |
644 |
|
|
645 |
android.util.Log.d("D", "--------------"); |
|
646 |
printInfo(info); |
|
647 |
|
|
640 | 648 |
band = bands[bandIndexes[face]]; |
641 | 649 |
bandsComputed = computeBands( band[0], (int)band[1], band[2], band[3], (int)band[4]); |
642 | 650 |
meshes[face] = new MeshPolygon(info.vertices,bandsComputed,(int)band[5],(int)band[6]); |
src/main/java/org/distorted/examples/meshfile/MeshFileRenderer.java | ||
---|---|---|
31 | 31 |
import org.distorted.library.effect.EffectType; |
32 | 32 |
import org.distorted.library.effect.MatrixEffectQuaternion; |
33 | 33 |
import org.distorted.library.effect.MatrixEffectScale; |
34 |
import org.distorted.library.effect.VertexEffect; |
|
35 |
import org.distorted.library.effect.VertexEffectDeform; |
|
36 | 34 |
import org.distorted.library.effect.VertexEffectDisappear; |
37 |
import org.distorted.library.effect.VertexEffectRotate; |
|
38 | 35 |
import org.distorted.library.main.DistortedEffects; |
39 | 36 |
import org.distorted.library.main.DistortedLibrary; |
40 | 37 |
import org.distorted.library.main.DistortedScreen; |
... | ... | |
54 | 51 |
import javax.microedition.khronos.opengles.GL10; |
55 | 52 |
|
56 | 53 |
import static org.distorted.examples.meshfile.MeshFileActivity.PROCEDURAL; |
57 |
import static org.distorted.examples.meshfile.FactoryCubit.COS18; |
|
58 |
import static org.distorted.examples.meshfile.FactoryCubit.SIN18; |
|
59 | 54 |
|
60 | 55 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
61 | 56 |
|
... | ... | |
65 | 60 |
private static final float SQ3 = (float)Math.sqrt(3); |
66 | 61 |
private final float DEFAULT_SCALE = 0.3f; |
67 | 62 |
|
68 |
private GLSurfaceView mView; |
|
63 |
private final GLSurfaceView mView;
|
|
69 | 64 |
private DistortedTexture mTexture; |
70 |
private DistortedScreen mScreen; |
|
71 |
private DistortedEffects mEffects; |
|
72 |
private Static3D mScale; |
|
65 |
private final DistortedScreen mScreen;
|
|
66 |
private final DistortedEffects mEffects;
|
|
67 |
private final Static3D mScale;
|
|
73 | 68 |
private long mTime; |
74 | 69 |
private float mCurrentScale; |
75 | 70 |
private MeshBase mMesh; |
... | ... | |
258 | 253 |
|
259 | 254 |
private MeshBase createStaticMesh() |
260 | 255 |
{ |
261 |
/* |
|
262 |
MeshBase triangle = new MeshTriangle(5); |
|
263 |
|
|
264 |
VertexEffectMove move = new VertexEffectMove( new Static3D(1,0,0) ); |
|
265 |
triangle.apply(move); |
|
266 |
|
|
267 |
triangle.mergeEffComponents(); |
|
268 |
|
|
269 |
VertexEffectScale scale = new VertexEffectScale( new Static3D(2,1,1) ); |
|
270 |
triangle.apply(scale); |
|
271 |
|
|
272 |
return triangle; |
|
273 |
*/ |
|
274 |
/* |
|
275 |
final float DIST = 0.2f; |
|
276 |
float[] vertices = new float[6]; |
|
277 |
|
|
278 |
vertices[0] = 0.5f-DIST; |
|
279 |
vertices[1] = -0.5f-DIST; |
|
280 |
|
|
281 |
vertices[2] = 0.5f-DIST; |
|
282 |
vertices[3] = 0.5f-DIST; |
|
283 |
|
|
284 |
vertices[4] = -0.5f-DIST; |
|
285 |
vertices[5] = 0.5f-DIST; |
|
286 |
|
|
287 |
float[] bands0 = new float[] {1.0f, 0.0f, 0.5f, 0.03f, 0.0f, 0.05f}; |
|
288 |
|
|
289 |
MeshBase mesh = new MeshPolygon(vertices,bands0,0,0); |
|
290 |
mesh.setShowNormals(true); |
|
291 |
|
|
292 |
return mesh; |
|
293 |
*/ |
|
294 |
|
|
295 | 256 |
final float IVY_D = 0.10f; |
296 | 257 |
final int IVY_N = 8; |
297 | 258 |
|
... | ... | |
344 | 305 |
|
345 | 306 |
final int[][] vertIndexes = new int[][] |
346 | 307 |
{ |
347 |
{0,1,3,2},
|
|
348 |
{5,4,6,7},
|
|
349 |
{5,1,0,4},
|
|
350 |
{6,2,3,7},
|
|
351 |
{4,0,2,6},
|
|
352 |
{1,5,7,3}
|
|
308 |
{2,3,1,0}, // counterclockwise!
|
|
309 |
{7,6,4,5},
|
|
310 |
{4,0,1,5},
|
|
311 |
{7,3,2,6},
|
|
312 |
{6,2,0,4},
|
|
313 |
{3,7,5,1}
|
|
353 | 314 |
}; |
354 | 315 |
|
355 | 316 |
final float[][] bands = new float[][] |
356 | 317 |
{ |
357 |
{0.048f,35,0.5f,0.7f,5, 2,2}
|
|
318 |
{0.05f,45,0.6f,0.5f,5, 2,2}
|
|
358 | 319 |
}; |
359 | 320 |
|
360 | 321 |
final int[] bandIndexes = new int[] { 0,0,0,0,0,0 }; |
Also available in: Unified diff
Face cubit creation: progress, a cube renders correctly :)