锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久人人爽人人爽人人片AV高清 ,久久久女人与动物群交毛片,久久人妻少妇嫩草AV蜜桃http://m.shnenglu.com/helloqinglan/category/11339.html韜姭鍗婁歡闀垮伐琛o紝鎬鎻d竴棰楀湴涓誨績zh-cnFri, 07 Aug 2009 15:16:19 GMTFri, 07 Aug 2009 15:16:19 GMT60欖斿吔mdx鏂囦歡瀵煎嚭涓篛gre Mesh鐨勫皬榪涘睍http://m.shnenglu.com/helloqinglan/archive/2009/08/07/92571.html鐧戒簯鍝?/dc:creator>鐧戒簯鍝?/author>Fri, 07 Aug 2009 14:42:00 GMThttp://m.shnenglu.com/helloqinglan/archive/2009/08/07/92571.htmlhttp://m.shnenglu.com/helloqinglan/comments/92571.htmlhttp://m.shnenglu.com/helloqinglan/archive/2009/08/07/92571.html#Feedback0http://m.shnenglu.com/helloqinglan/comments/commentRss/92571.htmlhttp://m.shnenglu.com/helloqinglan/services/trackbacks/92571.html    鏈榪戜竴鐩村湪璇曞浘鎶婇瓟鍏?鐨刴dx鏂囦歡杞負Ogre Mesh錛屽涔犱竴涓嬪熀紜鐨?D緙栫▼銆侽gre Mesh鐨勫鍑哄湪寰堜箙涔嬪墠涔熸浘璇曞浘鍋氳繃錛屽茍涓旇繕鎶奧OW鐨刴2妯″瀷浠ュ強WMO妯″瀷瀵煎叆鍒頒簡Max涓紝浣嗘槸鍙仛鍒頒簡楠ㄦ灦鐨勫鍏ワ紝鍔ㄧ敾鏁版嵁濮嬬粓鍑轟笉鏉ワ紝浜庢槸鏀懼純銆?/font>

 

    榪欐渚濈劧鏄鍒拌繖閲岀殑闂錛屽鍑洪潤鎬佺殑Mesh寰堝揩灝卞畬鎴愶紝鍖呮嫭妯″瀷涓庢潗璐紝浠g爜涔熸瘮杈冪畝鍗曘?/font>

 

