00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "SoundListenerComponent.h"
00018 #ifdef __COMPILE_WITH_SFML_AUDIO__
00019 #include "../../core/GameManager.h"
00020
00021
00022
00023
00024 SoundListenerComponent* SoundListenerComponent::mMainListener = 0;
00025
00026
00027 SoundListenerComponent::SoundListenerComponent(Entity *parent, bool isMainListener)
00028 : EntityComponent(parent), mPosition(parent->getAbsolutePosition()),
00029 mRotation(parent->getAbsoluteRotation())
00030 {
00031
00032 if(isMainListener)
00033 {
00034 if(mMainListener)
00035 mMainListener->setIsMainListener(false);
00036
00037 setIsMainListener(true);
00038 }
00039
00040
00041 mName = "SoundListenerComponent";
00042
00043
00044 pParent->connectEventSignal("onPositionChange", this, &SoundListenerComponent::onPositionChange);
00045 pParent->connectEventSignal("onRotationChange", this, &SoundListenerComponent::onPositionChange);
00046 pParent->connectEventSignal("onPause", this, &SoundListenerComponent::onPause);
00047 pParent->connectEventSignal("onUnPause", this, &SoundListenerComponent::onUnPause);
00048 }
00049
00050
00051 SoundListenerComponent::~SoundListenerComponent()
00052 {
00053 setIsMainListener(false);
00054 }
00055
00056
00057 bool SoundListenerComponent::getIsMainListener() const
00058 {
00059 return mIsMainListener;
00060 }
00061
00062
00063 void SoundListenerComponent::setIsMainListener(bool value)
00064 {
00065 if(value)
00066 {
00067 mMainListener = this;
00068 mIsMainListener = true;
00069
00070 sf::Listener::SetPosition(mPosition.X, mPosition.Y, mPosition.Z);
00071 sf::Listener::SetTarget(mRotation.X, mRotation.Y, mRotation.Z);
00072 }
00073
00074 else
00075 {
00076 if(mIsMainListener)
00077 mMainListener = 0;
00078
00079 mIsMainListener = false;
00080 }
00081 }
00082
00083
00084
00085 void SoundListenerComponent::onPositionChange(void *p)
00086 {
00087 mPosition += reinterpret_cast<vector3df*>(p)[0];
00088 if(mIsMainListener)
00089 sf::Listener::SetPosition(mPosition.X, mPosition.Y, mPosition.Z);
00090 }
00091
00092
00093 void SoundListenerComponent::onRotationChange(void *p)
00094 {
00095 mRotation += reinterpret_cast<vector3df*>(p)[0];
00096 if(mIsMainListener)
00097 sf::Listener::SetTarget(mRotation.X, mRotation.Y, mRotation.Z);
00098 }
00099
00100
00101 void SoundListenerComponent::onPause(void *p)
00102 {
00103 mWasMainListener = getIsMainListener();
00104 setIsMainListener(false);
00105 }
00106
00107
00108 void SoundListenerComponent::onUnPause(void *p)
00109 {
00110 if(mWasMainListener)
00111 setIsMainListener(true);
00112 }
00113
00114
00115 bool SoundListenerComponent::parseXML(IXMLReader *file, Entity *entity)
00116 {
00117
00118 SoundListenerComponent *component = NULL;
00119
00120
00121 if(file->getNodeType() == io::EXN_ELEMENT)
00122 {
00123 if(stringw("SoundListenerComponent") == file->getNodeName())
00124 {
00125
00126 component = new SoundListenerComponent(entity, false);
00127 }
00128 }
00129
00130 if(component == NULL)
00131 return false;
00132
00133
00134 while(file->read())
00135 {
00136 switch(file->getNodeType())
00137 {
00138 case io::EXN_ELEMENT:
00139
00140
00141 if(stringw("isMainListener") == file->getNodeName())
00142 {
00143 stringc value = file->getAttributeValue(L"value");
00144 component->setIsMainListener( (value == "true") ? true : false );
00145 }
00146
00147
00148 break;
00149
00150 case io::EXN_ELEMENT_END:
00151
00152
00153 if(stringw("SoundListenerComponent") == file->getNodeName())
00154 return true;
00155
00156 break;
00157
00158 default:
00159
00160 break;
00161 }
00162
00163 }
00164
00165
00166 return false;
00167 }
00168
00169 #endif // __COMPILE_WITH_SFML_AUDIO__
00170
00171