[SOLVED]Запись деталей масок в lmap.


photo

Recommended Posts

Добрый день.

 

Не могу разобраться, как сохранить сгенерированные детали и материалы масок в lmap. Чтобы, например, при переносе lmap в другой проект(или загрузить в редактор) детали сохранялись. На данный момент, если пересобираю проект без кода генерации, детали пропадают. Пробовал сохранять через консоль, эффекта нет. Также не работает World State.

state.jpg.8da3a2e996bbb7e56034154b7d87f4cb.jpg 

С Уважением Константин.

Edited by Vasara
Link to post

Здравствуйте, lmap в себе не хранит метериалы и детейлы, их хранит ObjectLandscapeTerrain. Чтобы их сохранить нужно смотреть в сторону консольной комманды world_save, либо World::saveNode (чтобы сохранить только ноду).

Link to post

Пробовал сохранить через world_save. 

В инициализацию вставлен такой кусок кода:

auto mask = terrain->getDetailMask(1);
	auto detail = mask->addDetail();
	auto materialBase = Materials::findBaseMaterial("landscape_terrain_detail_base");
	auto mat = materialBase->inherit("source_gray_clay");
	detail->setMaterial(mat);
	float r = 150.0f / 255.0f; float g = 160.0f / 255.0f; float b = 0.0f / 255.0f;
	mat->setParameterFloat4("albedo", Math::vec4(r, g, b, 1.0f));	
	mat->save("landscape_grafic_assets/mask_assets/gray_clay/source_gray_clay_mask.mat");

Генерируется деталь маски, сохраняется. Сохраняю мир через world_save.

Закрываю приложение, комментирую код, чтобы деталь больше не генерировалась и не перезаписывался source_gray_clay_mask.mat файл.

Запускаю приложение, маски загружаются детали нет.

world_save.png.fac047448672b124cca3f4665d58805b.png

World State не работает, как писал выше. Попробую saveNode.

 

 

Link to post

а можете скинуть world файл? 

Link to post

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

Link to post

Почистил world, сохранил nod отдельно. Если код есть в инициализации, работает. Если кода нет, деталей нет.

	auto mask = terrain->getDetailMask(0);
	auto detail = mask->addDetail();
	detail->setName("source_water");
	MaterialPtr materialBase = Materials::findBaseMaterial("landscape_terrain_detail_base");
	MaterialPtr mat = materialBase->inherit("source_water");
	detail->setMaterial(mat);
	objectLmapCreator.createSourceImageMask("landscape_grafic_assets/mask_assets/water/source_water_mask.dds", 0, 0, 255, 255, 4096);
	mat->setTexturePath(mat->findTexture("albedo"), "landscape_grafic_assets/mask_assets/water/source_water_mask.dds");
	mat->save("landscape_grafic_assets/mask_assets/water/source_water_mask.mat");

	mask = terrain->getDetailMask(1);
	detail = mask->addDetail();
	detail->setName("source_gray_clay");
	mat = materialBase->inherit("source_gray_clay");
	detail->setMaterial(mat);
	float r = 150.0f / 255.0f; float g = 160.0f / 255.0f; float b = 0.0f / 255.0f;
	mat->setParameterFloat4("albedo", Math::vec4(r, g, b, 1.0f));
	mat->save("landscape_grafic_assets/mask_assets/gray_clay/source_gray_clay_mask.mat");

Надо ли дополнительно прописывать загрузку террейна сюда:

	ObjectLandscapeTerrainPtr terrain = ObjectLandscapeTerrain::create();
	terrain->setActiveTerrain(true);
	terrain->setCollision(true, 0);

MapCreator.world nodTerrain.node

Edited by Vasara
Link to post
18 minutes ago, Vasara said:

Надо ли дополнительно прописывать загрузку террейна сюда:

ну думаю нет, просто нужно загрузить ворлд и все должно работать
а вы пробывали просто в редакторе загрузить этот мир?

Link to post
1 hour ago, danvern said:

а вы пробывали просто в редакторе загрузить этот мир?

в редакторе нормально загрузился, сразу автоматом

Link to post

хорошо, можно тогда увидеть код полностью?

