ent_decal (ENTITY*, BMAP*, var size, var angle)
Hängt ein Decal an eine willkürlich geformte Oberfläche des Levels, eines Terrains oder Modells an. Ein Decal ist ein Bitmap-Bild, welches so aussieht, als sei es auf die Oberfläche gemalt und es biegt sich auch um Ecken. Es läßt sich gut für Einschußlöcher, Brandspuren, Fußabdrücke, Bodenschatten usw. verwenden.
Parameter:
ENTITY* |
Entity auf das das Decal angebracht werden soll oder NULL, um es auf die Leveloberfläche aufzubringen. Per Default wird das Decal an der Trefferposition einer vorhergehenden c_trace.
|
BMAP* |
Bitmap, die als Decalbild dient; mit Alphakanal, der Größe einer Zweierpotenz (z. B.:64x64, 256x256...) und transparentem Rand.
|
size |
Durchmesser des Decals in Quants oder 0, zum Verwenden der Bitmap-Größe. |
angle |
Drehung des Decals in Grad. |
Rückgabewerte:
PARTICLE* Pointer auf den erstellten Decalpartikel.
Bemerkungen:
- Der Rand einer Decal-Bitmap, d. h. der erste und letzte Pixel einer jeden Reihe und Spalte muß zu 100% transparent sein.
- Um das Decal zu platzieren muß der Parameter SCAN_TEXTURE vom vorangehenden c_trace-Aufruf benutzt werden.
- Um ein Decal ohne c_trace an einer Entity anzubringen, setzen Sie die folgenden Parameter des globalen hit-Structs: hit.x an die Decalposition, hit.nx an die Decal-Oberflächennormale (für gewöhnlich entweder die Normale der Trefferoberfläche oder die Richtung von der Decalposition nach der Kamera), hit.lchunk an die Nummer des Meshs auf das das Decal aufgebracht werden soll (falls die Entity aus vielen Meshes besteht, beispielsweise parzelliertes Terrain) und hit.model auf NULL. Ansonsten werden diese hit-Parameter c_trace(...SCAN_TEXTURE) aufgestellt.
- Um Decals eine von der Zielentity unabhängige Drehung zu geben - etwa für Schatten bei Ground-Entities - drehen Sie sie um den Winkel der Zielentity zurück; beispielsweise ent_decal(you, shadow_sprite, my.scale*100, my.pan-your.pan); .
- Um Decals auf Leveloberflächen zu praktizieren, muß der Level im Mesh-Modus kompiliert werden. Eine Entity muß für den letzten 1 Frame existieren und sichtbar sein, ehe Decals darauf platziert werden können. Auf unsichtbaren Entities oder Blocks können keine Decals platziert werden und ebensowenig auf Oberflächen, die keine Textur haben.
- Jedes Decal verbraucht einen Partikel. Dementsprechend setzen sie max_particles, wenn Sie viele Decals brauchen. Werden mehr Decals verwendet, als Partikel zur Verfügung stehen, werden die ältesten Decals entfernt und für neue Decals wiederverwendet. Wie Partikel werden auch Decals nicht mit game_save gespeichert.
- Um die Lebensdauer eines Decals zu begrenzen, läßt sich der lifespan-Parameter des zurückgelieferten Dekalpartikels benutzen. Wird lifespan auf 0.001 gesetzt ist, existiert das Decal nur für einen Frame. Dies kann, indem man es ständig neu platziert, dazu verwendet werden, ein Decal über eine Oberfläche zu bewegen.
- Alpha-Parameter und TRANSLUCENT-Flag des Decalpartikels lassen sich zum Steuern der Transparenz des Decals benutzen. Ist TRANSLUCENT gesetzt, überschreibt der Alpha-Parameter des Decals den Alpha-Parameter der Entity und ermöglicht es, intransparente Decals auf transparente Objekte aufzubringen oder umgekehrt.
- Eine Partikel Event-Funktion kann zum Ein- oder Ausblenden des Decals den Alpha-Parameter oder, zum Animieren des Decals, den bmap-Parameter verändern. Die Partikel-Parameter skill_x, skill_y, skill_z werden intern für das Decal benutzt und dürfen von der Partikelfunktion nicht verwendet werden.
- Die Variable particle_mode legt fest, wie Decals gerendert werden. Ist particle_mode unter 4 (default), verwenden Decals die Entity-Mesh bei animierten Entities oder Entities mit internen LOD-Meshs und verwenden ansonsten ihre eigene Mesh. Das Benutzen der Entity-Mesh hat den Vorteil, daß Decals zusammen mit der Entity animiert werden, allerdings den Nachteil, daß anisotropy filtering aktiviert sein sollte, um zu verhindern, daß der leere Polygonbereich um das Decal herum bei spitzen Winkeln getönt erscheint. Das Verwenden eines eigenen Decal-meshs, welches außerhalb der Entity-Mesh abgeschnitten ist, beugt anisotropen Artefakten vor, verhindert allerdings auch eine Decalanimation. Ist particle_mode auf 4, verwenden Decals immer die Entity-Mesh, bei 8 nehmen sie immer ihre eigene Mesh.
- A7.60 Die Variable decal_clip (default = 85, range = 0..89) bestimmt unter welchem Oberflächenwinkel Decals der Oberfläche angeheftet werden. Oberflächenpolygone, die von der Decal-Normalen um mehr als den angegebenen Winkel abgewandt wurden, werden vom Decal nicht abgedeckt (hit.nx, s. oben).
- Die Zeit, die es dauert, ein Decal auf einer Mesh-Oberfläche anzubringen, hängt von der Anzahl der Polygone der Mesh, sowie der Größe des Decals ab. Je größer das Decal ist, aus je mehr Vertices besteht seine Mesh und umso langsamer geht das Erstellen und Rendern vonstatten. Durch zweimaliges Drücken von [F11] werden Decal-Meshes dargestellt.
- A7.62 Decals überschreiten normalerweise nicht die Grenzen der Meshes auf die sie aufgebracht wurden. Es gibt jedoch eine Ausnahme: Auf parzelliertem Terrain werden Decals automatisch über angrenzende Parzellen ausgebreitet.
- Decals werden auf LOD Level 3 nicht gerendert.
A7.80 Hat ein Modell mehrere LoD-Modelle, wird, wenn ein Decal angebracht ist, nur das Hauptmodell gerendert. Diese Enschränkung gilt nicht für Modelle mit internen LOD-Meshes.
- Wenn sie kein eigenes Material haben, werden Decals mit dem Entity- oder Block-Material und -Shader gerendert. Auf die Decal-Textur kann in einem Shader über entSkin1 zugegriffen werden. Passt der Shader nicht für ein Decal - z. B. wenn entSkin1 für eine Farbmaske oder einen Multitexturen-Shader verwendet wird oder der Alphakanal nicht für Transparenz benutzt wird - weisen Sie ein Decal-Material ohne Shader zu. Je nachdem an welches Objekt das Decal angebracht ist, nehmen Sie etwa mat_model oder mat_terrain.
- Die Funktion ent_purge entfernt sämtliche Decals von der gereinigten Entity.
Geschwindigkeit:
Langsam
Edition:
7.1 C
Beispiel (lite-C):
BMAP* bmMark = "blood.dds";
SOUND* sndShot = "bullet.wav";
// control a decal-placing gun with the camera
function use_decal_gun()
{
while (1)
{
// calculate the target vector
VECTOR trace_target;
vec_set(trace_target,vector(5000,0,0)); // the weapon has a firing range of 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);
// fire and then place a decal at the hit position
if (key_ctrl) // fire
{
if (HIT_TARGET) // target hit?
{
PARTICLE* p = ent_decal(you,bmMark,7+random(3),random(360)); // place a random sized decal at the hit entity
p.lifespan = 1600; // remove decal after 100 seconds
p.material = mat_model; // assign a dedal material
}
snd_play (sndShot,100,0); // play the shot sound at a volume of 100
wait(-0.5); // reload
}
wait(1);
}
}
Siehe auch:
PARTICLE, lifespan, c_trace, effect, material, ent_getdecal
► Aktuelle Version Online