* 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.
parent
f842ad4192
commit
2ef4ccf89e
|
@ -42,10 +42,24 @@ using libsecondlife;
|
||||||
|
|
||||||
namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
{
|
{
|
||||||
public struct RectangleDrawStruct
|
public enum DrawRoutine
|
||||||
{
|
{
|
||||||
|
Rectangle,
|
||||||
|
Polygon,
|
||||||
|
Ellipse
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct face
|
||||||
|
{
|
||||||
|
public Point[] pts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct DrawStruct
|
||||||
|
{
|
||||||
|
public DrawRoutine dr;
|
||||||
public Rectangle rect;
|
public Rectangle rect;
|
||||||
public SolidBrush brush;
|
public SolidBrush brush;
|
||||||
|
public face[] trns;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MapImageModule : IMapImageGenerator, IRegionModule
|
public class MapImageModule : IMapImageGenerator, IRegionModule
|
||||||
|
@ -361,7 +375,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
tc = System.Environment.TickCount;
|
tc = System.Environment.TickCount;
|
||||||
m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile");
|
m_log.Info("[MAPTILE]: Generating Maptile Step 2: Object Volume Profile");
|
||||||
List<EntityBase> objs = whichScene.GetEntities();
|
List<EntityBase> objs = whichScene.GetEntities();
|
||||||
Dictionary<uint, RectangleDrawStruct> z_sort = new Dictionary<uint, RectangleDrawStruct>();
|
Dictionary<uint, DrawStruct> z_sort = new Dictionary<uint, DrawStruct>();
|
||||||
//SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>();
|
//SortedList<float, RectangleDrawStruct> z_sort = new SortedList<float, RectangleDrawStruct>();
|
||||||
List<float> z_sortheights = new List<float>();
|
List<float> z_sortheights = new List<float>();
|
||||||
List<uint> z_localIDs = new List<uint>();
|
List<uint> z_localIDs = new List<uint>();
|
||||||
|
@ -463,10 +477,15 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
if (isBelow256AboveTerrain)
|
if (isBelow256AboveTerrain)
|
||||||
{
|
{
|
||||||
// Translate scale by rotation so scale is represented properly when object is rotated
|
// Translate scale by rotation so scale is represented properly when object is rotated
|
||||||
Vector3 scale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z);
|
Vector3 lscale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z);
|
||||||
|
Vector3 scale = new Vector3();
|
||||||
|
Vector3 tScale = new Vector3();
|
||||||
|
Vector3 axPos = new Vector3(pos.X,pos.Y,pos.Z);
|
||||||
|
|
||||||
|
|
||||||
LLQuaternion llrot = part.GetWorldRotation();
|
LLQuaternion llrot = part.GetWorldRotation();
|
||||||
Quaternion rot = new Quaternion(llrot.W, llrot.X, llrot.Y, llrot.Z);
|
Quaternion rot = new Quaternion(llrot.W, llrot.X, llrot.Y, llrot.Z);
|
||||||
scale = rot * scale;
|
scale = rot * lscale;
|
||||||
|
|
||||||
// negative scales don't work in this situation
|
// negative scales don't work in this situation
|
||||||
scale.x = Math.Abs(scale.x);
|
scale.x = Math.Abs(scale.x);
|
||||||
|
@ -485,13 +504,145 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
|| mapdrawendY > 255)
|
|| mapdrawendY > 255)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int wy = 0;
|
#region obb face reconstruction part duex
|
||||||
|
Vector3[] vertexes = new Vector3[8];
|
||||||
|
|
||||||
bool breakYN = false; // If we run into an error drawing, break out of the
|
// float[] distance = new float[6];
|
||||||
|
Vector3[] FaceA = new Vector3[6]; // vertex A for Facei
|
||||||
|
Vector3[] FaceB = new Vector3[6]; // vertex B for Facei
|
||||||
|
Vector3[] FaceC = new Vector3[6]; // vertex C for Facei
|
||||||
|
Vector3[] FaceD = new Vector3[6]; // vertex D for Facei
|
||||||
|
|
||||||
|
tScale = new Vector3(lscale.x, -lscale.y, lscale.z);
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
vertexes[0] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
// vertexes[0].x = pos.X + vertexes[0].x;
|
||||||
|
//vertexes[0].y = pos.Y + vertexes[0].y;
|
||||||
|
//vertexes[0].z = pos.Z + vertexes[0].z;
|
||||||
|
|
||||||
|
FaceA[0] = vertexes[0];
|
||||||
|
FaceB[3] = vertexes[0];
|
||||||
|
FaceA[4] = vertexes[0];
|
||||||
|
|
||||||
|
tScale = lscale;
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
vertexes[1] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
|
||||||
|
// vertexes[1].x = pos.X + vertexes[1].x;
|
||||||
|
// vertexes[1].y = pos.Y + vertexes[1].y;
|
||||||
|
//vertexes[1].z = pos.Z + vertexes[1].z;
|
||||||
|
|
||||||
|
FaceB[0] = vertexes[1];
|
||||||
|
FaceA[1] = vertexes[1];
|
||||||
|
FaceC[4] = vertexes[1];
|
||||||
|
|
||||||
|
tScale = new Vector3(lscale.x, -lscale.y, -lscale.z);
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
|
||||||
|
vertexes[2] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
|
||||||
|
//vertexes[2].x = pos.X + vertexes[2].x;
|
||||||
|
//vertexes[2].y = pos.Y + vertexes[2].y;
|
||||||
|
//vertexes[2].z = pos.Z + vertexes[2].z;
|
||||||
|
|
||||||
|
FaceC[0] = vertexes[2];
|
||||||
|
FaceD[3] = vertexes[2];
|
||||||
|
FaceC[5] = vertexes[2];
|
||||||
|
|
||||||
|
tScale = new Vector3(lscale.x, lscale.y, -lscale.z);
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
vertexes[3] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
|
||||||
|
//vertexes[3].x = pos.X + vertexes[3].x;
|
||||||
|
// vertexes[3].y = pos.Y + vertexes[3].y;
|
||||||
|
// vertexes[3].z = pos.Z + vertexes[3].z;
|
||||||
|
|
||||||
|
FaceD[0] = vertexes[3];
|
||||||
|
FaceC[1] = vertexes[3];
|
||||||
|
FaceA[5] = vertexes[3];
|
||||||
|
|
||||||
|
tScale = new Vector3(-lscale.x, lscale.y, lscale.z);
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
vertexes[4] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
|
||||||
|
// vertexes[4].x = pos.X + vertexes[4].x;
|
||||||
|
// vertexes[4].y = pos.Y + vertexes[4].y;
|
||||||
|
// vertexes[4].z = pos.Z + vertexes[4].z;
|
||||||
|
|
||||||
|
FaceB[1] = vertexes[4];
|
||||||
|
FaceA[2] = vertexes[4];
|
||||||
|
FaceD[4] = vertexes[4];
|
||||||
|
|
||||||
|
tScale = new Vector3(-lscale.x, lscale.y, -lscale.z);
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
vertexes[5] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
|
||||||
|
// vertexes[5].x = pos.X + vertexes[5].x;
|
||||||
|
// vertexes[5].y = pos.Y + vertexes[5].y;
|
||||||
|
// vertexes[5].z = pos.Z + vertexes[5].z;
|
||||||
|
|
||||||
|
FaceD[1] = vertexes[5];
|
||||||
|
FaceC[2] = vertexes[5];
|
||||||
|
FaceB[5] = vertexes[5];
|
||||||
|
|
||||||
|
tScale = new Vector3(-lscale.x, -lscale.y, lscale.z);
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
vertexes[6] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
|
||||||
|
// vertexes[6].x = pos.X + vertexes[6].x;
|
||||||
|
// vertexes[6].y = pos.Y + vertexes[6].y;
|
||||||
|
// vertexes[6].z = pos.Z + vertexes[6].z;
|
||||||
|
|
||||||
|
FaceB[2] = vertexes[6];
|
||||||
|
FaceA[3] = vertexes[6];
|
||||||
|
FaceB[4] = vertexes[6];
|
||||||
|
|
||||||
|
tScale = new Vector3(-lscale.x, -lscale.y, -lscale.z);
|
||||||
|
scale = ((rot * tScale));
|
||||||
|
vertexes[7] = (new Vector3((pos.X + scale.x), (pos.Y + scale.y), (pos.Z + scale.z)));
|
||||||
|
|
||||||
|
// vertexes[7].x = pos.X + vertexes[7].x;
|
||||||
|
// vertexes[7].y = pos.Y + vertexes[7].y;
|
||||||
|
// vertexes[7].z = pos.Z + vertexes[7].z;
|
||||||
|
|
||||||
|
FaceD[2] = vertexes[7];
|
||||||
|
FaceC[3] = vertexes[7];
|
||||||
|
FaceD[5] = vertexes[7];
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//int wy = 0;
|
||||||
|
|
||||||
|
//bool breakYN = false; // If we run into an error drawing, break out of the
|
||||||
// loop so we don't lag to death on error handling
|
// loop so we don't lag to death on error handling
|
||||||
RectangleDrawStruct ds = new RectangleDrawStruct();
|
DrawStruct ds = new DrawStruct();
|
||||||
ds.brush = new SolidBrush(mapdotspot);
|
ds.brush = new SolidBrush(mapdotspot);
|
||||||
ds.rect = new Rectangle(mapdrawstartX, (255 - mapdrawstartY), mapdrawendX - mapdrawstartX, mapdrawendY - mapdrawstartY);
|
//ds.rect = new Rectangle(mapdrawstartX, (255 - mapdrawstartY), mapdrawendX - mapdrawstartX, mapdrawendY - mapdrawstartY);
|
||||||
|
|
||||||
|
|
||||||
|
ds.trns = new face[FaceA.Length];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < FaceA.Length; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
Point[] working = new Point[5];
|
||||||
|
working[0] = project(FaceA[i], axPos);
|
||||||
|
working[1] = project(FaceB[i], axPos);
|
||||||
|
working[2] = project(FaceD[i], axPos);
|
||||||
|
working[3] = project(FaceC[i], axPos);
|
||||||
|
working[4] = project(FaceA[i], axPos);
|
||||||
|
|
||||||
|
face workingface = new face();
|
||||||
|
workingface.pts = working;
|
||||||
|
|
||||||
|
ds.trns[i] = workingface;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
z_sort.Add(part.LocalId, ds);
|
z_sort.Add(part.LocalId, ds);
|
||||||
z_localIDs.Add(part.LocalId);
|
z_localIDs.Add(part.LocalId);
|
||||||
z_sortheights.Add(pos.Z);
|
z_sortheights.Add(pos.Z);
|
||||||
|
@ -541,8 +692,12 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
|
|
||||||
if (z_sort.ContainsKey(sortedlocalIds[s]))
|
if (z_sort.ContainsKey(sortedlocalIds[s]))
|
||||||
{
|
{
|
||||||
RectangleDrawStruct rectDrawStruct = z_sort[sortedlocalIds[s]];
|
DrawStruct rectDrawStruct = z_sort[sortedlocalIds[s]];
|
||||||
g.FillRectangle(rectDrawStruct.brush , rectDrawStruct.rect);
|
for (int r = 0; r < rectDrawStruct.trns.Length; r++ )
|
||||||
|
{
|
||||||
|
g.FillPolygon(rectDrawStruct.brush,rectDrawStruct.trns[r].pts);
|
||||||
|
}
|
||||||
|
//g.FillRectangle(rectDrawStruct.brush , rectDrawStruct.rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -553,6 +708,18 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
|
||||||
m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (System.Environment.TickCount - tc) + " ms");
|
m_log.Info("[MAPTILE]: Generating Maptile Step 2: Done in " + (System.Environment.TickCount - tc) + " ms");
|
||||||
return mapbmp;
|
return mapbmp;
|
||||||
}
|
}
|
||||||
|
private Point project(Vector3 point3d, Vector3 originpos)
|
||||||
|
{
|
||||||
|
Point returnpt = new Point();
|
||||||
|
//originpos = point3d;
|
||||||
|
Vector3 topos = new Vector3(255, 255, 255);//(originpos.x * 256) / originpos.x);
|
||||||
|
float z = -point3d.z - topos.z;
|
||||||
|
returnpt.X = (int)((topos.x - point3d.x) / z * 255) + 255;
|
||||||
|
returnpt.Y = (int)(255 - (((topos.y - point3d.y) / z * 255) + 255));
|
||||||
|
|
||||||
|
return returnpt;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: unused:
|
// TODO: unused:
|
||||||
// #region Deprecated Maptile Generation. Adam may update this
|
// #region Deprecated Maptile Generation. Adam may update this
|
||||||
|
|
Loading…
Reference in New Issue