mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-08 11:44:55 +00:00
Merge remote-tracking branch 'origin/main' into wgpu
# Conflicts: # extern/boo
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -505,7 +505,11 @@ try:
|
||||
bpy.context.preferences.filepaths.save_version = 0
|
||||
print('SAVING %s' % loaded_blend)
|
||||
if loaded_blend:
|
||||
if 'FINISHED' in bpy.ops.wm.save_as_mainfile(filepath=loaded_blend, check_existing=False, compress=True):
|
||||
if bpy.app.version >= (3, 0, 0):
|
||||
ret = bpy.ops.wm.save_as_mainfile(filepath=loaded_blend, check_existing=False, compress=False)
|
||||
else:
|
||||
ret = bpy.ops.wm.save_as_mainfile(filepath=loaded_blend, check_existing=False, compress=True)
|
||||
if 'FINISHED' in ret:
|
||||
writepipestr(b'FINISHED')
|
||||
else:
|
||||
writepipestr(b'CANCELLED')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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,12 @@ 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, version.Major, version.Minor);
|
||||
if (RegFileExists(blenderBinBuf.c_str())) {
|
||||
blenderBin = std::move(blenderBinBuf);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -133,7 +147,7 @@ std::optional<std::string> FindBlender(int& major, int& minor) {
|
||||
std::string command = std::string("\"") + blenderBin.value() + "\" --version";
|
||||
FILE* fp = popen(command.c_str(), "r");
|
||||
char versionBuf[256];
|
||||
size_t rdSize = fread(versionBuf, 1, 255, fp);
|
||||
size_t rdSize = fread(&versionBuf[0], 1, 255, fp);
|
||||
versionBuf[rdSize] = '\0';
|
||||
pclose(fp);
|
||||
|
||||
@@ -147,4 +161,21 @@ std::optional<std::string> FindBlender(int& major, int& minor) {
|
||||
return blenderBin;
|
||||
}
|
||||
|
||||
bool IsVersionSupported(int major, int minor) {
|
||||
auto it =
|
||||
std::find_if(SupportedVersions.cbegin(), SupportedVersions.cend(),
|
||||
[&major, &minor](const auto& version) { return version.Major == major && version.Minor == minor; });
|
||||
return it != SupportedVersions.cend();
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -79,44 +79,51 @@ SDNARead::SDNARead(std::string_view path) {
|
||||
r.readUBytesToBuf(magicBuf, 7);
|
||||
r.seek(0, athena::SeekOrigin::Begin);
|
||||
if (strncmp(magicBuf, "BLENDER", 7)) {
|
||||
/* Try gzip decompression */
|
||||
std::unique_ptr<uint8_t[]> compBuf(new uint8_t[4096]);
|
||||
m_data.resize((length * 2 + 4095) & ~4095);
|
||||
z_stream zstrm = {};
|
||||
inflateInit2(&zstrm, 16 + MAX_WBITS);
|
||||
zstrm.next_out = (Bytef*)m_data.data();
|
||||
zstrm.avail_out = m_data.size();
|
||||
zstrm.total_out = 0;
|
||||
atUint32 magic = hecl::SLittle(*(atUint32*)(magicBuf));
|
||||
if (magic == 0xfd2fb528) {
|
||||
/* Try zstandard decompression */
|
||||
// TODO: Implement
|
||||
m_data = {};
|
||||
} else if (magic == 0x88b1f) {
|
||||
/* Try gzip decompression */
|
||||
std::unique_ptr<uint8_t[]> compBuf(new uint8_t[4096]);
|
||||
m_data.resize((length * 2 + 4095) & ~4095);
|
||||
z_stream zstrm = {};
|
||||
inflateInit2(&zstrm, 16 + MAX_WBITS);
|
||||
zstrm.next_out = (Bytef*)m_data.data();
|
||||
zstrm.avail_out = m_data.size();
|
||||
zstrm.total_out = 0;
|
||||
|
||||
atUint64 rs;
|
||||
while ((rs = r.readUBytesToBuf(compBuf.get(), 4096))) {
|
||||
int inflateRet;
|
||||
zstrm.next_in = compBuf.get();
|
||||
zstrm.avail_in = rs;
|
||||
while (zstrm.avail_in) {
|
||||
if (!zstrm.avail_out) {
|
||||
zstrm.avail_out = m_data.size();
|
||||
m_data.resize(zstrm.avail_out * 2);
|
||||
zstrm.next_out = (Bytef*)m_data.data() + zstrm.avail_out;
|
||||
atUint64 rs;
|
||||
while ((rs = r.readUBytesToBuf(compBuf.get(), 4096))) {
|
||||
int inflateRet;
|
||||
zstrm.next_in = compBuf.get();
|
||||
zstrm.avail_in = rs;
|
||||
while (zstrm.avail_in) {
|
||||
if (!zstrm.avail_out) {
|
||||
zstrm.avail_out = m_data.size();
|
||||
m_data.resize(zstrm.avail_out * 2);
|
||||
zstrm.next_out = (Bytef*)m_data.data() + zstrm.avail_out;
|
||||
}
|
||||
inflateRet = inflate(&zstrm, Z_NO_FLUSH);
|
||||
if (inflateRet == Z_STREAM_END)
|
||||
break;
|
||||
if (inflateRet != Z_OK) {
|
||||
inflateEnd(&zstrm);
|
||||
m_data = std::vector<uint8_t>();
|
||||
return;
|
||||
}
|
||||
}
|
||||
inflateRet = inflate(&zstrm, Z_NO_FLUSH);
|
||||
if (inflateRet == Z_STREAM_END)
|
||||
break;
|
||||
if (inflateRet != Z_OK) {
|
||||
inflateEnd(&zstrm);
|
||||
m_data = std::vector<uint8_t>();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (inflateRet == Z_STREAM_END)
|
||||
break;
|
||||
}
|
||||
|
||||
inflateEnd(&zstrm);
|
||||
inflateEnd(&zstrm);
|
||||
|
||||
if (strncmp((char*)m_data.data(), "BLENDER", 7)) {
|
||||
m_data = std::vector<uint8_t>();
|
||||
return;
|
||||
if (strncmp((char*)m_data.data(), "BLENDER", 7)) {
|
||||
m_data = std::vector<uint8_t>();
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m_data.resize(length);
|
||||
|
||||
@@ -161,7 +161,7 @@ bool IsPathBlend(const hecl::ProjectPath& path) {
|
||||
}
|
||||
|
||||
buf = hecl::SLittle(buf);
|
||||
return buf == 0x4e454c42 || buf == 0x88b1f;
|
||||
return buf == 0x4e454c42 || buf == 0x88b1f || buf == 0xfd2fb528;
|
||||
}
|
||||
|
||||
bool IsPathYAML(const hecl::ProjectPath& path) {
|
||||
|
||||
Reference in New Issue
Block a user