亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

移動模型后面跟隨軌跡,模型和布告板之間的連線、布告板顯示中文

2019-11-14 11:55:46
字體:
來源:轉載
供稿:網友

參考地址:http://blog.csdn.net/flyingleo1981/article/details/39393821

// 畫線、布告板顯示中文if (!m_pSceneManager->hasMovableObject("RibbonTrail1", "RibbonTrail")){ Ogre::NameValuePairList params; params["numberOfChains"] = "1"; params["maxElements"] = "500"; Ogre::RibbonTrail* ribbonTrail = (Ogre::RibbonTrail*)m_pSceneManager ->createMovableObject("RibbonTrail1","RibbonTrail", &params); ribbonTrail->setTrailLength(100); ribbonTrail->setInitialColour(0, Ogre::ColourValue(128, 0, 255)); ribbonTrail->setColourChange(0, Ogre::ColourValue(0, 0, 0)); ribbonTrail->setInitialWidth(0, 0.2); m_pSceneManager->getRootSceneNode()->attachObject(ribbonTrail); Ogre::SceneNode* nodeTemp = m_pSceneManager->getRootSceneNode() ->createChildSceneNode("line"); nodeTemp->setPosition(m_pCurrentObject->getPosition()); ribbonTrail->addNode(nodeTemp); Ogre::Vector3 vt = nodeTemp->getPosition(); nodeTemp->setPosition(vt.x-10, vt.y+10, vt.z); // 顯示中文 Ogre::ColourValue textColor = Ogre::ColourValue(0.5f, 0.0f, 1.0f); Ogre::DisplayString str = Ogre::DisplayString(L"食人魔"); Ogre::MovableText* mt = new Ogre::MovableText("TXT_001", str, "SdkTrays/Caption", 1, textColor); mt->showOnTop(true); mt->setTextAlignment( Ogre::MovableText::HorizontalAlignment::H_CENTER, Ogre::MovableText::VerticalAlignment::V_ABOVE); nodeTemp->attachObject(mt);}// 移動模型跟隨軌跡if (!m_pSceneManager->hasMovableObject("RibbonTrail2", "RibbonTrail")){ Ogre::NameValuePairList params2; params2["numberOfChains"] = "2"; params2["maxElements"] = "500"; Ogre::RibbonTrail* ribbonTrail2 = (Ogre::RibbonTrail*)m_pSceneManager-> createMovableObject("RibbonTrail2","RibbonTrail", &params2); ribbonTrail2->setTrailLength(100); ribbonTrail2->setInitialColour(0, Ogre::ColourValue(128, 0, 255)); ribbonTrail2->setColourChange(0, Ogre::ColourValue(0, 0, 0)); ribbonTrail2->setInitialWidth(0, 0.3); ribbonTrail2->setWidthChange(0, 1); m_pSceneManager->getRootSceneNode()->attachObject(ribbonTrail2); ribbonTrail2->addNode(m_pCurrentObject);}

布告板顯示中文類:

