aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs150
1 files changed, 29 insertions, 121 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 33218aa..e4ccce8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -54,8 +54,8 @@ using OpenSim.Region.ScriptEngine.Interfaces;
54using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces; 54using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
55using OpenSim.Services.Interfaces; 55using OpenSim.Services.Interfaces;
56 56
57using PrimType = OpenSim.Region.Framework.Scenes.PrimType;
57using GridRegion = OpenSim.Services.Interfaces.GridRegion; 58using GridRegion = OpenSim.Services.Interfaces.GridRegion;
58
59using AssetLandmark = OpenSim.Framework.AssetLandmark; 59using AssetLandmark = OpenSim.Framework.AssetLandmark;
60 60
61using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat; 61using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
@@ -1442,6 +1442,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1442 part.UpdateTexture(tex); 1442 part.UpdateTexture(tex);
1443 return; 1443 return;
1444 } 1444 }
1445
1446 if (face == ScriptBaseClass.ALL_SIDES)
1447 face = SceneObjectPart.ALL_SIDES;
1448
1449 m_host.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face);
1445 } 1450 }
1446 1451
1447 public void SetTexGen(SceneObjectPart part, int face,int style) 1452 public void SetTexGen(SceneObjectPart part, int face,int style)
@@ -1599,7 +1604,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1599 { 1604 {
1600 int i; 1605 int i;
1601 double sum = 0.0; 1606 double sum = 0.0;
1602 for (i = 0 ; i < GetNumberOfSides(part) ; i++) 1607 for (i = 0 ; i < GetNumberOfSides(part); i++)
1603 sum += (double)tex.GetFace((uint)i).RGBA.A; 1608 sum += (double)tex.GetFace((uint)i).RGBA.A;
1604 return sum; 1609 return sum;
1605 } 1610 }
@@ -1749,7 +1754,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1749 { 1754 {
1750 int i; 1755 int i;
1751 1756
1752 for (i = 0 ; i < GetNumberOfSides(part) ; i++) 1757 for (i = 0 ; i < GetNumberOfSides(part); i++)
1753 { 1758 {
1754 texcolor = tex.GetFace((uint)i).RGBA; 1759 texcolor = tex.GetFace((uint)i).RGBA;
1755 rgb.x += texcolor.R; 1760 rgb.x += texcolor.R;
@@ -3568,7 +3573,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3568 List<SceneObjectPart> parts = GetLinkParts(linknumber); 3573 List<SceneObjectPart> parts = GetLinkParts(linknumber);
3569 3574
3570 foreach (SceneObjectPart part in parts) 3575 foreach (SceneObjectPart part in parts)
3571 SetColor(part, color, face); 3576 part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face);
3572 } 3577 }
3573 3578
3574 public void llCreateLink(string target, int parent) 3579 public void llCreateLink(string target, int parent)
@@ -4423,63 +4428,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4423 return result; 4428 return result;
4424 } 4429 }
4425 4430
4426 // this function to understand which shape it is (taken from meshmerizer)
4427 // quite useful can be used by meshmerizer to have a centralized point of understanding the shape
4428 // except that it refers to scripting constants
4429 public int getScriptPrimType(PrimitiveBaseShape primShape)
4430 {
4431 if (primShape.SculptEntry)
4432 return ScriptBaseClass.PRIM_TYPE_SCULPT;
4433 if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Square)
4434 {
4435 if (primShape.PathCurve == (byte)Extrusion.Straight)
4436 return ScriptBaseClass.PRIM_TYPE_BOX;
4437 else if (primShape.PathCurve == (byte)Extrusion.Curve1)
4438 return ScriptBaseClass.PRIM_TYPE_TUBE;
4439 }
4440 else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
4441 {
4442 if (primShape.PathCurve == (byte)Extrusion.Straight)
4443 return ScriptBaseClass.PRIM_TYPE_CYLINDER;
4444 // ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits
4445 else if (primShape.PathCurve == (byte)Extrusion.Curve1)
4446 return ScriptBaseClass.PRIM_TYPE_TORUS;
4447 }
4448 else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
4449 {
4450 if (primShape.PathCurve == (byte)Extrusion.Curve1 || primShape.PathCurve == (byte)Extrusion.Curve2)
4451 return ScriptBaseClass.PRIM_TYPE_SPHERE;
4452 }
4453 else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
4454 {
4455 if (primShape.PathCurve == (byte)Extrusion.Straight)
4456 return ScriptBaseClass.PRIM_TYPE_PRISM;
4457 else if (primShape.PathCurve == (byte)Extrusion.Curve1)
4458 return ScriptBaseClass.PRIM_TYPE_RING;
4459 }
4460 return ScriptBaseClass.PRIM_TYPE_BOX;
4461 }
4462
4463 // Helper functions to understand if object has cut, hollow, dimple, and other affecting number of faces
4464 protected void hasCutHollowDimpleProfileCut(int primType, PrimitiveBaseShape shape, out bool hasCut, out bool hasHollow,
4465 out bool hasDimple, out bool hasProfileCut)
4466 {
4467 if (primType == ScriptBaseClass.PRIM_TYPE_BOX
4468 ||
4469 primType == ScriptBaseClass.PRIM_TYPE_CYLINDER
4470 ||
4471 primType == ScriptBaseClass.PRIM_TYPE_PRISM)
4472
4473 hasCut = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0);
4474 else
4475 hasCut = (shape.PathBegin > 0) || (shape.PathEnd > 0);
4476
4477 hasHollow = shape.ProfileHollow > 0;
4478 hasDimple = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0); // taken from llSetPrimitiveParms
4479 hasProfileCut = hasDimple; // is it the same thing?
4480
4481 }
4482
4483 public LSL_Integer llGetNumberOfSides() 4431 public LSL_Integer llGetNumberOfSides()
4484 { 4432 {
4485 m_host.AddScriptLPS(1); 4433 m_host.AddScriptLPS(1);
@@ -4489,63 +4437,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4489 4437
4490 protected int GetNumberOfSides(SceneObjectPart part) 4438 protected int GetNumberOfSides(SceneObjectPart part)
4491 { 4439 {
4492 int ret = 0; 4440 int sides = part.GetNumberOfSides();
4493 bool hasCut;
4494 bool hasHollow;
4495 bool hasDimple;
4496 bool hasProfileCut;
4497
4498 int primType = getScriptPrimType(part.Shape);
4499 hasCutHollowDimpleProfileCut(primType, part.Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut);
4500 4441
4501 switch (primType) 4442 if (part.GetPrimType() == PrimType.SPHERE && part.Shape.ProfileHollow > 0)
4502 { 4443 {
4503 case ScriptBaseClass.PRIM_TYPE_BOX: 4444 // Make up for a bug where LSL shows 4 sides rather than 2
4504 ret = 6; 4445 sides += 2;
4505 if (hasCut) ret += 2;
4506 if (hasHollow) ret += 1;
4507 break;
4508 case ScriptBaseClass.PRIM_TYPE_CYLINDER:
4509 ret = 3;
4510 if (hasCut) ret += 2;
4511 if (hasHollow) ret += 1;
4512 break;
4513 case ScriptBaseClass.PRIM_TYPE_PRISM:
4514 ret = 5;
4515 if (hasCut) ret += 2;
4516 if (hasHollow) ret += 1;
4517 break;
4518 case ScriptBaseClass.PRIM_TYPE_SPHERE:
4519 ret = 1;
4520 if (hasCut) ret += 2;
4521 if (hasDimple) ret += 2;
4522 if (hasHollow) ret += 3; // Emulate lsl on secondlife (according to documentation it should have added only +1)
4523 break;
4524 case ScriptBaseClass.PRIM_TYPE_TORUS:
4525 ret = 1;
4526 if (hasCut) ret += 2;
4527 if (hasProfileCut) ret += 2;
4528 if (hasHollow) ret += 1;
4529 break;
4530 case ScriptBaseClass.PRIM_TYPE_TUBE:
4531 ret = 4;
4532 if (hasCut) ret += 2;
4533 if (hasProfileCut) ret += 2;
4534 if (hasHollow) ret += 1;
4535 break;
4536 case ScriptBaseClass.PRIM_TYPE_RING:
4537 ret = 3;
4538 if (hasCut) ret += 2;
4539 if (hasProfileCut) ret += 2;
4540 if (hasHollow) ret += 1;
4541 break;
4542 case ScriptBaseClass.PRIM_TYPE_SCULPT:
4543 ret = 1;
4544 break;
4545 } 4446 }
4546 return ret;
4547 }
4548 4447
4448 return sides;
4449 }
4450
4549 4451
4550 /* The new / changed functions were tested with the following LSL script: 4452 /* The new / changed functions were tested with the following LSL script:
4551 4453
@@ -4570,8 +4472,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4570 } 4472 }
4571 */ 4473 */
4572 4474
4573
4574
4575 // Xantor 29/apr/2008 4475 // Xantor 29/apr/2008
4576 // Returns rotation described by rotating angle radians about axis. 4476 // Returns rotation described by rotating angle radians about axis.
4577 // q = cos(a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k (z * sin(a/2)) 4477 // q = cos(a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k (z * sin(a/2))
@@ -7203,10 +7103,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7203 LSL_Vector color=rules.GetVector3Item(idx++); 7103 LSL_Vector color=rules.GetVector3Item(idx++);
7204 double alpha=(double)rules.GetLSLFloatItem(idx++); 7104 double alpha=(double)rules.GetLSLFloatItem(idx++);
7205 7105
7206 SetColor(part, color, face); 7106 part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face);
7207 SetAlpha(part, alpha, face); 7107 SetAlpha(part, alpha, face);
7208 7108
7209 break; 7109 break;
7110
7210 case (int)ScriptBaseClass.PRIM_FLEXIBLE: 7111 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
7211 if (remain < 7) 7112 if (remain < 7)
7212 return; 7113 return;
@@ -7222,6 +7123,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7222 SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); 7123 SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force);
7223 7124
7224 break; 7125 break;
7126
7225 case (int)ScriptBaseClass.PRIM_POINT_LIGHT: 7127 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
7226 if (remain < 5) 7128 if (remain < 5)
7227 return; 7129 return;
@@ -7234,6 +7136,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7234 SetPointLight(part, light, lightcolor, intensity, radius, falloff); 7136 SetPointLight(part, light, lightcolor, intensity, radius, falloff);
7235 7137
7236 break; 7138 break;
7139
7237 case (int)ScriptBaseClass.PRIM_GLOW: 7140 case (int)ScriptBaseClass.PRIM_GLOW:
7238 if (remain < 2) 7141 if (remain < 2)
7239 return; 7142 return;
@@ -7243,6 +7146,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7243 SetGlow(part, face, glow); 7146 SetGlow(part, face, glow);
7244 7147
7245 break; 7148 break;
7149
7246 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 7150 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
7247 if (remain < 3) 7151 if (remain < 3)
7248 return; 7152 return;
@@ -7253,6 +7157,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7253 SetShiny(part, face, shiny, bump); 7157 SetShiny(part, face, shiny, bump);
7254 7158
7255 break; 7159 break;
7160
7256 case (int)ScriptBaseClass.PRIM_FULLBRIGHT: 7161 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
7257 if (remain < 2) 7162 if (remain < 2)
7258 return; 7163 return;
@@ -7260,6 +7165,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7260 bool st = rules.GetLSLIntegerItem(idx++); 7165 bool st = rules.GetLSLIntegerItem(idx++);
7261 SetFullBright(part, face , st); 7166 SetFullBright(part, face , st);
7262 break; 7167 break;
7168
7263 case (int)ScriptBaseClass.PRIM_MATERIAL: 7169 case (int)ScriptBaseClass.PRIM_MATERIAL:
7264 if (remain < 1) 7170 if (remain < 1)
7265 return; 7171 return;
@@ -7269,6 +7175,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7269 7175
7270 part.Material = Convert.ToByte(mat); 7176 part.Material = Convert.ToByte(mat);
7271 break; 7177 break;
7178
7272 case (int)ScriptBaseClass.PRIM_PHANTOM: 7179 case (int)ScriptBaseClass.PRIM_PHANTOM:
7273 if (remain < 1) 7180 if (remain < 1)
7274 return; 7181 return;
@@ -7283,6 +7190,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7283 7190
7284 part.ScriptSetPhantomStatus(phantom); 7191 part.ScriptSetPhantomStatus(phantom);
7285 break; 7192 break;
7193
7286 case (int)ScriptBaseClass.PRIM_PHYSICS: 7194 case (int)ScriptBaseClass.PRIM_PHYSICS:
7287 if (remain < 1) 7195 if (remain < 1)
7288 return; 7196 return;
@@ -7296,6 +7204,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7296 7204
7297 part.ScriptSetPhysicsStatus(physics); 7205 part.ScriptSetPhysicsStatus(physics);
7298 break; 7206 break;
7207
7299 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: 7208 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
7300 if (remain < 1) 7209 if (remain < 1)
7301 return; 7210 return;
@@ -7563,7 +7472,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7563 7472
7564 public LSL_List GetLinkPrimitiveParams(SceneObjectPart part, LSL_List rules) 7473 public LSL_List GetLinkPrimitiveParams(SceneObjectPart part, LSL_List rules)
7565 { 7474 {
7566
7567 LSL_List res = new LSL_List(); 7475 LSL_List res = new LSL_List();
7568 int idx=0; 7476 int idx=0;
7569 while (idx < rules.Length) 7477 while (idx < rules.Length)
@@ -7625,7 +7533,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7625 case (int)ScriptBaseClass.PRIM_TYPE: 7533 case (int)ScriptBaseClass.PRIM_TYPE:
7626 // implementing box 7534 // implementing box
7627 PrimitiveBaseShape Shape = part.Shape; 7535 PrimitiveBaseShape Shape = part.Shape;
7628 int primType = getScriptPrimType(part.Shape); 7536 int primType = (int)part.GetPrimType();
7629 res.Add(new LSL_Integer(primType)); 7537 res.Add(new LSL_Integer(primType));
7630 double topshearx = (double)(sbyte)Shape.PathShearX / 100.0; // Fix negative values for PathShearX 7538 double topshearx = (double)(sbyte)Shape.PathShearX / 100.0; // Fix negative values for PathShearX
7631 double topsheary = (double)(sbyte)Shape.PathShearY / 100.0; // and PathShearY. 7539 double topsheary = (double)(sbyte)Shape.PathShearY / 100.0; // and PathShearY.
@@ -7705,7 +7613,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7705 Primitive.TextureEntry tex = part.Shape.Textures; 7613 Primitive.TextureEntry tex = part.Shape.Textures;
7706 if (face == ScriptBaseClass.ALL_SIDES) 7614 if (face == ScriptBaseClass.ALL_SIDES)
7707 { 7615 {
7708 for (face = 0 ; face < GetNumberOfSides(part) ; face++) 7616 for (face = 0 ; face < GetNumberOfSides(part); face++)
7709 { 7617 {
7710 Primitive.TextureEntryFace texface = tex.GetFace((uint)face); 7618 Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
7711 7619
@@ -7747,7 +7655,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7747 Color4 texcolor; 7655 Color4 texcolor;
7748 if (face == ScriptBaseClass.ALL_SIDES) 7656 if (face == ScriptBaseClass.ALL_SIDES)
7749 { 7657 {
7750 for (face = 0 ; face < GetNumberOfSides(part) ; face++) 7658 for (face = 0 ; face < GetNumberOfSides(part); face++)
7751 { 7659 {
7752 texcolor = tex.GetFace((uint)face).RGBA; 7660 texcolor = tex.GetFace((uint)face).RGBA;
7753 res.Add(new LSL_Vector(texcolor.R, 7661 res.Add(new LSL_Vector(texcolor.R,