// 妯″瀷鏁版嵁
bool ModelLoaderMdx::loadGeosets(Ogre::MeshPtr model, MdxDataStreamPtr dataStream, int size)
{
    unsigned int index = 0;
    while(size > 0)
    {
        int geosetSize = dataStream->read<int>();
        size -= geosetSize;

        Ogre::String meshName = m_modelName + Ogre::String("_sub_") + Ogre::StringConverter::toString(index++);
        Ogre::SubMesh* subMesh = model->createSubMesh(meshName);
    
        // 紜歡緙撳啿緙栧彿
        // 鍒嗗埆涓洪《鐐瑰潗鏍?娉曠嚎 璐村浘鍧愭爣
#define HARDWARE_BUFFER_SOURCE_VERTEX 0
#define HARDWARE_BUFFER_SOURCE_NORMAL 1
#define HARDWARE_BUFFER_SOURCE_TEXPOS 2


        //
        // 欏剁偣鏁版嵁
        //
        if(!expectTag(dataStream, 'VRTX')) 
        {
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Expect VRTX data for geoset",
                "ModelLoaderMdx::loadGeosets");
        }

        unsigned int vertexCount = dataStream->read<unsigned int>();

        // 涓嶄嬌鐢ㄥ叡浜《鐐規暟鎹?
        // 姣忎釜SubMesh閮藉垱寤鴻嚜宸辯殑VertexData
        subMesh->useSharedVertices = false;
        subMesh->vertexData = OGRE_NEW Ogre::VertexData();

        subMesh->vertexData->vertexStart = 0;
        subMesh->vertexData->vertexCount = vertexCount;

        subMesh->vertexData->vertexDeclaration->addElement(
            HARDWARE_BUFFER_SOURCE_VERTEX, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);

        size_t vertexSize = sizeof(float) * 3;
        assert(subMesh->vertexData->vertexDeclaration->getVertexSize(HARDWARE_BUFFER_SOURCE_VERTEX) == vertexSize);
        if (subMesh->vertexData->vertexDeclaration->getVertexSize(HARDWARE_BUFFER_SOURCE_VERTEX) != vertexSize)
        {
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "VertexSize error", 
                "ModelLoaderMdx::loadGeoset");
        }

        Ogre::HardwareVertexBufferSharedPtr vertexBuffer;
        vertexBuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
            vertexSize,
            vertexCount,
            Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
        void* vertexBufferData = vertexBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);

        unsigned int vertexBufferDataPos = 0;
        for (unsigned int i = 0; i < vertexCount; ++i)
        {
            Ogre::Vector3 data(
                dataStream->read<float>(),
                dataStream->read<float>(),
                dataStream->read<float>()
                );
            transformCoord(data);
            memcpy((char*)vertexBufferData + vertexBufferDataPos, &data, sizeof(Ogre::Vector3));
            vertexBufferDataPos += sizeof(Ogre::Vector3);
        }

        vertexBuffer->unlock();
        subMesh->vertexData->vertexBufferBinding->setBinding(HARDWARE_BUFFER_SOURCE_VERTEX, vertexBuffer);


        //
        // 娉曠嚎鏁版嵁
        //
        if(!expectTag(dataStream, 'NRMS'))
        {
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Expect NRMS data for material",
                "ModelLoaderMdx::loadGeosets");
        }

        unsigned int normalCount = dataStream->read<unsigned int>();
        if(normalCount != vertexCount)
        {
            std::stringstream stream;
            stream << "Normal count mismatch, " << normalCount << " normals for " << vertexCount << " vertices)!";
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, stream.str(), 
                "ModelLoaderMdx::loadGeoset");
        }

        subMesh->vertexData->vertexDeclaration->addElement(
            HARDWARE_BUFFER_SOURCE_NORMAL, 0, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);

        size_t normalSize = sizeof(float) * 3;
        assert(subMesh->vertexData->vertexDeclaration->getVertexSize(HARDWARE_BUFFER_SOURCE_NORMAL) == normalSize);
        if (subMesh->vertexData->vertexDeclaration->getVertexSize(HARDWARE_BUFFER_SOURCE_NORMAL) != normalSize)
        {
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "NormalSize error", 
                "ModelLoaderMdx::loadGeoset");
        }

        Ogre::HardwareVertexBufferSharedPtr normalBuffer;
        normalBuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
            normalSize,
            normalCount,
            Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
        void* normalBufferData = normalBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);

        unsigned int normalBufferDataPos = 0;
        for (unsigned int i = 0; i < normalCount; ++i)
        {
            Ogre::Vector3 data(
                dataStream->read<float>(),
                dataStream->read<float>(),
                dataStream->read<float>()
                );
            transformCoord(data);
            memcpy((char*)normalBufferData + normalBufferDataPos, &data, sizeof(Ogre::Vector3));
            normalBufferDataPos += sizeof(Ogre::Vector3);
        }

        normalBuffer->unlock();
        subMesh->vertexData->vertexBufferBinding->setBinding(HARDWARE_BUFFER_SOURCE_NORMAL, normalBuffer);


