2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-08 11:44:55 +00:00

Minor Blender 3.0 fixes, add ability to override blender in metaforce-gui

This commit is contained in:
2022-01-08 17:56:28 -08:00
parent 2f0febba27
commit 989c267dce
10 changed files with 467 additions and 337 deletions

View File

@@ -176,13 +176,13 @@ class SACTAction_load(bpy.types.Operator):
bpy.context.scene.render.frame_map_old = action_obj.hecl_fps
bpy.context.scene.render.frame_map_new = 60
bpy.context.scene.frame_start = 0
bpy.context.scene.frame_end = action_obj.frame_range[1] * (60 / action_obj.hecl_fps)
bpy.context.scene.frame_end = int(action_obj.frame_range[1] * (60 / action_obj.hecl_fps))
else:
bpy.context.scene.render.fps = action_obj.hecl_fps
bpy.context.scene.render.frame_map_old = action_obj.hecl_fps
bpy.context.scene.render.frame_map_new = action_obj.hecl_fps
bpy.context.scene.frame_start = 0
bpy.context.scene.frame_end = action_obj.frame_range[1]
bpy.context.scene.frame_end = int(action_obj.frame_range[1])
# Events
#SACTEvent.clear_action_events(self, context, actor_data)

View File

@@ -3,11 +3,10 @@
#include "hecl/hecl.hpp"
namespace hecl::blender {
constexpr uint32_t MinBlenderMajorSearch = 2;
constexpr uint32_t MaxBlenderMajorSearch = 2;
constexpr uint32_t MinBlenderMinorSearch = 83;
constexpr uint32_t MaxBlenderMinorSearch = 93;
std::optional<std::string> FindBlender(int& major, int& minor);
bool IsVersionSupported(int major, int minor);
std::pair<uint32_t, uint32_t> GetLatestSupportedVersion();
std::pair<uint32_t, uint32_t> GetEarliestSupportedVersion();
std::pair<uint32_t, uint32_t> GetRecommendedVersion();
void SetOverridePath(std::string_view overridePath);
} // namespace hecl::blender

View File

@@ -466,8 +466,9 @@ Connection::Connection(int verbosityLevel) {
BlenderLog.report(logvisor::Fatal, FMT_STRING("Unable to find blender"));
} else if (lineStr == "INVALIDBLENDERVER") {
_closePipe();
auto [major, minor] = hecl::blender::GetEarliestSupportedVersion();
BlenderLog.report(logvisor::Fatal, FMT_STRING("Installed blender version must be >= {}.{}"),
MinBlenderMajorSearch, MinBlenderMinorSearch);
major, minor);
} else if (lineStr == "NOADDON") {
_closePipe();
if (blenderAddonPath != "SKIPINSTALL")

View File

@@ -2,9 +2,24 @@
#include "hecl/SteamFinder.hpp"
#include <array>
#include <sstream>
namespace hecl::blender {
namespace {
struct SBlenderVersion {
uint32_t Major;
uint32_t Minor;
};
// Supported blender versions in reverse order, with the most recently supported version first
constexpr std::array SupportedVersions{
SBlenderVersion{3, 0}, SBlenderVersion{2, 93}, SBlenderVersion{2, 92},
SBlenderVersion{2, 91}, SBlenderVersion{2, 90}, SBlenderVersion{2, 83},
};
// The most recent version with the most testing
constexpr SBlenderVersion RecommendedVersion{2, 93};
static std::string OverridePath;
} // namespace
#ifdef __APPLE__
#define DEFAULT_BLENDER_BIN "/Applications/Blender.app/Contents/MacOS/blender"
@@ -40,8 +55,14 @@ std::optional<std::string> FindBlender(int& major, int& minor) {
major = 0;
minor = 0;
/* User-specified blender path */
auto blenderBin = GetEnv("BLENDER_BIN");
std::optional<std::string> blenderBin;
if (!OverridePath.empty()) {
blenderBin = {OverridePath};
} else {
/* User-specified blender path */
blenderBin = GetEnv("BLENDER_BIN");
}
if (blenderBin && !RegFileExists(blenderBin->c_str())) {
blenderBin.reset();
}
@@ -63,19 +84,11 @@ std::optional<std::string> FindBlender(int& major, int& minor) {
wchar_t wProgFiles[256];
if (GetEnvironmentVariableW(L"ProgramFiles", wProgFiles, 256)) {
auto progFiles = nowide::narrow(wProgFiles);
for (size_t major = MaxBlenderMajorSearch; major >= MinBlenderMajorSearch; --major) {
bool found = false;
for (size_t minor = MaxBlenderMinorSearch; minor >= MinBlenderMinorSearch; --minor) {
std::string blenderBinBuf = fmt::format(FMT_STRING("{}\\Blender Foundation\\Blender {}.{}\\blender.exe"),
progFiles, major, minor);
if (RegFileExists(blenderBinBuf.c_str())) {
blenderBin = std::move(blenderBinBuf);
found = true;
break;
}
}
if (found) {
for (const auto& version : SupportedVersions) {
std::string blenderBinBuf =
fmt::format(FMT_STRING("{}\\Blender Foundation\\Blender {}.{}\\blender.exe"), progFiles, major, minor);
if (RegFileExists(blenderBinBuf.c_str())) {
blenderBin = std::move(blenderBinBuf);
break;
}
}
@@ -147,4 +160,21 @@ std::optional<std::string> FindBlender(int& major, int& minor) {
return blenderBin;
}
bool IsVersionSupported(int major, int minor) {
const auto* it =
std::find_if(SupportedVersions.cbegin(), SupportedVersions.cend(),
[&major, &minor](const auto& version) { return version.Major == major && version.Minor == minor; });
return it != nullptr;
}
std::pair<uint32_t, uint32_t> GetLatestSupportedVersion() {
return {SupportedVersions.front().Major, SupportedVersions.front().Minor};
}
std::pair<uint32_t, uint32_t> GetEarliestSupportedVersion() {
return {SupportedVersions.back().Major, SupportedVersions.back().Minor};
}
std::pair<uint32_t, uint32_t> GetRecommendedVersion() { return {RecommendedVersion.Major, RecommendedVersion.Minor}; }
void SetOverridePath(std::string_view overridePath) { OverridePath = overridePath; }
} // namespace hecl::blender