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
parent
7a54c3e9c3
commit
2f6c78b888
|
@ -1006,28 +1006,41 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// faces number to pbs shape
|
// faces number to pbs shape for viewers LOD
|
||||||
switch(face_list.Count)
|
// now extended to full faces equivalent
|
||||||
|
int nfaces = face_list.Count;
|
||||||
|
switch(nfaces)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
pbs.ProfileCurve = (byte)ProfileCurve.Circle;
|
pbs.ProfileCurve = (byte)ProfileCurve.Circle | (byte)HollowShape.Triangle;
|
||||||
pbs.PathCurve = (byte)PathCurve.Circle;
|
pbs.PathCurve = (byte)PathCurve.Circle;
|
||||||
|
if(nfaces == 2)
|
||||||
|
pbs.ProfileHollow = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
pbs.ProfileCurve = (byte)ProfileCurve.Circle;
|
pbs.ProfileCurve = (byte)ProfileCurve.Circle | (byte)HollowShape.Triangle;
|
||||||
pbs.PathCurve = (byte)PathCurve.Line;
|
pbs.PathCurve = (byte)PathCurve.Line;
|
||||||
|
if(nfaces == 4)
|
||||||
|
pbs.ProfileHollow = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
pbs.ProfileCurve = (byte)ProfileCurve.EqualTriangle;
|
pbs.ProfileCurve = (byte)ProfileCurve.EqualTriangle | (byte)HollowShape.Triangle;
|
||||||
pbs.PathCurve = (byte)PathCurve.Line;
|
pbs.PathCurve = (byte)PathCurve.Line;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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;
|
pbs.PathCurve = (byte)PathCurve.Line;
|
||||||
|
if(nfaces == 7)
|
||||||
|
pbs.ProfileHollow = 1;
|
||||||
|
else if(nfaces == 8)
|
||||||
|
pbs.ProfileBegin = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4212,12 +4212,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
SceneObjectGroup grp = part.ParentGroup;
|
SceneObjectGroup grp = part.ParentGroup;
|
||||||
if (grp.inTransit && !update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
|
if (grp.inTransit && !update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
|
||||||
continue;
|
continue;
|
||||||
|
/* debug
|
||||||
if (update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
|
if (update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
if (grp.IsDeleted)
|
if (grp.IsDeleted)
|
||||||
{
|
{
|
||||||
// Don't send updates for objects that have been marked deleted.
|
// Don't send updates for objects that have been marked deleted.
|
||||||
|
@ -4274,14 +4275,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
part.Shape.LightEntry = false;
|
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)
|
if(doCulling && !grp.IsAttachment)
|
||||||
|
@ -4309,14 +4302,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
continue;
|
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)
|
else if (update.Entity is ScenePresence)
|
||||||
{
|
{
|
||||||
|
@ -5877,6 +5862,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
update.PCode = part.Shape.PCode;
|
update.PCode = part.Shape.PCode;
|
||||||
update.ProfileBegin = part.Shape.ProfileBegin;
|
update.ProfileBegin = part.Shape.ProfileBegin;
|
||||||
update.ProfileCurve = part.Shape.ProfileCurve;
|
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.ProfileEnd = part.Shape.ProfileEnd;
|
||||||
update.ProfileHollow = part.Shape.ProfileHollow;
|
update.ProfileHollow = part.Shape.ProfileHollow;
|
||||||
update.PSBlock = part.ParticleSystem ?? Utils.EmptyBytes;
|
update.PSBlock = part.ParticleSystem ?? Utils.EmptyBytes;
|
||||||
|
|
|
@ -3728,7 +3728,18 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
|
||||||
bool hasDimple;
|
bool hasDimple;
|
||||||
bool hasProfileCut;
|
bool hasProfileCut;
|
||||||
|
|
||||||
PrimType primType = GetPrimType();
|
if(Shape.SculptEntry)
|
||||||
|
{
|
||||||
|
if (Shape.SculptType != (byte)SculptType.Mesh)
|
||||||
|
return 1; // sculp
|
||||||
|
|
||||||
|
//hack to detect new upload with faces data enconded on pbs
|
||||||
|
if ((Shape.ProfileCurve & 0xf0) != (byte)HollowShape.Triangle)
|
||||||
|
// old broken upload TODO
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrimType primType = GetPrimType(true);
|
||||||
HasCutHollowDimpleProfileCut(primType, Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut);
|
HasCutHollowDimpleProfileCut(primType, Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut);
|
||||||
|
|
||||||
switch (primType)
|
switch (primType)
|
||||||
|
@ -3772,13 +3783,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
|
||||||
if (hasProfileCut) ret += 2;
|
if (hasProfileCut) ret += 2;
|
||||||
if (hasHollow) ret += 1;
|
if (hasHollow) ret += 1;
|
||||||
break;
|
break;
|
||||||
case PrimType.SCULPT:
|
|
||||||
// Special mesh handling
|
|
||||||
if (Shape.SculptType == (byte)SculptType.Mesh)
|
|
||||||
ret = 8; // if it's a mesh then max 8 faces
|
|
||||||
else
|
|
||||||
ret = 1; // if it's a sculpt then max 1 face
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -3789,9 +3793,9 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="primShape"></param>
|
/// <param name="primShape"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public PrimType GetPrimType()
|
public PrimType GetPrimType(bool ignoreSculpt = false)
|
||||||
{
|
{
|
||||||
if (Shape.SculptEntry)
|
if (Shape.SculptEntry && !ignoreSculpt)
|
||||||
return PrimType.SCULPT;
|
return PrimType.SCULPT;
|
||||||
|
|
||||||
if ((Shape.ProfileCurve & 0x07) == (byte)ProfileShape.Square)
|
if ((Shape.ProfileCurve & 0x07) == (byte)ProfileShape.Square)
|
||||||
|
|
Loading…
Reference in New Issue