diff options
author | Justin Clarke Casey | 2008-12-19 17:57:03 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2008-12-19 17:57:03 +0000 |
commit | 7ce8ccb043002520a82ce14325e991a22e0c292b (patch) | |
tree | 6e8350769193c0a0053b9432b326fe257735532b | |
parent | * Commit patch from cmickeyb. #2871. Optimized float array for the terrain ... (diff) | |
download | opensim-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
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 | |||
28 | using OpenMetaverse; | ||
29 | using OpenSim.Region.Environment.Scenes; | ||
30 | |||
31 | namespace 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 | |||
28 | using System; | ||
29 | using System.Reflection; | ||
30 | using log4net; | ||
31 | using Nini.Config; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Framework.Communications; | ||
35 | using OpenSim.Framework.Communications.Cache; | ||
36 | using OpenSim.Region.Environment.Interfaces; | ||
37 | using OpenSim.Region.Environment.Scenes; | ||
38 | |||
39 | namespace 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))) |