11#include "Alembic/Abc/ArchiveInfo.h"
12#include "Alembic/AbcCoreAbstract/MetaData.h"
13#include "Alembic/AbcCoreLayer/Read.h"
14#include "Alembic/AbcCoreOgawa/ReadWrite.h"
28using Alembic::Abc::ErrorHandler;
29using Alembic::Abc::Exception;
30using Alembic::Abc::IArchive;
31using Alembic::Abc::kWrapExisting;
32using Alembic::Abc::MetaData;
37 const std::vector<std::istream *> &input_streams)
40 Alembic::AbcCoreOgawa::ReadArchive archive_reader(input_streams);
42 return IArchive(archive_reader(filename), kWrapExisting, ErrorHandler::kThrowPolicy);
44 catch (
const Exception &
e) {
45 std::cerr <<
e.what() <<
'\n';
49 std::ifstream the_file(filename.c_str(), std::ios::in | std::ios::binary);
51 std::cerr <<
"Unable to open " << filename << std::endl;
53 else if (!the_file.read(header,
sizeof(header))) {
54 std::cerr <<
"Unable to read from " << filename << std::endl;
56 else if (strncmp(header + 1,
"HDF", 3) != 0) {
57 std::cerr << filename <<
" has an unknown file format, unable to read." << std::endl;
60 std::cerr << filename <<
" is in the obsolete HDF5 format, unable to read." << std::endl;
63 if (the_file.is_open()) {
73 std::vector<ArchiveReader *> readers;
75 for (
const char *filename : filenames) {
76 ArchiveReader *reader =
new ArchiveReader(bmain, filename);
78 if (!reader->
valid()) {
83 readers.push_back(reader);
86 if (readers.empty()) {
90 if (readers.size() == 1) {
94 return new ArchiveReader(readers);
97ArchiveReader::ArchiveReader(
const std::vector<ArchiveReader *> &readers) : m_readers(readers)
99 Alembic::AbcCoreLayer::ArchiveReaderPtrs archives;
102 archives.push_back(reader->m_archive.getPtr());
105 Alembic::AbcCoreLayer::ReadArchive layer;
106 Alembic::AbcCoreAbstract::ArchiveReaderPtr arPtr = layer(archives);
108 m_archive = IArchive(arPtr, kWrapExisting, ErrorHandler::kThrowPolicy);
111ArchiveReader::ArchiveReader(
const Main *bmain,
const char *filename)
114 STRNCPY(abs_filepath, filename);
119 std::wstring wstr(abs_filepath_16);
120 m_infile.open(wstr.c_str(), std::ios::in | std::ios::binary);
123 m_infile.open(abs_filepath, std::ios::in | std::ios::binary);
126 m_streams.push_back(&m_infile);
133 for (ArchiveReader *reader : m_readers) {
140 return m_archive.valid();
145 return m_archive.getTop();
150 const MetaData &abc_metadata = m_archive.getPtr()->getMetaData();
153 if (abc_metadata.get(Alembic::Abc::kApplicationNameKey) ==
"Blender") {
154 return abc_metadata.get(
"blender_version") <
"v4.4";
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
char * STRNCPY(char(&dst)[N], const char *src)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
Alembic::Abc::IObject getTop()
bool is_blender_archive_version_prior_44()
static ArchiveReader * get(const struct Main *bmain, const std::vector< const char * > &filenames)
static IArchive open_archive(const std::string &filename, const std::vector< std::istream * > &input_streams)
#define UTF16_ENCODE(in8str)
#define UTF16_UN_ENCODE(in8str)