Motor I. Scene graph XML Rendering Szécsi László
Letöltés /code/E/code/EggCoreFirstBase2005.zip vagy grafjatek.blog.hu kibontani: új folderbe
Próba több egyforma entitás
Osztályok EngineCore control() animate() render() EntityDirectoryMeshDirectoryEntityD3DXMeshTextureDirectoryD3DTextureShadedMeshDirectoryShadedMesh EngineInterface CubeTextureDirectoryD3DCubeTexture
Nézzük a kódot! Directory.h konténer definíciók EngineCore osztály konténer tagváltozók
Osztályok EngineCore control() animate() render() EntityDirectoryEntityNodeGroupNode control() animate() render() entityDirectory sceneRoot subNodes
Nézzük a kódot! EngineCore osztály Node* sceneRoot; Node osztály Entity & NodeGroup közös interfacee NodeGroup osztály Gyerekek: std::vector subnodes; Entity osztály
Kamerák EngineCore control() animate() render() CameraDirectoryCamera EngineInterface FreeCameraEntityCameraCFirstPersonCameraEntity
Nézzük a kódot! EngineCore CameraDirectory cameraDirectory; CameraDirectory::iterator currentCamera; Camera általunk használt mátrixok lekérése FreeCamera mindent tovább a CFirstPersonCamerának EntityCamera: kamera entitáshoz kötve
Entity-ShadedMesh-Role-Material Entity ModelMatrix render(camera, effect) Material apply(effect) D3DTextureShadedMesh render(effect) D3DXMesh drawSubset() roles D3DXEffect setMatrix() setTexture() setTechnique() setMatrix setTexture setTechnique Role render(effect) materials
Nézzük a kódot! Material milyen technique const std::string techniqueName; milyen nevű shaderparamétereket mire kell állítani TextureDirectory textureEffectVariables; apply fentiek beállítása
Nézzük a kódot! Role egy material minden submeshre lesz egy konstruktor, ami az.x fileból vett material buffer alapján megcsinál minden Materialt
Nézzük a kódot! ShadedMesh melyik mesh milyen anyagokkal (minden Role egy lehetőség erre) ‘basic’ role lesz csak egyelőre
Nézzük a kódot! Entity shadedMesh referencia + pozíció (ez később nem kell, mert az Entity leszármazottai pl. a PhysX- től kérik le, hogy hol is vannak, de a mai laborra kell, hogy az entitásaink ne egymáson legyenek)
XML betöltés EngineCore metódusai createManagedResources loadLevel sorra betölt mindent a konténerekbe
levelCore.xml
Új ShadedMesh “
Próba Egyik űrhajó más textúrával
Feladatok alaptechinka bővítése színparaméterrel –steel textúrát használó arany/réz űrhajók új shader –env mapping-es űrhajó env map rajzolás háttérbe bővítés fényforrásokkal –XML-ben megadható fények –"basic" technique kiegészítése fényforrások kezelésével
Bővítés színparaméterrel új Directory típus: VectorDirectory typedef std::map VectorDirectory; Material osztályba –vectorEffectVariables tag VectorDirectory vectorEffectVariables; –setVector metódus void setVector(const std::string& vectorName, const D3DXVECTOR4& value); –apply kiegészítése
Bővítés színparaméterrel void Material::setVector(const std::string& vectorName, const D3DXVECTOR4& value) { vectorEffectVariables[vectorName] = value; }
Bővítés színparaméterrel // apply kiegészítése { // … VectorDirectory::iterator i = vectorEffectVariables.begin(); while(i != vectorEffectVariables.end()) { effect->SetVector( i->first.c_str(), &i->second); i++; }
Bővítés színparaméterrel XML betöltő kiegészítése ilyeneket tudjon betölteni: csak példa, nem kell másolni sehova – mint texture tag –D3DXVECTOR4 behozása xmlNode.readVector4(L”kdColor”);
Betöltés kiegészítése EngineCore void loadVectorVariables(XMLNode& materialNode, Material* material);
Beltöltés implementáció void EngineCore::loadVectorVariables(XMLNode& materialNode, Material* material) { int iVector = 0; XMLNode vectorNode; while( !(vectorNode = materialNode.getChildNode(L"Vector", iVector)).isEmpty() ) { D3DXVECTOR4 value = vectorNode.readVector4(L"value", D3DXVECTOR4(1, 1, 1, 1)); if(vectorNode||L"name") material->setVector(vectorNode||L"name", value); iVector++; }
void EngineCore::loadShadedMeshes (XMLNode& xMainNode) loadTextureVariables( materialNode, material); loadCubeTextureVariables( materialNode, material); loadVectorVariables( materialNode, material);
Bővités színparaméterrel:.fx új uniform param (standard.fx): float4 kdColor; psBasic-ben moduláljunk: return kdColor * tex2D(…
XML “
Gond: a többi is zöldes lesz, mert nincs soha átállítva a kdColor Tehát az.x fileből gyártott shadedmeshben is állítsuk be Role::Role(LPD3DXBUFFER materialBuffer, unsigned int nSubmeshes, TextureDirectory& textureDirectory, LPDIRECT3DDEVICE9 device, const std::string& techniqueName){ … material->setTexture("kdMap", texture); material->setVector("kdColor", D3DXVECTOR4(1, 1, 1, 1));
Próba Különböző színű űrhajók