diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/CoreModules/World/Cloud/CloudModule.cs | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/OpenSim/Region/CoreModules/World/Cloud/CloudModule.cs b/OpenSim/Region/CoreModules/World/Cloud/CloudModule.cs index 98f31f6..b9c716f 100644 --- a/OpenSim/Region/CoreModules/World/Cloud/CloudModule.cs +++ b/OpenSim/Region/CoreModules/World/Cloud/CloudModule.cs | |||
@@ -39,7 +39,8 @@ namespace OpenSim.Region.CoreModules | |||
39 | { | 39 | { |
40 | // private static readonly log4net.ILog m_log | 40 | // private static readonly log4net.ILog m_log |
41 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 41 | // = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
42 | 42 | private uint m_frame = 0; | |
43 | private int m_frameUpdateRate = 1000; | ||
43 | private Random m_rndnums = new Random(Environment.TickCount); | 44 | private Random m_rndnums = new Random(Environment.TickCount); |
44 | private Scene m_scene = null; | 45 | private Scene m_scene = null; |
45 | private bool m_ready = false; | 46 | private bool m_ready = false; |
@@ -57,6 +58,7 @@ namespace OpenSim.Region.CoreModules | |||
57 | { | 58 | { |
58 | m_enabled = cloudConfig.GetBoolean("enabled", false); | 59 | m_enabled = cloudConfig.GetBoolean("enabled", false); |
59 | m_cloudDensity = cloudConfig.GetFloat("density", 0.5F); | 60 | m_cloudDensity = cloudConfig.GetFloat("density", 0.5F); |
61 | m_frameUpdateRate = cloudConfig.GetInt("cloud_update_rate", 1000); | ||
60 | } | 62 | } |
61 | 63 | ||
62 | if (m_enabled) | 64 | if (m_enabled) |
@@ -68,6 +70,7 @@ namespace OpenSim.Region.CoreModules | |||
68 | scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel; | 70 | scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel; |
69 | scene.EventManager.OnClientClosed += ClientLoggedOut; | 71 | scene.EventManager.OnClientClosed += ClientLoggedOut; |
70 | scene.RegisterModuleInterface<ICloudModule>(this); | 72 | scene.RegisterModuleInterface<ICloudModule>(this); |
73 | scene.EventManager.OnFrame += CloudUpdate; | ||
71 | 74 | ||
72 | GenerateCloudCover(); | 75 | GenerateCloudCover(); |
73 | 76 | ||
@@ -90,6 +93,7 @@ namespace OpenSim.Region.CoreModules | |||
90 | m_scene.EventManager.OnMakeChildAgent -= MakeChildAgent; | 93 | m_scene.EventManager.OnMakeChildAgent -= MakeChildAgent; |
91 | m_scene.EventManager.OnAvatarEnteringNewParcel -= AvatarEnteringParcel; | 94 | m_scene.EventManager.OnAvatarEnteringNewParcel -= AvatarEnteringParcel; |
92 | m_scene.EventManager.OnClientClosed -= ClientLoggedOut; | 95 | m_scene.EventManager.OnClientClosed -= ClientLoggedOut; |
96 | m_scene.EventManager.OnFrame -= CloudUpdate; | ||
93 | } | 97 | } |
94 | } | 98 | } |
95 | 99 | ||
@@ -122,6 +126,72 @@ namespace OpenSim.Region.CoreModules | |||
122 | return cover; | 126 | return cover; |
123 | } | 127 | } |
124 | 128 | ||
129 | private void UpdateCloudCover() | ||
130 | { | ||
131 | float[] newCover = new float[16 * 16]; | ||
132 | int rowAbove = new int(); | ||
133 | int rowBelow = new int(); | ||
134 | int columnLeft = new int(); | ||
135 | int columnRight = new int(); | ||
136 | for (int x = 0; x < 16; x++) | ||
137 | { | ||
138 | if (x == 0) | ||
139 | { | ||
140 | columnRight = x + 1; | ||
141 | columnLeft = 15; | ||
142 | } | ||
143 | else if (x == 15) | ||
144 | { | ||
145 | columnRight = 0; | ||
146 | columnLeft = x - 1; | ||
147 | } | ||
148 | else | ||
149 | { | ||
150 | columnRight = x + 1; | ||
151 | columnLeft = x - 1; | ||
152 | } | ||
153 | for (int y = 0; y< 16; y++) | ||
154 | { | ||
155 | if (y == 0) | ||
156 | { | ||
157 | rowAbove = y + 1; | ||
158 | rowBelow = 15; | ||
159 | } | ||
160 | else if (y == 15) | ||
161 | { | ||
162 | rowAbove = 0; | ||
163 | rowBelow = y - 1; | ||
164 | } | ||
165 | else | ||
166 | { | ||
167 | rowAbove = y + 1; | ||
168 | rowBelow = y - 1; | ||
169 | } | ||
170 | float neighborAverage = (cloudCover[rowBelow * 16 + columnLeft] + | ||
171 | cloudCover[y * 16 + columnLeft] + | ||
172 | cloudCover[rowAbove * 16 + columnLeft] + | ||
173 | cloudCover[rowBelow * 16 + x] + | ||
174 | cloudCover[rowAbove * 16 + x] + | ||
175 | cloudCover[rowBelow * 16 + columnRight] + | ||
176 | cloudCover[y * 16 + columnRight] + | ||
177 | cloudCover[rowAbove * 16 + columnRight] + | ||
178 | cloudCover[y * 16 + x]) / 9; | ||
179 | newCover[y * 16 + x] = ((neighborAverage / m_cloudDensity) + 0.175f) % 1.0f; | ||
180 | newCover[y * 16 + x] *= m_cloudDensity; | ||
181 | } | ||
182 | } | ||
183 | Array.Copy(newCover, cloudCover, 16 * 16); | ||
184 | } | ||
185 | |||
186 | private void CloudUpdate() | ||
187 | { | ||
188 | if (((m_frame++ % m_frameUpdateRate) != 0) || !m_ready || (m_cloudDensity == 0)) | ||
189 | { | ||
190 | return; | ||
191 | } | ||
192 | UpdateCloudCover(); | ||
193 | } | ||
194 | |||
125 | public void CloudsToClient(IClientAPI client) | 195 | public void CloudsToClient(IClientAPI client) |
126 | { | 196 | { |
127 | if (m_ready) | 197 | if (m_ready) |