青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

(搬運工)Ogre動畫拾取函數

Posted on 2011-09-20 14:22 點點滴滴 閱讀(758) 評論(0)  編輯 收藏 引用 所屬分類: 08 游戲SDK
IEntity* GraphicalWorld::pickEntity(const Ray& ray, uint32 mask)
    {
        WS_ASSERT( msCore );
// 
//         const unsigned long mask = 0xFFFFFFFF;
        Ogre::Ray ogreRay( VEC_WS2OGRE(ray.getOrigin()), VEC_WS2OGRE(ray.getDirection()) );
        
if (!mpRaySceneQuery)
        {
            mpRaySceneQuery 
= msCore->getSceneMgr()->createRayQuery( ogreRay, mask );            
        }
        
else
        {
            mpRaySceneQuery
->setRay(ogreRay );    
            mpRaySceneQuery
->setQueryMask(mask);
        }        
        mpRaySceneQuery
->setSortByDistance(true);
        
        Ogre::Real closest_distance 
= 99999.0f;
        Ogre::RaySceneQueryResult 
&query_result = mpRaySceneQuery->execute();
        Ogre::MovableObject
* movable;
        IEntity
* pEntity = NULL;


        
for (size_t qr_idx = 0; qr_idx < query_result.size(); qr_idx++)
        {
            
// stop checking if we have found a raycast hit that is closer
            
// than all remaining entities
            if ((closest_distance >= 0.0f&& (closest_distance < query_result[qr_idx].distance))
                
break;

            
// only check this result if its a hit against an entity
            movable = query_result[qr_idx].movable;            
            
if (( movable != NULL) && (movable->getMovableType().compare("Entity"== 0&& movable->isVisible())
            {
                
                EntityMap::const_iterator itFind 
= mEntityMap.find( static_cast<Ogre::Entity*>(movable));
                
if (itFind == mEntityMap.end())
                    
continue;

                
// get the entity to check
                Ogre::Entity *pentity = static_cast<Ogre::Entity*>(movable);

                
// mesh data to retrieve
                size_t vertex_count;
                size_t index_count;

                pentity
->_getSkelAnimVertexData();
                
// get the mesh information
                GetMeshInformation(pentity, vertex_count, index_count, 
                    pentity
->getParentNode()->_getDerivedPosition(),
                    pentity
->getParentNode()->_getDerivedOrientation(),
                    pentity
->getParentNode()->_getDerivedScale());

                
// test for hitting individual triangles on the mesh
                bool new_closest_found = false;
                
for (int i = 0; i < static_cast<int>(index_count); i += 3)
                {
                    assert(mIndexBuffer[i] 
< vertex_count);
                    assert(mIndexBuffer[i 
+ 1< vertex_count);
                    assert(mIndexBuffer[i 
+ 2< vertex_count);
                    
// check for a hit against this triangle

                    std::pair
<bool, Ogre::Real> hit = Ogre::Math::intersects(ogreRay, mVertexBuffer[mIndexBuffer[i]],
                        mVertexBuffer[mIndexBuffer[i
+1]], mVertexBuffer[mIndexBuffer[i+2]], truefalse);

                    
// if it was a hit check if its the closest
                    if (hit.first)
                    {
                        
if ((closest_distance < 0.0f|| (hit.second < closest_distance))
                        {
                            
// this is the closest so far, save it off
                            closest_distance = hit.second;
                            new_closest_found 
= true;
                        }
                    }
                }

                
// if we found a new closest raycast for this object, update the
                
// closest_result before moving on to the next object.
                if (new_closest_found)
                {
                    pEntity 
= itFind->second;
                }
            }
        }


//         Ogre::RaySceneQueryResult &result = mpRaySceneQuery->execute();
//         Ogre::RaySceneQueryResult::iterator it = result.begin();
//         if (it != result.end())
//         {
//             //it->distance
//             //if (it->worldFragment)
//             if (it->movable)
//             {
//                 //Ogre::UserDefinedObject* udo = Ogre::MovableObject::getUserObject();
//                 if (it->movable->getMovableType() == "Entity")
//                 {
//                     EntityMap::const_iterator itFind = mEntityMap.find( static_cast<Ogre::Entity*>( it->movable ) );
//                     if (itFind != mEntityMap.end())
//                         return itFind->second;
//                 }
//             }
//         }
        return pEntity;
    }

取得動畫頂點數據
void GetMeshInformation(const Entity *entity,
                                size_t 
&vertex_count,
                                Ogre::Vector3
* &vertices,
                                size_t 
&index_count,
                                unsigned 
long* &indices,
                                
const Ogre::Vector3 &position,
                                
const Ogre::Quaternion &orient,
                                
const Ogre::Vector3 &scale)
{
    
bool added_shared = false;
    size_t current_offset 
= 0;
    size_t shared_offset 
= 0;
    size_t next_offset 
= 0;
    size_t index_offset 
= 0;
    vertex_count 
= index_count = 0;
 
   Ogre::MeshPtr mesh 
= entity->getMesh();
 
 
   
bool useSoftwareBlendingVertices = entity->hasSkeleton();
 
   
if (useSoftwareBlendingVertices)
   {
      entity
->_updateAnimation();
   }
 
    
// Calculate how many vertices and indices we're going to need
    for (unsigned short i = 0; i < mesh->getNumSubMeshes(); ++i)
    {
        Ogre::SubMesh
* submesh = mesh->getSubMesh( i );
 
        
// We only need to add the shared vertices once
        if(submesh->useSharedVertices)
        {
            
if!added_shared )
            {
                vertex_count 
+= mesh->sharedVertexData->vertexCount;
                added_shared 
= true;
            }
        }
        
else
        {
            vertex_count 
+= submesh->vertexData->vertexCount;
        }
 
        
// Add the indices
        index_count += submesh->indexData->indexCount;
    }
 
 
    
// Allocate space for the vertices and indices
    vertices = new Ogre::Vector3[vertex_count];
    indices 
= new unsigned long[index_count];
 
    added_shared 
= false;
 
    
// Run through the submeshes again, adding the data into the arrays
    for ( unsigned short i = 0; i < mesh->getNumSubMeshes(); ++i)
    {
        Ogre::SubMesh
* submesh = mesh->getSubMesh(i);
 
      
//----------------------------------------------------------------
      
// GET VERTEXDATA
      
//----------------------------------------------------------------
 
        
//Ogre::VertexData* vertex_data = submesh->useSharedVertices ? mesh->sharedVertexData : submesh->vertexData;
      Ogre::VertexData* vertex_data;
 
      
//When there is animation:
      if(useSoftwareBlendingVertices)
#ifdef BUILD_AGAINST_AZATHOTH
         vertex_data 
= submesh->useSharedVertices ? entity->_getSharedBlendedVertexData() : entity->getSubEntity(i)->_getBlendedVertexData();
#else
         vertex_data 
= submesh->useSharedVertices ? entity->_getSkelAnimVertexData() : entity->getSubEntity(i)->_getSkelAnimVertexData();
#endif
      
else
         vertex_data 
= submesh->useSharedVertices ? mesh->sharedVertexData : submesh->vertexData;
 
 
        
if((!submesh->useSharedVertices)||(submesh->useSharedVertices && !added_shared))
        {
            
if(submesh->useSharedVertices)
            {
                added_shared 
= true;
                shared_offset 
= current_offset;
            }
 
            
const Ogre::VertexElement* posElem =
                vertex_data
->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
 
            Ogre::HardwareVertexBufferSharedPtr vbuf 
=
                vertex_data
->vertexBufferBinding->getBuffer(posElem->getSource());
 
            unsigned 
char* vertex =
                static_cast
<unsigned char*>(vbuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
 
            
// There is _no_ baseVertexPointerToElement() which takes an Ogre::Real or a double
            
//  as second argument. So make it float, to avoid trouble when Ogre::Real will
            
//  be comiled/typedefed as double:
            
//      Ogre::Real* pReal;
            float* pReal;
 
            
for( size_t j = 0; j < vertex_data->vertexCount; ++j, vertex += vbuf->getVertexSize())
            {
                posElem
->baseVertexPointerToElement(vertex, &pReal);
 
                Ogre::Vector3 pt(pReal[
0], pReal[1], pReal[2]);
 
                vertices[current_offset 
+ j] = (orient * (pt * scale)) + position;
            }
 
            vbuf
->unlock();
            next_offset 
+= vertex_data->vertexCount;
        }
 
 
        Ogre::IndexData
* index_data = submesh->indexData;
        size_t numTris 
= index_data->indexCount / 3;
        Ogre::HardwareIndexBufferSharedPtr ibuf 
= index_data->indexBuffer;
 
        
bool use32bitindexes = (ibuf->getType() == Ogre::HardwareIndexBuffer::IT_32BIT);
 
        unsigned 
long*  pLong = static_cast<unsigned long*>(ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
        unsigned 
short* pShort = reinterpret_cast<unsigned short*>(pLong);
 
 
        size_t offset 
= (submesh->useSharedVertices)? shared_offset : current_offset;
        size_t index_start 
= index_data->indexStart;
        size_t last_index 
= numTris*3 + index_start;
 
        
if (use32bitindexes)
            
for (size_t k = index_start; k < last_index; ++k)
            {
                indices[index_offset
++= pLong[k] + static_cast<unsigned long>( offset );
            }
 
        
else
            
for (size_t k = index_start; k < last_index; ++k)
            {
                indices[ index_offset
++ ] = static_cast<unsigned long>( pShort[k] ) +
                    static_cast
<unsigned long>( offset );
            }
 
        ibuf
->unlock();
        current_offset 
= next_offset;
    }
}




青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品久久久久| 欧美日韩成人激情| 久久先锋影音av| 亚洲专区一区| 先锋影音国产一区| 欧美在线观看视频在线 | 久久国产一区| 久久久久久国产精品mv| 久久久久久久综合| 欧美成va人片在线观看| 亚洲一区二区三区四区视频| 一区二区毛片| 西西裸体人体做爰大胆久久久| 久久精品一区四区| 欧美成人第一页| av不卡在线看| 久久不见久久见免费视频1| 久久久久久精| 国产精品超碰97尤物18| 国产私拍一区| 最近中文字幕mv在线一区二区三区四区| 亚洲精品视频免费观看| 午夜精品区一区二区三| 免播放器亚洲一区| 亚洲一区二区三区激情| 久久综合久久综合九色| 国产精品swag| 亚洲欧洲在线观看| 午夜国产一区| 欧美性猛交99久久久久99按摩 | 欧美一区二区三区在线视频| 久久综合精品国产一区二区三区| 欧美精品一区二| 黄色日韩在线| 亚洲欧美日韩综合aⅴ视频| 欧美va天堂| 欧美一区二区三区四区在线观看| 欧美日韩国产综合新一区| 一区在线影院| 久久狠狠久久综合桃花| 99在线精品视频在线观看| 免费在线日韩av| 亚洲国产天堂久久综合| 久久在线91| 欧美在现视频| 国内精品久久久| 久久精品国产一区二区电影| 亚洲午夜精品久久| 欧美日韩精品一区视频| 亚洲精品日产精品乱码不卡| 欧美91大片| 久久久免费av| 亚洲电影第三页| 免费成人毛片| 久久久国产精品亚洲一区| 国产亚洲午夜高清国产拍精品| 午夜精品久久久久久久白皮肤 | 国语自产精品视频在线看| 亚洲专区在线| 亚洲丝袜av一区| 国产精品久久久| 亚洲欧美三级在线| 亚洲在线黄色| 国产亚洲午夜| 蜜桃伊人久久| 另类天堂视频在线观看| 亚洲国产精品电影| 亚洲成人在线视频网站| 午夜视频久久久久久| 国产精品视频xxx| 校园春色国产精品| 欧美制服丝袜第一页| 影音先锋在线一区| 亚洲电影天堂av| 欧美日韩精品三区| 亚洲欧美三级在线| 久久精品123| 亚洲精品一区二区三区不| 亚洲黄色片网站| 国产精品呻吟| 欧美激情按摩| 国产精品日韩高清| 久久亚洲国产精品一区二区| 女人香蕉久久**毛片精品| 99riav1国产精品视频| 在线一区二区日韩| 亚洲综合视频1区| 香港成人在线视频| 亚洲第一色在线| 亚洲精品欧美日韩| 国产麻豆91精品| 久久综合一区| 欧美日韩亚洲综合一区| 欧美在线资源| 欧美成人综合在线| 翔田千里一区二区| 免费日韩精品中文字幕视频在线| 亚洲一区二区三区四区在线观看| 久久成人精品视频| 在线视频欧美精品| 久久精品夜色噜噜亚洲a∨| 日韩午夜av在线| 久久精品成人一区二区三区| 一区二区免费在线观看| 久久国产精品一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 国产欧美一级| 亚洲高清自拍| 黑人一区二区| 亚洲自拍16p| 亚洲视频观看| 欧美成人精品在线播放| 久久久水蜜桃av免费网站| 国产精品电影在线观看| 亚洲人成毛片在线播放女女| 在线观看视频一区二区欧美日韩| 亚洲一二三级电影| 日韩午夜一区| 欧美精品黄色| 亚洲高清视频在线观看| 国产在线拍偷自揄拍精品| 中文精品在线| 亚洲小视频在线| 欧美日韩国产bt| 亚洲欧洲日产国产综合网| 精品电影在线观看| 欧美一区二区观看视频| 午夜精品剧场| 欧美视频一区二区三区| 亚洲国产日韩在线| 亚洲国产精品电影| 久热国产精品| 欧美刺激午夜性久久久久久久| 韩国视频理论视频久久| 亚洲影视综合| 欧美专区在线观看| 国产日韩欧美中文| 欧美在线视频观看| 老牛嫩草一区二区三区日本| 在线成人激情视频| 久热成人在线视频| 最近看过的日韩成人| 99精品久久久| 国产精品国产三级国产普通话99 | 久久九九精品99国产精品| 快播亚洲色图| 狠狠狠色丁香婷婷综合激情| 性视频1819p久久| 欧美有码在线观看视频| 国产伦精品一区二区三区视频黑人 | 亚洲欧洲日韩女同| 在线亚洲高清视频| 国产精品看片资源| 欧美在线免费视屏| 免费在线日韩av| 99re热精品| 国产欧美日韩专区发布| 久久久久久亚洲精品不卡4k岛国| 欧美承认网站| 亚洲综合成人婷婷小说| 国产日韩成人精品| 欧美 日韩 国产一区二区在线视频 | 亚洲国产精品成人精品| 欧美精品乱人伦久久久久久 | 欧美有码视频| 亚洲大片免费看| 欧美日韩亚洲另类| 久久精品国产v日韩v亚洲| 亚洲国产专区校园欧美| 亚洲男同1069视频| 影音先锋成人资源站| 欧美性大战久久久久久久| 久久久精品国产免大香伊| 亚洲精品中文字| 久久精品网址| 亚洲小说春色综合另类电影| 韩曰欧美视频免费观看| 欧美日韩伦理在线免费| 久久国内精品自在自线400部| 亚洲美女视频在线观看| 麻豆国产精品va在线观看不卡| 99亚洲视频| 伊人久久大香线| 国产精品捆绑调教| 欧美精品三级日韩久久| 久久午夜视频| 欧美一区二区在线视频| 一本色道久久88综合亚洲精品ⅰ | 亚洲在线成人精品| 红桃视频成人| 国产精品自在欧美一区| 欧美激情中文字幕乱码免费| 久久精品在线观看| 亚洲天堂av在线免费| 亚洲狠狠丁香婷婷综合久久久| 久久久久久夜| 久久精品夜色噜噜亚洲aⅴ| 亚洲一区日韩在线| 亚洲肉体裸体xxxx137| 伊人久久久大香线蕉综合直播|