summaryrefslogtreecommitdiff
path: root/Runtime/Terrain/Wind.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Terrain/Wind.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Terrain/Wind.h')
-rw-r--r--Runtime/Terrain/Wind.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/Runtime/Terrain/Wind.h b/Runtime/Terrain/Wind.h
new file mode 100644
index 0000000..7ed310d
--- /dev/null
+++ b/Runtime/Terrain/Wind.h
@@ -0,0 +1,103 @@
+#ifndef RUNTIME_TERRAIN_WIND_H
+#define RUNTIME_TERRAIN_WIND_H
+
+#include "Runtime/GameCode/Behaviour.h"
+class Vector4f;
+class Vector3f;
+class AABB;
+
+
+
+// --------------------------------------------------------------------------
+
+
+
+
+class WindZone : public Behaviour
+{
+public:
+ REGISTER_DERIVED_CLASS (WindZone, Behaviour)
+ DECLARE_OBJECT_SERIALIZE (WindZone)
+
+ enum WindZoneMode
+ {
+ Directional, // Wind has a direction along the z-axis of the transform
+ Spherical // Wind comes from the transform.position and affects in the direction towards the tree
+ };
+
+public:
+
+
+ WindZone (MemLabelId label, ObjectCreationMode mode);
+ // ~WindZone(); declared by a macro
+
+ // Directional / Spherical. Radius is only used in Spherical mode
+ inline WindZoneMode GetMode () const { return m_Mode; }
+ inline void SetMode (WindZoneMode value) { m_Mode = value; SetDirty(); }
+
+ inline float GetRadius () const { return m_Radius; }
+ inline void SetRadius (float value) { m_Radius = value; SetDirty();}
+
+
+ // Parameters affecting the wind speed, strength and frequency
+ inline float GetWindMain () const { return m_WindMain; }
+ inline float GetWindTurbulence () const { return m_WindTurbulence; }
+ inline float GetWindPulseMagnitude () const { return m_WindPulseMagnitude; }
+ inline float GetWindPulseFrequency () const { return m_WindPulseFrequency; }
+
+ inline void SetWindMain (float value) { m_WindMain = value; SetDirty(); }
+ inline void SetWindTurbulence (float value) { m_WindTurbulence = value; SetDirty();}
+ inline void SetWindPulseMagnitude (float value) { m_WindPulseMagnitude = value; SetDirty(); }
+ inline void SetWindPulseFrequency (float value) { m_WindPulseFrequency = value; SetDirty(); }
+
+ Vector4f ComputeWindForce (const AABB& bounds, float time) const;
+
+protected:
+ virtual void AddToManager();
+ virtual void RemoveFromManager();
+
+private:
+ // Settings
+ WindZoneMode m_Mode; ///< enum { Directional = 0, Spherical = 1 }
+
+ float m_Radius;
+
+ float m_WindMain;
+ float m_WindTurbulence;
+
+ float m_WindPulseMagnitude;
+ float m_WindPulseFrequency;
+
+ // Node registered with the Wind Manager
+ ListNode<WindZone> m_Node;
+};
+
+
+// --------------------------------------------------------------------------
+
+
+class WindManager
+{
+public:
+ ~WindManager();
+
+ static WindManager& GetInstance();
+
+ void AddWindZone(ListNode<WindZone>& node) { m_WindZones.push_back (node); }
+
+ Vector4f ComputeWindForce(const AABB& bounds);
+
+ typedef List< ListNode<WindZone> > WindZoneList;
+ WindZoneList& GetList ();
+
+private:
+ static WindManager s_WindManager;
+
+ WindZoneList m_WindZones;
+};
+
+
+// --------------------------------------------------------------------------
+
+
+#endif