Project

General

Profile

« Previous | Next » 

Revision be56193c

Added by Leszek Koltunski about 3 years ago

Move all the special cubit-creating code out of FactoryCubit and to the Object classes, and thus hopefully finish implementing the new cubit creating engine.

View differences:

src/main/java/org/distorted/helpers/FactoryCubit.java
24 24
import org.distorted.library.effect.MatrixEffectScale;
25 25
import org.distorted.library.effect.VertexEffect;
26 26
import org.distorted.library.effect.VertexEffectDeform;
27
import org.distorted.library.effect.VertexEffectMove;
28
import org.distorted.library.effect.VertexEffectRotate;
29
import org.distorted.library.effect.VertexEffectScale;
30 27
import org.distorted.library.mesh.MeshBase;
31 28
import org.distorted.library.mesh.MeshJoined;
32 29
import org.distorted.library.mesh.MeshPolygon;
......
40 37

  
41 38
public class FactoryCubit
42 39
  {
43
  private static final float SQ2 = (float)Math.sqrt(2);
44 40
  private static final Static1D RADIUS = new Static1D(1);
45 41
  private static FactoryCubit mThis;
46 42

  
47
  // IVY
48
  static final float IVY_D = 0.003f;
49
  static final float IVY_C = 0.59f;
50
  static final float IVY_M = 0.35f;
51
  private static final int IVY_N = 8;
52

  
53
  // REX
54
  public static final float REX_D = 0.2f;
55

  
56 43
  private static final double[] mBuffer = new double[3];
57 44
  private static final double[] mQuat1  = new double[4];
58 45
  private static final double[] mQuat2  = new double[4];
......
150 137
    return R*(sinAlpha-(float)Math.sin(x));
151 138
    }
152 139

  
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154

  
155
  private float[] computeBands(float H, int alpha, float dist, float K, int N)
156
    {
157
    float[] bands = new float[2*N];
158

  
159
    bands[0] = 1.0f;
160
    bands[1] = 0.0f;
161

  
162
    float beta = (float)Math.atan(dist*Math.tan(Math.PI*alpha/180));
163
    float sinBeta = (float)Math.sin(beta);
164
    float cosBeta = (float)Math.cos(beta);
165
    float R = cosBeta<1.0f ? H/(1.0f-cosBeta) : 0.0f;
166
    float D = R*sinBeta;
167
    float B = h(R,sinBeta,K*beta);
168

  
169
    if( D>1.0f )
170
      {
171
      for(int i=1; i<N; i++)
172
        {
173
        bands[2*i  ] = (float)(N-1-i)/(N-1);
174
        bands[2*i+1] = H*(1-bands[2*i]);
175
        }
176
      }
177
    else
178
      {
179
      int K2 = (int)((N-3)*K);
180
      int K1 = (N-3)-K2;
181

  
182
      for(int i=0; i<=K1; i++)
183
        {
184
        float angle = K*beta + (1-K)*beta*(K1-i)/(K1+1);
185
        float x = h(R,sinBeta,angle);
186
        bands[2*i+2] = 1.0f - x;
187
        bands[2*i+3] = g(R,D,x,cosBeta);
188
        }
189

  
190
      for(int i=0; i<=K2; i++)
191
        {
192
        float x = (1-B)*(i+1)/(K2+1) + B;
193
        bands[2*K1+2 + 2*i+2] = 1.0f - x;
194
        bands[2*K1+2 + 2*i+3] = g(R,D,f(D,B,x),cosBeta);
195
        }
196
      }
197

  
198
    bands[2*N-2] = 0.0f;
199
    bands[2*N-1] =    H;
200

  
201
    return bands;
202
    }
203

  
204
///////////////////////////////////////////////////////////////////////////////////////////////////
205

  
206
  private void roundCorners(MeshBase mesh, Static3D center, Static3D[] vertices, float strength, float regionRadius)
