refactor: extract method that generates a physics mesh from prim shape data
parent
4197f66052
commit
310a685220
|
@ -315,10 +315,8 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
// "[MESH]: Creating physics proxy for {0}, shape {1}",
|
// "[MESH]: Creating physics proxy for {0}, shape {1}",
|
||||||
// primName, (OpenMetaverse.SculptType)primShape.SculptType);
|
// primName, (OpenMetaverse.SculptType)primShape.SculptType);
|
||||||
|
|
||||||
PrimMesh primMesh;
|
List<Coord> coords;
|
||||||
|
List<Face> faces;
|
||||||
List<Coord> coords = new List<Coord>();
|
|
||||||
List<Face> faces = new List<Face>();
|
|
||||||
|
|
||||||
if (primShape.SculptEntry)
|
if (primShape.SculptEntry)
|
||||||
{
|
{
|
||||||
|
@ -327,126 +325,19 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
if (!useMeshiesPhysicsMesh)
|
if (!useMeshiesPhysicsMesh)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, size, coords, faces))
|
if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, size, out coords, out faces))
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, size, lod, coords, faces))
|
if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, size, lod, out coords, out faces))
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float pathShearX = primShape.PathShearX < 128 ? (float)primShape.PathShearX * 0.01f : (float)(primShape.PathShearX - 256) * 0.01f;
|
if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, size, out coords, out faces))
|
||||||
float pathShearY = primShape.PathShearY < 128 ? (float)primShape.PathShearY * 0.01f : (float)(primShape.PathShearY - 256) * 0.01f;
|
return null;
|
||||||
float pathBegin = (float)primShape.PathBegin * 2.0e-5f;
|
|
||||||
float pathEnd = 1.0f - (float)primShape.PathEnd * 2.0e-5f;
|
|
||||||
float pathScaleX = (float)(primShape.PathScaleX - 100) * 0.01f;
|
|
||||||
float pathScaleY = (float)(primShape.PathScaleY - 100) * 0.01f;
|
|
||||||
|
|
||||||
float profileBegin = (float)primShape.ProfileBegin * 2.0e-5f;
|
|
||||||
float profileEnd = 1.0f - (float)primShape.ProfileEnd * 2.0e-5f;
|
|
||||||
float profileHollow = (float)primShape.ProfileHollow * 2.0e-5f;
|
|
||||||
if (profileHollow > 0.95f)
|
|
||||||
profileHollow = 0.95f;
|
|
||||||
|
|
||||||
int sides = 4;
|
|
||||||
if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
|
|
||||||
sides = 3;
|
|
||||||
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
|
|
||||||
sides = 24;
|
|
||||||
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
|
|
||||||
{ // half circle, prim is a sphere
|
|
||||||
sides = 24;
|
|
||||||
|
|
||||||
profileBegin = 0.5f * profileBegin + 0.5f;
|
|
||||||
profileEnd = 0.5f * profileEnd + 0.5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
int hollowSides = sides;
|
|
||||||
if (primShape.HollowShape == HollowShape.Circle)
|
|
||||||
hollowSides = 24;
|
|
||||||
else if (primShape.HollowShape == HollowShape.Square)
|
|
||||||
hollowSides = 4;
|
|
||||||
else if (primShape.HollowShape == HollowShape.Triangle)
|
|
||||||
hollowSides = 3;
|
|
||||||
|
|
||||||
primMesh = new PrimMesh(sides, profileBegin, profileEnd, profileHollow, hollowSides);
|
|
||||||
|
|
||||||
if (primMesh.errorMessage != null)
|
|
||||||
if (primMesh.errorMessage.Length > 0)
|
|
||||||
m_log.Error("[ERROR] " + primMesh.errorMessage);
|
|
||||||
|
|
||||||
primMesh.topShearX = pathShearX;
|
|
||||||
primMesh.topShearY = pathShearY;
|
|
||||||
primMesh.pathCutBegin = pathBegin;
|
|
||||||
primMesh.pathCutEnd = pathEnd;
|
|
||||||
|
|
||||||
if (primShape.PathCurve == (byte)Extrusion.Straight || primShape.PathCurve == (byte) Extrusion.Flexible)
|
|
||||||
{
|
|
||||||
primMesh.twistBegin = primShape.PathTwistBegin * 18 / 10;
|
|
||||||
primMesh.twistEnd = primShape.PathTwist * 18 / 10;
|
|
||||||
primMesh.taperX = pathScaleX;
|
|
||||||
primMesh.taperY = pathScaleY;
|
|
||||||
|
|
||||||
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
|
|
||||||
{
|
|
||||||
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
|
|
||||||
if (profileBegin < 0.0f) profileBegin = 0.0f;
|
|
||||||
if (profileEnd > 1.0f) profileEnd = 1.0f;
|
|
||||||
}
|
|
||||||
#if SPAM
|
|
||||||
m_log.Debug("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
|
|
||||||
#endif
|
|
||||||
try
|
|
||||||
{
|
|
||||||
primMesh.ExtrudeLinear();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
primMesh.holeSizeX = (200 - primShape.PathScaleX) * 0.01f;
|
|
||||||
primMesh.holeSizeY = (200 - primShape.PathScaleY) * 0.01f;
|
|
||||||
primMesh.radius = 0.01f * primShape.PathRadiusOffset;
|
|
||||||
primMesh.revolutions = 1.0f + 0.015f * primShape.PathRevolutions;
|
|
||||||
primMesh.skew = 0.01f * primShape.PathSkew;
|
|
||||||
primMesh.twistBegin = primShape.PathTwistBegin * 36 / 10;
|
|
||||||
primMesh.twistEnd = primShape.PathTwist * 36 / 10;
|
|
||||||
primMesh.taperX = primShape.PathTaperX * 0.01f;
|
|
||||||
primMesh.taperY = primShape.PathTaperY * 0.01f;
|
|
||||||
|
|
||||||
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
|
|
||||||
{
|
|
||||||
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
|
|
||||||
if (profileBegin < 0.0f) profileBegin = 0.0f;
|
|
||||||
if (profileEnd > 1.0f) profileEnd = 1.0f;
|
|
||||||
}
|
|
||||||
#if SPAM
|
|
||||||
m_log.Debug("****** PrimMesh Parameters (Circular) ******\n" + primMesh.ParamsToDisplayString());
|
|
||||||
#endif
|
|
||||||
try
|
|
||||||
{
|
|
||||||
primMesh.ExtrudeCircular();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
primMesh.DumpRaw(baseDir, primName, "primMesh");
|
|
||||||
|
|
||||||
primMesh.Scale(size.X, size.Y, size.Z);
|
|
||||||
|
|
||||||
coords = primMesh.coords;
|
|
||||||
faces = primMesh.faces;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove the reference to any JPEG2000 sculpt data so it can be GCed
|
// Remove the reference to any JPEG2000 sculpt data so it can be GCed
|
||||||
|
@ -484,10 +375,12 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
/// <param name="faces">Faces are added to this list by the method.</param>
|
/// <param name="faces">Faces are added to this list by the method.</param>
|
||||||
/// <returns>true if coords and faces were successfully generated, false if not</returns>
|
/// <returns>true if coords and faces were successfully generated, false if not</returns>
|
||||||
private bool GenerateCoordsAndFacesFromPrimMeshData(
|
private bool GenerateCoordsAndFacesFromPrimMeshData(
|
||||||
string primName, PrimitiveBaseShape primShape, Vector3 size, List<Coord> coords, List<Face> faces)
|
string primName, PrimitiveBaseShape primShape, Vector3 size, out List<Coord> coords, out List<Face> faces)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
|
m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
|
||||||
|
|
||||||
|
coords = new List<Coord>();
|
||||||
|
faces = new List<Face>();
|
||||||
OSD meshOsd = null;
|
OSD meshOsd = null;
|
||||||
|
|
||||||
if (primShape.SculptData.Length <= 0)
|
if (primShape.SculptData.Length <= 0)
|
||||||
|
@ -603,8 +496,10 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
/// <param name="faces">Faces are added to this list by the method.</param>
|
/// <param name="faces">Faces are added to this list by the method.</param>
|
||||||
/// <returns>true if coords and faces were successfully generated, false if not</returns>
|
/// <returns>true if coords and faces were successfully generated, false if not</returns>
|
||||||
private bool GenerateCoordsAndFacesFromPrimSculptData(
|
private bool GenerateCoordsAndFacesFromPrimSculptData(
|
||||||
string primName, PrimitiveBaseShape primShape, Vector3 size, float lod, List<Coord> coords, List<Face> faces)
|
string primName, PrimitiveBaseShape primShape, Vector3 size, float lod, out List<Coord> coords, out List<Face> faces)
|
||||||
{
|
{
|
||||||
|
coords = new List<Coord>();
|
||||||
|
faces = new List<Face>();
|
||||||
PrimMesher.SculptMesh sculptMesh;
|
PrimMesher.SculptMesh sculptMesh;
|
||||||
Image idata = null;
|
Image idata = null;
|
||||||
string decodedSculptFileName = "";
|
string decodedSculptFileName = "";
|
||||||
|
@ -711,6 +606,135 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generate the co-ords and faces necessary to construct a mesh from the shape data the accompanies a prim.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="primName"></param>
|
||||||
|
/// <param name="primShape"></param>
|
||||||
|
/// <param name="size"></param>
|
||||||
|
/// <param name="coords">Coords are added to this list by the method.</param>
|
||||||
|
/// <param name="faces">Faces are added to this list by the method.</param>
|
||||||
|
/// <returns>true if coords and faces were successfully generated, false if not</returns>
|
||||||
|
private bool GenerateCoordsAndFacesFromPrimShapeData(
|
||||||
|
string primName, PrimitiveBaseShape primShape, Vector3 size, out List<Coord> coords, out List<Face> faces)
|
||||||
|
{
|
||||||
|
PrimMesh primMesh;
|
||||||
|
coords = new List<Coord>();
|
||||||
|
faces = new List<Face>();
|
||||||
|
|
||||||
|
float pathShearX = primShape.PathShearX < 128 ? (float)primShape.PathShearX * 0.01f : (float)(primShape.PathShearX - 256) * 0.01f;
|
||||||
|
float pathShearY = primShape.PathShearY < 128 ? (float)primShape.PathShearY * 0.01f : (float)(primShape.PathShearY - 256) * 0.01f;
|
||||||
|
float pathBegin = (float)primShape.PathBegin * 2.0e-5f;
|
||||||
|
float pathEnd = 1.0f - (float)primShape.PathEnd * 2.0e-5f;
|
||||||
|
float pathScaleX = (float)(primShape.PathScaleX - 100) * 0.01f;
|
||||||
|
float pathScaleY = (float)(primShape.PathScaleY - 100) * 0.01f;
|
||||||
|
|
||||||
|
float profileBegin = (float)primShape.ProfileBegin * 2.0e-5f;
|
||||||
|
float profileEnd = 1.0f - (float)primShape.ProfileEnd * 2.0e-5f;
|
||||||
|
float profileHollow = (float)primShape.ProfileHollow * 2.0e-5f;
|
||||||
|
if (profileHollow > 0.95f)
|
||||||
|
profileHollow = 0.95f;
|
||||||
|
|
||||||
|
int sides = 4;
|
||||||
|
if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
|
||||||
|
sides = 3;
|
||||||
|
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
|
||||||
|
sides = 24;
|
||||||
|
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
|
||||||
|
{ // half circle, prim is a sphere
|
||||||
|
sides = 24;
|
||||||
|
|
||||||
|
profileBegin = 0.5f * profileBegin + 0.5f;
|
||||||
|
profileEnd = 0.5f * profileEnd + 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hollowSides = sides;
|
||||||
|
if (primShape.HollowShape == HollowShape.Circle)
|
||||||
|
hollowSides = 24;
|
||||||
|
else if (primShape.HollowShape == HollowShape.Square)
|
||||||
|
hollowSides = 4;
|
||||||
|
else if (primShape.HollowShape == HollowShape.Triangle)
|
||||||
|
hollowSides = 3;
|
||||||
|
|
||||||
|
primMesh = new PrimMesh(sides, profileBegin, profileEnd, profileHollow, hollowSides);
|
||||||
|
|
||||||
|
if (primMesh.errorMessage != null)
|
||||||
|
if (primMesh.errorMessage.Length > 0)
|
||||||
|
m_log.Error("[ERROR] " + primMesh.errorMessage);
|
||||||
|
|
||||||
|
primMesh.topShearX = pathShearX;
|
||||||
|
primMesh.topShearY = pathShearY;
|
||||||
|
primMesh.pathCutBegin = pathBegin;
|
||||||
|
primMesh.pathCutEnd = pathEnd;
|
||||||
|
|
||||||
|
if (primShape.PathCurve == (byte)Extrusion.Straight || primShape.PathCurve == (byte) Extrusion.Flexible)
|
||||||
|
{
|
||||||
|
primMesh.twistBegin = primShape.PathTwistBegin * 18 / 10;
|
||||||
|
primMesh.twistEnd = primShape.PathTwist * 18 / 10;
|
||||||
|
primMesh.taperX = pathScaleX;
|
||||||
|
primMesh.taperY = pathScaleY;
|
||||||
|
|
||||||
|
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
|
||||||
|
{
|
||||||
|
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
|
||||||
|
if (profileBegin < 0.0f) profileBegin = 0.0f;
|
||||||
|
if (profileEnd > 1.0f) profileEnd = 1.0f;
|
||||||
|
}
|
||||||
|
#if SPAM
|
||||||
|
m_log.Debug("****** PrimMesh Parameters (Linear) ******\n" + primMesh.ParamsToDisplayString());
|
||||||
|
#endif
|
||||||
|
try
|
||||||
|
{
|
||||||
|
primMesh.ExtrudeLinear();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
primMesh.holeSizeX = (200 - primShape.PathScaleX) * 0.01f;
|
||||||
|
primMesh.holeSizeY = (200 - primShape.PathScaleY) * 0.01f;
|
||||||
|
primMesh.radius = 0.01f * primShape.PathRadiusOffset;
|
||||||
|
primMesh.revolutions = 1.0f + 0.015f * primShape.PathRevolutions;
|
||||||
|
primMesh.skew = 0.01f * primShape.PathSkew;
|
||||||
|
primMesh.twistBegin = primShape.PathTwistBegin * 36 / 10;
|
||||||
|
primMesh.twistEnd = primShape.PathTwist * 36 / 10;
|
||||||
|
primMesh.taperX = primShape.PathTaperX * 0.01f;
|
||||||
|
primMesh.taperY = primShape.PathTaperY * 0.01f;
|
||||||
|
|
||||||
|
if (profileBegin < 0.0f || profileBegin >= profileEnd || profileEnd > 1.0f)
|
||||||
|
{
|
||||||
|
ReportPrimError("*** CORRUPT PRIM!! ***", primName, primMesh);
|
||||||
|
if (profileBegin < 0.0f) profileBegin = 0.0f;
|
||||||
|
if (profileEnd > 1.0f) profileEnd = 1.0f;
|
||||||
|
}
|
||||||
|
#if SPAM
|
||||||
|
m_log.Debug("****** PrimMesh Parameters (Circular) ******\n" + primMesh.ParamsToDisplayString());
|
||||||
|
#endif
|
||||||
|
try
|
||||||
|
{
|
||||||
|
primMesh.ExtrudeCircular();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ReportPrimError("Extrusion failure: exception: " + ex.ToString(), primName, primMesh);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
primMesh.DumpRaw(baseDir, primName, "primMesh");
|
||||||
|
|
||||||
|
primMesh.Scale(size.X, size.Y, size.Z);
|
||||||
|
|
||||||
|
coords = primMesh.coords;
|
||||||
|
faces = primMesh.faces;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
|
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
|
||||||
{
|
{
|
||||||
return CreateMesh(primName, primShape, size, lod, false);
|
return CreateMesh(primName, primShape, size, lod, false);
|
||||||
|
|
Loading…
Reference in New Issue