Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@blender.org>2019-09-19 16:55:03 +0300
committerSybren A. Stüvel <sybren@blender.org>2019-09-19 16:55:19 +0300
commit34143e45104b296ece09c646ea3fb0d8bb24c519 (patch)
tree2d6c99e6f4596b1561d25f12e6cdc46a87ec1842 /source/blender/alembic
parent1353158aa24b4ada82cc569543e765c5ff388e20 (diff)
Fix T70070: Path always absolute when importing Alembic
Importing an Alembic file with a relative path is now also possible.
Diffstat (limited to 'source/blender/alembic')
-rw-r--r--source/blender/alembic/ABC_alembic.h5
-rw-r--r--source/blender/alembic/intern/abc_archive.cc18
-rw-r--r--source/blender/alembic/intern/abc_archive.h4
-rw-r--r--source/blender/alembic/intern/alembic_capi.cc8
4 files changed, 25 insertions, 10 deletions
diff --git a/source/blender/alembic/ABC_alembic.h b/source/blender/alembic/ABC_alembic.h
index 696e0ff1810..7c5efaf309d 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -27,6 +27,7 @@ extern "C" {
struct CacheReader;
struct ListBase;
+struct Main;
struct Mesh;
struct Object;
struct Scene;
@@ -103,7 +104,9 @@ bool ABC_import(struct bContext *C,
bool validate_meshes,
bool as_background_job);
-AbcArchiveHandle *ABC_create_handle(const char *filename, struct ListBase *object_paths);
+AbcArchiveHandle *ABC_create_handle(struct Main *bmain,
+ const char *filename,
+ struct ListBase *object_paths);
void ABC_free_handle(AbcArchiveHandle *handle);
diff --git a/source/blender/alembic/intern/abc_archive.cc b/source/blender/alembic/intern/abc_archive.cc
index c4252d20d48..08aa02977f4 100644
--- a/source/blender/alembic/intern/abc_archive.cc
+++ b/source/blender/alembic/intern/abc_archive.cc
@@ -24,6 +24,10 @@
#include "abc_archive.h"
extern "C" {
#include "BKE_blender_version.h"
+#include "BKE_main.h"
+
+#include "BLI_path_util.h"
+#include "BLI_string.h"
}
#ifdef WIN32
@@ -95,20 +99,24 @@ static IArchive open_archive(const std::string &filename,
return IArchive();
}
-ArchiveReader::ArchiveReader(const char *filename)
+ArchiveReader::ArchiveReader(struct Main *bmain, const char *filename)
{
+ char abs_filename[FILE_MAX];
+ BLI_strncpy(abs_filename, filename, FILE_MAX);
+ BLI_path_abs(abs_filename, BKE_main_blendfile_path(bmain));
+
#ifdef WIN32
- UTF16_ENCODE(filename);
+ UTF16_ENCODE(abs_filename);
std::wstring wstr(filename_16);
m_infile.open(wstr.c_str(), std::ios::in | std::ios::binary);
- UTF16_UN_ENCODE(filename);
+ UTF16_UN_ENCODE(abs_filename);
#else
- m_infile.open(filename, std::ios::in | std::ios::binary);
+ m_infile.open(abs_filename, std::ios::in | std::ios::binary);
#endif
m_streams.push_back(&m_infile);
- m_archive = open_archive(filename, m_streams, m_is_hdf5);
+ m_archive = open_archive(abs_filename, m_streams, m_is_hdf5);
/* We can't open an HDF5 file from a stream, so close it. */
if (m_is_hdf5) {
diff --git a/source/blender/alembic/intern/abc_archive.h b/source/blender/alembic/intern/abc_archive.h
index 343a8112aa2..a64de742cdf 100644
--- a/source/blender/alembic/intern/abc_archive.h
+++ b/source/blender/alembic/intern/abc_archive.h
@@ -34,6 +34,8 @@
#include <fstream>
+struct Main;
+
/* Wrappers around input and output archives. The goal is to be able to use
* streams so that unicode paths work on Windows (T49112), and to make sure that
* the stream objects remain valid as long as the archives are open.
@@ -46,7 +48,7 @@ class ArchiveReader {
bool m_is_hdf5;
public:
- explicit ArchiveReader(const char *filename);
+ ArchiveReader(struct Main *bmain, const char *filename);
bool valid() const;
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 98e5477f2b2..1034c5b319f 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -173,9 +173,11 @@ static bool gather_objects_paths(const IObject &object, ListBase *object_paths)
return parent_is_part_of_this_object;
}
-AbcArchiveHandle *ABC_create_handle(const char *filename, ListBase *object_paths)
+AbcArchiveHandle *ABC_create_handle(struct Main *bmain,
+ const char *filename,
+ ListBase *object_paths)
{
- ArchiveReader *archive = new ArchiveReader(filename);
+ ArchiveReader *archive = new ArchiveReader(bmain, filename);
if (!archive->valid()) {
delete archive;
@@ -650,7 +652,7 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa
WM_set_locked_interface(data->wm, true);
- ArchiveReader *archive = new ArchiveReader(data->filename);
+ ArchiveReader *archive = new ArchiveReader(data->bmain, data->filename);
if (!archive->valid()) {
#ifndef WITH_ALEMBIC_HDF5