aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment
diff options
context:
space:
mode:
authorJustin Clarke Casey2008-12-19 17:57:03 +0000
committerJustin Clarke Casey2008-12-19 17:57:03 +0000
commit7ce8ccb043002520a82ce14325e991a22e0c292b (patch)
tree6e8350769193c0a0053b9432b326fe257735532b /OpenSim/Region/Environment
parent* Commit patch from cmickeyb. #2871. Optimized float array for the terrain ... (diff)
downloadopensim-SC-7ce8ccb043002520a82ce14325e991a22e0c292b.zip
opensim-SC-7ce8ccb043002520a82ce14325e991a22e0c292b.tar.gz
opensim-SC-7ce8ccb043002520a82ce14325e991a22e0c292b.tar.bz2
opensim-SC-7ce8ccb043002520a82ce14325e991a22e0c292b.tar.xz
* refactor: Move tree code out into a separate module
Diffstat (limited to 'OpenSim/Region/Environment')
-rw-r--r--OpenSim/Region/Environment/Interfaces/IVegetationModule.cs49
-rw-r--r--OpenSim/Region/Environment/Modules/Avatar/Gestures/GesturesModule.cs2
-rw-r--r--OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs16
-rw-r--r--OpenSim/Region/Environment/Modules/World/Vegetation/VegetationModule.cs118
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs87
5 files changed, 215 insertions, 57 deletions
diff --git a/OpenSim/Region/Environment/Interfaces/IVegetationModule.cs b/OpenSim/Region/Environment/Interfaces/IVegetationModule.cs
new file mode 100644
index 0000000..c411993
--- /dev/null
+++ b/OpenSim/Region/Environment/Interfaces/IVegetationModule.cs
@@ -0,0 +1,49 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using OpenMetaverse;
29using OpenSim.Region.Environment.Scenes;
30
31namespace OpenSim.Region.Environment.Interfaces
32{
33 public interface IVegetationModule : IEntityCreator
34 {
35 /// <summary>
36 /// Add a new tree to the scene. Used by other modules.
37 /// </summary>
38 /// <param name="uuid"></param>
39 /// <param name="groupID"></param>
40 /// <param name="scale"></param>
41 /// <param name="rotation"></param>
42 /// <param name="position"></param>
43 /// <param name="treeType"></param>
44 /// <param name="newTree"></param>
45 /// <returns></returns>
46 SceneObjectGroup AddTree(
47 UUID uuid, UUID groupID, Vector3 scale, Quaternion rotation, Vector3 position, Tree treeType, bool newTree);
48 }
49}
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Gestures/GesturesModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Gestures/GesturesModule.cs
index 5f0f4f9..a86fceb 100644
--- a/OpenSim/Region/Environment/Modules/Avatar/Gestures/GesturesModule.cs
+++ b/OpenSim/Region/Environment/Modules/Avatar/Gestures/GesturesModule.cs
@@ -74,7 +74,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Gestures
74 m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name); 74 m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name);
75 } 75 }
76 76
77 public virtual void DeactivateGesture(IClientAPI client, UUID gestureId) 77 public virtual void DeactivateGesture(IClientAPI client, UUID gestureId)
78 { 78 {
79 CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId); 79 CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId);
80 80
diff --git a/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs
index 990d36e..8061648 100644
--- a/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs
+++ b/OpenSim/Region/Environment/Modules/World/TreePopulator/TreePopulatorModule.cs
@@ -233,13 +233,15 @@ namespace OpenSim.Region.Environment.Modules.World.TreePopulator
233 { 233 {
234 position.Z = (float) m_scene.Heightmap[(int) position.X, (int) position.Y]; 234 position.Z = (float) m_scene.Heightmap[(int) position.X, (int) position.Y];
235 235
236 SceneObjectGroup tree = 236 IVegetationModule module = m_scene.RequestModuleInterface<IVegetationModule>();
237 m_scene.AddTree(uuid, UUID.Zero, new Vector3(0.1f, 0.1f, 0.1f), 237
238 Quaternion.Identity, 238 if (null == module)
239 position, 239 return;
240 Tree.Cypress1, 240
241 false); 241 SceneObjectGroup tree
242 242 = module.AddTree(
243 uuid, UUID.Zero, new Vector3(0.1f, 0.1f, 0.1f), Quaternion.Identity, position, Tree.Cypress1, false);
244
243 m_trees.Add(tree.UUID); 245 m_trees.Add(tree.UUID);
244 tree.SendGroupFullUpdate(); 246 tree.SendGroupFullUpdate();
245 } 247 }
diff --git a/OpenSim/Region/Environment/Modules/World/Vegetation/VegetationModule.cs b/OpenSim/Region/Environment/Modules/World/Vegetation/VegetationModule.cs
new file mode 100644
index 0000000..a1c2192
--- /dev/null
+++ b/OpenSim/Region/Environment/Modules/World/Vegetation/VegetationModule.cs
@@ -0,0 +1,118 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using log4net;
31using Nini.Config;
32using OpenMetaverse;
33using OpenSim.Framework;
34using OpenSim.Framework.Communications;
35using OpenSim.Framework.Communications.Cache;
36using OpenSim.Region.Environment.Interfaces;
37using OpenSim.Region.Environment.Scenes;
38
39namespace OpenSim.Region.Environment.Modules.Avatar.Vegetation
40{
41 public class VegetationModule : IRegionModule, IVegetationModule
42 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44
45 protected Scene m_scene;
46
47 protected static readonly PCode[] creationCapabilities = new PCode[] { PCode.Grass, PCode.NewTree, PCode.Tree };
48 public PCode[] CreationCapabilities { get { return creationCapabilities; } }
49
50 public void Initialise(Scene scene, IConfigSource source)
51 {
52 m_scene = scene;
53 m_scene.RegisterModuleInterface<IVegetationModule>(this);
54 }
55
56 public void PostInitialise() {}
57 public void Close() {}
58 public string Name { get { return "Vegetation Module"; } }
59 public bool IsSharedModule { get { return false; } }
60
61 public SceneObjectGroup AddTree(
62 UUID uuid, UUID groupID, Vector3 scale, Quaternion rotation, Vector3 position, Tree treeType, bool newTree)
63 {
64 PrimitiveBaseShape treeShape = new PrimitiveBaseShape();
65 treeShape.PathCurve = 16;
66 treeShape.PathEnd = 49900;
67 treeShape.PCode = newTree ? (byte)PCode.NewTree : (byte)PCode.Tree;
68 treeShape.Scale = scale;
69 treeShape.State = (byte)treeType;
70
71 return m_scene.AddNewPrim(uuid, groupID, position, rotation, treeShape);
72 }
73
74 public SceneObjectGroup CreateEntity(
75 UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
76 {
77 if (Array.IndexOf(creationCapabilities, (PCode)shape.PCode) < 0)
78 {
79 m_log.DebugFormat("[VEGETATION]: PCode {0} not handled by {1}", shape.PCode, Name);
80 return null;
81 }
82
83 SceneObjectGroup sceneObject = new SceneObjectGroup(ownerID, pos, rot, shape);
84 SceneObjectPart rootPart = sceneObject.GetChildPart(sceneObject.UUID);
85
86 // if grass or tree, make phantom
87 //rootPart.TrimPermissions();
88 rootPart.AddFlag(PrimFlags.Phantom);
89 if (rootPart.Shape.PCode != (byte)PCode.Grass)
90 AdaptTree(ref shape);
91
92 m_scene.AddNewSceneObject(sceneObject, true);
93 sceneObject.SetGroup(groupID, null);
94
95 return sceneObject;
96 }
97
98 protected void AdaptTree(ref PrimitiveBaseShape tree)
99 {
100 // Tree size has to be adapted depending on its type
101 switch ((Tree)tree.State)
102 {
103 case Tree.Cypress1:
104 case Tree.Cypress2:
105 tree.Scale = new Vector3(4, 4, 10);
106 break;
107
108 // case... other tree types
109 // tree.Scale = new Vector3(?, ?, ?);
110 // break;
111
112 default:
113 tree.Scale = new Vector3(4, 4, 4);
114 break;
115 }
116 }
117 }
118}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 72748b6..eecfd70 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -6,7 +6,7 @@
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright 7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright 9 * * Redistributions in binary form must reproduce the above copyrightD
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the 12 * * Neither the name of the OpenSim Project nor the
@@ -259,6 +259,11 @@ namespace OpenSim.Region.Environment.Scenes
259 } 259 }
260 260
261 public int objectCapacity = 45000; 261 public int objectCapacity = 45000;
262
263 /// <value>
264 /// Registered classes that are capable of creating entities.
265 /// </value>
266 protected Dictionary<PCode, IEntityCreator> m_entityCreators = new Dictionary<PCode, IEntityCreator>();
262 267
263 #endregion 268 #endregion
264 269
@@ -1753,63 +1758,24 @@ namespace OpenSim.Region.Environment.Scenes
1753 } 1758 }
1754 } 1759 }
1755 1760
1756 public virtual SceneObjectGroup AddNewPrim(UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) 1761 public virtual SceneObjectGroup AddNewPrim(
1762 UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
1757 { 1763 {
1758 //m_log.DebugFormat( 1764 //m_log.DebugFormat(
1759 // "[SCENE]: Scene.AddNewPrim() called for agent {0} in {1}", ownerID, RegionInfo.RegionName); 1765 // "[SCENE]: Scene.AddNewPrim() pcode {0} called for {1} in {2}", shape.PCode, ownerID, RegionInfo.RegionName);
1766
1767 // If an entity creator has been registered for this prim type then use that
1768 if (m_entityCreators.ContainsKey((PCode)shape.PCode))
1769 return m_entityCreators[(PCode)shape.PCode].CreateEntity(ownerID, groupID, pos, rot, shape);
1760 1770
1771 // Otherwise, use this default creation code;
1761 SceneObjectGroup sceneObject = new SceneObjectGroup(ownerID, pos, rot, shape); 1772 SceneObjectGroup sceneObject = new SceneObjectGroup(ownerID, pos, rot, shape);
1762
1763 SceneObjectPart rootPart = sceneObject.GetChildPart(sceneObject.UUID);
1764 // if grass or tree, make phantom
1765 //rootPart.TrimPermissions();
1766 if ((rootPart.Shape.PCode == (byte)PCode.Grass)
1767 || (rootPart.Shape.PCode == (byte)PCode.Tree) || (rootPart.Shape.PCode == (byte)PCode.NewTree))
1768 {
1769 rootPart.AddFlag(PrimFlags.Phantom);
1770 //rootPart.ObjectFlags += (uint)PrimFlags.Phantom;
1771 if (rootPart.Shape.PCode != (byte)PCode.Grass)
1772 AdaptTree(ref shape);
1773 }
1774
1775 AddNewSceneObject(sceneObject, true); 1773 AddNewSceneObject(sceneObject, true);
1776 sceneObject.SetGroup(groupID, null); 1774 sceneObject.SetGroup(groupID, null);
1777 1775
1778 return sceneObject; 1776 return sceneObject;
1779 } 1777 }
1780 1778
1781 protected void AdaptTree(ref PrimitiveBaseShape tree)
1782 {
1783 // Tree size has to be adapted depending on its type
1784 switch ((Tree)tree.State)
1785 {
1786 case Tree.Cypress1:
1787 case Tree.Cypress2:
1788 tree.Scale = new Vector3(4, 4, 10);
1789 break;
1790
1791 // case... other tree types
1792 // tree.Scale = new Vector3(?, ?, ?);
1793 // break;
1794
1795 default:
1796 tree.Scale = new Vector3(4, 4, 4);
1797 break;
1798 }
1799 }
1800
1801 public SceneObjectGroup AddTree(UUID uuid, UUID groupID, Vector3 scale, Quaternion rotation, Vector3 position,
1802 Tree treeType, bool newTree)
1803 {
1804 PrimitiveBaseShape treeShape = new PrimitiveBaseShape();
1805 treeShape.PathCurve = 16;
1806 treeShape.PathEnd = 49900;
1807 treeShape.PCode = newTree ? (byte)PCode.NewTree : (byte)PCode.Tree;
1808 treeShape.Scale = scale;
1809 treeShape.State = (byte)treeType;
1810 return AddNewPrim(uuid, groupID, position, rotation, treeShape);
1811 }
1812
1813 /// <summary> 1779 /// <summary>
1814 /// Add an object into the scene that has come from storage 1780 /// Add an object into the scene that has come from storage
1815 /// </summary> 1781 /// </summary>
@@ -3299,6 +3265,15 @@ namespace OpenSim.Region.Environment.Scenes
3299 List<Object> l = new List<Object>(); 3265 List<Object> l = new List<Object>();
3300 l.Add(mod); 3266 l.Add(mod);
3301 ModuleInterfaces.Add(typeof(M), l); 3267 ModuleInterfaces.Add(typeof(M), l);
3268
3269 if (mod is IEntityCreator)
3270 {
3271 IEntityCreator entityCreator = (IEntityCreator)mod;
3272 foreach (PCode pcode in entityCreator.CreationCapabilities)
3273 {
3274 m_entityCreators[pcode] = entityCreator;
3275 }
3276 }
3302 } 3277 }
3303 } 3278 }
3304 3279
@@ -3314,13 +3289,23 @@ namespace OpenSim.Region.Environment.Scenes
3314 return; 3289 return;
3315 3290
3316 l.Add(mod); 3291 l.Add(mod);
3292
3293 if (mod is IEntityCreator)
3294 {
3295 IEntityCreator entityCreator = (IEntityCreator)mod;
3296 foreach (PCode pcode in entityCreator.CreationCapabilities)
3297 {
3298 m_entityCreators[pcode] = entityCreator;
3299 }
3300 }
3301
3317 ModuleInterfaces[typeof(M)] = l; 3302 ModuleInterfaces[typeof(M)] = l;
3318 } 3303 }
3319 3304
3320 /// <summary> 3305 /// <summary>
3321 /// For the given interface, retrieve the region module which implements it. 3306 /// For the given interface, retrieve the region module which implements it.
3322 /// </summary> 3307 /// </summary>
3323 /// <returns>null if there is no module implementing that interface</returns> 3308 /// <returns>null if there is no registered module implementing that interface</returns>
3324 public override T RequestModuleInterface<T>() 3309 public override T RequestModuleInterface<T>()
3325 { 3310 {
3326 if (ModuleInterfaces.ContainsKey(typeof(T))) 3311 if (ModuleInterfaces.ContainsKey(typeof(T)))
@@ -3333,6 +3318,10 @@ namespace OpenSim.Region.Environment.Scenes
3333 } 3318 }
3334 } 3319 }
3335 3320
3321 /// <summary>
3322 /// For the given interface, retrieve an array of region modules that implement it.
3323 /// </summary>
3324 /// <returns>an empty array if there are no registered modules implementing that interface</returns>
3336 public override T[] RequestModuleInterfaces<T>() 3325 public override T[] RequestModuleInterfaces<T>()
3337 { 3326 {
3338 if (ModuleInterfaces.ContainsKey(typeof(T))) 3327 if (ModuleInterfaces.ContainsKey(typeof(T)))