SimpleEntityVisualization::SimpleEntityVisualization(EmberEntity& entity, Ogre::SceneNode* sceneNode) : mEntity(entity), mSceneNode(sceneNode), mErisEntityBoundingBox(OGRE_NEW Ogre::OOBBWireBoundingBox()), mBboxConnection(entity.observe("bbox", sigc::mem_fun(*this, &SimpleEntityVisualization::entity_BboxChanged))), mScaleConnection(entity.observe("scale", sigc::mem_fun(*this, &SimpleEntityVisualization::entity_BboxChanged))) { mVelocityArrowEntity = sceneNode->getCreator()->createEntity("common/primitives/model/arrow.mesh"); mVelocitySceneNode = sceneNode->getParentSceneNode()->createChildSceneNode(); mVelocitySceneNode->attachObject(mVelocityArrowEntity); mVelocitySceneNode->setScale(0.5, 0.5, 0.5); try { auto materialPtr = Ogre::MaterialManager::getSingleton().getByName(BboxMaterialName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); if (materialPtr) { mErisEntityBoundingBox->setMaterial(materialPtr); } } catch (const std::exception& ex) { S_LOG_FAILURE("Error when setting Ogre material for bounding box."); OGRE_DELETE mErisEntityBoundingBox; mErisEntityBoundingBox = nullptr; throw Exception("Error when setting Ogre material for bounding box."); } mSceneNode->attachObject(mErisEntityBoundingBox); mErisEntityBoundingBox->setVisible(true); updateBbox(); updatePositionAndOrientation(); mEntity.Moved.connect(sigc::mem_fun(*this, &SimpleEntityVisualization::entity_Moved)); }
void GraphAggRenderer::fillPolygon(Point *points, int pointCount, Color *color) { //qDebug() << QString("%1").arg(__PRETTY_FUNCTION__); agg::path_storage &ps = m_data->ps; unsigned idx = ps.start_new_path(); ps.move_to(points[0].x(), points[0].y()); for (int i = 1; i < pointCount; ++i) { ps.line_to(points[i].x(), points[i].y()); } ps.end_poly(agg::path_flags_close); // 保存属性 push_attr(); m_data->as.add(path_attributes(cur_attr(), idx)); //保存idx值 path_attributes attr = cur_attr(); attr.stroke_flag = false; attr.fill_flag = true; attr.fill_color = agg::rgba8(color->red(), color->green(), color->blue(), color->alpha()); attr.index = idx; m_data->as[m_data->as.size() -1] = attr; pop_attr(); updateBbox(); }
void GraphAggRenderer::fillEllipse(Point *center, float width, float height, Color *color) { //qDebug() << QString("%1").arg(__PRETTY_FUNCTION__); agg::ellipse e1; e1.init(center->x(), center->y(), width, height, 100); agg::path_storage &ps = m_data->ps; unsigned idx = ps.start_new_path(); ps.concat_path(e1); // 保存属性 push_attr(); m_data->as.add(path_attributes(cur_attr(), idx)); //保存idx值 path_attributes attr = cur_attr(); attr.stroke_flag = false; attr.fill_flag = true; attr.fill_color = agg::rgba8(color->red(), color->green(), color->blue(), color->alpha()); attr.index = idx; m_data->as[m_data->as.size() -1] = attr; pop_attr(); updateBbox(); }
void GraphAggRenderer::fillRect(Point *ulCorner, Point *lrCorner, Color *color) { //qDebug() << QString("%1").arg(__PRETTY_FUNCTION__); agg::path_storage &ps = m_data->ps; unsigned idx = ps.start_new_path(); ps.move_to(ulCorner->x(), ulCorner->y()); ps.line_to(lrCorner->x(), ulCorner->y()); ps.line_to(lrCorner->x(), lrCorner->y()); ps.line_to(ulCorner->x(), lrCorner->y()); ps.line_to(ulCorner->x(), ulCorner->y()); ps.end_poly(); // 保存属性 push_attr(); m_data->as.add(path_attributes(cur_attr(), idx)); //保存idx值 path_attributes attr = cur_attr(); attr.stroke_flag = false; attr.fill_flag = true; attr.fill_color = agg::rgba8(color->red(), color->green(), color->blue(), color->alpha()); attr.index = idx; m_data->as[m_data->as.size() -1] = attr; pop_attr(); updateBbox(); }
SimpleEntityVisualization::SimpleEntityVisualization(EmberEntity& entity, Ogre::SceneNode* sceneNode) : mEntity(entity), mSceneNode(sceneNode), mErisEntityBoundingBox(OGRE_NEW Ogre::OOBBWireBoundingBox()), mBboxConnection(entity.observe("bbox", sigc::mem_fun(*this, &SimpleEntityVisualization::entity_BboxChanged))) { try { mErisEntityBoundingBox->setMaterial(BboxMaterialName); } catch (const std::exception& ex) { S_LOG_FAILURE("Error when setting Ogre material for bounding box."); OGRE_DELETE mErisEntityBoundingBox; mErisEntityBoundingBox = 0; throw Exception("Error when setting Ogre material for bounding box."); } mSceneNode->attachObject(mErisEntityBoundingBox); mErisEntityBoundingBox->setVisible(true); updateBbox(); updatePositionAndOrientation(); mEntity.Moved.connect(sigc::mem_fun(*this, &SimpleEntityVisualization::entity_Moved)); }
void SimpleEntityVisualization::entity_BboxChanged(const Atlas::Message::Element& /*attributeValue*/) { updateBbox(); }
void GraphAggRenderer::drawString(const QString &text, Point *pos, int alignment, Color *color) { if (text.isEmpty()) return; //qDebug() << QString("%1").arg(__PRETTY_FUNCTION__); agg::path_storage &ps = m_data->ps; unsigned idx = ps.start_new_path(); // 绘制文本 font_manager_type *fman = get_fman(); double x = pos->x(); double y = pos->y(); wchar_t *buffer = new wchar_t[text.size() + 1]; text.toWCharArray(buffer); buffer[text.size()] = NULL; //qDebug() << text; const wchar_t *p = buffer;//L"this is a deom."; while (*p) { //qDebug() << QString(*p); const agg::glyph_cache* glyph = fman->glyph(*p); if (glyph) { //qDebug() << QString("good"); fman->init_embedded_adaptors(glyph, x, y); ps.concat_path(fman->path_adaptor()); /* cc_pa_type ccpath(fman->path_adaptor()); cs_cc_pa_type csccpath(ccpath); //ct_cs_cc_pa_type ctpath(csccpath, transform); //ras.add_path(ctpath); ps.concat_path(csccpath); */ x += glyph->advance_x; y += glyph->advance_y; //qDebug() << QString("%1,%2").arg(x).arg(y); } else { //qDebug() << QString("bad"); } ++p; } delete []buffer; // 保存属性 push_attr(); m_data->as.add(path_attributes(cur_attr(), idx)); //保存idx值 path_attributes attr = cur_attr(); attr.stroke_flag = true; attr.fill_flag = false; attr.fill_color = agg::rgba8(color->red(), color->green(), color->blue(), color->alpha()); attr.index = idx; m_data->as[m_data->as.size() -1] = attr; pop_attr(); updateBbox(); }
////////////////////////////////////////////////////////////////////////////// // // beginTraversal - have the base class render the passed scene graph, // then render highlights for our selection node. // void SoBoxHighlightRenderAction::apply(SoNode *renderRoot) // ////////////////////////////////////////////////////////////////////////////// { // Render the scene SoGLRenderAction::apply(renderRoot); // Render the highlight? if (! hlVisible) return; // Is our cached path still valid? if ((selPath == NULL) || (selPath->getHead() != renderRoot) || (! selPath->getTail()->isOfType(SoSelection::getClassTypeId()))) { // Find the selection node under the render root static SoSearchAction *sa1 = NULL; if (sa1 == NULL) sa1 = new SoSearchAction; else sa1->reset(); sa1->setFind(SoSearchAction::TYPE); sa1->setInterest(SoSearchAction::FIRST); sa1->setType(SoSelection::getClassTypeId()); sa1->apply(renderRoot); // Cache this path if (selPath != NULL) selPath->unref(); selPath = sa1->getPath(); if (selPath != NULL) { selPath = selPath->copy(); selPath->ref(); } } if (selPath != NULL) { // Make sure something is selected SoSelection *sel = (SoSelection *) selPath->getTail(); if (sel->getNumSelected() == 0) return; // Keep the length from the root to the selection // as an optimization so we can reuse this data int reusablePathLength = selPath->getLength(); // For each selection path, create a new path rooted under our // localRoot for (int j = 0; j < sel->getNumSelected(); j++) { // Continue the path down to the selected object. // No need to deal with p[0] since that is the sel node. SoFullPath *p = (SoFullPath *) sel->getPath(j); SoNode *pathTail = p->getTail(); if ( pathTail->isOfType(SoBaseKit::getClassTypeId())) { // Find the last nodekit on the path. SoNode *kitTail = ((SoNodeKitPath *)p)->getTail(); // Extend the selectionPath until it reaches this last kit. SoFullPath *fp = (SoFullPath *) p; int k = 0; do { selPath->append(fp->getIndex(++k)); } while ( fp->getNode(k) != kitTail ); } else { for (int k = 1; k < p->getLength(); k++) selPath->append(p->getIndex(k)); } // Find the camera used to render the selected object and // insert it into the highlight graph as the first child SoNode *camera; static SoSearchAction *sa2 = NULL; if (sa2 == NULL) sa2 = new SoSearchAction; else sa2->reset(); sa2->setFind(SoSearchAction::TYPE); sa2->setInterest(SoSearchAction::LAST); sa2->setType(SoCamera::getClassTypeId()); sa2->apply(selPath); camera =(sa2->getPath() == NULL ? NULL : sa2->getPath()->getTail()); if (camera != NULL) localRoot->insertChild(camera, 0); // Get the bounding box of the object and update the // local highlight graph updateBbox(selPath); // Make sure the box has some size if ((cube->width.getValue() == 0) && (cube->height.getValue() == 0) && (cube->depth.getValue() == 0)) { #ifdef DEBUG SoDebugError::postWarning("SoBoxHighlightRenderAction::apply", "selected object has no bounding box - no highlight rendered"); #endif } else { // Render the highlight SoGLRenderAction::apply(localRoot); } // Restore selPath for reuse selPath->truncate(reusablePathLength); // Remove the camera for the next path if (camera != NULL) localRoot->removeChild(0); } } }