aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Wind/Plugins
diff options
context:
space:
mode:
authorCharles Krinke2009-03-31 02:33:19 +0000
committerCharles Krinke2009-03-31 02:33:19 +0000
commit54a27f9f5c556e518c2ba18b9a5494d517dfd041 (patch)
tree5da9db44878c217e0c1872da0f963d88575ef8ff /OpenSim/Region/CoreModules/World/Wind/Plugins
parentUpdate svn properties, add copyright header, formatting cleanup. (diff)
downloadopensim-SC_OLD-54a27f9f5c556e518c2ba18b9a5494d517dfd041.zip
opensim-SC_OLD-54a27f9f5c556e518c2ba18b9a5494d517dfd041.tar.gz
opensim-SC_OLD-54a27f9f5c556e518c2ba18b9a5494d517dfd041.tar.bz2
opensim-SC_OLD-54a27f9f5c556e518c2ba18b9a5494d517dfd041.tar.xz
Thank you kindly, MCortez for a patch that:
With some support from HomerH, this patch adds support for Wind Model plugins via the mono.Addin framework. * Adds console & OSSL access to Wind Parameters * Adds plug-in support for custom wind models * Provides two example Wind Model plug-ins Documentation for the wind module is temporarily located at http://code.google.com/p/flotsam/wiki/CoreWindModule [^] -- will move this documentation to http://opensimulator.org [^] after the patch has been committed.
Diffstat (limited to 'OpenSim/Region/CoreModules/World/Wind/Plugins')
-rw-r--r--OpenSim/Region/CoreModules/World/Wind/Plugins/ConfigurableWind.cs211
-rw-r--r--OpenSim/Region/CoreModules/World/Wind/Plugins/SimpleRandomWind.cs139
2 files changed, 350 insertions, 0 deletions
diff --git a/OpenSim/Region/CoreModules/World/Wind/Plugins/ConfigurableWind.cs b/OpenSim/Region/CoreModules/World/Wind/Plugins/ConfigurableWind.cs
new file mode 100644
index 0000000..2f5cc31
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Wind/Plugins/ConfigurableWind.cs
@@ -0,0 +1,211 @@
1using System;
2using System.Collections.Generic;
3using System.Reflection;
4
5using log4net;
6using OpenMetaverse;
7
8using OpenSim.Region.CoreModules.World.Wind;
9
10namespace OpenSim.Region.CoreModules.World.Wind.Plugins
11{
12 class ConfigurableWind : Mono.Addins.TypeExtensionNode, IWindModelPlugin
13 {
14 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
15
16 private Vector2[] m_windSpeeds = new Vector2[16 * 16];
17 private Random m_rndnums = new Random(Environment.TickCount);
18
19 private float m_avgStrength = 5.0f; // Average magnitude of the wind vector
20 private float m_avgDirection = 0.0f; // Average direction of the wind in degrees
21 private float m_varStrength = 5.0f; // Max Strength Variance
22 private float m_varDirection = 30.0f;// Max Direction Variance
23 private float m_rateChange = 1.0f; //
24
25 private Vector2 m_curPredominateWind = new Vector2();
26
27
28
29 #region IPlugin Members
30
31 public string Version
32 {
33 get { return "1.0.0.0"; }
34 }
35
36 public string Name
37 {
38 get { return "ConfigurableWind"; }
39 }
40
41 public void Initialise()
42 {
43
44 }
45
46 #endregion
47
48 #region IDisposable Members
49
50 public void Dispose()
51 {
52 m_windSpeeds = null;
53 }
54
55 #endregion
56
57 #region IWindModelPlugin Members
58
59 public void WindConfig(OpenSim.Region.Framework.Scenes.Scene scene, Nini.Config.IConfig windConfig)
60 {
61 if( windConfig != null )
62 {
63 // Uses strength value if avg_strength not specified
64 m_avgStrength = windConfig.GetFloat("strength", 5.0F);
65 m_avgStrength = windConfig.GetFloat("avg_strength", 5.0F);
66
67 m_avgDirection = windConfig.GetFloat("avg_direction", 0.0F);
68 m_varStrength = windConfig.GetFloat("var_strength", 5.0F);
69 m_varDirection = windConfig.GetFloat("var_direction", 30.0F);
70 m_rateChange = windConfig.GetFloat("rate_change", 1.0F);
71
72 LogSettings();
73 }
74 }
75
76 public void WindUpdate(uint frame)
77 {
78 double avgAng = m_avgDirection * (Math.PI/180.0f);
79 double varDir = m_varDirection * (Math.PI/180.0f);
80
81 // Prevailing wind algorithm
82 // Inspired by Kanker Greenacre
83
84 // TODO:
85 // * This should probably be based on in-world time.
86 // * should probably move all these local variables to class members and constants
87 double time = DateTime.Now.TimeOfDay.Seconds / 86400;
88
89 double theta = time * (2 * Math.PI) * m_rateChange;
90
91 double offset = Math.Sin(theta) * Math.Sin(theta*2) * Math.Sin(theta*9) * Math.Cos(theta*4);
92
93 double windDir = avgAng + (varDir * offset);
94
95 offset = Math.Sin(theta) * Math.Sin(theta*4) + (Math.Sin(theta*13) / 3);
96 double windSpeed = m_avgStrength + (m_varStrength * offset);
97
98 if (windSpeed<0)
99 windSpeed=0;
100
101
102
103 m_curPredominateWind.X = (float)Math.Cos(windDir);
104 m_curPredominateWind.Y = (float)Math.Sin(windDir);
105
106 m_curPredominateWind.Normalize();
107 m_curPredominateWind.X *= (float)windSpeed;
108 m_curPredominateWind.Y *= (float)windSpeed;
109
110 for (int y = 0; y < 16; y++)
111 {
112 for (int x = 0; x < 16; x++)
113 {
114 m_windSpeeds[y * 16 + x] = m_curPredominateWind;
115 }
116 }
117 }
118
119 public Vector3 WindSpeed(float fX, float fY, float fZ)
120 {
121 return new Vector3(m_curPredominateWind, 0.0f);
122 }
123
124 public Vector2[] WindLLClientArray()
125 {
126 return m_windSpeeds;
127 }
128
129 public string Description
130 {
131 get
132 {
133 return "Provides a predominate wind direction that can change within configured variances for direction and speed.";
134 }
135 }
136
137 public System.Collections.Generic.Dictionary<string, string> WindParams()
138 {
139 Dictionary<string, string> Params = new Dictionary<string, string>();
140
141 Params.Add("avgStrength", "average wind strength");
142 Params.Add("avgDirection", "average wind direction in degrees");
143 Params.Add("varStrength", "allowable variance in wind strength");
144 Params.Add("varDirection", "allowable variance in wind direction in +/- degrees");
145 Params.Add("rateChange", "rate of change");
146
147 return Params;
148 }
149
150 public void WindParamSet(string param, float value)
151 {
152 switch (param)
153 {
154 case "avgStrength":
155 m_avgStrength = value;
156 break;
157 case "avgDirection":
158 m_avgDirection = value;
159 break;
160 case "varStrength":
161 m_varStrength = value;
162 break;
163 case "varDirection":
164 m_varDirection = value;
165 break;
166 case "rateChange":
167 m_rateChange = value;
168 break;
169 }
170 }
171
172 public float WindParamGet(string param)
173 {
174 switch (param)
175 {
176 case "avgStrength":
177 return m_avgStrength;
178 case "avgDirection":
179 return m_avgDirection;
180 case "varStrength":
181 return m_varStrength;
182 case "varDirection":
183 return m_varDirection;
184 case "rateChange":
185 return m_rateChange;
186 default:
187 throw new Exception(String.Format("Unknown {0} parameter {1}", this.Name, param));
188
189 }
190 }
191
192
193
194 #endregion
195
196
197 private void LogSettings()
198 {
199 m_log.InfoFormat("[ConfigurableWind] Average Strength : {0}", m_avgStrength);
200 m_log.InfoFormat("[ConfigurableWind] Average Direction : {0}", m_avgDirection);
201 m_log.InfoFormat("[ConfigurableWind] Varience Strength : {0}", m_varStrength);
202 m_log.InfoFormat("[ConfigurableWind] Varience Direction : {0}", m_varDirection);
203 m_log.InfoFormat("[ConfigurableWind] Rate Change : {0}", m_rateChange);
204 }
205
206 #region IWindModelPlugin Members
207
208
209 #endregion
210 }
211}
diff --git a/OpenSim/Region/CoreModules/World/Wind/Plugins/SimpleRandomWind.cs b/OpenSim/Region/CoreModules/World/Wind/Plugins/SimpleRandomWind.cs
new file mode 100644
index 0000000..040a3c4
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Wind/Plugins/SimpleRandomWind.cs
@@ -0,0 +1,139 @@
1using System;
2using System.Collections.Generic;
3
4using OpenMetaverse;
5
6
7namespace OpenSim.Region.CoreModules.World.Wind.Plugins
8{
9 class SimpleRandomWind : Mono.Addins.TypeExtensionNode, IWindModelPlugin
10 {
11 private Vector2[] m_windSpeeds = new Vector2[16 * 16];
12 private float m_strength = 1.0f;
13 private Random m_rndnums = new Random(Environment.TickCount);
14
15
16 #region IPlugin Members
17
18 public string Version
19 {
20 get { return "1.0.0.0"; }
21 }
22
23 public string Name
24 {
25 get { return "SimpleRandomWind"; }
26 }
27
28 public void Initialise()
29 {
30
31 }
32
33 #endregion
34
35 #region IDisposable Members
36
37 public void Dispose()
38 {
39 m_windSpeeds = null;
40 }
41
42 #endregion
43
44 #region IWindModelPlugin Members
45
46 public void WindConfig(OpenSim.Region.Framework.Scenes.Scene scene, Nini.Config.IConfig windConfig)
47 {
48 if( windConfig != null )
49 {
50 if( windConfig.Contains("strength") )
51 {
52 m_strength = windConfig.GetFloat("strength", 1.0F);
53 }
54 }
55 }
56
57 public void WindUpdate(uint frame)
58 {
59 for (int y = 0; y < 16; y++)
60 {
61 for (int x = 0; x < 16; x++)
62 {
63 m_windSpeeds[y * 16 + x].X = (float)(m_rndnums.NextDouble() * 2d - 1d); // -1 to 1
64 m_windSpeeds[y * 16 + x].Y = (float)(m_rndnums.NextDouble() * 2d - 1d); // -1 to 1
65 m_windSpeeds[y * 16 + x].X *= m_strength;
66 m_windSpeeds[y * 16 + x].Y *= m_strength;
67 }
68 }
69 }
70
71 public Vector3 WindSpeed(float fX, float fY, float fZ)
72 {
73 Vector3 windVector = new Vector3(0.0f, 0.0f, 0.0f);
74
75 int x = (int)fX / 16;
76 int y = (int)fY / 16;
77
78 if (x < 0) x = 0;
79 if (x > 15) x = 15;
80 if (y < 0) y = 0;
81 if (y > 15) y = 15;
82
83 if (m_windSpeeds != null)
84 {
85 windVector.X = m_windSpeeds[y * 16 + x].X;
86 windVector.Y = m_windSpeeds[y * 16 + x].Y;
87 }
88
89 return windVector;
90
91 }
92
93 public Vector2[] WindLLClientArray()
94 {
95 return m_windSpeeds;
96 }
97
98 public string Description
99 {
100 get
101 {
102 return "Provides a simple wind model that creates random wind of a given strength in 16m x 16m patches.";
103 }
104 }
105
106 public System.Collections.Generic.Dictionary<string, string> WindParams()
107 {
108 Dictionary<string, string> Params = new Dictionary<string, string>();
109
110 Params.Add("strength", "wind strength");
111
112 return Params;
113 }
114
115 public void WindParamSet(string param, float value)
116 {
117 switch (param)
118 {
119 case "strength":
120 m_strength = value;
121 break;
122 }
123 }
124
125 public float WindParamGet(string param)
126 {
127 switch (param)
128 {
129 case "strength":
130 return m_strength;
131 default:
132 throw new Exception(String.Format("Unknown {0} parameter {1}", this.Name, param));
133 }
134 }
135
136 #endregion
137
138 }
139}