207
    {
208
    Static4D reg= new Static4D(0,0,0,regionRadius);
209

  
210
    float centX = center.get0();
211
    float centY = center.get1();
212
    float centZ = center.get2();
213

  
214
    for (Static3D vertex : vertices)
215
      {
216
      float x = strength*(centX - vertex.get0());
217
      float y = strength*(centY - vertex.get1());
218
      float z = strength*(centZ - vertex.get2());
219

  
220
      VertexEffect effect = new VertexEffectDeform(new Static3D(x,y,z), RADIUS, vertex, reg);
221
      mesh.apply(effect);
222
      }
223
    }
224

  
225
///////////////////////////////////////////////////////////////////////////////////////////////////
226

  
227
  MeshBase createFacesIvyCorner()
228
    {
229
    MeshBase[] meshes = new MeshBase[6];
230

  
231
    final float angle = (float)Math.PI/(2*IVY_N);
232
    final float CORR  = 1.0f - 2*IVY_D;
233
    final float DIST  = -0.5f*CORR + IVY_D;
234
    float[] vertices  = new float[2*(IVY_N+1)+6];
235

  
236
    vertices[0] = (0.5f-IVY_M) * IVY_C;
237
    vertices[1] = (DIST-IVY_M) * IVY_C;
238
    vertices[2] = (0.5f-IVY_M) * IVY_C;
239
    vertices[3] = (0.5f-IVY_M) * IVY_C;
240
    vertices[4] = (DIST-IVY_M) * IVY_C;
241
    vertices[5] = (0.5f-IVY_M) * IVY_C;
242

  
243
    for(int i=0; i<=IVY_N; i++)
244
      {
245
      float ang = (IVY_N-i)*angle;
246
      float sin = (float)Math.sin(ang);
247
      float cos = (float)Math.cos(ang);
248

  
249
      vertices[2*i+6] = (CORR*(cos-0.5f)-IVY_M)*IVY_C;
250
      vertices[2*i+7] = (CORR*(sin-0.5f)-IVY_M)*IVY_C;
251
      }
252

  
253
    float[] bands0 = computeBands(+0.012f,20,0.2f,0.5f,7);
254
    float[] bands1 = computeBands(-0.100f,20,0.2f,0.0f,2);
255

  
256
    meshes[0] = new MeshPolygon(vertices,bands0,1,2);
257
    meshes[0].setEffectAssociation(0,1,0);
258
    meshes[1] = meshes[0].copy(true);
259
    meshes[1].setEffectAssociation(0,2,0);
260
    meshes[2] = meshes[0].copy(true);
261
    meshes[2].setEffectAssociation(0,4,0);
262
    meshes[3] = new MeshPolygon(vertices,bands1,1,2);
263
    meshes[3].setEffectAssociation(0,8,0);
264
    meshes[4] = meshes[3].copy(true);
265
    meshes[4].setEffectAssociation(0,16,0);
266
    meshes[5] = meshes[3].copy(true);
267
    meshes[5].setEffectAssociation(0,32,0);
268

  
269
    return new MeshJoined(meshes);
270
    }
271

  
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273

  
274
  MeshBase createFacesIvyFace()
275
    {
276
    MeshBase[] meshes = new MeshBase[2];
277

  
278
    final float angle = (float)Math.PI/(2*IVY_N);
279
    final float CORR  = 1.0f - 2*IVY_D;
280
    float[] vertices = new float[4*IVY_N];
281

  
282
    for(int i=0; i<IVY_N; i++)
283
      {
284
      float sin = (float)Math.sin(i*angle);
285
      float cos = (float)Math.cos(i*angle);
286

  
287
      vertices[2*i          ] = CORR*(0.5f-cos);
288
      vertices[2*i+1        ] = CORR*(0.5f-sin);
289
      vertices[2*i  +2*IVY_N] = CORR*(cos-0.5f);
290
      vertices[2*i+1+2*IVY_N] = CORR*(sin-0.5f);
291
      }
292

  
293
    float[] bands0 = computeBands(+0.03f,35,0.5f,0.5f,5);
294
    float[] bands1 = computeBands(-0.10f,45,0.5f,0.0f,2);
295

  
296
    meshes[0] = new MeshPolygon(vertices,bands0,0,0);
297
    meshes[0].setEffectAssociation(0,1,0);
298
    meshes[1] = new MeshPolygon(vertices,bands1,0,0);
299
    meshes[1].setEffectAssociation(0,2,0);
300

  
301
    return new MeshJoined(meshes);
302
    }
303

  
304
///////////////////////////////////////////////////////////////////////////////////////////////////
305

  
306
  MeshBase createFacesRexCorner()
307
    {
308
    MeshBase[] meshes = new MeshBase[2];
309

  
310
    float F = REX_D*SQ2;
311
    float G = (1-REX_D)*SQ2/2;
312
    float H = 0.1f;
313
    float J = +2*G/3 - H*G;
314

  
315
    float[] vertices = { -F/2, -G/3, +F/2, -G/3, H*F/2, J, -H*F/2, J};
316

  
317
    float[] bands0 = computeBands(+0.016f,10,G/3,0.5f,5);
318
    float[] bands1 = computeBands(-0.230f,45,G/3,0.0f,2);
319

  
320
    meshes[0] = new MeshPolygon(vertices,bands0,1,1);
321
    meshes[0].setEffectAssociation(0,1,0);
322
    meshes[1] = new MeshPolygon(vertices,bands1,0,0);
323
    meshes[1].setEffectAssociation(0,2,0);
324

  
325
    return new MeshJoined(meshes);
326
    }
327

  
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329

  
330
  MeshBase createFacesRexFace()
331
    {
332
    MeshBase[] meshes = new MeshBase[2];
333

  
334
    float[] vertices = { -REX_D,0.0f, 0.0f, -REX_D, +REX_D, 0.0f, 0.0f, +REX_D};
335

  
336
    float[] bands0 = computeBands(0.016f,10,REX_D/2,0.5f,5);
337
    float[] bands1 = computeBands(0.000f,45,REX_D/2,0.0f,2);
338

  
339
    meshes[0] = new MeshPolygon(vertices,bands0,0,0);
340
    meshes[0].setEffectAssociation(0,1,0);
341
    meshes[1] = new MeshPolygon(vertices,bands1,0,0);
342
    meshes[1].setEffectAssociation(0,2,0);
343

  
344
    return new MeshJoined(meshes);
345
    }
346

  
347
///////////////////////////////////////////////////////////////////////////////////////////////////
348

  
349
  MeshBase createFacesRexEdge()
350
    {
351
    MeshBase[] meshes = new MeshPolygon[6];
352

  
353
    float E = 0.5f - REX_D;
354
    float F = 0.5f;
355
    float[] vertices0 = { -F,E/3, 0,-2*E/3, +F,E/3 };
356
    float[] bands0 = computeBands(0.03f,27,F/3,0.8f,5);
357

  
358
    meshes[0] = new MeshPolygon(vertices0, bands0, 2, 3);
359
    meshes[0].setEffectAssociation(0,1,0);
360
    meshes[1] = meshes[0].copy(true);
361
    meshes[1].setEffectAssociation(0,2,0);
362

  
363
    float G = (float)Math.sqrt(E*E+F*F);
364
    float[] vertices1 = { -2*G/3, -E/3, G/3, -E/3, G/3, 2*E/3 };
365
    float[] bands1 = computeBands(0.00f,45,G/3,0.2f,3);
366

  
367
    meshes[2] = new MeshPolygon(vertices1, bands1, 1, 2);
368
    meshes[2].setEffectAssociation(0,4,0);
369
    meshes[3] = meshes[2].copy(true);
370
    meshes[3].setEffectAssociation(0,8,0);
371
    meshes[4] = meshes[2].copy(true);
372
    meshes[4].setEffectAssociation(0,16,0);
373
    meshes[5] = meshes[2].copy(true);
374
    meshes[5].setEffectAssociation(0,32,0);
375

  
376
    return new MeshJoined(meshes);
377
    }
378

  
379
///////////////////////////////////////////////////////////////////////////////////////////////////
380

  
381
  private float[] createVertices(int A, int B)
382
    {
383
    float E = 0.5f / Math.max(A,B);
384
    return new float[] { -A*E,-B*E, +A*E,-B*E, +A*E,+B*E, -A*E,+B*E };
385
    }
386

  
387
///////////////////////////////////////////////////////////////////////////////////////////////////
388

  
389
  MeshBase createCuboid(int[] dimensions)
