Merge remote-tracking branch 'origin/master' into Physics
Conflicts: include/Physics/PhysicsSystem.h src/game/Physics/PhysicsSystem.cpp
This commit is contained in:
@@ -263,7 +263,7 @@ void dd::OBJ::ParseMaterial()
|
||||
ParseColorMap(currentLine, ss, prefix, arg, colorMap);
|
||||
}
|
||||
|
||||
// HACK: Should we really have to specify the full path here?
|
||||
// HACK: Should we really have to specify the full FilePath here?
|
||||
colorMap.FileName = (m_MaterialPath.branch_path() / colorMap.FileName).string();
|
||||
currentMaterial->DiffuseTexture = colorMap;
|
||||
continue;
|
||||
@@ -280,7 +280,7 @@ void dd::OBJ::ParseMaterial()
|
||||
ParseColorMap(currentLine, ss, prefix, arg, colorMap);
|
||||
}
|
||||
|
||||
// HACK: Should we really have to specify the full path here?
|
||||
// HACK: Should we really have to specify the full FilePath here?
|
||||
colorMap.FileName = (m_MaterialPath.branch_path() / colorMap.FileName).string();
|
||||
currentMaterial->SpecularMap = colorMap;
|
||||
continue;
|
||||
@@ -297,7 +297,7 @@ void dd::OBJ::ParseMaterial()
|
||||
ParseBumpMap(currentLine, ss, prefix, arg, bumpMap);
|
||||
}
|
||||
|
||||
// HACK: Should we really have to specify the full path here?
|
||||
// HACK: Should we really have to specify the full FilePath here?
|
||||
bumpMap.FileName = (m_MaterialPath.branch_path() / bumpMap.FileName).string();
|
||||
currentMaterial->NormalMap = bumpMap;
|
||||
continue;
|
||||
|
||||
@@ -13,7 +13,7 @@ void dd::Systems::BallSystem::RegisterComponents(ComponentFactory *cf)
|
||||
void dd::Systems::BallSystem::Initialize()
|
||||
{
|
||||
|
||||
EVENT_SUBSCRIBE_MEMBER(m_Contact, BallSystem::Contact);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_Contact, &BallSystem::Contact);
|
||||
}
|
||||
|
||||
void dd::Systems::BallSystem::Update(double dt)
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
|
||||
void dd::Systems::LevelSystem::Initialize()
|
||||
{
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, LevelSystem::OnPowerUpTaken);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, LevelSystem::OnStageCleared);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EContact, &LevelSystem::OnContact);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, &LevelSystem::OnLifeLost);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, &LevelSystem::OnScoreEvent);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &LevelSystem::OnMultiBall);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, &LevelSystem::OnCreatePowerUp);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, &LevelSystem::OnPowerUpTaken);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &LevelSystem::OnStageCleared);
|
||||
|
||||
for (int i = 0; i < Lives(); i++) {
|
||||
CreateLife(i);
|
||||
@@ -195,7 +195,7 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe
|
||||
|
||||
//sound
|
||||
auto collisionSound = m_World->AddComponent<Components::CollisionSound>(brick);
|
||||
collisionSound->filePath = "Sounds/Brick/shortbrickbreak.wav";
|
||||
collisionSound->FilePath = "Sounds/Brick/shortbrickbreak.wav";
|
||||
|
||||
m_World->CommitEntity(brick);
|
||||
return;
|
||||
|
||||
+10
-10
@@ -26,7 +26,7 @@ ALuint dd::Sound::LoadFile(std::string path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
fread(&m_Size, sizeof(unsigned long), 1, fp);
|
||||
fread(&m_Size, 4*sizeof(char), 1, fp);
|
||||
fread(m_Type, sizeof(char), 4, fp);
|
||||
if (m_Type[0] != 'W' || m_Type[1] != 'A' || m_Type[2] != 'V' || m_Type[3]!= 'E') {
|
||||
LOG_ERROR("ERROR: Not WAVE-file");
|
||||
@@ -40,13 +40,13 @@ ALuint dd::Sound::LoadFile(std::string path)
|
||||
}
|
||||
|
||||
//READ THE DATA FROM WAVE-FILE
|
||||
fread(&m_ChunkSize, sizeof(unsigned long), 1, fp);
|
||||
fread(&m_FormatType, sizeof(short), 1, fp);
|
||||
fread(&m_Channels, sizeof(short), 1, fp);
|
||||
fread(&m_SampleRate, sizeof(unsigned long), 1, fp);
|
||||
fread(&m_AvgBytesPerSec, sizeof(unsigned long), 1, fp);
|
||||
fread(&m_BytesPerSample, sizeof(short), 1, fp);
|
||||
fread(&m_BitsPerSample, sizeof(short), 1, fp);
|
||||
fread(&m_ChunkSize, 4*sizeof(char), 1, fp);
|
||||
fread(&m_FormatType, 2*sizeof(char), 1, fp);
|
||||
fread(&m_Channels, 2*sizeof(char), 1, fp);
|
||||
fread(&m_SampleRate, 4*sizeof(char), 1, fp);
|
||||
fread(&m_AvgBytesPerSec, 4*sizeof(char), 1, fp);
|
||||
fread(&m_BytesPerSample, 2*sizeof(char), 1, fp);
|
||||
fread(&m_BitsPerSample, 2*sizeof(char), 1, fp);
|
||||
|
||||
fread(m_Type, sizeof(char), 4, fp);
|
||||
if (m_Type[0] !='d' || m_Type[1] != 'a' || m_Type[2] != 't' || m_Type[3] != 'a') {
|
||||
@@ -54,10 +54,10 @@ ALuint dd::Sound::LoadFile(std::string path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
fread(&m_DataSize, sizeof(unsigned long), 1, fp);
|
||||
fread(&m_DataSize, 4*sizeof(char), 1, fp);
|
||||
|
||||
unsigned char* buf = new unsigned char[m_DataSize];
|
||||
fread(buf, sizeof(unsigned char), m_DataSize, fp);
|
||||
fread(buf, sizeof(char), m_DataSize, fp);
|
||||
fclose(fp);
|
||||
|
||||
// Create buffer
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
dd::Systems::SoundSystem::~SoundSystem()
|
||||
{
|
||||
alcCloseDevice(m_Device);
|
||||
}
|
||||
};
|
||||
|
||||
void dd::Systems::SoundSystem::Initialize()
|
||||
{
|
||||
@@ -19,24 +19,28 @@ void dd::Systems::SoundSystem::Initialize()
|
||||
else {
|
||||
LOG_ERROR("OpenAL failed to initialize.");
|
||||
}
|
||||
|
||||
alGetError();
|
||||
|
||||
//Probably unnecessary. vec3(0) probably default.
|
||||
const ALfloat pos[3] = {0, 0, 0};
|
||||
//alListenerfv(AL_POSITION, pos);
|
||||
|
||||
m_SFXMasterVolume = 1.f;
|
||||
m_BGMMasterVolume = 1.f;
|
||||
|
||||
//Subscribe to events
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EContact, &SoundSystem::OnContact);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EPlaySFX, &SoundSystem::OnPlaySound);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume);
|
||||
|
||||
|
||||
|
||||
//Todo: Move this
|
||||
{
|
||||
dd::Events::PlaySound e;
|
||||
e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav";
|
||||
e.IsAmbient = true;
|
||||
EventBroker->Publish(e);
|
||||
}
|
||||
{
|
||||
dd::Events::PlaySound e;
|
||||
e.FilePath = "Sounds/BGM/water-flowing.wav";
|
||||
e.Gain = 0.3f;
|
||||
e.IsAmbient = true;
|
||||
EventBroker->Publish(e);
|
||||
}
|
||||
}
|
||||
|
||||
void dd::Systems::SoundSystem::Update(double dt)
|
||||
@@ -44,7 +48,7 @@ void dd::Systems::SoundSystem::Update(double dt)
|
||||
//Clean up none-active sources
|
||||
//Only used for SFX's. BGM's are handled on stop sound.
|
||||
std::vector<ALuint> deleteList;
|
||||
for (auto item : m_SFXSourcesToBuffers) {
|
||||
for (auto& item : m_SFXSourcesToBuffers) {
|
||||
ALint sourceState;
|
||||
alGetSourcei(item.first, AL_SOURCE_STATE, &sourceState);
|
||||
if (sourceState == AL_STOPPED) {
|
||||
@@ -70,32 +74,32 @@ ALuint dd::Systems::SoundSystem::CreateSource()
|
||||
bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event)
|
||||
{
|
||||
//Loading and binding sound buffer to source
|
||||
Sound *sound = ResourceManager::Load<Sound>(event.path);
|
||||
Sound *sound = ResourceManager::Load<Sound>(event.FilePath);
|
||||
if (sound == nullptr) {
|
||||
return false;
|
||||
}
|
||||
ALuint source = CreateSource();
|
||||
ALuint buffer = sound->Buffer();
|
||||
alSourcei(source, AL_BUFFER, buffer);
|
||||
sound->SetGain(event.Gain);
|
||||
|
||||
//Sound settings
|
||||
float relativeVolume = 1.f;
|
||||
if (event.isAmbient) {
|
||||
if (event.IsAmbient) {
|
||||
alSourcei(source, AL_LOOPING, AL_TRUE);
|
||||
relativeVolume = m_BGMMasterVolume;
|
||||
m_BGMSourcesToBuffers[source] = sound;
|
||||
|
||||
}
|
||||
else if (!event.isAmbient)
|
||||
else if (!event.IsAmbient)
|
||||
{
|
||||
m_SFXSourcesToBuffers[source] = sound;
|
||||
alSourcei(source, AL_LOOPING, AL_FALSE);
|
||||
relativeVolume = m_SFXMasterVolume;
|
||||
}
|
||||
|
||||
alSourcef(source, AL_GAIN, (event.volume * relativeVolume));
|
||||
alSourcef(source, AL_PITCH, event.pitch);
|
||||
|
||||
alSourcef(source, AL_GAIN, (sound->Gain() * relativeVolume));
|
||||
alSourcef(source, AL_PITCH, event.Pitch);
|
||||
|
||||
//Play
|
||||
alSourcePlay(source);
|
||||
@@ -104,53 +108,50 @@ bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event)
|
||||
|
||||
bool dd::Systems::SoundSystem::OnStopSound(const dd::Events::StopSound &event)
|
||||
{
|
||||
|
||||
//TODO: Delete sources for bgms
|
||||
ALuint itemToDelete;
|
||||
for (auto item : m_BGMSourcesToBuffers)
|
||||
ALuint itemToDeleted;
|
||||
for (auto& item : m_BGMSourcesToBuffers)
|
||||
{
|
||||
if (item.second->Path() == event.path) {
|
||||
itemToDelete = item.first;
|
||||
if (item.second->Path() == event.FilePath) {
|
||||
itemToDeleted = item.first;
|
||||
break;
|
||||
}
|
||||
}
|
||||
alSourceStop(itemToDelete);
|
||||
alDeleteSources(1, &itemToDelete);
|
||||
m_BGMSourcesToBuffers.erase(itemToDelete);
|
||||
alSourceStop(itemToDeleted);
|
||||
alDeleteSources(1, &itemToDeleted);
|
||||
m_BGMSourcesToBuffers.erase(itemToDeleted);
|
||||
|
||||
//Should not because SFX's should be very short.
|
||||
//Should not happen because SFX's should be very short.
|
||||
for (auto item : m_SFXSourcesToBuffers)
|
||||
{
|
||||
if (item.second->Path() == event.path) {
|
||||
if (item.second->Path() == event.FilePath) {
|
||||
alSourceStop(item.first);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool dd::Systems::SoundSystem::OnMasterVolume(const dd::Events::MasterVolume &event)
|
||||
{
|
||||
//TODO: Make the volume depend on the value given when stored.
|
||||
//TODO: .. now it ONLY uses the master volume
|
||||
if (event.isAmbient) {
|
||||
m_BGMMasterVolume = event.gain;
|
||||
for (auto item : m_BGMSourcesToBuffers)
|
||||
if (event.IsAmbient) {
|
||||
m_BGMMasterVolume = event.Gain;
|
||||
for (auto& item : m_BGMSourcesToBuffers)
|
||||
{
|
||||
alSourcef(item.first, AL_GAIN, event.gain);
|
||||
alSourcef(item.first, AL_GAIN, (item.second->Gain() * m_BGMMasterVolume));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (!event.isAmbient) {
|
||||
m_SFXMasterVolume = event.gain;
|
||||
for (auto item : m_SFXSourcesToBuffers)
|
||||
else if (!event.IsAmbient) {
|
||||
m_SFXMasterVolume = event.Gain;
|
||||
for (auto& item : m_SFXSourcesToBuffers)
|
||||
{
|
||||
alSourcef(item.first, AL_GAIN, event.gain);
|
||||
alSourcef(item.first, AL_GAIN, (item.second->Gain() * m_SFXMasterVolume));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//On contact: play the sound given in the CCOllisionSound.
|
||||
bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event)
|
||||
{
|
||||
//Check which entity has the collisionSound component.
|
||||
@@ -165,10 +166,11 @@ bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event)
|
||||
|
||||
//Send play-sound event
|
||||
dd::Events::PlaySound e;
|
||||
e.path = collisionSound->filePath;
|
||||
e.isAmbient = false;
|
||||
e.FilePath = collisionSound->FilePath;
|
||||
e.IsAmbient = false;
|
||||
EventBroker->Publish(e);
|
||||
//return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
project(tests)
|
||||
|
||||
find_package(PNG REQUIRED)
|
||||
find_package(Boost REQUIRED COMPONENTS chrono thread unit_test_framework)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_SOURCE_DIR}/include
|
||||
${PNG_INCLUDE_DIRS}
|
||||
${Boost_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(SOURCE_FILES
|
||||
main.cpp
|
||||
FileWatcherTest.cpp
|
||||
EventTest.cpp
|
||||
ComponentCopyTest.cpp
|
||||
EntityCloneTest.cpp
|
||||
|
||||
file(GLOB SOURCE_FILES
|
||||
"*.cpp"
|
||||
)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
@@ -40,7 +40,7 @@ struct EventFixture
|
||||
// Publish the event
|
||||
this->EventBroker->Publish(Before);
|
||||
// Clear to swap buffers
|
||||
this->EventBroker->Clear();
|
||||
this->EventBroker->Swap();
|
||||
// Process the event
|
||||
this->EventBroker->template Process<EventFixture>();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include "PrecompiledHeader.h"
|
||||
#include "Core/EventBroker.h"
|
||||
#include "GUI/Frame.h"
|
||||
|
||||
using namespace dd;
|
||||
|
||||
BOOST_AUTO_TEST_CASE(FrameTest)
|
||||
{
|
||||
EventBroker eb;
|
||||
|
||||
GUI::Frame baseFrame(&eb);
|
||||
baseFrame.X = 100;
|
||||
baseFrame.Y = 100;
|
||||
|
||||
// Create a frame with a relative position to baseFrame
|
||||
GUI::Frame f1(&baseFrame, "f1");
|
||||
f1.X = 50;
|
||||
f1.Y = 50;
|
||||
f1.Width = 50;
|
||||
f1.Height = 50;
|
||||
|
||||
BOOST_CHECK(f1.Left() == 150); BOOST_CHECK(baseFrame.X + f1.X == 150);
|
||||
BOOST_CHECK(f1.Top() == 150); BOOST_CHECK(baseFrame.Y + f1.Y == 150);
|
||||
BOOST_CHECK(f1.Right() == 200); BOOST_CHECK(baseFrame.X + f1.X + f1.Width == 200);
|
||||
BOOST_CHECK(f1.Bottom() == 200); BOOST_CHECK(baseFrame.Y + f1.Y + f1.Height == 200);
|
||||
|
||||
// Create a frame to the right of f1
|
||||
GUI::Frame f2(&baseFrame, "f2");
|
||||
f2.SetLeft(f1.Right());
|
||||
f2.SetTop(f1.Bottom());
|
||||
f2.Width = 50;
|
||||
f2.Height = 50;
|
||||
|
||||
BOOST_CHECK(f2.X == 100); BOOST_CHECK(f2.X == f1.X + f1.Width);
|
||||
BOOST_CHECK(f2.Left() == 200); BOOST_CHECK(f2.Left() == f1.Right());
|
||||
BOOST_CHECK(f2.Y == 100); BOOST_CHECK(f2.Y == f1.Y + f1.Height);
|
||||
BOOST_CHECK(f2.Top() == 150); BOOST_CHECK(f2.Top() == f1.Bottom());
|
||||
BOOST_CHECK(f2.Right() == 250); BOOST_CHECK(f2.Right() == f1.Right() + f2.Width);
|
||||
BOOST_CHECK(f2.Bottom() == 200); BOOST_CHECK(f2.Bottom() == f1.Bottom() + f2.Height);
|
||||
}
|
||||
Reference in New Issue
Block a user