bool ColladaShapeLoader::checkAndMountSketchup(const Torque::Path& path, String& mountPoint, Torque::Path& daePath) { bool isSketchup = path.getExtension().equal("kmz", String::NoCase); if (isSketchup) { // Mount the zip so files can be found (it will be unmounted before we return) mountPoint = String("sketchup_") + path.getFileName(); String zipPath = path.getFullPath(); if (!Torque::FS::Mount(mountPoint, new Torque::ZipFileSystem(zipPath))) return false; Vector<String> daeFiles; Torque::Path findPath; findPath.setRoot(mountPoint); S32 results = Torque::FS::FindByPattern(findPath, "*.dae", true, daeFiles); if (results == 0 || daeFiles.size() == 0) { Torque::FS::Unmount(mountPoint); return false; } daePath = daeFiles[0]; } else { daePath = path; } return isSketchup; }
//----------------------------------------------------------------------------- /// Copy a texture from a KMZ to a cache. Note that the texture filename is modified void copySketchupTexture(const Torque::Path &path, String &textureFilename) { if (textureFilename.isEmpty()) return; Torque::Path texturePath(textureFilename); texturePath.setExtension(findTextureExtension(texturePath)); String cachedTexFilename = String::ToString("%s_%s.cached", TSShapeLoader::getShapePath().getFileName().c_str(), texturePath.getFileName().c_str()); Torque::Path cachedTexPath; cachedTexPath.setRoot(path.getRoot()); cachedTexPath.setPath(path.getPath()); cachedTexPath.setFileName(cachedTexFilename); cachedTexPath.setExtension(texturePath.getExtension()); FileStream *source; FileStream *dest; if ((source = FileStream::createAndOpen(texturePath.getFullPath(), Torque::FS::File::Read)) == NULL) return; if ((dest = FileStream::createAndOpen(cachedTexPath.getFullPath(), Torque::FS::File::Write)) == NULL) { delete source; return; } dest->copyFrom(source); delete dest; delete source; // Update the filename in the material cachedTexPath.setExtension(""); textureFilename = cachedTexPath.getFullPath(); }