390
    {
391
    int X = dimensions[0];
392
    int Y = dimensions[1];
393
    int Z = dimensions[2];
394

  
395
    float[] verticesXY = createVertices(X,Y);
396
    float[] verticesXZ = createVertices(X,Z);
397
    float[] verticesYZ = createVertices(Z,Y);
398

  
399
    float defHeight = 0.048f;
400

  
401
    float[] bandsX = computeBands( defHeight/X,65,0.25f,0.5f,5);
402
    float[] bandsY = computeBands( defHeight/Y,65,0.25f,0.5f,5);
403
    float[] bandsZ = computeBands( defHeight/Z,65,0.25f,0.5f,5);
404

  
405
    MeshBase[] meshes = new MeshPolygon[6];
406

  
407
    meshes[0] = new MeshPolygon(verticesYZ,bandsX,1,2);
408
    meshes[0].setEffectAssociation(0,1,0);
409
    meshes[1] = meshes[0].copy(true);
410
    meshes[1].setEffectAssociation(0,2,0);
411
    meshes[2] = new MeshPolygon(verticesXZ,bandsY,1,2);
412
    meshes[2].setEffectAssociation(0,4,0);
413
    meshes[3] = meshes[2].copy(true);
414
    meshes[3].setEffectAssociation(0,8,0);
415
    meshes[4] = new MeshPolygon(verticesXY,bandsZ,1,2);
416
    meshes[4].setEffectAssociation(0,16,0);
417
    meshes[5] = meshes[4].copy(true);
418
    meshes[5].setEffectAssociation(0,32,0);
419

  
420
    return new MeshJoined(meshes);
421
    }
422

  
423
///////////////////////////////////////////////////////////////////////////////////////////////////
424
// EFFECTS
425
///////////////////////////////////////////////////////////////////////////////////////////////////
426

  
427
  VertexEffect[] createVertexEffectsIvyCorner()
428
    {
429
    Static3D axisX  = new Static3D(1,0,0);
430
    Static3D axisY  = new Static3D(0,1,0);
431
    Static1D angle1 = new Static1D(+90);
432
    Static1D angle2 = new Static1D(-90);
433
    Static3D center = new Static3D(0,0,0);
434
    Static3D move1  = new Static3D(IVY_M-0.5f,IVY_M-0.5f,0);
435

  
436
    VertexEffect[] effect = new VertexEffect[5];
437

  
438
    effect[0] = new VertexEffectScale(1/IVY_C);
439
    effect[1] = new VertexEffectMove(move1);
440
    effect[2] = new VertexEffectScale(new Static3D(1,1,-1));
441
    effect[3] = new VertexEffectRotate(angle1,axisX,center);
442
    effect[4] = new VertexEffectRotate(angle2,axisY,center);
443

  
444
    effect[2].setMeshAssociation(54,-1);  // meshes 1,2,4,5
445
    effect[3].setMeshAssociation(18,-1);  // meshes 1,4
446
    effect[4].setMeshAssociation(36,-1);  // meshes 2,5
447

  
448
    return effect;
449
    }
450

  
451
///////////////////////////////////////////////////////////////////////////////////////////////////
452

  
453
  VertexEffect[] createVertexEffectsRexEdge()
