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