Link to post
void AppWorldLogic::createTerrain(String lmapName)
{	
	ObjectLandscapeTerrainPtr terrain = ObjectLandscapeTerrain::create();
	terrain->setActiveTerrain(true);
	terrain->setCollision(true, 0);

	LandscapeLayerMapPtr lmap = LandscapeLayerMap::create();
	lmap->setParent(terrain);
	lmap->setPath(lmapName);
	lmap->setName(lmapName.get());
	lmap->setSize(Math::Vec2(4096, 4096));
	lmap->setHeightScale(1.0f);
	lmap->setWorldPosition(Math::Vec3::ZERO);
	lmap->setWorldRotation(Math::quat(Math::vec3::UP, 45.0f));
	
	//float r = 0.0f;
	//float g = 0.0f;
	//float b = 0.0f;

	/*auto mask = terrain->getDetailMask(0);
	auto detail = mask->addDetail();
	detail->setName("source_water");
	MaterialPtr materialBase = Materials::findBaseMaterial("landscape_terrain_detail_base");
	MaterialPtr mat = materialBase->inherit("source_water");
	detail->setMaterial(mat);
	objectLmapCreator.createSourceImageMask("landscape_grafic_assets/mask_assets/water/source_water_mask.dds", 0, 0, 255, 255, 4096);
	mat->setTexturePath(mat->findTexture("albedo"), "landscape_grafic_assets/mask_assets/water/source_water_mask.dds");
	mat->save("landscape_grafic_assets/mask_assets/water/source_water_mask.mat");

	mask = terrain->getDetailMask(1);
	detail = mask->addDetail();
	detail->setName("source_gray_clay");
	mat = materialBase->inherit("source_gray_clay");
	detail->setMaterial(mat);
	float r = 150.0f / 255.0f; float g = 160.0f / 255.0f; float b = 0.0f / 255.0f;
	mat->setParameterFloat4("albedo", Math::vec4(r, g, b, 1.0f));
	mat->save("landscape_grafic_assets/mask_assets/gray_clay/source_gray_clay_mask.mat");*/

	/*mask = terrain->getDetailMask(2);
	detail = mask->addDetail();
	mat = materialBase->inherit("source_pebbled_sand");
	detail->setMaterial(mat);
	r = 220.0f / 255.0f; g = 125.0f / 255.0f; b = 55.0f / 255.0f;
	mat->setParameterFloat4("albedo", Math::vec4(r, g, b, 1.0f));
	mat->save("landscape_grafic_assets/mask_assets/pebbled_sand/source_pebbled_sand_mask.mat");

	mask = terrain->getDetailMask(3);
	detail = mask->addDetail();
	mat = materialBase->inherit("source_brown_clay");
	detail->setMaterial(mat);
	r = 160.0f / 255.0f; g = 80.0f / 255.0f; b = 60.0f / 255.0f;
	mat->setParameterFloat4("albedo", Math::vec4(r, g, b, 1.0f));
	mat->save("landscape_grafic_assets/mask_assets/brown_clay/source_brown_clay_mask.mat");

	mask = terrain->getDetailMask(4);
	detail = mask->addDetail();
	mat = materialBase->inherit("source_dirt_mask");
	detail->setMaterial(mat);
	r = 30.0f / 255.0f; g = 30.0f / 255.0f; b = 40.0f / 255.0f;
	mat->setParameterFloat4("albedo", Math::vec4(r, g, b, 1.0f));
	mat->save("landscape_grafic_assets/mask_assets/dirt/source_dirt_mask.mat");*/
	NodePtr nodTerrain = terrain;
	nodTerrain->setSaveToWorldEnabledRecursive(true);
	nodTerrain->setName("terrain_node");
	//World::saveNode("nodes/nodTerrain.node", nodTerrain);
	Log::warning("ID: %d", terrain->getID());
	//Console::run("world_save");
}

 

Link to post

если я правильно понял то вы загружаете мир с ObjectLandscapeTerrain'ом и lmap'ой, а потом просто меняете активный терейн с детейлами, на новый:
 

ObjectLandscapeTerrainPtr terrain = ObjectLandscapeTerrain::create();
terrain->setActiveTerrain(true);
terrain->setCollision(true, 0);

cкорее всего все починится если не пересоздавать террейн

  • Like 1
Link to post
1 hour ago, danvern said:

cкорее всего все починится если не пересоздавать террейн

Да, починилось. Вот что значит опыт. Ещё раз большое спасибо. Думаю я у вас на форуме надолго, впереди шейдеры:) 

Link to post
  • Vasara changed the title to [SOLVED]Запись деталей масок в lmap.