diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 85 |
1 files changed, 14 insertions, 71 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 4a5a8e7..e1b9e08 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | |||
@@ -946,17 +946,26 @@ namespace OpenSim.Region.ClientStack.Linden | |||
946 | continue; | 946 | continue; |
947 | } | 947 | } |
948 | 948 | ||
949 | PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox(); | 949 | OSDArray face_list = (OSDArray)inner_instance_list["face_list"]; |
950 | |||
951 | PrimitiveBaseShape pbs = null; | ||
952 | if (inner_instance_list.ContainsKey("mesh")) // seems to happen always but ... | ||
953 | { | ||
954 | int meshindx = inner_instance_list["mesh"].AsInteger(); | ||
955 | if (meshAssets.Count > meshindx) | ||
956 | pbs = PrimitiveBaseShape.CreateMesh(face_list.Count, meshAssets[meshindx]); | ||
957 | } | ||
958 | if(pbs == null) // fallback | ||
959 | pbs = PrimitiveBaseShape.CreateBox(); | ||
950 | 960 | ||
951 | Primitive.TextureEntry textureEntry | 961 | Primitive.TextureEntry textureEntry |
952 | = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE); | 962 | = new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE); |
953 | 963 | ||
954 | |||
955 | OSDArray face_list = (OSDArray)inner_instance_list["face_list"]; | ||
956 | for (uint face = 0; face < face_list.Count; face++) | 964 | for (uint face = 0; face < face_list.Count; face++) |
957 | { | 965 | { |
958 | OSDMap faceMap = (OSDMap)face_list[(int)face]; | 966 | OSDMap faceMap = (OSDMap)face_list[(int)face]; |
959 | Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face); | 967 | |
968 | Primitive.TextureEntryFace f = textureEntry.CreateFace(face); //clone the default | ||
960 | if (faceMap.ContainsKey("fullbright")) | 969 | if (faceMap.ContainsKey("fullbright")) |
961 | f.Fullbright = faceMap["fullbright"].AsBoolean(); | 970 | f.Fullbright = faceMap["fullbright"].AsBoolean(); |
962 | if (faceMap.ContainsKey("diffuse_color")) | 971 | if (faceMap.ContainsKey("diffuse_color")) |
@@ -986,77 +995,11 @@ namespace OpenSim.Region.ClientStack.Linden | |||
986 | 995 | ||
987 | if (textures.Count > textureNum) | 996 | if (textures.Count > textureNum) |
988 | f.TextureID = textures[textureNum]; | 997 | f.TextureID = textures[textureNum]; |
989 | else | 998 | |
990 | f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE; | ||
991 | |||
992 | textureEntry.FaceTextures[face] = f; | 999 | textureEntry.FaceTextures[face] = f; |
993 | } | 1000 | } |
994 | |||
995 | pbs.TextureEntry = textureEntry.GetBytes(); | 1001 | pbs.TextureEntry = textureEntry.GetBytes(); |
996 | 1002 | ||
997 | if (inner_instance_list.ContainsKey("mesh")) // seems to happen always but ... | ||
998 | { | ||
999 | int meshindx = inner_instance_list["mesh"].AsInteger(); | ||
1000 | if (meshAssets.Count > meshindx) | ||
1001 | { | ||
1002 | pbs.SculptEntry = true; | ||
1003 | pbs.SculptType = (byte)SculptType.Mesh; | ||
1004 | pbs.SculptTexture = meshAssets[meshindx]; // actual asset UUID after meshs suport introduction | ||
1005 | // data will be requested from asset on rez (i hope) | ||
1006 | } | ||
1007 | } | ||
1008 | |||
1009 | // faces number to pbs shape for viewers LOD | ||
1010 | // now extended to full faces equivalent | ||
1011 | int nfaces = face_list.Count; | ||
1012 | switch(nfaces) | ||
1013 | { | ||
1014 | case 0: // low oops case | ||
1015 | case 1: // torus | ||
1016 | pbs.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
1017 | pbs.PathCurve = (byte)Extrusion.Curve1; | ||
1018 | break; | ||
1019 | |||
1020 | case 2: // torus with hollow (a sl viewer whould see 4 faces on a hollow sphere) | ||
1021 | pbs.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
1022 | pbs.PathCurve = (byte)Extrusion.Curve1; | ||
1023 | pbs.ProfileHollow = 1; | ||
1024 | break; | ||
1025 | |||
1026 | case 3: // cylinder | ||
1027 | pbs.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
1028 | pbs.PathCurve = (byte)Extrusion.Straight; | ||
1029 | break; | ||
1030 | |||
1031 | case 4: // cylinder with hollow | ||
1032 | pbs.ProfileCurve = (byte)ProfileShape.Circle | (byte)HollowShape.Triangle; | ||
1033 | pbs.PathCurve = (byte)Extrusion.Straight; | ||
1034 | pbs.ProfileHollow = 1; | ||
1035 | break; | ||
1036 | |||
1037 | case 5: // prism | ||
1038 | pbs.ProfileCurve = (byte)ProfileShape.EquilateralTriangle | (byte)HollowShape.Triangle; | ||
1039 | pbs.PathCurve = (byte)Extrusion.Straight; | ||
1040 | break; | ||
1041 | |||
1042 | case 6: // box | ||
1043 | pbs.ProfileCurve = (byte)ProfileShape.Square | (byte)HollowShape.Triangle; | ||
1044 | pbs.PathCurve = (byte)Extrusion.Straight; | ||
1045 | break; | ||
1046 | |||
1047 | case 7: // box with hollow | ||
1048 | pbs.ProfileCurve = (byte)ProfileShape.Square | (byte)HollowShape.Triangle; | ||
1049 | pbs.PathCurve = (byte)Extrusion.Straight; | ||
1050 | pbs.ProfileHollow = 1; | ||
1051 | break; | ||
1052 | |||
1053 | default: // 8 faces box with cut | ||
1054 | pbs.ProfileCurve = (byte)ProfileCurve.Square | (byte)HollowShape.Triangle; | ||
1055 | pbs.PathCurve = (byte)Extrusion.Straight; | ||
1056 | pbs.ProfileBegin = 1; | ||
1057 | break; | ||
1058 | } | ||
1059 | |||
1060 | Vector3 position = inner_instance_list["position"].AsVector3(); | 1003 | Vector3 position = inner_instance_list["position"].AsVector3(); |
1061 | Quaternion rotation = inner_instance_list["rotation"].AsQuaternion(); | 1004 | Quaternion rotation = inner_instance_list["rotation"].AsQuaternion(); |
1062 | 1005 | ||