Jump to content

[SOLVED] ung at runtime


photo

Recommended Posts

Добрый день, столкнулся со следующей проблемой:

Не могу прочитать файлы из ung архива, созданного в runtime

При выполнении приложения выполняются следующие функции:

1) С помощью плагина CadImporter импортирую step файл с иерархией в папку data/imported/step_name/. В папке step_name/ создаются меши и нода:

  1. data/imported/step_name/step_name.node
  2. data/imported/step_name/sub_shape_0.mesh
  3. data/imported/step_name/sub_shape_1.mesh
  4. и т.п.

В самой ноде при импорте все пути прописываются следующим образом:

<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 by Shuba
Link to comment

Здравствуйте!

Возможно, файловая система ничего не знает о новом архиве. Попробуйте сделать в консоли filesystem_reload после того как удалите сами файлы и создадите ung-архив.

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment

Выполнил команду в консоли

1 hour ago, silent said:

filesystem_reload

ung Архив, который находится в папке data/default/model_b.ung система не видит судя по логам (см. скриншот ниже)

image.thumb.png.9ad67cd77e3eeb6937c46204344fdbd5.png

В чем может быть проблема?

Link to comment

А как пакуете файлы в архив? Чтобы сохранить относительные пути есть простой способ - копируем ung_x64 в папку от которой будут созданы относительные пути и там вызываем ung_x64 -d step_name.

Вообще сходу сложно понять что происходит,  обычно все архивы всегда грузятся без особых проблем. Такая ошибка возникает даже после перезапуска движка?

Если проблема все еще сохраняется, не могли бы вы прислать нам тестовую сценку с этим архивом который не грузится на старте движка - посмотрим более детально.

Спасибо!

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment
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

Здравствуйте.
Там получается так что 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
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
  • morbid changed the title to [SOLVED] ung at runtime
×
×
  • Create New...