ent_getmesh(ENTITY* ent,var num,var lod);
ent_setmesh(ENTITY* ent,void* mesh,var num,var lod);
Liefert das DirectX-Mesh der gegebenen Modell-oder Terrain-Entity zurück
oder setzt dieses.
Parameter:
ent - Modell- oder Terrainentity-Pointer oder NULL für Levelblocks (nur A7 ).
num -
Nummer des Terrain-Chunks oder Levelblock, beginnt mit 0.
lod - Nummer des Lod-Schrittes für das Mesh 0..3.
mesh - zu setzender Mesh-Pointer oder NULL wenn die Mesh entfernt wurde.
Rückgabewerte:
LPD3DXMESH gecastet nach void* oder NULL, wenn
die Entity weniger Meshes als die angegebene Mesh- oder Lod-Nummer enthält.
Geschwindigkeit:
SchnellBemerkungen:
- Wird das Mesh einer Entity gesetzt, wird die alte Mesh automatisch
entfernt.
- Meshes lassen sich nur für nicht-animierte Entities setzen.
- A7.62 Die Kollisionsform der Entity wird nach ent_setmesh automatisch upgedated, ihre Boundig-Box bleibt aber unverändert. Wenn Sie das wünschen, setzen Sie danach min_x .. max_x manuell.
- Das Mesh-Vertexformat (D3DVERTEX) wird im Kapitel shader beschrieben in der Datei atypes.h im lite-C-Includeverzeichnis definiert.
- Der Vertexbuffer einer Modellmesh beinhaltet zuerst die einzigartigen Vertices der Mesh, dann duplizierte Vertices, die dieselbe xyz-Position, aber andere Skins oder uv-Positionen haben. Je nach Einstellung von terrain_lod enthält der Vertexbuffer einer Terrain-LOD-Mesh zuerst die Vertices der Terrainmesh, dann die zusätzlichen Vertices zum Verbinden von Parzellen unterschiedlicher Auflösung.
- Für Modelle mit internen LOD-Schritten müssen sämtliche LOD-Meshes ersetzt werden, auch dann, wenn sich die Größe des Vertexbuffers verändert hat. Der Vertexbuffer der LOD-Meshes muß dieselbe Größe wie der der Hauptmeshes haben. Der Inhalt des Vertexbuffers der LOD-Meshes wird nach ent_setmesh automatisch upgedated. Die Index- und zugesschriebenen Buffers der LOD-Meshes müssen aber von Ihnen auf den korrekten Inhalt gesetzt werden. Alternativ schalten Sie LOD ab indem Sie alle LOD-Meshes auf den Haupt-Meshpointer setzen.
- Sie können ein Mesh, das sie allokiert haben, setzen, sollten es
dann aber bei Spielende selbst entfernen (s. Beispiel). Der Grund
ist der, daß ein von einem DLL allokiertes Mesh, welches mit einer
bestimmten DirectX-SDK-Version kompilliert wurde, unter Verwendung
derselben SDK-Version entfernt werden sollte.
Beispiel (lite-C):
...
#include <d3d9.h>
...
LPD3DXMESH pMesh = (LPD3DXMESH)ent_getmesh(my,0,0);
LPD3DXMESH pNewMesh;
D3DXCreateMeshFVF(num_tris,num_verts,D3DXMESH_MANAGED,D3DFVF_D3DVERTEX,(LPDIRECT3DDEVICE9)pd3ddev,&pNewMesh);
// set vertices, triangles, and attributes
...
ent_setmesh(my,pNewMesh,0,0);
...
// deallocate mesh at end of level or game
pNewMesh = ent_getmesh(my,0,0);
pNewMesh->Release();
ent_setmesh(my,NULL,0,0);
Siehe auch:
ent_status, vec_for_mesh, ent_getvertex, ent_buffers
► Aktuelle Version Online