454
    {
455
    float E = 0.5f - REX_D;
456
    float F = 0.5f;
457
    float G = (float)Math.sqrt(E*E+F*F);
458
    float A = (float)((180/Math.PI)*Math.asin(E/G));
459

  
460
    Static3D move1 = new Static3D(    0.0f, -E/3, 0.0f);
461
    Static3D move2 = new Static3D(2*G/3 -F, +E/3, 0.0f);
462

  
463
    Static3D center0= new Static3D(0.0f, 0.0f, 0.0f);
464
    Static3D center1= new Static3D(  -F, 0.0f, 0.0f);
465
    Static3D center2= new Static3D(  +F, 0.0f, 0.0f);
466
    Static3D axisX  = new Static3D(1.0f, 0.0f, 0.0f);
467
    Static3D axisY  = new Static3D(0.0f, 1.0f, 0.0f);
468
    Static3D axisZ  = new Static3D(0.0f, 0.0f, 1.0f);
469

  
470
    Static1D angle180 = new Static1D(180);
471
    Static1D angle90  = new Static1D( 90);
472
    Static1D angle270 = new Static1D(270);
473
    Static1D angle1   = new Static1D(+A);
474
    Static1D angle2   = new Static1D(-A);
475

  
476
    VertexEffect[] effect = new VertexEffect[12];
477

  
478
    effect[0] = new VertexEffectMove(move1);
479
    effect[1] = new VertexEffectMove(move2);
480
    effect[2] = new VertexEffectRotate(  angle90, axisX, center0 );
481
    effect[3] = new VertexEffectRotate( angle270, axisX, center0 );
482
    effect[4] = new VertexEffectRotate( angle180, axisX, center0 );
483
    effect[5] = new VertexEffectRotate( angle180, axisY, center0 );
484
    effect[6] = new VertexEffectScale ( new Static3D(-1, 1, 1) );
485
    effect[7] = new VertexEffectScale ( new Static3D( 1,-1, 1) );
486
    effect[8] = new VertexEffectRotate(   angle1, axisY, center1);
487
    effect[9] = new VertexEffectRotate(   angle2, axisY, center2);
488
    effect[10]= new VertexEffectRotate(   angle2, axisZ, center1);
489
    effect[11]= new VertexEffectRotate(   angle1, axisZ, center2);
490

  
491
    effect[0].setMeshAssociation( 3,-1);  // meshes 0 & 1
492
    effect[1].setMeshAssociation(60,-1);  // meshes 2,3,4,5
493
    effect[2].setMeshAssociation( 2,-1);  // meshes 1
494
    effect[3].setMeshAssociation(12,-1);  // meshes 2,3
495
    effect[4].setMeshAssociation(48,-1);  // meshes 4,5
496
    effect[5].setMeshAssociation(32,-1);  // mesh 5
497
    effect[6].setMeshAssociation( 8,-1);  // apply to mesh 3
498
    effect[7].setMeshAssociation( 2,-1);  // apply to mesh 1
499
    effect[8].setMeshAssociation(16,-1);  // apply to mesh 4
500
    effect[9].setMeshAssociation(32,-1);  // apply to mesh 5
501
    effect[10].setMeshAssociation(4,-1);  // apply to mesh 2
502
    effect[11].setMeshAssociation(8,-1);  // apply to mesh 3
503

  
504
    return effect;
505
    }
506

  
507
///////////////////////////////////////////////////////////////////////////////////////////////////
508

  
509
  VertexEffect[] createVertexEffectsRexCorner()
510
    {
511
    Static3D center= new Static3D(0.0f, 0.0f, 0.0f);
512
    Static3D axisZ = new Static3D(0.0f, 0.0f, 1.0f);
513
    Static1D angle = new Static1D(225);
514

  
515
    VertexEffect[] effect = new VertexEffect[1];
516
    effect[0] = new VertexEffectRotate(angle, axisZ, center);
517

  
518
    return effect;
519
    }
520

  
521
///////////////////////////////////////////////////////////////////////////////////////////////////
522

  
523
  VertexEffect[] createCuboidEffects(int[] dimensions)
