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

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>
            久久综合免费视频影院| 欧美一级夜夜爽| 欧美日韩精品一区| 欧美高清视频在线| 欧美精品自拍偷拍动漫精品| 欧美激情一区二区三区在线| 欧美日韩高清在线一区| 国产精品国产三级国产普通话99| 欧美日韩国产a| 国产精品免费一区豆花| 国产私拍一区| 91久久在线观看| 在线中文字幕一区| 久久久久国产精品www| 欧美成人一二三| 亚洲视频免费观看| 久久综合久久久久88| 欧美揉bbbbb揉bbbbb| 国产又爽又黄的激情精品视频 | 欧美丝袜一区二区三区| 在线综合亚洲| 久久久亚洲精品一区二区三区 | 亚洲毛片在线观看| 亚洲中字黄色| 久久伊人精品天天| 亚洲精品一二区| 久久丁香综合五月国产三级网站| 免费在线亚洲欧美| 国产日韩一区二区| 亚洲免费观看| 久久男人av资源网站| 亚洲最新色图| 麻豆精品视频在线观看| 国产精品一区在线观看你懂的| 亚洲国产精品久久91精品| 亚洲一区二区三区在线| 亚洲高清视频一区二区| 亚洲一区www| 欧美激情视频一区二区三区在线播放| 国产精品入口| 亚洲丝袜av一区| 欧美高清在线视频观看不卡| 亚洲免费在线视频| 欧美日韩一区二区三区视频| 亚洲国产综合在线| 久久久久久精| 午夜精品电影| 国产精品视屏| 亚洲一区二区视频| 日韩一级成人av| 欧美激情一区二区| 亚洲欧洲一区| 欧美aa国产视频| 久久久成人网| 激情国产一区二区| 久久久久久69| 性久久久久久久久| 国产日韩精品久久| 欧美在线视频在线播放完整版免费观看 | 欧美福利电影在线观看| 在线看欧美视频| 老**午夜毛片一区二区三区| 欧美亚洲一区三区| 国产一区二区高清不卡| 久久精品av麻豆的观看方式 | 亚洲一区二区三区免费在线观看 | 一区二区亚洲精品| 国产一区二区看久久| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲精品视频在线播放| 亚洲国产精品女人久久久| 欧美成年人视频网站| 亚洲乱码视频| 91久久久国产精品| 欧美视频三区在线播放| 小辣椒精品导航| 欧美在线电影| 亚洲国产mv| 亚洲精品欧美| 欧美精品免费在线观看| 99在线热播精品免费99热| 日韩午夜在线| 国产精品永久免费| 久久婷婷色综合| 玖玖综合伊人| 亚洲视频日本| 欧美一级夜夜爽| 国产自产在线视频一区| 欧美成人乱码一区二区三区| 欧美激情精品久久久久久蜜臀| 在线综合+亚洲+欧美中文字幕| 亚洲在线不卡| 亚洲精品午夜| 午夜一区在线| 亚洲精品一二三区| 亚洲欧美激情视频在线观看一区二区三区| 国产精品视频一区二区高潮| 久久久久久久一区二区三区| 欧美a级在线| 欧美有码在线视频| 久久亚洲二区| 性久久久久久| 免费在线看一区| 久久精品女人| 欧美激情国产精品| 久久久久久有精品国产| 欧美久久99| 久久婷婷蜜乳一本欲蜜臀| 欧美日韩蜜桃| 欧美激情亚洲国产| 国产乱码精品一区二区三区不卡| 久久综合九九| 国产精品久久久久久影视| 欧美mv日韩mv亚洲| 国产欧美一区二区三区另类精品| 亚洲高清不卡在线| 国产一区91精品张津瑜| 亚洲精品一区二| 亚洲激情午夜| 久久激情五月激情| 销魂美女一区二区三区视频在线| 久久亚洲私人国产精品va| 午夜精品福利一区二区三区av| 蜜臀av在线播放一区二区三区 | 久久精彩视频| 欧美日韩精品免费观看视一区二区| 久久精品一级爱片| 国产精品成人免费精品自在线观看| 欧美激情一区二区三区| 国产日韩欧美自拍| 亚洲国产精品久久人人爱蜜臀 | 久久久久久夜精品精品免费| 国产精品jvid在线观看蜜臀| 欧美黄色精品| 久久午夜精品一区二区| 久久久国产亚洲精品| 国产精品毛片a∨一区二区三区| 91久久在线观看| 在线观看精品| 久久gogo国模啪啪人体图| 欧美一区二区三区在线| 国产精品久久久久久久一区探花| 亚洲精选一区| 这里只有精品在线播放| 欧美午夜精品久久久久久超碰| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲免费在线观看视频| 亚洲欧美日韩精品一区二区| 欧美色图一区二区三区| 一本大道久久精品懂色aⅴ | 国产精品视频久久一区| 亚洲免费婷婷| 久久久中精品2020中文| 红桃视频国产精品| 可以看av的网站久久看| 欧美激情免费观看| 日韩视频免费看| 欧美网站在线观看| 欧美在线观看视频一区二区三区| 久久精品视频一| 黄色国产精品一区二区三区| 久久久免费精品视频| 亚洲国产老妈| 亚洲视频精选在线| 国产精品一卡二卡| 久久国产视频网| 亚洲高清视频在线观看| 午夜精彩视频在线观看不卡| 国产亚洲一区二区三区| 麻豆久久婷婷| 艳妇臀荡乳欲伦亚洲一区| 久久黄金**| 亚洲国产欧美国产综合一区 | 在线看视频不卡| 欧美激情综合色综合啪啪| 一区二区三区**美女毛片| 久久精品国产第一区二区三区最新章节| 国产一区二区成人久久免费影院| 久久欧美肥婆一二区| 日韩视频中文| 可以看av的网站久久看| 一本久久精品一区二区| 国产一区二区日韩| 欧美精品一区视频| 久久爱另类一区二区小说| 日韩视频永久免费| 免费亚洲婷婷| 西瓜成人精品人成网站| 亚洲国产99精品国自产| 国产精品视频免费一区| 欧美高清视频| 久久精品国产亚洲aⅴ| 精品成人一区二区三区| 欧美色123| 免费成人av资源网| 欧美在线视频观看免费网站| 一区二区三区国产| 亚洲激情小视频| 蜜桃久久精品乱码一区二区| 香蕉亚洲视频|