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}",
|
||||
// primName, (OpenMetaverse.SculptType)primShape.SculptType);
|
||||
|
||||
PrimMesh primMesh;
|
||||
|
||||
List<Coord> coords = new List<Coord>();
|
||||
List<Face> faces = new List<Face>();
|
||||
List<Coord> coords;
|
||||
List<Face> faces;
|
||||
|
||||
if (primShape.SculptEntry)
|
||||
{
|
||||
|
@ -327,127 +325,20 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
if (!useMeshiesPhysicsMesh)
|
||||
return null;
|
||||
|
||||
if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, size, coords, faces))
|
||||
if (!GenerateCoordsAndFacesFromPrimMeshData(primName, primShape, size, out coords, out faces))
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, size, lod, coords, faces))
|
||||
if (!GenerateCoordsAndFacesFromPrimSculptData(primName, primShape, size, lod, out coords, out faces))
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
if (!GenerateCoordsAndFacesFromPrimShapeData(primName, primShape, size, out coords, out faces))
|
||||
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
|
||||
primShape.SculptData = Utils.EmptyBytes;
|
||||
|
@ -484,10 +375,12 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
/// <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 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);
|
||||
|
||||
coords = new List<Coord>();
|
||||
faces = new List<Face>();
|
||||
OSD meshOsd = null;
|
||||
|
||||
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>
|
||||
/// <returns>true if coords and faces were successfully generated, false if not</returns>
|
||||
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;
|
||||
Image idata = null;
|
||||
string decodedSculptFileName = "";
|
||||
|
@ -711,6 +606,135 @@ namespace OpenSim.Region.Physics.Meshing
|
|||
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)
|
||||
{
|
||||
return CreateMesh(primName, primShape, size, lod, false);
|
||||
|
|
Loading…
Reference in New Issue