1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-04-01 10:36:42 +00:00

Handle mask disabling better

This commit is contained in:
Nelsson Huotari 2020-02-29 14:56:11 +02:00
parent 711dc59f09
commit 54738e1e32

View file

@ -20,6 +20,7 @@
#include "../widget/scenetoolbar.hpp" #include "../widget/scenetoolbar.hpp"
#include "../widget/scenetoolmode.hpp" #include "../widget/scenetoolmode.hpp"
#include <components/debug/debuglog.hpp>
#include <components/sceneutil/vismask.hpp> #include <components/sceneutil/vismask.hpp>
#include "object.hpp" #include "object.hpp"
@ -700,9 +701,6 @@ void CSVRender::InstanceMode::deleteSelectedInstances(bool active)
void CSVRender::InstanceMode::dropInstance(DropMode dropMode, CSVRender::Object* object) void CSVRender::InstanceMode::dropInstance(DropMode dropMode, CSVRender::Object* object)
{ {
const osg::Vec3d& point = object->getPosition().asVec3(); const osg::Vec3d& point = object->getPosition().asVec3();
osg::ref_ptr<osg::Group> objectNode = object->getRootNode();
osg::Node::NodeMask oldMask = objectNode->getNodeMask();
objectNode->setNodeMask(SceneUtil::Mask_Disabled);
osg::Vec3d start = point; osg::Vec3d start = point;
osg::Vec3d end = point; osg::Vec3d end = point;
@ -727,20 +725,15 @@ void CSVRender::InstanceMode::dropInstance(DropMode dropMode, CSVRender::Object*
object->setEdited (Object::Override_Position); object->setEdited (Object::Override_Position);
position.pos[2] = intersection.getWorldIntersectPoint().z(); position.pos[2] = intersection.getWorldIntersectPoint().z();
object->setPosition(position.pos); object->setPosition(position.pos);
objectNode->setNodeMask(oldMask);
return; return;
} }
objectNode->setNodeMask(oldMask);
} }
float CSVRender::InstanceMode::getDropHeight(DropMode dropMode, CSVRender::Object* object) float CSVRender::InstanceMode::getDropHeight(DropMode dropMode, CSVRender::Object* object)
{ {
const osg::Vec3d& point = object->getPosition().asVec3(); const osg::Vec3d& point = object->getPosition().asVec3();
osg::ref_ptr<osg::Group> objectNode = object->getRootNode(); osg::ref_ptr<osg::Group> objectNode = object->getRootNode();
osg::Node::NodeMask oldMask = objectNode->getNodeMask();
objectNode->setNodeMask(SceneUtil::Mask_Disabled);
osg::Vec3d start = point; osg::Vec3d start = point;
osg::Vec3d end = point; osg::Vec3d end = point;
@ -763,11 +756,9 @@ float CSVRender::InstanceMode::getDropHeight(DropMode dropMode, CSVRender::Objec
osgUtil::LineSegmentIntersector::Intersection intersection = *it; osgUtil::LineSegmentIntersector::Intersection intersection = *it;
ESM::Position position = object->getPosition(); ESM::Position position = object->getPosition();
float dropHeight = intersection.getWorldIntersectPoint().z(); float dropHeight = intersection.getWorldIntersectPoint().z();
objectNode->setNodeMask(oldMask);
return position.pos[2] - dropHeight; return position.pos[2] - dropHeight;
} }
objectNode->setNodeMask(oldMask);
return 0.0f; return 0.0f;
} }
@ -801,6 +792,19 @@ void CSVRender::InstanceMode::handleDropMethod(DropMode dropMode, QString comman
CSMWorld::CommandMacro macro (undoStack, commandMsg); CSMWorld::CommandMacro macro (undoStack, commandMsg);
std::vector<osg::Node::NodeMask> oldMasks;
for(osg::ref_ptr<TagBase> tag: selection)
{
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (tag.get()))
{
osg::ref_ptr<osg::Group> objectNode = objectTag->mObject->getRootNode();
oldMasks.emplace_back(objectNode->getNodeMask());
objectNode->setNodeMask(SceneUtil::Mask_Disabled);
}
}
try
{
switch (dropMode) switch (dropMode)
{ {
case Terrain: case Terrain:
@ -838,3 +842,19 @@ void CSVRender::InstanceMode::handleDropMethod(DropMode dropMode, QString comman
break; break;
} }
} }
catch (const std::exception& e)
{
Log(Debug::Error) << "Error in dropping instance: " << e.what();
}
int counter = 0;
for(osg::ref_ptr<TagBase> tag: selection)
{
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (tag.get()))
{
osg::ref_ptr<osg::Group> objectNode = objectTag->mObject->getRootNode();
objectNode->setNodeMask(oldMasks[counter]);
counter++;
}
}
}