diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 58b7b00169..46932b1b6a 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -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; } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index dc8d267278..cf96a8bbc1 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -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; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index affd4ded94..19bf53f0fd 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3728,7 +3728,18 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter bool hasDimple; 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); switch (primType) @@ -3772,13 +3783,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter if (hasProfileCut) ret += 2; if (hasHollow) ret += 1; 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; @@ -3789,9 +3793,9 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter /// /// /// - public PrimType GetPrimType() + public PrimType GetPrimType(bool ignoreSculpt = false) { - if (Shape.SculptEntry) + if (Shape.SculptEntry && !ignoreSculpt) return PrimType.SCULPT; if ((Shape.ProfileCurve & 0x07) == (byte)ProfileShape.Square)