Shuba Posted July 6, 2020 Share Posted July 6, 2020 (edited) Добрый день, столкнулся со следующей проблемой: Не могу прочитать файлы из ung архива, созданного в runtime При выполнении приложения выполняются следующие функции: 1) С помощью плагина CadImporter импортирую step файл с иерархией в папку data/imported/step_name/. В папке step_name/ создаются меши и нода: data/imported/step_name/step_name.node data/imported/step_name/sub_shape_0.mesh data/imported/step_name/sub_shape_1.mesh и т.п. В самой ноде при импорте все пути прописываются следующим образом: <node type="ObjectMeshStatic" id="107603081" name="sub_shape_0"> <mesh_name>../data/imported/step_name/sub_shape_0.mesh</mesh_name> <surface name="GRAY62 (0.647059,0.619608,0.588235,1)" material="841f9d7a08f60719b7bc9a8e16d254a870513a5f" property="d99ebc8ef5769d70b1e46992309cc3e7d1aa2faa"/> <transform>1 0 0 0.0 0 1 0 0.0 0 0 1 0.0 0 0 0 1.0</transform> </node> 2) С помощью ung_x64, вызовом командной строки, архивирую папку step_name/ 3) Удаляю исходную папку step_name/, таким образом в системе остается только один файл архива. Выглядит следующим образом: data/imported/step_name.ung 4) Перезагружаю мир 5) Пытаюсь загрузить ноду следующими методами: Unigine::NodeReferencePtr noderef = Unigine::NodeReference::create("../data/imported/step_name/step_name.node"); // or Unigine::NodePtr node = Unigine::World::get()->loadNode("../data/imported/step_name/step_name.node",0); и получаю ошибку - Xml::load(): can't open "step_name/step_name.node" file World::loadNode(): can't open "step_name/step_name.node" file При поптыке загрузить архив с помощью функции Unigine::FileSystem::get()->loadPackage("../data/imported/step_name.ung"); получаю false При работе из папки, без использования архива, нода загружается корректно. По требованиям проекта должна быть предусмотрена загрузка сторонних step файлов и дальнейшее их хранение в архивах, с возможностью передачи между различными клиентами. Так как доступа к редактору у них нет, то все это должно работать на релизной версии программы. Подскажите, пожалуйста, в чем может быть проблема при чтении нод, созданных в рантайме, через ung архивы. Возможно есть более гибкие решения для данного вопроса. Используется Unigine 2.7.2.1 SDK Edited July 6, 2020 by Shuba Link to comment
silent Posted July 7, 2020 Share Posted July 7, 2020 Здравствуйте! Возможно, файловая система ничего не знает о новом архиве. Попробуйте сделать в консоли filesystem_reload после того как удалите сами файлы и создадите ung-архив. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Shuba Posted July 7, 2020 Author Share Posted July 7, 2020 Выполнил команду в консоли 1 hour ago, silent said: filesystem_reload ung Архив, который находится в папке data/default/model_b.ung система не видит судя по логам (см. скриншот ниже) В чем может быть проблема? Link to comment
silent Posted July 9, 2020 Share Posted July 9, 2020 А как пакуете файлы в архив? Чтобы сохранить относительные пути есть простой способ - копируем ung_x64 в папку от которой будут созданы относительные пути и там вызываем ung_x64 -d step_name. Вообще сходу сложно понять что происходит, обычно все архивы всегда грузятся без особых проблем. Такая ошибка возникает даже после перезапуска движка? Если проблема все еще сохраняется, не могли бы вы прислать нам тестовую сценку с этим архивом который не грузится на старте движка - посмотрим более детально. Спасибо! How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Shuba Posted July 9, 2020 Author Share Posted July 9, 2020 3 hours ago, silent said: А как пакуете файлы в архив? Чтобы сохранить относительные пути есть простой способ - копируем ung_x64 в папку от которой будут созданы относительные пути и там вызываем ung_x64 -d step_name. Вообще сходу сложно понять что происходит, обычно все архивы всегда грузятся без особых проблем. Такая ошибка возникает даже после перезапуска движка? Если проблема все еще сохраняется, не могли бы вы прислать нам тестовую сценку с этим архивом который не грузится на старте движка - посмотрим более детально. Спасибо! Пакую с помощью ung_x64, который находится в папке bin проекта. Попробовал сделать как вы предлагаете, архив система видит после команды filesystem_reload Но тем не менее, загрузить ноду я так и не смог, возможно не правильно прописываю пути к ноде, пробовал следующие: Unigine::NodeReference::create("../data/imported/AS150-48/as150-48.node"); Unigine::NodeReference::create("imported/AS150-48/as150-48.node"); Unigine::NodeReference::create("../data/imported/as150-48.node"); Unigine::NodeReference::create("D:/unigine/ppo/step_import/data/imported/AS150-48/as150-48.node"); ссылка на тестовый проект все действия прописаны в appWorldLogic в ините: // 1. IMPORT STEP Unigine::Importer* importer = Unigine::Import::get()->createImporterByFileName("../AS150-48.STEP"); importer->removePreProcessor("ImportMaterials"); importer->init("../AS150-48.STEP"); importer->import("../data/imported/AS150-48/"); // 2. MAKE UNG ARCHIVE system("ung_x64 -d ../data/imported/AS150-48"); // 3. REMOVE INITIAL FOLDER system("rmdir /Q /S \"../data/imported/AS150-48\""); // 4. RELOAD FILESYSTEM Unigine::Console::get()->run("filesystem_reload"); // 5. LOAD NODE FROM UNG Unigine::NodeReferencePtr noderef = Unigine::NodeReference::create("../data/imported/AS150-48/as150-48.node"); noderef->release(); Link to comment
danvern Posted July 10, 2020 Share Posted July 10, 2020 Здравствуйте. Там получается так что ung_x64 нужно положить рядом к той папке которую вы собираетесь сжать тоесть в ../data/imported/ потом после удаления папки лучше вызвать https://developer.unigine.com/en/docs/2.7.2/api/library/filesystem/class.filesystem?rlang=cpp#removeNonExistingVirtualFiles_voi после это можно вызвать FileSystem::loadPackage("my.ung", "ung"); Link to comment
Shuba Posted July 10, 2020 Author Share Posted July 10, 2020 1 hour ago, danvern said: Здравствуйте. Там получается так что ung_x64 нужно положить рядом к той папке которую вы собираетесь сжать тоесть в ../data/imported/ потом после удаления папки лучше вызвать https://developer.unigine.com/en/docs/2.7.2/api/library/filesystem/class.filesystem?rlang=cpp#removeNonExistingVirtualFiles_voi после это можно вызвать FileSystem::loadPackage("my.ung", "ung"); Спасибо вам за уточнение! Все получилось! // 1. IMPORT STEP Unigine::Importer* importer = Unigine::Import::get()->createImporterByFileName("../AS150-48.STEP"); importer->removePreProcessor("ImportMaterials"); importer->init("../AS150-48.STEP"); importer->import("../data/imported/AS150-48/"); // 2. MAKE UNG ARCHIVE system("start /B cmd /c D: & cd D:/unigine/ppo/step_import/step_import/data/imported/ & ung_x64 -d AS150-48"); // 3. REMOVE INITIAL FOLDER system("rmdir /Q /S \"../data/imported/AS150-48\""); // 3.1 CLEAN VIRTUAL FILES Unigine::FileSystem::get()->removeNonExistingVirtualFiles(); // 4 LOAD UNG Unigine::FileSystem::get()->loadPackage("imported/AS150-48.ung", "ung"); // 5. LOAD NODE FROM UNG Unigine::NodeReferencePtr noderef = Unigine::NodeReference::create("../data/imported/AS150-48/as150-48.node"); noderef->release(); Link to comment
Recommended Posts