added convex decomposition hulls support. Hardcoded to use mesh or this. (so no simple hull of convex prims for now).
parent
8c1550b58e
commit
23e6a31aa5
|
@ -329,7 +329,7 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
// m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
|
// m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
|
||||||
|
|
||||||
|
|
||||||
bool convex = true; // this will be a input
|
bool convex = false; // this will be a input
|
||||||
bool usemesh = false;
|
bool usemesh = false;
|
||||||
|
|
||||||
coords = new List<Coord>();
|
coords = new List<Coord>();
|
||||||
|
@ -430,7 +430,6 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (usemesh)
|
if (usemesh)
|
||||||
{
|
{
|
||||||
OSDArray decodedMeshOsdArray = null;
|
OSDArray decodedMeshOsdArray = null;
|
||||||
|
@ -465,10 +464,14 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
|
|
||||||
float3 f3;
|
float3 f3;
|
||||||
PHullResult hullr = new PHullResult();
|
PHullResult hullr = new PHullResult();
|
||||||
Mesh m = new Mesh();
|
|
||||||
|
Coord c;
|
||||||
|
Face f;
|
||||||
|
|
||||||
Vector3 range;
|
Vector3 range;
|
||||||
Vector3 min;
|
Vector3 min;
|
||||||
|
int nverts;
|
||||||
|
int nindexs;
|
||||||
|
|
||||||
if (cmap.ContainsKey("Max"))
|
if (cmap.ContainsKey("Max"))
|
||||||
range = cmap["Max"].AsVector3();
|
range = cmap["Max"].AsVector3();
|
||||||
|
@ -482,27 +485,125 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
|
|
||||||
range = range - min;
|
range = range - min;
|
||||||
range *= invMaxU16;
|
range *= invMaxU16;
|
||||||
/*
|
|
||||||
// if (!convex && cmap.ContainsKey("HullList"))
|
if (!convex && cmap.ContainsKey("HullList") && cmap.ContainsKey("Positions"))
|
||||||
if (cmap.ContainsKey("HullList"))
|
|
||||||
{
|
{
|
||||||
List<int> hsizes = new List<int>();
|
List<int> hsizes = new List<int>();
|
||||||
|
int totalpoints = 0;
|
||||||
data = cmap["HullList"].AsBinary();
|
data = cmap["HullList"].AsBinary();
|
||||||
for (i = 0; i < data.Length; i++)
|
for (i = 0; i < data.Length; i++)
|
||||||
{
|
{
|
||||||
t1 = data[i];
|
t1 = data[i];
|
||||||
if (t1 == 0)
|
if (t1 == 0)
|
||||||
t1 = 256;
|
t1 = 256;
|
||||||
|
totalpoints += t1;
|
||||||
hsizes.Add(t1);
|
hsizes.Add(t1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bla bla
|
data = cmap["Positions"].AsBinary();
|
||||||
|
int ptr = 0;
|
||||||
|
int vertsoffset = 0;
|
||||||
|
|
||||||
|
if (totalpoints == data.Length / 6) // 2 bytes per coord, 3 coords per point
|
||||||
|
{
|
||||||
|
foreach (int hullsize in hsizes)
|
||||||
|
{
|
||||||
|
for (i = 0; i < hullsize; i++ )
|
||||||
|
{
|
||||||
|
t1 = data[ptr++];
|
||||||
|
t1 += data[ptr++] << 8;
|
||||||
|
t2 = data[ptr++];
|
||||||
|
t2 += data[ptr++] << 8;
|
||||||
|
t3 = data[ptr++];
|
||||||
|
t3 += data[ptr++] << 8;
|
||||||
|
|
||||||
|
f3 = new float3((t1 * range.X + min.X) * size.X,
|
||||||
|
(t2 * range.Y + min.Y) * size.Y,
|
||||||
|
(t3 * range.Z + min.Z) * size.Z);
|
||||||
|
vs.Add(f3);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hullsize <3)
|
||||||
|
{
|
||||||
|
vs.Clear();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hullsize <5)
|
||||||
|
{
|
||||||
|
foreach (float3 point in vs)
|
||||||
|
{
|
||||||
|
c.X = point.x;
|
||||||
|
c.Y = point.y;
|
||||||
|
c.Z = point.z;
|
||||||
|
coords.Add(c);
|
||||||
|
}
|
||||||
|
f = new Face(vertsoffset, vertsoffset + 1, vertsoffset + 2);
|
||||||
|
faces.Add(f);
|
||||||
|
|
||||||
|
if (hullsize == 4)
|
||||||
|
{
|
||||||
|
// not sure about orientation..
|
||||||
|
f = new Face(vertsoffset, vertsoffset + 2, vertsoffset + 3);
|
||||||
|
faces.Add(f);
|
||||||
|
f = new Face(vertsoffset, vertsoffset + 3, vertsoffset + 1);
|
||||||
|
faces.Add(f);
|
||||||
|
f = new Face(vertsoffset + 3, vertsoffset + 2, vertsoffset + 1);
|
||||||
|
faces.Add(f);
|
||||||
|
}
|
||||||
|
vertsoffset += vs.Count;
|
||||||
|
vs.Clear();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f))
|
||||||
|
{
|
||||||
|
vs.Clear();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
nverts = hullr.Vertices.Count;
|
||||||
|
nindexs = hullr.Indices.Count;
|
||||||
|
|
||||||
|
if (nindexs % 3 != 0)
|
||||||
|
{
|
||||||
|
vs.Clear();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nverts; i++)
|
||||||
|
{
|
||||||
|
c.X = hullr.Vertices[i].x;
|
||||||
|
c.Y = hullr.Vertices[i].y;
|
||||||
|
c.Z = hullr.Vertices[i].z;
|
||||||
|
coords.Add(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < nindexs; i += 3)
|
||||||
|
{
|
||||||
|
t1 = hullr.Indices[i];
|
||||||
|
if (t1 > nverts)
|
||||||
|
break;
|
||||||
|
t2 = hullr.Indices[i + 1];
|
||||||
|
if (t2 > nverts)
|
||||||
|
break;
|
||||||
|
t3 = hullr.Indices[i + 2];
|
||||||
|
if (t3 > nverts)
|
||||||
|
break;
|
||||||
|
f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3);
|
||||||
|
faces.Add(f);
|
||||||
|
}
|
||||||
|
vertsoffset += nverts;
|
||||||
|
vs.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (coords.Count > 0 && faces.Count > 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
vs.Clear();
|
||||||
|
|
||||||
if (cmap.ContainsKey("BoundingVerts"))
|
if (cmap.ContainsKey("BoundingVerts"))
|
||||||
{
|
{
|
||||||
|
@ -523,17 +624,47 @@ bla bla
|
||||||
vs.Add(f3);
|
vs.Add(f3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vs.Count < 3)
|
||||||
|
{
|
||||||
|
vs.Clear();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!HullUtils.ComputeHull(vs, ref hullr, 300, 0.0f))
|
if (vs.Count < 5)
|
||||||
|
{
|
||||||
|
foreach (float3 point in vs)
|
||||||
|
{
|
||||||
|
c.X = point.x;
|
||||||
|
c.Y = point.y;
|
||||||
|
c.Z = point.z;
|
||||||
|
coords.Add(c);
|
||||||
|
}
|
||||||
|
f = new Face(0, 1, 2);
|
||||||
|
faces.Add(f);
|
||||||
|
|
||||||
|
if (vs.Count == 4)
|
||||||
|
{
|
||||||
|
// not sure about orientation..
|
||||||
|
f = new Face(0, 2, 3);
|
||||||
|
faces.Add(f);
|
||||||
|
f = new Face(0, 3, 1);
|
||||||
|
faces.Add(f);
|
||||||
|
f = new Face( 3, 2, 1);
|
||||||
|
faces.Add(f);
|
||||||
|
}
|
||||||
|
vs.Clear();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int nverts = hullr.Vertices.Count;
|
nverts = hullr.Vertices.Count;
|
||||||
int nindexs = hullr.Indices.Count;
|
nindexs = hullr.Indices.Count;
|
||||||
|
|
||||||
if (nindexs % 3 != 0)
|
if (nindexs % 3 != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Coord c;
|
|
||||||
for (i = 0; i < nverts; i++)
|
for (i = 0; i < nverts; i++)
|
||||||
{
|
{
|
||||||
c.X = hullr.Vertices[i].x;
|
c.X = hullr.Vertices[i].x;
|
||||||
|
@ -541,9 +672,6 @@ bla bla
|
||||||
c.Z = hullr.Vertices[i].z;
|
c.Z = hullr.Vertices[i].z;
|
||||||
coords.Add(c);
|
coords.Add(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
Face f;
|
|
||||||
|
|
||||||
for (i = 0; i < nindexs; i += 3)
|
for (i = 0; i < nindexs; i += 3)
|
||||||
{
|
{
|
||||||
t1 = hullr.Indices[i];
|
t1 = hullr.Indices[i];
|
||||||
|
|
Loading…
Reference in New Issue