Vasara Posted October 12, 2020 Posted October 12, 2020 (edited) Добрый день. Не могу разобраться, как сохранить сгенерированные детали и материалы масок в lmap. Чтобы, например, при переносе lmap в другой проект(или загрузить в редактор) детали сохранялись. На данный момент, если пересобираю проект без кода генерации, детали пропадают. Пробовал сохранять через консоль, эффекта нет. Также не работает World State. С Уважением Константин. Edited October 13, 2020 by Vasara
danvern Posted October 13, 2020 Posted October 13, 2020 Здравствуйте, lmap в себе не хранит метериалы и детейлы, их хранит ObjectLandscapeTerrain. Чтобы их сохранить нужно смотреть в сторону консольной комманды world_save, либо World::saveNode (чтобы сохранить только ноду).
Vasara Posted October 13, 2020 Author Posted October 13, 2020 Пробовал сохранить через 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 State не работает, как писал выше. Попробую saveNode.
danvern Posted October 13, 2020 Posted October 13, 2020 в файле все сохранилось, возможно при загрузке не востанавливается правильный активный терррейн, так как их очень много в этом ворлде. попробуйте выставить активный террейн, либо удалить все ненужные террейны
Vasara Posted October 13, 2020 Author Posted October 13, 2020 (edited) Почистил 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 October 13, 2020 by Vasara
danvern Posted October 13, 2020 Posted October 13, 2020 18 minutes ago, Vasara said: Надо ли дополнительно прописывать загрузку террейна сюда: ну думаю нет, просто нужно загрузить ворлд и все должно работать а вы пробывали просто в редакторе загрузить этот мир?
Vasara Posted October 13, 2020 Author Posted October 13, 2020 1 hour ago, danvern said: а вы пробывали просто в редакторе загрузить этот мир? в редакторе нормально загрузился, сразу автоматом
Vasara Posted October 13, 2020 Author Posted October 13, 2020 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"); }
danvern Posted October 13, 2020 Posted October 13, 2020 если я правильно понял то вы загружаете мир с ObjectLandscapeTerrain'ом и lmap'ой, а потом просто меняете активный терейн с детейлами, на новый: ObjectLandscapeTerrainPtr terrain = ObjectLandscapeTerrain::create(); terrain->setActiveTerrain(true); terrain->setCollision(true, 0); cкорее всего все починится если не пересоздавать террейн 1
Vasara Posted October 13, 2020 Author Posted October 13, 2020 1 hour ago, danvern said: cкорее всего все починится если не пересоздавать террейн Да, починилось. Вот что значит опыт. Ещё раз большое спасибо. Думаю я у вас на форуме надолго, впереди шейдеры:)
Recommended Posts