aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorTeravus Ovares2008-08-18 08:25:58 +0000
committerTeravus Ovares2008-08-18 08:25:58 +0000
commit2ef4ccf89edc591319d0b43915b02d7bc8b8e3c9 (patch)
treed849e35dbcf2b7bef6d38b1fb06f753d9ae6efaf
parent* Maptile prim volume drawing change from manually drawing the rectangles usi... (diff)
downloadopensim-SC-2ef4ccf89edc591319d0b43915b02d7bc8b8e3c9.zip
opensim-SC-2ef4ccf89edc591319d0b43915b02d7bc8b8e3c9.tar.gz
opensim-SC-2ef4ccf89edc591319d0b43915b02d7bc8b8e3c9.tar.bz2
opensim-SC-2ef4ccf89edc591319d0b43915b02d7bc8b8e3c9.tar.xz
* Slightly better implementation of prim volume drawing on the maptile using projection of an oriented bounding box. This isn't quite right yet. Experimental. It takes about 3 times longer then the previous version, however produces better results.
-rw-r--r--OpenSim/Region/Environment/Modules/World/WorldMap/MapImageModule.cs187
1 files changed, 177 insertions, 10 deletions
diff --git a/OpenSim/Region/Environment/Modules/World/WorldMap/MapImageModule.cs b/OpenSim/Region/Environment/Modules/World/WorldMap/MapImageModule.cs
index 52ee84d..6d51c88 100644
--- a/OpenSim/Region/Environment/Modules/World/WorldMap/MapImageModule.cs
+++ b/OpenSim/Region/Environment/Modules/World/WorldMap/MapImageModule.cs
@@ -42,10 +42,24 @@ using libsecondlife;
42 42
43namespace OpenSim.Region.Environment.Modules.World.WorldMap 43namespace OpenSim.Region.Environment.Modules.World.WorldMap
44{ 44{
45 public struct RectangleDrawStruct 45 public enum DrawRoutine
46 { 46 {
47 Rectangle,
48 Polygon,
49 Ellipse
50 }
51
52 public struct face
53 {
54 public Point[] pts;
55 }
56
57 public struct DrawStruct
58 {
59 public DrawRoutine dr;
47 public Rectangle rect; 60 public Rectangle rect;
48 public SolidBrush brush; 61 public SolidBrush brush;
62 public face[] trns;
49 } 63 }
50 64
51 public class MapImageModule : IMapImageGenerator, IRegionModule 65 public class MapImageModule : IMapImageGenerator, IRegionModule
@@ -361,7 +375,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
361 tc = System.Environment.TickCount; 375 tc = System.Environment.TickCount;
362 m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile"); 376 m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile");
363 List<EntityBase> objs = whichScene.GetEntities(); 377 List<EntityBase> objs = whichScene.GetEntities();
364 Dictionary<uint, RectangleDrawStruct> z_sort = new Dictionary<uint, RectangleDrawStruct>(); 378 Dictionary<uint, DrawStruct> z_sort = new Dictionary<uint, DrawStruct>();
365 //SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>(); 379 //SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>();
366 List<float> z_sortheights = new List<float>(); 380 List<float> z_sortheights = new List<float>();
367 List<uint> z_localIDs = new List<uint>(); 381 List<uint> z_localIDs = new List<uint>();
@@ -463,10 +477,15 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
463 if (isBelow256AboveTerrain) 477 if (isBelow256AboveTerrain)
464 { 478 {
465 // Translate scale by rotation so scale is represented properly when object is rotated 479 // Translate scale by rotation so scale is represented properly when object is rotated
466 Vector3 scale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z); 480 Vector3 lscale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z);
481 Vector3 scale = new Vector3();
482 Vector3 tScale = new Vector3();
483 Vector3 axPos = new Vector3(pos.X,pos.Y,pos.Z);
484
485
467 LLQuaternion llrot = part.GetWorldRotation(); 486 LLQuaternion llrot = part.GetWorldRotation();
468 Quaternion rot = new Quaternion(llrot.W, llrot.X, llrot.Y, llrot.Z); 487 Quaternion rot = new Quaternion(llrot.W, llrot.X, llrot.Y, llrot.Z);
469 scale = rot * scale; 488 scale = rot * lscale;
470 489
471 // negative scales don't work in this situation 490 // negative scales don't work in this situation
472 scale.x = Math.Abs(scale.x); 491 scale.x = Math.Abs(scale.x);
@@ -485,13 +504,145 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
485 || mapdrawendY > 255) 504 || mapdrawendY > 255)
486 continue; 505 continue;
487 506
488 int wy = 0; 507#region obb face reconstruction part duex
508 Vector3[] vertexes = new Vector3[8];
509
510 // float[] distance = new float[6];
511 Vector3[] FaceA = new Vector3[6]; // vertex A for Facei
512 Vector3[] FaceB = new Vector3[6]; // vertex B for Facei
513 Vector3[] FaceC = new Vector3[6]; // vertex C for Facei
514 Vector3[] FaceD = new Vector3[6]; // vertex D for Facei
515
516 tScale = new Vector3(lscale.x, -lscale.y, lscale.z);
517 scale = ((rot * tScale));
518 vertexes[0] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
519 // vertexes[0].x = pos.X + vertexes[0].x;
520 //vertexes[0].y = pos.Y + vertexes[0].y;
521 //vertexes[0].z = pos.Z + vertexes[0].z;
522
523 FaceA[0] = vertexes[0];
524 FaceB[3] = vertexes[0];
525 FaceA[4] = vertexes[0];
526
527 tScale = lscale;
528 scale = ((rot * tScale));
529 vertexes[1] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
530
531 // vertexes[1].x = pos.X + vertexes[1].x;
532 // vertexes[1].y = pos.Y + vertexes[1].y;
533 //vertexes[1].z = pos.Z + vertexes[1].z;
534
535 FaceB[0] = vertexes[1];
536 FaceA[1] = vertexes[1];
537 FaceC[4] = vertexes[1];
538
539 tScale = new Vector3(lscale.x, -lscale.y, -lscale.z);
540 scale = ((rot * tScale));
541
542 vertexes[2] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
543
544 //vertexes[2].x = pos.X + vertexes[2].x;
545 //vertexes[2].y = pos.Y + vertexes[2].y;
546 //vertexes[2].z = pos.Z + vertexes[2].z;
547
548 FaceC[0] = vertexes[2];
549 FaceD[3] = vertexes[2];
550 FaceC[5] = vertexes[2];
551
552 tScale = new Vector3(lscale.x, lscale.y, -lscale.z);
553 scale = ((rot * tScale));
554 vertexes[3] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
555
556 //vertexes[3].x = pos.X + vertexes[3].x;
557 // vertexes[3].y = pos.Y + vertexes[3].y;
558 // vertexes[3].z = pos.Z + vertexes[3].z;
559
560 FaceD[0] = vertexes[3];
561 FaceC[1] = vertexes[3];
562 FaceA[5] = vertexes[3];
563
564 tScale = new Vector3(-lscale.x, lscale.y, lscale.z);
565 scale = ((rot * tScale));
566 vertexes[4] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
567
568 // vertexes[4].x = pos.X + vertexes[4].x;
569 // vertexes[4].y = pos.Y + vertexes[4].y;
570 // vertexes[4].z = pos.Z + vertexes[4].z;
571
572 FaceB[1] = vertexes[4];
573 FaceA[2] = vertexes[4];
574 FaceD[4] = vertexes[4];
575
576 tScale = new Vector3(-lscale.x, lscale.y, -lscale.z);
577 scale = ((rot * tScale));
578 vertexes[5] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
489 579
490 bool breakYN = false; // If we run into an error drawing, break out of the 580 // vertexes[5].x = pos.X + vertexes[5].x;
581 // vertexes[5].y = pos.Y + vertexes[5].y;
582 // vertexes[5].z = pos.Z + vertexes[5].z;
583
584 FaceD[1] = vertexes[5];
585 FaceC[2] = vertexes[5];
586 FaceB[5] = vertexes[5];
587
588 tScale = new Vector3(-lscale.x, -lscale.y, lscale.z);
589 scale = ((rot * tScale));
590 vertexes[6] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
591
592 // vertexes[6].x = pos.X + vertexes[6].x;
593 // vertexes[6].y = pos.Y + vertexes[6].y;
594 // vertexes[6].z = pos.Z + vertexes[6].z;
595
596 FaceB[2] = vertexes[6];
597 FaceA[3] = vertexes[6];
598 FaceB[4] = vertexes[6];
599
600 tScale = new Vector3(-lscale.x, -lscale.y, -lscale.z);
601 scale = ((rot * tScale));
602 vertexes[7] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
603
604 // vertexes[7].x = pos.X + vertexes[7].x;
605 // vertexes[7].y = pos.Y + vertexes[7].y;
606 // vertexes[7].z = pos.Z + vertexes[7].z;
607
608 FaceD[2] = vertexes[7];
609 FaceC[3] = vertexes[7];
610 FaceD[5] = vertexes[7];
611#endregion
612
613 //int wy = 0;
614
615 //bool breakYN = false; // If we run into an error drawing, break out of the
491 // loop so we don't lag to death on error handling 616 // loop so we don't lag to death on error handling
492 RectangleDrawStruct ds = new RectangleDrawStruct(); 617 DrawStruct ds = new DrawStruct();
493 ds.brush = new SolidBrush(mapdotspot); 618 ds.brush = new SolidBrush(mapdotspot);
494 ds.rect = new Rectangle(mapdrawstartX, (255 - mapdrawstartY), mapdrawendX - mapdrawstartX, mapdrawendY - mapdrawstartY); 619 //ds.rect = new Rectangle(mapdrawstartX, (255 - mapdrawstartY), mapdrawendX - mapdrawstartX, mapdrawendY - mapdrawstartY);
620
621
622 ds.trns = new face[FaceA.Length];
623
624
625
626 for (int i = 0; i < FaceA.Length; i++)
627 {
628
629 Point[] working = new Point[5];
630 working[0] = project(FaceA[i], axPos);
631 working[1] = project(FaceB[i], axPos);
632 working[2] = project(FaceD[i], axPos);
633 working[3] = project(FaceC[i], axPos);
634 working[4] = project(FaceA[i], axPos);
635
636 face workingface = new face();
637 workingface.pts = working;
638
639 ds.trns[i] = workingface;
640
641 }
642
643
644
645
495 z_sort.Add(part.LocalId, ds); 646 z_sort.Add(part.LocalId, ds);
496 z_localIDs.Add(part.LocalId); 647 z_localIDs.Add(part.LocalId);
497 z_sortheights.Add(pos.Z); 648 z_sortheights.Add(pos.Z);
@@ -541,8 +692,12 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
541 692
542 if (z_sort.ContainsKey(sortedlocalIds[s])) 693 if (z_sort.ContainsKey(sortedlocalIds[s]))
543 { 694 {
544 RectangleDrawStruct rectDrawStruct = z_sort[sortedlocalIds[s]]; 695 DrawStruct rectDrawStruct = z_sort[sortedlocalIds[s]];
545 g.FillRectangle(rectDrawStruct.brush , rectDrawStruct.rect); 696 for (int r = 0; r < rectDrawStruct.trns.Length; r++ )
697 {
698 g.FillPolygon(rectDrawStruct.brush,rectDrawStruct.trns[r].pts);
699 }
700 //g.FillRectangle(rectDrawStruct.brush , rectDrawStruct.rect);
546 } 701 }
547 } 702 }
548 703
@@ -553,6 +708,18 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
553 m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (System.Environment.TickCount - tc) + " ms"); 708 m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (System.Environment.TickCount - tc) + " ms");
554 return mapbmp; 709 return mapbmp;
555 } 710 }
711 private Point project(Vector3 point3d, Vector3 originpos)
712 {
713 Point returnpt = new Point();
714 //originpos = point3d;
715 Vector3 topos = new Vector3(255, 255, 255);//(originpos.x * 256) / originpos.x);
716 float z = -point3d.z - topos.z;
717 returnpt.X = (int)((topos.x - point3d.x) / z * 255) + 255;
718 returnpt.Y = (int)(255 - (((topos.y - point3d.y) / z * 255) + 255));
719
720 return returnpt;
721
722 }
556 723
557// TODO: unused: 724// TODO: unused:
558// #region Deprecated Maptile Generation. Adam may update this 725// #region Deprecated Maptile Generation. Adam may update this