Ver Fonte

add Sound and SoundWorld

mikymod há 12 anos atrás
pai
commit
1b8361edc4
4 ficheiros alterados com 353 adições e 0 exclusões
  1. 121 0
      engine/Sound.cpp
  2. 72 0
      engine/Sound.h
  3. 97 0
      engine/SoundWorld.cpp
  4. 63 0
      engine/SoundWorld.h

+ 121 - 0
engine/Sound.cpp

@@ -0,0 +1,121 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "Sound.h"
+#include "SoundResource.h"
+#include "Vector3.h"
+#include "Quaternion.h"
+#include "Device.h"
+#include "Unit.h"
+
+namespace crown
+{
+
+//-----------------------------------------------------------------------------
+void Sound::create(SoundResource* sr, int32_t node, const Vector3& /*pos*/, const Quaternion& /*rot*/)
+{
+	SoundRenderer* s = device()->sound_renderer();
+
+	m_buffer = sr->m_id;
+	m_source = s->create_sound_source();
+	s->bind_buffer(m_buffer, m_source);
+
+	m_node = node;
+}
+
+//-----------------------------------------------------------------------------
+void Sound::destroy()
+{
+	device()->sound_renderer()->destroy_sound_source(m_source);
+}
+
+//-----------------------------------------------------------------------------
+Vector3	Sound::local_position() const
+{
+	return m_local_pose.translation();
+}
+
+//-----------------------------------------------------------------------------
+Quaternion Sound::local_rotation() const
+{
+	return m_local_pose.to_quaternion();
+}
+
+//-----------------------------------------------------------------------------
+Matrix4x4 Sound::local_pose() const
+{
+	return m_local_pose;
+}
+
+//-----------------------------------------------------------------------------
+Vector3	Sound::world_position() const
+{
+	return m_world_pose.translation();
+}
+
+//-----------------------------------------------------------------------------
+Quaternion Sound::world_rotation() const
+{
+	return m_world_pose.to_quaternion();
+}
+
+//-----------------------------------------------------------------------------
+Matrix4x4 Sound::world_pose() const
+{
+	return m_world_pose;
+}
+
+//-----------------------------------------------------------------------------
+void Sound::set_local_position(Unit* unit, const Vector3& pos)
+{
+	m_local_pose.set_translation(pos);
+
+	unit->set_local_position(pos, m_node);
+
+}
+
+//-----------------------------------------------------------------------------
+void Sound::set_local_rotation(Unit* unit, const Quaternion& rot)
+{
+	Matrix4x4& local_pose = m_local_pose;
+
+	Vector3 local_translation = local_pose.translation();
+	local_pose = rot.to_matrix4x4();
+	local_pose.set_translation(local_translation);
+
+	unit->set_local_rotation(rot, m_node);
+}
+
+//-----------------------------------------------------------------------------
+void Sound::set_local_pose(Unit* unit, const Matrix4x4& pose)
+{
+	m_local_pose = pose;
+
+	unit->set_local_pose(pose, m_node);
+}
+
+
+} // namespace crown

+ 72 - 0
engine/Sound.h

@@ -0,0 +1,72 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include "SoundRenderer.h"
+#include "Matrix4x4.h"
+
+namespace crown
+{
+
+class SoundResource;
+class Vector3;
+class Quaternion;
+class Unit;
+
+struct Sound
+{
+	void			create(SoundResource* sr, int32_t node, const Vector3& pos, const Quaternion& dir);
+	void			destroy();
+
+	Vector3			local_position() const;
+	Quaternion		local_rotation() const;
+	Matrix4x4		local_pose() const;
+
+	Vector3			world_position() const;
+	Quaternion		world_rotation() const;
+	Matrix4x4		world_pose() const;
+
+	void			set_local_position(Unit* unit, const Vector3& pos);
+	void			set_local_rotation(Unit* unit, const Quaternion& rot);
+	void			set_local_pose(Unit* unit, const Matrix4x4& pose);
+
+public:
+
+	uint32_t		m_node;
+	Matrix4x4		m_local_pose;
+	Matrix4x4		m_world_pose;
+
+	float			m_volume;
+	float			m_range;
+	bool			m_loop : 1;
+	bool			m_playing : 1;
+
+	SoundBufferId	m_buffer;
+	SoundSourceId	m_source;
+};
+
+} // namespace crown