…………
        //
        // 欏剁偣绱㈠紩
        //
        if(!expectTag(dataStream, 'PVTX')) 
        {
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Expect PVTX data for geoset",
                "ModelLoaderMdx::loadGeosets");
        }

        unsigned int indexCount = dataStream->read<unsigned int>();
        assert(totalIndexCount == indexCount);
        if (totalIndexCount != indexCount)
        {
            std::stringstream stream;
            stream << "indexCount is " << indexCount << ", but totalIndexCount for all faces is " << totalIndexCount;
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, stream.str(), 
                "ModelLoaderMdx::loadGeoset");
        }

        subMesh->indexData->indexStart = 0;
        subMesh->indexData->indexCount = indexCount;

        Ogre::HardwareIndexBufferSharedPtr indexBuffer;
        indexBuffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(
            Ogre::HardwareIndexBuffer::IT_16BIT,
            indexCount,
            Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);

        void* indexBufferData = indexBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
        dataStream->read(indexBufferData, indexCount * sizeof(unsigned short));

        // 涓夎褰㈠弽杞? 灝嗗師鏉ョ殑鍙嶉潰鏈濆
        unsigned short* tmpData = (unsigned short*)indexBufferData;
        for (unsigned int i = 0; i < indexCount; i += 3)
        {
            unsigned short tmp = tmpData[i + 1];
            tmpData[i + 1] = tmpData[i + 2];
            tmpData[i + 2] = tmp;
        }

        indexBuffer->unlock();


        subMesh->indexData->indexBuffer = indexBuffer;
        subMesh->operationType = Ogre::RenderOperation::OT_TRIANGLE_LIST;


…………

        // 鏉愯川ID
        unsigned int materialID = dataStream->read<unsigned int>();
        Ogre::String materialName = m_modelName + Ogre::String("_") + boost::lexical_cast<Ogre::String>(materialID);
        subMesh->setMaterialName(materialName);

…………

        //
        // 璐村浘鍧愭爣
        //
        if(!expectTag(dataStream, 'UVBS')) 
        {
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Expect UVBS data for geoset",
                "ModelLoaderMdx::loadGeosets");
        }

        unsigned int texturePositionCount = dataStream->read<unsigned int>();
        if(texturePositionCount != vertexCount)
        {
            std::stringstream stream;
            stream << "Texture position count mismatch, " << texturePositionCount << " texture positions for " << vertexCount << " vertices)!";
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, stream.str(), 
                "ModelLoaderMdx::loadGeoset");
        }

        // TextureCoord Data
        subMesh->vertexData->vertexDeclaration->addElement(
            HARDWARE_BUFFER_SOURCE_TEXPOS, 0, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);

        size_t texPosSize = sizeof(float) * 2;
        assert(subMesh->vertexData->vertexDeclaration->getVertexSize(HARDWARE_BUFFER_SOURCE_TEXPOS) == texPosSize);
        if (subMesh->vertexData->vertexDeclaration->getVertexSize(HARDWARE_BUFFER_SOURCE_TEXPOS) != texPosSize)
        {
            OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "TexturePositionSize error", 
                "ModelLoaderMdx::loadGeoset");
        }

        Ogre::HardwareVertexBufferSharedPtr texPosBuffer;
        texPosBuffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
            texPosSize,
            texturePositionCount,
            Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
        void* texPosBufferData = texPosBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
        dataStream->read(texPosBufferData, texPosSize * texturePositionCount);
        texPosBuffer->unlock();
        subMesh->vertexData->vertexBufferBinding->setBinding(HARDWARE_BUFFER_SOURCE_TEXPOS, texPosBuffer);
    }

    return true;
}

 

    浣嗘槸鍒頒簡鍔ㄧ敾鏁版嵁榪欓噷闂鍙堝嚭鏉ヤ簡錛岃屼笖mdx妯″瀷涓巑2妯″瀷榪樻湁浜涘樊鍒紝mdx妯″瀷涓病鏈夐楠兼暟鎹紝鍙湁max涓渶綆鍗曠殑涓夌鍙樻崲鏁版嵁錛孫gre涓彧鏈塎orphAnimation鑳藉瀹炵幇姝ょ鍔ㄧ敾銆?/font>

 

    Ogre鐨凪orphAnimation鐨勭涓涓狵eyFrame蹇呴』甯︽湁瀹屾暣鐨勯《鐐逛俊鎭紝鑰宮dx妯″瀷涓棆杞佺緝鏀句笌浣嶇Щ鏄垎寮鐨勶紝涔熷氨鏄竴涓狵eyFrame涓婂彲鑳藉彧鏈変竴縐嶅彉鎹紝鎴栬呭縐嶃傝屽疄闄呬笂鍦╩ax涓埗浣滃姩鐢葷殑鏃跺欒繖涓夌鍙樻崲涔熸槸鐙珛寮鐨勶紝Ogre鐨勮鍧涗笂鎵懼埌涓綃囪璁烘湁浜烘彁鍒頒簡榪欎釜闂錛屽彲鎯滃埗浣滆呯殑鍥炲鏄疢orphAnimation鍙疄鐜板埌榪欐牱……

 

    涔熺‘瀹烇紝鐜板湪闄や簡涓浜涘皬鐗╀歡鐨勫姩鐢誨錛屼富瑙掞紝鎬墿鐨勫姩鐢婚兘鐢╯keleton浜嗭紝涔熻MorphAnimation灝卞揩閫鍑哄巻鍙茬殑鑸炲彴錛屽湪Ogre涓湅涓嶅埌浜嗭紝涔熶笉鑳芥寚鏈涗細鏈変粈涔堟敼榪涖?/font>

 

    緇х畫瀹炵幇涔嬶紝閭e氨鍙兘鍦ㄦ湁KeyFrame鐨勫湴鏂規妸涓夌鍙樻崲閮借綆椾竴嬈★紝鐒跺悗鍙栧緱鏈緇堝彉鎹㈠悗鐨勪綅緗暟鎹紝涔熷氨鏄仛浜哄伐鐨勫姩鐢誨撫閲囨牱銆傚湪War3EditorSource鐨勫熀紜涓婂仛浜嗕簺淇敼錛岀粓浜庯紝涓甯у撫鐨勫姩鐢昏綆楀嚭鏉ヤ簡銆?/font>

 

