finish encoding number of mesh faces in pbs shape on new meshs upload, and *HACK* flag it setting hollow shape to triangle. (some limited encoding as added some months ago, but only for viewers LOD). Use this hack flag to fix sop number of faces. old meshs will still report 8 faces, information to fix this seems lost unless the mesh asset is decoded

This commit is contained in:
UbitUmarov
2017-04-25 04:58:24 +01:00
parent 7a54c3e9c3
commit 2f6c78b888
3 changed files with 41 additions and 33 deletions

View File

@@ -1006,28 +1006,41 @@ namespace OpenSim.Region.ClientStack.Linden
}
}
// faces number to pbs shape
switch(face_list.Count)
// faces number to pbs shape for viewers LOD
// now extended to full faces equivalent
int nfaces = face_list.Count;
switch(nfaces)
{
case 1:
case 2:
pbs.ProfileCurve = (byte)ProfileCurve.Circle;
pbs.ProfileCurve = (byte)ProfileCurve.Circle | (byte)HollowShape.Triangle;
pbs.PathCurve = (byte)PathCurve.Circle;
if(nfaces == 2)
pbs.ProfileHollow = 1;
break;
case 3:
case 4:
pbs.ProfileCurve = (byte)ProfileCurve.Circle;
pbs.ProfileCurve = (byte)ProfileCurve.Circle | (byte)HollowShape.Triangle;
pbs.PathCurve = (byte)PathCurve.Line;
if(nfaces == 4)
pbs.ProfileHollow = 1;
break;
case 5:
pbs.ProfileCurve = (byte)ProfileCurve.EqualTriangle;
pbs.ProfileCurve = (byte)ProfileCurve.EqualTriangle | (byte)HollowShape.Triangle;
pbs.PathCurve = (byte)PathCurve.Line;
break;
default:
pbs.ProfileCurve = (byte)ProfileCurve.Square;
// hack to flag that pbs does represent number of faces
//meshs where never uploaded with this
pbs.ProfileCurve = (byte)ProfileCurve.Square | (byte)HollowShape.Triangle;
pbs.PathCurve = (byte)PathCurve.Line;
if(nfaces == 7)
pbs.ProfileHollow = 1;
else if(nfaces == 8)
pbs.ProfileBegin = 1;
break;
}

View File

@@ -4212,12 +4212,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
SceneObjectGroup grp = part.ParentGroup;
if (grp.inTransit && !update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
continue;
/* debug
if (update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
{
}
*/
if (grp.IsDeleted)
{
// Don't send updates for objects that have been marked deleted.
@@ -4274,14 +4275,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
part.Shape.LightEntry = false;
}
if (part.Shape != null && (part.Shape.SculptType == (byte)SculptType.Mesh))
{
// Ensure that mesh has at least 8 valid faces
part.Shape.ProfileBegin = 12500;
part.Shape.ProfileEnd = 0;
part.Shape.ProfileHollow = 27500;
}
}
if(doCulling && !grp.IsAttachment)
@@ -4309,14 +4302,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
continue;
}
}
if (part.Shape != null && (part.Shape.SculptType == (byte)SculptType.Mesh))
{
// Ensure that mesh has at least 8 valid faces
part.Shape.ProfileBegin = 12500;
part.Shape.ProfileEnd = 0;
part.Shape.ProfileHollow = 27500;
}
}
else if (update.Entity is ScenePresence)
{
@@ -5877,6 +5862,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
update.PCode = part.Shape.PCode;
update.ProfileBegin = part.Shape.ProfileBegin;
update.ProfileCurve = part.Shape.ProfileCurve;
if(part.Shape.SculptType == (byte)SculptType.Mesh) // filter out hack
update.ProfileCurve = (byte)(part.Shape.ProfileCurve & 0x0f);
else
update.ProfileCurve = part.Shape.ProfileCurve;
update.ProfileEnd = part.Shape.ProfileEnd;
update.ProfileHollow = part.Shape.ProfileHollow;
update.PSBlock = part.ParticleSystem ?? Utils.EmptyBytes;