diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs | 18 | ||||
-rw-r--r-- | OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs | 163 |
2 files changed, 166 insertions, 15 deletions
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs index 3456258..ef442d4 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IObject.cs | |||
@@ -66,15 +66,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
66 | 66 | ||
67 | public enum PrimType | 67 | public enum PrimType |
68 | { | 68 | { |
69 | NotPrimitive, | 69 | NotPrimitive = 255, |
70 | Box, | 70 | Box = 0, |
71 | Cylinder, | 71 | Cylinder = 1, |
72 | Prism, | 72 | Prism = 2, |
73 | Sphere, | 73 | Sphere = 3, |
74 | Torus, | 74 | Torus = 4, |
75 | Tube, | 75 | Tube = 5, |
76 | Ring, | 76 | Ring = 6, |
77 | Sculpt | 77 | Sculpt = 7 |
78 | } | 78 | } |
79 | 79 | ||
80 | public enum TextureMapping | 80 | public enum TextureMapping |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs index 55b9767..cf59cba 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs | |||
@@ -1,7 +1,6 @@ | |||
1 | using System; | 1 | using System.Collections.Generic; |
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | using OpenMetaverse; | 2 | using OpenMetaverse; |
3 | using OpenSim.Framework; | ||
5 | using OpenSim.Region.Framework.Scenes; | 4 | using OpenSim.Region.Framework.Scenes; |
6 | 5 | ||
7 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | 6 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule |
@@ -17,6 +16,11 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
17 | m_localID = localID; | 16 | m_localID = localID; |
18 | } | 17 | } |
19 | 18 | ||
19 | /// <summary> | ||
20 | /// This needs to run very, very quickly. | ||
21 | /// It is utilized in nearly every property and method. | ||
22 | /// </summary> | ||
23 | /// <returns></returns> | ||
20 | private SceneObjectPart GetSOP() | 24 | private SceneObjectPart GetSOP() |
21 | { | 25 | { |
22 | if (m_rootScene.Entities.ContainsKey(m_localID)) | 26 | if (m_rootScene.Entities.ContainsKey(m_localID)) |
@@ -42,7 +46,21 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
42 | 46 | ||
43 | public IObject[] Children | 47 | public IObject[] Children |
44 | { | 48 | { |
45 | get { throw new System.NotImplementedException(); } | 49 | get |
50 | { | ||
51 | SceneObjectPart my = GetSOP(); | ||
52 | int total = my.ParentGroup.Children.Count; | ||
53 | |||
54 | IObject[] rets = new IObject[total]; | ||
55 | |||
56 | int i = 0; | ||
57 | foreach (KeyValuePair<UUID, SceneObjectPart> pair in my.ParentGroup.Children) | ||
58 | { | ||
59 | rets[i++] = new SOPObject(m_rootScene, pair.Value.LocalId); | ||
60 | } | ||
61 | |||
62 | return rets; | ||
63 | } | ||
46 | } | 64 | } |
47 | 65 | ||
48 | public IObject Root | 66 | public IObject Root |
@@ -52,7 +70,18 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
52 | 70 | ||
53 | public IObjectFace[] Faces | 71 | public IObjectFace[] Faces |
54 | { | 72 | { |
55 | get { throw new System.NotImplementedException(); } | 73 | get |
74 | { | ||
75 | SceneObjectPart sop = GetSOP(); | ||
76 | IObjectFace[] rets = new IObjectFace[getNumberOfSides(sop)]; | ||
77 | |||
78 | for (int i = 0; i < rets.Length;i++ ) | ||
79 | { | ||
80 | //rets[i] = new ObjectFace | ||
81 | } | ||
82 | |||
83 | return rets; | ||
84 | } | ||
56 | } | 85 | } |
57 | 86 | ||
58 | public Vector3 Scale | 87 | public Vector3 Scale |
@@ -153,7 +182,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
153 | 182 | ||
154 | public PrimType PrimShape | 183 | public PrimType PrimShape |
155 | { | 184 | { |
156 | get { throw new System.NotImplementedException(); } | 185 | get { return (PrimType) getScriptPrimType(GetSOP().Shape); } |
157 | set { throw new System.NotImplementedException(); } | 186 | set { throw new System.NotImplementedException(); } |
158 | } | 187 | } |
159 | 188 | ||
@@ -162,5 +191,127 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
162 | get { throw new System.NotImplementedException(); } | 191 | get { throw new System.NotImplementedException(); } |
163 | set { throw new System.NotImplementedException(); } | 192 | set { throw new System.NotImplementedException(); } |
164 | } | 193 | } |
194 | |||
195 | |||
196 | #region Supporting Functions | ||
197 | |||
198 | // Helper functions to understand if object has cut, hollow, dimple, and other affecting number of faces | ||
199 | private static void hasCutHollowDimpleProfileCut(int primType, PrimitiveBaseShape shape, out bool hasCut, out bool hasHollow, | ||
200 | out bool hasDimple, out bool hasProfileCut) | ||
201 | { | ||
202 | if (primType == (int)PrimType.Box | ||
203 | || | ||
204 | primType == (int)PrimType.Cylinder | ||
205 | || | ||
206 | primType == (int)PrimType.Prism) | ||
207 | |||
208 | hasCut = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0); | ||
209 | else | ||
210 | hasCut = (shape.PathBegin > 0) || (shape.PathEnd > 0); | ||
211 | |||
212 | hasHollow = shape.ProfileHollow > 0; | ||
213 | hasDimple = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0); // taken from llSetPrimitiveParms | ||
214 | hasProfileCut = hasDimple; // is it the same thing? | ||
215 | |||
216 | } | ||
217 | |||
218 | private static int getScriptPrimType(PrimitiveBaseShape primShape) | ||
219 | { | ||
220 | if (primShape.SculptEntry) | ||
221 | return (int) PrimType.Sculpt; | ||
222 | if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.Square) | ||
223 | { | ||
224 | if (primShape.PathCurve == (byte) Extrusion.Straight) | ||
225 | return (int) PrimType.Box; | ||
226 | if (primShape.PathCurve == (byte) Extrusion.Curve1) | ||
227 | return (int) PrimType.Tube; | ||
228 | } | ||
229 | else if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.Circle) | ||
230 | { | ||
231 | if (primShape.PathCurve == (byte) Extrusion.Straight) | ||
232 | return (int) PrimType.Cylinder; | ||
233 | if (primShape.PathCurve == (byte) Extrusion.Curve1) | ||
234 | return (int) PrimType.Torus; | ||
235 | } | ||
236 | else if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.HalfCircle) | ||
237 | { | ||
238 | if (primShape.PathCurve == (byte) Extrusion.Curve1 || primShape.PathCurve == (byte) Extrusion.Curve2) | ||
239 | return (int) PrimType.Sphere; | ||
240 | } | ||
241 | else if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.EquilateralTriangle) | ||
242 | { | ||
243 | if (primShape.PathCurve == (byte) Extrusion.Straight) | ||
244 | return (int) PrimType.Prism; | ||
245 | if (primShape.PathCurve == (byte) Extrusion.Curve1) | ||
246 | return (int) PrimType.Ring; | ||
247 | } | ||
248 | return (int) PrimType.NotPrimitive; | ||
249 | } | ||
250 | |||
251 | private static int getNumberOfSides(SceneObjectPart part) | ||
252 | { | ||
253 | int ret; | ||
254 | bool hasCut; | ||
255 | bool hasHollow; | ||
256 | bool hasDimple; | ||
257 | bool hasProfileCut; | ||
258 | |||
259 | int primType = getScriptPrimType(part.Shape); | ||
260 | hasCutHollowDimpleProfileCut(primType, part.Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut); | ||
261 | |||
262 | switch (primType) | ||
263 | { | ||
264 | default: | ||
265 | case (int) PrimType.Box: | ||
266 | ret = 6; | ||
267 | if (hasCut) ret += 2; | ||
268 | if (hasHollow) ret += 1; | ||
269 | break; | ||
270 | case (int) PrimType.Cylinder: | ||
271 | ret = 3; | ||
272 | if (hasCut) ret += 2; | ||
273 | if (hasHollow) ret += 1; | ||
274 | break; | ||
275 | case (int) PrimType.Prism: | ||
276 | ret = 5; | ||
277 | if (hasCut) ret += 2; | ||
278 | if (hasHollow) ret += 1; | ||
279 | break; | ||
280 | case (int) PrimType.Sphere: | ||
281 | ret = 1; | ||
282 | if (hasCut) ret += 2; | ||
283 | if (hasDimple) ret += 2; | ||
284 | if (hasHollow) | ||
285 | ret += 1; // GOTCHA: LSL shows 2 additional sides here. | ||
286 | // This has been fixed, but may cause porting issues. | ||
287 | break; | ||
288 | case (int) PrimType.Torus: | ||
289 | ret = 1; | ||
290 | if (hasCut) ret += 2; | ||
291 | if (hasProfileCut) ret += 2; | ||
292 | if (hasHollow) ret += 1; | ||
293 | break; | ||
294 | case (int) PrimType.Tube: | ||
295 | ret = 4; | ||
296 | if (hasCut) ret += 2; | ||
297 | if (hasProfileCut) ret += 2; | ||
298 | if (hasHollow) ret += 1; | ||
299 | break; | ||
300 | case (int) PrimType.Ring: | ||
301 | ret = 3; | ||
302 | if (hasCut) ret += 2; | ||
303 | if (hasProfileCut) ret += 2; | ||
304 | if (hasHollow) ret += 1; | ||
305 | break; | ||
306 | case (int) PrimType.Sculpt: | ||
307 | ret = 1; | ||
308 | break; | ||
309 | } | ||
310 | return ret; | ||
311 | } | ||
312 | |||
313 | |||
314 | #endregion | ||
315 | |||
165 | } | 316 | } |
166 | } | 317 | } |