BVB Source Codes

CRYENGINE Show ProceduralClipPlaySound.cpp Source code

Return Download CRYENGINE: download ProceduralClipPlaySound.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. //
  4. ////////////////////////////////////////////////////////////////////////////
  5.  
  6. #include "StdAfx.h"
  7.  
  8. #include "ICryMannequin.h"
  9. #include <Mannequin/Serialization.h>
  10. #include <CryExtension/ClassWeaver.h>
  11. #include <CryExtension/ClassWeaver.h>
  12. #include <CrySerialization/Decorators/ResourcesAudio.h>
  13.  
  14. /*
  15.    TEMPORARY_SOUND_FLAGS wraps soundFlags which are used to specify either
  16.    an audio should be triggered on the local player or not.
  17.    This game specific data should be moved to the game once a Wwise switch
  18.    is setup, so that only one audio trigger is needed and Wwise sort it
  19.    internally out which sound to play.
  20.  */
  21. #define TEMPORARY_SOUND_FLAGS
  22.  
  23. SERIALIZATION_ENUM_BEGIN(EAudioOcclusionType, "SoundObstructionType");
  24. SERIALIZATION_ENUM(eAudioOcclusionType_Ignore, "Ignore", "Ignore");
  25. SERIALIZATION_ENUM(eAudioOcclusionType_Adaptive, "Adaptive", "Adaptive");
  26. SERIALIZATION_ENUM(eAudioOcclusionType_Low, "Low", "Low");
  27. SERIALIZATION_ENUM(eAudioOcclusionType_Medium, "Medium", "Medium");
  28. SERIALIZATION_ENUM(eAudioOcclusionType_High, "High", "High");
  29. SERIALIZATION_ENUM_END();
  30.  
  31. class CAudioContext : public IProceduralContext
  32. {
  33. private:
  34.         CAudioContext();
  35.         virtual ~CAudioContext() {}
  36.  
  37.         typedef IProceduralContext BaseClass;
  38.  
  39. public:
  40.  
  41.         PROCEDURAL_CONTEXT(CAudioContext, "AudioContext", 0xC6C087F64CE14854, 0xADCA544D252834BD);
  42.  
  43.         virtual void Initialise(IEntity& entity, IActionController& actionController) override
  44.         {
  45.                 BaseClass::Initialise(entity, actionController);
  46.  
  47.                 m_pIEntityAudioComponent = entity.GetOrCreateComponent<IEntityAudioComponent>();
  48.         }
  49.  
  50.         virtual void Update(float timePassed) override
  51.         {
  52.         }
  53.  
  54.         void ExecuteAudioTrigger(AudioControlId const audioTriggerId, EAudioOcclusionType const occlusionType, bool playFacial)
  55.         {
  56.                 if (m_pIEntityAudioComponent != NULL)
  57.                 {
  58.                         m_pIEntityAudioComponent->SetObstructionCalcType(occlusionType);
  59.                         REINST("support facial animations for CAudioContext (if needed)");
  60.                         m_pIEntityAudioComponent->ExecuteTrigger(audioTriggerId);
  61.                 }
  62.         }
  63.  
  64.         void StopAudioTrigger(AudioControlId const audioTriggerId)
  65.         {
  66.                 if (m_pIEntityAudioComponent != NULL)
  67.                 {
  68.                         m_pIEntityAudioComponent->StopTrigger(audioTriggerId);
  69.                 }
  70.         }
  71.  
  72.         void SetAudioObjectPos(QuatT const& offset)
  73.         {
  74.                 if (m_pIEntityAudioComponent != NULL)
  75.                 {
  76.                         m_pIEntityAudioComponent->SetAuxAudioProxyOffset(Matrix34(IDENTITY, offset.t));
  77.                 }
  78.         }
  79.  
  80. private:
  81.  
  82.         IEntityAudioComponent* m_pIEntityAudioComponent;
  83. };
  84.  
  85. CAudioContext::CAudioContext() : m_pIEntityAudioComponent()
  86. {
  87. }
  88.  
  89. CRYREGISTER_CLASS(CAudioContext);
  90.  
  91. #if defined(TEMPORARY_SOUND_FLAGS)
  92. typedef enum
  93. {
  94.         ePSF_LocalPlayerOnly    = BIT(0),   //only play this sound if we are the local player entity
  95.         ePSF_ExcludeLocalPlayer = BIT(1),   //don't play this sound if we are the local player
  96. } ePlaySoundFlags;
  97. #endif
  98.  
  99. struct SAudioParams : public IProceduralParams
  100. {
  101.         SAudioParams()
  102.                 : audioOcclusionType(eAudioOcclusionType_Ignore)
  103.                 , radius(0.f)
  104.                 , synchStop(false)
  105.                 , forceStopOnExit(false)
  106.                 , isVoice(false)
  107.                 , playFacial(false)
  108. #if defined(TEMPORARY_SOUND_FLAGS)
  109.                 , soundFlags(0)
  110. #endif
  111.         {
  112.         }
  113.  
  114.         virtual void Serialize(Serialization::IArchive& ar) override
  115.         {
  116.                 ar(Serialization::AudioTrigger<TProcClipString>(startTrigger), "StartTrigger", "Start Trigger");
  117.                 ar(Serialization::AudioTrigger<TProcClipString>(stopTrigger), "StopTrigger", "Stop Trigger");
  118.                 ar(audioOcclusionType, "SoundObstructionType", "Sound Obstruction Type");
  119.                 ar(Serialization::Decorators::JointName<SProcDataCRC>(attachmentJoint), "AttachmentJoint", "Joint Name");
  120.                 if (!ar.isEdit())
  121.                 {
  122.                         // Disabled the following deprecated options in the UI, but still read/write old data in case we need them back
  123.                         ar(radius, "Radius", "AI Radius");
  124.                         ar(isVoice, "IsVoice", "Is Voice");
  125.                 }
  126.                 ar(playFacial, "PlayFacial", "Request Anim Matching Start Trigger");
  127. #if defined(TEMPORARY_SOUND_FLAGS)
  128.                 ar(soundFlags, "SoundFlags", "Sound Flags (deprecated)");
  129. #endif
  130.         }
  131.  
  132.         virtual void GetExtraDebugInfo(StringWrapper& extraInfoOut) const override
  133.         {
  134.                 extraInfoOut = startTrigger.c_str();
  135.         }
  136.  
  137.         TProcClipString     startTrigger;
  138.         TProcClipString     stopTrigger;
  139.         EAudioOcclusionType audioOcclusionType;
  140.         SProcDataCRC        attachmentJoint;
  141.         float               radius;
  142.         bool                synchStop;
  143.         bool                forceStopOnExit;
  144.         bool                isVoice;
  145.         bool                playFacial;
  146.  
  147. #if defined(TEMPORARY_SOUND_FLAGS)
  148.         uint32 soundFlags;
  149. #endif
  150. };
  151.  
  152. class CProceduralClipAudio : public TProceduralContextualClip<CAudioContext, SAudioParams>
  153. {
  154. public:
  155.         CProceduralClipAudio()
  156.                 : m_referenceJointID(0)
  157.                 , m_audioTriggerStartId(INVALID_AUDIO_CONTROL_ID)
  158.                 , m_audioTriggerStopId(INVALID_AUDIO_CONTROL_ID)
  159.         {
  160.         }
  161.  
  162. private:
  163.         struct SAudioParamInfo
  164.         {
  165.                 SAudioParamInfo() : paramIndex(-1), paramCRC(0), paramValue(-1.f) {}
  166.                 SAudioParamInfo(int _index, uint32 _crc, float _value) : paramIndex(_index), paramCRC(_crc), paramValue(_value) {}
  167.  
  168.                 int    paramIndex;
  169.                 uint32 paramCRC;
  170.                 float  paramValue;
  171.         };
  172.  
  173.         typedef std::vector<SAudioParamInfo> TAudioParamVec;
  174.  
  175. public:
  176.         virtual void OnEnter(float blendTime, float duration, const SAudioParams& params)
  177.         {
  178. #if defined(TEMPORARY_SOUND_FLAGS)
  179.                 if (params.soundFlags)
  180.                 {
  181.                         bool bIsLocalPlayer = false;
  182.  
  183.                         if (IGameFramework* gameFramework = gEnv->pGameFramework)
  184.                         {
  185.                                 if (gameFramework->GetClientActorId() == m_entity->GetId())
  186.                                 {
  187.                                         bIsLocalPlayer = true;
  188.                                 }
  189.                         }
  190.  
  191.                         if ((params.soundFlags & ePSF_LocalPlayerOnly) && !bIsLocalPlayer)
  192.                         {
  193.                                 return;
  194.                         }
  195.  
  196.                         if ((params.soundFlags & ePSF_ExcludeLocalPlayer) && bIsLocalPlayer)
  197.                         {
  198.                                 return;
  199.                         }
  200.                 }
  201. #endif
  202.  
  203.                 m_referenceJointID = -1;
  204.                 bool const playFacial = params.playFacial;
  205.                 bool const isVoice = playFacial || params.isVoice;
  206.  
  207.                 bool bIsSilentPlaybackMode = gEnv->IsEditor() && gEnv->pGameFramework->GetMannequinInterface().IsSilentPlaybackMode();
  208.  
  209.                 ICharacterInstance const* const pCharacterInstance = m_scope->GetCharInst();
  210.  
  211.                 if (pCharacterInstance != NULL)
  212.                 {
  213.                         m_referenceJointID = pCharacterInstance->GetIDefaultSkeleton().GetJointIDByCRC32(params.attachmentJoint.ToUInt32());
  214.                 }
  215.  
  216.                 QuatT const soundOffset = GetBoneAbsLocationByID(m_referenceJointID);
  217.  
  218.                 if (!bIsSilentPlaybackMode)
  219.                 {
  220.                         if (!params.startTrigger.empty())
  221.                         {
  222.                                 gEnv->pAudioSystem->GetAudioTriggerId(params.startTrigger.c_str(), m_audioTriggerStartId);
  223.  
  224.                                 if (m_audioTriggerStartId != INVALID_AUDIO_CONTROL_ID)
  225.                                 {
  226.                                         m_audioOcclusionType = params.audioOcclusionType;
  227.                                         m_context->ExecuteAudioTrigger(m_audioTriggerStartId, m_audioOcclusionType, playFacial);
  228.                                 }
  229.                         }
  230.  
  231.                         if (!params.stopTrigger.empty())
  232.                         {
  233.                                 gEnv->pAudioSystem->GetAudioTriggerId(params.stopTrigger.c_str(), m_audioTriggerStopId);
  234.                         }
  235.                 }
  236.         }
  237.  
  238.         virtual void OnExit(float blendTime)
  239.         {
  240.                 if (m_audioTriggerStopId != INVALID_AUDIO_CONTROL_ID)
  241.                 {
  242.                         m_context->ExecuteAudioTrigger(m_audioTriggerStopId, m_audioOcclusionType, false);
  243.                 }
  244.                 else if (m_audioTriggerStartId != INVALID_AUDIO_CONTROL_ID)
  245.                 {
  246.                         m_context->StopAudioTrigger(m_audioTriggerStartId);
  247.                 }
  248.  
  249.                 m_audioTriggerStartId = INVALID_AUDIO_CONTROL_ID;
  250.                 m_audioTriggerStopId = INVALID_AUDIO_CONTROL_ID;
  251.         }
  252.  
  253.         virtual void Update(float timePassed)
  254.         {
  255.                 UpdateSoundParams();
  256.  
  257.                 UpdateSoundPosition();
  258.         }
  259.  
  260. private:
  261.  
  262.         void UpdateSoundParams()
  263.         {
  264.                 if (!m_audioParams.empty())
  265.                 {
  266.                         const size_t numParams = m_audioParams.size();
  267.                         for (size_t i = 0; i < numParams; i++)
  268.                         {
  269.                                 float paramValue = 0.f;
  270.                                 if (GetParam(m_audioParams[i].paramCRC, paramValue) && (m_audioParams[i].paramValue != paramValue))
  271.                                 {
  272.                                         REINST("update RTPCs")
  273.                                         //pSound->SetParam(m_soundParams[i].paramIndex, paramValue);
  274.                                         m_audioParams[i].paramValue = paramValue;
  275.                                 }
  276.                         }
  277.                 }
  278.         }
  279.  
  280.         void UpdateSoundPosition()
  281.         {
  282.                 if (m_referenceJointID < 0)
  283.                         return;
  284.  
  285.                 m_context->SetAudioObjectPos(GetBoneAbsLocationByID(m_referenceJointID));
  286.         }
  287.  
  288.         QuatT GetBoneAbsLocationByID(const int jointID)
  289.         {
  290.                 ICharacterInstance* pCharacterInstance = m_scope->GetCharInst();
  291.                 if ((pCharacterInstance != NULL) && (jointID >= 0))
  292.                 {
  293.                         return pCharacterInstance->GetISkeletonPose()->GetAbsJointByID(jointID);
  294.                 }
  295.  
  296.                 return QuatT(ZERO, IDENTITY);
  297.         }
  298.  
  299.         TAudioParamVec      m_audioParams;
  300.  
  301.         int                 m_referenceJointID;
  302.  
  303.         AudioControlId      m_audioTriggerStartId;
  304.         AudioControlId      m_audioTriggerStopId;
  305.         EAudioOcclusionType m_audioOcclusionType;
  306. };
  307.  
  308. typedef CProceduralClipAudio CProceduralClipPlaySound;
  309. REGISTER_PROCEDURAL_CLIP(CProceduralClipPlaySound, "PlaySound");
  310. REGISTER_PROCEDURAL_CLIP(CProceduralClipAudio, "Audio");
  311.  
downloadProceduralClipPlaySound.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