BVB Source Codes

CRYENGINE Show FeatureAudio.cpp Source code

Return Download CRYENGINE: download FeatureAudio.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "ParticleSystem/ParticleFeature.h"
  5. #include <CrySerialization/Decorators/ResourcesAudio.h>
  6. #include "ParamMod.h"
  7.  
  8. CRY_PFX2_DBG
  9.  
  10. namespace pfx2
  11. {
  12.  
  13. static const ColorB audioColor = ColorB(172, 196, 138);
  14. typedef TIOStream<IAudioProxy*> TIOAudioProxies;
  15.  
  16. EParticleDataType PDT(EPDT_AudioProxy, IAudioProxy*);
  17.  
  18.  
  19. SERIALIZATION_DECLARE_ENUM(ETriggerType,
  20.                            OnSpawn,
  21.                            OnDeath
  22.                            )
  23.  
  24. SERIALIZATION_DECLARE_ENUM(EAudioOcclusionMode,
  25.                            Ignore = eAudioOcclusionType_Ignore,
  26.                            Adaptive = eAudioOcclusionType_Adaptive,
  27.                            Low = eAudioOcclusionType_Low,
  28.                            Medium = eAudioOcclusionType_Medium,
  29.                            High = eAudioOcclusionType_High
  30.                            )
  31.  
  32. class CFeatureAudioTrigger : public CParticleFeature
  33. {
  34. public:
  35.         CRY_PFX2_DECLARE_FEATURE
  36.  
  37.         CFeatureAudioTrigger()
  38.                 : m_triggerType(ETriggerType::OnSpawn)
  39.                 , m_occlusionMode(EAudioOcclusionMode::Ignore)
  40.                 , m_audioId(INVALID_AUDIO_CONTROL_ID)
  41.                 , m_followParticle(true) {}
  42.  
  43.         void AddToComponent(CParticleComponent* pComponent, SComponentParams* pParams) override
  44.         {
  45.                 gEnv->pAudioSystem->GetAudioTriggerId(m_audioName.c_str(), m_audioId);
  46.                 if (m_audioId != INVALID_AUDIO_CONTROL_ID)
  47.                 {
  48.                         pComponent->AddToUpdateList(EUL_MainPreUpdate, this);
  49.                         pComponent->AddParticleData(EPVF_Position);
  50.                         pComponent->AddParticleData(EPDT_AudioProxy);
  51.                 }
  52.         }
  53.  
  54.         void Serialize(Serialization::IArchive& ar) override
  55.         {
  56.                 CParticleFeature::Serialize(ar);
  57.                 ar(Serialization::AudioTrigger(m_audioName), "Name", "Name");
  58.                 ar(m_triggerType, "Trigger", "Trigger");
  59.                 ar(m_occlusionMode, "Occlusion", "Occlusion");
  60.                 if (m_triggerType == ETriggerType::OnSpawn)
  61.                         ar(m_followParticle, "FollowParticle", "Follow Particle");
  62.                 else
  63.                         m_followParticle = false;
  64.         }
  65.  
  66.         void MainPreUpdate(CParticleComponentRuntime* pComponentRuntime) override
  67.         {
  68.                 CryStackStringT<char, 512> proxyName;
  69.                 proxyName.append(pComponentRuntime->GetComponent()->GetEffect()->GetName());
  70.                 proxyName.append(" : ");
  71.                 proxyName.append(pComponentRuntime->GetComponent()->GetName());
  72.  
  73.                 if (m_followParticle)
  74.                 {
  75.                         TriggerFollowAudioEvents(pComponentRuntime, proxyName.c_str());
  76.                         UpdateAudioProxies(pComponentRuntime);
  77.                 }
  78.                 else
  79.                         TriggerSingleAudioEvents(pComponentRuntime, proxyName.c_str());
  80.         }
  81.  
  82. private:
  83.         void TriggerSingleAudioEvents(CParticleComponentRuntime* pComponentRuntime, const char* proxyName)
  84.         {
  85.                 CRY_PFX2_PROFILE_DETAIL;
  86.  
  87.                 IAudioSystem* pAudioSystem = gEnv->pAudioSystem;
  88.                 const SUpdateContext context(pComponentRuntime);
  89.                 CParticleContainer& container = context.m_container;
  90.                 const IVec3Stream positions = container.GetIVec3Stream(EPVF_Position);
  91.                 const auto states = container.GetTIStream<uint8>(EPDT_State);
  92.                 TIOAudioProxies audioProxies = container.GetTIOStream<IAudioProxy*>(EPDT_AudioProxy);
  93.  
  94.                 CRY_PFX2_FOR_ACTIVE_PARTICLES(context)
  95.                 {
  96.                         IAudioProxy* pAudioProxy = nullptr;
  97.                         const uint8 state = states.Load(particleId);
  98.                         const bool onSpawn = (m_triggerType == ETriggerType::OnSpawn) && (state == ES_NewBorn);
  99.                         const bool onDeath = (m_triggerType == ETriggerType::OnDeath) && (state == ES_Expired);
  100.                         if (onSpawn || onDeath)
  101.                         {
  102.                                 pAudioProxy = MakeProxy(pAudioSystem, positions, particleId, proxyName);
  103.                                 pAudioProxy->ExecuteTrigger(m_audioId);
  104.                                 pAudioProxy->Release();
  105.                         }
  106.                 }
  107.                 CRY_PFX2_FOR_END;
  108.         }
  109.  
  110.         void TriggerFollowAudioEvents(CParticleComponentRuntime* pComponentRuntime, const char* proxyName)
  111.         {
  112.                 CRY_PFX2_PROFILE_DETAIL;
  113.  
  114.                 IAudioSystem* pAudioSystem = gEnv->pAudioSystem;
  115.                 const SUpdateContext context(pComponentRuntime);
  116.                 CParticleContainer& container = context.m_container;
  117.                 const IVec3Stream positions = container.GetIVec3Stream(EPVF_Position);
  118.                 const auto states = container.GetTIStream<uint8>(EPDT_State);
  119.                 TIOAudioProxies audioProxies = container.GetTIOStream<IAudioProxy*>(EPDT_AudioProxy);
  120.  
  121.                 CRY_PFX2_FOR_ACTIVE_PARTICLES(context)
  122.                 {
  123.                         IAudioProxy* pAudioProxy = audioProxies.Load(particleId);
  124.                         const uint8 state = states.Load(particleId);
  125.                         if ((state & ESB_NewBorn) != 0)
  126.                         {
  127.                                 pAudioProxy = MakeProxy(pAudioSystem, positions, particleId, proxyName);
  128.                                 audioProxies.Store(particleId, pAudioProxy);
  129.                                 pAudioProxy->ExecuteTrigger(m_audioId);
  130.                         }
  131.                         if ((state & ESB_Dead) != 0 && pAudioProxy)
  132.                         {
  133.                                 pAudioProxy->StopTrigger(m_audioId);
  134.                                 pAudioProxy->Release();
  135.                                 audioProxies.Store(particleId, nullptr);
  136.                         }
  137.                 }
  138.                 CRY_PFX2_FOR_END;
  139.         }
  140.  
  141.         void UpdateAudioProxies(CParticleComponentRuntime* pComponentRuntime)
  142.         {
  143.                 CRY_PFX2_PROFILE_DETAIL;
  144.  
  145.                 const SUpdateContext context(pComponentRuntime);
  146.                 CParticleContainer& container = context.m_container;
  147.                 const IVec3Stream positions = container.GetIVec3Stream(EPVF_Position);
  148.                 TIOAudioProxies audioProxies = container.GetTIOStream<IAudioProxy*>(EPDT_AudioProxy);
  149.  
  150.                 CRY_PFX2_FOR_ACTIVE_PARTICLES(context)
  151.                 {
  152.                         IAudioProxy* pAudioProxy = audioProxies.Load(particleId);
  153.                         if (pAudioProxy)
  154.                         {
  155.                                 const Vec3 position = positions.Load(particleId);
  156.                                 pAudioProxy->SetPosition(position);
  157.                         }
  158.                 }
  159.                 CRY_PFX2_FOR_END;
  160.         }
  161.  
  162.         ILINE IAudioProxy* MakeProxy(IAudioSystem* pAudioSystem, IVec3Stream positions, TParticleId particleId, const char* proxyName)
  163.         {
  164.                 IAudioProxy* pAudioProxy;
  165.                 const Vec3 position = positions.Load(particleId);
  166.  
  167.                 pAudioProxy = pAudioSystem->GetFreeAudioProxy();
  168.  
  169.                 pAudioProxy->Initialize(proxyName);
  170.                 pAudioProxy->SetOcclusionType(EAudioOcclusionType(m_occlusionMode));
  171.                 pAudioProxy->SetPosition(position);
  172.                 pAudioProxy->SetCurrentEnvironments();
  173.  
  174.                 return pAudioProxy;
  175.         }
  176.  
  177.         string              m_audioName;
  178.         AudioControlId      m_audioId;
  179.         ETriggerType        m_triggerType;
  180.         EAudioOcclusionMode m_occlusionMode;
  181.         bool                m_followParticle;
  182. };
  183.  
  184. CRY_PFX2_IMPLEMENT_FEATURE(CParticleFeature, CFeatureAudioTrigger, "Audio", "Trigger", colorAudio);
  185.  
  186. class CFeatureAudioRtpc : public CParticleFeature
  187. {
  188. public:
  189.         CRY_PFX2_DECLARE_FEATURE
  190.  
  191.         CFeatureAudioRtpc()
  192.                 : m_value(1.0f)
  193.                 , m_rtpcId(INVALID_AUDIO_CONTROL_ID) {}
  194.  
  195.         void AddToComponent(CParticleComponent* pComponent, SComponentParams* pParams) override
  196.         {
  197.                 gEnv->pAudioSystem->GetAudioRtpcId(m_rtpcName.c_str(), m_rtpcId);
  198.                 if (m_rtpcId != INVALID_AUDIO_CONTROL_ID)
  199.                 {
  200.                         pComponent->AddToUpdateList(EUL_MainPreUpdate, this);
  201.                         m_value.AddToComponent(pComponent, this);
  202.                 }
  203.         }
  204.  
  205.         void Serialize(Serialization::IArchive& ar) override
  206.         {
  207.                 CParticleFeature::Serialize(ar);
  208.                 ar(Serialization::AudioRTPC(m_rtpcName), "Name", "Name");
  209.                 ar(m_value, "Value", "Value");
  210.         }
  211.  
  212.         void MainPreUpdate(CParticleComponentRuntime* pComponentRuntime) override
  213.         {
  214.                 const SUpdateContext context(pComponentRuntime);
  215.                 CParticleContainer& container = context.m_container;
  216.                 if (!container.HasData(EPDT_AudioProxy))
  217.                         return;
  218.                 TIOAudioProxies audioProxies = container.GetTIOStream<IAudioProxy*>(EPDT_AudioProxy);
  219.  
  220.                 STempModBuffer values(context, m_value);
  221.                 values.ModifyUpdate(context, m_value, container.GetFullRange());
  222.  
  223.                 CRY_PFX2_FOR_ACTIVE_PARTICLES(context)
  224.                 {
  225.                         const float value = values.m_stream.Load(particleId);
  226.                         IAudioProxy* pAudioProxy = audioProxies.Load(particleId);
  227.                         if (pAudioProxy)
  228.                                 pAudioProxy->SetRtpcValue(m_rtpcId, value);
  229.                 }
  230.                 CRY_PFX2_FOR_END;
  231.         }
  232.  
  233. private:
  234.         string                               m_rtpcName;
  235.         AudioControlId                       m_rtpcId;
  236.         CParamMod<SModParticleField, SFloat> m_value;
  237. };
  238.  
  239. CRY_PFX2_IMPLEMENT_FEATURE(CParticleFeature, CFeatureAudioRtpc, "Audio", "Rtpc", colorAudio);
  240.  
  241. }
  242.  
downloadFeatureAudio.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top