OpenSimMirror/OpenSim/Framework/PrimitiveBaseShape.cs

232 lines
6.4 KiB
C#

/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
using System;
using System.Xml.Serialization;
using libsecondlife;
namespace OpenSim.Framework
{
public enum ProfileShape : byte
{
Circle = 0,
Square = 1,
IsometricTriangle = 2,
EquilateralTriangle = 3,
RightTriangle = 4,
HalfCircle = 5
}
public enum HollowShape : byte
{
Same = 0,
Circle = 16,
Square = 32,
Triangle = 48
}
public enum PCodeEnum : byte
{
Primitive = 9,
Avatar = 47
}
public enum Extrusion : byte
{
Straight = 16,
Curve1 = 32,
Curve2 = 48,
Flexible = 128
}
[Serializable]
public class PrimitiveBaseShape
{
private static readonly LLObject.TextureEntry m_defaultTexture;
public byte State;
public byte PCode;
public ushort PathBegin;
public ushort PathEnd;
public byte PathScaleX;
public byte PathScaleY;
public byte PathShearX;
public byte PathShearY;
public sbyte PathSkew;
public ushort ProfileBegin;
public ushort ProfileEnd;
public LLVector3 Scale;
public byte PathCurve;
public byte ProfileCurve;
public ushort ProfileHollow;
public sbyte PathRadiusOffset;
public byte PathRevolutions;
public sbyte PathTaperX;
public sbyte PathTaperY;
public sbyte PathTwist;
public sbyte PathTwistBegin;
[XmlIgnore]
public LLObject.TextureEntry Textures
{
get { return new LLObject.TextureEntry(m_textureEntry, 0, m_textureEntry.Length); }
set { m_textureEntry = value.ToBytes(); }
}
private byte[] m_textureEntry;
public byte[] TextureEntry
{
get { return m_textureEntry; }
set { m_textureEntry = value; }
}
public byte[] ExtraParams;
public ProfileShape ProfileShape
{
get { return (ProfileShape)(ProfileCurve & 0xf); }
set
{
byte oldValueMasked = (byte)(ProfileCurve & 0xf0);
ProfileCurve = (byte)(oldValueMasked | (byte)value);
}
}
[XmlIgnore]
public HollowShape HollowShape
{
get { return (HollowShape)(ProfileCurve & 0xf0); }
set
{
byte oldValueMasked = (byte)(ProfileCurve & 0x0f);
ProfileCurve = (byte)(oldValueMasked | (byte)value);
}
}
public LLVector3 PrimScale
{
get { return Scale; }
}
static PrimitiveBaseShape()
{
m_defaultTexture =
new LLObject.TextureEntry(new LLUUID("89556747-24cb-43ed-920b-47caed15465f"));
}
public PrimitiveBaseShape()
{
PCode = (byte)PCodeEnum.Primitive;
ExtraParams = new byte[1];
Textures = m_defaultTexture;
}
public static PrimitiveBaseShape Create()
{
PrimitiveBaseShape shape = new PrimitiveBaseShape();
return shape;
}
public static PrimitiveBaseShape CreateBox()
{
PrimitiveBaseShape shape = Create();
shape.PathCurve = (byte)Extrusion.Straight;
shape.ProfileShape = ProfileShape.Square;
shape.PathScaleX = 100;
shape.PathScaleY = 100;
return shape;
}
public static PrimitiveBaseShape CreateCylinder()
{
PrimitiveBaseShape shape = Create();
shape.PathCurve = (byte)Extrusion.Curve1;
shape.ProfileShape = ProfileShape.Square;
shape.PathScaleX = 100;
shape.PathScaleY = 100;
return shape;
}
public static PrimitiveBaseShape Default
{
get
{
PrimitiveBaseShape boxShape = CreateBox();
boxShape.SetScale(0.5f);
return boxShape;
}
}
public void SetScale(float side)
{
Scale = new LLVector3(side, side, side);
}
public void SetHeigth(float heigth)
{
Scale.Z = heigth;
}
public void SetRadius(float radius)
{
Scale.X = Scale.Y = radius * 2f;
}
//void returns need to change of course
public virtual void GetMesh()
{
}
public PrimitiveBaseShape Copy()
{
return (PrimitiveBaseShape)MemberwiseClone();
}
public static PrimitiveBaseShape CreateCylinder(float radius, float heigth)
{
PrimitiveBaseShape shape = CreateCylinder( );
shape.SetHeigth( heigth );
shape.SetRadius( radius );
return shape;
}
}
}