remove now duplicated shape code from LSL_Api.cs

mysql-performance
Justin Clark-Casey (justincc) 2010-02-01 22:08:00 +00:00
parent 3863cd1d23
commit ecc068fbe0
2 changed files with 49 additions and 194 deletions

View File

@ -3029,8 +3029,8 @@ namespace OpenSim.Region.Framework.Scenes
bool hasDimple;
bool hasProfileCut;
PrimType primType = getScriptPrimType();
hasCutHollowDimpleProfileCut(primType, Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut);
PrimType primType = GetScriptPrimType();
HasCutHollowDimpleProfileCut(primType, Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut);
switch (primType)
{
@ -3085,7 +3085,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary>
/// <param name="primShape"></param>
/// <returns></returns>
public PrimType getScriptPrimType()
public PrimType GetScriptPrimType()
{
if (Shape.SculptEntry)
return PrimType.SCULPT;
@ -3129,7 +3129,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="hasHollow"></param>
/// <param name="hasDimple"></param>
/// <param name="hasProfileCut"></param>
protected static void hasCutHollowDimpleProfileCut(PrimType primType, PrimitiveBaseShape shape, out bool hasCut, out bool hasHollow,
protected static void HasCutHollowDimpleProfileCut(PrimType primType, PrimitiveBaseShape shape, out bool hasCut, out bool hasHollow,
out bool hasDimple, out bool hasProfileCut)
{
if (primType == PrimType.BOX

View File

@ -1330,44 +1330,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
m_host.AddScriptLPS(1);
SetColor(m_host, color, face);
}
protected void SetColor(SceneObjectPart part, LSL_Vector color, int face)
{
Primitive.TextureEntry tex = part.Shape.Textures;
Color4 texcolor;
if (face >= 0 && face < GetNumberOfSides(part))
{
texcolor = tex.CreateFace((uint)face).RGBA;
texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
tex.FaceTextures[face].RGBA = texcolor;
part.UpdateTexture(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
{
for (uint i = 0; i < GetNumberOfSides(part); i++)
{
if (tex.FaceTextures[i] != null)
{
texcolor = tex.FaceTextures[i].RGBA;
texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
tex.FaceTextures[i].RGBA = texcolor;
}
texcolor = tex.DefaultTexture.RGBA;
texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
tex.DefaultTexture.RGBA = texcolor;
}
part.UpdateTexture(tex);
return;
}
m_host.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face);
}
public void SetTexGen(SceneObjectPart part, int face,int style)
@ -1378,7 +1341,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (style == (int)ScriptBaseClass.PRIM_TEXGEN_PLANAR)
textype = MappingType.Planar;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
tex.CreateFace((uint) face);
tex.FaceTextures[face].TexMapType = textype;
@ -1387,7 +1350,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
else if (face == ScriptBaseClass.ALL_SIDES)
{
for (uint i = 0; i < GetNumberOfSides(part); i++)
for (uint i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1403,7 +1366,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void SetGlow(SceneObjectPart part, int face, float glow)
{
Primitive.TextureEntry tex = part.Shape.Textures;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
tex.CreateFace((uint) face);
tex.FaceTextures[face].Glow = glow;
@ -1412,7 +1375,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
else if (face == ScriptBaseClass.ALL_SIDES)
{
for (uint i = 0; i < GetNumberOfSides(part); i++)
for (uint i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1450,7 +1413,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
Primitive.TextureEntry tex = part.Shape.Textures;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
tex.CreateFace((uint) face);
tex.FaceTextures[face].Shiny = sval;
@ -1460,7 +1423,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
else if (face == ScriptBaseClass.ALL_SIDES)
{
for (uint i = 0; i < GetNumberOfSides(part); i++)
for (uint i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1478,7 +1441,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void SetFullBright(SceneObjectPart part, int face, bool bright)
{
Primitive.TextureEntry tex = part.Shape.Textures;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
tex.CreateFace((uint) face);
tex.FaceTextures[face].Fullbright = bright;
@ -1487,7 +1450,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
else if (face == ScriptBaseClass.ALL_SIDES)
{
for (uint i = 0; i < GetNumberOfSides(part); i++)
for (uint i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1514,11 +1477,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
int i;
double sum = 0.0;
for (i = 0 ; i < GetNumberOfSides(part) ; i++)
for (i = 0 ; i < part.GetNumberOfSides(); i++)
sum += (double)tex.GetFace((uint)i).RGBA.A;
return sum;
}
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
return (double)tex.GetFace((uint)face).RGBA.A;
}
@ -1546,7 +1509,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
Primitive.TextureEntry tex = part.Shape.Textures;
Color4 texcolor;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
texcolor = tex.CreateFace((uint)face).RGBA;
texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f);
@ -1556,7 +1519,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
else if (face == ScriptBaseClass.ALL_SIDES)
{
for (int i = 0; i < GetNumberOfSides(part); i++)
for (int i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1661,7 +1624,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
int i;
for (i = 0 ; i < GetNumberOfSides(part) ; i++)
for (i = 0 ; i < part.GetNumberOfSides(); i++)
{
texcolor = tex.GetFace((uint)i).RGBA;
rgb.x += texcolor.R;
@ -1669,13 +1632,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
rgb.z += texcolor.B;
}
rgb.x /= (float)GetNumberOfSides(part);
rgb.y /= (float)GetNumberOfSides(part);
rgb.z /= (float)GetNumberOfSides(part);
rgb.x /= (float)part.GetNumberOfSides();
rgb.y /= (float)part.GetNumberOfSides();
rgb.z /= (float)part.GetNumberOfSides();
return rgb;
}
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
texcolor = tex.GetFace((uint)face).RGBA;
rgb.x = texcolor.R;
@ -1722,7 +1685,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
Primitive.TextureEntry tex = part.Shape.Textures;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
texface.TextureID = textureID;
@ -1732,7 +1695,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
else if (face == ScriptBaseClass.ALL_SIDES)
{
for (uint i = 0; i < GetNumberOfSides(part); i++)
for (uint i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1756,7 +1719,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected void ScaleTexture(SceneObjectPart part, double u, double v, int face)
{
Primitive.TextureEntry tex = part.Shape.Textures;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
texface.RepeatU = (float)u;
@ -1767,7 +1730,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
if (face == ScriptBaseClass.ALL_SIDES)
{
for (int i = 0; i < GetNumberOfSides(part); i++)
for (int i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1792,7 +1755,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected void OffsetTexture(SceneObjectPart part, double u, double v, int face)
{
Primitive.TextureEntry tex = part.Shape.Textures;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
texface.OffsetU = (float)u;
@ -1803,7 +1766,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
if (face == ScriptBaseClass.ALL_SIDES)
{
for (int i = 0; i < GetNumberOfSides(part); i++)
for (int i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1828,7 +1791,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected void RotateTexture(SceneObjectPart part, double rotation, int face)
{
Primitive.TextureEntry tex = part.Shape.Textures;
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
texface.Rotation = (float)rotation;
@ -1838,7 +1801,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
if (face == ScriptBaseClass.ALL_SIDES)
{
for (int i = 0; i < GetNumberOfSides(part); i++)
for (int i = 0; i < part.GetNumberOfSides(); i++)
{
if (tex.FaceTextures[i] != null)
{
@ -1864,7 +1827,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
face = 0;
}
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
Primitive.TextureEntryFace texface;
texface = tex.GetFace((uint)face);
@ -3414,7 +3377,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
List<SceneObjectPart> parts = GetLinkParts(linknumber);
foreach (SceneObjectPart part in parts)
SetColor(part, color, face);
part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face);
}
public void llCreateLink(string target, int parent)
@ -4271,127 +4234,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return result;
}
// this function to understand which shape it is (taken from meshmerizer)
// quite useful can be used by meshmerizer to have a centralized point of understanding the shape
// except that it refers to scripting constants
public int getScriptPrimType(PrimitiveBaseShape primShape)
{
if (primShape.SculptEntry)
return ScriptBaseClass.PRIM_TYPE_SCULPT;
if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Square)
{
if (primShape.PathCurve == (byte)Extrusion.Straight)
return ScriptBaseClass.PRIM_TYPE_BOX;
else if (primShape.PathCurve == (byte)Extrusion.Curve1)
return ScriptBaseClass.PRIM_TYPE_TUBE;
}
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.Circle)
{
if (primShape.PathCurve == (byte)Extrusion.Straight)
return ScriptBaseClass.PRIM_TYPE_CYLINDER;
// ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits
else if (primShape.PathCurve == (byte)Extrusion.Curve1)
return ScriptBaseClass.PRIM_TYPE_TORUS;
}
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle)
{
if (primShape.PathCurve == (byte)Extrusion.Curve1 || primShape.PathCurve == (byte)Extrusion.Curve2)
return ScriptBaseClass.PRIM_TYPE_SPHERE;
}
else if ((primShape.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle)
{
if (primShape.PathCurve == (byte)Extrusion.Straight)
return ScriptBaseClass.PRIM_TYPE_PRISM;
else if (primShape.PathCurve == (byte)Extrusion.Curve1)
return ScriptBaseClass.PRIM_TYPE_RING;
}
return ScriptBaseClass.PRIM_TYPE_BOX;
}
// Helper functions to understand if object has cut, hollow, dimple, and other affecting number of faces
protected void hasCutHollowDimpleProfileCut(int primType, PrimitiveBaseShape shape, out bool hasCut, out bool hasHollow,
out bool hasDimple, out bool hasProfileCut)
{
if (primType == ScriptBaseClass.PRIM_TYPE_BOX
||
primType == ScriptBaseClass.PRIM_TYPE_CYLINDER
||
primType == ScriptBaseClass.PRIM_TYPE_PRISM)
hasCut = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0);
else
hasCut = (shape.PathBegin > 0) || (shape.PathEnd > 0);
hasHollow = shape.ProfileHollow > 0;
hasDimple = (shape.ProfileBegin > 0) || (shape.ProfileEnd > 0); // taken from llSetPrimitiveParms
hasProfileCut = hasDimple; // is it the same thing?
}
public LSL_Integer llGetNumberOfSides()
{
m_host.AddScriptLPS(1);
return GetNumberOfSides(m_host);
}
protected int GetNumberOfSides(SceneObjectPart part)
{
int ret = 0;
bool hasCut;
bool hasHollow;
bool hasDimple;
bool hasProfileCut;
int primType = getScriptPrimType(part.Shape);
hasCutHollowDimpleProfileCut(primType, part.Shape, out hasCut, out hasHollow, out hasDimple, out hasProfileCut);
switch (primType)
{
case ScriptBaseClass.PRIM_TYPE_BOX:
ret = 6;
if (hasCut) ret += 2;
if (hasHollow) ret += 1;
break;
case ScriptBaseClass.PRIM_TYPE_CYLINDER:
ret = 3;
if (hasCut) ret += 2;
if (hasHollow) ret += 1;
break;
case ScriptBaseClass.PRIM_TYPE_PRISM:
ret = 5;
if (hasCut) ret += 2;
if (hasHollow) ret += 1;
break;
case ScriptBaseClass.PRIM_TYPE_SPHERE:
ret = 1;
if (hasCut) ret += 2;
if (hasDimple) ret += 2;
if (hasHollow) ret += 3; // Emulate lsl on secondlife (according to documentation it should have added only +1)
break;
case ScriptBaseClass.PRIM_TYPE_TORUS:
ret = 1;
if (hasCut) ret += 2;
if (hasProfileCut) ret += 2;
if (hasHollow) ret += 1;
break;
case ScriptBaseClass.PRIM_TYPE_TUBE:
ret = 4;
if (hasCut) ret += 2;
if (hasProfileCut) ret += 2;
if (hasHollow) ret += 1;
break;
case ScriptBaseClass.PRIM_TYPE_RING:
ret = 3;
if (hasCut) ret += 2;
if (hasProfileCut) ret += 2;
if (hasHollow) ret += 1;
break;
case ScriptBaseClass.PRIM_TYPE_SCULPT:
ret = 1;
break;
}
return ret;
return m_host.GetNumberOfSides();
}
/* The new / changed functions were tested with the following LSL script:
@ -4588,7 +4435,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
face = 0;
}
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
offset.x = tex.GetFace((uint)face).OffsetU;
offset.y = tex.GetFace((uint)face).OffsetV;
@ -4629,7 +4476,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
face = 0;
}
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
return tex.GetFace((uint)face).Rotation;
}
@ -7019,10 +6866,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LSL_Vector color=rules.GetVector3Item(idx++);
double alpha=(double)rules.GetLSLFloatItem(idx++);
SetColor(part, color, face);
part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face);
SetAlpha(part, alpha, face);
break;
case (int)ScriptBaseClass.PRIM_FLEXIBLE:
if (remain < 7)
return;
@ -7038,6 +6886,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force);
break;
case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
if (remain < 5)
return;
@ -7050,6 +6899,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
SetPointLight(part, light, lightcolor, intensity, radius, falloff);
break;
case (int)ScriptBaseClass.PRIM_GLOW:
if (remain < 2)
return;
@ -7059,6 +6909,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
SetGlow(part, face, glow);
break;
case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
if (remain < 3)
return;
@ -7069,6 +6920,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
SetShiny(part, face, shiny, bump);
break;
case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
if (remain < 2)
return;
@ -7076,6 +6928,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
bool st = rules.GetLSLIntegerItem(idx++);
SetFullBright(part, face , st);
break;
case (int)ScriptBaseClass.PRIM_MATERIAL:
if (remain < 1)
return;
@ -7085,6 +6938,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
part.Material = Convert.ToByte(mat);
break;
case (int)ScriptBaseClass.PRIM_PHANTOM:
if (remain < 1)
return;
@ -7099,6 +6953,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
part.ScriptSetPhantomStatus(phantom);
break;
case (int)ScriptBaseClass.PRIM_PHYSICS:
if (remain < 1)
return;
@ -7112,6 +6967,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
part.ScriptSetPhysicsStatus(physics);
break;
case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
if (remain < 1)
return;
@ -7379,7 +7235,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_List GetLinkPrimitiveParams(SceneObjectPart part, LSL_List rules)
{
LSL_List res = new LSL_List();
int idx=0;
while (idx < rules.Length)
@ -7441,7 +7296,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
case (int)ScriptBaseClass.PRIM_TYPE:
// implementing box
PrimitiveBaseShape Shape = part.Shape;
int primType = getScriptPrimType(part.Shape);
int primType = (int)part.GetScriptPrimType();
res.Add(new LSL_Integer(primType));
double topshearx = (double)(sbyte)Shape.PathShearX / 100.0; // Fix negative values for PathShearX
double topsheary = (double)(sbyte)Shape.PathShearY / 100.0; // and PathShearY.
@ -7521,7 +7376,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
Primitive.TextureEntry tex = part.Shape.Textures;
if (face == ScriptBaseClass.ALL_SIDES)
{
for (face = 0 ; face < GetNumberOfSides(part) ; face++)
for (face = 0 ; face < part.GetNumberOfSides() ; face++)
{
Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
@ -7537,7 +7392,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
else
{
if (face >= 0 && face < GetNumberOfSides(part))
if (face >= 0 && face < part.GetNumberOfSides())
{
Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
@ -7563,7 +7418,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
Color4 texcolor;
if (face == ScriptBaseClass.ALL_SIDES)
{
for (face = 0 ; face < GetNumberOfSides(part) ; face++)
for (face = 0 ; face < part.GetNumberOfSides() ; face++)
{
texcolor = tex.GetFace((uint)face).RGBA;
res.Add(new LSL_Vector(texcolor.R,