/* * .h 文件 */#ifndef __MovableText_H__#define __MovableText_H__#include <Ogre.h>#include "OGRE/Overlay/OgreFont.h"#include <OGRE/Overlay/OgreFontManager.h>#include <OGRE/Overlay/OgreOverlayElement.h>namespace Ogre{ class MovableText : public MovableObject, public Renderable { public: /// 水平對齊方式 enum HorizontalAlignment { H_LEFT, ///< 左對齊 H_CENTER, ///< 居中 H_RIGHT ///< 右對齊 }; /// 垂直對齊方式 enum VerticalAlignment { V_BELOW,///< 低端對齊 V_ABOVE,///< 頂端對齊 V_CENTER///< 居中 }; PRotected: String mFontName; String mType; String mName; DisplayString mCaption; HorizontalAlignment mHorizontalAlignment; ///< 水平對齊方式 VerticalAlignment mVerticalAlignment; ///< 垂直對齊方式 ColourValue mColor; RenderOperation mRenderOp; AxisAlignedBox mAABB; LightList mLList; Real mCharHeight; Real mSpaceWidth; bool mNeedUpdate; bool mUpdateColors; bool mOnTop; Real mTimeUntilNextToggle; Real mRadius; ///< 包圍半徑 Real mAdditionalHeight; Camera* mpCam; ///< 攝像機指針 RenderWindow* mpWin; ///< 渲染窗口指針 FontPtr mpFont; ///< 字體指針 MaterialPtr mpMaterial; MaterialPtr mpBackgroundMaterial; ///< 背景材質 Vector3 mPositionOffset; Vector3 mScaleOffset; public: /// 構造函數 /// @param[in] name 標識名 /// @param[in] caption 字幕字符串 /// @param[in] fontName 字體名 /// @param[in] charHeight 字符高度 /// @param[in] colour 字符顏色 MovableText(const Ogre::String& name, const Ogre::DisplayString& caption, const Ogre::String& fontName = "BlueHighway", Ogre::Real charHeight = 1.0f, const Ogre::ColourValue& colour = Ogre::ColourValue::White); virtual ~MovableText(void); virtual void visitRenderables( Ogre::Renderable::Visitor* visitor, bool debugRenderables = false); /// 設置字體名 void setFontName(const String &fontName); /// 設置顯示字幕 void setCaption(const DisplayString &caption); /// 設置文字顏色 void setColor(const ColourValue &color); /// 設置文字高度 void setCharacterHeight(Real height); /// 設置間隔寬度 void setSpaceWidth(Real width); /// 設置文字對齊方式 void setTextAlignment(const HorizontalAlignment& horizontalAlignment, const VerticalAlignment& verticalAlignment); /// 設置 void setAdditionalHeight( Real height ); /// 是否最前方顯示 void showOnTop(bool show=true); /// void setPositionOffset(const Ogre::Vector3& offset); /// Ogre::Vector3 getPositionOffset() const { return mPositionOffset; } /// void setScaleOffset(const Ogre::Vector3& offset); /// Ogre::Vector3 getScaleOffset() const { return mScaleOffset; } /// 獲取字體名 const String& getFontName() const {return mFontName;} /// 獲取字幕字符串 const DisplayString& getCaption() const {return mCaption;} /// 獲取字體顏色 const ColourValue& getColor() const {return mColor;} /// 獲取字符高度 Real getCharacterHeight() const {return mCharHeight;} /// 獲取間隔寬度 Real getSpaceWidth() const {return mSpaceWidth;} /// Real getAdditionalHeight() const {return mAdditionalHeight;} /// 獲取是否在最前方顯示 bool getShowOnTop() const {return mOnTop;} /// 獲取包圍盒 AxisAlignedBox GetAABB(void) { return mAABB; } /// 獲取包圍半徑 Real getBoundingRadius(void) const {return mRadius;}; protected: // from MovableText, create the object void _setupGeometry(); void _updateColors(); /// 獲取世界坐標系中的變換 void getWorldTransforms(Matrix4 *xform) const; /// 獲取攝像機的視深 Real getSquaredViewDepth(const Camera *cam) const {return 0;}; /// 獲取世界坐標系中的朝向 /// @note 一直面朝攝像機 const Quaternion& getWorldOrientation(void) const; /// 獲取在世界坐標系中的坐標 const Vector3& getWorldPosition(void) const; /// 獲取包圍盒 const AxisAlignedBox& getBoundingBox(void) const {return mAABB;}; /// 獲取標識名 const String& getName(void) const {return mName;}; /// 獲取類型名 const String& getMovableType(void) const {static Ogre::String movType = "MovableText"; return movType;}; void _notifyCurrentCamera(Camera *cam); void _updateRenderQueue(RenderQueue* queue); // from renderable void getRenderOperation(RenderOperation &op); const MaterialPtr& getMaterial(void) const {assert(!mpMaterial.isNull());return mpMaterial;}; const LightList& getLights(void) const {return mLList;}; };}#endif/* * .cpp 文件 */#include "OgreMovableText.h"using namespace Ogre;#define POS_TEX_BINDING 0#define COLOUR_BINDING 1#define UNICODE_NEL 0x0085 ///< next line#define UNICODE_CR 0x000D ///< carriage return#define UNICODE_LF 0x000A ///< line feed#define UNICODE_SPACE 0x0020 ///< space#define UNICODE_ZERO 0x0030 ///< 0MovableText::MovableText(const String &name, const DisplayString &caption, const String &fontName, Real charHeight, const ColourValue &color) : mpCam(NULL) , mpWin(NULL) , mpFont(NULL) , mName(name) , mCaption(caption) , mFontName(fontName) , mCharHeight(charHeight) , mColor(color) , mType("MovableText") , mTimeUntilNextToggle(0) , mSpaceWidth(0) , mUpdateColors(true) , mOnTop(false) , mHorizontalAlignment(H_LEFT) , mVerticalAlignment(V_BELOW) , mAdditionalHeight(0.0) , mPositionOffset(Vector3::ZERO) , mScaleOffset(Vector3::UNIT_SCALE){ if (name == StringUtil::BLANK ) throw Exception(Exception::ERR_INVALIDPARAMS, "Trying to create MovableText without name", "MovableText::MovableText"); if (caption == StringUtil::BLANK ) throw Exception(Exception::ERR_INVALIDPARAMS, "Trying to create MovableText without caption", "MovableText::MovableText"); mRenderOp.vertexData = NULL; this->setFontName(mFontName); this->_setupGeometry();}MovableText::~MovableText(){ if (mRenderOp.vertexData) delete mRenderOp.vertexData;}void MovableText::setFontName(const String &fontName){ if((Ogre::MaterialManager::getSingletonPtr()->resourceExists(mName + "Material"))) { Ogre::MaterialManager::getSingleton().remove(mName + "Material"); } if (mFontName != fontName || mpMaterial.isNull() || mpFont.isNull()) { mFontName = fontName; mpFont = FontManager::getSingleton().getByName(mFontName); if (mpFont.isNull()) throw Exception(Exception::ERR_ITEM_NOT_FOUND, "Could not find font " + fontName, "MovableText::setFontName"); mpFont->load(); if (!mpMaterial.isNull()) { MaterialManager::getSingletonPtr()->remove(mpMaterial->getName()); mpMaterial.setNull(); } mpMaterial = mpFont->getMaterial()->clone(mName + "Material"); if (!mpMaterial->isLoaded()) mpMaterial->load(); mpMaterial->getTechnique(0)->getPass(0)->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA );//設置渲染通道和現有的渲染層內容混合方式 mpMaterial->getTechnique(0)->getPass(0)->setAmbient(0.5,0.0,0.0); mpMaterial->getTechnique(0)->getPass(0)->setSpecular(0.6612,0.6612,0.6612,0.5); //Ogre::ColourValue curColorValue = mpMaterial->getTechnique(0)->getPass(0)->getDiffuse(); mpMaterial->getTechnique(0)->getPass(0)->setDiffuse(0.5, 0.5, 0.5, 0);//設置透明度 //mpMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_MANUAL, 1.0, 1 ); mpMaterial->getTechnique(0)->getPass(0)->setDepthCheckEnabled(true); mpMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); mpMaterial->setLightingEnabled(false);// mpMaterial->setDepthCheckEnabled(!mOnTop);//#if 1// mpMaterial->setDepthBias(1.0,1.0);//#else// mpMaterial->setDepthBias(1.0f);//#endif// mpMaterial->setDepthWriteEnabled(mOnTop);// //// mpMaterial->setLightingEnabled(false);// //// Ogre::Pass* pass=mpMaterial->getTechnique(0)->createPass();// pass->setSceneBlending(Ogre::SceneBlendType::SBT_TRANSPARENT_ALPHA);// pass->setAmbient(0.8,0.8,0.8);//// pass->setDiffuse(0.5,0.5,0.5,1.0);// pass->setSpecular(0.6612,0.6612,0.6612,0.5);// // //pass->setEmissive(0,0,0);// //pass->setDepthCheckEnabled(true);// // pass->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA );//設置渲染通道和現有的渲染層內容混合方式// // pass->setAmbient(0.0,0.0,0.0);// //pass->setDiffuse(0.0,0.0,0.0,0.0);// //pass->setSpecular(0.6612,0.6612,0.6612,10);// // pass->setEmissive(0,0,0);// //pass->setSceneBlending( Ogre::SBT_ADD );// //pass->getTextureUnitState(0)->setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_MANUAL, 1.0, 0.1 );// /*Ogre::TextureUnitState *tex=pass->createTextureUnitState("flare.png");// tex->setName("HighLight");// tex->setColourOperationEx(Ogre::LayerBlendOperationEx::LBX_ADD);// tex->setColourOpMultipassFallback(Ogre::SceneBlendFactor::SBF_ONE,Ogre::SceneBlendFactor::SBF_ONE);// tex->setEnvironmentMap(true);*/ //unsigned short i=mpMaterial->getTechnique(0)->getPass(0)->getIndex(); //mpMaterial->getTechnique(0)->movePass(i,0); // mNeedUpdate = true; }}void MovableText::setCaption(const DisplayString &caption){ if (caption != mCaption) { mCaption = caption; mNeedUpdate = true; }}void MovableText::visitRenderables(Ogre::Renderable::Visitor* visitor, bool debugRenderables){}void MovableText::setColor(const ColourValue &color){ if (color != mColor) { mColor = color; mUpdateColors = true; }}void MovableText::setCharacterHeight(Real height){ if (height != mCharHeight) { mCharHeight = height; mSpaceWidth = 0; mNeedUpdate = true; }}void MovableText::setSpaceWidth(Real width){ if (width != mSpaceWidth) { mSpaceWidth = width; mNeedUpdate = true; }}void MovableText::setTextAlignment(const HorizontalAlignment& horizontalAlignment, const VerticalAlignment& verticalAlignment){ if(mHorizontalAlignment != horizontalAlignment) { mHorizontalAlignment = horizontalAlignment; mNeedUpdate = true; } if(mVerticalAlignment != verticalAlignment) { mVerticalAlignment = verticalAlignment; mNeedUpdate = true; }}void MovableText::setAdditionalHeight( Real height ){ if( mAdditionalHeight != height ) { mAdditionalHeight = height; mNeedUpdate = true; }}void MovableText::showOnTop(bool show){ if( mOnTop != show && !mpMaterial.isNull() ) { mOnTop = show;#if 1 mpMaterial->setDepthBias(1.0f, 1.0f);#else mpMaterial->setDepthBias(1.0f);#endif mpMaterial->setDepthCheckEnabled(!mOnTop); mpMaterial->setDepthWriteEnabled(mOnTop); }}void MovableText::_setupGeometry(){ if (mpFont.isNull()) { return; } if (mpMaterial.isNull()) { return; } size_t charlen = mCaption.size(); size_t vertexCount = charlen * 6; if (mRenderOp.vertexData) { // Removed this test as it causes problems when replacing a caption // of the same size: replacing "Hello" with "hello" // as well as when changing the text alignment //if (mRenderOp.vertexData->vertexCount != vertexCount) { delete mRenderOp.vertexData; mRenderOp.vertexData = NULL; mUpdateColors = true; } } if (!mRenderOp.vertexData) mRenderOp.vertexData = new VertexData(); mRenderOp.indexData = 0; mRenderOp.vertexData->vertexStart = 0; mRenderOp.vertexData->vertexCount = vertexCount; mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST; mRenderOp.useIndexes = false; VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration; VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding; size_t offset = 0; // create/bind positions/tex.ccord. buffer if (!decl->findElementBySemantic(VES_POSITION)) decl->addElement(POS_TEX_BINDING, offset, VET_FLOAT3, VES_POSITION); offset += VertexElement::getTypeSize(VET_FLOAT3); if (!decl->findElementBySemantic(VES_TEXTURE_COORDINATES)) decl->addElement(POS_TEX_BINDING, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES, 0); HardwareVertexBufferSharedPtr ptbuf = HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(POS_TEX_BINDING), mRenderOp.vertexData->vertexCount, HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY); bind->setBinding(POS_TEX_BINDING, ptbuf); // Colours - store these in a separate buffer because they change less often if (!decl->findElementBySemantic(VES_DIFFUSE)) decl->addElement(COLOUR_BINDING, 0, VET_COLOUR, VES_DIFFUSE); HardwareVertexBufferSharedPtr cbuf = HardwareBufferManager::getSingleton().createVertexBuffer(decl->getVertexSize(COLOUR_BINDING), mRenderOp.vertexData->vertexCount, HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY); bind->setBinding(COLOUR_BINDING, cbuf); float *pPCBuff = static_cast<float*>(ptbuf->lock(HardwareBuffer::HBL_DISCARD)); float largestWidth = 0; float left = 0 * 2.0 - 1.0; float top = -((0 * 2.0) - 1.0); // Derive space width from a capital A if (mSpaceWidth == 0) mSpaceWidth = mpFont->getGlyphaspectRatio('A') * mCharHeight * 2.0; // for calculation of AABB Ogre::Vector3 min, max, currPos; Ogre::Real maxSquaredRadius = 0; bool first = true; // Use iterator DisplayString::iterator i, iend; iend = mCaption.end(); bool newLine = true; Real len = 0.0f; Real verticalOffset = 0; switch (mVerticalAlignment) { case MovableText::V_ABOVE: verticalOffset = mCharHeight; break; case MovableText::V_CENTER: verticalOffset = 0.5*mCharHeight; break; case MovableText::V_BELOW: verticalOffset = 0; break; } // Raise the first line of the caption top += verticalOffset; for (i = mCaption.begin(); i != iend; ++i) { Font::CodePoint character = OGRE_DEREF_DISPLAYSTRING_ITERATOR(i); if (character == UNICODE_CR || character == UNICODE_NEL || character == UNICODE_LF) { top += verticalOffset * 2.0f; } } for (i = mCaption.begin(); i != iend; ++i) { Font::CodePoint character = OGRE_DEREF_DISPLAYSTRING_ITERATOR(i); if (newLine) { len = 0.0f; for (DisplayString::iterator j = i; j != iend; j++) { Font::CodePoint cr = OGRE_DEREF_DISPLAYSTRING_ITERATOR(j); if (cr == UNICODE_CR || cr == UNICODE_NEL || cr == UNICODE_LF) { break; } else if (cr == UNICODE_SPACE) // space { len += mSpaceWidth; } else { len += mpFont->getGlyphAspectRatio(character) * mCharHeight * 2.0f; } } newLine = false; } if (character == UNICODE_CR || character == UNICODE_NEL || character == UNICODE_LF) { left = 0 * 2.0 - 1.0; top -= mCharHeight * 2.0; newLine = true; continue; } if (character == UNICODE_SPACE) { // Just leave a gap, no tris left += mSpaceWidth; // Also reduce tri count mRenderOp.vertexData->vertexCount -= 6; continue; } Real horiz_height = mpFont->getGlyphAspectRatio(*i); Real u1, u2, v1, v2; Ogre::Font::UVRect utmp; utmp = mpFont->getGlyphTexCoords(character); u1 = utmp.left; u2 = utmp.right; v1 = utmp.top; v2 = utmp.bottom; // each vert is (x, y, z, u, v) //------------------------------------------------------------------------------------- // First tri // // Upper left if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else *pPCBuff++ = left - (len / 2); *pPCBuff++ = top; *pPCBuff++ = -1.0; *pPCBuff++ = u1; *pPCBuff++ = v1; // Deal with bounds if(mHorizontalAlignment == MovableText::H_LEFT) currPos = Ogre::Vector3(left, top, -1.0); else currPos = Ogre::Vector3(left - (len / 2), top, -1.0); if (first) { min = max = currPos; maxSquaredRadius = currPos.squaredLength(); first = false; } else { min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = std::max(maxSquaredRadius, currPos.squaredLength()); } top -= mCharHeight * 2.0; // Bottom left if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else *pPCBuff++ = left - (len / 2); *pPCBuff++ = top; *pPCBuff++ = -1.0; *pPCBuff++ = u1; *pPCBuff++ = v2; // Deal with bounds if(mHorizontalAlignment == MovableText::H_LEFT) currPos = Ogre::Vector3(left, top, -1.0); else currPos = Ogre::Vector3(left - (len / 2), top, -1.0); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = std::max(maxSquaredRadius, currPos.squaredLength()); top += mCharHeight * 2.0; left += horiz_height * mCharHeight * 2.0; // Top right if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else *pPCBuff++ = left - (len / 2); *pPCBuff++ = top; *pPCBuff++ = -1.0; *pPCBuff++ = u2; *pPCBuff++ = v1; //------------------------------------------------------------------------------------- // Deal with bounds if(mHorizontalAlignment == MovableText::H_LEFT) currPos = Ogre::Vector3(left, top, -1.0); else currPos = Ogre::Vector3(left - (len / 2), top, -1.0); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = std::max(maxSquaredRadius, currPos.squaredLength()); //------------------------------------------------------------------------------------- // Second tri // // Top right (again) if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else *pPCBuff++ = left - (len / 2); *pPCBuff++ = top; *pPCBuff++ = -1.0; *pPCBuff++ = u2; *pPCBuff++ = v1; currPos = Ogre::Vector3(left, top, -1.0); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = std::max(maxSquaredRadius, currPos.squaredLength()); top -= mCharHeight * 2.0; left -= horiz_height * mCharHeight * 2.0; // Bottom left (again) if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else *pPCBuff++ = left - (len / 2); *pPCBuff++ = top; *pPCBuff++ = -1.0; *pPCBuff++ = u1; *pPCBuff++ = v2; currPos = Ogre::Vector3(left, top, -1.0); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = std::max(maxSquaredRadius, currPos.squaredLength()); left += horiz_height * mCharHeight * 2.0; // Bottom right if(mHorizontalAlignment == MovableText::H_LEFT) *pPCBuff++ = left; else *pPCBuff++ = left - (len / 2); *pPCBuff++ = top; *pPCBuff++ = -1.0; *pPCBuff++ = u2; *pPCBuff++ = v2; //------------------------------------------------------------------------------------- currPos = Ogre::Vector3(left, top, -1.0); min.makeFloor(currPos); max.makeCeil(currPos); maxSquaredRadius = std::max(maxSquaredRadius, currPos.squaredLength()); // Go back up with top top += mCharHeight * 2.0; float currentWidth = (left + 1)/2 - 0; if (currentWidth > largestWidth) largestWidth = currentWidth; } // Unlock vertex buffer ptbuf->unlock(); min.makeFloor(max); //When only spaces are typed in min can exceed max, this rectifies this // update AABB/Sphere radius mAABB = Ogre::AxisAlignedBox(min, max); mRadius = Ogre::Math::Sqrt(maxSquaredRadius); if (mUpdateColors) this->_updateColors(); mNeedUpdate = false;}void MovableText::_updateColors(void){ assert(!mpFont.isNull()); assert(!mpMaterial.isNull()); if (mpFont.isNull()) { return; } if (mpMaterial.isNull()) { return; } // Convert to system-specific RGBA color; Root::getSingleton().convertColourValue(mColor, &color); HardwareVertexBufferSharedPtr vbuf = mRenderOp.vertexData->vertexBufferBinding->getBuffer(COLOUR_BINDING); RGBA *pDest = static_cast<RGBA*>(vbuf->lock(HardwareBuffer::HBL_DISCARD)); for (uint i = 0; i < mRenderOp.vertexData->vertexCount; ++i) *pDest++ = color; vbuf->unlock(); mUpdateColors = false;}const Quaternion& MovableText::getWorldOrientation(void) const{ assert(mpCam); return const_cast<Quaternion&>(mpCam->getDerivedOrientation());}const Vector3& MovableText::getWorldPosition(void) const{ assert(mParentNode); return mParentNode->_getDerivedPosition();}void MovableText::getWorldTransforms(Matrix4 *xform) const { if (this->isVisible() && mpCam) { Matrix3 rot3x3, scale3x3 = Matrix3::IDENTITY; // store rotation in a matrix mpCam->getDerivedOrientation().ToRotationMatrix(rot3x3); // parent node position Vector3 ppos = mParentNode->_getDerivedPosition() + Vector3::UNIT_Y*mAdditionalHeight; Quaternion pori = mParentNode->_getDerivedOrientation(); Vector3 alignmentOffset = Vector3::ZERO; //ppos += pori * (mPositionOffset + alignmentOffset * 0.01); // apply scale scale3x3[0][0] = mParentNode->_getDerivedScale().x / 2; scale3x3[1][1] = mParentNode->_getDerivedScale().y / 2; scale3x3[2][2] = mParentNode->_getDerivedScale().z / 2; // apply all transforms to xform *xform = (rot3x3 * scale3x3); xform->setTrans(ppos); }}void MovableText::getRenderOperation(RenderOperation &op){ if (this->isVisible()) { if (mNeedUpdate) this->_setupGeometry(); if (mUpdateColors) this->_updateColors(); op = mRenderOp; }}void MovableText::_notifyCurrentCamera(Camera *cam){ mpCam = cam;}void MovableText::_updateRenderQueue(RenderQueue* queue){ if (this->isVisible()) { if (mNeedUpdate) this->_setupGeometry(); if (mUpdateColors) this->_updateColors(); queue->addRenderable(this, mRenderQueueID, OGRE_RENDERABLE_DEFAULT_PRIORITY); }}void Ogre::MovableText::setPositionOffset( const Ogre::Vector3& offset ){ mPositionOffset = offset;}void Ogre::MovableText::setScaleOffset( const Ogre::Vector3& offset ){ mScaleOffset = offset;}

