void NavigationCell::debugDrawClassification( Ogre::Vector3 start, Ogre::Vector3 end ) { Ogre::Root *root = Ogre::Root::getSingletonPtr(); Ogre::SceneManager* mgr = root->getSceneManager( "SceneManagerInstance" ); Ogre::ManualObject* debug; Ogre::SceneNode* node; if( mgr->hasManualObject( "debugDrawClassification" ) ) debug = mgr->getManualObject( "debugDrawClassification" ); else { debug = mgr->createManualObject( "debugDrawClassification" ); node = mgr->getRootSceneNode()->createChildSceneNode(); node->attachObject( debug ); node->translate( 0, 1, 0 ); debug->setQueryFlags( 0 ); debug->setRenderQueueGroup( Ogre::RENDER_QUEUE_OVERLAY ); } debug->begin( "debug/blue", Ogre::RenderOperation::OT_LINE_LIST ); debug->position( start ); debug->position( end ); debug->end(); // debugDrawCell( debug, "debug/yellow", "debug/blue" ); }
void Chart::indicator(const Ogre::Real chartX, const Ogre::Real chartY) { const std::string chartXString = Ogre::StringConverter::toString(chartX).substr(0, std::min(Ogre::StringConverter::toString(chartX).size(), (std::string::size_type)4)); const std::string chartYString = Ogre::StringConverter::toString(chartY).substr(0, std::min(Ogre::StringConverter::toString(chartY).size(), (std::string::size_type)3)); const Ogre::Vector3 x = chartToScreen( Ogre::Vector2(chartX, mMin.y) ); const Ogre::Vector3 y = chartToScreen( Ogre::Vector2(mMin.x, chartY) ); const Ogre::ColourValue magenta(1,0,1); // indicator Ogre::ManualObject *chartIndicator = mSceneMgr->createManualObject(); chartIndicator->setUseIdentityProjection(true); chartIndicator->setUseIdentityView(true); chartIndicator->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); chartIndicator->setBoundingBox(Ogre::AxisAlignedBox::BOX_INFINITE); chartIndicator->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_STRIP); chartIndicator->position( x ); chartIndicator->colour( magenta ); chartIndicator->position( chartToScreen( Ogre::Vector2(chartX, chartY) ) ); chartIndicator->colour( magenta ); chartIndicator->position( y ); chartIndicator->colour( magenta ); chartIndicator->end(); // text of values on the sides of the axes if(first) { TextRenderer::getSingleton().addTextBox("txt6" + rndIDString, chartXString, x.x - 0.01 * chartXString.size(), x.y - 0.035, 20, 20, magenta); TextRenderer::getSingleton().addTextBox("txt7" + rndIDString, chartYString, y.x - 0.035 - 0.01 * chartYString.size(), y.y - 0.0025, 20, 20, magenta); first = false; } else { TextRenderer::getSingleton().removeTextBox("txt6" + rndIDString); TextRenderer::getSingleton().removeTextBox("txt7" + rndIDString); TextRenderer::getSingleton().addTextBox("txt6" + rndIDString, chartXString, x.x - 0.01 * chartXString.size(), x.y - 0.035, 20, 20, magenta); TextRenderer::getSingleton().addTextBox("txt7" + rndIDString, chartYString, y.x - 0.035 - 0.01 * chartYString.size(), y.y - 0.0025, 20, 20, magenta); } if (mChartIndicator) { mChartSceneNode->detachObject(mChartIndicator); mSceneMgr->destroyManualObject(mChartIndicator); } mChartIndicator = chartIndicator; mChartSceneNode->attachObject(mChartIndicator); mChartSceneNode->needUpdate(); }
void NavigationCell::debugDrawCellAndNeigbours() { Ogre::Root *root = Ogre::Root::getSingletonPtr(); Ogre::SceneManager* mgr = root->getSceneManager( "SceneManagerInstance" ); Ogre::ManualObject* debug; Ogre::SceneNode* debugNode; if( mgr->hasSceneNode( "debugDrawNode" ) ) { debugNode = mgr->getSceneNode( "debugDrawNode" ); } else { debugNode = mgr->getRootSceneNode()->createChildSceneNode( "debugDrawNode" ); debugNode->translate( 0, 1, 0 ); // Move up slightly to see lines better. } if( mgr->hasManualObject( "debugDraw" ) ) debug = mgr->getManualObject( "debugDraw" ); else { debug = mgr->createManualObject( "debugDraw" ); debugNode->attachObject( debug ); debug->setQueryFlags( 0 ); debug->setRenderQueueGroup( Ogre::RENDER_QUEUE_OVERLAY ); } for( int i = 0; i < 3; i++ ) { if( mLinks[i] ) { debug->begin( "debug/blue", Ogre::RenderOperation::OT_LINE_STRIP ); debug->position( mLinks[i]->mVertices[0] ); debug->position( mLinks[i]->mVertices[1] ); debug->position( mLinks[i]->mVertices[2] ); debug->position( mLinks[i]->mVertices[0] ); debug->end(); } } debug->begin( "debug/yellow", Ogre::RenderOperation::OT_LINE_STRIP ); debug->position( mVertices[0].x, mVertices[0].y+1, mVertices[0].z ); debug->position( mVertices[1].x, mVertices[1].y+1, mVertices[1].z ); debug->position( mVertices[2].x, mVertices[2].y+1, mVertices[2].z ); debug->position( mVertices[0].x, mVertices[0].y+1, mVertices[0].z ); debug->end(); }
void NavigationMesh::setShow( bool show ) { Ogre::Root *root = Ogre::Root::getSingletonPtr(); Ogre::SceneManager* mgr = root->getSceneManager( "SceneManagerInstance" ); Ogre::ManualObject* debug; Ogre::SceneNode* debugNode; mShow = show; if( mgr->hasSceneNode( "debugDrawNode2" ) ) { debugNode = mgr->getSceneNode( "debugDrawNode2" ); } else { debugNode = mgr->getRootSceneNode()->createChildSceneNode( "debugDrawNode2" ); debugNode->translate( 0, 1, 0 ); // Move up slightly to see lines better. } if( mgr->hasManualObject( "debugDraw2" ) ) debug = mgr->getManualObject( "debugDraw2" ); else { debug = mgr->createManualObject( "debugDraw2" ); debugNode->attachObject( debug ); debug->setQueryFlags( 0 ); debug->setRenderQueueGroup( Ogre::RENDER_QUEUE_OVERLAY ); } if( !mShow ) { mgr->destroyManualObject( debug ); return; } for( CellVector::iterator i = mCells.begin(); i != mCells.end(); i++ ) { i->debugDrawCell( debug, "debug/yellow", "debug/blue" ); } return; }
Ogre::SceneNode * Chart::attachTo(Ogre::SceneManager &sceneMgr) { mSceneMgr = &sceneMgr; if (mLineNames.size() < 3) { OGRE_EXCEPT(Ogre::Exception::ERR_INVALID_STATE, "I need exactly three line names. Yeah, it\'s hardcoded ;)", "Chart::attachTo()"); } Ogre::LogManager::getSingletonPtr()->logMessage("mpoints: " + Ogre::StringConverter::toString(mPoints.size())); Ogre::LogManager::getSingletonPtr()->logMessage("msize: " + Ogre::StringConverter::toString(mSize)); Ogre::LogManager::getSingletonPtr()->logMessage("mchartunitstep: " + Ogre::StringConverter::toString(mChartUnitStep)); Ogre::LogManager::getSingletonPtr()->logMessage("mmax: " + Ogre::StringConverter::toString(mMax)); Ogre::LogManager::getSingletonPtr()->logMessage("mmin: " + Ogre::StringConverter::toString(mMin)); // chart quad bg Ogre::ManualObject *chartQuad = sceneMgr.createManualObject(); chartQuad->setUseIdentityProjection(true); chartQuad->setUseIdentityView(true); chartQuad->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); chartQuad->setBoundingBox(Ogre::AxisAlignedBox::BOX_INFINITE); chartQuad->begin("Chart/Background", Ogre::RenderOperation::OT_TRIANGLE_LIST); chartQuad->position(mOffset.x, mOffset.y, 0.5); chartQuad->position(mOffset.x + mSize.x, mOffset.y, 0.5); chartQuad->position(mOffset.x + mSize.x, mOffset.y + mSize.y, 0.5); chartQuad->position(mOffset.x, mOffset.y + mSize.y, 0.5); chartQuad->position(mOffset.x, mOffset.y, 0.5); chartQuad->position(mOffset.x + mSize.x, mOffset.y + mSize.y, 0.5); chartQuad->end(); // chart y axis Ogre::ManualObject *chartAxisY = sceneMgr.createManualObject(); chartAxisY->setUseIdentityProjection(true); chartAxisY->setUseIdentityView(true); chartAxisY->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); chartAxisY->setBoundingBox(Ogre::AxisAlignedBox::BOX_INFINITE); chartAxisY->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST); chartAxisY->position(mOffset.x + mPadding.x, mOffset.y + mSize.y - 0.02, 0.0); chartAxisY->colour( 0.7, 0.7, 0.7 ); chartAxisY->position(mOffset.x + mPadding.x, mOffset.y + 0.02, 0.0); chartAxisY->colour( 0.7, 0.7, 0.7 ); chartAxisY->end(); // chart x axis Ogre::ManualObject *chartAxisX = sceneMgr.createManualObject(); chartAxisX->setUseIdentityProjection(true); chartAxisX->setUseIdentityView(true); chartAxisX->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); chartAxisX->setBoundingBox(Ogre::AxisAlignedBox::BOX_INFINITE); chartAxisX->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST); chartAxisX->position(mOffset.x + 0.02, mOffset.y + mPadding.y, 0.0); chartAxisX->colour( 0.7, 0.7, 0.7 ); chartAxisX->position(mOffset.x + mSize.x - 0.02, mOffset.y + mPadding.y, 0.0); chartAxisX->colour( 0.7, 0.7, 0.7 ); chartAxisX->end(); // lines const Ogre::ColourValue colours[] = { Ogre::ColourValue(1.0, 0.2, 0.2), Ogre::ColourValue(0.0, 0.9, 0.0), Ogre::ColourValue(0.2, 0.2, 1.0) }; Ogre::ManualObject *lines = sceneMgr.createManualObject(); lines->setUseIdentityProjection(true); lines->setUseIdentityView(true); lines->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); lines->setBoundingBox(Ogre::AxisAlignedBox::BOX_INFINITE); lines->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_STRIP); for (std::vector<ChartPointsVector>::const_iterator it = mPoints.begin(); it != mPoints.end(); ++it) { for (ChartPointsVector::const_iterator jt = it->begin(); jt != it->end(); ++jt) { lines->position(chartToScreen(*jt)); lines->colour(colours[it - mPoints.begin()]); } } lines->end(); // caption text const Ogre::Real rndID = Ogre::Math::RangeRandom(0, 9999999999) + Ogre::Math::RangeRandom(0, 9999999999); TextRenderer::getSingleton().addTextBox("txt0" + Ogre::StringConverter::toString(rndID+ Ogre::Math::RangeRandom(0, 999999)), mCaption, mOffset.x + mSize.x * 0.40, mOffset.y + mSize.y, 100, 20, Ogre::ColourValue::Black); // text above the lines TextRenderer::getSingleton().addTextBox("txt1" + Ogre::StringConverter::toString(rndID+ Ogre::Math::RangeRandom(0, 999999)), mLineNames[0], mOffset.x + mPadding.x + 0.0025, mOffset.y + mSize.y - mPadding.y + 0.04, 100, 20, colours[0]); TextRenderer::getSingleton().addTextBox("txt2" + Ogre::StringConverter::toString(rndID+ Ogre::Math::RangeRandom(0, 999999)), mLineNames[1], mOffset.x + mPadding.x + 0.0025 + (mSize.x - mPadding.x * 2.0) * 0.35, mOffset.y + mSize.y - mPadding.y + 0.04, 100, 20, colours[1]); TextRenderer::getSingleton().addTextBox("txt3" + Ogre::StringConverter::toString(rndID+ Ogre::Math::RangeRandom(0, 999999)), mLineNames[2], mOffset.x + mPadding.x + 0.0025 + (mSize.x - mPadding.x * 2.0) * 0.75, mOffset.y + mSize.y - mPadding.y + 0.04, 100, 20, colours[2]); // text on y axis (1) TextRenderer::getSingleton().addTextBox("txt4" + Ogre::StringConverter::toString(rndID+ Ogre::Math::RangeRandom(0, 999999)), "1", mOffset.x + mPadding.x - 0.02, mOffset.y + mSize.y - mPadding.y, 20, 20, Ogre::ColourValue::Black); // text on x axis Ogre::Real rndID2 = Ogre::Math::RangeRandom(0, 9999999999) + Ogre::Math::RangeRandom(0, 9999999999); for (std::vector<ChartPointsVector>::const_iterator it = mPoints.begin(); it != mPoints.end(); ++it) { Ogre::Real rndID3 = Ogre::Math::RangeRandom(0, 9999999999) + Ogre::Math::RangeRandom(0, 9999999999); for (ChartPointsVector::const_iterator jt = it->begin(); jt != it->end(); ++jt) { const Ogre::Real rndID4 = Ogre::Math::RangeRandom(0, 9999999999) + Ogre::Math::RangeRandom(0, 9999999999); const Ogre::Vector3 chartVec = chartToScreen(*jt); const std::string xString = Ogre::StringConverter::toString(jt->x).substr(0, std::min(Ogre::StringConverter::toString(jt->x).size(), (std::string::size_type)3)); TextRenderer::getSingleton().addTextBox("txt100" + Ogre::StringConverter::toString(rndID2) + Ogre::StringConverter::toString(rndID3) + Ogre::StringConverter::toString(rndID4), xString, chartVec.x - 0.01 * xString.size(), mOffset.y + mPadding.y - 0.0025, 20, 20, Ogre::ColourValue::Black); } } mChartSceneNode = sceneMgr.getRootSceneNode()->createChildSceneNode(); mChartSceneNode->attachObject(chartQuad); mChartSceneNode->attachObject(chartAxisY); mChartSceneNode->attachObject(chartAxisX); mChartSceneNode->attachObject(lines); setVisible(false); return mChartSceneNode; }
void AerialMapDisplay::assembleScene() { if (!dirty_) { return; // nothing to update } dirty_ = false; if (!loader_) { return; // no tiles loaded, don't do anything } // get rid of old geometry, we will re-build this clearGeometry(); // iterate over all tiles and create an object for each of them const double resolution = loader_->resolution(); const std::vector<TileLoader::MapTile> &tiles = loader_->tiles(); for (const TileLoader::MapTile &tile : tiles) { const int w = tile.image().width(); const int h = tile.image().height(); // we here assume that the tiles are uniformly sized... const double tileW = w * resolution; const double tileH = h * resolution; const double origin_x = -loader_->originX() * tileW; const double origin_y = -(1 - loader_->originY()) * tileH; // determine location of this tile const double x = (tile.x() - loader_->tileX()) * tileW + origin_x; const double y = -(tile.y() - loader_->tileY()) * tileH + origin_y; // don't re-use any ids const std::string name_suffix = std::to_string(tile.x()) + "_" + std::to_string(tile.y()) + "_" + std::to_string(map_id_) + "_" + std::to_string(scene_id_); Ogre::TexturePtr tex; if (tile.hasImage()) { // one material per texture std::string matName = "material_" + name_suffix; Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create( matName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); material->setReceiveShadows(false); material->getTechnique(0)->setLightingEnabled(false); material->setDepthBias(-16.0f, 0.0f); /// @todo: what the f**k does this do? material->setCullingMode(Ogre::CULL_NONE); material->setDepthWriteEnabled(false); // create textureing unit Ogre::Pass *pass = material->getTechnique(0)->getPass(0); Ogre::TextureUnitState *tex_unit = NULL; if (pass->getNumTextureUnitStates() > 0) { tex_unit = pass->getTextureUnitState(0); } else { tex_unit = pass->createTextureUnitState(); } // only add if we have a texture for it tex = textureFromImage(tile.image(), "texture_" + name_suffix); ROS_INFO("Rendering with texture: %s", tex->getName().c_str()); tex_unit->setTextureName(tex->getName()); tex_unit->setTextureFiltering(Ogre::TFO_BILINEAR); // create an object const std::string obj_name = "object_" + name_suffix; Ogre::ManualObject *obj = scene_manager_->createManualObject(obj_name); scene_node_->attachObject(obj); // configure depth & alpha properties if (alpha_ >= 0.9998) { material->setDepthWriteEnabled(!draw_under_); material->setSceneBlending(Ogre::SBT_REPLACE); } else { material->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA); material->setDepthWriteEnabled(false); } if (draw_under_) { obj->setRenderQueueGroup(Ogre::RENDER_QUEUE_4); } else { obj->setRenderQueueGroup(Ogre::RENDER_QUEUE_MAIN); } tex_unit->setAlphaOperation(Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, alpha_); // create a quad for this tile obj->begin(material->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST); // bottom left obj->position(x, y, 0.0f); obj->textureCoord(0.0f, 0.0f); obj->normal(0.0f, 0.0f, 1.0f); // top right obj->position(x + tileW, y + tileH, 0.0f); obj->textureCoord(1.0f, 1.0f); obj->normal(0.0f, 0.0f, 1.0f); // top left obj->position(x, y + tileH, 0.0f); obj->textureCoord(0.0f, 1.0f); obj->normal(0.0f, 0.0f, 1.0f); // bottom left obj->position(x, y, 0.0f); obj->textureCoord(0.0f, 0.0f); obj->normal(0.0f, 0.0f, 1.0f); // bottom right obj->position(x + tileW, y, 0.0f); obj->textureCoord(1.0f, 0.0f); obj->normal(0.0f, 0.0f, 1.0f); // top right obj->position(x + tileW, y + tileH, 0.0f); obj->textureCoord(1.0f, 1.0f); obj->normal(0.0f, 0.0f, 1.0f); obj->end(); if (draw_under_property_->getValue().toBool()) { // render under everything else obj->setRenderQueueGroup(Ogre::RENDER_QUEUE_4); } MapObject object; object.object = obj; object.texture = tex; object.material = material; objects_.push_back(object); } } scene_id_++; }