锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久ZYZ资源站无码中文动漫 ,久久黄视频,国产真实乱对白精彩久久http://www.shnenglu.com/helloqinglan/category/11339.html韜姭鍗婁歡闀垮伐琛o紝鎬鎻d竴棰楀湴涓誨績(jī)zh-cnFri, 07 Aug 2009 15:16:19 GMTFri, 07 Aug 2009 15:16:19 GMT60欖斿吔mdx鏂囦歡瀵煎嚭涓篛gre Mesh鐨勫皬榪涘睍http://www.shnenglu.com/helloqinglan/archive/2009/08/07/92571.html鐧戒簯鍝?/dc:creator>鐧戒簯鍝?/author>Fri, 07 Aug 2009 14:42:00 GMThttp://www.shnenglu.com/helloqinglan/archive/2009/08/07/92571.htmlhttp://www.shnenglu.com/helloqinglan/comments/92571.htmlhttp://www.shnenglu.com/helloqinglan/archive/2009/08/07/92571.html#Feedback0http://www.shnenglu.com/helloqinglan/comments/commentRss/92571.htmlhttp://www.shnenglu.com/helloqinglan/services/trackbacks/92571.html    鏈榪戜竴鐩村湪璇曞浘鎶婇瓟鍏?鐨刴dx鏂囦歡杞負(fù)Ogre Mesh錛屽涔?fàn)涓涓嬪熀紜鐨?D緙栫▼銆侽gre Mesh鐨勫鍑哄湪寰堜箙涔嬪墠涔熸浘璇曞浘鍋氳繃錛屽茍涓旇繕鎶奧OW鐨刴2妯″瀷浠ュ強(qiáng)WMO妯″瀷瀵煎叆鍒頒簡(jiǎn)Max涓紝浣嗘槸鍙仛鍒頒簡(jiǎn)楠ㄦ灦鐨勫鍏ワ紝鍔ㄧ敾鏁版嵁濮嬬粓鍑轟笉鏉ワ紝浜庢槸鏀懼純銆?/font>

 

    榪欐渚濈劧鏄鍒拌繖閲岀殑闂錛屽鍑洪潤(rùn)鎬佺殑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>();

        // 涓嶄嬌鐢ㄥ叡浜《鐐規(guī)暟鎹?
        // 姣忎釜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;
}

 

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

 

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

 

    涔熺‘瀹烇紝鐜板湪闄や簡(jiǎn)涓浜涘皬鐗╀歡鐨勫姩鐢誨錛屼富瑙掞紝鎬墿鐨勫姩鐢婚兘鐢╯keleton浜?jiǎn)锛屼篃璁窶orphAnimation灝卞揩閫鍑哄巻鍙茬殑鑸炲彴錛屽湪Ogre涓湅涓嶅埌浜?jiǎn)锛屼篃涓嶈兘鎸囨湜浼?xì)鏈変粈涔堟敼榪涖?/font>

 

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

 

mdx2mesh_anim

 

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

 

mdx2mesh_anim_attack



]]>
久久国产精品-久久精品| 无码久久精品国产亚洲Av影片| 99国产欧美精品久久久蜜芽| 久久发布国产伦子伦精品 | 久久精品国产久精国产果冻传媒| 亚洲国产天堂久久综合| 国产成人无码久久久精品一| 国产精品免费看久久久香蕉| 亚洲人成精品久久久久| 青青青伊人色综合久久| 一本色道久久88—综合亚洲精品| 91精品国产9l久久久久| 久久午夜夜伦鲁鲁片免费无码影视| 精品熟女少妇a∨免费久久| 日韩久久无码免费毛片软件| 国产精品18久久久久久vr| 久久这里只有精品首页| 蜜桃麻豆www久久| 精品久久久久香蕉网| 久久久久久久久66精品片| 国产精品成人99久久久久91gav| 久久夜色精品国产噜噜麻豆| 欧美麻豆久久久久久中文| 色噜噜狠狠先锋影音久久| 1000部精品久久久久久久久| 久久久无码精品亚洲日韩京东传媒| 久久AⅤ人妻少妇嫩草影院| 久久综合给久久狠狠97色| 亚洲综合伊人久久综合| 久久精品视频一| 2020国产成人久久精品| 久久久午夜精品| 性做久久久久久免费观看| 久久免费大片| 一级做a爰片久久毛片毛片| 亚洲а∨天堂久久精品| 久久精品免费网站网| 久久免费视频一区| 久久99这里只有精品国产| 久久人人爽人人爽人人片AV高清| 久久精品国产久精国产一老狼|