锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鍙傝冿細ShowMesh,MAGE,涓ゆ宸ュ叿婧愮爜
鍏堟妸鍥劇鍑烘潵錛屾湁鏃墮棿鏂囧瓧鎬葷粨涓涓嬶紝闅懼害铏界劧涓嶉珮錛屼絾涔熸姌鑵句笉灝戞椂闂?涔熺畻榪戞潵瀛︿範Qt涓嶰gre鐨勪竴涓皬緇撱?br>
聽

}
棣栧厛錛孯ibbonTrail鍒涘緩浜嗕袱涓摼錛屾瘡涓渶澶氬寘鎷?0涓厓绱狅紝灝懼反闀?00涓笘鐣屽崟浣嶃傚垱寤轟簡涓涓粨鐐筧nimNoade銆備負榪欎釜緇撶偣鍒涘緩浜嗕竴涓姩鐢?浣垮緱榪欎釜緇撶偣鍙互鏍規嵁鍏抽敭甯х殑璁捐鍦ㄥ満鏅腑涓嶆柇鍙樺寲浣嶇疆銆傚茍鎶婁竴涓猂ibbonTrail涓庤繖涓粨鐐硅仈緇撹搗鏉ワ紝浜庢槸RibbonTrail鍙笌animNode涓璧瘋繍鍔ㄣ傚張鍒涘緩浜嗕竴涓伅錛屽茍鑱旂粨鍒拌繖涓粨鐐癸紝鐏殢緇撶偣涔熶竴璧瘋繍鍔紝浜庢槸鎬墿澶翠細鏈夋槑鏆楀彉鍖栥傛渶鍚庣敤涓涓竷鍛婃澘鏉ュ艦璞¤〃紺哄垰鍒涘緩鐨勭伅錛屽洜涓虹伅鍦ㄥ満鏅腑鏄笉鍙鐨勩傚洜涓虹伅琚寕鍒癮nimNode緇撶偣涓婏紝鎵浠ュ竷鍛婃澘bbs涔熸寕鍒板悓鏍風殑緇撶偣涓娿傚綋鐒跺埆蹇樹簡浣跨敤浜嗗姩鐢葷姸鎬佹潵鎺ㄨ繘鍔ㄧ敾銆?/p>
聽聽聽 }
聽聽聽 void postRenderTargetUpdate(const RenderTargetEvent& evt)
聽聽聽 {
聽聽聽聽聽聽聽 // Show plane
聽聽聽聽聽聽聽 mPlaneEnt->setVisible(true);
聽聽聽 }
鏈鍚庤鎻愮殑鏄紝鍦ㄦ瘡涓甯э紝閮借浣夸袱涓浉鏈虹殑浣嶇疆錛屾湞鍚戜繚鎸佷竴鑷?
frameStarted:
聽mReflectCam->setOrientation(mCamera->getOrientation());
聽 mReflectCam->setPosition(mCamera->getPosition());
鍒濆鍖?/font>
鍦ㄥ垵濮嬪寲涔嬪墠錛屽繀欏誨垱寤鴻嚦灝戜竴涓覆鏌撶獥鍙c傚洜涓哄湪鍒嗘瀽鑴氭湰鏃跺彲鑳戒細鍒涘緩GPU璧勬簮錛岃屽悗鑰呴渶瑕佹覆鏌?br />涓婁笅鏂囥?br />// initialize all of the previously defined resource groups
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
// or, alternately, initialize the defined resource groups one at a time
ResourceGroupManager::getSingleton().initialiseResourceGroup("General");
ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap");
鍗歌澆
鍙互鍦ㄤ換浣曟椂鍊欏嵏杞借祫婧愶紙浠ョ粍鎴栧崟涓殑鏂瑰紡錛?姝e湪浣跨敤鐨勮祫婧愪笉浼氳鍗歌澆銆?br />浠ョ粍鐨勬柟寮忓嵏杞?/font>
ResourceGroupManager::getSingleton().unloadResourceGroup("Bootstrap", true);
ResourceGroupManager::getSingleton().
unloadUnreferencedResourcesInGroup("Bootstrap", true);
true琛ㄧず鍙嵏杞借祫婧愭暟鎹紝涓嶅垹闄よ祫婧愬疄渚嬶紝瀹冨彲浠ヨreloaded銆傛湁浜涜祫婧愬湪鍒涘緩鏃惰鏍囦負
"nonreloadable",榪欑綾誨瀷鐨勮祫婧愪笉鑳戒嬌鐢ㄤ笂榪版柟娉曞嵏杞姐?br />娓呯悊鎴栭攢姣佽祫婧愮粍
娓呯悊浠呮槸鍗歌澆璧勬簮涓庡垎紱昏祫婧愮儲寮曪紝閿姣佷笉浠呭仛娓呯悊鐨勫伐浣滐紝榪樺寘鎷粠璧勬簮緇勪腑鎶婅嚜宸辯Щ闄ゃ?br />ResourceGroupManager::geSingleton().clearResourceGroup("Bootstrap");
ResourceGroupManager::geSingleton().destroyResourceGroup("Bootstrap");
浠ヤ釜浣撴柟寮忓嵏杞?/font>
// assume that pEntity is a valid pointer to an instance of Entity
MeshPtr meshPtr = pEntity->getMesh();
meshPtr->unload();
鍔犺澆/閲嶈澆璧勬簮緇?/font>
ResourceGroupManager::getSingleton().loadResourceGroup("Bootstrap", false, true)
浜屼釜甯冨皵鍙橀噺涓嶅悓璧勬簮綾誨瀷璧勬簮鍔犺澆寮鍏籌紝涓閽堝"Normal"璧勬簮錛屼簩閽堝"World geometry"
璧勬簮緇勫姞杞介氱煡
class LoadingProgressListener :聽public ResourceGroupListener
{
聽聽 public:聽
聽聽聽聽聽聽聽聽// fired when a group begins parsing scripts
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 void resourceGroupScriptingStarted(const String& groupName,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t scriptCount) {}
聽聽聽聽聽聽 // fired when a script is about to be parsed
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 void scriptParseStarted(const String& scriptName) {}
聽聽聽 聽聽 // fired when the script has been parsed
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 void scriptParseEnded() {}
聽聽聽聽 聽 // fired when all scripts in the group have been parsed
聽聽聽聽聽聽聽聽聽聽聽聽聽 void resourceGroupScriptingEnded(const String& groupName) {}
聽聽聽聽聽 //榪樻湁涓浜涙帴鍙?br />}
//瀹炵幇涔嬪悗錛岃繘琛屾敞鍐?br />LoadingProgressListener listener(m_progressMeter);
ResourceGroupManager::getSingleton().addResourceGroupListener(&listener);
綰圭悊鍒悕
鍦ㄦ簮鏉愯川琚玞lone鏃訛紝姣忎釜texture unit鍙互琚祴浜庝竴涓猅exture alias(鍒悕錛夈傚彲浠ョ敤榪欎釜鍒悕鏉ユ寚瀹氫嬌鐢ㄤ粈涔堢汗鐞嗐傛牸寮忥細 texture_alias <name> 緙虹渷錛?texutre_unit <name>( 綰圭悊鍗曞厓鐨勫悕瀛?
texture_unit DiffuseTex
{
聽 texture diffuse.jpg
}
鍦ㄨ繖縐嶆儏鍐典笅錛宼exture_alias涓篋iffuseTex.
material TSNormalSpecMapping
{
聽 technique GLSL
聽 {
聽聽聽 pass
聽聽聽 {聽
聽聽聽聽聽 texture_unit NormalMap
聽聽聽聽聽 {
聽聽聽聽聽聽聽 texture defaultNM.png
聽聽聽聽聽聽聽 tex_coord_set 0
聽聽聽聽聽聽聽 filtering trilinear
聽聽聽聽聽 }
聽聽聽聽聽聽 texture_unit DiffuseMap
聽聽聽聽聽 {
聽聽聽聽聽聽聽 texture defaultDiff.png
聽聽聽聽聽聽聽 filtering trilinear
聽聽聽聽聽聽聽 tex_coord_set 1
聽聽聽聽聽 }
聽聽聽聽聽聽聽 texture_unit SpecMap
聽聽聽聽聽 {
聽聽聽聽聽聽聽 texture defaultSpec.png
聽聽聽聽聽聽聽 filtering trilinear
聽聽聽聽聽聽聽 tex_coord_set 2
聽聽聽聽聽 }
聽聽聽 }聽
聽 }
聽 technique HLSL_DX9
聽 {
聽聽聽 pass
聽聽聽 {聽
聽聽聽聽聽聽聽 texture_unit
聽聽聽聽聽 {
聽聽聽聽聽聽聽 texture_alias NormalMap
聽聽聽聽聽聽聽 texture defaultNM.png
聽聽聽聽聽聽聽 tex_coord_set 0
聽聽聽聽聽聽聽 filtering trilinear
聽聽聽聽聽 }
聽聽聽聽聽 texture_unit
聽聽聽聽聽 {
聽聽聽聽聽聽聽 texture_alias DiffuseMap
聽聽聽聽聽聽聽 texture defaultDiff.png
聽聽聽聽聽聽聽 filtering trilinear
聽聽聽聽聽聽聽 tex_coord_set 1
聽聽聽聽聽 }
聽聽聽聽聽 texture_unit
聽聽聽聽聽 {
聽聽聽聽聽聽聽 texture_alias SpecMap
聽聽聽聽聽聽聽 texture defaultSpec.png
聽聽聽聽聽聽聽 filtering trilinear
聽聽聽聽聽聽聽 tex_coord_set 2
聽聽聽聽聽 }
聽聽聽 }聽
聽 }
}
渚嬪瓙涓湁涓や釜鎶鏈紝閮戒嬌鐢ㄧ浉鍚岀殑綰圭悊,絎竴涓妧鏈嬌鐢ㄧ己鐪佺殑鏂瑰紡瀹氫箟浜嗙汗鐞嗗埆鍚嶏紝絎簩涓妧鏈樉寮忓湴鎸囧畾綰圭悊鍒悕銆備袱鑰呴兘鏈夌浉瀵瑰簲鐨勫悓鏍風殑綰圭悊鍒悕銆傚鏋滄兂瀹氫箟涓涓潗璐ㄥ彧鏄兂浣跨敤涓嶅悓鐨勭汗鐞?閭d箞copy鐖舵潗璐ㄦ椂鍙互浣跨敤set_texture_alias鏉ラ噸鏂版寚瀹氭柊綰圭悊銆?br />material fxTest : TSNormalSpecMapping
{
聽 set_texture_alias NormalMap fxTestNMap.png
聽 set_texture_alias DiffuseMap fxTestDiff.png
聽 set_texture_alias SpecMap fxTestMap.png
}
涓婇潰浠g爜灝卞鎷ユ湁鎸囧畾鍒悕鐨則exture unit鎵浣跨敤鐨勭汗鐞嗗浘鐗囪繘琛屼簡閲嶆柊鎸囧畾銆?br />
鎴戜滑鐭ラ亾鍦板艦鎬繪槸璧蜂紡涓嶅鉤鐨勶紝褰撲富瑙掑湪涓婇潰琛岃蛋鏃墮渶瑕佹牴鎹湴褰㈢殑楂樺害璋冩暣錛屽彲浠ュ厜綰挎煡璇㈡潵瀹炵幇銆?br />鍘熺悊姣旇緝綆鍗曪細鍚戜富瑙掕剼涓嬫墽琛屽厜綰挎煡璇紝涓庡湴褰㈡湁涓涓氦鐐癸紝鏍規嵁浜ょ偣鐨勯珮搴﹁皟鏁翠富瑙掍綅緗?br />Terrain Clamping
void Entity::clampToTerrain() {
static Ogre::Ray updateRay;
updateRay.setOrigin(m_controlledNode->getPosition() + Ogre::Vector3(0, 15, 0));
updateRay.setDirection(Ogre::Vector3::NEGATIVE_UNIT_Y);
m_raySceneQuery->setRay(updateRay);
Ogre::RaySceneQueryResult& qryResult = m_raySceneQuery->execute();
if (qryResult.size() == 0) {
// then we are under the terrain and need to pop above it
updateRay.setOrigin(m_controlledNode->getPosition());
updateRay.setDirection(Ogre::Vector3::UNIT_Y);
m_raySceneQuery->setRay(updateRay);
}
qryResult = m_raySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment)
{
Ogre::SceneQuery::WorldFragment* wf = i->worldFragment;
m_controlledNode->setPosition(m_controlledNode->getPosition().x,
i->worldFragment->singleIntersection.y,
m_controlledNode->getPosition().z);
}
}
void Entity::init()
{
// lots of other irrelevant entity init stuff goes here
m_raySceneQuery = sm->createRayQuery(
Ogre::Ray(m_controlledNode->getPosition(),
Ogre::Vector3::NEGATIVE_UNIT_Y));
// move this node is such a way that it is above the terrain
clampToTerrain();
}
涓嬪垪鍙傛暟鐢ㄤ簬鎻愪緵鑷繁鐨勭潃鑹茬▼搴忔椂浣跨敤錛岃繖浼氭彁渚涜嚜宸卞畾涔夌殑material錛岄偅涔堝厛鍓嶅畾涔夌殑
WorldTexture 涓?DetailTexture鐨勮緗笉鍐嶇敤鍒幫紝澶氫綑鐨勪簡銆?/p>
MorphLODFactorParamName=morphFactor銆
//鍋囪VertexProgramMorph琚涓簓es,瀹氬埗鐨刴aterial涓寘鎷竴涓珮綰ч《鐐圭▼搴忋傚畠鎸囧畾浜嗕竴涓《鐐?br />//紼嬪簭鐨勫弬鏁板悕錛岃繖涓弬鏁扮敤浜庤瀺鍚圠OD,鍙傛暟鍊間粠0錛?錛?琛ㄧず涓嶈皟鏁達紝1琛ㄧず瀹屽叏璋冩暣鍒頒笅涓綰OD
MorphLODFactorParamIndex聽聽聽聽聽聽聽聽 //鐢ㄤ簬materail涓寘鍚綆綰ч《鐐圭▼搴忕殑鎯呭喌錛屾剰涔夊悓涓?br />CustomMaterialName聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //鎸囧畾鐨刴aterail鍚嶅瓧
涓婅堪閰嶇疆鏂囦歡瀹氫箟浜嗗熀浜庨珮搴﹀浘鐨勫湴褰€傝繖浜涘弬鏁板畾涔夊彲姒傛嫭涓轟袱綾伙細Ogre浣跨敤絎竴綾諱粠楂樺害鍥句駭鐢熷湴褰?br />mesh涓庢潗璐ㄣ傜浜岀被鏄畾鍒舵潗璐ㄤ笌GPU欏剁偣紼嬪簭錛岃繖鍙互浠f浛ogre鑷姩浜х敓鐨勭潃鑹茬▼搴忋?br />鍙﹀鐨勮鏄庯細 Ogre::DataStreamPtr Process_Loader::getSceneDataStream(SceneData &data) {
TerrainScenceManager浼氭妸楂樺害鍥懼垎涓哄悜涓猵ages,姣忎釜page鐢卞嚑涓猼iles緇勬垚.鑰屽畠浠篃涓嶈繃鏄釜鏂逛究鐨勫悕瀛楋紝
瀹冧滑閮藉畾涔変簡鍦ㄤ駭鐢熺殑mesh涓竴緇勬瀯鎴愭鏂瑰艦鐨勯《鐐歸泦銆?br />WorldTexture瀹氫箟鐨勭汗鐞嗕笉蹇呬笌鐩爣鍦板艦涓鏍峰ぇ銆?br />PageWorldX錛孭ageWorldZ鍙互緙╂斁涓栫晫涓殑鍦板艦銆?br />MaxHeight 鍦╕鏂瑰悜緙╂斁鍦板艦銆?br />DetailTexture 鍙嬌鐢ㄤ竴涓汗鐞嗭紝濡備嬌鐢ㄥ灞傜汗鐞嗭紝搴旇浣跨敤鑷畾涔塵aterail銆?br />
浠庣▼搴忓姞杞藉湴褰?/font>
setWorldGeometry()鏈夐噸杞藉艦寮忥紝涓縐嶇敤浜庡姞杞介厤緗枃浠訛紝鍙︿竴縐嶆垜浠彲鍦ㄧ▼搴忎腑浣跨敤錛屼互
杈懼埌鎵嬪伐鍔犺澆鐨勫姛鑳姐傝繖閲岋紝SceneData琚?typedef 涓簊td:map,瀹冨瓨鍌ㄤ簡濡傛垜浠湪terrain.cfg
涓湅鍒伴偅浜涘煎銆傚亣璁炬垜浠凡緇忎粠鏌愪釜浜岃繘鍒舵枃浠惰鍏ユ垜浠兂瑕佺殑鍐呭鍒癝ceneData涓傛垜浠鍋?br />鐨勫氨鏄妸璇誨叆鐨勫唴瀹硅漿鎹㈡垚setWorldGeometry()闇瑕佺殑綾誨瀷銆傚厛鐪嬩竴涓嬪嚱鏁板師鍨嬶細
Ogre::SceneManager::setWorldGeometry (聽 DataStreamPtr &聽 stream,聽
聽 const String &聽 typeName = StringUtil::BLANK
聽)聽
DataStreamPtr鏄竴涓櫤鑳芥寚閽?鍥犳浠庡眬閮ㄥ彉閲忎腑榪斿洖鏄畨鍏ㄧ殑,紼嬪簭鐩稿綋鐩磋錛屼笉鍐嶅璇翠簡銆?/p>
// create what looks like a config file for the edification of Ogre
std::string mem;
SceneData::iterator it;
for (it=data.begin(); it!=data.end(); it++) {
mem += it->first;
mem += "=";
mem += it->second;
mem += "\n";
}
void *pMem = (void *)new unsigned char[mem.length()+1];
memset(pMem, 0, mem.length()+1);
memcpy(pMem, mem.c_str(), mem.length() + 1);
// stuff this into a MemoryDataStream
Ogre::DataStreamPtr pStr(new Ogre::MemoryDataStream(pMem, mem.length() + 1));
return pStr;
}
// and then elsewhere in the world loader:
Ogre::DataStreamPtr pStr = getSceneDataStream(terrainDef);
m_sceneMgr->setWorldGeometry(pStr);
]]>
聽
鍦烘櫙綆$悊鍣ㄧ被鍨?br />
浠ュ垎鏋愭簮鐮佺殑鏂瑰紡璁ㄨ涓涓嬫彃浠剁殑鍔犺澆鏈哄埗涓庣壒瀹氬満鏅鐞嗗櫒鏄浣曡繘琛岃繍鐢ㄧ殑銆?br />涓婁竴绔犳彁鍒頒簡浠ユ墜宸ョ殑鏂瑰紡鍒濆鍖杘gre,鍖呮嫭鎵嬪伐鍔犺澆鍦烘櫙綆$悊鍣細
root->loadPlugin("Plugin_OctreeSceneManager");
鍏跺疄鎵璋撶殑鑷姩鏂瑰紡涓嬶紝Root:Root()涓篃浼氶棿鎺ヨ皟鐢ㄥ埌loadPlugin()鏂規硶錛岃繖宸插湪鍓嶉潰鐨勭瑪璁?br />(閰嶇疆鏂囦歡Plugins.cfg )涓彁鍒拌繃銆傛棦鐒剁壒瀹氱鐞嗗櫒浠ユ彃浠剁殑褰㈠紡錛坉ll鏂囦歡錛夌粰鍑猴紝涓嬮潰鍏堢湅濡備綍
鍔犺澆dll. 榪涘叆婧愮爜錛氭爣鍙瘋〃鏄庢墽琛岄『搴忋?br />void Root::loadPlugin(const String& pluginName)
聽{
聽// Load plugin library
銆銆銆 DynLib* lib = DynLibManager::getSingleton().load( pluginName ); //(1)
聽聽// Store for later unload
聽mPluginLibs.push_back(lib); //(4)
聽// Call startup function
銆銆銆銆DLL_START_PLUGIN pFunc = (DLL_START_PLUGIN)lib->getSymbol("dllStartPlugin"); //(5)
聽// This must call installPlugin
聽pFunc(); //(6)
聽}
DynLib* DynLibManager::load( const String& filename)聽 //(2)
{
聽聽聽聽聽聽聽 DynLib* pLib = new DynLib(filename);
聽pLib->load();聽聽聽聽聽聽聽
聽聽聽聽聽聽 聽mLibList[filename] = pLib;
聽return pLib;
}
void DynLib::load() //(3)
{
m_hInst = (DYNLIB_HANDLE)DYNLIB_LOAD( name.c_str() );
}
絎?font color="#ff0000">(3)涓殑瀹忓畾涔夊涓嬶細
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#聽聽聽 define DYNLIB_HANDLE hInstance
#聽聽聽 define DYNLIB_LOAD( a ) LoadLibrary( a )
鍒版錛孌LL琚姞杞藉埌鍐呭瓨,絎?font color="#ff0000">(4)姝ワ紝mPluginLibs鏄釜STL瀹瑰櫒錛屽畠瀛樻斁鍔ㄦ佸簱鎸囬拡銆?br />絎?font color="#ff0000">(5)姝ワ紝榪涘叆婧愮爜鍙互鐪嬪埌
void* DynLib::getSymbol( const String& strName ) const throw()
聽聽聽 {
聽聽聽聽聽聽聽 return (void*)DYNLIB_GETSYM( m_hInst, strName.c_str() );
聽聽聽 }
鍏朵腑瀹忓畾涔夛細define DYNLIB_GETSYM( a, b ) GetProcAddress( a, b )錛屽緢鏄劇劧錛屽畠鍙栧緱涓涓悕涓?br />dllStartPlugin鐨勫嚱鏁版寚閽堬細涓嶉槻鍐嶇湅鐪嬪畯瀹氫箟錛?typedef void (*DLL_START_PLUGIN)(void);
璇存槑DLL_START_PLUGIN涓哄弬鏁頒負絀猴紝榪斿洖鍊間負絀虹殑鍑芥暟鎸囬拡銆?br />姣忎釜娉ㄥ唽鍒皁gre鐨刣ll閮藉疄鐜頒簡榪欎釜綰﹀畾鍑芥暟銆傚浜庢垜浠綋鍓嶈璁虹殑鍦烘櫙綆$悊鍣≒lugin_OctreeSceneManager
鏉ヨ錛屾垜浠彲浠ユ壘鍒板叾鐩稿簲鐨勫畾涔?瀹冨湪絎?font color="#ff0000">(6)姝ヤ腑鎵ц
OctreePlugin* octreePlugin;
extern "C" void _OgreOctreePluginExport dllStartPlugin( void )
{
聽聽聽 // Create new scene manager
聽聽聽 octreePlugin = new OctreePlugin();銆//(6-1)
聽聽聽 // Register
聽聽聽 Root::getSingleton().installPlugin(octreePlugin); //(6-2)
}
紼嬪簭鎵ц鍒?font color="#ff0000">(6-1)姝ワ紝new 鏉ヤ竴涓狾ctreePlugin,鎴戜滑鐪嬩竴涓嬪畠鐨勫畾涔夛細
class OctreePlugin : public Plugin
{
聽public:
聽聽OctreePlugin();
聽聽const String& getName() const;
聽聽void install();
聽聽聽void initialise();
聽聽聽void shutdown();
聽聽聽void uninstall();
聽protected:
聽聽OctreeSceneManagerFactory* mOctreeSMFactory;
聽聽TerrainSceneManagerFactory* mTerrainSMFactory;
聽聽TerrainPageSourceListenerManager* mTerrainPSListenerManager;
};
鎴戜滑浼氭敞鎰忓埌瀹冨寘鍚袱涓伐鍘傜被鎸囬拡:OctreeSceneManagerFactory,TerrainSceneManagerFactory
浠栦滑灝辨槸鐢ㄦ潵鐢熶駭鐗瑰畾ScenManager鐨勶紝紼嶅悗璁ㄨ銆傚厛鐪?font color="#ff0000">(6-2)姝ワ細
void Root::installPlugin(Plugin* plugin)
{
聽mPlugins.push_back(plugin);銆銆//(6-2-1)
聽plugin->install();聽聽聽聽聽聽聽聽聽聽聽聽 //(6-2-2)
聽// if rendersystem is already initialised, call rendersystem init too
聽if (mIsInitialised)
聽{
聽plugin->initialise();聽聽聽聽聽聽聽聽 //(6-2-3)
聽}
}
//(6-2-1)姝ユ妸鎻掍歡鏀懼埌瀹瑰櫒涓傜湅鐪?font color="#ff0000">(6-2-2)鍋氫簡浠涔堬細
void OctreePlugin::install()
聽{
聽聽// Create objects
聽聽mOctreeSMFactory = new OctreeSceneManagerFactory();
聽聽mTerrainSMFactory = new TerrainSceneManagerFactory();
聽聽mTerrainPSListenerManager = new TerrainPageSourceListenerManager();
聽}
鍛碉紝鍒氭墠榪樿涓や釜宸ュ巶綾繪寚閽堬紝鐜板湪鎶婁袱涓伐鍘傚緩璧鋒潵錛屼互鍚庡彲浠ョ敤鏉ョ敓浜т笢瑗夸簡銆?br />緇х畫鐪嬬湅(6-2-3):
void OctreePlugin::initialise()
聽{
聽聽// Register
聽聽Root::getSingleton().addSceneManagerFactory(mOctreeSMFactory);
聽聽Root::getSingleton().addSceneManagerFactory(mTerrainSMFactory);
聽}
鍝︼紝鎶婅繖涓や釜宸ュ巶娉ㄥ唽鍒癛oot涓紝璁㏑oot鍙互浣跨敤瀹冧滑銆傚晩榪欏彞璇濇湁鐐歸棶棰橈紝Root鍙槸闂存帴鐨勭敤鍒幫紝
鐩存帴闆囦富鏄?SceneManagerEnumerator* mSceneManagerEnum;瀹冭鍖呭惈鍦≧oot涓備簬鏄垜浠彲浠ョ湅鍒?br />void Root::addSceneManagerFactory(SceneManagerFactory* fact) //(6-2-3-1)
聽{
聽聽mSceneManagerEnum->addFactory(fact);
聽}
宸ュ巶宸茬粡鏈変簡錛屾垜浠浣曞埄鐢ㄨ繖涓伐鍘傜敓浜у嚭鎴戜滑鎯沖埌鐨勪笢瑗?SceneManager)鍛紵
鍥炲繂涓婁竴绔犵殑鎵嬪伐鍒濆鍖栬繃紼嬩腑錛屾垜浠竴鑸敤浠ヤ笅璇彞鏉ュ垱寤篠ceneManager:
聽 SceneManager *sceneMgr = root->createSceneManager(ST_GENERIC); //(A)
涔熷彲浠ヨ繖鏍風敤
聽 sceneMgr = ogre->createSceneManager("OctreeSceneManager"); //(B)
姣忎釜宸ュ巶綾婚兘鐢ㄤ竴涓瓧絎︿覆琛ㄧず鍏剁被鍨嬨備笂闈㈣鐨勪袱涓伐鍘傚垎鍒嬌鐢ㄧ殑瀛楃涓蹭負錛氣淭errainSceneManager鈥濓紝"OctreeSceneManager"
(A)璇彞鑲畾浼氳皟鐢ㄥ伐鍘傜被鐨勬柟娉曟潵浜х敓瀹為檯鐨凷ceneManager,涓嬮潰鐪嬫簮鐮侀獙璇佷竴涓嬶細
SceneManager* Root::createSceneManager(const String& typeName,
聽聽const String& instanceName)
聽{
聽聽return mSceneManagerEnum->createSceneManager(typeName, instanceName);
聽}
緇х畫鎸栵細
SceneManager* SceneManagerEnumerator::createSceneManager(
聽聽const String& typeName, const String& instanceName)
聽{
聽聽SceneManager* inst = 0;
聽聽for(Factories::iterator i = mFactories.begin(); i != mFactories.end(); ++i)
聽聽{
聽聽聽if ((*i)->getMetaData().typeName == typeName)
聽聽聽{
聽聽聽聽if (instanceName.empty())
聽聽聽聽{
聽聽聽聽聽// generate a name
聽聽聽聽聽StringUtil::StrStreamType s;
聽聽聽聽聽s << "SceneManagerInstance" << ++mInstanceCreateCount;
聽聽聽聽聽inst = (*i)->createInstance(s.str());
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽inst = (*i)->createInstance(instanceName);
聽聽聽聽}
聽聽聽聽break;
聽聽聽}
聽聽}
聽}
涓婅堪浠g爜寰堢畝鍗曪細鍥犱負鎵ц(6-2-3-1)宸茬粡榪囧疄闄呭伐鍘傜被瀹炰緥榪涜浜嗘敞鍐屻備簬鏄亶鍘嗘瘡涓伐鍘傚疄渚嬶紝
鎵懼埌綾誨瀷鐩哥鐨勩傛壘鍒頒箣鍚庯紝濡傛灉娌℃湁浼犲満鏅鐞嗗櫒瀹炰緥鐨勫悕瀛楋紝灝辮搗涓悕瀛椼傜劧鍚庣敤榪欎釜鍚嶅瓧
鐢熶駭鍑轟竴涓疄渚嬫潵銆侰reateInstance娌″共浠涔堬紝new銆鍛椼?br />SceneManager* OctreeSceneManagerFactory::createInstance(
聽const String& instanceName)
{
聽return new OctreeSceneManager(instanceName);
}
灝辨槸榪欐牱銆侽ctreeSceneManager and TerrainSceneManager 鐨勫姛鑳介兘鏄敱涓涓狣LL鎻愪緵鐨勩傚畠浠殑鍏崇郴鏄細class _OgreOctreePluginExport TerrainSceneManager : public OctreeSceneManager錛屾寜鐓т竴鑸殑綾誨叧緋婚昏緫錛?br />鎴戜滑鐭ラ亾媧劇敓綾諱竴鑸姛鑳介兘姣旂埗綾誨己澶э紝鐖剁被搴旂敤浜庝竴鑸満鏅紝瀛愮被閽堝鐗瑰畾鍦烘櫙銆傝繖涓昏緫鍦ㄨ繖閲屾槸瀵圭殑銆傛湰鏉ユ槸鍐欒涔︾瑪璁幫紝璺戦浜嗭紝鎵撲綇銆?/p>
聽
聽
聽
聽
聽
聽
聽
聽
聽
聽
聽
聽
聽// tell Root not to load from any plugins or settings file
聽Root *root = new Root("", "");
聽// Load feature plugins. Scene managers will register
聽// themselves for all scene types they support
聽root->loadPlugin("Plugin_CgProgramManager");
聽root->loadPlugin("Plugin_OctreeSceneManager");
聽// load rendersystem plugin(s). The order is important in that GL
聽// should be available on on platforms, while D3D9 would be available
聽// only on Windows -- the try/catch will intercept the exception in this
聽// case where D3D9 is not available and continue gracefully.
聽try {
聽聽root->loadPlugin("RenderSystem_GL");
聽聽root->loadPlugin("RenderSystem_Direct3D9");
聽}
聽catch (...) {}
聽try {
聽聽// We'll simulate the selection of a rendersystem on an arbirtary basis; normally
聽聽// you would have your own code to present the user with options and select the
聽聽// rendersystem on that basis. Since a GUI is beyond the scope of this example, we'll
聽聽// just assume the user selected OpenGL.
聽聽RenderSystemList *rList = root->getAvailableRenderers();
聽聽RenderSystemList::iterator it = rList->begin();
聽聽RenderSystem *rSys = 0;
聽聽while (it != rList->end()) {
聽聽聽
聽聽聽rSys = *(it++);
聽聽聽if (rSys->getName().find("OpenGL")) {
聽聽聽
聽聽聽聽root->setRenderSystem(rSys);
聽聽聽聽break;
聽聽聽}
聽聽}
聽聽// check to see if a render system was selected; if we reached the end of the list
聽聽// without selecting a render system then none was found.
聽聽if (rSys == 0) {
聽聽聽delete root;
聽聽聽std::cerr << "No RenderSystem available, exiting..." << std::endl;
聽聽聽return -1;
聽聽}
聽聽// We can initialize Root here if we want. "false" tells Root NOT to create
聽聽// a render window for us
聽聽root->initialise(false);
聽聽// set up the render window with all default params
聽聽RenderWindow *window = rSys->createRenderWindow(
聽聽聽"Manual Ogre Window",聽// window title
聽聽聽800,聽聽聽聽聽// window width, in pixels
聽聽聽600,聽聽聽聽聽// window height, in pixels
聽聽聽false,聽聽聽聽聽// fullscreen or not
聽聽聽0);聽聽聽聽聽聽// use defaults for all other values
聽聽// from here you can set up your camera and viewports as normal
聽聽// get a pointer to the default base scene manager -- sufficient for our purposes
聽聽SceneManager *sceneMgr = root->createSceneManager(ST_GENERIC);
聽聽// create a single camera, and a viewport that takes up the whole window (default behavior)
聽聽Camera *camera = sceneMgr->createCamera("MainCam");
聽聽Viewport *vp = window->addViewport(camera);
聽聽vp->setDimensions(0.0f, 0.0f, 1.0f, 1.0f);
聽聽camera->setAspectRatio((float)vp->getActualWidth() / (float) vp->getActualHeight());
聽聽camera->setFarClipDistance(1000.0f);
聽聽camera->setNearClipDistance(5.0f);
聽聽// Run the manual render loop. Since we are not using a frame listener in this case, we
聽聽// will count to 15 seconds and then instead of exiting, we'll change the render window settings
聽聽// and re-initialize it.
聽聽bool renderLoop = true;
聽聽Timer *timer = Ogre::PlatformManager::getSingleton().createTimer();
聽聽timer->reset();
聽聽float s = 0.0f;
聽聽while (renderLoop && window->isActive()) {
聽聽聽renderLoop = root->renderOneFrame();
聽聽聽// accumulate total elapsed time
聽聽聽s += (float)timer->getMilliseconds() / 1000.0f;
聽聽聽// if greater than 15 seconds, break out of the loop
聽聽聽if (s >= 15.0f)
聽聽聽聽renderLoop = false;
聽聽聽// we must call the windowing system's message pump each frame to
聽聽聽// allow Ogre to process messages
聽聽聽//PlatformManager::getSingleton().messagePump();
聽聽}
聽}
聽catch (Exception &e) {
聽聽std::cerr << e.getFullDescription() << std::endl;
聽}
聽delete root;
聽return 0;
}
瑙嗗彛
閫氳繃瑙嗗彛涓婄殑涓鐐逛笌鐩告満鐨勫師鐐逛駭鐢熶笘鐣岀┖闂翠腑鐨勪竴鏉″厜綰?br />// x and y are in "normalized" (0.0 to 1.0) screen coordinates
Ray getCameraToViewportRay(Real x, Real y) const;
瑙嗗彛,鍒涘緩澶氫釜瑙嗗彛錛岄氳繃Z搴忥紙瓚婇珮瓚婂湪涓婏級銆紜畾瑕嗙洊鏁堟灉錛屾瘡涓鍙e彲浠ユ湁涓嶅悓鐨勮儗鏅?br />// assume window is a valid pointer to an existing render window, and
// a valid pointer to an existing camera instance
Viewport *vpTop, *vpBottom;
// second parameter is z-order, remaining params are position and size,
vpBottom = window->addViewport(camera, 0);
// create a smaller viewport on top, in the center, 25% of main vp size
vpTop = window->addViewport(camera, 1,
0.375f, 0.375f,
0.25, 0.25);
// set the background of the top window to blue (the default is black
// need to set the bottom window explicitly)
vpTop->setBackgroundColour(ColourValue(0.0f, 0.0f, 1.0f));
// an alternate way to set the color is to use the manifest constant
// vpTop->setBackgroundColour(ColourValue::Blue);
鍦ㄥ瑙嗗彛鎯呭喌涓嬶紝overlay緙虹渷鍦ㄦ瘡涓鍙d腑娓叉煋銆傚彲浠ュ叧鎺夈係kybox, Shadow涔熸槸濡傛銆?br />vpTop->setOverlaysEnabled(false);
vpTop->setSkiesEnabled(false);
vpTop->setShadowsEnabled(true);
瀛愮郴緇熸瑙?/font>
Root Object
Root 鏄▼搴忚繘鍏ョ偣錛屽畠鏄竴涓猣a莽ade 綾伙紝鎻愪緵浜嗚闂瓙緋葷粺鐨勬柟渚跨殑鏂規硶銆傞氳繃瀹冨彲浠ュ紑鍚痮gre,涔熷彲鑳介氳繃瀹冨叧闂璷gre銆?/font>
璧勬簮綆$悊
鍦ㄦ覆鏌撳満鏅腑浣跨敤鐨勪換浣曚笢瑗塊兘琚涓鴻祫婧愩傛墍鏈夌殑璧勬簮鏈緇堥兘琚竴涓崟涓被瀵硅薄綆$悊錛歊esourceGroupManager錛屽畠璐熻矗瀹氫綅璧勬簮錛屽垵濮嬪寲璧勬簮錛堜笉鐪熸瑁呰澆錛夈?
鍦ㄧ己鐪佹儏鍐典笅錛孫gre璁よ瘑浠ヤ笅綾誨瀷鐨勮祫婧愶細
Mesh: 浜岃繘鍒舵牸寮忥紝瀹冧篃鍙寘鍚?morph 鍜屻pose 鍔ㄧ敾鏁版嵁
Skeleton: 銆鍙互琚玀esh鏂囦歡寮曠敤錛屼篃鍙崟鐙嬌鐢紝鍖呭惈楠ㄩ灞傛緇撴瀯淇℃伅錛屽叧閿撫淇℃伅銆?
Material: 銆瀹氫箟浜嗘覆鏌撲竴緇勫嚑浣曚綋鏃剁殑娓叉煋鐘舵侊紝鍙互琚玬esh鏂囦歡寮曠敤錛屼篃鍙互鎵嬪伐浣跨敤銆?
GPU 紼嬪簭錛?program 鏀寔HLSL, GLSL,Cg 涓庝綆綰х殑 .asm 錛岃繖浜涙枃浠朵細鍦ㄤ換浣?material涔嬮棿琚墫鏋愶紝鍥犳鍦ㄤ竴涓猰aterial涔嬩腑琚紩鐢ㄧ殑Gpu紼嬪簭鎬繪槸鏈夋晥鐨勩?
Compositor: 涓嶮aterial寰堢浉浼鹼紝鎵╁睍鍚嶄笉鍚?
Font: 鐢ㄥ瓧浣撳畾涔夋枃浠跺幓瀹氫箟鍦╫verlay涓嬌鐢ㄧ殑瀛椾綋錛屾墿灞曞悕 .fontdef
姣忕璧勬簮閮芥湁鑷繁鐨勭壒瀹氱殑ResourceManager,濡傦紝MaterialManager, FontManager銆俁esourceGroupManager璐熻矗閫氳繃鍚嶅瓧鏌ユ壘璧勬簮錛屽畠涓嶈礋璐e疄闄呯殑鍐呭瓨綆$悊浠誨姟銆傝繖浜涗換鍔℃槸鐢盧esourceManager鍩虹被鏉ュ畬鎴愮殑銆俁esourceGroupManager鍏佽閫氳繃緇勫悕鏉ュ姞杞斤紝閲婃斁鏁寸粍璧勬簮銆?
榛樿鎯呭喌涓嬶紝Ogre璁や負璧勬簮浠ヤ竴涓鐩樻枃浠剁殑褰㈠紡瀛樺湪銆傜劧鑰岋紝鏈変簺綾誨瀷鐨勮祫婧愬彲浠ユ墜宸ョ鐞嗭紝褰撳墠鍙湁mesh, font 鏈夋墜宸ヨ祫婧愬姞杞界殑瀹炵幇銆傚叾浠栫被鍨嬬殑鍙互鑷繁瀹炵幇錛孫gre宸茬粡鍦ㄥ畠鐨勬鏋朵腑淇濈暀浜嗚繖縐嶅姛鑳姐?
鍦烘櫙綆$悊
鎵鏈夌殑鍏蜂綋瀹炵幇閮戒粠SceneManager媧劇敓鑰屾潵錛岀▼搴忎腑甯鎬笌姝ょ被浜や簰銆傦紝鍙互鏈夊涓椿鍔ㄧ殑SceneManager銆傚畠浠敤鏉ョ鐞哠ceneNode, SceneNode鍙互鍦ㄥ満鏅腑琚Щ鍔ㄣ係ceneNode涔熷彲浠ユ湁灞傛緇撴瀯銆?
鍦烘櫙瀹為檯鍐呭緇忓父涔烢ntity瀹炰緥鐨勫艦寮忓瓨鍦ㄣ傚畠浠Scene Manager鍒涘緩錛孧ovableObject瀹炵幇銆備竴涓湁鏁堢殑Entity鍙互琚玜ttach 鍒癝ceneNode涓婇潰銆侲ntity 緇忓父浠庣鐩樹笂浠?mesh鏂囦歡鍔犺澆銆傜劧鍚庝篃鍙互鎵嬪伐鍒涘緩鍐呭瀵硅薄錛屽plane.褰揈ntity琚玜ttach鍒癝ceneNode涓婃椂錛岃繘琛岀Щ鍔ㄧ瓑鎿嶄綔鏄拡瀵筍ceneNode鐨勶紝鑰屼笉鏄唴瀹瑰璞°?
涔熷彲浠ユ妸闈炲唴瀹瑰璞?鐏紝鐩告満絳?attach 鍒癝ceneNode涓婇潰銆?
娓叉煋緋葷粺涓庢覆鏌撳璞?
RenderSystem 鏄疧gre涓庡簳灞侫PI鐨勬帴鍙? RenderTarget 鏄娓叉煋紿楀彛涓庢覆鏌撶汗鐞嗙殑姒傛嫭銆?
Ogre 鎵舵寔澶氫釜娓叉煋紿楀彛銆傜獥鍙e彲浠ラ氳繃Root瀵硅薄鑷姩銆佹墜鍔ㄥ湴鍒涘緩錛屼篃鍙兘閫氳繃RenderSystem鍒涘緩銆?
Ogre 綆$悊鍣?/font>
Manager 鏄竴涓彲浠ヨ闂浉鍏崇被鍨嬪璞★紝綆$悊鍏剁敓鍛藉懆鏈熺殑綾匯備緥濡傦紝ArchiveManager綆$悊Archive瀹炵幇鐨勫垱寤轟笌娉ㄥ唽錛岃闂敞鍐岀殑Archive瀹炵幇瀹炰緥銆俁oot瀵硅薄鍒涘緩鐨勫壇浣滅敤涔嬩竴灝辨槸鍒濆鍖栨墍鏈塷gre Manager瀵硅薄銆?
LogManager : 鍙戦佹棩蹇椾俊鎭埌杈撳嚭嫻併?
ControllerManager: 綆$悊 controllers,鍚庤呮槸鍩轟簬鍚勭杈撳叆錛屼負鍒殑綾諱駭鐢熺姸鎬佸間互渚涗嬌鐢ㄣ?
DynLibManager: 銆綆$悊鍔ㄦ侀摼鎺ュ簱
PlatformManager: 鎶婃娊璞$殑璁塊棶杞崲鎴愬簳灞傜‖浠朵笌鎿嶄綔緋葷粺鐩稿叧鐨勭粏鑺傘?
CompositorManager: 璁塊棶綆$悊銆Compoitor framework.
ArchiveManager: 銆鏂囦歡緋葷粺鐩綍錛孼IP鏂囦歡
ParticleSystemManager: 綺掑瓙緋葷粺錛屽彂灝勫櫒錛屽獎鍝嶅櫒錛坅ffector錛?
SkeletonManager:聽 鍏佽鍚屽悕鐨剆keleton瀵硅薄閲嶇敤
MeshManager :聽 綆$悊mesh, 鍏佽鍚屽悕mesh閲嶇敤
HighLevelGpuProgramManager: 緇存姢錛屽姞杞斤紝緙栬瘧楂樼駭GPU紼嬪簭
GpuProgramManager: 緇存姢浣庣駭GPU紼嬪簭錛屾妸緙栬瘧鐨勯珮綰PU紼嬪簭杞負姹囩紪
ExternalTextureSourceManager:聽 綆$悊澶栭儴綰圭悊婧愮被瀹炰緥錛屽瑙嗛嫻?
FontManager:聽 綆$悊Overlay涓嬌鐢ㄧ殑瀛椾綋
ResourceGroupManager: 鍔犺澆錛岀敓鍛芥湡綆$悊錛屾墍鏈夋敞鍐岀殑紼嬪簭璧勬簮
OverlayManager: 鍔犺澆錛屽垱寤猴紝2D Overlay 綾誨疄渚?
HardwareBufferManager: 綆$悊鍏變韓紜歡緙撳啿錛屻欏剁偣緙撳啿錛屽儚绱犵紦鍐詫紝绱㈠紩緙撳啿絳夈?
TextureManager: 綆$悊綰圭悊
鎬葷粨錛?榪欎竴绔犳棤鎰忚鐩栧叧浜嶰gre鐨勬墍鏈変笢瑗匡紝鍙鏄庝簡涓浜涙櫘閬嶉渶瑕佺殑Ogre瀵硅薄錛屽拰涓浜涗笉澶父鎵撲氦閬撶殑ogre 瀵硅薄銆?
聽
璁捐鍝插
浼犵粺涓婏紝浣跨敤 Direct3D 鎴?OpenGL 鏉ユ覆鏌撳満鏅拰瀵硅薄錛岄渶瑕侀伒寰竴緋誨垪紼嬪簭澶勭悊嫻佺殑姝ラ錛氳皟鐢?API 璁劇疆娓叉煋鐘舵侊紝璋冪敤 API 鍙戦佸嚑浣曚綋淇℃伅錛岄氱煡 API 鎴?GPU 鍘繪覆鏌撳嚑浣曚綋銆傚姣忎釜鍑犱綍浣撻兘鏄姝よ繑澶嶏紝鐩村埌褰撳墠甯ц瀹屽叏娓叉煋銆傚湪涓涓嬪撫鍚屾牱濡傛銆?
浣跨敤闈㈠悜瀵硅薄鐨勬柟娉曟潵娓叉煋鍑犱綍浣撶畝鍖栦簡涓婅堪榪囩▼銆傞氳繃澶勭悊緇勬垚鍦烘櫙鐨勫悇縐嶅璞¤屼笉鏄師濮嬬殑鍑犱綍浣撱傝繖浜涘璞″寘鎷細鍙繍鍔ㄥ璞★紝闈欐佸璞★紙鏋勬垚涓栫晫甯冨眬錛夛紝鍏夛紝鐩告満絳夈傞偅浜?3D API 鍒欎笉鍐嶉渶瑕侊細鍙槸鎶婅繖浜涘璞℃斁鍒板満鏅腑錛?Ogre 璐熻矗澶勭悊鐞愮鐨勭粏鑺傘傝屼笖錛屽彲浠ョ敤鏇村姞鐩磋鐨勬柟娉曟潵鎿嶇旱瀵硅薄錛岃屼笉鏄嬌鐢ㄧ煩闃點傛葷殑璇存潵錛屾垜浠彲浠ュ鐞嗗璞★紝瀹冪殑灞炴э紝璋冪敤鏇寸洿瑙傜殑鏂規硶錛岃屼笉鍐嶇敤欏剁偣鍒楄〃錛屼笁瑙掑艦鍒楄〃錛屾棆杞煩闃電瓑鎵嬫鏉ョ鐞嗕簡銆?
Ogre 鎻愪緵浜嗛潰鍚戝璞$殑妗嗘灦錛屽寘鎷簡瀵硅薄妯″瀷涓殑娓叉煋澶勭悊鐨勬墍鏈夐儴鍒嗐傛覆鏌撶郴緇熸娊璞′簡搴曞眰 3D 銆 API 鐨勫鏉傛с傚満鏅浘褰㈠姛鑳借鎶借薄鎴愬崟鐙殑鎺ュ彛錛岃繖鏍蜂竴鏉ワ紝鍚勭涓嶅悓鐨勫満鏅浘褰㈢鐞嗙畻娉曞彲浠ュ嵆鎻掑嵆鐢ㄣ傚湪鍦烘櫙涓殑鎵鏈夊彲娓叉煋瀵硅薄錛屾棤璁烘槸鍙Щ鍔ㄧ殑錛岃繕鏄潤鎬佺殑錛岄兘琚竴緇勫叕鍏辨帴鍙f娊璞★紝榪欎簺鎺ュ彛鎻愪緵浜嗗疄闄呯殑娓叉煋鎿嶄綔錛堜緥濡?techniques 鍜屽畠鎵鍖呭惈鐨?passes 錛?.
璁捐浜偣
涓鈥滆璁℃ā寮忊濈殑鍚堢悊浣跨敤
Ogre 涓ぇ閲忎嬌鐢ㄤ簡緇忓吀鐨勮璁℃ā寮忋備緥濡傦紝浣跨敤鈥?Observer 鈥濇ā寮忔潵閫氱煡搴旂敤紼嬪簭鐗瑰畾浜嬩歡鐨勫彂鐢燂紝鍦?demo 涓?FrameListener 鐨勪嬌鐢ㄤ嬌寰楃▼搴忓彲浠ユ帴鏀躲 frame-started and frame-ended 銆浜嬩歡閫氱煡銆傗?Singleton 鈥濇ā寮忓己鍒跺疄鐜扮被鐨勫崟瀹炰緥銆傗?Iterator 鈥濇ā寮忕敤鏉ラ亶鍘嗘暟鎹粨鏋勭殑鍐呭銆?
鈥淰isitor鈥?妯″紡鐢ㄦ潵鍦ㄥ璞′笂鎵ц鏌愮鎿嶄綔銆?Fa莽ade 妯″紡鐢ㄦ潵鎶借薄搴曞眰錛屾彁渚涗竴涓崟涓綾繪帴鍙c?
鈥?Factory鈥?銆鐢ㄦ潵鍒涘緩瀹炰緥銆?
浜?鍦烘櫙鍥句笌鍐呭鍒嗙
浼犵粺涓婏紝鍦烘櫙鍥句笌鍐呭鍚屽浜庡悓涓緇ф壙浣撶郴涓嬨傚畠瑕佹眰浠庡満鏅粨鐐瑰瓙綾誨寲鍐呭綾伙紝涔熷氨鏄鍐呭綾諱粠鍦烘櫙緇撶偣緇ф壙銆傚疄璺佃瘉鏄庤繖縐嶈璁¢潪甯哥碂緋曘?棣栧厛錛?Ogre 鎿嶄綔鍦烘櫙鍥懼艦鍦ㄦ帴鍙e眰 , 瀹冧笉鍋囪鐗瑰畾鍥懼艦綆楁硶鐨勫疄鐜般傚疄闄呬笂錛?Ogre 鎿嶄綔鍦烘櫙鍥懼艦浠呬粎閫氳繃瀹冪殑絳懼悕錛堟柟娉曪級錛屽畬鍏ㄥ拷鐣ュ簳灞傜殑綆楁硶瀹炵幇銆?
絎簩錛?Ogre 鐨勫浘褰㈡帴鍙e彧鍏沖績鍥懼艦緇撴瀯錛屼笉鍖呭惈浠諱綍鍐呭湪鐨勮闂垨綆$悊鍔熻兘銆傚悗鑰呰鎺ㄥ埌 Renderable 涓紝鍦烘櫙涓殑鎵鏈夊嚑浣曪紙 movable or otherwise 錛夐兘浠庡畠緇ф壙銆傝繖浜?Renderalbes 鐨勬覆鏌撳睘鎬э紙鏉愯川錛?materials 錛夎鍖呭惈鍒?Entity 瀵硅薄涓幓銆?Entity 鍙互鍖呭惈涓涓垨澶氫釜 SubEntity 銆傝繖浜涘瓙瀹炰綋鏄疄闄呯殑鍙覆鏌撳璞°備笅闈㈡槸鍚勫璞$殑涓涓叧緋誨浘錛?br />
閫氳繃榪欐牱鐨勮璁★紝鍦烘櫙綆$悊涓庡満鏅唴瀹瑰厖鍒嗚В钘曘傝繃浜庡満鏅浘鏉ヨ錛岄氳繃 Movable Object 鍑犱綍錛屾覆鏌撳睘鎬у彉寰楁湁鏁堛傛敞鎰忓埌 Movable 涓嶆槸浠?Scene Node 緇ф壙鑰屾潵鐨勩?Movable Object 鏄?attached 鍒?Scene Node 涓婂幓鐨?. 褰撴墿灞曪紝鏀瑰彉錛岄噸鏋勫満鏅浘褰㈠疄鐜版椂瀵瑰満鏅唴瀹瑰璞$殑璁捐涓庡疄鐜版病鏈変換浣曞獎鍝嶃?
浠庡彟涓鏂歸潰鏉ヨ錛岀敱浜庡満鏅浘褰笉闇瑕佺煡閬撳唴瀹圭被鐨勪換浣曞彉鍖栥傚彧瑕佸疄鐜頒竴浜涚畝鍗曠殑鍦烘櫙鍥懼艦鈥滅‘瀹炩滈渶瑕佺煡閬撶殑涓浜涙帴鍙c傚洜姝わ紝鎴戜滑鍙互浠繪剰鐨?attached 涓浜涜嚜瀹氫箟鐨勪笢瑗垮埌鍦烘櫙緇撶偣涓婏紝姣斿澹伴煶淇℃伅絳夈傦紙鍚鏈変釜 OgreAL, 瀹冨寘瑁呬簡 OepnAL 錛岀寽鎯沖氨鏄繖鏍峰仛鐨勫惂錛夈?
涓夈鎻掍歡緇撴瀯
OGRe 琚璁℃垚鍙墿灞曠殑銆?Ogre 閫氳繃鈥滃熀浜庡綰︾殑璁捐 鈥?鏉ュ畬鎴愩?Ogre 鍙互琚璁℃垚涓緇勫叡鍚屽伐浣滅殑緇勪歡錛屽畠浠氳繃涓浜涘凡鐭ユ帴鍙f潵鐩鎬簰浜ゆ祦銆傝繖甯︽潵鏋佸ぇ鐨勭伒媧繪э紝鏌愮鍔熻兘鐨勪笉鍚屽疄鐜頒笌鏀瑰彉闈炲父瀹規槗銆備婦渚嬫潵璁詫紝鐢變簬 ogre 澶勭悊鍦烘櫙鍥懼厓綆$悊鏄湪鎺ュ彛綰э紝鐢ㄦ埛鍙互闅忔剰鐨勯夋嫨鐗瑰畾綆楁硶鐨勫疄鐜般傝屼笖錛屽綋鐢ㄦ埛鍒涘緩涓涓柊鐨勫疄鐜幫紝鍙互寰堝鏄撶殑浠ユ彃浠剁殑褰㈠紡鎻愪緵緇?Ogre, 銆瀹炵幇鏃跺彧瑕侀伒寰?ogre 瀹氫箟鐨勪竴浜涙帴鍙?. File archives , render systems 涔熶互鎻掍歡鐨勫艦寮忔彁渚涳紝綺掑瓙緋葷粺涔熸槸銆?鎻掍歡褰㈠紡鐨勫惛寮曚漢涔嬪鏄紝涓轟簡鍔犲叆鎻掍歡錛屼笉闇瑕侀噸鏂扮紪璇?Ogre 搴?. 鎻掍歡鍙互鍦ㄨ繍琛屾椂鍔犺澆銆?
鍥涖紜歡鍔犻熺殑娓叉煋鏀寔
Ogre 琚璁℃垚鍙敮鎸佺‖浠跺姞閫熷浘褰㈡覆鏌擄紝鐩存帴杞歡娓叉煋涓嶆槸瀹冪殑閫夐」銆?Ogre 浣跨敤瀹屾暣鐨勭‖浠跺姞閫熻兘鍔涳紝鍖呮嫭鍙紪紼?shaders 銆?Unreal 寮曟搸鑳藉仛浠涔堬紝 Ogre 灝辮兘鍋氫粈涔堬紒錛侊紙 ^_^, 浣滆呰鐨勶級銆傚紩鎿庣洿鎺ユ敮鎸佺殑鍏ㄥ眬鍏夌収 (precomputed Radiance Transfer 絳?) 榪樻病鏈夊疄鐜幫紝鍥犱負榪欎簺澶氭暟鐢ㄤ簬闈炲疄鏃惰綆楀満鍚堬紝鍥犳涓嶆槸浠涔堥棶棰?.Ogre 鐜板湪鍜屾湭鏉ュ皢鍙兘鍙嬌鐢?Direct3D 涓?OpenGL 銆?
浜旓紝鐏墊椿鐨勬覆鏌撻槦鍒楃粨鏋?
Ogre 銆閲囧彇涓涓柊鏂規硶鏉ヨВ鍐沖満鏅腑鍚勯儴鍒嗘覆鏌撴搴忛棶棰樸傜矖鐣ュ湴鐪嬶紝鏍囧噯榪囩▼閫氬父濡備笅宸ヤ綔錛氭覆鏌撳湴褰㈡垨涓栫晫鍑犱綍錛屾覆鏌撳彲縐誨姩瀵硅薄錛屾覆鏌撳悇縐嶇壒鏁堬紝娓叉煋 OverLay, 娓叉煋鑳屾櫙鎴栧ぉ絀虹洅 . 鐒惰岋紝姝e鍏稿瀷鐨勫疄鐜頒竴鏍鳳紙鍍忛泦鎴愮數璺鐞嗘ā鍧楋級錛岃繖涓繃紼嬪緢闅炬敼鍙?. 鍦ㄨ澶氫緥瀛愪腑錛?寰堥毦鏀瑰彉娓叉煋鐨勯『搴忥紝瀵艱嚧闅句互緇存姢涓庝笉鐏墊椿鐨勮璁$殑銆?娓叉煋闃熷垪鐨勬蹇墊槸錛?Ogre 浠ヤ竴嬈′竴涓殑鏂瑰紡娓叉煋涓緇勫彲浠ユ帓搴忕殑闃熷垪錛屼篃宸插悓鏍風殑鏂瑰紡娓叉煋姣忎釜闃熷垪涓殑鍐呭銆備篃灝辨槸闃熷垪鏈韓鏈変紭鍏堢駭錛屽悓鏍烽槦鍒椾腑鐨勫璞′篃鏈夎嚜宸辯殑浼樺厛綰с?br />
涓婂浘涓紝闃熷垪鐢卞悗鍚戝墠娓叉煋錛?Background 脿 OveryLay 錛?, 鍦ㄦ渶鍓嶇殑闃熷垪涓粠宸﹁嚦鍙蟲覆鏌撱?
鍦ㄨ繖縐嶆満鍒朵笅閲嶆柊緇勭粐娓叉煋欏哄簭闈炲父綆鍗曪紝鍙閲嶆柊鍒嗛厤浼樺厛綰у氨鍙互浜嗐傞槦鍒楀彲浠ュ畾鍒訛紝闃熷垪涓殑瀵硅薄涔熷彲浠ャ傛暣涓槦鍒楀彲浠モ?turned on鈥?and 鈥渢urned off鈥?錛岄槦鍒椾腑鐨勫璞′篃鍙互銆?姣忎釜闃熷垪鎻愪緵浜嗕簨浠墮氱煡錛堝 prerender and postrender 錛?, 搴旂敤紼嬪簭鏈夋満浼氭敼鍙橀槦鍒椾腑鐨勫璞℃覆鏌撱傝繖涓満鍒跺浜庡紑鍙戝拰緇存姢澶嶆潅紼嬪簭閮界浉褰撴湁鐢ㄣ?
鍏鍋ュ.鐨勬潗璐ㄧ郴緇?
Ogre 鐨勬潗璐ㄧ敱涓涓垨澶氫釜 technique 緇勬垚錛?technique 鏄?pass 鐨勯泦鍚堛?Pass 鏄潗璐ㄧ駭鍒殑娓叉煋鍗曞厓錛屽鑷翠竴嬈″浘褰㈢‖浠剁殑 鈥漝raw鈥?璋冪敤銆傚彲浠ユ湁澶氫釜 pass, 姣忎釜 pass 鏄竴嬈″叏鏂扮殑娓叉煋鎿嶄綔錛屽寘鎷‖浠舵覆鏌撶姸鎬佹敼鍙樸?
鏈鍚稿紩浜虹殑鐗規ф槸 automatic fallback 銆?Ogre 鑷笂鍚戜笅鍦幫紙 technique 鍒楀嚭鐨勯『搴忥級瀵繪壘鏈閫傚綋鐨?technique.Ogre 榪樿兘灝藉姏鍦伴噸鏂扮粍緇?technique 涓殑 pass, 浠ヨ繋鍚堟渶灝忕殑鎶鏈渶姹傘備緥濡傦紝褰撳墠紜歡鍙敮鎸佸崟綰圭悊鍗曞厓錛岃屼綘紼嬪簭涓渶灝忓鏉傚害鐨勬妧鏈紝闇瑕佽嚦灝戜袱涓汗鐞嗗崟鍏冿紝閭d箞 ogre 浼氭妸涓涓?pass 鎷嗗垎鎴愪袱涓紝閫氳繃娣峰悎涓や釜鍗曞厓綰圭悊鐨勬柟寮忚揪鍒板悓鏍風殑鏁堟灉銆?
Ogre 鏉愯川緋葷粺涔熸敮鎸?schemes 鐨勬蹇點?Schemes 鍙互鐞嗚В浣滀負鏅亶鐨勨滈潪甯擱珮錛岄珮錛屼腑錛屼綆鈥滀笉鍚岀瓑綰х殑鍥懼艦璁劇疆銆傚湪榪欑鎯呭喌涓嬶紝鍙互瀹氫箟鍥涗釜 schemes , 騫朵負姣忎竴涓垎閰?techniques( 澶嶆暟 ) 銆傝繖鏍峰氨鍙互 ogre 鐨勬墍璋?technique fallback 鏌ユ壘閭d簺灞炰簬鐗瑰畾 schemes 鐨?techniques 銆備嬌寰楁潗璐ㄧ鐞嗘洿瀹規槗鐐廣?
鐢ㄦ潗璐ㄨ剼鏈畬鎴愮殑浜嬶紝鍚屾牱涔熷彲浠ョ敤浠g爜鐨勬柟寮忓畬鎴愩備唬鐮佺殑鏂瑰紡涔熸敮鎸?schemes 涓?technique fallback 銆?
涓冦鏈湴浼樺寲鐨勫嚑浣曚笌楠ㄩ鏍煎紡
Ogre 浣跨敤瀹冨崟鐙殑 mesh 涓庨楠兼牸寮忋備笉鑳界洿鎺ュ姞杞界涓夎蔣浠跺寘鐢熸垚鐨勬暟鎹傜ぞ鍖轟腑鏈夎漿鎹㈢涓夋枃浠舵牸寮忕殑宸ュ叿錛屼絾瀹冧笉鏄?Ogre 搴撶殑涓閮ㄥ垎銆?Ogre 浣跨敤鑷繁鐨勬牸寮忔槸涓轟簡鏁堢巼銆?
鍏銆澶氱綾誨瀷鐨勫姩鐢?
Ogre 鏀寔涓夌綾誨瀷鐨勫姩鐢伙細楠ㄩ鍔ㄧ敾錛屽彉褰㈠姩鐢伙紝 Pose 鍔ㄧ敾
楠ㄩ鍔ㄧ敾錛屾妸欏剁偣緇戝畾鍒伴楠間笂銆傚璞$殑姣忎釜欏剁偣鍙互鍙楀埌鍥涗釜鐙珛鐨勯澶村獎鍝嶃傛瘡縐嶅獎鍝嶈璧嬩簬涓涓敤鏁伴噺琛ㄧず鐨勬潈閲嶃傞楠煎姩鐢誨彧鍦ㄥ叧閿撫涓婃墽琛屽墠鍚戣繍鍔ㄥ妯″紡銆?Ogre 褰撳墠涓嶆敮鎸侀嗗悜鍔ㄧ敾 .
Morph 鍔ㄧ敾鏄竴縐嶉《鐐瑰姩鐢繪妧鏈紝浠栧偍瀛樺叧閿撫涓婄殑緇濆鐨勯《鐐逛綅緗俊鎭紝鍦ㄨ繍琛屾椂鍦ㄤ袱涓叧閿撫涔嬮棿鎻掑箋傝繖涓?Pose 鍔ㄧ敾涓嶅悓錛?Pose 鍔ㄧ敾瀛樺偍鐨勬槸鍋忕Щ鏁版嵁鑰屼笉鏄粷瀵逛綅緗?Pose 鍔ㄧ敾鍙互娣峰悎浠ュ艦鎴愬鏉傚姩鐢匯?Morph 鍔ㄧ敾姣?Pose 鍔ㄧ敾鍔熻兘鏈夐檺錛屽洜涓轟粬瀛樺偍鐨勬槸緇濆鍊鹼紝鍥犳闅句互涓庡叾浠?Morph 鍔ㄧ敾娣峰悎銆?Morph 鍔ㄧ敾涓?Pose 鍔ㄧ敾涔嬮棿涔熶笉鑳芥販鍚?.
鎵鏈夌殑鍔ㄧ敾綾誨瀷閮藉彲浠ヤ笌楠ㄩ鍔ㄧ敾娣峰悎浣跨敤 .
鎵鏈夊姩鐢葷被鍨嬮兘鍙嬌鐢ㄨ蔣浠舵墽琛屾垨鏄埄鐢?GPU 紜歡鎵ц銆?
Ogre 鍔ㄧ敾鏄熀浜庡叧閿撫鐨勶紝鍐呮彃鏂瑰紡鏈夌嚎鎬т笌绔嬫柟鏍鋒潯榪欎袱縐嶉夋嫨銆?
涔濄 Compositor Postprocessing ( 鎬庝箞緲昏瘧 ~?)
鐢ㄦ潵鍦ㄤ竴涓鍙d腑鍒涘緩浜岀淮鐨勶紝鍏ㄥ睆鐨勫悗澶勭悊鏁堟灉 . 渚嬪妯$硦錛岄粦鐧界數瑙嗭紝絳夌瓑鏁堟灉錛?Ogre 鏈変釜寰堝ソ鐨勭ず渚嬶級 Compositor 涔熸湁綾諱技浜庢潗璐ㄧ郴緇熺殑 technique 涓?pass 鐨勬蹇點傚湪瑙嗗彛鏈緇堣杈撳嚭鍓嶏紝澶氫釜璁$畻涓庢覆鏌撳彲琚墽琛屻傚儚鏉愯川鐨?fallbacks,Compositor framework 鎻愪緵浜?fallback 澶勭悊錛屼緥濡傦紝褰撹緭鍑虹殑鍍忕礌鏍煎紡鏃犳晥鏃躲傜悊瑙?compositor 鏈瀹規槗鐨勬柟娉曟槸鎶婂畠褰撴垚鐗囨紼嬪簭錛堝儚绱犳覆鏌擄級鐨勬墿灞曘備笉鍚屼箣澶勫湪浜庯細浼犵粺鐨勫浘褰㈢綰挎瘡涓潗璐?pass 鍙厖璁鎬竴涓墖孌電▼搴忥紝鑰?Compositor framework 鍒欏彲浠ュ儚鎵撲箳涔撶悆涓鏍鋒潵鏉ュ洖鍥炲ソ澶氭銆?Compositor 鑴氭湰鎵鍦?ViewPort 涓婏紝鍥犳瀹冨彲浠ラ潰鍚戜換浣曠殑 render target, 鍙互鏄彲娓叉煋綰圭悊錛屼富錛屽壇娓叉煋紿楀彛銆備笌鏉愯川緋葷粺涓鏍鳳紝瀹冮櫎浜嗗埄鐢ㄨ剼鏈疄鐜幫紝涔熷彲浠ヤ嬌鐢ㄤ唬鐮佸疄鐜般?
鍗伮犅?鎵╁睍璧勬簮綆$悊
鍦?ogre 涓紝璧勬簮瀹氫箟涓猴細娓叉煋鍑犱綍浣撳埌鍙覆鏌撶洰鏍囦笂鐢ㄥ埌浠諱綍涓滆タ銆傚緢鏄庢樉鍖呮嫭錛?mesh, 銆 skeleton, material , overlay script , font , Compositor script, GPU program , texture 銆?
姣忕璧勬簮閮芥湁鑷繁鐨?manager, 瀹冧富瑕佽礋璐f帶鍒剁壒瀹氱被鍨嬭祫婧愬湪鍐呭瓨涓殑鍗犵敤鏁伴噺銆傛崲鍙ヨ瘽璇達紝瀹冩帶鍒剁潃璧勬簮瀹炰緥鐨勭敓鍛芥湡銆備笉榪囦粎浠呭湪涓鐐逛笂鎺у埗錛氶鍏堬紝瀹冨彧鑳藉偍瀛樺悓鏍峰鐨勫疄渚嬶紝鍙栧喅浜庤繖縐嶇被鍨嬬殑璧勬簮鎵鍒嗛厤鐨勫唴瀛樸傜浜岋紝 ogre 涓嶄細鍒犻櫎姝h鍏朵粬閮ㄥ垎寮曠敤鐨勫疄渚嬨?
璧勬簮鏈韓瀹為檯璐熻矗鍔犺澆鑷繁銆傝繖鏄祫婧愮郴緇熺殑涓涓璁$壒鎬э細鎵嬪伐璧勬簮鍔犺澆銆傛墜宸ュ姞杞芥剰鍛崇潃璧勬簮鍔犺澆錛屽鐞嗭紝鏄埄鐢ㄤ竴涓柟娉曡皟鐢ㄥ疄鐜扮殑鑰屼笉鏄粠鏂囦歡緋葷粺涓殣寮忓湴鍔犺澆銆?
璧勬簮鍦?ogre 涓湁鍥涚鐘舵侊細鏈畾涔夛紝銆澹版槑錛屾湭鍔犺澆錛屻鍔犺澆銆?
鏈畾涔夛紝璇存槑 ogre 瀵瑰畠涓鏃犳墍鐭ャ?
澹版槑錛屽畠宸茬粡鍦ㄦ。妗堜腑榪涜浜嗙儲寮曘?
鏈姞杞斤紝宸茬粡榪涜浜嗗垵濮嬪寲錛堣剼鏈紝宸茬粡琚В鏋愯繃浜嗭級錛屽紩鐢ㄥ凡緇忚鍒涘緩
鍔犺澆錛屽凡緇忓湪瀹冪殑璧勬簮 manager 鎵綆$悊鐨勫唴瀛樻睜涓崰鐢ㄧ┖闂翠簡銆?
鍙互鐢ㄢ滅粍鈥濇潵綆$悊綆$悊鍚勭被璧勬簮銆傜粍涓祫婧愪箣闂寸殑鍏崇郴鏄換鎰忕殑錛屽畬鍏ㄥ彇鍐充簬紼嬪簭鍛橈細鍒涘緩 GUI 鐨勬墍鏈夎祫婧愬彲浠ュ垎涓轟竴緇勶紝浠?A 瀛楁瘝寮澶寸殑璧勬簮涔熷彲浠ュ垎涓轟竴緇勶紝絳夌瓑銆傛湁涓?緙虹渷鐨勭粍錛欸eneral
鍦?ogre 涓煡鎵炬煇涓祫婧愬疄渚嬫椂錛屼笉浼氳冭檻錛岃祫婧愭墍鍦ㄧ殑緇勩傛湁鏃訛紝鎴戜滑鍙互灝嗚祫婧愮粍鍛藉綋鎴愭煇縐嶇殑 鈥?鍛藉悕絀洪棿鏉ョ敤鈥溿?
Archives 涓殑璧勬簮鏄潪鎵嬪姩鍔犺澆鐨勩?Archives 鏄櫘閫氭枃浠跺鍣ㄧ殑綆鍗曟娊璞°傚畠鍖呮嫭鏂囦歡緋葷粺涓?ZIP 妗f銆傜敤鎴峰彲浠ュ疄鐜拌嚜瀹氫箟綾誨瀷鐨?archive 銆?
鍦ㄤ互鍓嶇殑絎旇涓凡緇忓 CEGUI 鐨勪嬌鐢ㄥ仛浜嗙畝鍗曠殑浠嬬粛錛岃繖閲屼負浜嗗畬鏁存ц繕鏄妸瀹?C 錛?P 涓涓嬶細
浣跨敤 cegui 鏉ュ埗浣滅晫闈?, 涓嶈鍦ㄤ綍縐嶅鉤鍙頒笅 , 鏈夊熀鏈殑涓夊ぇ姝ラ瑕佸仛 :
1, 鍒涘緩涓涓?CEGUI::Render 瀹炰緥
2, 鍒涘緩 CEGUI::System 瀵硅薄
3, 璋冪敤鍚勭鏂規硶鏉ユ覆鏌撶敤鎴風晫闈?
絎竴姝?, 鍦ㄦ垜浣跨敤鐨?ogre 鐜涓嬩嬌鐢ㄤ互涓嬩唬鐮佹潵鍒涘緩 CEGUI::Render 瀹炰緥
Ogre3D
CEGUI::OgreCEGUIRenderer* myRenderer =
聽聽聽聽聽聽 new CEGUI::OgreCEGUIRenderer(myRenderWindow);
絎簩姝ョ浉褰撶畝鍗?, 鍙嬌鐢?new CEGUI::System(myRenderer);
絎笁姝ワ紝鍩烘湰涓婃潵璁詫紝澶ч儴鍒嗗鉤鍙頒笅錛屽 direct3D, OpenGL, 鎴戜滑鍦ㄦ覆鏌撳驚鐜殑灝鵑儴璋冪敤 CEGUI::System::renderGUI 鏉ュ紑濮嬬晫闈㈢殑娓叉煋銆傚鏋滄垜浠嬌鐢?ogre3d 寮曟搸錛岃繖涓姝ヤ笉闇瑕?鎴戜滑鏄劇ず鐨勬墽琛屻?鍒涘緩 CEGUI 紿楀彛錛屾垜浠彲浠ヤ嬌鐢ㄤ袱縐嶅艦寮忥紝涓鏄?C 錛嬶紜浠g爜錛屼簩鏄紪杈?XML layout 鏂囦歡銆?
CEGUI 鏈韓渚︽祴鐢ㄦ埛杈撳叆錛岃繖浜涗笉鏄?CEGUI 鐨勮矗浠伙紝鑰屾槸紼嬪簭鐨勫憳鐨勮矗浠匯傚綋鏈夌敤鎴峰閮ㄨ緭鍏ユ椂錛屾垜 浠彲浠ラ夋嫨灝嗚繖浜涙秷鎭憡鐭?CEGUI 錛岃繖鏍?CEGUI 鎵嶄細鍝嶅簲銆?
CEGUI 浣跨敤鍥炶皟鏈哄埗鏉ヨ繘琛屾秷鎭鐞嗐傚彲浠ヤ負鏌愪釜紿椾綋鐨勭壒瀹氫簨浠舵敞鍐屼竴涓嚱鏁幫紝褰撶獥浣撲簨浠跺彂鐢熸椂錛?CEGUI 浼氳嚜鍔ㄨ皟鐢ㄦ墍娉ㄥ唽鐨勫嚱鏁般?
DEMO 涓渶瑕佹敞鎰忕殑鏄?Render To Texture 鐨勫疄鐜般?
鍏堝垱寤哄湪 ogre 涓殑 RTT:
RenderTexture * rttTex = mRoot->getRenderSystem()->createRenderTexture( "RttTex", 512, 512, TEX_
TYPE_2D , PF_R8G8B8 );
鍐嶈漿鎹㈡垚CEGUI鍙瘑鍒殑:
// Retrieve CEGUI texture for the RTT
聽聽聽聽聽聽聽 CEGUI::Texture* rttTexture = mGUIRenderer->createTexture((CEGUI::utf8*)"RttTex");
鏍規嵁榪欎釜Texture鐢熸垚浜嗕竴涓狪mageSet;
鍦↖mageSet涓畾涔変簡涓涓狪mage錛堝悕涓篟ttImage錛?鍏跺ぇ灝忎笌涓婅竟鐨凾exutre鍚屾牱澶у皬銆?
褰撳湪紿楀彛涓鍔犱竴涓猻tatic Image鏃訛紝鎶婂叾image灞炴ц涓?鈥?RttImage 鈥?鍗沖彲銆?
銆銆1. 鍦ㄤ富紼嬪簭綾葷殑 Application :: createScene ( ) 鍦烘櫙鍒涘緩鏂規硶涓繘琛屼互涓嬪伐浣滐細
銆銆Animation * Ogre::SceneManager::createAnimation (
銆銆 const String & name, // 鍔ㄧ敾鍚嶇О
銆銆 Real length // 鍔ㄧ敾闀垮害(縐?
銆銆 ) [virtual]
銆銆(2) 浣跨敤 createTrack 鏂規硶涓哄姩鐢誨垱寤鴻建榪瑰姩鐢伙細
銆銆 AnimationTrack * Ogre::Animation::createTrack (
銆銆 unsigned short handle, // 鍒嗛厤緇欒建榪瑰姩鐢葷殑绱㈠紩鍙ユ焺錛岀敤浜庝互鍚庡彲鑳界殑璋冪敤
銆銆 Node * node // 鎸囧畾瑕佹部鐫榪欐潯杞ㄨ抗榪愬姩鐨勮妭鐐?br />銆銆 )
銆銆(3) 浣跨敤 createKeyFrame 鏂規硶涓鴻建榪瑰姩鐢誨垱寤轟竴緋誨垪鍏抽敭甯э細
銆銆 KeyFrame * Ogre::AnimationTrack::createKeyFrame (
銆銆 Real timePos // 鏃墮棿浣嶇疆
銆銆 )
銆銆
銆銆 (4) 浣跨敤 setTranslate 銆?setScale 銆?setRotation 涓変釜鏂規硶鏉ヨ緗叧閿撫姣忎釜鏃墮棿浣嶇疆涓婅妭鐐圭殑浣嶇疆銆佺緝鏀俱佹棆杞睘鎬э細
銆銆 void Ogre::KeyFrame::setTranslate ( const Vector3 & trans )
銆銆 void Ogre::KeyFrame::setScale ( const Vector3 & scale )
銆銆 void Ogre::KeyFrame::setRotation ( const Quaternion & rot )
銆銆
銆銆 (5) 浣跨敤 createAnimationState 鏂規硶鍒涘緩涓涓姩鐢葷姸鎬佹潵榪借釜榪欎釜杞ㄨ抗錛?br />銆銆 AnimationState * Ogre::SceneManager::createAnimationState ( const String & animName ) [virtual]
銆銆
銆銆 (6) 浣跨敤 setEnabled 鏂規硶鏉ユ縺媧誨姩鐢葷姸鎬侊細
銆銆 void Ogre::AnimationState::setEnabled ( bool enabled )
銆銆2. 鍦ㄦ帴鏀跺櫒綾葷殑 Listener::frameStarted(const FrameEvent& evt) 鏂規硶涓埛鏂板姩鐢葷姸鎬侊細
銆銆 void Ogre::AnimationState::addTime ( Real offset )
璧勬簮鏄?OGRE 搴旂敤紼嬪簭娓叉煋榪囩▼涓渶瑕佺敤鍒扮殑綰圭悊鍥劇墖銆佺綉鏍兼ā鍨嬫枃浠躲侀楠煎姩鐢繪枃浠剁殑鎬葷О銆?OGRE 搴旂敤紼嬪簭闇瑕佸湪娓叉煋鍓嶅皢榪欎簺璧勬簮杞藉叆鍐呭瓨錛岄偅灝遍渶瑕佽 OGRE 寮曟搸鐭ラ亾璧勬簮鐨勬悳绱㈣礬寰勩傜壒鍒殑鏄?OGRE 寮曟搸鏀寔鐩存帴璇誨彇 Zip 鍘嬬緝鏂囦歡涓殑鍐呭錛屾墍浠?Zip 鏂囦歡涔熷繀欏昏褰撴垚鎼滅儲璺緞鏉ユ寚瀹氥傚湪 OGRE 寮曟搸涓叿鏈夎櫄鎷熸枃浠剁郴緇熺殑姒傚康錛屽紩鎿庡唴閮ㄨ澆鍏ヨ祫婧愭枃浠墮兘鏄氳繃铏氭嫙鏂囦歡緋葷粺鏉ヨ繘琛岀殑錛屽紩鎿庡茍涓嶅叧蹇冭祫婧愭枃浠舵潵鑷竴涓櫘閫氭枃浠跺す銆?zip 鍘嬬緝鍖呯敋鑷崇綉緇滄槧灝勩傜湡姝g殑鏂囦歡璇誨彇鍔熻兘鏄氳繃鎻掍歡鏉ュ疄鐜扮殑錛屾墍浠ュぇ瀹跺湪榪愯鐜閲屽彲浠ュ彂鐜?Plugin_FileSystem.dll 錛屾棭鏈熺殑 OGRE 鐗堟湰榪樻湁 Plugin_Zip.dll 錛屽湪鏂扮殑鐗堟湰閲岃瀹炵幇鍒板紩鎿庡唴閮ㄤ簡銆傜洰鍓嶈繕娌℃湁瀹炵幇瀵圭綉緇滄枃浠剁殑鐩存帴璁塊棶銆?
涓轟簡鏂逛究 OGRE 紼嬪簭鍦ㄨ繍琛屾湡闂存煡鎵捐祫婧愶紝浣跨敤浜嗚祫婧愰厤緗枃浠?resources.cfg 銆傝繖鏄竴涓枃鏈枃浠訛紝鎴戜滑鍙互鍦?OGRE 紼嬪簭鐨勫彲鎵ц鏂囦歡鐨勫悓涓鏂囦歡澶逛笅鎵懼埌瀹冦傚畠鐨勫唴瀹瑰氨鏄璧勬簮璺緞鐨勬寚瀹氾紝紺轟緥濡備笅錛?
Zip=../../../Media/dragon.zip
Zip=../../../Media/knot.zip
Zip=../../../Media/skybox.zip
FileSystem=../../../Media/
濡傛灉璧勬簮鍦ㄤ竴涓?Zip 鏂囦歡涓紝灝卞啓 Zip=****** 錛屽鏋滆祫婧愬湪涓涓櫘閫氱殑紜洏鏂囦歡澶歸噷灝卞啓 FileSystem=****** 錛岄氬父榪欎袱縐嶆儏鍐甸兘鏈夈備緥濡傚湪 OGRE 鑷甫鐨?Demo 涓紝灝卞皢澶ч儴鍒嗚祫婧愭斁鍦ㄤ竴涓枃浠跺す閲岋紝鐗規畩鐨勮祫婧愯鏂囦歡澶逛腑鐨?Zip 鏂囦歡閲屻?
鍦?OGRE 鑷甫鐨勪緥瀛愭鏋?setupResources() 灞曠ず浜?Resources.cfg 鏂囦歡鐨勪嬌鐢細鍏堝埄鐢?ConfigFile 綾誨鏂囦歡鍐呭榪涜浜嗚В鏋愶紝灝嗚祫婧愮洰褰曠敤ResourceGroupManager:: addResourceLocation()鍚慜GRE榪涜鎻愪氦;
Plugins.cfg
Ogre鐨勮澶氬姛鑳芥槸浠ユ彃浠剁殑褰㈠紡鎻愪緵鐨?Ogre鎻愪緵鐨勪互Plugin_寮澶寸殑璁稿.DLL鏂囦歡閮芥槸鎵璋撶殑鎻掍歡銆?br />Plugins.cfg鎸囧畾浜嗘彃浠剁殑璺緞鍜屾彃浠舵枃浠跺悕, 瀹冧滑鍙互鏀懼湪鍏跺畠鏂囦歡澶歸噷錛屼絾蹇呴』鍦ㄦ湰鏂囦歡閲屾寚瀹氳礬寰勩?/p>
鍦?windows 騫沖彴鎻掍歡鐨勮鍏ヨ繃紼嬪涓嬶細
Root::()
{
聽聽 if(!pluginFileName.empty())
聽聽 loadPlugins(pluginFileName);
锝?
鈥曗曗曗曗曗曪紴
void Root::loadPlugins(const String& pluginsfile)
{
聽聽 ConfigFile cfg;
聽聽 cfg.load(pluginsfile);
聽聽聽 ...........................
聽聽 // 瑙f瀽鏂囦歡錛屽鐞嗗悗灝嗙洰褰曚笌鏂囦歡鍚嶈仈鎺?
聽 for(;;)
聽聽 loadPlugin(plugindir + (*it))
} 鈥曗曗曗曗曗曪紴
Root::loadplugin(const string&聽 pluginName)
{
聽聽 DyLibmanager::getsinleton.load(pluginName);
}
鈥曗曗曗曗曗曪紴
DynLibManager::load(const string& filename)
{
聽聽聽聽聽聽聽 DynLib* pLib=new DynLib(filename);
聽聽聽聽聽聽聽 pLib->load();
}
鈥曗曗曗曗曗曪紴
void DynLib::load()
{
聽聽聽聽聽 m_hInst=(DYNLIB_HANDLE)DYNLIB_LOAD(name.cstr());
}
鍦?windows 騫沖彴涓嬫湁濡備笅瀹氫箟錛?
#define聽 DYNLIB_LOAD(a)聽聽聽聽 LoadLibrary(a)
鍒版錛?x.dll 鎻掍歡琚姞杞藉埌鍐呭瓨涓紝鍙互浣跨敤鎻掍歡鐨勫姛鑳戒簡^_^
浠ヤ笅涓轟竴涓吀鍨嬬殑 Plugins.cfg 鏂囦歡鐨勫唴瀹癸細
# Defines plugins to load
# Define plugin folder
PluginFolder=.
# Define plugins
Plugin=RenderSystem_Direct3D9
Plugin=RenderSystem_GL
Plugin=Plugin_ParticleFX
Plugin=Plugin_BSPSceneManager
Plugin=Plugin_OctreeSceneManager
Plugin=Plugin_CgProgramManager
Plugins.cfg 鏂囦歡鍐呭鐩稿綋鐩磋錛屼笉鍐嶈禈榪般?
Ogre::Root::showConfigDialog() 浼氭湁涓嬭堪琛屼負錛氬鏋滅▼搴忚繍琛屼箣闂村凡瀛樺湪涓涓湁鏁堢殑 ogre.cfg 錛岄偅涔堝畠浼氬湪鏄劇ず瀵硅瘽妗嗕箣鍓嶅皢閰嶇疆鏂囦歡鐨勫唴瀹硅澆鍏ワ紝濡傛灉鐢ㄦ埛瀵瑰璇濇榪涜浜嗘搷琛岋紝鏀瑰彉鐨勯厤緗弬鏁幫紝 showConfigDialog() 浼氭牴鎹敤鎴風殑鏂伴夋嫨渚濇璋冪敤 Root::setRenderSystem, RenderSystem::setConfigOption and Root::saveConfig 錛堝湪 ogreWin32ConfigDialog.cpp 涓疄鐜幫紝鍐欒嚜宸辯殑閰嶇疆瀵硅瘽妗嗘椂鍙互鍙傝冿級錛岄渶瑕佹敞鎰忕殑鏄厤緗ソ鐨勫弬鏁幫紝鍙槸鍦?RenderSystem::initialise or RenderSystem::reinitialise 璋冪敤涔嬪悗鎵嶈嬋媧匯?浠ヤ笅涓哄吀鍨嬬殑 ogre.cfg 鏂囦歡鐨勫唴瀹?
Render System=Direct3D9 Rendering Subsystem
[Direct3D9 Rendering Subsystem]
Allow NVPerfHUD=No
Anti aliasing=None
Floating-point mode=Fastest
Full Screen=No
Rendering Device=ATI MOBILITY RADEON X300
VSync=No
Video Mode=800 x 600 @ 32-bit colour
[OpenGL Rendering Subsystem]
Colour Depth=32
Display Frequency=N/A
FSAA=0
Full Screen=No
RTT Preferred Mode=FBO
VSync=No
Video Mode=1024 x 768
鏂規嫭鍙蜂腑涓哄彲浠ラ夋嫨鐨勬覆鏌撳瓙緋葷粺錛岃岀涓琛屾寚鍑轟簡褰撳墠鐨勯夋嫨鏄摢涓瓙緋葷粺錛屾柟鎷彿涓嬮潰涓哄悇瀛愮郴緇熺殑鍙夊弬鏁幫紝鍦ㄤ笂鐨勪緥瀛愪腑鍒嗗埆鍒楀嚭浜?Direct3D 9 涓?OpenGL 瀛愮郴緇熺殑鍙夐厤緗弬鏁般?br />Root(const String& pluginFileName = "plugins.cfg", const String& configFileName = "ogre.cfg", const String& logFileName = "Ogre.log");聽聽聽聽聽聽聽聽 ~Root();
Root 鐨勬瀯閫犲嚱鏁頒紶閫掍簡ogre.cfg,鍙槸綆鍗曠殑灝嗘枃浠跺悕淇濆瓨涓嬫潵錛屼緵鍏跺畠鏂規硶浣跨敤錛屽涓婇潰鏇劇粡鎻愬埌榪囩殑 Root:saveConfig(void);
聽
聽
1.聽 Create the DirectInput object. You use methods of this object to enumerate devices and create DirectInput device objects.
2.聽 Enumerate devices. This is not an essential step if you intend to use only the system mouse or keyboard. To ascertain what other input devices are available on the user's system, have DirectInput enumerate them. Each time DirectInput finds a device that matches the criteria you set, it gives you the opportunity to examine the device's capabilities. It also retrieves a unique identifier that you can use to create a DirectInput device object representing the device.
3.聽 Create a DirectInputDevice object for each device you want to use. To do this, you need the unique identifier retrieved during enumeration. For the system mouse or keyboard, you can use a standard GUID.
4.聽 Set up the device. For each device, first set the cooperative level, which determines the way the device is shared with other applications or the system. You must also set the data format used for identifying device objects, such as buttons and axes, within data packets. If you intend to retrieve buffered data鈥攖hat is, events rather than states鈥攜ou also need to set a buffer size. Optionally, at this stage you can retrieve information about the device and tailor the application's behavior accordingly. You can also set properties such as the range of values returned by joystick axes.
5.聽 Acquire the device. At this stage you tell DirectInput that you are ready to receive data from the device.
6.聽 Retrieve data. At regular intervals, typically on each pass through the message loop or rendering loop, get either the current state of each device or a record of events that have taken place since the last retrieval. If you prefer, you can have DirectInput notify you whenever an event occurs.
7.聽 Act on the data. The application can respond either to the state of buttons and axes or to events such as a key being pressed or released.
8.聽 Close DirectInput. Before exiting, your application should unacquire all devices and release them, then release the DirectInput object.
浜嗚В浜嗚繖浜涘熀鏈楠わ紝涓嬮潰鎴戜滑鎵撳紑OIS鐨勬簮鐮侊紝鐪嬬湅涓婇潰榪?姝ラ灝佽鍒頒簡鍝噷銆傜劧鍚庢垜浠繑鍥?ExampleFrameListener, 鐪嬬湅 demo 涓槸濡備綍浣跨敤 OIS 鐨?.
絎竴涓鐪嬬殑鏄疘nputManager綾匯備粬鎻愪緵浜嗗鉤鍙版棤鍏崇殑鎺ュ彛錛岃礋璐h緭鍏ョ郴緇熺殑鍒涘緩銆傛病鍟ュソ璇寸殑錛岀湅婧愮爜鍚?鍙垪鍑烘牳蹇冧唬鐮?錛?br />InputManager * InputManager::createInputSystem( ParamList ¶mList )
{聽聽聽聽
聽聽聽聽 聽InputManager* im = 0;
聽聽聽聽聽 #elif defined OIS_WIN32_PLATFORM聽
聽聽聽聽聽聽 聽聽聽 im = newWin32InputManager();
聽聽聽 #endif聽
聽聽聽聽聽聽 im->_initialize(paramList);聽
聽聽聽 return im;
}
鑷劧錛屾垜浠彧鍏沖績windows騫沖彴涓嬬殑銆備簬鏄壘鍒版簮鐮佺戶緇湅:
void Win32InputManager::_initialize( ParamList ¶mList )
{聽
聽 //Create the device聽
聽聽 hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&mDirectInput, NULL );
聽聽 /Ok, now we have DirectInput, parse whatever extra settings were sent to us聽
聽聽聽 _parseConfigSettings( paramList );聽
聽聽聽 _enumerateDevices();
}
棣栧厛錛屽畬鎴愪簡8姝ラ涓殑絎?姝ワ紝 Create the DirectInput object 銆?鍦╛parseConfigSettings ( paramList ); 涓浠ュ悗灝嗚鍒涘緩鐨勮澶囷紙閿洏錛岄紶鏍囩瓑錛夌殑灞炴э紝渚嬪鐙崰妯″紡錛屽墠鍙版ā寮忕瓑銆傝繖浜涘睘鎬у垪琛╬aramList聽聽 緇忚繃澶勭悊鍚庯紝涔嬪悗鍦ㄥ垱寤鴻澶囩殑鏃跺欎紶鍏ャ?
void Win32InputManager::_enumerateDevices()
{聽聽聽聽 //Enumerate all attached devices聽
聽聽聽 mDirectInput->EnumDevices(NULL, _DIEnumKbdCallback, this, DIEDFL_ATTACHEDONLY);
}
瀹屾垚浜?姝ラ涓殑絎?銆閮ㄥ垎 Enumerate devices 錛屽畠鏄拡瀵規父鎴忔潌榪欑被璁捐鐨勶紝瀵逛簬閿洏錛岄紶鏍囧茍涓嶉渶瑕併侷nputManager 鍒涘緩涔嬪悗錛屽氨鍙互鐢ㄥ畠鏉ュ垱寤洪敭鐩橈紝榧犳爣浜嗐傚畠鎻愪緵浜嗗涓嬬殑鏂規硶錛?
Object * Win32InputManager::createInputObject( TypeiType, boolbufferMode )
{聽聽聽
聽 Object* obj = 0;聽聽聽
聽聽聽 switch( iType )聽
聽聽聽 {聽
聽聽聽 case OISKeyboard: obj = newWin32Keyboard( this, mDirectInput, bufferMode, kbSettings ); break;聽
聽聽聽 case OISMouse: obj = newWin32Mouse( this, mDirectInput, bufferMode, mouseSettings ); break;聽
聽聽聽 obj->_initialize();聽
聽聽聽 return obj;
}
榧犳爣錛岄敭鐩橀兘鏈夊悇鑷殑綾誨皝瑁呫備笅闈互閿洏涓轟緥錛岀湅鐪嬪畠鐨勬簮鐮佷腑閮藉仛浜嗕簺浠涔堬細
void Win32Keyboard::_initialize()
{
1聽聽聽聽聽 mDirectInput->CreateDevice(GUID_SysKeyboard, &mKeyboard, NULL);
2聽聽聽聽聽 mKeyboard->SetDataFormat(&c_dfDIKeyboard)
3聽聽聽聽聽 HWNDhwin = ((Win32InputManager*)mCreator)->getWindowHandle();
4聽聽聽聽聽 mKeyboard->SetCooperativeLevel( hwin, coopSetting)))
5聽聽聽聽聽 mKeyboard ->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph )))
6聽聽聽聽聽 HRESULThr = mKeyboard->Acquire();聽
}
榪欓噷鍙槸鍋氫簡涓嶅皯鐨勫伐浣?鐪嬬湅鏂規硶鍚嶅氨鍙互鏄庣櫧銆備負璇存槑鏂逛究鍔犱笂浜嗘爣鍙楓?br />1錛?瀹冨仛浜?姝ラ涓殑絎?姝ワ紝 Create a DirectInputDevice object for each device you want to use 銆?
2, 3 4,5瀹冧滑鍏卞悓鍋氫簡8姝ラ涓殑絎?姝ワ紞 Set up the device 銆傝繖閲岄潰鍖呮嫭錛氳緗敭鐩樼殑鏁版嵁鏍煎紡錛屽崗浣滄ā寮忥紝鍏朵粬灞炴с傚緢鏄庢樉錛?鍋氫簡8銆姝ユ楠や腑鐨勭5姝ワ紞 Acquire the device 銆?鎰忔濇槸鍛婅瘔DirectInput,鎴戝噯澶囦粠璁懼涓婅幏鍙栨暟鎹簡錛岀粰鎴戝仛濂界敓浼轟警鐫銆傚噯澶囧伐浣滈兘鍋氬ソ浜嗭紝鍙互鑾峰彇鏁版嵁浜嗭紝閫氳繃璁懼鎻愪緵鐨勪笅闈㈣繖涓柟娉曟潵鍋氳繖浠朵簨銆傝繖灝辨槸8銆姝ラ涓殑絎?浠朵簨- Retrieve data
void Win32Keyboard::capture()
{聽聽聽聽 if( mBuffered )聽
聽聽聽聽聽聽 _readBuffered();聽
聽聽聽聽 聽 else聽
聽聽聽聽聽聽 _read();
}
浠庢簮鐮佷腑鎴戜滑鍙互鐪嬪埌錛屾牴鎹暟鎹殑涓嶅悓錛岃繘琛屼簡涓嶅悓鐨勫鐞嗐傚懙錛屼粈涔堜笉鍚屽憿錛屽啀浠嶮SDN涓婃妱涓孌靛惂錛屼竴鐪嬪氨鏄庣櫧錛?Buffered and Immediate Data
DirectInput supplies two types of data: buffered and immediate. Buffered data is a record of events that are stored until an application retrieves them. Immediate data is a snapshot of the current state of a device. You might use immediate data in an application that is concerned only with the current state of a device - for example, a flight combat simulation that responds to the current position of the joystick and the state of one or more buttons. Buffered data might be the better choice where events are more important than states - for example, in an application that responds to movement of the mouse and button clicks. You can also use both types of data, as you might, for example, if you wanted to get immediate data for joystick axes but buffered data for the buttons.
鍛碉紝娓呮浜嗗惂銆傜戶緇湅浠g爜, capture()鏈変袱涓垎鏋濓紝鍒嗗埆澶勭悊緙撳啿鏁版嵁涓庣珛鍗蟲暟鎹?br />棣栧厛鏄紦鍐叉暟鎹紝涓誨共浠g爜濡備笅錛?
void Win32Keyboard::_readBuffered()
{
聽 DIDEVICEOBJECTDATA diBuff[KEYBOARD_DX_BUFFERSIZE];聽
聽聽聽 DWORD entries = KEYBOARD_DX_BUFFERSIZE;聽聽
聽聽 mKeyboard->GetDeviceData( sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0 );聽
聽聽聽 //Update keyboard and modifier states.. And, if listener, fire events聽
聽聽聽 for(unsignedinti = 0; i < entries; ++i )聽
聽聽聽 {聽
聽聽聽聽聽聽 KeyCode kc = (KeyCode)diBuff[ i ].dwOfs;聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if( diBuff[ i ].dwData & 0x80 )聽
聽聽聽聽聽聽 {聽
聽聽 聽聽聽聽聽聽 if( listener )聽
聽聽聽聽聽聽聽聽聽聽聽 istener->keyPressed( KeyEvent( this,kc,_translateText(kc) ) );聽
聽聽聽聽聽聽 }聽
聽聽聽聽聽聽 else
聽聽聽聽聽聽 {聽
聽聽聽聽聽聽聽聽聽聽 //Fire off event聽
聽聽聽聽聽聽聽聽聽聽 if( listener )聽
聽聽聽聽聽聽聽聽聽聽聽 listener->keyReleased( KeyEvent( this, kc, 0 ) );聽
聽聽聽聽聽聽 }聽
聽聽聽 }
}
榪欐浠g爜涓紝GetDeviceData( sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0 );鍙栧緱浜嗙紦鍐叉暟鎹?娣誨叆浜嗕竴涓暟緇勶細灝哄鏄疎YBOARD_DX_BUFFERSIZE,鍙互鐪嬪埌entries涔熺瓑浜庢鍊箋侲ntries鐨勪綔鐢ㄩ櫎浜嗗紑濮嬭皟鐢ㄦ椂璇存槑鏁扮粍鐨勫ぇ灝忥紝鍚屾椂鍦ㄥ嚱鏁拌皟鐢ㄨ繑鍥炴椂璇存槑鏁扮粍閲屾湁澶氬皯涓暟鎹~鍏ワ紙娌℃湁瓚沖澶氱殑緙撳啿鏁版嵁錛屽綋鐒跺~涓嶆弧鍟︼紝鍋囧entries榪斿洖6錛岃鏄庤繕鏈?涓寜閿俊鎭湪緙撳啿閲岀瓑寰呭鐞嗭級銆傚緢鏄庢樉錛宖or寰幆灝辨槸瀵硅繖浜涙湭澶勭悊鐨勪俊鎭繘琛屽鐞嗐侹eyCode kc = (KeyCode)diBuff[ i ].dwOfs; 榪欐槸鐪嬬湅錛岃繖涓簨浠舵槸鐢卞摢涓敭寮曡蛋.KeyCode鏄釜鏋氫婦鍨嬶細
enum KeyCode聽
聽聽聽 {聽
聽聽聽 銆聽 C_1聽聽聽聽聽聽聽聽聽聽 = 0x02,聽
聽聽聽聽聽聽 KC_2聽聽聽聽聽聽聽聽聽聽聽 = 0x03,聽
聽聽聽聽聽聽 KC_3聽聽聽聽聽聽聽聽聽聽聽 = 0x04,聽
聽聽聽聽聽聽 KC_A聽聽聽聽聽聽聽聽聽聽聽 = 0x1E,聽
聽聽聽聽聽聽 KC_S聽聽聽聽聽聽聽聽聽聽聽 = 0x1F,聽
聽聽聽聽聽聽 KC_D聽聽聽聽聽聽聽聽聽聽聽 = 0x20,聽
聽聽聽 }
紜畾浜嗘槸鍝釜閿紝鎺ヤ笅鏉ュ氨瑕侀棶浜嗭紝鏄寜涓嬭繕鏄噴鏀撅紵
聽if ( diBuff[ i ].dwData & 0x80 ) 銆鍥炵瓟浜嗚繖涓棶棰?涓嬮潰鍋氱殑鏄?
if ( listener )聽
聽聽聽聽聽聽聽聽聽聽聽 istener->keyPressed( KeyEvent( this,kc,_translateText(kc) ) );
瀹冩妸鐩稿叧鐨勪俊鎭唴瀹瑰寘瑁呮垚KeyEvent錛屼綔涓哄弬鏁板彂緇欎簡錛屽凡緇忔敞鍐屼簡鐨勪睛鍚?鍙兘涓嶅お鏄庣櫧錛岃В閲婁竴涓嬶細褰撴垜浠寜涓嬩簡鏌愪釜閿紝鍙互璁や負鏄彂鐢熶簡涓狵eyEvent,紼嬪簭閲屼細鍝嶅簲榪欎釜浜嬩歡錛屾柟娉曞氨鏄妸鏌愪釜綾誨疄渚嬫敞鍐屼負渚﹀惉鑰?listener),璇寸櫧浜嗗氨鏄憡璇塐IS,褰撻敭鐩樻寜涓嬮噴鏀劇殑鏃跺欎綘鍛婅瘔鎴戝晩錛屾垜瑕佸搷搴斾粬銆傝繖閲孫IS媯嫻嬪埌鎸夐敭浜嬩歡鍙戠敓浜嗭紝鏍規嵁渚﹀惉鑰呯殑璇鋒眰錛岃皟鐢ㄤ睛鍚呯殑鏂規硶(keyPressed)銆備篃璁告湁鐤戦棶錛孫IS 鎬庝箞鐭ラ亾渚﹀惉鑰呭疄鐜頒簡keypressed錛堬級鏂規硶鍛紵涓嶆ュ厛鐪嬩互涓嬩唬鐮侊紝鍦℅UI demo閲岋細
class GuiFrameListener : publicExampleFrameListener, publicOIS::KeyListener, publicOIS::MouseListener
鐪嬪埌浜嗗惂錛屽畠緇ф壙鑷?OIS:KeyListener ,浠嶰IS鐨勬簮鐮佷腑鎵懼埌瀹冿細
class _OISExport KeyListener聽
聽聽聽 {聽
聽聽聽 public:聽
聽聽聽聽聽聽 virtual ~KeyListener() {}聽
聽聽聽聽聽聽 virtual bool keyPressed( constKeyEvent &arg ) = 0;聽
聽聽聽聽聽聽 virtual bool keyReleased( constKeyEvent &arg ) = 0;聽聽聽聽
聽聽聽 };
鍝堝搱錛屼粬姝f槸瀹氫箟浜嗚繖涓や釜鎺ュ彛錛屾棦鐒剁戶鎵胯嚜浠栵紝褰撶劧涔熷氨鎷ユ湁浜嗚繖涓や釜鎺ュ彛錛屼簬鏄疓uiFrameListener鎴愪簡鍚堢悊鍚堟硶鐨凩istener浜嗐?
鍝︼紝瀹冨湪鍝噷娉ㄥ唽鐨勫憿錛熷緢綆鍗?鍦℅uiFrameListener鐨勬瀯閫犲嚱鏁伴噷鎴戜滑鐪嬪埌錛?
{
聽聽聽聽聽聽 mMouse ->setEventCallback(this);聽
聽聽聽聽聽聽 mKeyboard->setEventCallback(this);
}
緇х畫鎸栨簮鐮侊細
virtual void Keyboard : 錛歴etEventCallback ( KeyListener *keyListener ) {listener=keyListener;}
榪欎笅搴旇灝辨槑鐧戒簡鍚с傚緢鏄庢樉GUI Demo閲屼嬌鐢ㄤ簡緙撳啿妯″紡.
鍓╀笅鏉ュ氨鏄珛鍗蟲ā寮忕殑鏁版嵁浜嗭紝浠栧緢濂界悊瑙o細
void Win32Keyboard::_read()
{聽
聽 mKeyboard->GetDeviceState( sizeof(KeyBuffer), &KeyBuffer );聽
}
瀹冩妸閿洏褰撲笅鐨勭姸鎬佷繚瀛樺埌緙撳啿涓幓錛岃鎯崇煡閬撳摢涓敭鏄惁鎸変笅錛屽彧瑕佸鐓х紦鍐測滄寜鍥劇儲楠モ濆氨鍙互浜嗐?br />聽bool Win32Keyboard::isKeyDown( KeyCodekey )
{聽
聽聽聽 return (KeyBuffer[key] & 0x80) != 0;
}
榪欎釜閿寜涓嬩簡鍚楋紵閭d釜閿寜涓嬩簡鍚楋紵閭i偅涓憿錛熷懙錛岀湡鍟板棪錛屽緱涓涓釜鐨勯棶銆?
浜庢槸鎴戜滑 GUI Demo 涓彲浠ョ湅鍒頒笅鍒楃殑浠g爜錛?
virtual bool processUnbufferedKeyInput(const FrameEvent& evt)聽
聽聽聽聽聽聽 {聽
聽聽聽聽聽聽聽聽聽聽聽 if(mKeyboard->isKeyDown(KC_A))聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽mTranslateVector.x = -mMoveScale;聽聽聽 // Move camera left聽
聽聽聽聽聽聽聽聽聽聽聽 if(mKeyboard->isKeyDown(KC_D))聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽mTranslateVector.x = mMoveScale;聽聽聽聽聽 // Move camera RIGHT聽
聽聽聽聽聽聽聽聽聽聽聽聽聽 if(mKeyboard->isKeyDown(KC_UP) || mKeyboard->isKeyDown(KC_W) )聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 mTranslateVector.z = -mMoveScale;聽聽聽聽 // Move camera forward聽
聽聽聽聽聽聽聽聽聽聽聽聽聽 if(mKeyboard->isKeyDown(KC_DOWN) || mKeyboard->isKeyDown(KC_S) )聽聽
聽聽聽聽聽聽聽 聽聽聽聽聽聽聽聽聽聽聽 mTranslateVector.z = mMoveScale;聽聽聽聽聽 // Move camera backward
锝?
鎴戜滑鐢ㄩ敭鐩樿涓嶆槸緙撳啿妯″紡錛岃涔堢珛鍗蟲ā寮忥紝涓嶅彲鑳戒竴璧蜂笂錛岃繖鎵鏈夊湪 demo 涓兘鑳界湅鍒幫紝 demo 鐨勪綔鑰呮噿寰楀鍐欎唬鐮?( 鍢垮樋 ) 錛屽畠緇ф壙浜?ExampleFrameListener 鐨勮澶氬姛鑳斤紝鑰?ExampleFrameListener 涔熷疄鐜頒簡浜涚珛鍗蟲ā寮忕殑鎸夐敭澶勭悊銆?Demo 娌℃湁鐢ㄥ埌銆傚啓浜嗚繖涔堝浜嗭紝榪樺緱 8 銆澶ф楠わ紵錛?璇ョ 7 姝ヤ簡鍚э細 鈥曗?Act on the data 錛?榪欐湁浠涔堝ソ璇寸殑鍛紵鐖卞拫鍜嬪湴錛佹渶鍚庝竴姝ワ紝絎?8 姝モ曗曞ぉ榫欏叓閮?! 鍛甸敊浜嗭紝鏄?Close DirectInput聽聽聽聽聽 鍏跺疄寰堢畝鍗曪紝 OIS 鎶婁粬浠皝瑁呭湪鍚勪釜綾葷殑鏋愭瀯鍑芥暟閲屼簡錛屾兂褰撶劧錛屾簮鐮佷篃涓嶇敤璐翠簡 . 璇翠簡 OIS 銆濡備綍鎶?DirectInput 灝佽璧鋒潵錛屽弬鑰?8 澶ф楠わ紝濡備綍浣跨敤 OIS 涔熷熀鏈緢鏄庣櫧浜嗐侽IS 錛屽氨瀛﹀埌榪欓噷錛屾帴涓嬫潵璇ヤ富瑙掍笂鍦?CEGUI聽寰椾紤鎭簡錛屾墦瀛楋紝緲昏祫鏂欙紝鐪嬩唬鐮侊紝寰堢瘡浜嗐?
涓嬮潰鐩存帴娑夊強鍒扮浉鍏崇被
棣栧厛鐪嬩竴涓?/span> ExampleFrameListener, 涓嬮潰鏄被闂村叧緋誨浘
ExampleFrameListener 緇ф壙浜?FrameListener, 鍥犳鎷ユ湁浜嗗畠鐨勪袱涓柟娉?
virtual bool frameStarted(constFrameEvent& evt)
virtual bool frameEnded(constFrameEvent& evt)
鍦?ExampleApplication 涓皢瀹冧滑娉ㄥ唽鍒?ogre 涓紝鍦ㄩ傚綋鐨勬椂鍊欙紝 ogre 浼氳皟鐢ㄨ繖涓や釜鏂規硶 . 涓嬮潰鏄敞鍐屽湴鐐逛笌鏃舵満
virtual void ExampleApplication::createFrameListener(void)
{
mFrameListener= newExampleFrameListener(mWindow, mCamera);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
createFrameListener 鍦?ExampleApplication::setup() 涓璋冪敤.
ExampleFrameListener 鍙堢戶鎵夸簡 WindowEventListener.
WindowEventListerner 鍦╫gre 1.4涓槸鏂板姞鐨勩傛寜鐓ф墜鍐岋細瀹冩槸涓涓?Callback class used to send out window events to client app. 瀹冨畾涔変互涓嬪洓涓帴鍙?鑰屾樉鐒朵緥瀛愮▼搴忎腑鍙敤鍒頒簡涓や釜
virtual void windowMoved(RenderWindow* rw) {}
virtual void windowResized(RenderWindow* rw) {}
virtual void windowClosed(RenderWindow* rw) {}
virtual void windowFocusChange(RenderWindow* rw) {}
榪欑鎵璋撶殑鍥炶皟綾誨浣曞疄鐜幫紵涓嬮潰鍙鏄巜indows鎿嶄綔緋葷粺鐨勬儏鍐點?
鎴戜滑鐭ラ亾錛寃indows鎿嶄綔緋葷粺鐩戣緋葷粺涓彂鐢熺殑涓鍒囷紝閫氳繃娑堟伅鐨勬柟寮忛氱煡鐩稿簲鐨勭獥鍙c傛瘡涓獥鍙g被娉ㄥ唽鐨勬椂鍊欙紝閮芥寚鏄庝竴涓洖璋冭繃紼嬶紝鍦ㄩ偅閲屽鐞嗕紶鏉ョ殑娑堟伅銆傚簲鐢ㄧ▼搴忓張鏈夊悇鑷殑娑堟伅闃熷垪錛屼粠娑堟伅闃熷垪涓彇寰楁秷鎭紝鐒跺悗鍒嗗紑緇欏悇紿楀彛.
涓嶉槻浠巓gre鐨勬簮鐮佷腑鐪嬬湅涓婅堪windows鍩烘湰榪囩▼濡備綍瀹炵幇錛岃繖鏈夊姪鐞嗚В鍥炶皟綾葷殑瀹炵幇榪囩▼錛?
棣栧厛錛宱gre鍙互涓烘垜浠垱寤轟竴涓獥鍙o細
mWindow = mRoot->initialise(true);//
浜庢槸鎴戜滑榪涘叆鍒癷nitialise()涓湅鐪嬪惂錛屽畠鍊掑簳鍋氫簡浜涗粈涔堜簨鎯呫?
RenderWindow * Root::initialise(boolautoCreateWindow, constString& windowTitle)
{
// ……
mAutoWindow = mActiveRenderer->initialise(autoCreateWindow, windowTitle);
// 榪欓噷錛歊enderSystem* mActiveRenderer
// ……
}
mActivaRenderer 鍙槸鎺ュ彛錛屼笉鐢ㄥ疄闄呯殑浜嬫儏錛屽疄闄呯殑宸ヤ綔鐢卞畠鐨勫瓙綾誨畬鎴愶紝鐜板彧鐪婦irectX瀹炵幇:
RenderWindow * D3D9RenderSystem::initialise( boolautoCreateWindow, constString& windowTitle )
{
// ……………………
autoWindow = this->createRenderWindow( windowTitle, width, height,
fullScreen, &miscParams );
// ………………… ..
}
濂斤紝緇х畫涓嬪幓,鐪嬬湅createRenderWindow鍋氫簡浜涗粈涔?
RenderWindow * D3D9RenderSystem::createRenderWindow(constString &name,
unsigned int width, unsignedintheight, boolfullScreen,
const NameValuePairList *miscParams)
{
// …………… ..
RenderWindow * win = newD3D9RenderWindow(mhInstance, mActiveD3DDriver,
mPrimaryWindow ? mpD3DDevice : 0);
win ->create( name, width, height, fullScreen, miscParams);
// ………………
}
緇х畫
void D3D9RenderWindow::create(constString& name, unsignedintwidth, unsignedintheight,
bool fullScreen, constNameValuePairList *miscParams)
{
// Register the window class
// NB allow 4 bytes of window data for D3D9RenderWindow pointer
WNDCLASS wc = { 0, WindowEventUtilities::_WndProc, 0, 0, hInst,
LoadIcon(0, IDI_APPLICATION), LoadCursor(NULL, IDC_ARROW),
(HBRUSH)GetStockObject(BLACK_BRUSH), 0, "OgreD3D9Wnd" };
RegisterClass(&wc);
// 瀹氫箟浜嗙獥鍙g被錛屽茍涓旇繘琛屾敞鍐岋紝闇瑕佹敞鎰忕殑鏄紝浣犵湅鐪嬪畠鎶婄獥鍙g被鐨勫洖璋冨嚱鏁扮殑鍊艱涓轟簡浠涔堬紵鍏堣浣忥紝涓浼氬効璁ㄨ瀹冨惂銆?
// Create our main window
// Pass pointer to self
mIsExternal = false;
mHWnd = CreateWindow("OgreD3D9Wnd", title.c_str(), dwStyle,
mLeft, mTop, mWidth, mHeight, parentHWnd, 0, hInst, this);
// 璋冪敤win32API鎶婄獥鍙g湡姝reate鍑烘潵浜?
WindowEventUtilities ::_addRenderWindow(this);
// 榪欎竴姝ヤ篃瑕佹敞鎰忓埌
}
緇х畫
void WindowEventUtilities::_addRenderWindow(RenderWindow* window)
{
_msWindows.push_back(window);
}
_msWindows 瀹氫箟涓猴細
typedef std::vector<RenderWindow*> Windows;
static Windows _msWindows;
錛屾病浠涔堬紝鍙槸涓猻tl瀹瑰櫒錛屾妸鐢熸垚鐨勭獥鍙f斁榪涘幓浜?
鍒扮幇鍦紝瀹瑰櫒綾繪敞鍐屽ソ浜嗭紝鍥炶皟鍑芥暟涔熸寚瀹氫簡錛岀獥鍙d篃鍒涘緩鍑烘潵浜嗐傜幇鍦ㄦ垜浠戶緇濊冩垜浠渶鏈鍒濈殑闂錛?WindowEventListerner 榪欎釜鍥炶皟綾繪槸濡備綍瀹炵幇鎵璋撶殑鍥炶皟鏈哄埗鐨勶紝涔熷氨鏄windowEventListerner涓嶆槸瀹氫箟浜嗗洓涓帴鍙o紝瀹冨搷搴旂壒瀹氱殑windows浜嬩歡錛屾垜浠璁ㄨ鐨勫氨鏄繖鍥涗釜鎺ュ彛鏂規硶濡備綍琚皟鐢ㄨ搗鏉ワ紝瀹炵幇鎵璋撶殑鍥炶皟鏈哄埗銆?榪樿寰楁敞鍐岀獥鍙g被鐨勫洖璋冨嚱鏁版槸浠涔堝惂錛?
WindowEventUtilities::_WndProc 錛?鍛靛懙錛屽彧瑕佸湪閭i噷璋冪敤涓婅堪鍥涗釜鎺ュ彛鍑芥暟灝卞ソ浜嗐?
鍝棶棰樺張鏉ヤ簡錛宊WndProc鍒板摢閲屾壘榪欏洓涓帴鍙e嚱鏁板憿錛?
鍦?ExampleFrameListener 綾葷殑鏋勯犲嚱鏁伴噷鎴戜滑鍙互鐪嬪埌濡備笅浠g爜
//Register as a Window listener
WindowEventUtilities::addWindowEventListener(mWindow, this);
鍟婏紝榪欏氨鏄ゥ縐樻墍鍦?鍒版簮鐮佷腑鐪嬬湅鍚с?
void WindowEventUtilities::addWindowEventListener( RenderWindow* window, WindowEventListener* listener )
{
_msListeners.inser t(std::make_pair(window, listener));
}
-msListeners 琚畾涔夋垚榪欐牱瀛愶細
typedef std::multimap<RenderWindow*, WindowEventListener*> WindowEventListeners;
static WindowEventListeners _msListeners;
娌℃湁浠涔堬紝灝辨槸STL瀹瑰櫒錛屽畠浣垮緱紿楀彛(RenderWindow)涓?WindowEventListener)
緇勬垚浜嗕翰瀵嗘淳瀵癸紝紿楀彛鏈変簡浠涔堟秷鎭紝灝卞彲浠ョ敤瀵瑰簲鐨勫洖璋冪被鍝嶅簲銆?
鍙墿涓嬩竴鐐圭瀵嗕簡錛屽埌搴曟庝箞璋冪敤璧鋒潵鐨勫憿錛屾煇鏌愭煇璇磋繃錛屾簮鐮佷箣涓嬶紝浜嗘棤縐樺瘑錛岄偅灝辯湅婧愮爜鍚э細
LRESULT CALLBACK WindowEventUtilities::_WndProc(HWNDhWnd, UINTuMsg, WPARAMwParam, LPARAMlParam)
{
WindowEventListeners ::iteratorstart = _msListeners.lower_bound(win),
end = _msListeners.upper_bound(win);
// 涓洪亶鍘嗗仛鍑嗗
switch( uMsg ) // 娑堟伅鐪熺殑鏉ヤ簡
{
case WM_MOVE:
//log->logMessage("WM_MOVE");
win->windowMovedOrResized();
for( ; start != end; ++start )
(start->second)->windowMoved(win);
break;
case WM_SIZE:
//log->logMessage("WM_SIZE");
win->windowMovedOrResized();
for( ; start != end; ++start )
(start->second)->windowResized(win);
break;
}
}
灝辮繖鏍鳳紝鍥涗釜鎺ュ彛鍑芥暟琚皟鐢ㄨ搗鏉ヤ簡錛?
涔熻錛屼篃璁革紝鍏充簬娑堟伅榪樻湁浜涜璇存槑鐨勩傛秷鎭浣曟車鍑烘潵鐨勶紵
褰撶湅鍒頒簡濡備笅浠g爜錛岀獊鐒跺氨鎯蟲壘涓湅鍙嬶紝浼氬績涓絎?
void WindowEventUtilities::messagePump()
{
MSG msg;
while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
鎵撶牬閾侀攨闂埌搴曞惂錛屽畠鍙堝浣曡璋冪敤璧鋒潵錛?
void Root::startRendering(void)
{
while( !mQueuedEnd )
{
//Pump messages in all registered RenderWindow windows
WindowEventUtilities::messagePump();
if (!renderOneFrame())
break;
}
}
灝辨槸榪欓噷浜嗐傚啓鐨勪貢涓冨叓緋燂紝鑴戝瓙涔熶貢涓冨叓緋燂紝姊崇悊涓涓嬪惂銆?
棣栧厛錛宮Window = mRoot->initialise(true);鍒濆鍖栵紝闅忎究閫氳繃涓緋葷粺榪為攣鍙嶅簲create鍑烘潵涓涓獥鍙o紝騫舵妸瀹冪殑鍥炶皟鍑芥暟璁懼畾涓?WindowEventUtilities::_WndProc.
ExampleFrameListener 緇ф壙浜?WindowEventListener 鐨勫洓涓害瀹氭帴鍙e嚱鏁般傚茍涓斿湪瀹冪殑鏋勯犲嚱鏁伴噷璋冪敤 WindowEventUtilities::addWindowEventListener(mWindow, this); 榪涜浜嗘敞鍐岋紝浠ヤ究鐗瑰畾紿楀彛娑堟伅鍙戠敓鏃惰繘琛屽搷搴? Root ::startRendering 錛堬級榪涘叆浜嗘覆鏌撳驚鐜紝娓叉煋姣忎竴甯у墠錛屾嫻媤idnows娑堟伅錛屽茍榪涜鍒嗗彂銆備簬鏄秷鎭繘鍏ュ埌紿楀彛綾葷殑鍥炶皟鍑芥暟_WndProc,鍦ㄥ嚱鏁板唴閮ㄦ牴鎹秷鎭殑涓嶅悓錛屽垎鍒皟鐢ㄥ凡娉ㄥ唽鐨勪睛鍚櫒鐨勭害瀹氭帴鍙e嚱鏁般?br>鍏堝啓鍒拌繖閲屽惂錛屽師鏉ュ彧鏄兂鍐欏啓CEGUI鐨勪嬌鐢紝璋佺煡宸茬粡鍐欎簡榪欎箞澶氫簡錛孋EGUI榪樹竴瀛楁湭鎻愩傝剳瀛愪貢浜嗭紝鍏堜紤鎭惂銆備笅闈㈣繕寰楄璇碠IS,CEGUI鍙堝緱闈犲悗浜?
聽聽聽聽if (ImmIsIME(GetKeyboardLayout(0)))
聽聽聽聽{
聽聽聽聽聽CEGUI::DbcsSupport::injectChar(Key);
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽CEGUI::System->injectChar((CEGUI::utf32)Key);
聽聽聽聽}
聽聽聽 ImmIsIME(GetKeyboardLayout(0))鐩殑鏄敤浜庢鍒欑幇鍦ㄧ殑杈撳叆娉曟槸鍚︽墦寮鐨勩傚鏋滄槸鍦ㄨ緭鑻辨枃鐘舵佹垜鎯充綘涓嶄細鐢昏泧娣昏凍鐨勩備嬌鐢ㄨ繖涓渶瑕乮mm32.lib鐨勬敮鎸併侻SDN涓婇潰涔熸湁璇存槑銆?br />5:鏈鍚庡氨鏄坊鍔犱竴浠戒唬鐮佸埌浣犵殑CEGUI浣跨敤欏圭洰閲岋紝濡備笅錛?br />namespace CEGUI{
bool DbcsSupport::injectChar(utf32 code_point )
聽{
#ifndef UNICODE
聽聽static char聽聽聽聽 s_tempChar[3]聽 = "";
聽聽static wchar_t聽 s_tempWchar[2] = L"";
聽聽static bool s_flag = false;
聽聽unsigned char聽 uch聽 = (unsigned char)code_point;
聽聽if( uch聽>= 0xA1 )
聽聽{
聽聽聽if( !s_flag )
聽聽聽{
聽聽聽聽s_tempChar[0] = (char)uch; //絎竴涓瓧鑺?br />聽聽聽聽s_flag = true;
聽聽聽聽return true;
聽聽聽}
聽聽聽else if( uch聽>= 0xA1聽)
聽聽聽{
聽聽聽聽s_tempChar[1] = (char)uch; //絎簩涓瓧鑺?br />聽聽聽聽s_flag = false;
聽聽聽聽MultiByteToWideChar( 0, 0, s_tempChar, 2, s_tempWchar, 1); //杞垚瀹藉瓧鑺?br />聽聽聽聽s_tempWchar[1] = L'\0';
聽聽聽聽utf32 code = (utf32)s_tempWchar[0];
聽聽聽聽//Font* fnt = System::getSingleton().getDefaultFont();
聽聽聽聽return CEGUI::System::getSingleton().injectChar( code );
聽聽聽}
聽聽聽else
聽聽聽{
聽聽聽聽return CEGUI::System::getSingleton().injectChar(code_point);
聽聽聽}
聽聽}
聽聽else
聽聽{
聽聽聽s_flag = false;
聽聽聽return CEGUI::System::getSingleton().injectChar(code_point);
聽聽}
#else
聽聽return CEGUI::System::getSingleton().injectChar(code_point );
#endif
聽}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1509217
EventClicked :: 緋葷粺棰勫畾涔夌殑浜嬩歡 . subscribeEvent:: 娉ㄥ唽鍑芥暟錛屽畠浜嬩歡涓庡搷搴斿嚱鏁拌仈鎺ュ湪涓璧楓?
鍦?ogre 紼嬪簭涓紝褰撲睛鍚櫒鏀跺埌閿洏錛岄紶鏍囨秷鎭椂錛岄鍏堢粡榪囬傚綋鐨勮漿鎹紙 CEGUI 鍙互璇嗗埆錛夊啀浼犻掔粰 CEGUI 銆備笅闈㈣繖涓嚱鏁版墽琛岄紶鏍囬敭鏍囪瘑杞崲銆?
CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)
{
聽聽聽聽聽聽 switch (buttonID)
聽聽聽聽聽聽 {
聽聽聽聽聽聽 case MouseEvent::BUTTON0_MASK:
聽聽聽聽聽聽聽聽聽聽聽聽聽 return CEGUI::LeftButton;
聽聽聽聽聽聽 case MouseEvent::BUTTON1_MASK:
聽聽聽聽聽聽聽聽聽聽聽聽聽 return CEGUI::RightButton;
聽聽聽聽聽聽 case MouseEvent::BUTTON2_MASK:
聽聽聽聽聽聽聽聽聽聽聽聽聽 return CEGUI::MiddleButton;
聽聽聽聽聽聽 case MouseEvent::BUTTON3_MASK:
聽聽聽聽聽聽聽聽聽聽聽聽聽 return CEGUI::X1Button;
聽聽聽聽聽聽 default:
聽聽聽聽聽聽聽聽聽聽聽聽聽 return CEGUI::LeftButton;
聽聽聽聽聽聽 }
}
灝?CEGUI 闇瑕佺煡閬撶殑閿洏錛岄紶鏍囨秷鎭憡鐭ュ畠銆傚嵆鍦?OGRE 澶勭悊榪欎簺娑堟伅鏃墮氱煡 CEGUI 銆備互涓嬭繖鍑芥暟璇存槑浜嗙敤娉曘?
聽聽聽聽聽聽 void mouseMoved (MouseEvent *e)// 榧犳爣縐誨姩
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 CEGUI::System::getSingleton().injectMouseMove(
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 e->getRelX() * mGUIRenderer->getWidth(),
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 e->getRelY() * mGUIRenderer->getHeight());
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 e->consume();
聽聽聽聽聽聽 }
聽聽聽聽聽聽 void mousePressed (MouseEvent *e)// 榧犳爣鎸変笅
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 CEGUI::System::getSingleton().injectMouseButtonDown(
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 convertOgreButtonToCegui(e->getButtonID()));
聽聽聽聽聽聽聽聽聽聽聽聽 e->consume();
聽聽聽聽聽聽 }
聽聽聽聽聽聽 void mouseReleased (MouseEvent *e)// 榧犳爣寮硅搗
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 CEGUI::System::getSingleton().injectMouseButtonUp(
聽聽聽聽聽聽聽聽聽聽聽聽聽 convertOgreButtonToCegui(e->getButtonID()));
聽聽聽聽聽聽聽聽聽聽聽聽聽 e->consume();
聽聽聽聽聽聽 }
聽聽聽聽聽聽 void keyPressed(KeyEvent* e)// 閿寜涓?
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽聽 CEGUI::System::getSingleton().injectKeyDown(e->getKey());
聽聽聽聽聽聽聽聽聽聽聽聽聽 CEGUI::System::getSingleton().injectChar(e->getKeyChar());
聽聽聽聽聽聽聽聽聽聽聽聽聽 e->consume();
聽聽聽聽聽聽 }
聽聽聽聽聽聽 void keyReleased(KeyEvent* e)// 閿脊璧?
聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽聽 CEGUI::System::getSingleton().injectKeyUp(e->getKey());
聽聽聽聽聽聽聽聽聽聽聽聽 e->consume();
聽聽聽聽聽聽 }
鍦?CEGUI 涓嬌鐢ㄤ腑鏂囩殑闂錛毬犅?鐜板湪鎬葷粨浜嗕竴涓嬪湪 CEGUI 涓樉紺轟腑鏂囬渶瑕佹敞鎰忕殑浜嬮」 :
聽聽聽 1 銆佸皢 simhei.ttf copy to \ogrenew\Samples\Media\gui
聽聽聽 2 銆佸皢 simhei-12.font聽 鎷峰埌涓婄洰褰曞唴瀹逛負
<?xml version="1.0"聽 ?>
<Font Name="SimHei-12" Filename="simhei.ttf" Type="Dynamic" Size="12" NativeHorzRes="800" NativeVertRes="600"聽
AutoScaled="true">
<GlyphSet Glyphs=" 浣犲ソ涓栫晫閫鍑烘紨紺烘覆鏌撳埌鏂版潗璐ㄥ緩緙栬緫紿楀彛 " /> 錛?<---- 鑷繁瑕佺敤鍒扮殑姹夊瓧錛?
</Font>
娉ㄦ剰澶у皬鍐欙紒錛?GlyphSet Glyphs 鏄湪紼嬪簭涓鐢ㄥ埌鐨勬眽瀛楋紝瀹冩槸璁?cegui 棰勭敓鎴愪竴涓瓧絎﹀浘鍍忛泦鐢ㄧ殑錛堟兂褰撶劧鐨?:-P 錛夊鏋滀慨鏀逛簡榪欎釜鏂囦歡錛屾敞鎰忚鐢?Unicode 錛?UTF-8 錛夌殑緙栫爜鏉ヤ繚瀛橈紝鍦?vc7.1 涓細鏂囦歡 -> 楂樼駭淇濆瓨閫夐」聽聽 鐨劼犅?緙栫爜聽聽 鏍忎腑閫夋嫨銆?
聽聽聽 3 銆佸湪 TaharezLook.scheme 涓?
聽聽聽聽 <Font Name="Tahoma-12" Filename="tahoma-12.font" /> 鍚庡姞鍏?
聽聽聽聽 <Font Name="SimHei-12" Filename="simhei-12.font" />聽 娉ㄦ剰澶у皬鍐?
聽聽聽聽 浠ヤ笂鏄竴浜涘噯澶囧伐浣?
聽聽聽 4 銆佸湪鑷繁鐨勫簲鐢ㄤ腑璁劇疆榛樿瀛椾綋
聽聽聽 mGUISystem->setDefaultFont((CEGUI::utf8*)"Tahoma-12"); 鏀逛負
聽聽聽 mGUISystem->setDefaultFont((CEGUI::utf8*)"SimHei-12");
聽聽聽 5 銆佸湪鑷繁鐨勫簲鐢ㄧ▼搴忎腑灝卞彲浠ユ妸鐩稿叧鐨?Text 灞炴ц涓轟腑鏂囦簡錛屽錛?
聽聽聽 item = new CEGUI::ListboxTextItem((CEGUI::utf8*)" 閫鍑?", 6);
聽聽聽 鍚屾牱瑕佹敞鎰忕殑鏄淇濆瓨涓?Unicode 錛?UTF-8 錛夌殑緙栫爜銆傚悓鏃惰繖浜涘瓧瑕佹槸鍦?simhei-12.font 涓畾涔夎繃鐨勫瓧錛屽綋鐒朵篃鍙互璞¢偅涓?CEGUIChieseDemo
閭f牱鐢ㄥ姩鎬佺敓鎴愬錛?
聽聽聽 gfont->defineFontGlyphs(gfont->getAvailableGlyphs() + (utf8*)" 褰撳墠鏈浣沖潖騫沖潎鐨勬鏋剁巼涓夎 ");
聽聽聽 緙栬瘧鑷繁鐨勭▼搴忥紝搴旇灝卞彲浠ョ湅鍒頒腑鏂囦簡錛岀綏鍡︿竴涓嬶紝璁頒綇鍙鏈夋眽瀛楀嚭鐜扮殑鏂囦歡灝變繚瀛樹負 Unicode 錛?UTF-8 錛夌紪鐮佺殑錛侊紒錛?
聽