Kaydet (Commit) 1dd84fc4 authored tarafından Zolnai Tamás's avatar Zolnai Tamás

collada2gltf: fix URL problems

collada2gltf does not handle Windows pathes, the used COLLADABU::URI
class can't parse native Windows pathes so call COLLADA2GLTFWriter
with URL only.
Other problems:
collada2gltf uses the URL path for creating/opening files,
instead of native ones.
collada2gltf initializes _outputFilePath member in different way,
sometimes as an URL path, sometimes as a native one, but handle it
on the same way(as an URL).

Change-Id: I104182653c07e7dcf6fc5b6e32c7031d59246b84
üst d466f926
...@@ -152,28 +152,36 @@ bool Embed3DModel( const uno::Reference<frame::XModel>& xModel, ...@@ -152,28 +152,36 @@ bool Embed3DModel( const uno::Reference<frame::XModel>& xModel,
const bool bIsKMZ = rSourceURL.endsWithIgnoreAsciiCase(".kmz"); const bool bIsKMZ = rSourceURL.endsWithIgnoreAsciiCase(".kmz");
if (bIsDAE || bIsKMZ) if (bIsDAE || bIsKMZ)
{ {
OUString sName;
::utl::LocalFileHelper::ConvertPhysicalNameToURL(::utl::TempFile::CreateTempName(), sName);
// remove .tmp extension
sName = sName.copy(0, sName.getLength() - 4);
const INetURLObject aSourceURLObj(rSourceURL);
std::string sSourcePath = OUStringToOString( aSourceURLObj.getFSysPath(INetURLObject::FSYS_DETECT), RTL_TEXTENCODING_UTF8 ).getStr();
std::shared_ptr <GLTF::GLTFAsset> asset(new GLTF::GLTFAsset()); std::shared_ptr <GLTF::GLTFAsset> asset(new GLTF::GLTFAsset());
asset->setInputFilePath(sSourcePath); asset->setInputFilePath(OUStringToOString( rSourceURL, RTL_TEXTENCODING_UTF8 ).getStr());
if (bIsKMZ) if (bIsKMZ)
{ {
std::string strDaeFilePath = GLTF::Kmz2Collada()(asset->getInputFilePath()); // KMZ converter needs a system path
const INetURLObject aSourceURLObj(rSourceURL);
const std::string sSourcePath =
OUStringToOString( aSourceURLObj.getFSysPath(INetURLObject::FSYS_DETECT), RTL_TEXTENCODING_UTF8 ).getStr();
const std::string strDaeFilePath = GLTF::Kmz2Collada()(sSourcePath);
if (strDaeFilePath == "") if (strDaeFilePath == "")
return false; return false;
asset->setInputFilePath(strDaeFilePath);
// DAE converter needs URL
OUString sDaeFilePath;
::utl::LocalFileHelper::ConvertPhysicalNameToURL(
OStringToOUString(OString(strDaeFilePath.c_str()), RTL_TEXTENCODING_UTF8 ), sDaeFilePath);
asset->setInputFilePath(OUStringToOString( sDaeFilePath, RTL_TEXTENCODING_UTF8 ).getStr());
} }
asset->setBundleOutputPath(OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr());
OUString sOutput;
::utl::LocalFileHelper::ConvertPhysicalNameToURL(::utl::TempFile::CreateTempName(), sOutput);
// remove .tmp extension
sOutput = sOutput.copy(0, sOutput.getLength()-4);
asset->setBundleOutputPath(OUStringToOString( sOutput, RTL_TEXTENCODING_UTF8 ).getStr());
GLTF::COLLADA2GLTFWriter writer(asset); GLTF::COLLADA2GLTFWriter writer(asset);
writer.write(); writer.write();
// Path to the .json file created by COLLADA2GLTFWriter // Path to the .json file created by COLLADA2GLTFWriter
sSource = sName + "/" + GetFilename(sName) + ".json"; sSource = sOutput + "/" + GetFilename(sOutput) + ".json";
} }
#endif #endif
......
...@@ -16,6 +16,7 @@ $(eval $(call gb_UnpackedTarball_add_file,collada2gltf,.,external/collada2gltf/G ...@@ -16,6 +16,7 @@ $(eval $(call gb_UnpackedTarball_add_file,collada2gltf,.,external/collada2gltf/G
$(eval $(call gb_UnpackedTarball_add_patches,collada2gltf,\ $(eval $(call gb_UnpackedTarball_add_patches,collada2gltf,\
external/collada2gltf/add-unzip-kmz-files-to-collada-files-module.patch.3 \ external/collada2gltf/add-unzip-kmz-files-to-collada-files-module.patch.3 \
external/collada2gltf/write-only-.dae-file-which-we-need.patch.0 \ external/collada2gltf/write-only-.dae-file-which-we-need.patch.0 \
external/collada2gltf/wrong_uri_usage.patch.1 \
)) ))
# vim: set noet sw=4 ts=4: # vim: set noet sw=4 ts=4:
diff -ur collada2gltf.org/GLTF/GLTFAsset.cpp collada2gltf/GLTF/GLTFAsset.cpp
--- collada2gltf.org/GLTF/GLTFAsset.cpp 2014-05-22 11:12:21.823216900 +0200
+++ collada2gltf/GLTF/GLTFAsset.cpp 2014-05-22 14:59:04.963439700 +0200
@@ -191,12 +191,9 @@
shared_ptr<GLTFOutputStream> GLTFAsset::createOutputStreamIfNeeded(const std::string& streamName) {
if (this->_nameToOutputStream.count(streamName) == 0) {
- COLLADABU::URI inputURI(this->getInputFilePath().c_str());
COLLADABU::URI outputURI(this->getOutputFilePath().c_str());
- std::string folder = outputURI.getPathDir();
- std::string fileName = inputURI.getPathFileBase();
-
+ std::string folder = COLLADABU::URI(outputURI.getPathDir()).toNativePath();
shared_ptr<GLTFOutputStream> outputStream = shared_ptr <GLTFOutputStream> (new GLTFOutputStream(folder, streamName, ""));
this->_nameToOutputStream[streamName] = outputStream;
}
@@ -280,13 +277,13 @@
this->_bundleOutputPath = outputBundlePathURI.toNativePath();
COLLADABU::URI outputPathURI(outputBundlePathURI.getURIString() + "/" + outputBundlePathURI.getPathFileBase() + "." + "json");
- this->_outputFilePath = outputPathURI.toNativePath();
+ this->_outputFilePath = outputPathURI.getURIString();
// this->log("outputBundlePath:%s\n",outputBundlePathURI.toNativePath().c_str());
// this->log("outputPath:%s\n",outputPathURI.toNativePath().c_str());
} else {
this->_bundleOutputPath = outputBundlePathURI.toNativePath();
COLLADABU::URI outputPathURI(outputBundlePathURI.getURIString() + "/" + outputBundlePathURI.getPathFileBase() + "." + "json");
- this->_outputFilePath = outputPathURI.toNativePath();
+ this->_outputFilePath = outputPathURI.getURIString();
}
COLLADABU::Utils::createDirectoryIfNeeded(this->_bundleOutputPath.c_str());
}
@@ -376,9 +373,9 @@
COLLADABU::URI outputImagePathURI(inputImagePath.c_str());
COLLADABU::URI outputURI(this->getOutputFilePath().c_str());
- std::string folder = outputURI.getPathDir();
+ std::string folder = COLLADABU::URI(outputURI.getPathDir()).toNativePath();
std::string outputPath = folder + outputImagePathURI.getPathFile();
-
+
std::ifstream f1(inputImagePath.c_str(), std::fstream::binary);
std::ofstream f2(outputPath.c_str(), std::fstream::binary);
@@ -397,8 +394,8 @@
this->_root = shared_ptr <GLTF::JSONObject> (new GLTF::JSONObject());
this->_root->setString(kProfile, profile->id());
this->_root->createObjectIfNeeded(kNodes);
-
- this->_writer.initWithPath(this->getOutputFilePath().c_str());
+ COLLADABU::URI outputURI(this->getOutputFilePath().c_str());
+ this->_writer.initWithPath(outputURI.toNativePath().c_str());
}
static void __eval(JSONValue* value, void *context) {
@@ -427,7 +424,7 @@
void GLTFAsset::_writeJSONResource(const std::string &path, shared_ptr<JSONObject> obj) {
GLTF::GLTFWriter resultsWriter;
COLLADABU::URI outputURI(this->resourceOuputPathForPath(path));
- std::string aPath = this->getOutputFolderPath() + outputURI.getPathFile();
+ std::string aPath = COLLADABU::URI(this->getOutputFolderPath() + outputURI.getPathFile()).toNativePath();
resultsWriter.initWithPath(aPath);
obj->write(&resultsWriter);
diff -ur collada2gltf.org/shaders/commonProfileShaders.cpp collada2gltf/shaders/commonProfileShaders.cpp
--- collada2gltf.org/shaders/commonProfileShaders.cpp 2014-05-22 11:12:21.854416900 +0200
+++ collada2gltf/shaders/commonProfileShaders.cpp 2014-05-22 14:24:57.063126800 +0200
@@ -294,7 +294,7 @@
//also write the file on disk
if (shaderString.size() > 0) {
COLLADABU::URI outputURI(asset->getOutputFilePath());
- std::string shaderPath = outputURI.getPathDir() + path;
+ std::string shaderPath = COLLADABU::URI(outputURI.getPathDir()).toNativePath() + path;
GLTF::GLTFUtils::writeData(shaderPath, "w",(unsigned char*)shaderString.c_str(), shaderString.size());
if (!CONFIG_BOOL(asset, "outputProgress") && asset->converterConfig()->boolForKeyPath("verboseLogging")) {
asset->log("[shader]: %s\n", shaderPath.c_str());
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment