* Implements a number of members on SOGObject for use with the MRM Script Engine API.
* It's lag-tacular! :D0.6.4-rc1
parent
f3aac0fa4a
commit
0e7e2eba14
|
@ -66,15 +66,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public enum PrimType
|
||||
{
|
||||
NotPrimitive,
|
||||
Box,
|
||||
Cylinder,
|
||||
Prism,
|
||||
Sphere,
|
||||
Torus,
|
||||
Tube,
|
||||
Ring,
|
||||
Sculpt
|
||||
NotPrimitive = 255,
|
||||
Box = 0,
|
||||
Cylinder = 1,
|
||||
Prism = 2,
|
||||
Sphere = 3,
|
||||
Torus = 4,
|
||||
Tube = 5,
|
||||
Ring = 6,
|
||||
Sculpt = 7
|
||||
}
|
||||
|
||||
public enum TextureMapping
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
|
@ -17,6 +16,11 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
m_localID = localID;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This needs to run very, very quickly.
|
||||
/// It is utilized in nearly every property and method.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private SceneObjectPart GetSOP()
|
||||
{
|
||||
if (m_rootScene.Entities.ContainsKey(m_localID))
|
||||
|
@ -42,7 +46,21 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public IObject[] Children
|
||||
{
|
||||
get { throw new System.NotImplementedException(); }
|
||||
get
|
||||
{
|
||||
SceneObjectPart my = GetSOP();
|
||||
int total = my.ParentGroup.Children.Count;
|
||||
|
||||
IObject[] rets = new IObject[total];
|
||||
|
||||
int i = 0;
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> pair in my.ParentGroup.Children)
|
||||
{
|
||||
rets[i++] = new SOPObject(m_rootScene, pair.Value.LocalId);
|
||||
}
|
||||
|
||||
return rets;
|
||||
}
|
||||
}
|
||||
|
||||
public IObject Root
|
||||
|
@ -52,7 +70,18 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public IObjectFace[] Faces
|
||||
{
|
||||
get { throw new System.NotImplementedException(); }
|
||||
get
|
||||
{
|
||||
SceneObjectPart sop = GetSOP();
|
||||
IObjectFace[] rets = new IObjectFace[getNumberOfSides(sop)];
|
||||
|
||||
for (int i = 0; i < rets.Length;i++ )
|
||||
{
|
||||
//rets[i] = new ObjectFace
|
||||
}
|
||||
|
||||
return rets;
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3 Scale
|
||||
|
@ -153,7 +182,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public PrimType PrimShape
|
||||
{
|
||||
get { throw new System.NotImplementedException(); }
|
||||
get { return (PrimType) getScriptPrimType(GetSOP().Shape); }
|
||||
set { throw new System.NotImplementedException(); }
|
||||
}
|
||||
|
||||
|
@ -162,5 +191,127 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
get { throw new System.NotImplementedException(); }
|
||||
set { throw new System.NotImplementedException(); }
|
||||
}
|
||||
|
||||
|
||||
#region Supporting Functions
|
||||
|
||||
// Helper functions to understand if object has cut, hollow, dimple, and other affecting number of faces
|
||||
private static void hasCutHollowDimpleProfileCut(int primType, PrimitiveBaseShape shape, out bool hasCut, out bool hasHollow,
|
||||
out bool hasDimple, out bool hasProfileCut)
|
||||
{
|
||||
if (primType == (int)PrimType.Box
|
||||
||
|
||||
primType == (int)PrimType.Cylinder
|
||||
||
|
||||
primType == (int)PrimType.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?
|
||||
|
||||
}
|
||||
|
||||
private static int getScriptPrimType(PrimitiveBaseShape primShape)
|
||||
{
|
||||
if (primShape.SculptEntry)
|
||||
return (int) PrimType.Sculpt;
|
||||
if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.Square)
|
||||
{
|
||||
if (primShape.PathCurve == (byte) Extrusion.Straight)
|
||||
return (int) PrimType.Box;
|
||||
if (primShape.PathCurve == (byte) Extrusion.Curve1)
|
||||
return (int) PrimType.Tube;
|
||||
}
|
||||
else if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.Circle)
|
||||
{
|
||||
if (primShape.PathCurve == (byte) Extrusion.Straight)
|
||||
return (int) PrimType.Cylinder;
|
||||
if (primShape.PathCurve == (byte) Extrusion.Curve1)
|
||||
return (int) PrimType.Torus;
|
||||
}
|
||||
else if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.HalfCircle)
|
||||
{
|
||||
if (primShape.PathCurve == (byte) Extrusion.Curve1 || primShape.PathCurve == (byte) Extrusion.Curve2)
|
||||
return (int) PrimType.Sphere;
|
||||
}
|
||||
else if ((primShape.ProfileCurve & 0x07) == (byte) ProfileShape.EquilateralTriangle)
|
||||
{
|
||||
if (primShape.PathCurve == (byte) Extrusion.Straight)
|
||||
return (int) PrimType.Prism;
|
||||
if (primShape.PathCurve == (byte) Extrusion.Curve1)
|
||||
return (int) PrimType.Ring;
|
||||
}
|
||||
return (int) PrimType.NotPrimitive;
|
||||
}
|
||||
|
||||
private static int getNumberOfSides(SceneObjectPart part)
|
||||
{
|
||||
int ret;
|
||||
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)
|
||||
{
|
||||
default:
|
||||
case (int) PrimType.Box:
|
||||
ret = 6;
|
||||
if (hasCut) ret += 2;
|
||||
if (hasHollow) ret += 1;
|
||||
break;
|
||||
case (int) PrimType.Cylinder:
|
||||
ret = 3;
|
||||
if (hasCut) ret += 2;
|
||||
if (hasHollow) ret += 1;
|
||||
break;
|
||||
case (int) PrimType.Prism:
|
||||
ret = 5;
|
||||
if (hasCut) ret += 2;
|
||||
if (hasHollow) ret += 1;
|
||||
break;
|
||||
case (int) PrimType.Sphere:
|
||||
ret = 1;
|
||||
if (hasCut) ret += 2;
|
||||
if (hasDimple) ret += 2;
|
||||
if (hasHollow)
|
||||
ret += 1; // GOTCHA: LSL shows 2 additional sides here.
|
||||
// This has been fixed, but may cause porting issues.
|
||||
break;
|
||||
case (int) PrimType.Torus:
|
||||
ret = 1;
|
||||
if (hasCut) ret += 2;
|
||||
if (hasProfileCut) ret += 2;
|
||||
if (hasHollow) ret += 1;
|
||||
break;
|
||||
case (int) PrimType.Tube:
|
||||
ret = 4;
|
||||
if (hasCut) ret += 2;
|
||||
if (hasProfileCut) ret += 2;
|
||||
if (hasHollow) ret += 1;
|
||||
break;
|
||||
case (int) PrimType.Ring:
|
||||
ret = 3;
|
||||
if (hasCut) ret += 2;
|
||||
if (hasProfileCut) ret += 2;
|
||||
if (hasHollow) ret += 1;
|
||||
break;
|
||||
case (int) PrimType.Sculpt:
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue