aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
diff options
context:
space:
mode:
authorMelanie Thielker2008-08-24 14:04:02 +0000
committerMelanie Thielker2008-08-24 14:04:02 +0000
commitec9137c4fa0228fcc218e54d18707e51cbec9738 (patch)
tree0c9e5d64e3bb84749baf109594d2d07289bd4e89 /OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
parentSelling a copy of a prim (prim vendor) now works. (diff)
downloadopensim-SC-ec9137c4fa0228fcc218e54d18707e51cbec9738.zip
opensim-SC-ec9137c4fa0228fcc218e54d18707e51cbec9738.tar.gz
opensim-SC-ec9137c4fa0228fcc218e54d18707e51cbec9738.tar.bz2
opensim-SC-ec9137c4fa0228fcc218e54d18707e51cbec9738.tar.xz
Mantis #2028
Thank you, salahzar, for a patch that implements llGetNumberOfSides() for the DotNetEngine.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs106
1 files changed, 104 insertions, 2 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
index be337e7..2b06e3d 100644
--- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
+++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
@@ -3321,12 +3321,114 @@ namespace OpenSim.Region.ScriptEngine.Common
3321 return result; 3321 return result;
3322 3322
3323 } 3323 }
3324 // this function to understand which shape it is (taken from meshmerizer)
3325 // quite useful can be used by meshmerizer to have a centralized point of understanding the shape
3326 // except that it refers to scripting constants
3327 private int getScriptPrimType(PrimitiveBaseShape primShape)
3328 {
3329
3330 if (primShape.SculptEntry)
3331 return BuiltIn_Commands_BaseClass.PRIM_TYPE_SCULPT;
3332 if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Square)
3333 {
3334 if (primShape.PathCurve == (byte)Extrusion.Straight)
3335 return BuiltIn_Commands_BaseClass.PRIM_TYPE_BOX;
3336 else if (primShape.PathCurve == (byte)Extrusion.Curve1)
3337 return BuiltIn_Commands_BaseClass.PRIM_TYPE_TUBE;
3338 }
3339 else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
3340 {
3341 if (primShape.PathCurve == (byte)Extrusion.Straight)
3342 return BuiltIn_Commands_BaseClass.PRIM_TYPE_CYLINDER;
3343 // ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits
3344 else if (primShape.PathCurve == (byte)Extrusion.Curve1)
3345 return BuiltIn_Commands_BaseClass.PRIM_TYPE_TORUS;
3346 }
3347 else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
3348 {
3349 if (primShape.PathCurve == (byte)Extrusion.Curve1 || primShape.PathCurve == (byte)Extrusion.Curve2)
3350 return BuiltIn_Commands_BaseClass.PRIM_TYPE_SPHERE;
3351 }
3352 else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
3353 {
3354 if (primShape.PathCurve == (byte)Extrusion.Straight)
3355 return BuiltIn_Commands_BaseClass.PRIM_TYPE_PRISM;
3356 else if (primShape.PathCurve == (byte)Extrusion.Curve1)
3357 return BuiltIn_Commands_BaseClass.PRIM_TYPE_RING;
3358 }
3359 return BuiltIn_Commands_BaseClass.PRIM_TYPE_BOX;
3360
3361
3362 }
3363 // Helper functions to understand if object has cut, hollow, dimple, and other affecting number of faces
3364 private void hasCutHollowDimpleProfileCut(PrimitiveBaseShape shape, out bool hasCut, out bool hasHollow,
3365 out bool hasDimple, out bool hasProfileCut)
3366 {
3367 hasCut = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0);
3368 hasHollow = shape.ProfileHollow > 0;
3369 hasDimple = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0); // taken from llSetPrimitiveParms
3370 hasProfileCut = (shape.PathBegin > 0) || (shape.PathEnd > 0); // is it the same thing?
3371
3372 }
3324 3373
3325 public LSL_Types.LSLInteger llGetNumberOfSides() 3374 public LSL_Types.LSLInteger llGetNumberOfSides()
3326 { 3375 {
3327 m_host.AddScriptLPS(1); 3376 m_host.AddScriptLPS(1);
3328 NotImplemented("llGetNumberOfSides"); 3377 int ret = 0;
3329 return 0; 3378 bool hasCut;
3379 bool hasHollow;
3380 bool hasDimple;
3381 bool hasProfileCut;
3382
3383 hasCutHollowDimpleProfileCut(m_host.Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut);
3384
3385 switch (getScriptPrimType(m_host.Shape))
3386 {
3387 case BuiltIn_Commands_BaseClass.PRIM_TYPE_BOX:
3388 ret = 6;
3389 if (hasCut) ret += 2;
3390 if (hasHollow) ret += 1;
3391 break;
3392 case BuiltIn_Commands_BaseClass.PRIM_TYPE_CYLINDER:
3393 ret = 3;
3394 if (hasCut) ret += 2;
3395 if (hasHollow) ret += 1;
3396 break;
3397 case BuiltIn_Commands_BaseClass.PRIM_TYPE_PRISM:
3398 ret = 5;
3399 if (hasCut) ret += 2;
3400 if (hasHollow) ret += 1;
3401 break;
3402 case BuiltIn_Commands_BaseClass.PRIM_TYPE_SPHERE:
3403 ret = 1;
3404 if (hasProfileCut) ret += 2;
3405 if (hasDimple) ret += 2;
3406 if (hasHollow) ret += 1; // actually lsl adds 4!!!!!! is that a great mistake?
3407 break;
3408 case BuiltIn_Commands_BaseClass.PRIM_TYPE_TORUS:
3409 ret = 1;
3410 if (hasCut) ret += 2;
3411 if (hasProfileCut) ret += 2;
3412 if (hasHollow) ret += 1;
3413 break;
3414 case BuiltIn_Commands_BaseClass.PRIM_TYPE_TUBE:
3415 ret = 4;
3416 if (hasCut) ret += 2;
3417 if (hasProfileCut) ret += 2;
3418 if (hasHollow) ret += 1;
3419 break;
3420 case BuiltIn_Commands_BaseClass.PRIM_TYPE_RING:
3421 ret = 3;
3422 if (hasCut) ret += 2;
3423 if (hasProfileCut) ret += 2;
3424 if (hasHollow) ret += 1;
3425 break;
3426 case BuiltIn_Commands_BaseClass.PRIM_TYPE_SCULPT:
3427 ret = 1;
3428 break;
3429 }
3430
3431 return ret;
3330 } 3432 }
3331 3433
3332 3434