diff --git a/commandLine/src/defines.h b/commandLine/src/defines.h index 58f1b251..53365ecc 100644 --- a/commandLine/src/defines.h +++ b/commandLine/src/defines.h @@ -1,5 +1,5 @@ #define OFPROJECTGENERATOR_MAJOR_VERSION "0" -#define OFPROJECTGENERATOR_MINOR_VERSION "106" +#define OFPROJECTGENERATOR_MINOR_VERSION "107" #define OFPROJECTGENERATOR_PATCH_VERSION "0" #define PG_VERSION (OFPROJECTGENERATOR_MAJOR_VERSION "." OFPROJECTGENERATOR_MINOR_VERSION "." OFPROJECTGENERATOR_PATCH_VERSION) diff --git a/commandLine/src/main.cpp b/commandLine/src/main.cpp index 7fc1ef1f..98cd6453 100644 --- a/commandLine/src/main.cpp +++ b/commandLine/src/main.cpp @@ -271,10 +271,7 @@ void updateProject(const fs::path & path, const string & target, bool bConsiderP project->addFramework(f, "Frameworks", true); } - // matches addAddonDefines()'s existing convention (single call, default RELEASE_LIB) - - // xcodeProject::addDefine ignores libType and applies to all build configs anyway, - // but visualStudioProject::addDefine doesn't, so a define here is Release-only for VS, - // consistent with how addon-provided defines already behave there + // all build configs (visualStudioProject overrides addProjectDefine for Debug + Release) for (auto & d : defines) { project->addProjectDefine(d); } diff --git a/commandLine/src/projects/baseProject.cpp b/commandLine/src/projects/baseProject.cpp index 2e20374a..fe606b7c 100644 --- a/commandLine/src/projects/baseProject.cpp +++ b/commandLine/src/projects/baseProject.cpp @@ -265,6 +265,7 @@ bool baseProject::save(){ vector lines = fileToStrings(projectDir / "config.make"); std::ofstream saveConfig(projectDir / "config.make"); + bool bWroteDefines = false; for (auto & str : lines) { //add the of root path @@ -282,10 +283,20 @@ bool baseProject::save(){ ofLog(OF_LOG_VERBOSE) << " adding PROJECT_EXTERNAL_SOURCE_PATHS to config" << extSrcPaths[d].generic_string() << std::endl; saveConfig << "PROJECT_EXTERNAL_SOURCE_PATHS" << (d == 0 ? " = " : " += ") << extSrcPaths[d].generic_string() << std::endl; } + } + // make builds (emscripten, linux, msys2) only see defines through config.make + else if( projectDefines.size() && (str.rfind("# PROJECT_DEFINES =", 0) == 0 || str.rfind("PROJECT_DEFINES =", 0) == 0) ){ + if (!bWroteDefines) { + saveConfig << "PROJECT_DEFINES = " << ofJoinString(projectDefines, " ") << std::endl; + bWroteDefines = true; + } } else { saveConfig << str << std::endl; } } + if (projectDefines.size() && !bWroteDefines && lines.size()) { + saveConfig << "PROJECT_DEFINES = " << ofJoinString(projectDefines, " ") << std::endl; + } #ifdef OFADDON_OUTPUT_JSON_DEBUG saveAddonsToJson(); #endif diff --git a/commandLine/src/projects/baseProject.h b/commandLine/src/projects/baseProject.h index f5f8e13a..b9433c54 100644 --- a/commandLine/src/projects/baseProject.h +++ b/commandLine/src/projects/baseProject.h @@ -101,7 +101,10 @@ class baseProject { // public entry point for project-level preprocessor defines (e.g. -D/--defines on the // CLI, or a GUI-driven renderer choice) - addDefine() itself stays protected since it's // also invoked internally by addAddonDefines() for addon-provided defines - void addProjectDefine(const std::string & define, LibType libType = RELEASE_LIB) { addDefine(define, libType); } + virtual void addProjectDefine(const std::string & define, LibType libType = RELEASE_LIB) { + addDefine(define, libType); + projectDefines.emplace_back(define); + } #ifdef OFADDON_OUTPUT_JSON_DEBUG @@ -172,6 +175,7 @@ class baseProject { std::vector addons; std::vector extSrcPaths; + std::vector projectDefines; // also written to config.make PROJECT_DEFINES for make builds //cached addons - if an addon is requested more than once, avoid loading from disk as it's quite slow std::map> addonsCache; //indexed by [platform][supplied path] diff --git a/commandLine/src/projects/visualStudioProject.h b/commandLine/src/projects/visualStudioProject.h index 408a641d..c417ccc8 100644 --- a/commandLine/src/projects/visualStudioProject.h +++ b/commandLine/src/projects/visualStudioProject.h @@ -18,6 +18,12 @@ class visualStudioProject : public baseProject { void addCFLAG(const std::string& cflag, LibType libType = RELEASE_LIB) override ; // C void addCPPFLAG(const std::string& cppflag, LibType libType = RELEASE_LIB) override ; // C++ void addDefine(const std::string& define, LibType libType = RELEASE_LIB) override ; + // project defines go to Debug and Release, same as addon defines + void addProjectDefine(const std::string & define, LibType libType = RELEASE_LIB) override { + addDefine(define, RELEASE_LIB); + addDefine(define, DEBUG_LIB); + projectDefines.emplace_back(define); + } void addLDFLAG(const std::string& ldflag, LibType libType = RELEASE_LIB) override {} void addAfterRule(const std::string& script) override {} diff --git a/frontend/app.js b/frontend/app.js index 9524528b..c0e9c479 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -327,7 +327,8 @@ ipcRenderer.on('setTemplates', (event, arg) => { allowAdditions: false, fullTextSearch: 'exact', match: "text", - maxSelections: 1 + maxSelections: 1, + onChange: () => updateRendererFieldVisibility() }); // // set the template to default @@ -990,6 +991,7 @@ function setup() { }); $('#rendererDropdown').dropdown(); + $('#glDropdown, #webglDropdown, #glesDropdown').dropdown(); $('#rendererDropdown').dropdown('set exactly', 'default'); // reflesh template dropdown list depends on selected platforms @@ -1198,6 +1200,19 @@ function generate() { if (rendererDefines[rendererChoice]) { definesArr.push(rendererDefines[rendererChoice]); } + const gl = $('#glDropdown').dropdown('get value'); + if ($('#glField').css('display') !== 'none' && gl !== 'default') { + const [major, minor] = gl.split('.'); + definesArr.push('OF_GL_VERSION_MAJOR=' + major, 'OF_GL_VERSION_MINOR=' + minor); + } + const webgl = $('#webglDropdown').dropdown('get value'); + if ($('#webglField').css('display') !== 'none' && webgl !== 'default') { + definesArr.push('OF_WEBGL_VERSION=' + webgl); + } + const gles = $('#glesDropdown').dropdown('get value'); + if ($('#glesField').css('display') !== 'none' && gles !== 'default') { + definesArr.push('OF_GLES_VERSION=' + gles); + } const gen = { projectName: $("#projectName").val(), @@ -1376,6 +1391,20 @@ function updateRendererFieldVisibility() { } else { $('#rendererField').hide(); } + const selectedTemplates = ($("#templatesDropdown input").val() || '').trim().split(','); + $('#webglField').toggle(!!defaultSettings.advancedMode && selectedTemplates.includes('emscripten')); + $('#glesField').toggle(!!defaultSettings.advancedMode && selectedPlatforms.some((p) => ['ios', 'macos'].includes(p))); + + const glPlatforms = ['osx', 'vs', 'msys2', 'linux', 'linux64', 'linuxarmv6l', 'linuxaarch64', 'vscode']; + $('#glField').toggle(!!defaultSettings.advancedMode && selectedPlatforms.some((p) => glPlatforms.includes(p))); + // Apple's OpenGL stops at 4.1 + const maxGL = selectedPlatforms.includes('osx') ? 4.1 : 4.6; + $('#glDropdown .item').each(function () { + const v = $(this).attr('data-value'); + $(this).toggle(v === 'default' || parseFloat(v) <= maxGL); + }); + const gl = $('#glDropdown').dropdown('get value'); + if (gl !== 'default' && parseFloat(gl) > maxGL) $('#glDropdown').dropdown('set selected', 'default'); } //---------------------------------------- diff --git a/frontend/index.html b/frontend/index.html index 5661fae8..60728eae 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -244,6 +244,54 @@ + + +