winamp/Src/resources/data/milk2_img.ini
2024-09-24 14:54:57 +02:00

278 lines
13 KiB
INI

/*
NOTE: AS OF MilkDrop v1.04, the functionality of the 'burn' variable
has changed. See below.
NOTES/TIPS
-sprites range from 00-99
-'img=' line is mandatory. File types currently supported (as of v1.04):
JPG
PNG
BMP
TGA
DDS
PPM
DIB
-valid filenames are:
relative: img=billy.jpg (loads winamp\plugins\milkdrop2\billy.jpg)
img=..\billy.jpg (loads winamp\plugins\billy.jpg)
img=images\billy.jpg (loads winamp\plugins\milkdrop2\images\billy.jpg)
absolute: img=c:\blah\billy.jpg
NOT ok: img=c:billy.jpg -must specify path
NOT ok: img=\billy.jpg -must specify drive
-textures can be as large as 2048x2048 and do not have to be square.
-texture dims in memory will be next power of 2 higher for w, h.
ex: 500x60 texture will be stored in memory as a 512x64 texture.
-big textures can take up a lot of video memory and seriously
drop the frame rate; recommend sprites be no larger than 512x512.
256x256 is even more preferable.
-if there isn't enough video memory for the texture, it will downsample
the texture (to as low as 16x16 pixels) trying to fit it into video
memory.
-IMPORTANT: to terminate a sprite from within its own code, set the
'done' variable to a nonzero value (such as 1). For example,
"done=above(frame,500);" would make the sprite auto-self-terminate
after 500 frames. To make this framerate-independent, based it on
'time' or 'frame/fps' (they are equivalent).
-there is currently a maximum of 16 sprites that can be on the screen
at one time.
-the sprite manager supports instancing, so if you load two sprites
that access the same image on disk, only one texture will exist
in video memory.
-the sprite manager frees textures immediately when all the sprites
using that texture (all instances) expire or finish.
-all of the mathematical functions available for milkdrop's per-frame
and per-pixel equations are available here for doing funky things
with the sprites; see milkdrop_preset_authoring.html for a complete
list of all the functions available.
-you can define your own variables in the init_ code just by setting
them to some value (like in the per-frame or per-pixel code of a
milkdrop preset). You can then access this value later in the
per-frame (regular) sprite code. If you change its value, the
change will be remembered from frame to frame. Also, if you
change the value of a built-in (read/write) variable, this change
will also be remembered from frame to frame.
READ-ONLY VARIABLES
-------------------
time
the amount of time that has elapsed since the sprite
was launched (in seconds).
frame
the # of frames that have elapsed since the sprite
was launched.
fps
the current fps (frames-per-second) the MilkDrop is running at.
progress
the progress (0=start .. 1=end) through the current MilkDrop preset.
bass, mid, treb
the relative amount of each audio band being heard this frame.
1 is normal; a number less than one (say, 0.5 .. 1) means
the band is quiet; and a number greater than one (say, 1..2)
means the band is loud.
bass_att, mid_att, treb_att
the same, but attenuated to be relative to the average band levels
over a longer period of time (i.e. more heavily attenuated/damped).
READ/WRITE VARIABLES
--------------------
x,y
the x and y position of the sprite's center on the screen.
x is 0 at the left, 1 at the right; y is 0 at the top, 1 at the bottom.
r,g,b
the red, green, and blue color brightness of the sprite. 0..1.
a
the opacity (alpha) of the sprite. 0=transparent, 1=opaque.
note that the effect of this variable depends on the blendmode
(see below), and that sometimes, due to the blendmode, the value
of 'a' has no effect.
sx, sy
the size (stretching) of the sprite, in the X and Y directions.
if these are both 1, then the image will be scaled up just large
enough so that no part of it goes off the screen. If these are
both 0.5, the image will be half that size; 2, and it's doubled.
If sx and sy are not equal, the image will be stretched
appropriately.
rot
the angle of rotation, in radians, of the sprite. The unit circle
goes from 0 to PI*2 (6.28) radians. At zero radians there is no
rotation; PI/2 is like a 90-degree counter-clockwise rotation;
PI, 180 degrees; PI*3/2, 270 degrees; and PI*2 radians (the same
as zero radians): 0 degrees.
blendmode
determines the manner in which the sprite image is blended onto
the screen.
0=blend: the image is multiplied by (r,g,b) and then blended,
where 'a' decides the amount to blend.
1=decal: the image is multiplied by (r*a,g*a,b*a) and then pasted
onto the background, with no transparency. 'a' values
below 1 will modulate the color of the sprite, making
it darker.
2=additive: the image is multipled by (r*a,g*a,b*a) and then added
onto the background, making it brighter. Again, 'a' values
below 1 will make the sprite darker.
3=srccolor: the amount to blend each pixel with the background
is equal to the inverse of the pixel's color. White texels
in the sprite will be fully drawn, while black texels will
be transparent; in-between texels will be blended partially
based on their brightness. Requires hardware support.
The alpha value ('a') has no effect when this blendmode
is set; the alpha value is taken from the R,G,B color in
the image at evert point.
4=colorkey:
pixels that match the color specified in the colorkey are
drawn transparently, and all other pixels are drawn opaquely,
much like a television bluescreen. When using this blendmode,
a line like the following is required to be present in the
sprite:
colorkey=0x000000
where the value is some 24-bit hexadecimal color. The first
two digits are 00 through FF hexadecimal (0-255 decimal)
and are the red value; the third and fourth digits are the
green value; and the last two digits are the blue value.
So, 0x000000 makes black the see-through color; 0xFFFFFF
makes white pixels transparent; 0x0000FF makes blue pixels
transparent; and so on.
When the blendmode is not 4, the colorkey setting will have
no effect.
When blendmode is 4, the alpha value ('a') still works, too;
it simply modulates the overall opacity of the sprite.
NOTE that this effect does not work on all video cards, and
also tends to hiccup when running in 16-bit color. Try it
in 32-bit color for best chances for it to work.
NOTE that prior to MilkDrop v1.04, this feature worked
slightly differently; there was a range of color key values
(and you specified 'colorkey_lo' and 'colorkey_hi')
instead of just one single colorkey value ('colorkey').
My apologies for any confusion this change might cause.
flipx
if nonzero, the sprite will be flipped horizontally.
flipy
if nonzero, the sprite will be flipped vertically.
repeatx
the number of times to repeat the texture over the surface of the
sprite, in the x direction. A value of 1 is the default; a value of
2 will cause the texture to tile twice in the x direction; and so on.
**NOTE that if the width or height of the source image is not a
power of two (16,32,64,128,256,512,1024,2048) then repeating the
image could cause strange bands to appear (on some poorly-written
display drivers or older video cards). If using repeating, pre-
stretch the source image to be a power of 2 to alleviate this
problem.**
repeaty
like repeatx, but in the y-direction.
done
set this to some nonzero value to make the sprite self-terminate.
frees up resources associated with the sprite.
burn
if set to a nonzero value, then the sprite will burn into MilkDrop's
background and become part of the animation. If set to zero, there
will be no burn-in. You can set this to 1 for a long time to make
cool trails of the sprite, or you can set it to 1 just on the last frame
(at the same time that you set 'done' to 1), to make the sprite burn into
the background and die off, much like song titles and custom messages do.
( NOTE: prior to v1.04, 'burn' only worked on the last frame, when done
was set to 1. With v1.04 and later, 'burn' works on any frame. )
/end of critical info
*/
[img00]
// testing color keying... this is probably best with TGA's (exact colors), not JPG's.
img=textures\kaite.jpg
colorkey=0xFFFFFF
init_1=blendmode = 4;
code_1=rot = time*0.27;
code_2=new_scale = 0.75 + 0.1*sin(time*0.6);
code_3=sx = new_scale;
code_4=sy = new_scale;
code_5=r=0.5+sin(time*0.9);
code_6=a=0.5+sin(time*1.3);
[img01]
// this tests the 'done' function, and burns into the screen @ the end
img=textures\heart.jpg
init_1=blendmode = 3;
init_2=x = 1;
init_3=orig_y = 0.5;
code_1=time_to_reset = below(x,-0.5);
code_2=x = x*(1-time_to_reset) + time_to_reset*(1.5 + 0.01*rand(100) + 1);
code_3=orig_y = orig_y*(1-time_to_reset) + time_to_reset*(0.3 + 0.4*0.01*rand(100));
code_4=sx = sx*(1-time_to_reset) + time_to_reset*(0.25 + 0.4*0.01*rand(100));
code_5=sy = sx;
code_6=x = x - 0.008 + 0.0033*sin(time*1.371);
code_7=y = orig_y + 0.12*sin(time*1.9);
code_8=done=above(frame,80);
code_9=burn=done; // burn into screen @ end
[img02]
// this burns into the screen *every frame*
img=textures\cells.jpg
init_1=blendmode = 3;
init_2=x = 1;
init_3=orig_y = 0.5;
code_1=time_to_reset = below(x,-0.5);
code_2=x = x*(1-time_to_reset) + time_to_reset*(1.5 + 0.01*rand(100) + 1);
code_3=orig_y = orig_y*(1-time_to_reset) + time_to_reset*(0.3 + 0.4*0.01*rand(100));
code_4=sx = sx*(1-time_to_reset) + time_to_reset*(0.25 + 0.4*0.01*rand(100));
code_5=sy = sx;
code_6=x = x - 0.008 + 0.0033*sin(time*1.371);
code_7=y = orig_y + 0.12*sin(time*1.9);
code_8=done=above(frame,80);
code_9=burn=1; // burn into screen every frame
[img03]
// for testing: show a large (nova2) or large+skinny (nova3) texture
img=textures\smalltiled_lizard_scales.jpg
init_1=blendmode = 2;
code_1=rot = time*0.27;
code_2=new_scale = 1.0 + 0.1*sin(time*0.6);
code_3=sx = new_scale;
code_4=sy = new_scale;
code_5=new_alpha = min(0.9,max(0.2, 2*max(bass-.05,bass_att)-1.1 ));
code_6=a = a*0.83 + 0.17*new_alpha;
[img04]
desc="cool: an 'osapien' drifts across the screen every so often."
img=textures\smalltiled_electric_nebula.jpg
init_1=blendmode = 3;
init_2=x = -100;
init_3=orig_y = 0.5;
code_1=time_to_reset = below(x,-0.5);
code_2=x = x*(1-time_to_reset) + time_to_reset*(1.5 + 0.01*rand(100) + 3);
code_3=orig_y = orig_y*(1-time_to_reset) + time_to_reset*(0.3 + 0.4*0.01*rand(100));
code_4=sx = sx*(1-time_to_reset) + time_to_reset*(0.25 + 0.4*0.01*rand(100));
code_5=sy = sx;
code_6=x = x - 0.008 + 0.0033*sin(time*1.371);
code_7=y = orig_y + 0.12*sin(time*1.9);
[img10]
img=textures\manyfish.jpg
init_1=blendmode = 3;
code_1=rot = time*0.27;
code_2=new_scale = 0.9 + 0.2*sin(time*0.6);
code_3=sx = new_scale;
code_4=sy = new_scale;
code_5=new_alpha = min(0.9,max(0.2, 2*max(bass-.05,bass_att)-1.1 ));
code_6=a = 1;//a*0.9 + 0.1*new_alpha;
[img11]
img=textures\onefish.jpg
init_1=blendmode = 3;
code_1=rot = -time*0.2;
code_2=new_scale = 0.7 + 0.2*sin(time*0.6);
code_3=sx = new_scale;
code_4=sy = new_scale;
code_5=new_alpha = .4*min(0.9,max(0.2, 2*max(treb-.05,treb_att)-1.1 ));
code_6=a = a*0.03 + 0.10*new_alpha;