[Gtkradiant] [Bug 574] Add spritemodel support to all games, not just Halflife
gtkradiant@zerowing.idsoftware.com
gtkradiant@zerowing.idsoftware.com
Mon, 10 Mar 2003 15:00:51 -0600
http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=574
------- Additional Comments From mailinglist.gtkradiant@hydras-world.com 2003-03-10 15:00 -------
Here's the current todo list for the spritemodel module
* make sprites always face the camera (is this done in camwindow.cpp ?)
but only if the entity model doesn't have "angle" keys. At the moment
it's better to rotate the model with the angles.
* maybe add an option to scale the sprites in the prefs?
* maybe convert to a new kind of class not based on model?
* allow sprites on non-fixedsize ents
* fix reversed alpha map in spr loader (in imagehl)
-> is this actually broken?
* allow an entity to have multiple models (e.g .md3 and a sprite model)
and allow the user to toggle either models on or off.
* dynamically add the api's depending on what image loading modules are
supported by radiant. Currently, we hard code to the list
in "supportedmodelformats" (see below) but, all these extensions are stripped
when the actual image is loaded.current the bit of code that decided what model
api to use needs reworking as it decides by looking at the extension of the
model name, when in fact we don't even need an extension.
Previously the code fell though to use this model as the default model plugin,
but that also has issues.
What this means is, in the .def files you must specify an image filename that
has one of the extensions listed below, but in actual fact radiant will use any
available image module to load the image.
e.g. you could use a model name of "sprites/target_speaker.tga" and have a file
called sprites/target_speaker.png and it would be correctly loaded even if it
not listed below in "supportedmodelformats".
So, currently in the .def files you can just use the
name "sprites/target_speaker.spr" and it will load the file
from "sprites/target_speaker.*" which is what I propose anyone creating image
sets for Q3/Wolf/etc does.
Here's the current definition of "supportedmodelformats"
char *supportedmodelformats[] = {"spr","bmp","tga","jpg","hlw",NULL}; // NULL
is list delimiter
Here's an example of a quake3 entity definition with a sprite model
/*QUAKED target_speaker (0 .7 .7) (-8 -8 -8) (8 8 8) LOOPED_ON
LOOPED_OFF GLOBAL ACTIVATOR
Sound generating entity that plays .wav files. Normal non-looping
sounds play each time the target_speaker is triggered. Looping sounds can be
set to play by themselves (no activating trigger) or be toggled on/off by a
trigger.
-------- KEYS --------
noise : path/name of .wav file to play (eg. sound/world/growl1.wav -
see Notes).
wait : delay in seconds between each time the sound is played ("random"
key must be set - see Notes).
random : random time variance in seconds added or subtracted
from "wait" delay ("wait" key must be set - see Notes).
targetname : the activating button or trigger points to this.
notfree : when set to 1, entity will not spawn in "Free for all"
and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF"
modes.
notsingle : when set to 1, entity will not spawn in Single Player mode
(bot play mode).
-------- SPAWNFLAGS --------
LOOPED_ON : sound will loop and initially start on in level (will
toggle on/off when triggered).
LOOPED_OFF : sound will loop and initially start off in level (will
toggle on/off when triggered).
GLOBAL : sound will play full volume throughout the level.
ACTIVATOR : sound will play only for the player that activated the
target.
-------- NOTES --------
The path portion value of the "noise" key can be replaced by the
implicit folder character "*" for triggered sounds that belong to a particular
player model. For example, if you want to create a "bottomless pit" in which
the player screams and dies when he falls into, you would place a
trigger_multiple over the floor of the pit and target a target_speaker with it.
Then, you would set the "noise" key to "*falling1.wav". The * character means
the current player model's sound folder. So if your current player model is
Visor, * = sound/player/visor, if your current player model is Sarge, * =
sound/player/sarge, etc. This cool feature provides an excellent way to
create "player-specific" triggered sounds in your levels.
The combination of the "wait" and "random" keys can be used to play non-
looping sounds without requiring an activating trigger but both keys must be
used together. The value of the "random" key is used to calculate a minimum and
a maximum delay. The final time delay will be a random value anywhere between
the minimum and maximum values: (min delay = wait - random) (max delay = wait +
random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="sprites/target_speaker.spr"*/
Note the last two lines.
All sprite files should be saved as <enginepath>/sprites/<entity_name>.spr
You can create a vfs file with them all in. e.g for q3 you might
create "sprites-hydra.pk3" in which you might have the following files:
sprites/target_speaker.tga
sprites/info_player_start.jpg
sprites/path_corner.tga
sprites/misc_teleporter_dest.bmp
etc.
For quake3, add this section to the synapse.config
<client name="sprite">
<api name="shaders">
quake3
</api>
<api name="VFS">
pk3
</api>
</client>
Updated patch in a few minutes...