diff --git a/Game/Game.vcxproj b/Game/Game.vcxproj index 3b206e1..a7dab41 100644 --- a/Game/Game.vcxproj +++ b/Game/Game.vcxproj @@ -1,14 +1,6 @@ - - Debug - Win32 - - - Release - Win32 - Debug x64 @@ -26,19 +18,6 @@ 10.0 - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - Application true @@ -57,12 +36,6 @@ - - - - - - @@ -70,16 +43,6 @@ - - true - $(ProjectDir)bin\$(Platform)$(Configuration)\ - $(ProjectDir)int\$(Platform)$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)$(Configuration)\ - $(ProjectDir)int\$(Platform)$(Configuration)\ - true $(ProjectDir)bin\$(Platform)$(Configuration)\ @@ -90,51 +53,6 @@ $(ProjectDir)bin\$(Platform)$(Configuration)\ $(ProjectDir)int\$(Platform)$(Configuration)\ - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(ProjectDir)src\include\;$(SolutionDir)NothinFancy\src\include\ - $(IntDir)obj\ - - - Console - true - mainCRTStartup - libcmt.lib - /ignore:4099 %(AdditionalOptions) - - - cd "$(SolutionDir)NFPackCreator\AssetBuild" && "$(SolutionDir)NFPackCreator\bin\Win32$(Configuration)\NFPackCreator.exe" && del "$(OutDir)assets\" /Q /S && move "$(SolutionDir)NFPackCreator\AssetBuild\*.nfpack" "$(OutDir)assets\" - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(ProjectDir)src\include\;$(SolutionDir)NothinFancy\src\include\ - $(IntDir)obj\ - - - Windows - true - true - true - mainCRTStartup - libcmt.lib - /ignore:4099 %(AdditionalOptions) - true - - - cd "$(SolutionDir)NFPackCreator\AssetBuild" && "$(SolutionDir)NFPackCreator\bin\Win32$(Configuration)\NFPackCreator.exe" && del "$(OutDir)assets\" /Q /S && move "$(SolutionDir)NFPackCreator\AssetBuild\*.nfpack" "$(OutDir)assets\" - - Level3 @@ -152,7 +70,12 @@ /ignore:4099 %(AdditionalOptions) - cd "$(SolutionDir)NFPackCreator\AssetBuild" && "$(SolutionDir)NFPackCreator\bin\Win32$(Configuration)\NFPackCreator.exe" && del "$(OutDir)assets\" /Q /S && move "$(SolutionDir)NFPackCreator\AssetBuild\*.nfpack" "$(OutDir)assets\" + cd "$(SolutionDir)NFPackCreator\AssetBuild" +"$(SolutionDir)NFPackCreator\bin\x64$(Configuration)\NFPackCreator.exe" +if exist "$(OutDir)assets" (rmdir "$(OutDir)assets" /S /Q && goto end) else goto end +:end +mkdir "$(OutDir)assets" +move "*.nfpack" "$(OutDir)assets\" @@ -177,7 +100,12 @@ true - cd "$(SolutionDir)NFPackCreator\AssetBuild" && "$(SolutionDir)NFPackCreator\bin\Win32$(Configuration)\NFPackCreator.exe" && del "$(OutDir)assets\" /Q /S && move "$(SolutionDir)NFPackCreator\AssetBuild\*.nfpack" "$(OutDir)assets\" + cd "$(SolutionDir)NFPackCreator\AssetBuild" +"$(SolutionDir)NFPackCreator\bin\x64$(Configuration)\NFPackCreator.exe" +if exist "$(OutDir)assets" (rmdir "$(OutDir)assets" /S /Q && goto end) else goto end +:end +mkdir "$(OutDir)assets" +move "*.nfpack" "$(OutDir)assets\" @@ -207,5 +135,6 @@ <_delete Include="$(OutDir)**\*" /> + \ No newline at end of file diff --git a/Game/Game.vcxproj.user b/Game/Game.vcxproj.user index 9eb418d..2c303bf 100644 --- a/Game/Game.vcxproj.user +++ b/Game/Game.vcxproj.user @@ -3,14 +3,6 @@ true - - $(OutDir) - WindowsLocalDebugger - - - $(OutDir) - WindowsLocalDebugger - $(OutDir) WindowsLocalDebugger diff --git a/Game/src/MainState.cpp b/Game/src/MainState.cpp index 48ba288..79465b8 100644 --- a/Game/src/MainState.cpp +++ b/Game/src/MainState.cpp @@ -20,6 +20,7 @@ void MainState::onEnter() { cm.create(nf::BaseAssets::cubemap); sound.create(ap["sound.wav"]); + sound.setEntity(test); for (int x = 0; x < 10; x++) { for (int y = 0; y < 10; y++) { @@ -66,7 +67,7 @@ void MainState::update(double deltaTime) { if (button.isClicked()) app->changeState("Main State"); - if (button2.isClicked()) + if (app->isKeyPressed(NFI_SPACE)) sound.play(); if (app->isKeyPressed(NFI_ESCAPE)) diff --git a/NFPackCreator/NFPackCreator.vcxproj b/NFPackCreator/NFPackCreator.vcxproj index 1959143..539fe17 100644 --- a/NFPackCreator/NFPackCreator.vcxproj +++ b/NFPackCreator/NFPackCreator.vcxproj @@ -1,13 +1,13 @@ - + Debug - Win32 + x64 - + Release - Win32 + x64 @@ -18,13 +18,13 @@ 10.0 - + Application true v142 Unicode - + Application false v142 @@ -36,24 +36,24 @@ - + - + - + true $(ProjectDir)bin\$(Platform)$(Configuration)\ $(ProjectDir)int\$(Platform)$(Configuration)\ - + false $(ProjectDir)bin\$(Platform)$(Configuration)\ $(ProjectDir)int\$(Platform)$(Configuration)\ - + Level3 true @@ -66,7 +66,7 @@ true - + Level3 true diff --git a/NFPackCreator/NFPackCreator.vcxproj.user b/NFPackCreator/NFPackCreator.vcxproj.user index 67e52a5..d54cb99 100644 --- a/NFPackCreator/NFPackCreator.vcxproj.user +++ b/NFPackCreator/NFPackCreator.vcxproj.user @@ -3,11 +3,11 @@ true - + $(OutDir) WindowsLocalDebugger - + $(OutDir) WindowsLocalDebugger -h diff --git a/NFPackCreator/src/main.cpp b/NFPackCreator/src/main.cpp index 9f18b7f..f6e73c5 100644 --- a/NFPackCreator/src/main.cpp +++ b/NFPackCreator/src/main.cpp @@ -66,7 +66,7 @@ void writeFile(const std::string& filename, const std::string& in, bool encrypte void getNeededImages(std::string mtl, std::set& set) { while (mtl.size()) { - unsigned int pos = mtl.find("map_"); + size_t pos = mtl.find("map_"); if (pos == std::string::npos) break; if (pos == mtl.find("map_Kd") || pos == mtl.find("map_Ks")) @@ -76,7 +76,7 @@ void getNeededImages(std::string mtl, std::set& set) { std::stringstream ss(mtl); std::string temp; ss >> temp; - unsigned int pos2 = temp.find_last_of("/\\"); + size_t pos2 = temp.find_last_of("/\\"); if (pos2 != std::string::npos) temp = temp.substr(pos2 + 1); set.insert(temp); diff --git a/NothinFancy/NothinFancy.vcxproj b/NothinFancy/NothinFancy.vcxproj index e710a5e..badb094 100644 --- a/NothinFancy/NothinFancy.vcxproj +++ b/NothinFancy/NothinFancy.vcxproj @@ -1,14 +1,6 @@ - - Debug - Win32 - - - Release - Win32 - Debug x64 @@ -26,19 +18,6 @@ 10.0 - - StaticLibrary - true - v142 - Unicode - - - StaticLibrary - false - v142 - true - Unicode - StaticLibrary true @@ -57,12 +36,6 @@ - - - - - - @@ -70,16 +43,6 @@ - - true - $(ProjectDir)bin\$(Platform)$(Configuration)\ - $(ProjectDir)int\$(Platform)$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)$(Configuration)\ - $(ProjectDir)int\$(Platform)$(Configuration)\ - true $(ProjectDir)bin\$(Platform)$(Configuration)\ @@ -90,58 +53,6 @@ $(ProjectDir)bin\$(Platform)$(Configuration)\ $(ProjectDir)int\$(Platform)$(Configuration)\ - - - Level3 - true - NFENGINE; GLEW_STATIC;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(ProjectDir)src\include\;$(ProjectDir)dep\include\ - $(IntDir)obj\ - - - Console - true - - - glew32s.lib;opengl32.lib;freetype.lib;%(AdditionalDependencies) - - - $(ProjectDir)dep\lib\;%(AdditionalLibraryDirectories) - - - true - - - - - - Level3 - true - true - true - NFENGINE; GLEW_STATIC;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(ProjectDir)src\include\;$(ProjectDir)dep\include\ - $(IntDir)obj\ - - - Console - true - true - true - - - glew32s.lib;opengl32.lib;freetype.lib;%(AdditionalDependencies) - - - $(ProjectDir)dep\lib\;%(AdditionalLibraryDirectories) - - - true - - - Level3 @@ -156,10 +67,11 @@ true - glew32s.lib;opengl32.lib;freetype.lib;%(AdditionalDependencies) + glew32s.lib;opengl32.lib;freetype.lib;xaudio2.lib;%(AdditionalDependencies) - $(ProjectDir)dep\lib\;%(AdditionalLibraryDirectories) + $(ProjectDir)dep\lib;%(AdditionalLibraryDirectories) + /ignore:4006 %(AdditionalOptions) true @@ -184,10 +96,11 @@ true - glew32s.lib;opengl32.lib;freetype.lib;%(AdditionalDependencies) + glew32s.lib;opengl32.lib;freetype.lib;xaudio2.lib;%(AdditionalDependencies) - $(ProjectDir)dep\lib\;%(AdditionalLibraryDirectories) + $(ProjectDir)dep\lib;%(AdditionalLibraryDirectories) + /ignore:4006 %(AdditionalOptions) true diff --git a/NothinFancy/dep/lib/freetype.lib b/NothinFancy/dep/lib/freetype.lib index bbfaf4c..cdf3193 100644 Binary files a/NothinFancy/dep/lib/freetype.lib and b/NothinFancy/dep/lib/freetype.lib differ diff --git a/NothinFancy/dep/lib/glew32s.lib b/NothinFancy/dep/lib/glew32s.lib index 2e46b7b..584c462 100644 Binary files a/NothinFancy/dep/lib/glew32s.lib and b/NothinFancy/dep/lib/glew32s.lib differ diff --git a/NothinFancy/src/Application.cpp b/NothinFancy/src/Application.cpp index 8430e1a..f826064 100644 --- a/NothinFancy/src/Application.cpp +++ b/NothinFancy/src/Application.cpp @@ -312,8 +312,8 @@ namespace nf { } } } - m_currentState->onExit(); delete m_audio; + m_currentState->onExit(); m_currentState->cleanup(); delete m_renderer; } diff --git a/NothinFancy/src/Assets.cpp b/NothinFancy/src/Assets.cpp index 2174f17..90f5706 100644 --- a/NothinFancy/src/Assets.cpp +++ b/NothinFancy/src/Assets.cpp @@ -57,15 +57,15 @@ namespace nf { unsigned int cubemapCount = 0; unsigned int buttonCount = 0; while (packContents.size()) { - unsigned int startingPos = packContents.find_first_of("#NFASSET ") + 9; + size_t startingPos = packContents.find_first_of("#NFASSET ") + 9; packContents = packContents.substr(9); - unsigned int endAssetNamePos = packContents.find_first_of('\n'); + size_t endAssetNamePos = packContents.find_first_of('\n'); std::string assetName = packContents.substr(0, endAssetNamePos); packContents = packContents.substr(endAssetNamePos + 1); - unsigned int extensionPos = assetName.find_first_of('.'); + size_t extensionPos = assetName.find_first_of('.'); std::string extension = assetName.substr(extensionPos + 1); std::string assetContents; - unsigned int nextAssetPos = packContents.find("#NFASSET "); + size_t nextAssetPos = packContents.find("#NFASSET "); if (nextAssetPos != std::string::npos) { assetContents = packContents.substr(0, nextAssetPos - 1); packContents = packContents.substr(nextAssetPos); @@ -74,7 +74,7 @@ namespace nf { assetContents = packContents; packContents = ""; } - size_t assetSize = assetContents.size(); + unsigned int assetSize = (unsigned int)assetContents.size(); if (extension == "obj") continue; @@ -204,15 +204,15 @@ namespace nf { Error("Could not find full button set in pack \"" + (std::string)packName + (std::string)"\"!"); while (packContentsOBJ.size()) { - unsigned int startingPos = packContentsOBJ.find_first_of("#NFASSET ") + 9; + size_t startingPos = packContentsOBJ.find_first_of("#NFASSET ") + 9; packContentsOBJ = packContentsOBJ.substr(9); - unsigned int endAssetNamePos = packContentsOBJ.find_first_of('\n'); + size_t endAssetNamePos = packContentsOBJ.find_first_of('\n'); std::string assetName = packContentsOBJ.substr(0, endAssetNamePos); packContentsOBJ = packContentsOBJ.substr(endAssetNamePos + 1); - unsigned int extensionPos = assetName.find_first_of('.'); + size_t extensionPos = assetName.find_first_of('.'); std::string extension = assetName.substr(extensionPos + 1); std::string assetContents; - unsigned int nextAssetPos = packContentsOBJ.find("#NFASSET "); + size_t nextAssetPos = packContentsOBJ.find("#NFASSET "); if (nextAssetPos != std::string::npos) { assetContents = packContentsOBJ.substr(0, nextAssetPos - 1); packContentsOBJ = packContentsOBJ.substr(nextAssetPos); diff --git a/NothinFancy/src/AudioEngine.cpp b/NothinFancy/src/AudioEngine.cpp index 12bc307..5f27c80 100644 --- a/NothinFancy/src/AudioEngine.cpp +++ b/NothinFancy/src/AudioEngine.cpp @@ -15,6 +15,9 @@ namespace nf { debug.BreakMask = XAUDIO2_LOG_ERRORS; m_engine->SetDebugConfiguration(&debug, 0); m_engine->CreateMasteringVoice(&m_masterVoice); + DWORD channelMask; + m_masterVoice->GetChannelMask(&channelMask); + X3DAudioInitialize(channelMask, X3DAUDIO_SPEED_OF_SOUND, m_x3d); } void AudioEngine::updateSources() { @@ -33,11 +36,19 @@ namespace nf { IXAudio2SourceVoice* AudioEngine::getNewSourceVoice(WAVEFORMATEXTENSIBLE* fmt) { IXAudio2SourceVoice* s; - HRESULT hr = m_engine->CreateSourceVoice(&s, &fmt->Format); + HRESULT hr = m_engine->CreateSourceVoice(&s, &fmt->Format, XAUDIO2_VOICE_USEFILTER); m_voices.push_back(s); return s; } + IXAudio2MasteringVoice* AudioEngine::getMasterVoice() { + return m_masterVoice; + } + + X3DAUDIO_HANDLE* AudioEngine::getX3DAudioInstance() { + return &m_x3d; + } + void AudioEngine::cleanup() { for (unsigned int i = 0; i < m_voices.size(); i++) { m_voices[i]->Stop(); diff --git a/NothinFancy/src/NFObject/Entity.cpp b/NothinFancy/src/NFObject/Entity.cpp index 2d4c16c..c61cc7e 100644 --- a/NothinFancy/src/NFObject/Entity.cpp +++ b/NothinFancy/src/NFObject/Entity.cpp @@ -69,6 +69,10 @@ namespace nf { m_scale = scale; } + const Vec3& Entity::getPosition() { + return m_position; + } + void Entity::render(Shader* shader, bool onlyDepth) { shader->bind(); glm::mat4 model = getModelMatrix(); diff --git a/NothinFancy/src/NFObject/Sound.cpp b/NothinFancy/src/NFObject/Sound.cpp index 5f1c6d8..cfd7a42 100644 --- a/NothinFancy/src/NFObject/Sound.cpp +++ b/NothinFancy/src/NFObject/Sound.cpp @@ -2,6 +2,7 @@ #include "Application.h" #include "Assets.h" +#include "Entity.h" #include "Utility.h" namespace nf { @@ -9,9 +10,12 @@ namespace nf { m_constructed(false), m_dataSize(0), m_volume(1.0f), + m_usePos(false), m_format({ 0 }), m_buffer(nullptr), - m_currentVoice(nullptr) + m_currentVoice(nullptr), + m_targetEntity(nullptr), + m_soundPos(0.0) { } @@ -27,17 +31,21 @@ namespace nf { if (data.find("RIFF") == std::string::npos) Error("Sound asset not of correct format!"); unsigned int fileSize = *(unsigned int*)&data[4]; - unsigned int fmtPos; + size_t fmtPos; if ((fmtPos = data.find("fmt")) == std::string::npos) Error("Sound asset not of correct format!"); std::memcpy(&m_format, &data[fmtPos + 8], 16); - unsigned int dataPos; + size_t dataPos; if ((dataPos = data.find("data")) == std::string::npos) Error("Sound asset not of correct m_format!"); m_dataSize = *(unsigned int*)&data[dataPos + 4]; m_buffer = new unsigned char[m_dataSize]; std::memcpy(m_buffer, &data[dataPos + 8], m_dataSize); + m_emitter = { 0 }; + m_emitter.ChannelCount = 2; + m_emitter.CurveDistanceScaler = 1.0; + Application::getApp()->getCurrentState()->m_nfObjects.push_back(this); } @@ -45,6 +53,16 @@ namespace nf { m_volume = (float)volume; } + void Sound::setEntity(Entity& entity) { + m_targetEntity = &entity; + m_usePos = false; + } + + void Sound::setPosition(const Vec3& position) { + m_soundPos = position; + m_usePos = true; + } + void Sound::play(bool loop) { m_currentVoice = Application::getApp()->getAudioEngine()->getNewSourceVoice(&m_format); m_currentVoice->SetVolume(m_volume); @@ -54,6 +72,41 @@ namespace nf { xBuffer.AudioBytes = m_dataSize; if (loop) xBuffer.LoopCount = XAUDIO2_LOOP_INFINITE; + + if (m_usePos || m_targetEntity) { + if (m_usePos) + m_emitter.Position = X3DAUDIO_VECTOR((float)m_soundPos.x, (float)m_soundPos.y, (float)-m_soundPos.z); + else if (m_targetEntity) { + Vec3 temp = m_targetEntity->getPosition(); + m_emitter.Position = X3DAUDIO_VECTOR((float)temp.x, (float)temp.y, (float)-temp.z); + } + m_emitter.OrientFront = X3DAUDIO_VECTOR(0.0, 0.0, 1.0); + m_emitter.OrientTop = X3DAUDIO_VECTOR(0.0, 1.0, 0.0); + float az[2] = { 0 }; + m_emitter.pChannelAzimuths = az; + Vec3 temp = Application::getApp()->getCurrentState()->getCamera()->getPosition(); + m_listener.Position = X3DAUDIO_VECTOR((float)temp.x, (float)temp.y, (float)-temp.z); + temp = Application::getApp()->getCurrentState()->getCamera()->getRotation(); + m_listener.OrientFront = X3DAUDIO_VECTOR((float)temp.x, 0.0f, (float)-temp.z); + m_listener.OrientTop = X3DAUDIO_VECTOR(0.0, 1.0, 0.0); + X3DAUDIO_DSP_SETTINGS settings = { 0 }; + settings.SrcChannelCount = 2; + settings.DstChannelCount = 2; + float matrix[4] = { 0 }; + settings.pMatrixCoefficients = matrix; + + IXAudio2MasteringVoice* master = Application::getApp()->getAudioEngine()->getMasterVoice(); + X3DAUDIO_HANDLE* instance = Application::getApp()->getAudioEngine()->getX3DAudioInstance(); + X3DAudioCalculate(*instance, &m_listener, &m_emitter, X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT | X3DAUDIO_CALCULATE_REVERB, &settings); + float temp2 = settings.pMatrixCoefficients[1]; + settings.pMatrixCoefficients[1] = settings.pMatrixCoefficients[2]; + settings.pMatrixCoefficients[2] = temp2; + m_currentVoice->SetOutputMatrix(master, 2, 2, settings.pMatrixCoefficients); + m_currentVoice->SetFrequencyRatio(settings.DopplerFactor); + XAUDIO2_FILTER_PARAMETERS lpf = { LowPassFilter, 2.0f * std::sinf(X3DAUDIO_PI / 6.0f * settings.LPFDirectCoefficient), 1.0f }; + m_currentVoice->SetFilterParameters(&lpf); + } + m_currentVoice->SubmitSourceBuffer(&xBuffer); m_currentVoice->Start(); } diff --git a/NothinFancy/src/NFObject/Text.cpp b/NothinFancy/src/NFObject/Text.cpp index 2cd7bd0..bc34cff 100644 --- a/NothinFancy/src/NFObject/Text.cpp +++ b/NothinFancy/src/NFObject/Text.cpp @@ -36,7 +36,7 @@ namespace nf { if (FT_Init_FreeType(&ft)) Error("Could not initialize FreeType!"); FT_Face face; - if (FT_New_Memory_Face(ft, (const unsigned char*)newFont.data, newFont.size, 0, &face)) + if (FT_New_Memory_Face(ft, (const unsigned char*)newFont.data, (unsigned int)newFont.size, 0, &face)) Error("Could not load font!"); FT_Set_Pixel_Sizes(face, 0, 160); for (unsigned char c = 0; c < 128; c++) { diff --git a/NothinFancy/src/Renderer/GBuffer.cpp b/NothinFancy/src/Renderer/GBuffer.cpp index 98e6002..c813cf7 100644 --- a/NothinFancy/src/Renderer/GBuffer.cpp +++ b/NothinFancy/src/Renderer/GBuffer.cpp @@ -19,7 +19,7 @@ namespace nf { m_width = Application::getApp()->getConfig().width; m_height = Application::getApp()->getConfig().height; - glGenTextures(m_textures.size(), &m_textures[0]); + glGenTextures((unsigned int)m_textures.size(), &m_textures[0]); for (unsigned int i = 0; i < m_textures.size(); i++) { glBindTexture(GL_TEXTURE_2D, m_textures[i]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, m_width, m_height, 0, GL_RGB, GL_FLOAT, nullptr); @@ -28,7 +28,7 @@ namespace nf { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0); } unsigned int draw[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; - glDrawBuffers(m_textures.size(), draw); + glDrawBuffers((unsigned int)m_textures.size(), draw); glGenRenderbuffers(1, &m_depth); glBindRenderbuffer(GL_RENDERBUFFER, m_depth); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_width, m_height); @@ -38,8 +38,6 @@ namespace nf { } void GBuffer::render(std::vector& entites, Shader* shader) { - int prevFBO; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prevFBO); glBindFramebuffer(GL_FRAMEBUFFER, m_FBO); resize(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -51,9 +49,9 @@ namespace nf { for (auto& curr : m_modelsToDraw) { std::vector& mats = curr.second; std::string pos; - unsigned int modelsRemaining = mats.size(); + size_t modelsRemaining = mats.size(); while (modelsRemaining != 0) { - unsigned int modelCount; + size_t modelCount; if (modelsRemaining > 60) modelCount = 60; else @@ -63,7 +61,7 @@ namespace nf { pos = std::to_string(i) + "]"; shader->setUniform(m_modelString + pos, mats[i]); } - curr.first->render(shader, false, modelCount); + curr.first->render(shader, false, (unsigned int)modelCount); mats.erase(mats.begin(), mats.begin() + modelCount); } } @@ -72,7 +70,7 @@ namespace nf { //TODO: Blit depth buffer for transparent objects later - glBindFramebuffer(GL_FRAMEBUFFER, prevFBO); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } void GBuffer::bindTextures(Shader* shader) { diff --git a/NothinFancy/src/Renderer/IndexBuffer.cpp b/NothinFancy/src/Renderer/IndexBuffer.cpp index 9a277df..dbe759d 100644 --- a/NothinFancy/src/Renderer/IndexBuffer.cpp +++ b/NothinFancy/src/Renderer/IndexBuffer.cpp @@ -4,7 +4,7 @@ namespace nf { IndexBuffer::IndexBuffer(const void* data, size_t count) { - m_count = count; + m_count = (unsigned int)count; glGenBuffers(1, &m_id); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id); glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(unsigned int), data, GL_STATIC_DRAW); diff --git a/NothinFancy/src/Renderer/Model.cpp b/NothinFancy/src/Renderer/Model.cpp index 348207c..d260ed4 100644 --- a/NothinFancy/src/Renderer/Model.cpp +++ b/NothinFancy/src/Renderer/Model.cpp @@ -18,7 +18,7 @@ namespace nf { if (model->neededTextures.size() > 32) Error("Model exceedes 32 texture limit!"); std::string obj = model->data; - unsigned int startMtlPos = obj.find("newmtl"); + size_t startMtlPos = obj.find("newmtl"); if (startMtlPos == std::string::npos) Error("No materials found in model!"); std::string mtl = obj.substr(startMtlPos); @@ -81,7 +81,7 @@ namespace nf { sscanf_s(mtl.c_str(), "\nNs %f\n", &s); mats[currMat]->shininess = s; } - unsigned int pos = mtl.find(line) + strlen(line); + size_t pos = mtl.find(line) + strlen(line); mtl = mtl.substr(pos); } @@ -142,7 +142,7 @@ namespace nf { mats[usingMat]->vnIndices.push_back(vnIndex[2]); } - unsigned int pos = file.find(line) + strlen(line) + remove; + size_t pos = file.find(line) + strlen(line) + remove; file = file.substr(pos); } @@ -250,9 +250,9 @@ namespace nf { mats[curr]->outTan.push_back(mats[curr]->unindexedTan[(i * 3)]); mats[curr]->outTan.push_back(mats[curr]->unindexedTan[(i * 3 + 1)]); mats[curr]->outTan.push_back(mats[curr]->unindexedTan[(i * 3 + 2)]); - unsigned int index = (mats[curr]->outVB.size() / 3) - 1; - mats[curr]->outIB.push_back(index); - vertexMap[currVertex] = index; + size_t index = (mats[curr]->outVB.size() / 3) - 1; + mats[curr]->outIB.push_back((unsigned int)index); + vertexMap[currVertex] = (unsigned int)index; mats[curr]->ibCount++; } } @@ -277,14 +277,14 @@ namespace nf { norm = new Texture(normA, true); } m_materials.push_back(std::make_tuple(diff, spec, norm, (float)curr2.diffuseColor.x, (float)curr2.diffuseColor.y, (float)curr2.diffuseColor.z, curr2.shininess)); - unsigned int offset = vboPositions.size() / 3; + size_t offset = vboPositions.size() / 3; vboPositions.insert(vboPositions.end(), curr2.outVB.begin(), curr2.outVB.end()); vboTexCoords.insert(vboTexCoords.end(), curr2.outTC.begin(), curr2.outTC.end()); vboNormals.insert(vboNormals.end(), curr2.outVN.begin(), curr2.outVN.end()); vboTangents.insert(vboTangents.end(), curr2.outTan.begin(), curr2.outTan.end()); vboMaterialIndices.insert(vboMaterialIndices.end(), curr2.outVB.size() / 3, matCount); if (offset) - std::for_each(curr2.outIB.begin(), curr2.outIB.end(), [offset](unsigned int& out) { out += offset; }); + std::for_each(curr2.outIB.begin(), curr2.outIB.end(), [offset](unsigned int& out) { out += (unsigned int)offset; }); vboIndices.insert(vboIndices.end(), curr2.outIB.begin(), curr2.outIB.end()); delete m.second; matCount++; @@ -315,6 +315,9 @@ namespace nf { m_ib->bind(); if (!onlyDepth) bindMaterials(shader); +#ifdef _DEBUG + shader->validate(); +#endif glDrawElementsInstanced(GL_TRIANGLES, m_ib->getCount(), GL_UNSIGNED_INT, nullptr, count); } diff --git a/NothinFancy/src/Renderer/Renderer.cpp b/NothinFancy/src/Renderer/Renderer.cpp index bb1885f..d3a4ee2 100644 --- a/NothinFancy/src/Renderer/Renderer.cpp +++ b/NothinFancy/src/Renderer/Renderer.cpp @@ -24,6 +24,7 @@ namespace nf { m_shadowMapFBO(0), m_directionalDepthTexSize(0), m_pointDepthTexSize(0), + m_directionalShadowMap(0), m_cubemap(nullptr), m_fadeIn(false), m_fadeOut(false), @@ -86,7 +87,7 @@ namespace nf { if (!m_app->isCustomWindowIcon()) { ATexture& windowTex = *(ATexture*)m_baseAP["defaultwindowicon.png"]; int width, height, nChannels; - unsigned char* tex = stbi_load_from_memory((const unsigned char*)windowTex.data, windowTex.size, &width, &height, &nChannels, 0); + unsigned char* tex = stbi_load_from_memory((const unsigned char*)windowTex.data, (unsigned int)windowTex.size, &width, &height, &nChannels, 0); std::vector pixels(width * height * 4); for (unsigned int i = 0; i < pixels.size() / 4; i++) { pixels[i * 4 + 0] = tex[i * 4 + 2]; @@ -163,7 +164,7 @@ namespace nf { m_gBuffer->render(m_lGame, m_gBufferShader); //Light entities using the gBuffer - unsigned int lightsRemaining = m_lights.size(); + size_t lightsRemaining = m_lights.size(); if (!lightsRemaining) { m_quadVAO->bind(); m_quadIB->bind(); @@ -173,7 +174,7 @@ namespace nf { } unsigned int drawCount = 0; while (lightsRemaining > 0) { - unsigned int currLightsDrawn; + size_t currLightsDrawn; if (lightsRemaining > m_texSlots) currLightsDrawn = m_texSlots; else @@ -285,18 +286,21 @@ namespace nf { SwapBuffers(m_hdc); } - void Renderer::renderShadowMaps(unsigned int count) { + void Renderer::renderShadowMaps(size_t count) { float nearP = 0.1f, farP = 400.0f; glm::mat4 directionalLightProj = glm::ortho(-50.0f, 50.0f, -50.0f, 50.0f, nearP, farP); glm::mat4 pointLightProj = glm::perspective(glm::radians(90.0f), 1.0f, nearP, farP); glm::mat4 lightView; glm::mat4 lightSpaceMat; + bool directionalRendered = false; + unsigned int directionalSlot = 0; //TODO: Test this glBindFramebuffer(GL_FRAMEBUFFER, m_shadowMapFBO); for (unsigned int i = 0; i < count; i++) { Light::Type type = m_lights[i]->getType(); - unsigned int tex = type == Light::Type::DIRECTIONAL ? m_directionalShadowMaps[i] : m_pointShadowMaps[i]; + unsigned int tex = type == Light::Type::DIRECTIONAL ? m_directionalShadowMap : m_pointShadowMaps[i]; switch (type) { case Light::Type::DIRECTIONAL: { + std::string stringPos; glViewport(0, 0, m_directionalDepthTexSize, m_directionalDepthTexSize); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, tex, 0); glDrawBuffer(GL_NONE); @@ -307,7 +311,7 @@ namespace nf { lightView = glm::lookAt(lightPos, glm::vec3(0.0), glm::vec3(0.0, 1.0, 0.0)); lightSpaceMat = directionalLightProj * lightView; m_directionalShadowShader->setUniform("lightSpace", lightSpaceMat); - std::string stringPos = "lightSpaceMat["; + stringPos = "lightSpaceMat["; stringPos += std::to_string(i); stringPos += "]"; m_lightingShader->setUniform(stringPos, lightSpaceMat); @@ -320,6 +324,7 @@ namespace nf { glActiveTexture(GL_TEXTURE4 + i); glBindTexture(GL_TEXTURE_2D, tex); m_lightingShader->setUniform(stringPos, 4 + (int)i); + directionalRendered = true; break; } case Light::Type::POINT: { @@ -406,18 +411,8 @@ namespace nf { m_texSlots = 12; glGenFramebuffers(1, &m_shadowMapFBO); for (unsigned int i = 0; i < m_texSlots; i++) { - unsigned int directionalDepthMap, pointDepthMap; - glGenTextures(1, &directionalDepthMap); + unsigned int pointDepthMap; glGenTextures(1, &pointDepthMap); - glBindTexture(GL_TEXTURE_2D, directionalDepthMap); - glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT24, m_directionalDepthTexSize, m_directionalDepthTexSize); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - float borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f }; - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); - glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_CUBE_MAP, pointDepthMap); glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_DEPTH_COMPONENT24, m_pointDepthTexSize, m_pointDepthTexSize); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -426,10 +421,18 @@ namespace nf { glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_CUBE_MAP, 0); - m_directionalShadowMaps.push_back(directionalDepthMap); m_pointShadowMaps.push_back(pointDepthMap); } - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glGenTextures(1, &m_directionalShadowMap); + glBindTexture(GL_TEXTURE_2D, m_directionalShadowMap); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT24, m_directionalDepthTexSize, m_directionalDepthTexSize); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + float borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f }; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); + glBindTexture(GL_TEXTURE_2D, 0); } Renderer::~Renderer() { diff --git a/NothinFancy/src/Renderer/Shader.cpp b/NothinFancy/src/Renderer/Shader.cpp index 9c2e7b1..8512c59 100644 --- a/NothinFancy/src/Renderer/Shader.cpp +++ b/NothinFancy/src/Renderer/Shader.cpp @@ -53,15 +53,6 @@ namespace nf { glGetProgramInfoLog(m_id, length, &length, message); Error("OpenGL Error: " + (std::string)message); } - glValidateProgram(m_id); - glGetProgramiv(m_id, GL_VALIDATE_STATUS, &result); - if (result != GL_TRUE) { - int length; - glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &length); - char* message = new char[length]; - glGetProgramInfoLog(m_id, length, &length, message); - Error("OpenGL Error: " + (std::string)message); - } glDetachShader(m_id, vs); glDetachShader(m_id, fs); glDeleteShader(vs); @@ -72,6 +63,19 @@ namespace nf { } } + void Shader::validate() { + glValidateProgram(m_id); + int result; + glGetProgramiv(m_id, GL_VALIDATE_STATUS, &result); + if (result != GL_TRUE) { + int length; + glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &length); + char* message = new char[length]; + glGetProgramInfoLog(m_id, length, &length, message); + Error("OpenGL Error: " + (std::string)message); + } + } + void Shader::bind() { glUseProgram(m_id); } diff --git a/NothinFancy/src/Renderer/Texture.cpp b/NothinFancy/src/Renderer/Texture.cpp index 7a728ae..930e87f 100644 --- a/NothinFancy/src/Renderer/Texture.cpp +++ b/NothinFancy/src/Renderer/Texture.cpp @@ -16,7 +16,7 @@ namespace nf { { int nChannels; stbi_set_flip_vertically_on_load(true); - unsigned char* texture = stbi_load_from_memory((unsigned char*)tex->data, tex->size, &m_x, &m_y, &nChannels, 0); + unsigned char* texture = stbi_load_from_memory((unsigned char*)tex->data, (unsigned int)tex->size, &m_x, &m_y, &nChannels, 0); if (!texture) Error("Texture failed to load from memory!"); glGenTextures(1, &m_id); diff --git a/NothinFancy/src/Renderer/VertexArray.cpp b/NothinFancy/src/Renderer/VertexArray.cpp index d3081d3..a3fc77a 100644 --- a/NothinFancy/src/Renderer/VertexArray.cpp +++ b/NothinFancy/src/Renderer/VertexArray.cpp @@ -37,7 +37,7 @@ namespace nf { } void VertexArray::finishBufferLayout() { - unsigned int offset = 0; + size_t offset = 0; for (; m_attribute < m_lastBufferLayout.size(); m_attribute++) { const VertexBufferElement& curr = m_lastBufferLayout[m_attribute]; glEnableVertexAttribArray(m_attribute); diff --git a/NothinFancy/src/Utility.cpp b/NothinFancy/src/Utility.cpp index 78b1977..932a904 100644 --- a/NothinFancy/src/Utility.cpp +++ b/NothinFancy/src/Utility.cpp @@ -53,14 +53,14 @@ namespace nf { #endif const wchar_t* toWide(const char* in) { - int length = std::strlen(in) + 1; + unsigned int length = (unsigned int)std::strlen(in) + 1; wchar_t* out = new wchar_t[length]; MultiByteToWideChar(CP_ACP, NULL, in, -1, out, length); return out; } const wchar_t* toWide(const std::string& in) { const char* cstr = in.c_str(); - int length = std::strlen(cstr) + 1; + unsigned int length = (unsigned int)std::strlen(cstr) + 1; wchar_t* out = new wchar_t[length]; MultiByteToWideChar(CP_ACP, NULL, cstr, -1, out, length); return out; @@ -68,7 +68,7 @@ namespace nf { void writeFile(const std::string& filename, const std::string& in, bool encrypted) { if (filename.find('/') != std::string::npos || filename.find('\\') != std::string::npos) { - int pos = filename.find_last_of("/\\"); + size_t pos = filename.find_last_of("/\\"); std::string temp = filename.substr(0, pos); std::wstring folders(temp.begin(), temp.end()); WCHAR exe[MAX_PATH]; diff --git a/NothinFancy/src/include/Assets.h b/NothinFancy/src/include/Assets.h index b2fe885..6dce338 100644 --- a/NothinFancy/src/include/Assets.h +++ b/NothinFancy/src/include/Assets.h @@ -31,17 +31,17 @@ namespace nf { struct ACubemap : Asset { char* frontData = nullptr; - size_t frontSize = 0; + unsigned int frontSize = 0; char* backData = nullptr; - size_t backSize = 0; + unsigned int backSize = 0; char* topData = nullptr; - size_t topSize = 0; + unsigned int topSize = 0; char* bottomData = nullptr; - size_t bottomSize = 0; + unsigned int bottomSize = 0; char* leftData = nullptr; - size_t leftSize = 0; + unsigned int leftSize = 0; char* rightData = nullptr; - size_t rightSize = 0; + unsigned int rightSize = 0; unsigned int numImages = 0; diff --git a/NothinFancy/src/include/AudioEngine.h b/NothinFancy/src/include/AudioEngine.h index 5cf50bd..6eada2e 100644 --- a/NothinFancy/src/include/AudioEngine.h +++ b/NothinFancy/src/include/AudioEngine.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include namespace nf { class Application; @@ -11,12 +12,15 @@ namespace nf { void updateSources(); IXAudio2SourceVoice* getNewSourceVoice(WAVEFORMATEXTENSIBLE* fmt); + IXAudio2MasteringVoice* getMasterVoice(); + X3DAUDIO_HANDLE* getX3DAudioInstance(); void cleanup(); ~AudioEngine(); private: Application* m_app; IXAudio2* m_engine; + X3DAUDIO_HANDLE m_x3d; IXAudio2MasteringVoice* m_masterVoice; std::vector m_voices; }; diff --git a/NothinFancy/src/include/Entity.h b/NothinFancy/src/include/Entity.h index 81a62cd..2f5709b 100644 --- a/NothinFancy/src/include/Entity.h +++ b/NothinFancy/src/include/Entity.h @@ -25,6 +25,7 @@ namespace nf { void setScale(double x, double y, double z); void setScale(const Vec3& scale); + const Vec3& getPosition(); void render(Shader* shader, bool onlyDepth); Model* getModel() const; #ifdef NFENGINE diff --git a/NothinFancy/src/include/Renderer.h b/NothinFancy/src/include/Renderer.h index f106079..21c297c 100644 --- a/NothinFancy/src/include/Renderer.h +++ b/NothinFancy/src/include/Renderer.h @@ -33,7 +33,7 @@ namespace nf { ~Renderer(); private: - void renderShadowMaps(unsigned int count); + void renderShadowMaps(size_t count); void loadBaseAssets(); void createShadowMaps(); @@ -50,7 +50,7 @@ namespace nf { unsigned int m_shadowMapFBO; int m_directionalDepthTexSize; int m_pointDepthTexSize; - std::vector m_directionalShadowMaps; + unsigned int m_directionalShadowMap; std::vector m_pointShadowMaps; unsigned int m_texSlots; diff --git a/NothinFancy/src/include/Shader.h b/NothinFancy/src/include/Shader.h index b1d9de2..83c4974 100644 --- a/NothinFancy/src/include/Shader.h +++ b/NothinFancy/src/include/Shader.h @@ -8,6 +8,7 @@ namespace nf { public: Shader(const char* vertexSource, const char* fragmentSource, const char* geometrySource = nullptr); + void validate(); void bind(); void setUniform(const std::string& name, glm::mat4& data); void setUniform(const std::string& name, glm::vec3& data); diff --git a/NothinFancy/src/include/Sound.h b/NothinFancy/src/include/Sound.h index 41bb649..2463f68 100644 --- a/NothinFancy/src/include/Sound.h +++ b/NothinFancy/src/include/Sound.h @@ -1,10 +1,13 @@ #pragma once #include +#include #include "NFObject.h" +#include "Utility.h" namespace nf { struct Asset; + class Entity; class Sound : public NFObject { public: @@ -12,6 +15,8 @@ namespace nf { void create(Asset* soundAsset); void setVolume(double volume); + void setEntity(Entity& entity); + void setPosition(const Vec3& position); void play(bool loop = false); void stop(); @@ -21,8 +26,13 @@ namespace nf { bool m_constructed; unsigned int m_dataSize; float m_volume; + bool m_usePos; WAVEFORMATEXTENSIBLE m_format; unsigned char* m_buffer; IXAudio2SourceVoice* m_currentVoice; + Entity* m_targetEntity; + Vec3 m_soundPos; + X3DAUDIO_EMITTER m_emitter; + X3DAUDIO_LISTENER m_listener; }; } \ No newline at end of file diff --git a/STEMSln.sln b/STEMSln.sln index 035a62f..8d5b116 100644 --- a/STEMSln.sln +++ b/STEMSln.sln @@ -15,29 +15,21 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 Release|x64 = Release|x64 - Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Debug|x64.ActiveCfg = Debug|x64 - {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Debug|x86.ActiveCfg = Debug|Win32 - {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Debug|x86.Build.0 = Debug|Win32 + {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Debug|x64.Build.0 = Debug|x64 {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Release|x64.ActiveCfg = Release|x64 - {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Release|x86.ActiveCfg = Release|Win32 - {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Release|x86.Build.0 = Release|Win32 + {1B9C5361-E301-41BF-97E7-56D65F11E2BB}.Release|x64.Build.0 = Release|x64 {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Debug|x64.ActiveCfg = Debug|x64 - {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Debug|x86.ActiveCfg = Debug|Win32 - {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Debug|x86.Build.0 = Debug|Win32 + {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Debug|x64.Build.0 = Debug|x64 {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Release|x64.ActiveCfg = Release|x64 - {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Release|x86.ActiveCfg = Release|Win32 - {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Release|x86.Build.0 = Release|Win32 - {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Debug|x64.ActiveCfg = Debug|Win32 - {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Debug|x86.ActiveCfg = Debug|Win32 - {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Debug|x86.Build.0 = Debug|Win32 - {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Release|x64.ActiveCfg = Release|Win32 - {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Release|x86.ActiveCfg = Release|Win32 - {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Release|x86.Build.0 = Release|Win32 + {B7FEC2D6-1D8F-487E-89CB-FD611FD1AEB6}.Release|x64.Build.0 = Release|x64 + {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Debug|x64.ActiveCfg = Debug|x64 + {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Debug|x64.Build.0 = Debug|x64 + {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Release|x64.ActiveCfg = Release|x64 + {771B4AEE-E2C6-4745-AC40-1EF57149612E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE