目前只支持一个Mesh,(WOW的 model 里有多个 ModelRenderPass每个 pass代表一个子物体,整个模型只有一套顶点数据,但每个子物体有自己的贴图信息和顶点索引)
还没添加动画,粒子的支持….
一创建支持MPQ的FileSystem
class MPQArchive : public Ogre::Archive
一个MPQArchive代表一个 .mpq文件
class _OgrePrivate MPQArchiveFactory : public Ogre::ArchiveFactory
工厂,用来创建 MPQArchive
class _OgrePrivate MPQFile : public DataStream
MPQ文件,保存WOW各种文件的数据
而mpq文件的装载使用的是 wowmodelview的mpq库
二 在OGRE里 添加 MPQfilesystem
在
mRoot = new Root(pluginsPath,
mResourcePath + "ogre.cfg", mResourcePath + "Ogre.log");
创建root 和 设置resource 之间增加MPQ 文件工厂
ArchiveManager::getSingleton().addArchiveFactory( new MPQArchiveFactory() );
setupResources();
三装载一个MPQ文件
tempname 为WOW的文件名 ,blp mdx等等
String temps = tempname;
DataStreamPtr steam = ResourceGroupManager::getSingleton().openResource(temps);
MPQFile *f = (MPQFile*)(steam.get());
四包装WOW的模型
结构使用 modelview 的 Model类 让他继承 SimpleRenderable 以便可以放入到
SceneManager中,已经拥有自己的renderop
class Model : public Ogre::SimpleRenderable
protected 参数
Ogre::VertexData* mVertexData;
用来保存顶点数据
decl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
offset += VertexElement::getTypeSize(VET_FLOAT3);
decl->addElement(0, offset, VET_FLOAT3, VES_NORMAL);
offset += VertexElement::getTypeSize(VET_FLOAT3);
decl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0);
offset += VertexElement::getTypeSize(VET_FLOAT2);
创建顶点缓冲元素定义,包括顶点,法线和纹理
从indexLookup中读取 顶点索引
五模型的Materail
1 装载blp文件
首先获取texture 的 ModelTextureDef,如果 type == 0 ,为标准纹理
如果不等于0,为特殊纹理(一个模型有很多风格的纹理那种,WOW里那种样子一样
颜色不一样的怪….)利用CreatureModelDB和CreatureSkinDB来获得实际的纹理
装载这个BLP文件(方法和wowmodel一样),将图象元素装载到内存 buf里
创建 Ogre的 Image img, 根据格式DXT1 ,DXT3 ,DXT5 的不同
从buf 装载图象, 建立一个名字为 WOWTexture 的纹理
img.loadDynamicImage( buf, w, h, PF_DXT1 );
TextureManager::getSingleton().loadImage( "WOWTexture",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, img, TEX_TYPE_2D, 0, 1.0f,true );
2 创建Materail
用OGRE创建一个材质
shadMat = MaterialManager::getSingleton().create("WOWMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
获得pass,并给这个pass创建一个TexUnit
Pass *shadPass = shadMat->getTechnique(0)->getPass(0);
TextureUnitState* tex = 0;
tex = shadPass->createTextureUnitState("WOWTexture");
将这个材质设置给模型
setMaterial("WOWMaterial");
六在OGRE场景中添加一个WOW模型
Model *m = new Model("Creature\\Bear\\polarbearcub.mdx");
SceneNode *myNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
myNode->attachObject(m);
使用special texture的波利
标准纹理的