524
    {
525
    float X = dimensions[0];
526
    float Y = dimensions[1];
527
    float Z = dimensions[2];
528

  
529
    float MAX_XY = Math.max(X,Y);
530
    float MAX_XZ = Math.max(X,Z);
531
    float MAX_YZ = Math.max(Z,Y);
532

  
533
    Static1D angle = new Static1D(90);
534
    Static3D move  = new Static3D( 0.0f, 0.0f, 0.5f);
535
    Static3D axisX = new Static3D( 1.0f, 0.0f, 0.0f);
536
    Static3D axisY = new Static3D( 0.0f, 1.0f, 0.0f);
537
    Static3D center= new Static3D( 0.0f, 0.0f, 0.0f);
538

  
539
    Static3D scale3 = new Static3D(MAX_XY,MAX_XY,+Z);
540
    Static3D scale4 = new Static3D(MAX_XY,MAX_XY,-Z);
541
    Static3D scale5 = new Static3D(MAX_XZ,+Y,MAX_XZ);
542
    Static3D scale6 = new Static3D(MAX_XZ,-Y,MAX_XZ);
543
    Static3D scale7 = new Static3D(+X,MAX_YZ,MAX_YZ);
544
    Static3D scale8 = new Static3D(-X,MAX_YZ,MAX_YZ);
545

  
546
    VertexEffect[] effect = new VertexEffect[9];
547

  
548
    effect[0] = new VertexEffectMove(move);
549
    effect[1] = new VertexEffectRotate(angle, axisX, center);
550
    effect[2] = new VertexEffectRotate(angle, axisY, center);
551
    effect[3] = new VertexEffectScale(scale3);
552
    effect[4] = new VertexEffectScale(scale4);
553
    effect[5] = new VertexEffectScale(scale5);
554
    effect[6] = new VertexEffectScale(scale6);
555
    effect[7] = new VertexEffectScale(scale7);
556
    effect[8] = new VertexEffectScale(scale8);
557

  
558
    effect[1].setMeshAssociation(12,-1);  // meshes 2,3
559
    effect[2].setMeshAssociation( 3,-1);  // meshes 0,1
560
    effect[3].setMeshAssociation(16,-1);  // mesh 4
561
    effect[4].setMeshAssociation(32,-1);  // mesh 5
562
    effect[5].setMeshAssociation( 8,-1);  // mesh 3
563
    effect[6].setMeshAssociation( 4,-1);  // mesh 2
564
    effect[7].setMeshAssociation( 1,-1);  // mesh 0
565
    effect[8].setMeshAssociation( 2,-1);  // mesh 1
566

  
567
    return effect;
568
    }
569

  
570
///////////////////////////////////////////////////////////////////////////////////////////////////
571
// OBJECTS
572
///////////////////////////////////////////////////////////////////////////////////////////////////
573

  
574
  public MeshBase createIvyCornerMesh()
575
    {
576
    MeshBase mesh = createFacesIvyCorner();
577
    VertexEffect[] effects = createVertexEffectsIvyCorner();
578
    for( VertexEffect effect : effects ) mesh.apply(effect);
579

  
580
    Static3D center = new Static3D(-0.5f,-0.5f,-0.5f);
581
    Static3D[] vertices = new Static3D[4];
582
    vertices[0] = new Static3D(+0.0f,+0.0f,+0.0f);
583
    vertices[1] = new Static3D(-1.0f,+0.0f,+0.0f);
584
    vertices[2] = new Static3D(+0.0f,-1.0f,+0.0f);
585
    vertices[3] = new Static3D(+0.0f,+0.0f,-1.0f);
586

  
587
    roundCorners(mesh,center,vertices,0.03f,0.10f);
588

  
589
    mesh.mergeEffComponents();
590

  
591
    return mesh;
592
    }
593

  
594
///////////////////////////////////////////////////////////////////////////////////////////////////
595

  
596
  public MeshBase createIvyFaceMesh()
597
    {
598
    MeshBase mesh = createFacesIvyFace();
599

  
600
    Static3D center = new Static3D(-0.0f,-0.0f,-0.5f);
601
    Static3D[] vertices = new Static3D[2];
602
    vertices[0] = new Static3D(-0.5f,+0.5f,+0.0f);
603
    vertices[1] = new Static3D(+0.5f,-0.5f,+0.0f);
604

  
605
    roundCorners(mesh,center,vertices,0.03f,0.10f);
606

  
607
    mesh.mergeEffComponents();
608
    mesh.addEmptyTexComponent();
609
    mesh.addEmptyTexComponent();
610
    mesh.addEmptyTexComponent();
611
    mesh.addEmptyTexComponent();
612

  
613
    return mesh;
614
    }
615

  
616
///////////////////////////////////////////////////////////////////////////////////////////////////
617

  
618
  public MeshBase createRexCornerMesh()
