ent_getvertex(ENTITY* ent, CONTACT* c, var num);

ent_setvertex(ENTITY* ent, CONTACT* c, var num);

Liefert einen einzelnen Vertex eines Modell- oder Terrain-Meshs zurück oder setzt diesen. Die Funktionen lassen sich zum Umformen des Mesh in Echtzeit verwenden.

Parameter:

ent Modell- oder Terrain-Entity-Pointer.
num Vertex-Nummer, die mit 1 beginnt.
c

Pointer auf einv orgefülltes CONTACT*-Strukt (definiert in atypes.h) zum Setzen oder Lesen des Vertex-Inhalts. Mit ent_getvertex kann NULL zur Rückgabe des Pointers an ein internes, statisches CONTACT-Struk.

Die folgenden Elemente des CONTACT-Structs werden verwendet (s. auch hit):

c.v

D3DVERTEX* -Pointer der gegenwärtig animierten und interpolierten Mesh-Position, die von ent_getvertex gesetzt ist und von ent_setvertex zu Updaten der Mesh benutzt wird. Beachten Sie, dass die Vertex-Position float ist anstelle von var und das DX-Koordinatensystem benutzt. Das Format D3DVERTEX wird unter shader section beschrieben und ist in atypes.h. definiert.

c.x,y,z

VECTOR, der die Vertexposition in lokalen Entity-Koordinaten enthält, wird von ent_getvertex gesetzt. Bei nicht-animierten Entities ist die Position dieselbe wie in c.v. Bei Vertex-animierten Entities ist es die Vertex-Position im gegenwärtigen nicht-interpolierten Frame. Bei Bones-animierten Entities ist es die Vertex-Position des Grundframes. Setzen Sie c.v auf NULL wenn ent_setvertex anstatt c.v diesen Vertex updaten soll. Das Updaten von c.v ist etwas schneller, funktioniert aber nicht fü animierte Entities.

c.nx,ny,nz VECTOR , der die von ent_getvertex gesetzte Vertexnormale enthält.
c.vertex Lokale Vertexnummer innerhalb der Untermesh. Wird von ent_getvertex gesetzt und benutzt ent_setvertex für Multimesh-Entities.
c.chunk Unter-Meshnummer im Falle von Multimesh-Entities wie Map-Entities oder parzelliertes Terrain. Wird von ent_getvertex gesetzt und von ent_setvertex benutzt.
c.model Unter-Meshpointer, wird von ent_getvertex gesetzt. Ist dieser Pointer ungleich Null, verwendet ent_getvertex anstelle des num-Parametersden c.vertex-Wert dür die Vertexnujmmer. Dies beschleundigt die Funktion bei Multi-Mesh-Entities. Wenn ent_getvertex nicht vor ent_setvertex aufgerufen wurde, setzen Sie diesen Pointer auf NULL.

Rückgabewerte:

CONTACT* Strukt-Pointer, oder NULL wenn die Funktion fehlschlägt.

Speed:

Langsam beim ersten Aufruf, schnell bei nachfolgenden Aufrufen.

Bemerkungen:

Version

A7.62  LC 

Beispiele (lite-C):

// raise all terrain vertices by 5 units
function raise_terrain(ENTITY* terrain)
{
  int i = ent_status(terrain,0); // number of vertices
for (; i>0; i--) {
CONTACT* c = ent_getvertex(terrain,NULL,i);
c.v.y += 5.0; // raise the vertex (y is the height in DX coorcinates)
ent_setvertex(terrain,c,i);
}
} // use a gun to produce mole-hills in terrain function mole_gun() { while (1) { // calculate the target vector VECTOR trace_target; vec_set(trace_target,vector(5000,0,0)); // firing range 5000 quants vec_rotate(trace_target, camera.pan); vec_add(trace_target, camera.x); // display a red spot at the target position if (c_trace(camera.x,trace_target, IGNORE_PASSABLE | USE_POLYGON| SCAN_TEXTURE) > 0) // hit something? draw_point3d(hit.x,vector(50,50,255),100,3); if (key_ctrl && HIT_TARGET && you && ent_type(you) == 4) // fire onto terrain { // create a mole-hill by elevating the closest terrain vertex
var vertex_num = ent_nextvertex(you,hit.x);
CONTACT* contact = ent_getvertex(you,NULL,vertex_num);
c.z += 10; // increase the vertex height c.v = NULL; // c.x,y,z was changed, instead of c.v
ent_setvertex(you,c,vertex_num); // update the mesh wait(-0.5); // reload } wait(1); } }

Siehe auch:

ent_status, ent_nextvertex, ent_getmesh, ent_buffers, hit

► Aktuelle Version Online