效果圖: 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产亚洲精品a区天堂华泰| 欧美天天综合色影久久精品| 97精品国产97久久久久久免费| 青青在线视频一区二区三区| 国产精品成人va在线观看| 久久高清视频免费| 中文国产成人精品久久一| 亚洲va久久久噜噜噜久久天堂| 亚洲天堂第一页| 欧美视频二区36p| 久久99亚洲精品| 欧美国产日韩一区二区| 亚洲人a成www在线影院| 亚洲最大av在线| 国产一区二区在线播放| 亚洲va欧美va国产综合剧情| 日韩欧美国产激情| 92国产精品久久久久首页| 国产男女猛烈无遮挡91| 亚洲国产精品国自产拍av秋霞| 国产精品jizz在线观看麻豆| 青草青草久热精品视频在线网站| 亚洲国产成人爱av在线播放| 麻豆乱码国产一区二区三区| 久久久久久这里只有精品| 亚洲国产成人精品久久久国产成人一区| 亚洲一区二区三区成人在线视频精品| 日韩欧美在线字幕| 91精品国产高清久久久久久91| 国产精品对白刺激| 亚洲第一精品夜夜躁人人躁| 日韩一级黄色av| 亚洲精品99久久久久中文字幕| 国产精品日韩av| 一区二区三区黄色| 韩日精品中文字幕| 国产视频精品一区二区三区| 国产精品美乳一区二区免费| 欧美亚洲国产成人精品| 日本欧美精品在线| 永久免费看mv网站入口亚洲| 欧美国产日韩中文字幕在线| 欧美大片大片在线播放| 国产精品伦子伦免费视频| xxxx欧美18另类的高清| 日韩中文字幕久久| 91av在线播放| 欧美在线一级va免费观看| 日韩av电影免费观看高清| 琪琪亚洲精品午夜在线| 国产午夜精品美女视频明星a级| 亚洲欧美精品伊人久久| 国产精品久久99久久| 国产视频观看一区| 日本一欧美一欧美一亚洲视频| 欧美一区二区影院| 91老司机精品视频| 91国内免费在线视频| 国产在线观看一区二区三区| 一本色道久久88综合日韩精品| 午夜精品久久久久久久99热| 福利微拍一区二区| 久久久精品久久久| 日韩高清电影免费观看完整| 国产精品一区久久久| 国产亚洲成精品久久| 国产精品综合不卡av| 在线电影欧美日韩一区二区私密| 国产成人av网| 欧美人在线观看| 大荫蒂欧美视频另类xxxx| 欧美日韩国产中文精品字幕自在自线| 秋霞午夜一区二区| 成人a在线视频| 久久综合五月天| 欧美在线视频观看免费网站| 91欧美日韩一区| 色婷婷综合久久久久| 日韩视频永久免费观看| 日本久久中文字幕| 5566成人精品视频免费| 国产精品自拍网| 欧美又大又硬又粗bbbbb| 成人国产精品久久久久久亚洲| 奇门遁甲1982国语版免费观看高清| 久久精品国产亚洲一区二区| 日韩免费看的电影电视剧大全| 综合激情国产一区| 亚洲a成v人在线观看| www.欧美免费| 国产精品欧美一区二区三区奶水| 国产成人精品在线观看| 美女999久久久精品视频| 欧美激情亚洲另类| 日韩性xxxx爱| 国产97在线|日韩| 亚洲精品久久久一区二区三区| 在线播放精品一区二区三区| 亚洲成人三级在线| 日本国产高清不卡| 第一福利永久视频精品| 姬川优奈aav一区二区| 久久精品一本久久99精品| 中文字幕一区日韩电影| 国产有码一区二区| 亚洲香蕉伊综合在人在线视看| 日韩中文在线中文网三级| 精品精品国产国产自在线| 国产亚洲视频中文字幕视频| 日韩天堂在线视频| 亚洲a在线观看| 蜜臀久久99精品久久久久久宅男| 成人免费淫片aa视频免费| 久久天天躁狠狠躁老女人| 亚洲国产又黄又爽女人高潮的| 国产一级揄自揄精品视频| 国产精品亚洲欧美导航| 中文字幕欧美专区| 97人洗澡人人免费公开视频碰碰碰| 欧洲成人在线观看| 青草青草久热精品视频在线网站| 色综合久久久888| 欧美午夜精品久久久久久浪潮| 清纯唯美亚洲综合| 一本一本久久a久久精品牛牛影视| 中文字幕在线看视频国产欧美| 国产免费一区二区三区在线能观看| 在线电影中文日韩| 精品久久久91| 亚洲欧洲黄色网| 黑人巨大精品欧美一区二区免费| 国产精品亚洲综合天堂夜夜| 欧美高清一级大片| 久久人人97超碰精品888| 成人精品一区二区三区电影免费| 国产一区二区成人| 色综合男人天堂| 国语自产在线不卡| 北条麻妃99精品青青久久| 国产日韩欧美在线观看| 国产欧美精品一区二区三区介绍| 九九久久综合网站| 国产精品久久久久久久7电影| 91精品在线一区| 欧美大片va欧美在线播放| 亚洲三级 欧美三级| 国产精品成人免费电影| 国产日韩欧美成人| 清纯唯美亚洲激情| 国产精品一区二区女厕厕| 久久免费精品日本久久中文字幕| 国产又爽又黄的激情精品视频| 伦理中文字幕亚洲| 欧美一区亚洲一区| 久久国产视频网站| 久久久www成人免费精品张筱雨| 亚洲精品影视在线观看| 亚洲欧美激情精品一区二区| 久久精品电影网站| 精品视频9999| 日本伊人精品一区二区三区介绍| 国产精品精品视频一区二区三区| 亚洲一区亚洲二区| 欧美日韩美女视频|