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