소스 검색

~ moved OnRegisterSceneNode to CObject as this function should barely change
+ support for sounds added

Signed-off-by: Alexis Maiquez <almamu@almamu.com>

Alexis Maiquez 7 년 전
부모
커밋
f7be32eed3

+ 2 - 0
CMakeLists.txt

@@ -50,6 +50,8 @@ add_executable(
 
         src/WallpaperEngine/Render/Objects/CImage.h
         src/WallpaperEngine/Render/Objects/CImage.cpp
+        src/WallpaperEngine/Render/Objects/CSound.h
+        src/WallpaperEngine/Render/Objects/CSound.cpp
 
         src/WallpaperEngine/FileSystem/FileSystem.cpp
         src/WallpaperEngine/FileSystem/FileSystem.h

+ 8 - 0
src/WallpaperEngine/Render/CObject.cpp

@@ -22,4 +22,12 @@ CObject::~CObject()
 CScene* CObject::getScene ()
 {
     return this->m_scene;
+}
+
+void CObject::OnRegisterSceneNode ()
+{
+    if (this->m_object->isVisible () == true)
+        SceneManager->registerNodeForRendering (this);
+
+    ISceneNode::OnRegisterSceneNode ();
 }

+ 2 - 0
src/WallpaperEngine/Render/CObject.h

@@ -23,6 +23,8 @@ namespace WallpaperEngine::Render
         CObject (CScene* scene, std::string type, Core::CObject *object);
         ~CObject ();
 
+        void OnRegisterSceneNode () override;
+
         CScene* getScene ();
 
     private:

+ 8 - 0
src/WallpaperEngine/Render/CScene.cpp

@@ -1,5 +1,9 @@
 #include "WallpaperEngine/Core/Objects/CImage.h"
+#include "WallpaperEngine/Core/Objects/CSound.h"
+
 #include "WallpaperEngine/Render/Objects/CImage.h"
+#include "WallpaperEngine/Render/Objects/CSound.h"
+
 #include "CScene.h"
 
 using namespace WallpaperEngine;
@@ -28,6 +32,10 @@ CScene::CScene (Core::CProject* project, Irrlicht::CContext* context) :
         {
             new Objects::CImage (this, (*cur)->As <Core::Objects::CImage> ());
         }
+        else if ((*cur)->Is <Core::Objects::CSound> () == true)
+        {
+            new Objects::CSound (this, (*cur)->As <Core::Objects::CSound> ());
+        }
     }
 
     this->m_nextId = ++highestId;

+ 0 - 8
src/WallpaperEngine/Render/Objects/CImage.cpp

@@ -181,14 +181,6 @@ const irr::core::aabbox3d<irr::f32>& CImage::getBoundingBox() const
     return this->m_boundingBox;
 }
 
-void CImage::OnRegisterSceneNode ()
-{
-    if (this->m_image->isVisible () == true)
-        SceneManager->registerNodeForRendering (this);
-
-    ISceneNode::OnRegisterSceneNode ();
-}
-
 void CImage::OnSetConstants (irr::video::IMaterialRendererServices *services, int32_t userData)
 {
     irr::f32 g_Texture0 = 0;

+ 0 - 1
src/WallpaperEngine/Render/Objects/CImage.h

@@ -21,7 +21,6 @@ namespace WallpaperEngine::Render::Objects
 
         void render () override;
         const irr::core::aabbox3d<irr::f32>& getBoundingBox() const override;
-        void OnRegisterSceneNode () override;
 
     protected:
         static const std::string Type;

+ 78 - 0
src/WallpaperEngine/Render/Objects/CSound.cpp

@@ -0,0 +1,78 @@
+#include <SDL_rwops.h>
+#include <SDL_mixer.h>
+
+#include "CSound.h"
+
+using namespace WallpaperEngine::Render::Objects;
+
+CSound::CSound (CScene* scene, Core::Objects::CSound* sound) :
+    CObject (scene, Type, sound),
+    m_sound (sound)
+{
+    this->setAutomaticCulling (irr::scene::EAC_OFF);
+    this->m_boundingBox = irr::core::aabbox3d<irr::f32>(0, 0, 0, 0, 0, 0);
+
+    this->load ();
+    this->play ();
+}
+
+void CSound::load ()
+{
+    std::vector<std::string>::const_iterator cur = this->m_sound->getSounds ()->begin ();
+    std::vector<std::string>::const_iterator end = this->m_sound->getSounds ()->end ();
+
+    for (; cur != end; cur ++)
+    {
+        SDL_RWops* sdlRwops = nullptr;
+        Mix_Music* music = nullptr;
+        irr::io::IReadFile* readfile = this->getScene ()->getContext ()->getDevice ()->getFileSystem ()->createAndOpenFile ((*cur).c_str ());
+        int filesize = readfile->getSize ();
+        char* filebuffer = new char [filesize];
+
+        readfile->read (filebuffer, filesize);
+
+        sdlRwops = SDL_RWFromConstMem(filebuffer, filesize);
+        music = Mix_LoadMUS_RW (sdlRwops);
+        readfile->drop ();
+
+        if (music == nullptr)
+        {
+            this->getScene ()->getContext ()->getDevice ()->getLogger ()->log (
+                "cannot load audio", Mix_GetError (), irr::ELL_ERROR
+            );
+
+            continue;
+        }
+
+        this->m_bufferReader.push_back (sdlRwops);
+        this->m_soundBuffer.push_back (filebuffer);
+        this->m_sdl.push_back (music);
+    }
+}
+void CSound::play ()
+{
+    std::vector<Mix_Music*>::const_iterator mixcur = this->m_sdl.begin ();
+    std::vector<Mix_Music*>::const_iterator mixend = this->m_sdl.end ();
+
+    for (; mixcur != mixend; mixcur ++)
+    {
+        if (Mix_PlayMusic ((*mixcur), -1) == -1)
+        {
+            this->getScene ()->getContext ()->getDevice ()->getLogger ()->log (
+                "cannot play audio", Mix_GetError (), irr::ELL_ERROR
+            );
+        }
+    }
+}
+
+void CSound::render ()
+{
+
+}
+
+const irr::core::aabbox3d<irr::f32>& CSound::getBoundingBox() const
+{
+    return this->m_boundingBox;
+}
+
+const std::string CSound::Type = "sound";

+ 37 - 0
src/WallpaperEngine/Render/Objects/CSound.h

@@ -0,0 +1,37 @@
+#pragma once
+
+#include <SDL_rwops.h>
+#include <SDL_mixer.h>
+
+#include "WallpaperEngine/Core/Objects/CSound.h"
+
+#include "WallpaperEngine/Render/CObject.h"
+
+using namespace WallpaperEngine;
+
+namespace WallpaperEngine::Render::Objects
+{
+    class CSound : public CObject
+    {
+    public:
+        CSound (CScene* scene, Core::Objects::CSound* sound);
+
+        void render () override;
+        const irr::core::aabbox3d<irr::f32>& getBoundingBox() const override;
+
+    protected:
+        static const std::string Type;
+
+        void load ();
+        void play ();
+
+    private:
+        std::vector<std::string> m_filenames;
+        std::vector <Mix_Music*> m_sdl;
+        std::vector <SDL_RWops*> m_bufferReader;
+        std::vector <void*> m_soundBuffer;
+
+        Core::Objects::CSound* m_sound;
+        irr::core::aabbox3d<irr::f32> m_boundingBox;
+    };
+}