SelectionBox::SelectionBox(const Ogre::String& name): Ogre::ManualObject(name) { setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); // when using this, ensure Depth Check is Off in the material setUseIdentityProjection(true); setUseIdentityView(true); setQueryFlags(0); }
//----------------------------------------------------------------------- void MovableObject::setRenderQueueGroupAndPriority(uint8 queueID, ushort priority) { setRenderQueueGroup(queueID); mRenderQueuePriority = queueID; mRenderQueuePrioritySet = true; }
AmbientLight::AmbientLight() { setRenderQueueGroup(RENDER_QUEUE_2); mRenderOp.vertexData = new VertexData(); mRenderOp.indexData = 0; GeomUtils::createQuad(mRenderOp.vertexData); mRenderOp.operationType = RenderOperation::OT_TRIANGLE_STRIP; mRenderOp.useIndexes = false; // Set bounding setBoundingBox(AxisAlignedBox(-10000,-10000,-10000,10000,10000,10000)); mRadius = 15000; mMatPtr = MaterialManager::getSingleton().getByName("DeferredShading/AmbientLight"); assert(mMatPtr.isNull()==false); mMatPtr->load(); //This shader needs to be aware if its running under OpenGL or DirectX. //Real depthFactor = (Root::getSingleton().getRenderSystem()->getName() == // "OpenGL Rendering Subsystem") ? 2.0 : 1.0; //mMatPtr->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant( // "depthFactor", depthFactor); }
void DynamicLines::update() { if(!mDirty) return; setRenderQueueGroup(mUse2D ? Ogre::RENDER_QUEUE_OVERLAY : Ogre::RENDER_QUEUE_MAIN); fillHardwareBuffers(); }
AmbientLight::AmbientLight() { setRenderQueueGroup(Ogre::RENDER_QUEUE_2); // Render op setup mRenderOp.vertexData = new Ogre::VertexData(); mRenderOp.indexData = 0; GeomUtils::createQuad(mRenderOp.vertexData); mRenderOp.operationType = Ogre::RenderOperation::OT_TRIANGLE_STRIP; mRenderOp.useIndexes = false; // Set bounding box (pretty much infinite) setBoundingBox(Ogre::AxisAlignedBox(-10000,-10000,-10000,10000,10000,10000)); mRadius = 15000; // Ambient lighting material mMatPtr = Ogre::MaterialManager::getSingleton().getByName("Render/AmbientLight"); assert(mMatPtr.isNull() == false); mMatPtr->load(); // Explicitly bind samplers for OpenGL if (Ogre::Root::getSingleton().getRenderSystem()->getName().find("OpenGL 3+") != Ogre::String::npos) { mMatPtr->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("Tex0", 0); mMatPtr->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("Tex1", 1); mMatPtr->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("Tex2", 2); } }
NxLine::NxLine( OperationType opType, bool UseVertexColour ) : mUseVertexColour(UseVertexColour) { initialize(opType,false); setMaterial("BaseWhiteNoLighting"); mDirty = true; setRenderQueueGroup( RENDER_QUEUE_OVERLAY - 1); // animation spline mAnimSpline = new SimpleSpline(); mAnimSpline->setAutoCalculate(true); }
//------------------------------------------------------------------------------------- SelectionBox::SelectionBox(const Ogre::String& name): Ogre::ManualObject(name) { /** Constructor\n * set projection and view identity matrix\n * not query itself\n */ setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); setUseIdentityProjection(true); setUseIdentityView(true); setQueryFlags(0); }
SelectionBox::SelectionBox(const std::string& i_name, Ogre::SceneManager& i_manager) : ManualObject(i_name) , m_scene_manager(i_manager) { setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); // when using this, ensure Depth Check is Off in the material setUseIdentityProjection(true); setUseIdentityView(true); setQueryFlags(0); m_scene_manager.getRootSceneNode()->attachObject(this); }
TerrainImpl::TerrainImpl(ETTerrain *terrain , const string& name , const String &useMovableType) : MovableObject(name) , mTerrainLoaded(false) , mIndexHandler(0) , mViewportHeight(0) , mUseMovableType(useMovableType) , m_terrain(terrain) , mInfo(0) { mOpt.maxPixelError = 3; mOpt.useLODMorph = false; mOpt.factorC = 0.0f; setRenderQueueGroup(RENDER_QUEUE_WORLD_GEOMETRY_1); }
AmbientLight::AmbientLight() { setRenderQueueGroup(Ogre::RENDER_QUEUE_2); mRenderOp.vertexData = new Ogre::VertexData(); mRenderOp.indexData = 0; GeometryUtils::createQuad(mRenderOp.vertexData); mRenderOp.operationType = Ogre::RenderOperation::OT_TRIANGLE_STRIP; mRenderOp.useIndexes = false; setBoundingBox(Ogre::AxisAlignedBox(-10000, -10000, -10000, 10000, 10000, 10000)); radius = 15000; material = Ogre::MaterialManager::getSingleton().getByName(Settings::ambientLightMaterial); assert(!material.isNull()); material->load(); }
SelectionBox::SelectionBox(const Ogre::String name, Engine *engine): Ogre::ManualObject(name), mEngine(engine), mLeft(.0f), mTop(.0f), mRight(.0f), mBottom(.0f), mVolQuery(nullptr) { /*The first function sets the render queue for the object to be the Overlay queue. The next two functions set the projection and view matrices to be the identity. Projection and view matrices are used by many rendering systems (such as OpenGL and DirectX) to define where objects go in the world. Since Ogre abstracts this away for us, we won't go into detail about what these matrices actually are or what they do. Instead what you need to know is that if you set the projection and view matrix to be the identity, as we have here, we will basically create a 2D object. When defining this object, the coordinate system changes a bit. We no longer deal with the Z axis (if you are asked for the Z axis, set the value to -1). Instead we have a new coordinate system with X and Y running from -1 to 1 inclusive. Lastly, we will set the query flags for the object to be 0, which will prevent the selection rectangle from being included in the query results.*/ setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); // when using this, ensure Depth Check is Off in the material setUseIdentityProjection(true); setUseIdentityView(true); setQueryFlags(0); { Ogre::MaterialPtr const whiteNoLignthing = Ogre::MaterialManager::getSingleton().getByName("BaseWhiteNoLighting"); Ogre::String const resName = "DynamicLines_BaseWhiteNoLighting_"+mEngine->level()->name(); mMaterial = Ogre::MaterialManager::getSingleton().getByName(resName); if(mMaterial.isNull()) { mMaterial = whiteNoLignthing->clone(resName, true, mEngine->level()->name()); mMaterial->load(); } mMaterial->setDepthCheckEnabled(false); } if(nullptr != mEngine->level()) { mEngine->level()->levelRoot()->createChildSceneNode()->attachObject(this); mVolQuery = mEngine->level()->sceneManager()->createPlaneBoundedVolumeQuery(Ogre::PlaneBoundedVolumeList()); } }
//----------------------------------------------------------------------- void SubEntity::setRenderQueueGroupAndPriority(uint8 queueID, ushort priority) { setRenderQueueGroup(queueID); mRenderQueuePrioritySet = true; mRenderQueuePriority = priority; }
void Vizi3DWorld::drawNext() { // @init load() if ( drawItr.empty() ) { return; } // Наносим на холст сразу всю битовую карту текущего элемента // Чудесный метод предоставляет нам всю необходимую информацию const auto info = *get( drawItr ); // Пробел - всегда отсутствие элемента if (info.signElement != ' ') { // Оформлять будем как стат. геометрию const std::string signInString = std::string( &info.signElement, 1 ); Ogre::StaticGeometry* staticScene = sm->createStaticGeometry( signInString + "::Vizi3DWorld" ); //staticScene->setRegionDimensions( ... ); // Создаём элемент const std::string meshName = info.noteElement.form + ".mesh"; auto e = sm->createEntity( meshName ); // Фикс для прозрачных материалов // @see http://ogre3d.org/forums/viewtopic.php?f=2&t=32172&start=0 e->setRenderQueueGroup( Ogre::RENDER_QUEUE_9 ); const std::string materialName = info.noteElement.material; if ( !materialName.empty() ) { // Заменяем материал по умолчанию const auto material = Ogre::MaterialManager::getSingleton().getByName( materialName ); #ifdef TEST_TRANSPARENT_CELL // @test Добавляем прозрачность всем материалам const auto mt = static_cast< Ogre::Material* >( material.get() ); mt->setSceneBlending( Ogre::SBT_TRANSPARENT_COLOUR ); //mt->setParameter( "set_alpha_rejection", "greater 128" ); mt->setDepthWriteEnabled( false ); mt->setDepthCheckEnabled( true ); #endif e->setMaterial( material ); e->setCastShadows( true ); } // if ( !materialName.empty() ) // Размер области const size_t N = info.bitContent.size().get<0>(); const size_t M = info.bitContent.size().get<1>(); const size_t L = info.bitContent.size().get<2>(); // Позиционируем область в мировом пространстве const float halfN = (float)N / 2.0f; const float halfM = (float)M / 2.0f; const float halfL = (float)L / 2.0f; staticScene->setOrigin( Ogre::Vector3( info.coord.get<0>() * info.scaleWorld - halfN * info.scale, info.coord.get<1>() * info.scaleWorld - halfM * info.scale, info.coord.get<2>() * info.scaleWorld - halfL * info.scale ) ); /* - Заменено на предварительную подготовку образа в load(). См. ниже. // Добавляем элемент в *область*, определяя его расположение благодаря // битовой карте области for (size_t l = 0; l < L; ++l) { for (size_t m = 0; m < M; ++m) { for (size_t n = 0; n < N; ++n) { // 3D-указатель для определения положения элемента const auto c = d::coordInt3d_t( n, m, l ); // Каждый установленный бит - признак наличия элемента в области // @todo optimize Быстрый доступ по 1D-указателю if ( info.bitContent.test( c ) ) { staticScene->addEntity( e, // положение элемента, центрируем блок позже Ogre::Vector3( (float)c.get<0>(), (float)c.get<1>(), (float)c.get<2>() ) * info.scale, Ogre::Quaternion::ZERO, Ogre::Vector3( info.scale ) ); } } // for (size_t n = 0; n < N; ++n) } // for (size_t m = 0; m < M; ++m } // for (size_t l = 0; l < L; ++l) */ // Не все элементы требуют отрисовки // @see prepareVisualBitImage() const auto content = *drawItr.mapElement()->second; const auto& alphaBI = *drawItr.tinyMap()->second.visualContent.alphaTypeBitImage; const auto& solidBI = *drawItr.tinyMap()->second.visualContent.solidTypeBitImage; assert( (alphaBI.raw().size() == solidBI.raw().size()) && "Размеры битовых образов должны совпадать." ); for (size_t l = 0; l < L; ++l) { for (size_t m = 0; m < M; ++m) { for (size_t n = 0; n < N; ++n) { // 3D-указатель для определения положения элемента const auto c = d::coordInt3d_t( n, m, l ); // Каждый установленный бит - признак наличия элемента в области // @todo optimize Быстрый доступ по 1D-указателю if ( content.test( c ) && ( solidBI.test( c ) || alphaBI.test( c ) ) ) { staticScene->addEntity( e, // положение элемента в статическом блоке (блок // центрировали раньше) Ogre::Vector3( ((float)c.get<0>() - (float)halfN), -((float)c.get<1>() - (float)halfM), -((float)c.get<2>() - (float)halfL) ) * info.scale, Ogre::Quaternion::ZERO, #ifdef TEST_VISUAL_CELL Ogre::Vector3( info.scale / 1.80f ) #else Ogre::Vector3( info.scale ) #endif ); } } // for (size_t n = 0; n < N; ++n) } // for (size_t m = 0; m < M; ++m } // for (size_t l = 0; l < L; ++l) // Строим! staticScene->build(); } // if (info.signElement != ' ') // Переводим итератор на след. элемент ++drawItr; }