mdx2mesh_anim

 

    涓嶈繃闂渚濈劧榪樻湁寰堝錛屾瘮濡俶dx妯″瀷錛屽挨鍏舵槸鎬墿鍜岃鑹叉ā鍨嬩腑澶ч噺鐢ㄥ埌浜哛eplacableTexture錛岃繖浜涢渶瑕侀氳繃璇婚厤緗枃浠舵潵鑾峰彇鍙敤鐨勮創鍥撅紝鍙﹀妯″瀷涓婇檮甯︾殑綺掑瓙鐗規晥銆佺汗鐞嗗姩鐢葷瓑閮借繕娌℃湁瀵煎嚭錛岀湅鐪嬭繖涓病鏈夎創鍥劇殑鏀誨嚮涓殑铦庡瓙錛屽墠闈㈢殑璺粛鐒跺緢榪溿?/font>

 

mdx2mesh_anim_attack



]]>
亚洲欧洲精品成人久久奇米网 | 久久国产精品一区二区| 日韩人妻无码一区二区三区久久| 亚洲精品第一综合99久久| 77777亚洲午夜久久多喷| 99久久国产热无码精品免费| 99久久精品九九亚洲精品| 亚洲伊人久久综合影院| 潮喷大喷水系列无码久久精品| 国产激情久久久久影院老熟女免费 | 久久精品一区二区国产| 婷婷久久精品国产| 国产精品福利一区二区久久| 欧美性大战久久久久久| 精品国产一区二区三区久久| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 亚洲欧洲久久久精品| 国产成人久久精品区一区二区| 久久久噜噜噜久久| 久久国产精品久久国产精品| 狠狠精品久久久无码中文字幕| 精品久久人人做人人爽综合 | 66精品综合久久久久久久| 波多野结衣久久| 四虎国产精品免费久久| 久久这里只精品国产99热| 欧美丰满熟妇BBB久久久| 亚洲七七久久精品中文国产| 丁香五月综合久久激情| 久久国产高清字幕中文| 91精品国产91久久久久福利| 囯产精品久久久久久久久蜜桃| 久久综合五月丁香久久激情| 91精品无码久久久久久五月天| 精品蜜臀久久久久99网站| 久久久久久亚洲精品成人| 久久婷婷色综合一区二区 | 久久精品无码一区二区WWW| 一本色道久久综合狠狠躁篇| 欧美久久天天综合香蕉伊| 久久久久无码精品|