+ 97 - 0
engine/SoundWorld.cpp

@@ -0,0 +1,97 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "SoundWorld.h"
+#include "Device.h"
+#include "SoundRenderer.h"
+#include "ResourceManager.h"
+
+namespace crown
+{
+
+//-----------------------------------------------------------------------------
+SoundWorld::SoundWorld()
+	: m_sounds_pool(default_allocator(), MAX_SOUNDS, sizeof(Sound))
+	, m_sounds(default_allocator())
+{
+	device()->sound_renderer()->set_listener(Vector3::ZERO, Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(1, 0, 0));
+}
+
+//-----------------------------------------------------------------------------
+SoundWorld::~SoundWorld()
+{
+}
+
+//-----------------------------------------------------------------------------
+SoundId	SoundWorld::create_sound(ResourceId id, int32_t node, const Vector3& pos, const Quaternion& rot)
+{
+	SoundResource* sr = (SoundResource*) device()->resource_manager()->data(id);
+
+	Sound* sound = (Sound*) m_sounds_pool.allocate(sizeof(Sound));
+
+	const SoundId sound_id = m_sounds.create(sound);
+	sound->create(sr, node, pos, rot);
+
+	return sound_id;
+}
+
+//-----------------------------------------------------------------------------
+void SoundWorld::destroy_sound(SoundId /*id*/)
+{
+	// Stub
+}
+
+//-----------------------------------------------------------------------------
+Sound* SoundWorld::lookup_sound(SoundId id)
+{
+	CE_ASSERT(m_sounds.has(id), "Sound does not exits");
+
+	return m_sounds.lookup(id);
+}
+
+//-----------------------------------------------------------------------------
+void SoundWorld::update(float /*dt*/)
+{
+	List<Sound*>& sounds = m_sounds.m_objects; 
+	for (uint32_t i = 0; i < sounds.size(); i++)
+	{
+		Sound* sound = sounds[i];
+
+		device()->sound_renderer()->set_sound_loop(sound->m_source, sound->m_loop);
+		device()->sound_renderer()->set_sound_gain(sound->m_source, sound->m_volume);
+		device()->sound_renderer()->set_sound_max_distance(sound->m_source, sound->m_range);
+		device()->sound_renderer()->set_sound_position(sound->m_source, sound->m_world_pose.translation());
+
+		if (!sound->m_playing)
+		{
+			device()->sound_renderer()->play_sound(sound->m_source);
+			sound->m_playing = true;
+		}
+	}
+}
+
+
+} // namespace crown

+ 63 - 0
engine/SoundWorld.h

@@ -0,0 +1,63 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include "IdArray.h"
+#include "IdTable.h"
+#include "Sound.h"
+#include "List.h"
+#include "Vector3.h"
+#include "Quaternion.h"
+#include "PoolAllocator.h"
+#include "Resource.h"
+
+#define MAX_SOUNDS 64
+
+namespace crown
+{
+
+typedef Id SoundId;
+
+class SoundWorld
+{
+public:
+				SoundWorld();
+				~SoundWorld();
+
+	SoundId		create_sound(ResourceId id, int32_t node = -1, const Vector3& pos = Vector3::ZERO, const Quaternion& rot = Quaternion::IDENTITY);
+	void		destroy_sound(SoundId id);
+	Sound*		lookup_sound(SoundId id);
+
+	void		update(float dt);
+
+private:
+
+	PoolAllocator					m_sounds_pool;
+	IdArray<MAX_SOUNDS, Sound*>		m_sounds;
+};
+
+} // namespace crown