aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment')
-rw-r--r--OpenSim/Region/Environment/ModuleLoader.cs3
-rw-r--r--OpenSim/Region/Environment/Modules/DynamicTextureModule.cs1
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs8
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs5
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs12
-rw-r--r--OpenSim/Region/Environment/Types/BasicQuadTreeNode.cs167
-rw-r--r--OpenSim/Region/Environment/Types/UpdateQueue.cs21
7 files changed, 211 insertions, 6 deletions
diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs
index e8e7bc2..be3384b 100644
--- a/OpenSim/Region/Environment/ModuleLoader.cs
+++ b/OpenSim/Region/Environment/ModuleLoader.cs
@@ -44,6 +44,9 @@ namespace OpenSim.Region.Environment
44 LoadedModules.Add(avatarProfiles); 44 LoadedModules.Add(avatarProfiles);
45 45
46 this.LoadRegionModule("OpenSim.Region.ExtensionsScriptModule.dll", "ExtensionsScriptingModule", scene); 46 this.LoadRegionModule("OpenSim.Region.ExtensionsScriptModule.dll", "ExtensionsScriptingModule", scene);
47
48 string lslPath = System.IO.Path.Combine("ScriptEngines", "OpenSim.Region.ScriptEngine.DotNetEngine.dll");
49 this.LoadRegionModule(lslPath, "LSLScriptingModule", scene);
47 } 50 }
48 51
49 public void LoadDefaultSharedModules(string exceptModules) 52 public void LoadDefaultSharedModules(string exceptModules)
diff --git a/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs b/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs
index 9fbd68e..8223919 100644
--- a/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs
+++ b/OpenSim/Region/Environment/Modules/DynamicTextureModule.cs
@@ -5,7 +5,6 @@ using System.Threading;
5using System.IO; 5using System.IO;
6using System.Collections.Generic; 6using System.Collections.Generic;
7using libsecondlife; 7using libsecondlife;
8using OpenJPEGNet;
9using OpenSim.Region.Environment.Scenes; 8using OpenSim.Region.Environment.Scenes;
10using OpenSim.Region.Environment.Interfaces; 9using OpenSim.Region.Environment.Interfaces;
11using OpenSim.Framework.Interfaces; 10using OpenSim.Framework.Interfaces;
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 4151074..1ce75e0 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -44,6 +44,7 @@ using OpenSim.Framework.Communications.Caches;
44using OpenSim.Region.Environment.LandManagement; 44using OpenSim.Region.Environment.LandManagement;
45using OpenSim.Region.Environment; 45using OpenSim.Region.Environment;
46using OpenSim.Region.Environment.Interfaces; 46using OpenSim.Region.Environment.Interfaces;
47using OpenSim.Region.Environment.Types;
47using OpenSim.Region.Terrain; 48using OpenSim.Region.Terrain;
48using OpenSim.Framework.Data; 49using OpenSim.Framework.Data;
49using Caps = OpenSim.Region.Capabilities.Caps; 50using Caps = OpenSim.Region.Capabilities.Caps;
@@ -72,6 +73,8 @@ namespace OpenSim.Region.Environment.Scenes
72 private int m_timePhase = 24; 73 private int m_timePhase = 24;
73 private int m_timeUpdateCount; 74 private int m_timeUpdateCount;
74 75
76 public BasicQuadTreeNode QuadTree;
77
75 private Mutex updateLock; 78 private Mutex updateLock;
76 79
77 protected ModuleLoader m_moduleLoader; 80 protected ModuleLoader m_moduleLoader;
@@ -178,6 +181,10 @@ namespace OpenSim.Region.Environment.Scenes
178 181
179 m_eventManager.OnPermissionError += SendPermissionAlert; 182 m_eventManager.OnPermissionError += SendPermissionAlert;
180 183
184 QuadTree = new BasicQuadTreeNode(null, 0, 0, 256, 256);
185 QuadTree.Subdivide();
186 QuadTree.Subdivide();
187
181 MainLog.Instance.Verbose("Creating new entitities instance"); 188 MainLog.Instance.Verbose("Creating new entitities instance");
182 Entities = new Dictionary<LLUUID, EntityBase>(); 189 Entities = new Dictionary<LLUUID, EntityBase>();
183 Avatars = new Dictionary<LLUUID, ScenePresence>(); 190 Avatars = new Dictionary<LLUUID, ScenePresence>();
@@ -596,6 +603,7 @@ namespace OpenSim.Region.Environment.Scenes
596 { 603 {
597 if (!Entities.ContainsKey(sceneObject.UUID)) 604 if (!Entities.ContainsKey(sceneObject.UUID))
598 { 605 {
606 QuadTree.AddObject(sceneObject);
599 Entities.Add(sceneObject.UUID, sceneObject); 607 Entities.Add(sceneObject.UUID, sceneObject);
600 } 608 }
601 } 609 }
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index dec017e..9e207c8 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -43,6 +43,9 @@ namespace OpenSim.Region.Environment.Scenes
43 43
44 protected byte[] m_particleSystem = new byte[0]; 44 protected byte[] m_particleSystem = new byte[0];
45 45
46 public uint TimeStampFull = 0;
47 public uint TimeStampTerse = 0;
48
46 protected SceneObjectGroup m_parentGroup; 49 protected SceneObjectGroup m_parentGroup;
47 50
48 /// <summary> 51 /// <summary>
@@ -366,6 +369,7 @@ namespace OpenSim.Region.Environment.Scenes
366 { 369 {
367 m_parentGroup.HasChanged = true; 370 m_parentGroup.HasChanged = true;
368 } 371 }
372 this.TimeStampFull =(uint) Util.UnixTimeSinceEpoch();
369 m_updateFlag = 2; 373 m_updateFlag = 2;
370 } 374 }
371 375
@@ -380,6 +384,7 @@ namespace OpenSim.Region.Environment.Scenes
380 { 384 {
381 m_parentGroup.HasChanged = true; 385 m_parentGroup.HasChanged = true;
382 } 386 }
387 this.TimeStampTerse = (uint)Util.UnixTimeSinceEpoch();
383 m_updateFlag = 1; 388 m_updateFlag = 1;
384 } 389 }
385 } 390 }
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 285c691..7b7c595 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -88,11 +88,13 @@ namespace OpenSim.Region.Environment.Scenes
88 public delegate void SignificantClientMovement(IClientAPI remote_client); 88 public delegate void SignificantClientMovement(IClientAPI remote_client);
89 public event SignificantClientMovement OnSignificantClientMovement; 89 public event SignificantClientMovement OnSignificantClientMovement;
90 90
91 public List<SceneObjectGroup> InterestList = new List<SceneObjectGroup>();
92
91 // private Queue<SceneObjectGroup> m_fullGroupUpdates = new Queue<SceneObjectGroup>(); 93 // private Queue<SceneObjectGroup> m_fullGroupUpdates = new Queue<SceneObjectGroup>();
92 // private Queue<SceneObjectGroup> m_terseGroupUpdates = new Queue<SceneObjectGroup>(); 94 // private Queue<SceneObjectGroup> m_terseGroupUpdates = new Queue<SceneObjectGroup>();
93 95
94 private Queue<SceneObjectPart> m_fullPartUpdates = new Queue<SceneObjectPart>(); 96 private Queue<SceneObjectPart> m_fullPartUpdates = new Queue<SceneObjectPart>();
95 private Queue<SceneObjectPart> m_teserPartUpdates = new Queue<SceneObjectPart>(); 97 private Queue<SceneObjectPart> m_tersePartUpdates = new Queue<SceneObjectPart>();
96 98
97 #region Properties 99 #region Properties
98 /// <summary> 100 /// <summary>
@@ -201,7 +203,7 @@ namespace OpenSim.Region.Environment.Scenes
201 203
202 public void AddTersePart(SceneObjectPart part) 204 public void AddTersePart(SceneObjectPart part)
203 { 205 {
204 m_teserPartUpdates.Enqueue(part); 206 m_tersePartUpdates.Enqueue(part);
205 } 207 }
206 208
207 public void AddFullPart(SceneObjectPart part) 209 public void AddFullPart(SceneObjectPart part)
@@ -211,18 +213,18 @@ namespace OpenSim.Region.Environment.Scenes
211 213
212 public void SendPrimUpdates() 214 public void SendPrimUpdates()
213 { 215 {
214 if (m_teserPartUpdates.Count > 0) 216 if (m_tersePartUpdates.Count > 0)
215 { 217 {
216 bool terse = true; 218 bool terse = true;
217 int terseCount = 0; 219 int terseCount = 0;
218 220
219 while (terse) 221 while (terse)
220 { 222 {
221 SceneObjectPart part = m_teserPartUpdates.Dequeue(); 223 SceneObjectPart part = m_tersePartUpdates.Dequeue();
222 part.SendTerseUpdate(this.ControllingClient); 224 part.SendTerseUpdate(this.ControllingClient);
223 terseCount++; 225 terseCount++;
224 226
225 if ((m_teserPartUpdates.Count < 1) |(terseCount > 30)) 227 if ((m_tersePartUpdates.Count < 1) |(terseCount > 30))
226 { 228 {
227 terse = false; 229 terse = false;
228 } 230 }
diff --git a/OpenSim/Region/Environment/Types/BasicQuadTreeNode.cs b/OpenSim/Region/Environment/Types/BasicQuadTreeNode.cs
new file mode 100644
index 0000000..c7b0524
--- /dev/null
+++ b/OpenSim/Region/Environment/Types/BasicQuadTreeNode.cs
@@ -0,0 +1,167 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenSim.Region.Environment.Scenes;
5
6namespace OpenSim.Region.Environment.Types
7{
8 public class BasicQuadTreeNode
9 {
10 private List<SceneObjectGroup> m_objects = new List<SceneObjectGroup>();
11 private BasicQuadTreeNode[] m_childNodes = null;
12 private BasicQuadTreeNode m_parent = null;
13
14 private short m_leftX;
15 private short m_leftY;
16 private short m_width;
17 private short m_height;
18
19 public BasicQuadTreeNode(BasicQuadTreeNode parent, short leftX, short leftY, short width, short height)
20 {
21 m_parent = parent;
22 m_leftX = leftX;
23 m_leftY = leftY;
24 m_width = width;
25 m_height = height;
26 }
27
28 public void AddObject(SceneObjectGroup obj)
29 {
30 if (m_childNodes == null)
31 {
32 if (!m_objects.Contains(obj))
33 {
34 m_objects.Add(obj);
35 }
36 }
37 else
38 {
39 if (obj.AbsolutePosition.X < (m_leftX + (m_width / 2)))
40 {
41 if (obj.AbsolutePosition.Y < (m_leftY + (m_height / 2)))
42 {
43 m_childNodes[0].AddObject(obj);
44 }
45 else
46 {
47 m_childNodes[2].AddObject(obj);
48 }
49 }
50 else
51 {
52 if (obj.AbsolutePosition.Y < (m_leftY + (m_height / 2)))
53 {
54 m_childNodes[1].AddObject(obj);
55 }
56 else
57 {
58 m_childNodes[3].AddObject(obj);
59 }
60 }
61 }
62 }
63
64 public void Subdivide()
65 {
66 if (m_childNodes == null)
67 {
68 m_childNodes = new BasicQuadTreeNode[4];
69 m_childNodes[0] = new BasicQuadTreeNode(this, m_leftX, m_leftY,(short) (m_width / 2), (short)( m_height / 2));
70 m_childNodes[1] = new BasicQuadTreeNode(this,(short)( m_leftX + (m_width / 2)), m_leftY,(short)( m_width / 2),(short) (m_height / 2));
71 m_childNodes[2] = new BasicQuadTreeNode(this, m_leftX, (short)( m_leftY + (m_height / 2)), (short)(m_width / 2),(short)( m_height / 2));
72 m_childNodes[3] = new BasicQuadTreeNode(this, (short)( m_leftX + (m_width / 2)),(short)( m_height + (m_height / 2)),(short)( m_width / 2), (short)(m_height / 2));
73 }
74 else
75 {
76 for (int i = 0; i < m_childNodes.Length; i++)
77 {
78 m_childNodes[i].Subdivide();
79 }
80 }
81 }
82
83 public List<SceneObjectGroup> GetObjectsFrom(int x, int y)
84 {
85 if (m_childNodes == null)
86 {
87 return m_objects;
88 }
89 else
90 {
91 if (x < (m_leftX + (m_width / 2)))
92 {
93 if (y < (m_leftY + (m_height / 2)))
94 {
95 return m_childNodes[0].GetObjectsFrom(x, y);
96 }
97 else
98 {
99 return m_childNodes[2].GetObjectsFrom(x, y);
100 }
101 }
102 else
103 {
104 if (y < (m_leftY + (m_height / 2)))
105 {
106 return m_childNodes[1].GetObjectsFrom(x, y);
107 }
108 else
109 {
110 return m_childNodes[3].GetObjectsFrom(x, y);
111 }
112 }
113 }
114 }
115
116 public void Update()
117 {
118 if (m_childNodes != null)
119 {
120 for (int i = 0; i < 4; i++)
121 {
122 m_childNodes[i].Update();
123 }
124 }
125 else
126 {
127 List<SceneObjectGroup> outBounds = new List<SceneObjectGroup>();
128 foreach (SceneObjectGroup group in m_objects)
129 {
130 if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) && ((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height))))
131 {
132 //still in bounds
133 }
134 else
135 {
136 outBounds.Add(group);
137 }
138 }
139
140 foreach (SceneObjectGroup removee in outBounds)
141 {
142 m_objects.Remove(removee);
143 if (m_parent != null)
144 {
145 m_parent.PassUp(removee);
146 }
147 }
148 outBounds.Clear();
149 }
150 }
151
152 public void PassUp(SceneObjectGroup group)
153 {
154 if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) && ((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height))))
155 {
156 this.AddObject(group);
157 }
158 else
159 {
160 if (m_parent != null)
161 {
162 m_parent.PassUp(group);
163 }
164 }
165 }
166 }
167}
diff --git a/OpenSim/Region/Environment/Types/UpdateQueue.cs b/OpenSim/Region/Environment/Types/UpdateQueue.cs
new file mode 100644
index 0000000..d7eb6ee
--- /dev/null
+++ b/OpenSim/Region/Environment/Types/UpdateQueue.cs
@@ -0,0 +1,21 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenSim.Region.Environment.Scenes;
5using libsecondlife;
6
7namespace OpenSim.Region.Environment.Types
8{
9 public class UpdateQueue
10 {
11 private Queue<SceneObjectPart> m_queue;
12
13 private List<LLUUID> m_ids;
14
15 public UpdateQueue()
16 {
17 m_queue = new Queue<SceneObjectPart>();
18 m_ids = new List<LLUUID>();
19 }
20 }
21}