619
    {
620
    MeshBase mesh = createFacesRexCorner();
621
    VertexEffect[] effects = createVertexEffectsRexCorner();
622
    for( VertexEffect effect : effects ) mesh.apply(effect);
623

  
624
    final float G = (1-REX_D)/3;
625
    Static3D center = new Static3D(0.0f,0.0f,-G*SQ2/2);
626
    Static3D[] vertices = new Static3D[1];
627
    vertices[0] = new Static3D(+G,-G,+0.0f);
628
    roundCorners(mesh,center,vertices,0.10f,0.10f);
629

  
630
    mesh.mergeEffComponents();
631
    mesh.addEmptyTexComponent();
632
    mesh.addEmptyTexComponent();
633
    mesh.addEmptyTexComponent();
634
    mesh.addEmptyTexComponent();
635

  
636
    return mesh;
637
    }
638

  
639
///////////////////////////////////////////////////////////////////////////////////////////////////
640

  
641
  public MeshBase createRexFaceMesh()
642
    {
643
    MeshBase mesh = createFacesRexFace();
644

  
645
    mesh.mergeEffComponents();
646
    mesh.addEmptyTexComponent();
647
    mesh.addEmptyTexComponent();
648
    mesh.addEmptyTexComponent();
649
    mesh.addEmptyTexComponent();
650

  
651
    return mesh;
652
    }
653

  
654
///////////////////////////////////////////////////////////////////////////////////////////////////
655

  
656
  public MeshBase createRexEdgeMesh()
657
    {
658
    MeshBase mesh = createFacesRexEdge();
659
    VertexEffect[] effects = createVertexEffectsRexEdge();
660
    for( VertexEffect effect : effects ) mesh.apply(effect);
661

  
662
    Static3D center = new Static3D(0.0f,-0.5f,-0.5f);
663
    Static3D[] vertices = new Static3D[2];
664
    vertices[0] = new Static3D(+0.5f,+0.0f,+0.0f);
665
    vertices[1] = new Static3D(-0.5f,+0.0f,+0.0f);
666
    roundCorners(mesh,center,vertices,0.06f,0.10f);
667

  
668
    mesh.mergeEffComponents();
669

  
670
    return mesh;
671
    }
672

  
673
///////////////////////////////////////////////////////////////////////////////////////////////////
674

  
675
  public MeshBase createCuboidMesh(int[] dimensions)
676
    {
677
    MeshBase mesh = createCuboid(dimensions);
678
    VertexEffect[] effects = createCuboidEffects(dimensions);
679
    for( VertexEffect effect : effects ) mesh.apply(effect);
680

  
681
    int X = dimensions[0];
682
    int Y = dimensions[1];
683
    int Z = dimensions[2];
684

  
685
    float strength = 0.04f;
686
    float radius   = 0.15f;
687

  
688
    Static3D[] vertices = new Static3D[1];
689
    Static3D center;
690

  
691
    vertices[0] = new Static3D(+0.5f*X,+0.5f*Y,+0.5f*Z);
692
    center = new Static3D(+0.5f*(X-1),+0.5f*(Y-1),+0.5f*(Z-1));
693
    roundCorners(mesh, center, vertices, strength, radius);
694

  
695
    vertices[0] = new Static3D(+0.5f*X,+0.5f*Y,-0.5f*Z);
696
    center = new Static3D(+0.5f*(X-1),+0.5f*(Y-1),-0.5f*(Z-1));
697
    roundCorners(mesh, center, vertices, strength, radius);
698

  
699
    vertices[0] = new Static3D(+0.5f*X,-0.5f*Y,+0.5f*Z);
700
    center = new Static3D(+0.5f*(X-1),-0.5f*(Y-1),+0.5f*(Z-1));
701
    roundCorners(mesh, center, vertices, strength, radius);
702

  
703
    vertices[0] = new Static3D(+0.5f*X,-0.5f*Y,-0.5f*Z);
704
    center = new Static3D(+0.5f*(X-1),-0.5f*(Y-1),-0.5f*(Z-1));
705
    roundCorners(mesh, center, vertices, strength, radius);
706

  
707
    vertices[0] = new Static3D(-0.5f*X,+0.5f*Y,+0.5f*Z);
708
    center = new Static3D(-0.5f*(X-1),+0.5f*(Y-1),+0.5f*(Z-1));
709
    roundCorners(mesh, center, vertices, strength, radius);
710

  
711
    vertices[0] = new Static3D(-0.5f*X,+0.5f*Y,-0.5f*Z);
712
    center = new Static3D(-0.5f*(X-1),+0.5f*(Y-1),-0.5f*(Z-1));
713
    roundCorners(mesh, center, vertices, strength, radius);
714

  
715
    vertices[0] = new Static3D(-0.5f*X,-0.5f*Y,+0.5f*Z);
716
    center = new Static3D(-0.5f*(X-1),-0.5f*(Y-1),+0.5f*(Z-1));
717
    roundCorners(mesh, center, vertices, strength, radius);
718

  
719
    vertices[0] = new Static3D(-0.5f*X,-0.5f*Y,-0.5f*Z);
720
    center = new Static3D(-0.5f*(X-1),-0.5f*(Y-1),-0.5f*(Z-1));
721
    roundCorners(mesh, center, vertices, strength, radius);
722

  
723
    mesh.mergeEffComponents();
724

  
725
    return mesh;
726
    }
727

  
728 140
///////////////////////////////////////////////////////////////////////////////////////////////////
729 141

  
730 142
  private boolean areColinear(double[][] vertices, int index1, int index2, int index3)
......
1249 661
///////////////////////////////////////////////////////////////////////////////////////////////////
1250 662
// PUBLIC
1251 663

  
664
  public float[] computeBands(float H, int alpha, float dist, float K, int N)
665
    {
666
    float[] bands = new float[2*N];
667

  
668
    bands[0] = 1.0f;
669
    bands[1] = 0.0f;
670

  
671
    float beta = (float)Math.atan(dist*Math.tan(Math.PI*alpha/180));
672
    float sinBeta = (float)Math.sin(beta);
673
    float cosBeta = (float)Math.cos(beta);
674
    float R = cosBeta<1.0f ? H/(1.0f-cosBeta) : 0.0f;
675
    float D = R*sinBeta;
676
    float B = h(R,sinBeta,K*beta);
677

  
678
    if( D>1.0f )
679
      {
680
      for(int i=1; i<N; i++)
681
        {
682
        bands[2*i  ] = (float)(N-1-i)/(N-1);
683
        bands[2*i+1] = H*(1-bands[2*i]);
684
        }
685
      }
686
    else
687
      {
688
      int K2 = (int)((N-3)*K);
689
      int K1 = (N-3)-K2;
690

  
691
      for(int i=0; i<=K1; i++)
692
        {
693
        float angle = K*beta + (1-K)*beta*(K1-i)/(K1+1);
694
        float x = h(R,sinBeta,angle);
695
        bands[2*i+2] = 1.0f - x;
696
        bands[2*i+3] = g(R,D,x,cosBeta);
697
        }
698

  
699
      for(int i=0; i<=K2; i++)
700
        {
701
        float x = (1-B)*(i+1)/(K2+1) + B;
702
        bands[2*K1+2 + 2*i+2] = 1.0f - x;
703
        bands[2*K1+2 + 2*i+3] = g(R,D,f(D,B,x),cosBeta);
704
        }
705
      }
706

  
707
    bands[2*N-2] = 0.0f;
708
    bands[2*N-1] =    H;
709

  
710
    return bands;
711
    }
712

  
713
///////////////////////////////////////////////////////////////////////////////////////////////////
714

  
715
  public void roundCorners(MeshBase mesh, Static3D center, Static3D[] vertices, float strength, float regionRadius)
716
    {
717
    Static4D reg= new Static4D(0,0,0,regionRadius);
718

  
719
    float centX = center.get0();
720
    float centY = center.get1();
721
    float centZ = center.get2();
722

  
723
    for (Static3D vertex : vertices)
724
      {
725
      float x = strength*(centX - vertex.get0());
726
      float y = strength*(centY - vertex.get1());
727
      float z = strength*(centZ - vertex.get2());
728

  
729
      VertexEffect effect = new VertexEffectDeform(new Static3D(x,y,z), RADIUS, vertex, reg);
730
      mesh.apply(effect);
731
      }
732
    }
733

  
734
///////////////////////////////////////////////////////////////////////////////////////////////////
735

  
1252 736
  public void printStickerCoords()
1253 737
    {
1254 738
    int stickers = mStickerCoords.size();

Also available in: Unified diff