From d3e430cb34ccd46451bd848634b7815a7d1a2f01 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 15:27:06 +0400 Subject: [PATCH 01/25] Noise not needed - F4 shows if shaders are compiled. --- src/libprojectM/Renderer/ShaderEngine.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libprojectM/Renderer/ShaderEngine.cpp b/src/libprojectM/Renderer/ShaderEngine.cpp index b5910ee436..05afded149 100644 --- a/src/libprojectM/Renderer/ShaderEngine.cpp +++ b/src/libprojectM/Renderer/ShaderEngine.cpp @@ -765,7 +765,9 @@ GLuint ShaderEngine::compilePresetShader(const PresentShaderType shaderType, Sha } if (ret != GL_FALSE) { +#ifdef DEBUG std::cerr << "Successful compilation of " << shaderTypeString << std::endl; +#endif } else { std::cerr << "Compilation error (step3) of " << shaderTypeString << std::endl; From d3962f4c288faf7667ea4621bef7f98dbb7fd442 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 15:29:10 +0400 Subject: [PATCH 02/25] Don't compile native presets by default in Visual Studio --- msvc/projectM.sln | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/msvc/projectM.sln b/msvc/projectM.sln index 81c7ad23c6..eeb43e1493 100644 --- a/msvc/projectM.sln +++ b/msvc/projectM.sln @@ -48,7 +48,6 @@ Global {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Debug|x64.ActiveCfg = Debug|x64 {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Debug|x64.Build.0 = Debug|x64 {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Release|x64.ActiveCfg = Release|x64 - {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Release|x64.Build.0 = Release|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Debug|x64.ActiveCfg = Debug|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Debug|x64.Build.0 = Debug|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Release|x64.ActiveCfg = Release|x64 @@ -62,27 +61,17 @@ Global {013DE011-EC24-3643-A8EE-F2609E7E4741}.Release|x64.ActiveCfg = Release|x64 {013DE011-EC24-3643-A8EE-F2609E7E4741}.Release|x64.Build.0 = Release|x64 {55A71B6A-5C7E-30D5-8210-302A8D2080DB}.Debug|x64.ActiveCfg = Debug|x64 - {55A71B6A-5C7E-30D5-8210-302A8D2080DB}.Debug|x64.Build.0 = Debug|x64 {55A71B6A-5C7E-30D5-8210-302A8D2080DB}.Release|x64.ActiveCfg = Release|x64 - {55A71B6A-5C7E-30D5-8210-302A8D2080DB}.Release|x64.Build.0 = Release|x64 {9260C46C-6BC9-396F-9310-6BAAD56A7801}.Debug|x64.ActiveCfg = Debug|x64 {9260C46C-6BC9-396F-9310-6BAAD56A7801}.Release|x64.ActiveCfg = Release|x64 {7A203034-A4D7-3A2B-9138-CB125F9B35E6}.Debug|x64.ActiveCfg = Debug|x64 - {7A203034-A4D7-3A2B-9138-CB125F9B35E6}.Debug|x64.Build.0 = Debug|x64 {7A203034-A4D7-3A2B-9138-CB125F9B35E6}.Release|x64.ActiveCfg = Release|x64 - {7A203034-A4D7-3A2B-9138-CB125F9B35E6}.Release|x64.Build.0 = Release|x64 {6E418BC8-5407-3A37-96BD-5201D47DE753}.Debug|x64.ActiveCfg = Debug|x64 - {6E418BC8-5407-3A37-96BD-5201D47DE753}.Debug|x64.Build.0 = Debug|x64 {6E418BC8-5407-3A37-96BD-5201D47DE753}.Release|x64.ActiveCfg = Release|x64 - {6E418BC8-5407-3A37-96BD-5201D47DE753}.Release|x64.Build.0 = Release|x64 {B7C4937F-A36D-3B6C-A8AC-CA99772AE5EC}.Debug|x64.ActiveCfg = Debug|x64 - {B7C4937F-A36D-3B6C-A8AC-CA99772AE5EC}.Debug|x64.Build.0 = Debug|x64 {B7C4937F-A36D-3B6C-A8AC-CA99772AE5EC}.Release|x64.ActiveCfg = Release|x64 - {B7C4937F-A36D-3B6C-A8AC-CA99772AE5EC}.Release|x64.Build.0 = Release|x64 {27DDCE71-E33B-3521-92B5-9918356D78A1}.Debug|x64.ActiveCfg = Debug|x64 - {27DDCE71-E33B-3521-92B5-9918356D78A1}.Debug|x64.Build.0 = Debug|x64 {27DDCE71-E33B-3521-92B5-9918356D78A1}.Release|x64.ActiveCfg = Release|x64 - {27DDCE71-E33B-3521-92B5-9918356D78A1}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From cce18bf252af0f285c5928ba081b919ab1d460c4 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 15:37:55 +0400 Subject: [PATCH 03/25] Debug / duplicate info --- src/libprojectM/PresetFactory.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libprojectM/PresetFactory.cpp b/src/libprojectM/PresetFactory.cpp index aa4fc98c0a..c7b2178d8e 100644 --- a/src/libprojectM/PresetFactory.cpp +++ b/src/libprojectM/PresetFactory.cpp @@ -16,7 +16,9 @@ std::string PresetFactory::protocol(const std::string & url, std::string & path) else { path = url.substr(pos + 3, url.length()); // std::cout << "[PresetFactory] path is " << path << std::endl; +#ifdef DEBUG std::cout << "[PresetFactory] url is " << url << std::endl; +#endif return url.substr(0, pos); } From 84b3b563ae7e099ac5ce0bebdb930483da6a9d5c Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 15:40:46 +0400 Subject: [PATCH 04/25] Missed a debug native preset. --- msvc/projectM.sln | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/msvc/projectM.sln b/msvc/projectM.sln index eeb43e1493..49adba1cb8 100644 --- a/msvc/projectM.sln +++ b/msvc/projectM.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.489 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30128.74 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MilkdropPresetFactory", "MilkdropPresetFactory.vcxproj", "{EF3369C9-E934-3F1E-996B-21518B57A809}" ProjectSection(ProjectDependencies) = postProject @@ -46,7 +46,6 @@ Global {EF3369C9-E934-3F1E-996B-21518B57A809}.Release|x64.ActiveCfg = Release|x64 {EF3369C9-E934-3F1E-996B-21518B57A809}.Release|x64.Build.0 = Release|x64 {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Debug|x64.ActiveCfg = Debug|x64 - {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Debug|x64.Build.0 = Debug|x64 {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Release|x64.ActiveCfg = Release|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Debug|x64.ActiveCfg = Debug|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Debug|x64.Build.0 = Debug|x64 From 9a9151b92bdd737bcc7f90f1b3d52b0b56bec066 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 16:29:15 +0400 Subject: [PATCH 05/25] Make texture errors more clear - we failed looking for multiple extensions. --- src/libprojectM/Renderer/ShaderEngine.cpp | 17 ++++++++++++++++- src/libprojectM/Renderer/TextureManager.hpp | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/libprojectM/Renderer/ShaderEngine.cpp b/src/libprojectM/Renderer/ShaderEngine.cpp index 05afded149..2691427d2b 100644 --- a/src/libprojectM/Renderer/ShaderEngine.cpp +++ b/src/libprojectM/Renderer/ShaderEngine.cpp @@ -590,7 +590,22 @@ GLuint ShaderEngine::compilePresetShader(const PresentShaderType shaderType, Sha if (texDesc.first == NULL) { - std::cerr << "Texture loading error for: " << sampler << std::endl; + std::string extensionList = ""; + // prepare a list of extensions we looked for, so it's more clear what a texture is in error logs. + if (textureManager->extensions.size() >= 1) { + extensionList = " ("; + for (size_t x = 0; x < textureManager->extensions.size(); x++) + { + if (x != (textureManager->extensions.size() - 1)) { + extensionList += textureManager->extensions[x] + ", "; + } + else { + extensionList += "or " + textureManager->extensions[x]; + } + } + extensionList += ")"; + } + std::cerr << "Texture loading error for: " << sampler << extensionList << std::endl; } else { diff --git a/src/libprojectM/Renderer/TextureManager.hpp b/src/libprojectM/Renderer/TextureManager.hpp index 10b68e6766..721ce7e152 100644 --- a/src/libprojectM/Renderer/TextureManager.hpp +++ b/src/libprojectM/Renderer/TextureManager.hpp @@ -20,13 +20,13 @@ class TextureManager void loadTextureDir(const std::string & dirname); TextureSamplerDesc loadTexture(const std::string name, const std::string imageUrl); void ExtractTextureSettings(const std::string qualifiedName, GLint &_wrap_mode, GLint &_filter_mode, std::string & name); - std::vector extensions; public: TextureManager(std::string _presetsURL, const int texsizeX, const int texsizeY, std::string datadir = ""); ~TextureManager(); + std::vector extensions; void Clear(); void Preload(); TextureSamplerDesc tryLoadingTexture(const std::string name); From d084c2ba5b69d1a4fb7ab125fb90ae15328d0f59 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 16:36:46 +0400 Subject: [PATCH 06/25] Move images from presets folder to textures folder --- msvc/projectMSDL.vcxproj | 1 + .../Image415.jpg | Bin .../M.tga | Bin .../Tux.tga | Bin .../cells.jpg | Bin .../clouds.jpg | Bin .../clouds2.jpg | Bin .../facade01.jpg | Bin .../headphones.tga | Bin .../heart.jpg | Bin .../kaite.jpg | Bin .../lichen.jpg | Bin .../manyfish.jpg | Bin .../onefish.jpg | Bin .../paper.jpg | Bin .../prayerwheel.jpg | Bin .../project.tga | Bin .../ruin.jpg | Bin .../seaweed.jpg | Bin .../sky.jpg | Bin .../smalltiled_colors3.jpg | Bin .../smalltiled_electric_nebula.jpg | Bin .../smalltiled_ensign_meat.jpg | Bin .../smalltiled_lizard_scales.jpg | Bin .../sunrise.jpg | Bin .../wrenches.jpg | Bin 26 files changed, 1 insertion(+) rename presets/{presets_tryptonaut => textures_tryptonaut}/Image415.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/M.tga (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/Tux.tga (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/cells.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/clouds.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/clouds2.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/facade01.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/headphones.tga (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/heart.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/kaite.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/lichen.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/manyfish.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/onefish.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/paper.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/prayerwheel.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/project.tga (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/ruin.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/seaweed.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/sky.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/smalltiled_colors3.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/smalltiled_electric_nebula.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/smalltiled_ensign_meat.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/smalltiled_lizard_scales.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/sunrise.jpg (100%) rename presets/{presets_tryptonaut => textures_tryptonaut}/wrenches.jpg (100%) diff --git a/msvc/projectMSDL.vcxproj b/msvc/projectMSDL.vcxproj index 4b38770bb7..39732b4e3a 100644 --- a/msvc/projectMSDL.vcxproj +++ b/msvc/projectMSDL.vcxproj @@ -205,6 +205,7 @@ + diff --git a/presets/presets_tryptonaut/Image415.jpg b/presets/textures_tryptonaut/Image415.jpg similarity index 100% rename from presets/presets_tryptonaut/Image415.jpg rename to presets/textures_tryptonaut/Image415.jpg diff --git a/presets/presets_tryptonaut/M.tga b/presets/textures_tryptonaut/M.tga similarity index 100% rename from presets/presets_tryptonaut/M.tga rename to presets/textures_tryptonaut/M.tga diff --git a/presets/presets_tryptonaut/Tux.tga b/presets/textures_tryptonaut/Tux.tga similarity index 100% rename from presets/presets_tryptonaut/Tux.tga rename to presets/textures_tryptonaut/Tux.tga diff --git a/presets/presets_tryptonaut/cells.jpg b/presets/textures_tryptonaut/cells.jpg similarity index 100% rename from presets/presets_tryptonaut/cells.jpg rename to presets/textures_tryptonaut/cells.jpg diff --git a/presets/presets_tryptonaut/clouds.jpg b/presets/textures_tryptonaut/clouds.jpg similarity index 100% rename from presets/presets_tryptonaut/clouds.jpg rename to presets/textures_tryptonaut/clouds.jpg diff --git a/presets/presets_tryptonaut/clouds2.jpg b/presets/textures_tryptonaut/clouds2.jpg similarity index 100% rename from presets/presets_tryptonaut/clouds2.jpg rename to presets/textures_tryptonaut/clouds2.jpg diff --git a/presets/presets_tryptonaut/facade01.jpg b/presets/textures_tryptonaut/facade01.jpg similarity index 100% rename from presets/presets_tryptonaut/facade01.jpg rename to presets/textures_tryptonaut/facade01.jpg diff --git a/presets/presets_tryptonaut/headphones.tga b/presets/textures_tryptonaut/headphones.tga similarity index 100% rename from presets/presets_tryptonaut/headphones.tga rename to presets/textures_tryptonaut/headphones.tga diff --git a/presets/presets_tryptonaut/heart.jpg b/presets/textures_tryptonaut/heart.jpg similarity index 100% rename from presets/presets_tryptonaut/heart.jpg rename to presets/textures_tryptonaut/heart.jpg diff --git a/presets/presets_tryptonaut/kaite.jpg b/presets/textures_tryptonaut/kaite.jpg similarity index 100% rename from presets/presets_tryptonaut/kaite.jpg rename to presets/textures_tryptonaut/kaite.jpg diff --git a/presets/presets_tryptonaut/lichen.jpg b/presets/textures_tryptonaut/lichen.jpg similarity index 100% rename from presets/presets_tryptonaut/lichen.jpg rename to presets/textures_tryptonaut/lichen.jpg diff --git a/presets/presets_tryptonaut/manyfish.jpg b/presets/textures_tryptonaut/manyfish.jpg similarity index 100% rename from presets/presets_tryptonaut/manyfish.jpg rename to presets/textures_tryptonaut/manyfish.jpg diff --git a/presets/presets_tryptonaut/onefish.jpg b/presets/textures_tryptonaut/onefish.jpg similarity index 100% rename from presets/presets_tryptonaut/onefish.jpg rename to presets/textures_tryptonaut/onefish.jpg diff --git a/presets/presets_tryptonaut/paper.jpg b/presets/textures_tryptonaut/paper.jpg similarity index 100% rename from presets/presets_tryptonaut/paper.jpg rename to presets/textures_tryptonaut/paper.jpg diff --git a/presets/presets_tryptonaut/prayerwheel.jpg b/presets/textures_tryptonaut/prayerwheel.jpg similarity index 100% rename from presets/presets_tryptonaut/prayerwheel.jpg rename to presets/textures_tryptonaut/prayerwheel.jpg diff --git a/presets/presets_tryptonaut/project.tga b/presets/textures_tryptonaut/project.tga similarity index 100% rename from presets/presets_tryptonaut/project.tga rename to presets/textures_tryptonaut/project.tga diff --git a/presets/presets_tryptonaut/ruin.jpg b/presets/textures_tryptonaut/ruin.jpg similarity index 100% rename from presets/presets_tryptonaut/ruin.jpg rename to presets/textures_tryptonaut/ruin.jpg diff --git a/presets/presets_tryptonaut/seaweed.jpg b/presets/textures_tryptonaut/seaweed.jpg similarity index 100% rename from presets/presets_tryptonaut/seaweed.jpg rename to presets/textures_tryptonaut/seaweed.jpg diff --git a/presets/presets_tryptonaut/sky.jpg b/presets/textures_tryptonaut/sky.jpg similarity index 100% rename from presets/presets_tryptonaut/sky.jpg rename to presets/textures_tryptonaut/sky.jpg diff --git a/presets/presets_tryptonaut/smalltiled_colors3.jpg b/presets/textures_tryptonaut/smalltiled_colors3.jpg similarity index 100% rename from presets/presets_tryptonaut/smalltiled_colors3.jpg rename to presets/textures_tryptonaut/smalltiled_colors3.jpg diff --git a/presets/presets_tryptonaut/smalltiled_electric_nebula.jpg b/presets/textures_tryptonaut/smalltiled_electric_nebula.jpg similarity index 100% rename from presets/presets_tryptonaut/smalltiled_electric_nebula.jpg rename to presets/textures_tryptonaut/smalltiled_electric_nebula.jpg diff --git a/presets/presets_tryptonaut/smalltiled_ensign_meat.jpg b/presets/textures_tryptonaut/smalltiled_ensign_meat.jpg similarity index 100% rename from presets/presets_tryptonaut/smalltiled_ensign_meat.jpg rename to presets/textures_tryptonaut/smalltiled_ensign_meat.jpg diff --git a/presets/presets_tryptonaut/smalltiled_lizard_scales.jpg b/presets/textures_tryptonaut/smalltiled_lizard_scales.jpg similarity index 100% rename from presets/presets_tryptonaut/smalltiled_lizard_scales.jpg rename to presets/textures_tryptonaut/smalltiled_lizard_scales.jpg diff --git a/presets/presets_tryptonaut/sunrise.jpg b/presets/textures_tryptonaut/sunrise.jpg similarity index 100% rename from presets/presets_tryptonaut/sunrise.jpg rename to presets/textures_tryptonaut/sunrise.jpg diff --git a/presets/presets_tryptonaut/wrenches.jpg b/presets/textures_tryptonaut/wrenches.jpg similarity index 100% rename from presets/presets_tryptonaut/wrenches.jpg rename to presets/textures_tryptonaut/wrenches.jpg From 9059e0907d5f0635c7752858b2ef31a867c66c59 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 16:50:05 +0400 Subject: [PATCH 07/25] Documented missing textures. --- presets/textures_tryptonaut/Missing Textures.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 presets/textures_tryptonaut/Missing Textures.txt diff --git a/presets/textures_tryptonaut/Missing Textures.txt b/presets/textures_tryptonaut/Missing Textures.txt new file mode 100644 index 0000000000..3f58a96347 --- /dev/null +++ b/presets/textures_tryptonaut/Missing Textures.txt @@ -0,0 +1,7 @@ +The following textures are missing from the tryptonaut preset pack. Please share them if you have them. +grad3 +pano_starsmap +pic +rose +shub1 +worms \ No newline at end of file From e250cacb68a455c0778e78360f0e17b1833d0ca2 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 16:58:27 +0400 Subject: [PATCH 08/25] Undo Visual Studio version bump. --- msvc/projectM.sln | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msvc/projectM.sln b/msvc/projectM.sln index 49adba1cb8..e8586d61d2 100644 --- a/msvc/projectM.sln +++ b/msvc/projectM.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30128.74 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.489 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MilkdropPresetFactory", "MilkdropPresetFactory.vcxproj", "{EF3369C9-E934-3F1E-996B-21518B57A809}" ProjectSection(ProjectDependencies) = postProject From 82522a7873fd1475372f9a8df4d7006edb5532ff Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 17:09:54 +0400 Subject: [PATCH 09/25] Renable NativePresetFactory (but the example native presets remain disabled) --- msvc/projectM.sln | 2 ++ 1 file changed, 2 insertions(+) diff --git a/msvc/projectM.sln b/msvc/projectM.sln index e8586d61d2..cf70e0a902 100644 --- a/msvc/projectM.sln +++ b/msvc/projectM.sln @@ -46,7 +46,9 @@ Global {EF3369C9-E934-3F1E-996B-21518B57A809}.Release|x64.ActiveCfg = Release|x64 {EF3369C9-E934-3F1E-996B-21518B57A809}.Release|x64.Build.0 = Release|x64 {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Debug|x64.ActiveCfg = Debug|x64 + {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Debug|x64.Build.0 = Debug|x64 {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Release|x64.ActiveCfg = Release|x64 + {E2D4CEE6-B8CB-32AC-8977-52A48C8DA4E1}.Release|x64.Build.0 = Release|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Debug|x64.ActiveCfg = Debug|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Debug|x64.Build.0 = Debug|x64 {07427FA1-1771-3A2D-9183-167A8345DEEB}.Release|x64.ActiveCfg = Release|x64 From de80a140b3d3ac208569fd07dac9e568756fc082 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 7 Jun 2020 20:21:58 +0400 Subject: [PATCH 10/25] Comment --- src/libprojectM/Renderer/TextureManager.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libprojectM/Renderer/TextureManager.hpp b/src/libprojectM/Renderer/TextureManager.hpp index 721ce7e152..17d0639555 100644 --- a/src/libprojectM/Renderer/TextureManager.hpp +++ b/src/libprojectM/Renderer/TextureManager.hpp @@ -26,6 +26,7 @@ class TextureManager std::string datadir = ""); ~TextureManager(); + // extensions are pushed into this vector when the texturemanager is initialized. This is public so when the shader engine fails at loading a texture, it can return a list of extensions it looked for. std::vector extensions; void Clear(); void Preload(); From 5fd5bbc8148af780382061241623009a63ccce7a Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Mon, 8 Jun 2020 15:33:38 +0400 Subject: [PATCH 11/25] Fixes / updates to audio device toggling. --- src/projectM-sdl/pmSDL.cpp | 77 +++++++++++++-------- src/projectM-sdl/pmSDL.hpp | 2 +- src/projectM-sdl/projectM_SDL_main.cpp | 95 ++++++++++++++------------ 3 files changed, 101 insertions(+), 73 deletions(-) diff --git a/src/projectM-sdl/pmSDL.cpp b/src/projectM-sdl/pmSDL.cpp index 379fc157d7..6b99ffa9b6 100644 --- a/src/projectM-sdl/pmSDL.cpp +++ b/src/projectM-sdl/pmSDL.cpp @@ -61,27 +61,44 @@ void projectMSDL::audioInputCallbackS16(void *userdata, unsigned char *stream, i app->pcm()->addPCM16(pcm16); } -SDL_AudioDeviceID projectMSDL::selectAudioInput(int _count) { - // TODO: implement some sort of UI allowing the user to select which audio input device they would like to use - - - // ask the user which capture device to use - // printf("Please select which audio input to use:\n"); - printf("Detected devices:\n"); - for (int i = 0; i < _count; i++) { - printf(" %i: 🎤%s\n", i, SDL_GetAudioDeviceName(i, true)); - } - - return 0; -} - int projectMSDL::toggleAudioInput() { - - CurAudioDevice++; - if (CurAudioDevice >= NumAudioDevices) + // trigger a toggle with CMD-I or CTRL-I + if (wasapi) { // we are currently on WASAPI, so we are going to revert to a microphone/line-in input. + if (this->openAudioInput()) + this->beginAudioCapture(); CurAudioDevice = 0; - selectedAudioDevice = CurAudioDevice; - initAudioInput(); + selectedAudioDevice = CurAudioDevice; + this->wasapi = false; // Track wasapi as off so projectMSDL will stop listening to WASAPI loopback in pmSDL_main. + } + else { + this->endAudioCapture(); // end current audio capture. + CurAudioDevice++; // iterate device index + if (CurAudioDevice >= NumAudioDevices) { // We reached outside the boundaries of available audio devices. + CurAudioDevice = 0; // Return to first audio device in the index. +#ifdef WASAPI_LOOPBACK + // If we are at the boundary and WASAPI is enabled then let's load WASAPI instead. + projectM::setToastMessage("Listening to loopback audio"); + SDL_Log("Opened audio capture loopback."); + this->wasapi = true; // Track wasapi as on so projectMSDL will listen to it. +#else + if (NumAudioDevices == 1) // If WASAPI_LOOPBACK was not enabled and there is only one audio device, it's pointless to toggle anything. + { + SDL_Log("There is only one audio capture device. There is nothing to toggle at this time."); + return 1; + } + // If WASAPI_LOOPBACK is not enabled and we have multiple input devices, return to device index 0 and let's listen to that device. + selectedAudioDevice = CurAudioDevice; + initAudioInput(); + this->beginAudioCapture(); +#endif + } + else { + // This is a normal scenario where we move forward in the audio device index. + selectedAudioDevice = CurAudioDevice; + initAudioInput(); + this->beginAudioCapture(); + } + } return 1; } @@ -113,7 +130,9 @@ int projectMSDL::initAudioInput() { std::string deviceToast = "Listening to "; deviceToast += SDL_GetAudioDeviceName(selectedAudioDevice, true); projectM::setToastMessage(deviceToast); +#ifdef DEBUG SDL_Log("Samples: %i, frequency: %i, channels: %i, format: %i", have.samples, have.freq, have.channels, have.format); +#endif audioChannelsCount = have.channels; audioSampleRate = have.freq; audioSampleCount = have.samples; @@ -125,8 +144,10 @@ int projectMSDL::initAudioInput() { int projectMSDL::openAudioInput() { // get audio driver name (static) +#ifdef DEBUG const char* driver_name = SDL_GetCurrentAudioDriver(); SDL_Log("Using audio driver: %s\n", driver_name); +#endif // get audio input device unsigned int i; @@ -137,21 +158,14 @@ int projectMSDL::openAudioInput() { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "No audio capture devices found"); SDL_Quit(); } +#ifdef DEBUG for (i = 0; i < NumAudioDevices; i++) { SDL_Log("Found audio capture device %d: %s", i, SDL_GetAudioDeviceName(i, true)); } +#endif - // device to open + // default selected Audio Device to 0. selectedAudioDevice = 0; - if (NumAudioDevices > 1) { - // need to choose which input device to use - selectedAudioDevice = selectAudioInput(CurAudioDevice); - if (selectedAudioDevice > NumAudioDevices) { - SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "No audio input device specified."); - SDL_Quit(); - } - } - initAudioInput(); return 1; @@ -164,6 +178,7 @@ void projectMSDL::beginAudioCapture() { void projectMSDL::endAudioCapture() { SDL_PauseAudioDevice(audioDeviceID, true); + SDL_CloseAudioDevice(audioDeviceID); } void projectMSDL::setHelpText(const std::string & helpText) { @@ -465,6 +480,10 @@ void projectMSDL::init(SDL_Window *window, SDL_GLContext *_glCtx, const bool _re glCtx = _glCtx; projectM_resetGL(width, height); +#ifdef WASAPI_LOOPBACK + wasapi = true; +#endif + // are we rendering to a texture? renderToTexture = _renderToTexture; if (renderToTexture) { diff --git a/src/projectM-sdl/pmSDL.hpp b/src/projectM-sdl/pmSDL.hpp index 5d25e2fbc6..e89cd80267 100644 --- a/src/projectM-sdl/pmSDL.hpp +++ b/src/projectM-sdl/pmSDL.hpp @@ -88,6 +88,7 @@ class projectMSDL : public projectM { bool done; + bool wasapi = false; // Used to track if wasapi is currently active. This bool will allow us to run a WASAPI app and still toggle to microphone inputs. projectMSDL(Settings settings, int flags); projectMSDL(std::string config_file, int flags); void init(SDL_Window *window, SDL_GLContext *glCtx, const bool renderToTexture = false); @@ -135,7 +136,6 @@ class projectMSDL : public projectM { static void audioInputCallbackS16(void *userdata, unsigned char *stream, int len); void keyHandler(SDL_Event *); - SDL_AudioDeviceID selectAudioInput(int _count); void renderTexture(); }; diff --git a/src/projectM-sdl/projectM_SDL_main.cpp b/src/projectM-sdl/projectM_SDL_main.cpp index b926bf86b1..2b527af371 100644 --- a/src/projectM-sdl/projectM_SDL_main.cpp +++ b/src/projectM-sdl/projectM_SDL_main.cpp @@ -234,7 +234,7 @@ srand((int)(time(NULL))); ERR(L"pAudioClient->Start error"); return hr; } - + bool bDone = false; bool bFirstPacket = true; UINT32 nPasses = 0; @@ -404,9 +404,16 @@ modKey = "CMD"; #endif #if !FAKE_AUDIO && !WASAPI_LOOPBACK - // get an audio input device - if (app->openAudioInput()) - app->beginAudioCapture(); + // get an audio input device + if (app->openAudioInput()) + app->beginAudioCapture(); +#endif + +#ifdef WASAPI_LOOPBACK + // Default to WASAPI loopback if it was enabled at compilation. + app->wasapi = true; + // Notify that loopback capture was started. + SDL_Log("Opened audio capture loopback."); #endif #if TEST_ALL_PRESETS @@ -448,49 +455,50 @@ modKey = "CMD"; app->addFakePCM(); #endif #ifdef WASAPI_LOOPBACK - // drain data while it is available - nPasses++; - UINT32 nNextPacketSize; - for ( - hr = pAudioCaptureClient->GetNextPacketSize(&nNextPacketSize); - SUCCEEDED(hr) && nNextPacketSize > 0; - hr = pAudioCaptureClient->GetNextPacketSize(&nNextPacketSize) - ) { - // get the captured data - BYTE *pData; - UINT32 nNumFramesToRead; - DWORD dwFlags; - - hr = pAudioCaptureClient->GetBuffer( - &pData, - &nNumFramesToRead, - &dwFlags, - NULL, - NULL - ); - if (FAILED(hr)) { - return hr; + if (app->wasapi) { + // drain data while it is available + nPasses++; + UINT32 nNextPacketSize; + for ( + hr = pAudioCaptureClient->GetNextPacketSize(&nNextPacketSize); + SUCCEEDED(hr) && nNextPacketSize > 0; + hr = pAudioCaptureClient->GetNextPacketSize(&nNextPacketSize) + ) { + // get the captured data + BYTE *pData; + UINT32 nNumFramesToRead; + DWORD dwFlags; + + hr = pAudioCaptureClient->GetBuffer( + &pData, + &nNumFramesToRead, + &dwFlags, + NULL, + NULL + ); + if (FAILED(hr)) { + return hr; + } + + LONG lBytesToWrite = nNumFramesToRead * nBlockAlign; + + /** Add the waveform data */ + app->pcm()->addPCMfloat((float *)pData, nNumFramesToRead); + + *pnFrames += nNumFramesToRead; + + hr = pAudioCaptureClient->ReleaseBuffer(nNumFramesToRead); + if (FAILED(hr)) { + return hr; + } + + bFirstPacket = false; } - LONG lBytesToWrite = nNumFramesToRead * nBlockAlign; - - /** Add the waveform data */ - app->pcm()->addPCMfloat((float *)pData, nNumFramesToRead); - - *pnFrames += nNumFramesToRead; - - hr = pAudioCaptureClient->ReleaseBuffer(nNumFramesToRead); if (FAILED(hr)) { return hr; } - - bFirstPacket = false; } - - if (FAILED(hr)) { - return hr; - } - #endif /** WASAPI_LOOPBACK */ #if UNLOCK_FPS @@ -512,8 +520,9 @@ modKey = "CMD"; } SDL_GL_DeleteContext(glCtx); -#if !FAKE_AUDIO && !WASAPI_LOOPBACK - app->endAudioCapture(); +#if !FAKE_AUDIO + if (!app->wasapi) // not currently using WASAPI, so we need to endAudioCapture. + app->endAudioCapture(); #endif delete app; From a0150138bc19ff4c00583e7532a1e6aae98e9c6f Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Fri, 12 Jun 2020 14:15:40 +0400 Subject: [PATCH 12/25] Stop crashing if there is no input microphone. Make fake audio dynamic so it can be enabled if there is no mic. --- src/projectM-sdl/pmSDL.cpp | 8 ++++++-- src/projectM-sdl/pmSDL.hpp | 1 + src/projectM-sdl/projectM_SDL_main.cpp | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/projectM-sdl/pmSDL.cpp b/src/projectM-sdl/pmSDL.cpp index 6b99ffa9b6..dd74337b19 100644 --- a/src/projectM-sdl/pmSDL.cpp +++ b/src/projectM-sdl/pmSDL.cpp @@ -79,6 +79,7 @@ int projectMSDL::toggleAudioInput() { // If we are at the boundary and WASAPI is enabled then let's load WASAPI instead. projectM::setToastMessage("Listening to loopback audio"); SDL_Log("Opened audio capture loopback."); + this->fake_audio = false; // disable fake_audio in case it was enabled. this->wasapi = true; // Track wasapi as on so projectMSDL will listen to it. #else if (NumAudioDevices == 1) // If WASAPI_LOOPBACK was not enabled and there is only one audio device, it's pointless to toggle anything. @@ -122,7 +123,7 @@ int projectMSDL::initAudioInput() { if (audioDeviceID == 0) { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Failed to open audio capture device: %s", SDL_GetError()); - SDL_Quit(); + return 0; } // read characteristics of opened capture device @@ -143,6 +144,7 @@ int projectMSDL::initAudioInput() { } int projectMSDL::openAudioInput() { + fake_audio = false; // if we are opening an audio input then there is no need for fake audio. // get audio driver name (static) #ifdef DEBUG const char* driver_name = SDL_GetCurrentAudioDriver(); @@ -156,7 +158,9 @@ int projectMSDL::openAudioInput() { CurAudioDevice = 0; if (NumAudioDevices == 0) { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "No audio capture devices found"); - SDL_Quit(); + projectM::setToastMessage("No audio capture devices found: using simulated audio"); + fake_audio = true; + return 0; } #ifdef DEBUG for (i = 0; i < NumAudioDevices; i++) { diff --git a/src/projectM-sdl/pmSDL.hpp b/src/projectM-sdl/pmSDL.hpp index e89cd80267..e16f482089 100644 --- a/src/projectM-sdl/pmSDL.hpp +++ b/src/projectM-sdl/pmSDL.hpp @@ -89,6 +89,7 @@ class projectMSDL : public projectM { bool done; bool wasapi = false; // Used to track if wasapi is currently active. This bool will allow us to run a WASAPI app and still toggle to microphone inputs. + bool fake_audio = false; // Used to track fake audio, so we can turn it off and on. projectMSDL(Settings settings, int flags); projectMSDL(std::string config_file, int flags); void init(SDL_Window *window, SDL_GLContext *glCtx, const bool renderToTexture = false); diff --git a/src/projectM-sdl/projectM_SDL_main.cpp b/src/projectM-sdl/projectM_SDL_main.cpp index 2b527af371..2940a585f9 100644 --- a/src/projectM-sdl/projectM_SDL_main.cpp +++ b/src/projectM-sdl/projectM_SDL_main.cpp @@ -452,8 +452,14 @@ modKey = "CMD"; while (! app->done) { app->renderFrame(); #if FAKE_AUDIO - app->addFakePCM(); + app->fake_audio = true; #endif + // fake_audio can also be enabled. + if (app->fake_audio) + { + printf("fake\n"); + app->addFakePCM(); + } #ifdef WASAPI_LOOPBACK if (app->wasapi) { // drain data while it is available From 63b3245b915b4147c076c634197232e80e44355b Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Fri, 12 Jun 2020 14:17:20 +0400 Subject: [PATCH 13/25] Remove debug output. --- src/projectM-sdl/projectM_SDL_main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/projectM-sdl/projectM_SDL_main.cpp b/src/projectM-sdl/projectM_SDL_main.cpp index 2940a585f9..c19bed06c6 100644 --- a/src/projectM-sdl/projectM_SDL_main.cpp +++ b/src/projectM-sdl/projectM_SDL_main.cpp @@ -454,10 +454,9 @@ modKey = "CMD"; #if FAKE_AUDIO app->fake_audio = true; #endif - // fake_audio can also be enabled. + // fake_audio can also be enabled dynamically. if (app->fake_audio) { - printf("fake\n"); app->addFakePCM(); } #ifdef WASAPI_LOOPBACK From decdeb514f2cc8a451aa938eed5d8f6287a2af98 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Fri, 12 Jun 2020 14:43:56 +0400 Subject: [PATCH 14/25] Document VC++ redist requirement. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a3f668c16b..07e073784f 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Its purpose in life is to read an audio input and to produce mesmerizing visuals ### Available For * [macOS, Linux (binary)](https://github.com/projectM-visualizer/projectm/releases) * [Windows Store (PC, XBOX, Phone)](https://www.microsoft.com/store/apps/9NDCVH0VCWJN) +* [Windows (standalone binary)](https://github.com/projectM-visualizer/projectm/releases) (Requires the latest [Visual C++ redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)) * [Android](https://play.google.com/store/apps/details?id=com.psperl.projectM) * [iOS](https://itunes.apple.com/us/app/projectm-music-visualizer/id530922227?mt=8&ign-mpt=uo%3D4) * [iTunes plugin (macOS)](https://github.com/projectM-visualizer/projectm/releases/) From 0574c677ccbdc010d81e185bda6d467f607ceae2 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Fri, 26 Jun 2020 18:06:45 +0400 Subject: [PATCH 15/25] F4 missing from SDL help menu. --- src/projectM-sdl/projectM_SDL_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/projectM-sdl/projectM_SDL_main.cpp b/src/projectM-sdl/projectM_SDL_main.cpp index c19bed06c6..fca081f70b 100644 --- a/src/projectM-sdl/projectM_SDL_main.cpp +++ b/src/projectM-sdl/projectM_SDL_main.cpp @@ -376,6 +376,7 @@ modKey = "CMD"; std::string sdlHelpMenu = "\n" "F1: This help menu""\n" "F3: Show preset name""\n" + "F4: Show details and statistics""\n" "F5: Show FPS""\n" "L or SPACE: Lock/Unlock Preset""\n" "R: Random preset""\n" From c870da3c7e8f67f00cc09ec0486c37dcfda23744 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sat, 4 Jul 2020 20:38:04 +0400 Subject: [PATCH 16/25] Windows app instead of Console (no more cmd.exe pop-up when launching). --- msvc/projectMSDL.vcxproj | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/msvc/projectMSDL.vcxproj b/msvc/projectMSDL.vcxproj index 39732b4e3a..ae65629cf0 100644 --- a/msvc/projectMSDL.vcxproj +++ b/msvc/projectMSDL.vcxproj @@ -89,7 +89,7 @@ %(IgnoreSpecificDefaultLibraries) projectM-sdl/Debug/projectMSDL.lib projectM-sdl/Debug/projectMSDL.pdb - Console + Windows false @@ -133,7 +133,7 @@ %(IgnoreSpecificDefaultLibraries) projectM-sdl/Release/projectMSDL.lib projectM-sdl/Release/projectMSDL.pdb - Console + Windows false @@ -176,7 +176,7 @@ - + true @@ -211,6 +211,7 @@ + From b1936e76ab11d80d88da8baf90b4c9cb8ef2c386 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sat, 4 Jul 2020 20:39:21 +0400 Subject: [PATCH 17/25] Fullscreen for built-in settings. --- src/projectM-sdl/projectM_SDL_main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/projectM-sdl/projectM_SDL_main.cpp b/src/projectM-sdl/projectM_SDL_main.cpp index fca081f70b..8022c15773 100644 --- a/src/projectM-sdl/projectM_SDL_main.cpp +++ b/src/projectM-sdl/projectM_SDL_main.cpp @@ -394,6 +394,10 @@ modKey = "CMD"; app->init(win, &glCtx); + // if using built in settings then default to full screen. + if (configFilePath.empty()) + app->toggleFullScreen(); + #if STEREOSCOPIC_SBS app->toggleFullScreen(); #endif From c187a77f7f9ba3091a31b31856ebcdc02e594671 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sat, 4 Jul 2020 20:44:16 +0400 Subject: [PATCH 18/25] New icon (based on github and idle preset and consistent with Steam) --- msvc/projectM.ico | Bin 0 -> 100456 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 msvc/projectM.ico diff --git a/msvc/projectM.ico b/msvc/projectM.ico new file mode 100644 index 0000000000000000000000000000000000000000..2f7fe139933d1d5e607c27052284d0b4a6013b0d GIT binary patch literal 100456 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 JPDHLkV1jf$n3ezl literal 0 HcmV?d00001 From f7796577aad7d37106419af5725d06585ee10ac2 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sat, 4 Jul 2020 21:00:32 +0400 Subject: [PATCH 19/25] Change language for loopback / audio changing. --- src/projectM-sdl/pmSDL.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/projectM-sdl/pmSDL.cpp b/src/projectM-sdl/pmSDL.cpp index dd74337b19..5d3c997d8d 100644 --- a/src/projectM-sdl/pmSDL.cpp +++ b/src/projectM-sdl/pmSDL.cpp @@ -77,8 +77,8 @@ int projectMSDL::toggleAudioInput() { CurAudioDevice = 0; // Return to first audio device in the index. #ifdef WASAPI_LOOPBACK // If we are at the boundary and WASAPI is enabled then let's load WASAPI instead. - projectM::setToastMessage("Listening to loopback audio"); - SDL_Log("Opened audio capture loopback."); + projectM::setToastMessage("Loopback audio selected"); + SDL_Log("Loopback audio selected"); this->fake_audio = false; // disable fake_audio in case it was enabled. this->wasapi = true; // Track wasapi as on so projectMSDL will listen to it. #else @@ -128,8 +128,8 @@ int projectMSDL::initAudioInput() { // read characteristics of opened capture device SDL_Log("Opened audio capture device index=%i devId=%i: %s", selectedAudioDevice, audioDeviceID, SDL_GetAudioDeviceName(selectedAudioDevice, true)); - std::string deviceToast = "Listening to "; - deviceToast += SDL_GetAudioDeviceName(selectedAudioDevice, true); + std::string deviceToast = SDL_GetAudioDeviceName(selectedAudioDevice, true); // Example: Microphone rear + deviceToast += " selected"; projectM::setToastMessage(deviceToast); #ifdef DEBUG SDL_Log("Samples: %i, frequency: %i, channels: %i, format: %i", have.samples, have.freq, have.channels, have.format); From ea895841745abc0bc159b141ceb9012479f20676 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sat, 4 Jul 2020 21:59:46 +0400 Subject: [PATCH 20/25] default fullscreen for built-in settings. --- src/projectM-sdl/pmSDL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/projectM-sdl/pmSDL.cpp b/src/projectM-sdl/pmSDL.cpp index 5d3c997d8d..77aa433e8d 100644 --- a/src/projectM-sdl/pmSDL.cpp +++ b/src/projectM-sdl/pmSDL.cpp @@ -469,7 +469,7 @@ projectMSDL::projectMSDL(Settings settings, int flags) : projectM(settings, flag width = getWindowWidth(); height = getWindowHeight(); done = 0; - isFullScreen = false; + isFullScreen = true; // default fullscreen for built-in settings. } projectMSDL::projectMSDL(std::string config_file, int flags) : projectM(config_file, flags) { From 8860432736e28937fab156187b504020803e61f6 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 26 Jul 2020 21:31:03 +0400 Subject: [PATCH 21/25] Revert "Fullscreen for built-in settings." This reverts commit b1936e76ab11d80d88da8baf90b4c9cb8ef2c386. --- src/projectM-sdl/projectM_SDL_main.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/projectM-sdl/projectM_SDL_main.cpp b/src/projectM-sdl/projectM_SDL_main.cpp index 8022c15773..fca081f70b 100644 --- a/src/projectM-sdl/projectM_SDL_main.cpp +++ b/src/projectM-sdl/projectM_SDL_main.cpp @@ -394,10 +394,6 @@ modKey = "CMD"; app->init(win, &glCtx); - // if using built in settings then default to full screen. - if (configFilePath.empty()) - app->toggleFullScreen(); - #if STEREOSCOPIC_SBS app->toggleFullScreen(); #endif From c4d4ec92b11b6716bb52b0f1d8c579146096f84d Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 26 Jul 2020 21:32:08 +0400 Subject: [PATCH 22/25] Revert "default fullscreen for built-in settings." This reverts commit ea895841745abc0bc159b141ceb9012479f20676. --- src/projectM-sdl/pmSDL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/projectM-sdl/pmSDL.cpp b/src/projectM-sdl/pmSDL.cpp index 77aa433e8d..5d3c997d8d 100644 --- a/src/projectM-sdl/pmSDL.cpp +++ b/src/projectM-sdl/pmSDL.cpp @@ -469,7 +469,7 @@ projectMSDL::projectMSDL(Settings settings, int flags) : projectM(settings, flag width = getWindowWidth(); height = getWindowHeight(); done = 0; - isFullScreen = true; // default fullscreen for built-in settings. + isFullScreen = false; } projectMSDL::projectMSDL(std::string config_file, int flags) : projectM(config_file, flags) { From 8ba5d59a66a0280b8c39dc902cec9678728dd020 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 26 Jul 2020 21:44:55 +0400 Subject: [PATCH 23/25] Revert "9a9151b9" --- src/libprojectM/Renderer/ShaderEngine.cpp | 17 +---------------- src/libprojectM/Renderer/TextureManager.hpp | 3 +-- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/libprojectM/Renderer/ShaderEngine.cpp b/src/libprojectM/Renderer/ShaderEngine.cpp index 2691427d2b..05afded149 100644 --- a/src/libprojectM/Renderer/ShaderEngine.cpp +++ b/src/libprojectM/Renderer/ShaderEngine.cpp @@ -590,22 +590,7 @@ GLuint ShaderEngine::compilePresetShader(const PresentShaderType shaderType, Sha if (texDesc.first == NULL) { - std::string extensionList = ""; - // prepare a list of extensions we looked for, so it's more clear what a texture is in error logs. - if (textureManager->extensions.size() >= 1) { - extensionList = " ("; - for (size_t x = 0; x < textureManager->extensions.size(); x++) - { - if (x != (textureManager->extensions.size() - 1)) { - extensionList += textureManager->extensions[x] + ", "; - } - else { - extensionList += "or " + textureManager->extensions[x]; - } - } - extensionList += ")"; - } - std::cerr << "Texture loading error for: " << sampler << extensionList << std::endl; + std::cerr << "Texture loading error for: " << sampler << std::endl; } else { diff --git a/src/libprojectM/Renderer/TextureManager.hpp b/src/libprojectM/Renderer/TextureManager.hpp index 17d0639555..10b68e6766 100644 --- a/src/libprojectM/Renderer/TextureManager.hpp +++ b/src/libprojectM/Renderer/TextureManager.hpp @@ -20,14 +20,13 @@ class TextureManager void loadTextureDir(const std::string & dirname); TextureSamplerDesc loadTexture(const std::string name, const std::string imageUrl); void ExtractTextureSettings(const std::string qualifiedName, GLint &_wrap_mode, GLint &_filter_mode, std::string & name); + std::vector extensions; public: TextureManager(std::string _presetsURL, const int texsizeX, const int texsizeY, std::string datadir = ""); ~TextureManager(); - // extensions are pushed into this vector when the texturemanager is initialized. This is public so when the shader engine fails at loading a texture, it can return a list of extensions it looked for. - std::vector extensions; void Clear(); void Preload(); TextureSamplerDesc tryLoadingTexture(const std::string name); From 421dfb4b42419774c8f9d97f4086bbb9650040ae Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 26 Jul 2020 21:47:36 +0400 Subject: [PATCH 24/25] 9a9151b9 --- msvc/projectMSDL.vcxproj | 1 - .../Image415.jpg | Bin .../M.tga | Bin .../Tux.tga | Bin .../cells.jpg | Bin .../clouds.jpg | Bin .../clouds2.jpg | Bin .../facade01.jpg | Bin .../headphones.tga | Bin .../heart.jpg | Bin .../kaite.jpg | Bin .../lichen.jpg | Bin .../manyfish.jpg | Bin .../onefish.jpg | Bin .../paper.jpg | Bin .../prayerwheel.jpg | Bin .../project.tga | Bin .../ruin.jpg | Bin .../seaweed.jpg | Bin .../sky.jpg | Bin .../smalltiled_colors3.jpg | Bin .../smalltiled_electric_nebula.jpg | Bin .../smalltiled_ensign_meat.jpg | Bin .../smalltiled_lizard_scales.jpg | Bin .../sunrise.jpg | Bin .../wrenches.jpg | Bin presets/textures_tryptonaut/Missing Textures.txt | 7 ------- 27 files changed, 8 deletions(-) rename presets/{textures_tryptonaut => presets_tryptonaut}/Image415.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/M.tga (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/Tux.tga (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/cells.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/clouds.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/clouds2.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/facade01.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/headphones.tga (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/heart.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/kaite.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/lichen.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/manyfish.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/onefish.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/paper.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/prayerwheel.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/project.tga (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/ruin.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/seaweed.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/sky.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/smalltiled_colors3.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/smalltiled_electric_nebula.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/smalltiled_ensign_meat.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/smalltiled_lizard_scales.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/sunrise.jpg (100%) rename presets/{textures_tryptonaut => presets_tryptonaut}/wrenches.jpg (100%) delete mode 100644 presets/textures_tryptonaut/Missing Textures.txt diff --git a/msvc/projectMSDL.vcxproj b/msvc/projectMSDL.vcxproj index ae65629cf0..b5377f5a88 100644 --- a/msvc/projectMSDL.vcxproj +++ b/msvc/projectMSDL.vcxproj @@ -205,7 +205,6 @@ - diff --git a/presets/textures_tryptonaut/Image415.jpg b/presets/presets_tryptonaut/Image415.jpg similarity index 100% rename from presets/textures_tryptonaut/Image415.jpg rename to presets/presets_tryptonaut/Image415.jpg diff --git a/presets/textures_tryptonaut/M.tga b/presets/presets_tryptonaut/M.tga similarity index 100% rename from presets/textures_tryptonaut/M.tga rename to presets/presets_tryptonaut/M.tga diff --git a/presets/textures_tryptonaut/Tux.tga b/presets/presets_tryptonaut/Tux.tga similarity index 100% rename from presets/textures_tryptonaut/Tux.tga rename to presets/presets_tryptonaut/Tux.tga diff --git a/presets/textures_tryptonaut/cells.jpg b/presets/presets_tryptonaut/cells.jpg similarity index 100% rename from presets/textures_tryptonaut/cells.jpg rename to presets/presets_tryptonaut/cells.jpg diff --git a/presets/textures_tryptonaut/clouds.jpg b/presets/presets_tryptonaut/clouds.jpg similarity index 100% rename from presets/textures_tryptonaut/clouds.jpg rename to presets/presets_tryptonaut/clouds.jpg diff --git a/presets/textures_tryptonaut/clouds2.jpg b/presets/presets_tryptonaut/clouds2.jpg similarity index 100% rename from presets/textures_tryptonaut/clouds2.jpg rename to presets/presets_tryptonaut/clouds2.jpg diff --git a/presets/textures_tryptonaut/facade01.jpg b/presets/presets_tryptonaut/facade01.jpg similarity index 100% rename from presets/textures_tryptonaut/facade01.jpg rename to presets/presets_tryptonaut/facade01.jpg diff --git a/presets/textures_tryptonaut/headphones.tga b/presets/presets_tryptonaut/headphones.tga similarity index 100% rename from presets/textures_tryptonaut/headphones.tga rename to presets/presets_tryptonaut/headphones.tga diff --git a/presets/textures_tryptonaut/heart.jpg b/presets/presets_tryptonaut/heart.jpg similarity index 100% rename from presets/textures_tryptonaut/heart.jpg rename to presets/presets_tryptonaut/heart.jpg diff --git a/presets/textures_tryptonaut/kaite.jpg b/presets/presets_tryptonaut/kaite.jpg similarity index 100% rename from presets/textures_tryptonaut/kaite.jpg rename to presets/presets_tryptonaut/kaite.jpg diff --git a/presets/textures_tryptonaut/lichen.jpg b/presets/presets_tryptonaut/lichen.jpg similarity index 100% rename from presets/textures_tryptonaut/lichen.jpg rename to presets/presets_tryptonaut/lichen.jpg diff --git a/presets/textures_tryptonaut/manyfish.jpg b/presets/presets_tryptonaut/manyfish.jpg similarity index 100% rename from presets/textures_tryptonaut/manyfish.jpg rename to presets/presets_tryptonaut/manyfish.jpg diff --git a/presets/textures_tryptonaut/onefish.jpg b/presets/presets_tryptonaut/onefish.jpg similarity index 100% rename from presets/textures_tryptonaut/onefish.jpg rename to presets/presets_tryptonaut/onefish.jpg diff --git a/presets/textures_tryptonaut/paper.jpg b/presets/presets_tryptonaut/paper.jpg similarity index 100% rename from presets/textures_tryptonaut/paper.jpg rename to presets/presets_tryptonaut/paper.jpg diff --git a/presets/textures_tryptonaut/prayerwheel.jpg b/presets/presets_tryptonaut/prayerwheel.jpg similarity index 100% rename from presets/textures_tryptonaut/prayerwheel.jpg rename to presets/presets_tryptonaut/prayerwheel.jpg diff --git a/presets/textures_tryptonaut/project.tga b/presets/presets_tryptonaut/project.tga similarity index 100% rename from presets/textures_tryptonaut/project.tga rename to presets/presets_tryptonaut/project.tga diff --git a/presets/textures_tryptonaut/ruin.jpg b/presets/presets_tryptonaut/ruin.jpg similarity index 100% rename from presets/textures_tryptonaut/ruin.jpg rename to presets/presets_tryptonaut/ruin.jpg diff --git a/presets/textures_tryptonaut/seaweed.jpg b/presets/presets_tryptonaut/seaweed.jpg similarity index 100% rename from presets/textures_tryptonaut/seaweed.jpg rename to presets/presets_tryptonaut/seaweed.jpg diff --git a/presets/textures_tryptonaut/sky.jpg b/presets/presets_tryptonaut/sky.jpg similarity index 100% rename from presets/textures_tryptonaut/sky.jpg rename to presets/presets_tryptonaut/sky.jpg diff --git a/presets/textures_tryptonaut/smalltiled_colors3.jpg b/presets/presets_tryptonaut/smalltiled_colors3.jpg similarity index 100% rename from presets/textures_tryptonaut/smalltiled_colors3.jpg rename to presets/presets_tryptonaut/smalltiled_colors3.jpg diff --git a/presets/textures_tryptonaut/smalltiled_electric_nebula.jpg b/presets/presets_tryptonaut/smalltiled_electric_nebula.jpg similarity index 100% rename from presets/textures_tryptonaut/smalltiled_electric_nebula.jpg rename to presets/presets_tryptonaut/smalltiled_electric_nebula.jpg diff --git a/presets/textures_tryptonaut/smalltiled_ensign_meat.jpg b/presets/presets_tryptonaut/smalltiled_ensign_meat.jpg similarity index 100% rename from presets/textures_tryptonaut/smalltiled_ensign_meat.jpg rename to presets/presets_tryptonaut/smalltiled_ensign_meat.jpg diff --git a/presets/textures_tryptonaut/smalltiled_lizard_scales.jpg b/presets/presets_tryptonaut/smalltiled_lizard_scales.jpg similarity index 100% rename from presets/textures_tryptonaut/smalltiled_lizard_scales.jpg rename to presets/presets_tryptonaut/smalltiled_lizard_scales.jpg diff --git a/presets/textures_tryptonaut/sunrise.jpg b/presets/presets_tryptonaut/sunrise.jpg similarity index 100% rename from presets/textures_tryptonaut/sunrise.jpg rename to presets/presets_tryptonaut/sunrise.jpg diff --git a/presets/textures_tryptonaut/wrenches.jpg b/presets/presets_tryptonaut/wrenches.jpg similarity index 100% rename from presets/textures_tryptonaut/wrenches.jpg rename to presets/presets_tryptonaut/wrenches.jpg diff --git a/presets/textures_tryptonaut/Missing Textures.txt b/presets/textures_tryptonaut/Missing Textures.txt deleted file mode 100644 index 3f58a96347..0000000000 --- a/presets/textures_tryptonaut/Missing Textures.txt +++ /dev/null @@ -1,7 +0,0 @@ -The following textures are missing from the tryptonaut preset pack. Please share them if you have them. -grad3 -pano_starsmap -pic -rose -shub1 -worms \ No newline at end of file From b89e7612c89d2f28d4cf44bd568ce024fb401625 Mon Sep 17 00:00:00 2001 From: "milkdropper.com" Date: Sun, 26 Jul 2020 22:01:37 +0400 Subject: [PATCH 25/25] fake_audio to fakeAudio --- src/projectM-sdl/pmSDL.cpp | 6 +++--- src/projectM-sdl/pmSDL.hpp | 2 +- src/projectM-sdl/projectM_SDL_main.cpp | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/projectM-sdl/pmSDL.cpp b/src/projectM-sdl/pmSDL.cpp index 5d3c997d8d..98978d56ce 100644 --- a/src/projectM-sdl/pmSDL.cpp +++ b/src/projectM-sdl/pmSDL.cpp @@ -79,7 +79,7 @@ int projectMSDL::toggleAudioInput() { // If we are at the boundary and WASAPI is enabled then let's load WASAPI instead. projectM::setToastMessage("Loopback audio selected"); SDL_Log("Loopback audio selected"); - this->fake_audio = false; // disable fake_audio in case it was enabled. + this->fakeAudio = false; // disable fakeAudio in case it was enabled. this->wasapi = true; // Track wasapi as on so projectMSDL will listen to it. #else if (NumAudioDevices == 1) // If WASAPI_LOOPBACK was not enabled and there is only one audio device, it's pointless to toggle anything. @@ -144,7 +144,7 @@ int projectMSDL::initAudioInput() { } int projectMSDL::openAudioInput() { - fake_audio = false; // if we are opening an audio input then there is no need for fake audio. + fakeAudio = false; // if we are opening an audio input then there is no need for fake audio. // get audio driver name (static) #ifdef DEBUG const char* driver_name = SDL_GetCurrentAudioDriver(); @@ -159,7 +159,7 @@ int projectMSDL::openAudioInput() { if (NumAudioDevices == 0) { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "No audio capture devices found"); projectM::setToastMessage("No audio capture devices found: using simulated audio"); - fake_audio = true; + fakeAudio = true; return 0; } #ifdef DEBUG diff --git a/src/projectM-sdl/pmSDL.hpp b/src/projectM-sdl/pmSDL.hpp index e16f482089..531f33c137 100644 --- a/src/projectM-sdl/pmSDL.hpp +++ b/src/projectM-sdl/pmSDL.hpp @@ -89,7 +89,7 @@ class projectMSDL : public projectM { bool done; bool wasapi = false; // Used to track if wasapi is currently active. This bool will allow us to run a WASAPI app and still toggle to microphone inputs. - bool fake_audio = false; // Used to track fake audio, so we can turn it off and on. + bool fakeAudio = false; // Used to track fake audio, so we can turn it off and on. projectMSDL(Settings settings, int flags); projectMSDL(std::string config_file, int flags); void init(SDL_Window *window, SDL_GLContext *glCtx, const bool renderToTexture = false); diff --git a/src/projectM-sdl/projectM_SDL_main.cpp b/src/projectM-sdl/projectM_SDL_main.cpp index fca081f70b..876b3f884f 100644 --- a/src/projectM-sdl/projectM_SDL_main.cpp +++ b/src/projectM-sdl/projectM_SDL_main.cpp @@ -453,10 +453,10 @@ modKey = "CMD"; while (! app->done) { app->renderFrame(); #if FAKE_AUDIO - app->fake_audio = true; + app->fakeAudio = true; #endif - // fake_audio can also be enabled dynamically. - if (app->fake_audio) + // fakeAudio can also be enabled dynamically. + if (app->fakeAudio ) { app->addFakePCM(); }