aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/Meshing
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/Meshing')
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs298
1 files changed, 297 insertions, 1 deletions
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index d4c9926..e9997a0 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Physics.Meshing
58 // Setting baseDir to a path will enable the dumping of raw files 58 // Setting baseDir to a path will enable the dumping of raw files
59 // raw files can be imported by blender so a visual inspection of the results can be done 59 // raw files can be imported by blender so a visual inspection of the results can be done
60 // const string baseDir = "rawFiles"; 60 // const string baseDir = "rawFiles";
61 private const string baseDir = null; 61 private const string baseDir = "rawFiles";
62 62
63 private static void IntersectionParameterPD(PhysicsVector p1, PhysicsVector r1, PhysicsVector p2, 63 private static void IntersectionParameterPD(PhysicsVector p1, PhysicsVector r1, PhysicsVector p2,
64 PhysicsVector r2, ref float lambda, ref float mu) 64 PhysicsVector r2, ref float lambda, ref float mu)
@@ -302,7 +302,296 @@ namespace OpenSim.Region.Physics.Meshing
302 result.DumpRaw(baseDir, primName, "Z extruded"); 302 result.DumpRaw(baseDir, primName, "Z extruded");
303 return result; 303 return result;
304 } 304 }
305 private static Mesh CreateCyllinderMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size)
306 // Builds the z (+ and -) surfaces of a box shaped prim
307 {
308 UInt16 hollowFactor = primShape.ProfileHollow;
309 UInt16 profileBegin = primShape.ProfileBegin;
310 UInt16 profileEnd = primShape.ProfileEnd;
311
312 // Procedure: This is based on the fact that the upper (plus) and lower (minus) Z-surface
313 // of a block are basically the same
314 // They may be warped differently but the shape is identical
315 // So we only create one surface as a model and derive both plus and minus surface of the block from it
316 // This is done in a model space where the block spans from -.5 to +.5 in X and Y
317 // The mapping to Scene space is done later during the "extrusion" phase
318
319 // Base
320 // Q1Q15 = Quadrant 1, Quadrant1, Vertex 5
321 Vertex Q1Q15 = new Vertex(-0.35f, -0.35f, 0.0f);
322 Vertex Q1Q16 = new Vertex(-0.30f, -0.40f, 0.0f);
323 Vertex Q1Q17 = new Vertex(-0.24f, -0.43f, 0.0f);
324 Vertex Q1Q18 = new Vertex(-0.18f, -0.46f, 0.0f);
325 Vertex Q1Q19 = new Vertex(-0.11f, -0.48f, 0.0f);
326
327 Vertex Q2Q10 = new Vertex(+0.0f, -0.50f, 0.0f);
328 Vertex Q2Q11 = new Vertex(+0.11f, -0.48f, 0.0f);
329 Vertex Q2Q12 = new Vertex(+0.18f, -0.46f, 0.0f);
330 Vertex Q2Q13 = new Vertex(+0.24f, -0.43f, 0.0f);
331 Vertex Q2Q14 = new Vertex(+0.30f, -0.40f, 0.0f);
332 Vertex Q2Q15 = new Vertex(+0.35f, -0.35f, 0.0f);
333 Vertex Q2Q16 = new Vertex(+0.40f, -0.30f, 0.0f);
334 Vertex Q2Q17 = new Vertex(+0.43f, -0.24f, 0.0f);
335 Vertex Q2Q18 = new Vertex(+0.46f, -0.18f, 0.0f);
336 Vertex Q2Q19 = new Vertex(+0.48f, -0.11f, 0.0f);
337
338 Vertex Q2Q20 = new Vertex(+0.50f, +0.0f, 0.0f);
339 Vertex Q2Q21 = new Vertex(+0.48f, +0.11f, 0.0f);
340 Vertex Q2Q22 = new Vertex(+0.46f, +0.18f, 0.0f);
341 Vertex Q2Q23 = new Vertex(+0.43f, +0.24f, 0.0f);
342 Vertex Q2Q24 = new Vertex(+0.40f, +0.30f, 0.0f);
343 Vertex Q2Q25 = new Vertex(+0.35f, +0.35f, 0.0f);
344 Vertex Q2Q26 = new Vertex(+0.30f, +0.40f, 0.0f);
345 Vertex Q2Q27 = new Vertex(+0.24f, +0.43f, 0.0f);
346 Vertex Q2Q28 = new Vertex(+0.18f, +0.46f, 0.0f);
347 Vertex Q2Q29 = new Vertex(+0.11f, +0.48f, 0.0f);
348
349 Vertex Q1Q20 = new Vertex(+0.0f, +0.50f, 0.0f);
350 Vertex Q1Q21 = new Vertex(-0.11f, +0.48f, 0.0f);
351 Vertex Q1Q22 = new Vertex(-0.18f, +0.46f, 0.0f);
352 Vertex Q1Q23 = new Vertex(-0.24f, +0.43f, 0.0f);
353 Vertex Q1Q24 = new Vertex(-0.30f, +0.40f, 0.0f);
354 Vertex Q1Q25 = new Vertex(-0.35f, +0.35f, 0.0f);
355 Vertex Q1Q26 = new Vertex(-0.40f, +0.30f, 0.0f);
356 Vertex Q1Q27 = new Vertex(-0.43f, +0.24f, 0.0f);
357 Vertex Q1Q28 = new Vertex(-0.46f, +0.18f, 0.0f);
358 Vertex Q1Q29 = new Vertex(-0.48f, +0.11f, 0.0f);
359
360 Vertex Q1Q10 = new Vertex(-0.50f, +0.0f, 0.0f);
361 Vertex Q1Q11 = new Vertex(-0.48f, -0.11f, 0.0f);
362 Vertex Q1Q12 = new Vertex(-0.46f, -0.18f, 0.0f);
363 Vertex Q1Q13 = new Vertex(-0.43f, -0.24f, 0.0f);
364 Vertex Q1Q14 = new Vertex(-0.40f, -0.30f, 0.0f);
365
366
367 SimpleHull outerHull = new SimpleHull();
368 outerHull.AddVertex(Q1Q15);
369 outerHull.AddVertex(Q1Q16);
370 outerHull.AddVertex(Q1Q17);
371 outerHull.AddVertex(Q1Q18);
372 outerHull.AddVertex(Q1Q19);
373
374 outerHull.AddVertex(Q2Q10);
375 outerHull.AddVertex(Q2Q11);
376 outerHull.AddVertex(Q2Q12);
377 outerHull.AddVertex(Q2Q13);
378 outerHull.AddVertex(Q2Q14);
379 outerHull.AddVertex(Q2Q15);
380 outerHull.AddVertex(Q2Q16);
381 outerHull.AddVertex(Q2Q17);
382 outerHull.AddVertex(Q2Q18);
383 outerHull.AddVertex(Q2Q19);
384
385 outerHull.AddVertex(Q2Q20);
386 outerHull.AddVertex(Q2Q21);
387 outerHull.AddVertex(Q2Q22);
388 outerHull.AddVertex(Q2Q23);
389 outerHull.AddVertex(Q2Q24);
390 outerHull.AddVertex(Q2Q25);
391 outerHull.AddVertex(Q2Q26);
392 outerHull.AddVertex(Q2Q27);
393 outerHull.AddVertex(Q2Q28);
394 outerHull.AddVertex(Q2Q29);
395
396 outerHull.AddVertex(Q1Q20);
397 outerHull.AddVertex(Q1Q21);
398 outerHull.AddVertex(Q1Q22);
399 outerHull.AddVertex(Q1Q23);
400 outerHull.AddVertex(Q1Q24);
401 outerHull.AddVertex(Q1Q25);
402 outerHull.AddVertex(Q1Q26);
403 outerHull.AddVertex(Q1Q27);
404 outerHull.AddVertex(Q1Q28);
405 outerHull.AddVertex(Q1Q29);
406
407 outerHull.AddVertex(Q1Q10);
408 outerHull.AddVertex(Q1Q11);
409 outerHull.AddVertex(Q1Q12);
410 outerHull.AddVertex(Q1Q13);
411 outerHull.AddVertex(Q1Q14);
412
413 // Deal with cuts now
414 if ((profileBegin != 0) || (profileEnd != 0))
415 {
416 double fProfileBeginAngle = profileBegin / 50000.0 * 360.0;
417 // In degree, for easier debugging and understanding
418 fProfileBeginAngle -= (90.0 + 45.0); // for some reasons, the SL client counts from the corner -X/-Y
419 double fProfileEndAngle = 360.0 - profileEnd / 50000.0 * 360.0; // Pathend comes as complement to 1.0
420 fProfileEndAngle -= (90.0 + 45.0);
421 if (fProfileBeginAngle < fProfileEndAngle)
422 fProfileEndAngle -= 360.0;
423
424 // Note, that we don't want to cut out a triangle, even if this is a
425 // good approximation for small cuts. Indeed we want to cut out an arc
426 // and we approximate this arc by a polygon chain
427 // Also note, that these vectors are of length 1.0 and thus their endpoints lay outside the model space
428 // So it can easily be subtracted from the outer hull
429 int iSteps = (int)(((fProfileBeginAngle - fProfileEndAngle) / 45.0) + .5);
430 // how many steps do we need with approximately 45 degree
431 double dStepWidth = (fProfileBeginAngle - fProfileEndAngle) / iSteps;
432
433 Vertex origin = new Vertex(0.0f, 0.0f, 0.0f);
434
435 // Note the sequence of vertices here. It's important to have the other rotational sense than in outerHull
436 SimpleHull cutHull = new SimpleHull();
437 cutHull.AddVertex(origin);
438 for (int i = 0; i < iSteps; i++)
439 {
440 double angle = fProfileBeginAngle - i * dStepWidth; // we count against the angle orientation!!!!
441 Vertex v = Vertex.FromAngle(angle * Math.PI / 180.0);
442 cutHull.AddVertex(v);
443 }
444 Vertex legEnd = Vertex.FromAngle(fProfileEndAngle * Math.PI / 180.0);
445 // Calculated separately to avoid errors
446 cutHull.AddVertex(legEnd);
447
448 m_log.Debug(String.Format("Starting cutting of the hollow shape from the prim {1}", 0, primName));
449 SimpleHull cuttedHull = SimpleHull.SubtractHull(outerHull, cutHull);
450
451 outerHull = cuttedHull;
452 }
453
454 // Deal with the hole here
455 if (hollowFactor > 0)
456 {
457 float hollowFactorF = (float)hollowFactor / (float)50000;
458
459 Vertex IQ1Q15 = new Vertex(-0.35f * hollowFactorF, -0.35f * hollowFactorF, 0.0f);
460 Vertex IQ1Q16 = new Vertex(-0.30f * hollowFactorF, -0.40f * hollowFactorF, 0.0f);
461 Vertex IQ1Q17 = new Vertex(-0.24f * hollowFactorF, -0.43f * hollowFactorF, 0.0f);
462 Vertex IQ1Q18 = new Vertex(-0.18f * hollowFactorF, -0.46f * hollowFactorF, 0.0f);
463 Vertex IQ1Q19 = new Vertex(-0.11f * hollowFactorF, -0.48f * hollowFactorF, 0.0f);
464
465 Vertex IQ2Q10 = new Vertex(+0.0f * hollowFactorF, -0.50f * hollowFactorF, 0.0f);
466 Vertex IQ2Q11 = new Vertex(+0.11f * hollowFactorF, -0.48f * hollowFactorF, 0.0f);
467 Vertex IQ2Q12 = new Vertex(+0.18f * hollowFactorF, -0.46f * hollowFactorF, 0.0f);
468 Vertex IQ2Q13 = new Vertex(+0.24f * hollowFactorF, -0.43f * hollowFactorF, 0.0f);
469 Vertex IQ2Q14 = new Vertex(+0.30f * hollowFactorF, -0.40f * hollowFactorF, 0.0f);
470 Vertex IQ2Q15 = new Vertex(+0.35f * hollowFactorF, -0.35f * hollowFactorF, 0.0f);
471 Vertex IQ2Q16 = new Vertex(+0.40f * hollowFactorF, -0.30f * hollowFactorF, 0.0f);
472 Vertex IQ2Q17 = new Vertex(+0.43f * hollowFactorF, -0.24f * hollowFactorF, 0.0f);
473 Vertex IQ2Q18 = new Vertex(+0.46f * hollowFactorF, -0.18f * hollowFactorF, 0.0f);
474 Vertex IQ2Q19 = new Vertex(+0.48f * hollowFactorF, -0.11f * hollowFactorF, 0.0f);
475
476 Vertex IQ2Q20 = new Vertex(+0.50f * hollowFactorF, +0.0f * hollowFactorF, 0.0f);
477 Vertex IQ2Q21 = new Vertex(+0.48f * hollowFactorF, +0.11f * hollowFactorF, 0.0f);
478 Vertex IQ2Q22 = new Vertex(+0.46f * hollowFactorF, +0.18f * hollowFactorF, 0.0f);
479 Vertex IQ2Q23 = new Vertex(+0.43f * hollowFactorF, +0.24f * hollowFactorF, 0.0f);
480 Vertex IQ2Q24 = new Vertex(+0.40f * hollowFactorF, +0.30f * hollowFactorF, 0.0f);
481 Vertex IQ2Q25 = new Vertex(+0.35f * hollowFactorF, +0.35f * hollowFactorF, 0.0f);
482 Vertex IQ2Q26 = new Vertex(+0.30f * hollowFactorF, +0.40f * hollowFactorF, 0.0f);
483 Vertex IQ2Q27 = new Vertex(+0.24f * hollowFactorF, +0.43f * hollowFactorF, 0.0f);
484 Vertex IQ2Q28 = new Vertex(+0.18f * hollowFactorF, +0.46f * hollowFactorF, 0.0f);
485 Vertex IQ2Q29 = new Vertex(+0.11f * hollowFactorF, +0.48f * hollowFactorF, 0.0f);
486
487 Vertex IQ1Q20 = new Vertex(+0.0f * hollowFactorF, +0.50f * hollowFactorF, 0.0f);
488 Vertex IQ1Q21 = new Vertex(-0.11f * hollowFactorF, +0.48f * hollowFactorF, 0.0f);
489 Vertex IQ1Q22 = new Vertex(-0.18f * hollowFactorF, +0.46f * hollowFactorF, 0.0f);
490 Vertex IQ1Q23 = new Vertex(-0.24f * hollowFactorF, +0.43f * hollowFactorF, 0.0f);
491 Vertex IQ1Q24 = new Vertex(-0.30f * hollowFactorF, +0.40f * hollowFactorF, 0.0f);
492 Vertex IQ1Q25 = new Vertex(-0.35f * hollowFactorF, +0.35f * hollowFactorF, 0.0f);
493 Vertex IQ1Q26 = new Vertex(-0.40f * hollowFactorF, +0.30f * hollowFactorF, 0.0f);
494 Vertex IQ1Q27 = new Vertex(-0.43f * hollowFactorF, +0.24f * hollowFactorF, 0.0f);
495 Vertex IQ1Q28 = new Vertex(-0.46f * hollowFactorF, +0.18f * hollowFactorF, 0.0f);
496 Vertex IQ1Q29 = new Vertex(-0.48f * hollowFactorF, +0.11f * hollowFactorF, 0.0f);
497
498 Vertex IQ1Q10 = new Vertex(-0.50f * hollowFactorF, +0.0f * hollowFactorF, 0.0f);
499 Vertex IQ1Q11 = new Vertex(-0.48f * hollowFactorF, -0.11f * hollowFactorF, 0.0f);
500 Vertex IQ1Q12 = new Vertex(-0.46f * hollowFactorF, -0.18f * hollowFactorF, 0.0f);
501 Vertex IQ1Q13 = new Vertex(-0.43f * hollowFactorF, -0.24f * hollowFactorF, 0.0f);
502 Vertex IQ1Q14 = new Vertex(-0.40f * hollowFactorF, -0.30f * hollowFactorF, 0.0f);
305 503
504 SimpleHull holeHull = new SimpleHull();
505 holeHull.AddVertex(Q1Q15);
506 holeHull.AddVertex(Q1Q16);
507 holeHull.AddVertex(Q1Q17);
508 holeHull.AddVertex(Q1Q18);
509 holeHull.AddVertex(Q1Q19);
510
511 holeHull.AddVertex(IQ2Q10);
512 holeHull.AddVertex(IQ2Q11);
513 holeHull.AddVertex(IQ2Q12);
514 holeHull.AddVertex(IQ2Q13);
515 holeHull.AddVertex(IQ2Q14);
516 holeHull.AddVertex(IQ2Q15);
517 holeHull.AddVertex(IQ2Q16);
518 holeHull.AddVertex(IQ2Q17);
519 holeHull.AddVertex(IQ2Q18);
520 holeHull.AddVertex(IQ2Q19);
521
522 holeHull.AddVertex(IQ2Q20);
523 holeHull.AddVertex(IQ2Q21);
524 holeHull.AddVertex(IQ2Q22);
525 holeHull.AddVertex(IQ2Q23);
526 holeHull.AddVertex(IQ2Q24);
527 holeHull.AddVertex(IQ2Q25);
528 holeHull.AddVertex(IQ2Q26);
529 holeHull.AddVertex(IQ2Q27);
530 holeHull.AddVertex(IQ2Q28);
531 holeHull.AddVertex(IQ2Q29);
532
533 holeHull.AddVertex(IQ1Q20);
534 holeHull.AddVertex(IQ1Q21);
535 holeHull.AddVertex(IQ1Q22);
536 holeHull.AddVertex(IQ1Q23);
537 holeHull.AddVertex(IQ1Q24);
538 holeHull.AddVertex(IQ1Q25);
539 holeHull.AddVertex(IQ1Q26);
540 holeHull.AddVertex(IQ1Q27);
541 holeHull.AddVertex(IQ1Q28);
542 holeHull.AddVertex(IQ1Q29);
543
544 holeHull.AddVertex(IQ1Q10);
545 holeHull.AddVertex(IQ1Q11);
546 holeHull.AddVertex(IQ1Q12);
547 holeHull.AddVertex(IQ1Q13);
548 holeHull.AddVertex(IQ1Q14);
549
550
551 SimpleHull hollowedHull = SimpleHull.SubtractHull(outerHull, holeHull);
552
553 outerHull = hollowedHull;
554 }
555
556 Mesh m = new Mesh();
557
558 Vertex Seed1 = new Vertex(0.0f, -10.0f, 0.0f);
559 Vertex Seed2 = new Vertex(-10.0f, 10.0f, 0.0f);
560 Vertex Seed3 = new Vertex(10.0f, 10.0f, 0.0f);
561
562 m.Add(Seed1);
563 m.Add(Seed2);
564 m.Add(Seed3);
565
566 m.Add(new Triangle(Seed1, Seed2, Seed3));
567 m.Add(outerHull.getVertices());
568
569 InsertVertices(m.vertices, 3, m.triangles);
570 m.DumpRaw(baseDir, primName, "Proto first Mesh");
571
572 m.Remove(Seed1);
573 m.Remove(Seed2);
574 m.Remove(Seed3);
575 m.DumpRaw(baseDir, primName, "Proto seeds removed");
576
577 m.RemoveTrianglesOutside(outerHull);
578 m.DumpRaw(baseDir, primName, "Proto outsides removed");
579
580 foreach (Triangle t in m.triangles)
581 {
582 PhysicsVector n = t.getNormal();
583 if (n.Z < 0.0)
584 t.invertNormal();
585 }
586
587 Extruder extr = new Extruder();
588
589 extr.size = size;
590
591 Mesh result = extr.Extrude(m);
592 result.DumpRaw(baseDir, primName, "Z extruded");
593 return result;
594 }
306 public static void CalcNormals(Mesh mesh) 595 public static void CalcNormals(Mesh mesh)
307 { 596 {
308 int iTriangles = mesh.triangles.Count; 597 int iTriangles = mesh.triangles.Count;
@@ -374,6 +663,13 @@ namespace OpenSim.Region.Physics.Meshing
374 mesh = CreateBoxMesh(primName, primShape, size); 663 mesh = CreateBoxMesh(primName, primShape, size);
375 CalcNormals(mesh); 664 CalcNormals(mesh);
376 break; 665 break;
666 case ProfileShape.Circle:
667 if (primShape.PathCurve == (byte)Extrusion.Straight)
668 {
669 mesh = CreateCyllinderMesh(primName, primShape, size);
670 CalcNormals(mesh);
671 }
672 break;
377 default: 673 default:
378 mesh = CreateBoxMesh(primName, primShape, size); 674 mesh = CreateBoxMesh(primName, primShape, size);
379 CalcNormals(mesh); 675 CalcNormals(mesh);