aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/OpenSim.Reg/Entity.cs
blob: 40f9b13b7dc2a99dac0c73c6b240d1687e39ea97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.Text;
using Axiom.MathLib;
using OpenSim.Physics.Manager;
using OpenSim.Region.types;
using libsecondlife;
using OpenSim.Region.Scripting;

namespace OpenSim.Region
{
    public abstract class Entity : IScriptReadonlyEntity
    {
        public libsecondlife.LLUUID uuid;
        public uint localid;
        public LLVector3 velocity;
        public Quaternion rotation;
        protected List<Entity> children;
        protected LLVector3 m_pos;
        protected PhysicsActor _physActor;
        protected World m_world;
        protected string m_name;

        /// <summary>
        /// 
        /// </summary>
        public virtual string Name
        {
            get { return m_name; }
        }

        /// <summary>
        /// 
        /// </summary>
        public virtual LLVector3 Pos
        {
            get
            {
                if (this._physActor != null)
                {
                    m_pos.X = _physActor.Position.X;
                    m_pos.Y = _physActor.Position.Y;
                    m_pos.Z = _physActor.Position.Z;
                }

                return m_pos;
            }
            set
            {
                if (this._physActor != null)
                {
                    try
                    {
                        lock (this.m_world.SyncRoot)
                        {

                            this._physActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }

                m_pos = value;
            }
        }

        /// <summary>
        /// Creates a new Entity (should not occur on it's own)
        /// </summary>
        public Entity()
        {
            uuid = new libsecondlife.LLUUID();
            localid = 0;
            m_pos = new LLVector3();
            velocity = new LLVector3();
            rotation = new Quaternion();
            m_name = "(basic entity)";
            children = new List<Entity>();
        }

        /// <summary>
        /// 
        /// </summary>
        public virtual void addForces()
        {
        	foreach (Entity child in children)
            {
                child.addForces();
            }
        }

        /// <summary>
        /// Performs any updates that need to be done at each frame. This function is overridable from it's children.
        /// </summary>
        public virtual void update() {
            // Do any per-frame updates needed that are applicable to every type of entity
            foreach (Entity child in children)
            {
                child.update();
            }
        }

        /// <summary>
        /// Returns a mesh for this object and any dependents
        /// </summary>
        /// <returns>The mesh of this entity tree</returns>
        public virtual Mesh getMesh()
        {
            Mesh mesh = new Mesh();

            foreach (Entity child in children)
            {
                mesh += child.getMesh();
            }

            return mesh;
        }
        
        /// <summary>
        /// Called at a set interval to inform entities that they should back themsleves up to the DB 
        /// </summary>
        public virtual void BackUp()
        {
        	
        }

        /// <summary>
        /// Infoms the entity that the land (heightmap) has changed
        /// </summary>
        public virtual void LandRenegerated()
        {

        }
    }
}