diff options
Diffstat (limited to 'src/uscxml/plugins/invoker/graphics/openscenegraph/OSGInvoker.cpp')
-rw-r--r-- | src/uscxml/plugins/invoker/graphics/openscenegraph/OSGInvoker.cpp | 722 |
1 files changed, 0 insertions, 722 deletions
diff --git a/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGInvoker.cpp b/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGInvoker.cpp deleted file mode 100644 index d2bf74d..0000000 --- a/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGInvoker.cpp +++ /dev/null @@ -1,722 +0,0 @@ -/** - * @file - * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) - * @copyright Simplified BSD - * - * @cond - * This program is free software: you can redistribute it and/or modify - * it under the terms of the FreeBSD license as published by the FreeBSD - * project. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the FreeBSD license along with this - * program. If not, see <http://www.opensource.org/licenses/bsd-license>. - * @endcond - */ - -#include <boost/algorithm/string.hpp> - -#include "OSGInvoker.h" -#include "uscxml/URL.h" -#include "uscxml/UUID.h" -#include "uscxml/dom/DOMUtils.h" -#include <glog/logging.h> - -#include <osg/Shape> -#include <osg/ShapeDrawable> -#include <osg/Material> -#include <osg/Depth> - -#ifdef BUILD_AS_PLUGINS -#include <Pluma/Connector.hpp> -#endif - -#define OSG_SET_MATERIAL \ -osg::ref_ptr<osg::Material> mat = getMaterial(element); \ -if (mat) { \ - osg::ref_ptr<osg::StateSet> nodeSS = geode->getOrCreateStateSet(); \ -\ - nodeSS->setAttribute(mat.get()); \ - nodeSS->setMode( GL_BLEND, osg::StateAttribute::ON ); \ -/* nodeSS->setRenderingHint( osg::StateSet::TRANSPARENT_BIN ); \ - nodeSS->setMode( GL_DEPTH_TEST, osg::StateAttribute::ON ); \ - osg::Depth* depth = new osg::Depth; \ - depth->setWriteMask( false ); \ - nodeSS->setAttributeAndModes( depth, osg::StateAttribute::ON ); \ - nodeSS->setMode( GL_LIGHTING, osg::StateAttribute::OFF );*/ \ -} - -#define OSG_SET_COLOR \ -bool validColor = true; \ -osg::Vec4 color = getColor(element, "color", validColor); \ -if (validColor) \ -drawable->setColor(color); - -namespace uscxml { - -#ifdef BUILD_AS_PLUGINS -PLUMA_CONNECTOR -bool pluginConnect(pluma::Host& host) { - host.add( new OSGInvokerProvider() ); - return true; -} -#endif - -#define OSG_TAG_HANDLE(tagName, procFunc) \ -} else if (iequals(LOCALNAME(childElem), tagName) && \ - validChildren.find(tagName) != validChildren.end()) { \ - procFunc(childElem);\ - - -OSGInvoker::OSGInvoker() { -} - -OSGInvoker::~OSGInvoker() { -}; - -boost::shared_ptr<InvokerImpl> OSGInvoker::create(InterpreterImpl* interpreter) { - boost::shared_ptr<OSGInvoker> invoker = boost::shared_ptr<OSGInvoker> (new OSGInvoker()); - invoker->_interpreter = interpreter; - return invoker; -} - -Data OSGInvoker::getDataModelVariables() { - Data data; - return data; -} - -void OSGInvoker::send(const SendRequest& req) { - if (iequals(req.name, "intersect")) { - - } -} - -void OSGInvoker::cancel(const std::string sendId) { -} - -void OSGInvoker::invoke(const InvokeRequest& req) { - tthread::lock_guard<tthread::recursive_mutex> lock(_mutex); - - setupColors(); - -// std::cout << req.dom; - - // register default event handlers - Arabica::DOM::Events::EventTarget<std::string> evTarget = Arabica::DOM::Events::EventTarget<std::string>(req.dom); - evTarget.addEventListener("DOMSubtreeModified", *this, false); - evTarget.addEventListener("DOMNodeInserted", *this, false); - evTarget.addEventListener("DOMNodeRemoved", *this, false); - evTarget.addEventListener("DOMAttrModified", *this, false); - - std::set<std::string> validChilds; - validChilds.insert("display"); - - // this is somewhat unfortunate, if content contains a single child, we will get that, otherwise its parent (<content>) - if (iequals(LOCALNAME(req.dom), "display")) { - processChildren(validChilds, req.dom.getParentNode()); - } else { - processChildren(validChilds, req.dom); - } -} - -void OSGInvoker::setupColors() { - _colors["red"] = osg::Vec4(1.0, 0.0, 0.0, 1.0); - _colors["cyan"] = osg::Vec4(0.0, 1.0, 1.0, 1.0); - _colors["blue"] = osg::Vec4(0.0, 0.0, 1.0, 1.0); - _colors["darkblue"] = osg::Vec4(0.0, 0.0, 0.625, 1.0); - _colors["lightblue"] = osg::Vec4(0.675, 0.84375,0.89844,1.0); - _colors["purple"] = osg::Vec4(0.5, 0.0, 0.5, 1.0); - _colors["yellow"] = osg::Vec4(1.0, 1.0, 0.0, 1.0); - _colors["lime"] = osg::Vec4(0.0, 1.0, 0.0, 1.0); - _colors["magenta"] = osg::Vec4(1.0, 0.0, 1.0, 1.0); - _colors["white"] = osg::Vec4(1.0, 1.0, 1.0, 1.0); - _colors["silver"] = osg::Vec4(0.75, 0.75, 0.75, 1.0); - _colors["grey"] = osg::Vec4(0.5, 0.5, 0.5, 1.0); - _colors["gray"] = osg::Vec4(0.5, 0.5, 0.5, 1.0); - _colors["black"] = osg::Vec4(0.0, 0.0, 0.0, 1.0); - _colors["orange"] = osg::Vec4(1.0, 0.644, 0.0, 1.0); - _colors["brown"] = osg::Vec4(0.644, 0.164, 0.164, 1.0); - _colors["maroon"] = osg::Vec4(0.5, 0.0, 0.0, 1.0); - _colors["green"] = osg::Vec4(0.0, 0.5, 0.0, 1.0); - _colors["olive"] = osg::Vec4(0.5, 0.5, 0.0, 1.0); -} - -void OSGInvoker::runOnMainThread() { - _displays_t::iterator dispIter = _displays.begin(); - if (_mutex.try_lock()) { - while(dispIter != _displays.end()) { - dispIter->second->osgViewer::ViewerBase::frame(); - dispIter++; - } - _mutex.unlock(); - } -} - -void OSGInvoker::handleEvent(Arabica::DOM::Events::Event<std::string>& event) { -// std::cout << "Handling Event!" << std::endl; - Arabica::DOM::Node<std::string> node(event.getTarget()); - if (_nodes.find(node) != _nodes.end()) { - osg::ref_ptr<osg::Node> osgNode = _nodes[node]; - if (false) { - } else if (iequals(LOCALNAME(node), "rotation")) { - updateRotation(osgNode, event); - } - } -} - -void OSGInvoker::processDisplay(const Arabica::DOM::Element<std::string>& element) { -// std::cout << element << std::endl; - - if (_displays.find(element) == _displays.end()) { - - int screenId = 0; - unsigned int actualX = 0; - unsigned int actualY = 0; - unsigned int actualWidth = 0; - unsigned int actualHeight = 0; - getViewport(element, actualX, actualY, actualWidth, actualHeight, screenId); - - CompositeDisplay* compDisp = new CompositeDisplay(actualX, actualY, actualWidth, actualHeight, screenId); - _displays[element] = compDisp; - - std::set<std::string> validChilds; - validChilds.insert("viewport"); - processChildren(validChilds, element); - } -} - -void OSGInvoker::processViewport(const Arabica::DOM::Element<std::string>& element) { - if (_displays.find(element.getParentNode()) == _displays.end()) - return; - - CompositeDisplay* compDisp = _displays[element.getParentNode()]; - osgViewer::View* sceneView = new osgViewer::View(); - _views[element] = sceneView; - - osg::Group* group = new osg::Group(); - _nodes[element] = group; - sceneView->setSceneData(group); - - std::string name = (HAS_ATTR(element, "id") ? ATTR(element, "id") : UUID::getUUID()); - - unsigned int actualX = 0; - unsigned int actualY = 0; - unsigned int actualWidth = 0; - unsigned int actualHeight = 0; - - getViewport(element, actualX, actualY, actualWidth, actualHeight, compDisp); - osg::Viewport* viewPort = new osg::Viewport(actualX, actualY, actualWidth, actualHeight); - compDisp->addView(name, viewPort, sceneView); - - bool hasBGColor; - osg::Vec4 bgColor = getColor(element, "bgcolor", hasBGColor); - if (hasBGColor) { - sceneView->getCamera()->setClearColor(bgColor); - } else { - sceneView->getCamera()->setClearColor(_colors["white"]); - } - - std::set<std::string> validChilds; - validChilds.insert("camera"); - validChilds.insert("translation"); - validChilds.insert("rotation"); - validChilds.insert("scale"); - validChilds.insert("node"); - validChilds.insert("sphere"); - validChilds.insert("box"); - validChilds.insert("capsule"); - validChilds.insert("cone"); - validChilds.insert("cylinder"); - processChildren(validChilds, element); -} - -void OSGInvoker::processCamera(const Arabica::DOM::Node<std::string>& element) {} -void OSGInvoker::updateCamera(osg::ref_ptr<osg::Node> node, Arabica::DOM::Events::Event<std::string>& event) {} - -void OSGInvoker::processTranslation(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> node = _nodes[element.getParentNode()]; - - double x = 0, y = 0, z = 0; - if (HAS_ATTR(element, "x")) - x = strTo<float>(ATTR(element, "x")); - if (HAS_ATTR(element, "y")) - y = strTo<float>(ATTR(element, "y")); - if (HAS_ATTR(element, "z")) - z = strTo<float>(ATTR(element, "z")); - - osg::Matrix translate; - translate.makeTranslate(x, y, z); - - osg::MatrixTransform* transform = new osg::MatrixTransform(); - transform->setMatrix(translate); - node->asGroup()->addChild(transform); - _nodes[element] = transform; - - std::set<std::string> validChilds; - validChilds.insert("translation"); - validChilds.insert("rotation"); - validChilds.insert("scale"); - validChilds.insert("node"); - validChilds.insert("sphere"); - validChilds.insert("box"); - validChilds.insert("capsule"); - validChilds.insert("cone"); - validChilds.insert("cylinder"); - processChildren(validChilds, element); -} - -void OSGInvoker::processRotation(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> node = _nodes[element.getParentNode()]; - - osg::Matrix rotation = rotationFromElement(element); - osg::MatrixTransform* transform = new osg::MatrixTransform(); - transform->setMatrix(rotation); - node->asGroup()->addChild(transform); - _nodes[element] = transform; - - std::set<std::string> validChilds; - validChilds.insert("translation"); - validChilds.insert("rotation"); - validChilds.insert("scale"); - validChilds.insert("node"); - validChilds.insert("sphere"); - validChilds.insert("box"); - validChilds.insert("capsule"); - validChilds.insert("cone"); - validChilds.insert("cylinder"); - processChildren(validChilds, element); -} - -void OSGInvoker::updateRotation(osg::ref_ptr<osg::Node> node, Arabica::DOM::Events::Event<std::string>& event) { - osg::ref_ptr<osg::MatrixTransform> transform = static_cast<osg::MatrixTransform*>(node->asTransform()); - if (false) { - } else if (iequals(event.getType(), "DOMAttrModified")) { - osg::Matrix rotation = rotationFromElement(Arabica::DOM::Element<std::string>(Arabica::DOM::Node<std::string>(event.getTarget()))); - transform->setMatrix(rotation); - } -} - -osg::Matrix OSGInvoker::rotationFromElement(const Arabica::DOM::Element<std::string>& element) { - double pitch = 0, roll = 0, yaw = 0; - if (HAS_ATTR(element, "pitch")) { - NumAttr pitchAttr = NumAttr(ATTR(element, "pitch")); - if (iequals(pitchAttr.unit, "deg")) { - pitch = osg::DegreesToRadians(strTo<float>(pitchAttr.value)); - } else if (iequals(pitchAttr.unit, "%")) { - pitch = osg::DegreesToRadians((strTo<float>(pitchAttr.value) * 360) / 100); - } else { - pitch = strTo<float>(pitchAttr.value); - } - } - if (HAS_ATTR(element, "roll")) { - NumAttr rollAttr = NumAttr(ATTR(element, "roll")); - if (iequals(rollAttr.unit, "deg")) { - roll = osg::DegreesToRadians(strTo<float>(rollAttr.value)); - } else if (iequals(rollAttr.unit, "%")) { - roll = osg::DegreesToRadians((strTo<float>(rollAttr.value) * 360) / 100); - } else { - roll = strTo<float>(rollAttr.value); - } - } - if (HAS_ATTR(element, "yaw")) { - NumAttr yawAttr = NumAttr(ATTR(element, "yaw")); - if (iequals(yawAttr.unit, "deg")) { - yaw = osg::DegreesToRadians(strTo<float>(yawAttr.value)); - } else if (iequals(yawAttr.unit, "%")) { - yaw = osg::DegreesToRadians((strTo<float>(yawAttr.value) * 360) / 100); - } else { - yaw = strTo<float>(yawAttr.value); - } - } - - osg::Matrix rotation; - rotation.makeRotate(roll, osg::Vec3(0,1,0), // roll - pitch, osg::Vec3(1,0,0) , // pitch - yaw, osg::Vec3(0,0,1) ); // heading - - return rotation; -} - -void OSGInvoker::processScale(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> node = _nodes[element.getParentNode()]; - - double x = 1, y = 1, z = 1; - if (HAS_ATTR(element, "x")) - x = strTo<float>(ATTR(element, "x")); - if (HAS_ATTR(element, "y")) - y = strTo<float>(ATTR(element, "y")); - if (HAS_ATTR(element, "z")) - z = strTo<float>(ATTR(element, "z")); - - osg::Matrix scale; - scale.makeScale(x, y, z); - - osg::MatrixTransform* transform = new osg::MatrixTransform(); - transform->setMatrix(scale); - node->asGroup()->addChild(transform); - _nodes[element] = transform; - - std::set<std::string> validChilds; - validChilds.insert("translation"); - validChilds.insert("rotation"); - validChilds.insert("scale"); - validChilds.insert("node"); - validChilds.insert("sphere"); - validChilds.insert("box"); - validChilds.insert("capsule"); - validChilds.insert("cone"); - validChilds.insert("cylinder"); - processChildren(validChilds, element); -} - -void OSGInvoker::processNode(const Arabica::DOM::Element<std::string>& element) { - _nodes_t::iterator nodeIter = _nodes.find(element.getParentNode()); - assert(nodeIter != _nodes.end()); - - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> parent = _nodes[element.getParentNode()]; - - std::string filename; - if (HAS_ATTR(element, "src")) { - filename = ATTR(element, "src"); - - if (filename.length() > 0) { - std::string extension; - size_t extensionStart = filename.find_last_of("."); - if (extensionStart != std::string::npos) { - extension = filename.substr(extensionStart); - } - - URL srcURI(filename); - if (!srcURI.toAbsolute(_interpreter->getBaseURL(element))) { - LOG(ERROR) << "invoke element has relative src URI with no baseURI set."; - return; - } - filename = srcURI.asLocalFile(extension); - osg::ref_ptr<osg::Node> model = osgDB::readNodeFile(filename); - if (model.get()) - parent->asGroup()->addChild(model); - - } - } -} - -void OSGInvoker::processSphere(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> parent = _nodes[element.getParentNode()]; - - float radius = 1; - osg::Vec3 center(0,0,0); - - if (HAS_ATTR(element, "radius")) { - radius = strTo<float>(ATTR(element, "radius")); - } - - osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(center, radius); - osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(sphere); - osg::ref_ptr<osg::Geode> geode = new osg::Geode(); - geode->addDrawable(drawable); - - OSG_SET_COLOR; - OSG_SET_MATERIAL; - - _nodes[element] = geode; - - parent->asGroup()->addChild(geode); -} - -void OSGInvoker::updateSphere(osg::ref_ptr<osg::Node> node, Arabica::DOM::Events::Event<std::string>& event) { -} - -void OSGInvoker::processBox(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> parent = _nodes[element.getParentNode()]; - - float x = 1; - float y = 1; - float z = 1; - osg::Vec3 center(0,0,0); - - if (HAS_ATTR(element, "x")) x = strTo<float>(ATTR(element, "x")); - if (HAS_ATTR(element, "y")) y = strTo<float>(ATTR(element, "y")); - if (HAS_ATTR(element, "z")) z = strTo<float>(ATTR(element, "z")); - - osg::ref_ptr<osg::Box> box = new osg::Box(center, x, y, z); - osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(box); - osg::ref_ptr<osg::Geode> geode = new osg::Geode(); - geode->addDrawable(drawable); - - OSG_SET_COLOR; - OSG_SET_MATERIAL; - - _nodes[element] = geode; - - parent->asGroup()->addChild(geode); - -} -void OSGInvoker::updateBox(osg::ref_ptr<osg::Node> node, Arabica::DOM::Events::Event<std::string>& event) { -} -void OSGInvoker::processCapsule(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> parent = _nodes[element.getParentNode()]; - - float radius = 1; - float height = 1; - osg::Vec3 center(0,0,0); - - if (HAS_ATTR(element, "radius")) radius = strTo<float>(ATTR(element, "radius")); - if (HAS_ATTR(element, "height")) height = strTo<float>(ATTR(element, "height")); - - osg::ref_ptr<osg::Capsule> capsule = new osg::Capsule(center, radius, height); - osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(capsule); - osg::ref_ptr<osg::Geode> geode = new osg::Geode(); - geode->addDrawable(drawable); - - OSG_SET_COLOR; - OSG_SET_MATERIAL; - - _nodes[element] = geode; - parent->asGroup()->addChild(geode); -} -void OSGInvoker::updateCapsule(osg::ref_ptr<osg::Node> node, Arabica::DOM::Events::Event<std::string>& event) { -} - -void OSGInvoker::processCone(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> parent = _nodes[element.getParentNode()]; - - float radius = 1; - float height = 1; - osg::Vec3 center(0,0,0); - - if (HAS_ATTR(element, "radius")) radius = strTo<float>(ATTR(element, "radius")); - if (HAS_ATTR(element, "height")) height = strTo<float>(ATTR(element, "height")); - - osg::ref_ptr<osg::Cone> cone = new osg::Cone(center, radius, height); - osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(cone); - osg::ref_ptr<osg::Geode> geode = new osg::Geode(); - geode->addDrawable(drawable); - - OSG_SET_COLOR; - OSG_SET_MATERIAL; - - _nodes[element] = geode; - - parent->asGroup()->addChild(geode); - -} -void OSGInvoker::updateCone(osg::ref_ptr<osg::Node> node, Arabica::DOM::Events::Event<std::string>& event) { -} - -void OSGInvoker::processCylinder(const Arabica::DOM::Element<std::string>& element) { - assert(_nodes.find(element.getParentNode()) != _nodes.end()); - osg::ref_ptr<osg::Node> parent = _nodes[element.getParentNode()]; - - float radius = 1; - float height = 1; - osg::Vec3 center(0,0,0); - - if (HAS_ATTR(element, "radius")) radius = strTo<float>(ATTR(element, "radius")); - if (HAS_ATTR(element, "height")) height = strTo<float>(ATTR(element, "height")); - - osg::ref_ptr<osg::Cylinder> cylinder = new osg::Cylinder(center, radius, height); - osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(cylinder); - osg::ref_ptr<osg::Geode> geode = new osg::Geode(); - geode->addDrawable(drawable); - - OSG_SET_COLOR; - OSG_SET_MATERIAL; - - _nodes[element] = geode; - - parent->asGroup()->addChild(geode); - -} -void OSGInvoker::updateCylinder(osg::ref_ptr<osg::Node> node, Arabica::DOM::Events::Event<std::string>& event) { -} - -osg::Vec4 OSGInvoker::getColor(const Arabica::DOM::Element<std::string>& element, const std::string& attr, bool& valid) { - if (HAS_ATTR(element, attr)) { - std::string color = ATTR(element, attr); - - // is this one of the predefined colors? - if (_colors.find(color) != _colors.end()) { - valid = true; - return _colors[color]; - } - - // otherwise try to parse as rgba values - int i; - osg::Vec4 colorVec = parseVec4(color, i); - - if (i == 1) { - // only a single value was given, interpret as grey value - colorVec[1] = colorVec[2] = colorVec[0]; - colorVec[3] = 1.0; - valid = true; - return colorVec; - } - - if (i == 3) { - // three values were given, set opacity to max - colorVec[3] = 1.0; - valid = true; - return colorVec; - } - } - - // return empty reference - valid = false; - return osg::Vec4(); -} - -osg::ref_ptr<osg::Material> OSGInvoker::getMaterial(const Arabica::DOM::Element<std::string>& element) { - - osg::ref_ptr<osg::Material> nodeMat; - - // material color - bool hasMatColor; - osg::Vec4 matColor = getColor(element, "materialcolor", hasMatColor); - if (hasMatColor) { - if (!nodeMat) - nodeMat = new osg::Material; - nodeMat->setDiffuse(osg::Material::FRONT, matColor); - nodeMat->setDiffuse(osg::Material::BACK, matColor); - } - - // translucency - if (HAS_ATTR(element, "transparency")) { - std::string transparency = ATTR(element, "transparency"); - float trans = strTo<float>(transparency); - if (!nodeMat) - nodeMat = new osg::Material; - nodeMat->setTransparency(osg::Material::FRONT, trans); - nodeMat->setTransparency(osg::Material::BACK, trans); - } - - return nodeMat; -} - -osg::Vec4 OSGInvoker::parseVec4(const std::string& coeffs, int& i) { - - // otherwise try to parse as rgba values - std::string coeff; - std::stringstream coeffSS(coeffs); - - osg::Vec4 vec; - - i = 0; - while(std::getline(coeffSS, coeff, ',')) { - boost::trim(coeff); - if (coeff.length() == 0) - continue; - if (!isNumeric(coeff.c_str(), 10)) - continue; - - vec[i] = strTo<float>(coeff); - i++; - } - return vec; -} - -void OSGInvoker::processChildren(const std::set<std::string>& validChildren, const Arabica::DOM::Node<std::string>& element) { - Arabica::DOM::NodeList<std::string> childs = element.getChildNodes(); - for (int i = 0; i < childs.getLength(); ++i) { - if (childs.item(i).getNodeType() != Arabica::DOM::Node_base::ELEMENT_NODE) - continue; - Arabica::DOM::Element<std::string> childElem = Arabica::DOM::Element<std::string>(childs.item(i)); - if (false) { - OSG_TAG_HANDLE("node", processNode); - OSG_TAG_HANDLE("translation", processTranslation); - OSG_TAG_HANDLE("rotation", processRotation); - OSG_TAG_HANDLE("scale", processScale); - OSG_TAG_HANDLE("viewport", processViewport); - OSG_TAG_HANDLE("camera", processCamera); - OSG_TAG_HANDLE("display", processDisplay); - OSG_TAG_HANDLE("sphere", processSphere); - OSG_TAG_HANDLE("box", processBox); - OSG_TAG_HANDLE("cone", processCone); - OSG_TAG_HANDLE("capsule", processCapsule); - OSG_TAG_HANDLE("cylinder", processCylinder); - } else { - LOG(INFO) << "Unknown XML element " << TAGNAME(childElem); - } - } -} - -void OSGInvoker::getViewport(const Arabica::DOM::Element<std::string>& element, - unsigned int& x, - unsigned int& y, - unsigned int& width, - unsigned int& height, - CompositeDisplay* display) { - getViewport(element, x, y, width, height, display->getWidth(), display->getHeight()); - -} - -void OSGInvoker::getViewport(const Arabica::DOM::Element<std::string>& element, - unsigned int& x, - unsigned int& y, - unsigned int& width, - unsigned int& height, - int& screenId) { - - screenId = (HAS_ATTR(element, "screenId") ? strTo<int>(ATTR(element, "screenId")) : 0); - - unsigned int fullWidth = 0; - unsigned int fullHeight = 0; - CompositeDisplay::getResolution(fullWidth, fullHeight, screenId); - getViewport(element, x, y, width, height, fullWidth, fullHeight); -} - -void OSGInvoker::getViewport(const Arabica::DOM::Element<std::string>& element, - unsigned int& x, - unsigned int& y, - unsigned int& width, - unsigned int& height, - unsigned int fullWidth, - unsigned int fullHeight) { - if (HAS_ATTR(element, "x")) { - NumAttr xAttr = NumAttr(ATTR(element, "x")); - x = strTo<float>(xAttr.value); - if (iequals(xAttr.unit, "%")) - x = (x * fullWidth) / 100; - } - if (HAS_ATTR(element, "y")) { - NumAttr yAttr = NumAttr(ATTR(element, "y")); - y = strTo<float>(yAttr.value); - if (iequals(yAttr.unit, "%")) - y = (y * fullHeight) / 100; - } - if (HAS_ATTR(element, "width")) { - NumAttr widthAttr = NumAttr(ATTR(element, "width")); - width = strTo<float>(widthAttr.value); - if (iequals(widthAttr.unit, "%")) - width = (width * fullWidth) / 100; - } - if (HAS_ATTR(element, "height")) { - NumAttr heightAttr = NumAttr(ATTR(element, "height")); - height = strTo<float>(heightAttr.value); - if (iequals(heightAttr.unit, "%")) - height = (height * fullHeight) / 100; - } -} - -osgViewer::View* OSGInvoker::getView(const Arabica::DOM::Node<std::string>& element) { - Arabica::DOM::Node<std::string> curr = element; - while(curr && !iequals(LOCALNAME(curr), "viewport")) { - curr = curr.getParentNode(); - } - if (curr && _views.find(curr) != _views.end()) - return _views[curr]; - return NULL; -} - - -}
\ No newline at end of file |