AddToPercentage(DeltaPercentage)
Adds the value of DeltaPercentage to the current hourglass percentage.
These produce a short beep using an equivalent to VDU 7.
This is not a command that should ever appear in a file, bit is inserted whenever a command is not recognised. If a texture does not form, and saving the texture as a textfile contains this command, then probably some mistake has been make in the typing of new commands.
This command should always be included at the end of the texture file and before any subroutines are declared. It should always be present, by convention.
This command is included as a marketing device for the program. It enables distribution of a version of the program that can read and display textures, and allow their saving as bitmaps, while not allowing unregistered users to edit the programs that generate these textures.
In unregistered versions of the program, textures which do not contain the correct value in their checksum or contain no checksum at all are rejected by the program and not displayed. This limits the extent to which unregistered users may manipulate their textures.
In registered versions, an additional module is supplied which will enable the program (and all future upgrades of it) to read textures independently of the checksum.
A site license or Super-user version will also display whether the checksum is correct, and will write texture files with correct checksums, enabling people other than the author to distribute textures readable by the freeware distributed version of the program.
This is provided for debugging purposes. When it is executed, texture generation is terminated and control is returned to the user. The Value
is reported to the user.
This is provided for debugging purposes. When it is executed, the value of Value
is sent via WIMP messages to a program such as my own !Zephyr, which keeps a scrolling window of text for the purposes of debugging WIMP applications. Message number &804C0 is used.
When executed, texture generation is terminated and control is returned to the user with the <string> reported as an error message.
When executed, <string> is sent via WIMP message to a WIMP debugging program such as my own Zephyr
. Message number &804C0 is used with a block containing the raw text to be sent.
This is for internal use only and should not be used.
This command is unusual in that it does not require brackets for its parameters. The syntax is identical to the way if statements are used in Obey files. The commands may optionally contain further If statements. Comments are treated as they would be in Obey files, i.e. If 1 = 2 THEN |ECHO Equal! ELSE ECHO Not_Equal!
would print Not_Equal!
in an Obey file, despite the earlier |
.
Digression beginning...
If ... Then ... If ... Then ... Else
constructs currently treat the Else as
belonging to BOTH If
s. One can't help thinking that If ... Then ... If
... Then ... Else ... Else
should make sense - i.e. the Else
should belong
to the nearest If
. Unless the Ifs
are nested in this manner one of them cannot have an Else
without the other one getting it too. However, BASIC does not agree (and that's BBC BASIC, the official Englishman's dialect). No doubt the Germans would have implemented it as they are used to recursively peeling verbs from their sentences and correlating them with earlier nouns. Still, the sentence The boy, the girl, the man, kissed, hit, ran
is reputed to be good English, though no-one seems quite to be able to get their head 'round it. It is possible to invert the first condition so that the If
comes after the Else
instead of after the Then (unless the command required there is another If
statement).
Obey files don't seem to like their If
s nested either (programmers must find it easier to just look for the next Else
than to count the intermediate If
s), and so neither does Texture Garden (which tries to follow the Obey file syntax, so its files can be displayed in Obey file syntax-colouring modes in text editors).
...digression end.
As <Condition>s you cannot use <
, =
, >=
!=
etc.
A list of conditions that are acceptable follows:
These functions are fairly self explanatory; hopefully a single example will suffice:
IsLessThan(A,B) returns TRUE (&FFFF or -1) if A is less than B, otherwise it
returns FALSE (0).
This command effectively stops the system from mutating until the next StartMutating command. This has the effect of stopping any intervening commands from being affected by any mutations or sexual recombination that may occur. This may be of use when stopping mutations affecting parts of the texture whose structural integrity is important.
Reverses the effect of the last StopMutating
command.
This is equivalent to (and replaces) the above two commands.
This command effectively stops the system variable AnimationFrameNumber
from affecting the texture until the next StartAnimating command. This has the effect of stopping any intervening commands from being affected by any animation that is occuring. This may be of use when stopping palettes which are declared using Fourier transforms from being animated
causing the palette to change then this is considered undesirable.
Reverses the effect of the last StopAnimating
command.
This is equivalent to (and replaces) the above two commands.
See also:
SetAnimationFrameNumber, AnimationFrameNumber and AnimationType(Frequency).
Creates a sprite in the current mode using the current colourmap.
Adds to an existing sprite using the current colourmap. The existing sprite is written to only at the points where the value at (X,Y) is non-zero.
This makes a 24-bit colour virtual sprite.
This is useful when creating images by using multiple layers of texture.
Type_R
, Type_G
and Type_B
are the combination-types to be used when adding to an existing sprite for red, green and blue components respectively.
The virtual sprite should not be assumed to be blank when it is created and so the first occurrence of this command should normally use Overwrite,Overwrite,Overwrite
as its parameters.
This command makes a RISC OS sprite from the 24-bit virtual sprite created by a previous MakeVirtualSprite
command.
FloydSteinberg dithering may be applied, but will only produce noticable effects if the texture is rendered in 16, 256 or 32K modes. In 16M modes, FloydSteinberg dithering is not required.
The MakeSpriteFromVirtualSprite
command usually leaves the virtual sprite unaffected, but if FloydSteinberg dithering is being used, it is altered to the dithered version of the sprite in the selected mode.
One point to note is that dithering should always be set either to Zero
or to FloydSteinberg
before this command is executed. As the dithering command is affected by the mutator this should not be as a raw number, but as one of the strings mentioned above.
This is for compatibility with other possible future dithering routines.
Truncates the top and bottom edges from the sprite. * #
Truncates the left- and right-hand edges from the sprite. * #
Performs TruncateSpriteHorizontally(0,XFactor)
and TruncateSpriteVertically(0,YFactor)
. This is the method used by Texture Garden's front-end to resize textures.
* Note that with these commands, the sprite may not subsequently be added to. These operations may stop the resulting sprite from tessellating.
# These commands should only be used when resizing the texture using the front-end is not necessary, as they will stop textures from being resized.
This function is a function of X and Y as well as of its parameter Filter_Description
. It generates a field of values in the main two dimensional working buffer. These form a Filter
which is usually used to filter random noise with the result then being inverse-fourier-transform'd. The functions commonly used are described in a different section. Filters may be defined in other ways, if so desired, but this is the main recommended method.
This and the command that follow it perform a series of operations on the main two dimensional working buffer. First, the contents of the buffer are used as a filter to filter a spectrum of random white noise.
What noise is used and how the filtering is performed is affected by the following commands: Seed(Value), Phase(Value), NoiseToBeFiltered(Value), CreateCosineSymmetry, CreateSineSymmetry, CreateCosineArtefacts(Value), CreateSineArtefacts(Value), AbandonCosinePhase, and AbandonSinePhase.
Exactly how these commands affect the filtering of the noise is partially described elsewhere.
Next the resulting spectrum is exposed to an two-dimensional inverse fast fourier transform. This is an elaborate function that is capable of converting a signal from the frequency domain into the space/time domain. Readers are referred to signal processing textbooks for further details. Finally the resultant vectors are converted to a series of amplitudes by squaring, adding and then square-rooting their components.
This is identical to the above command, except the resulting values are centred about &8000, eliminating the spiky artefacts
that occur near H = 0 when the plain TwoDimensionalTransform
is used.
See above description of this function in two dimensions. The main one dimensional buffer is used. The filter is calculated only over the range where Y = 0.
The filter is calculated by setting Y = 0 and Z = 0.
See above description of this function in two dimensions.The main one dimensional buffer is used.
As OneDimensionalTransform
but uses buffer <BufferNumber>.
See above description of this function in two dimensions. The main one dimensional buffer is used.
As SmoothOneDimensionalTransform
but uses buffer <BufferNumber>.
This command is used to influence how filters are created. The idea behind
it is to provide a single command which will allow textures to be
generated so that when the texture is enlarged, more of the texture
becomes visible. The option defaults to off.
This command is currently in an embryonic state and only affects the
creation of filters for fourier transforms. It should not currently be used
in the making of one-dimensional filters. It has an effect on these, but
this is currently broken, and is subject to change in future versions of
the program.
Invariance also affects the size of Ripples
and Radials
commands, scaling
these in an appropriate manner. Note that to provide true scale invariance
for these commands, more of them will need to be executed. A density
command may be provided in the future to assist with this kind of operation.
This sets variable number (Variable_Number MOD &400) to be equal to <Value>.
This sets the system variable AnimationFrameNumber
to be equal to <Value>.
This not normally be referred to. If the texture is to be animated manually using batch files, then it may be used in conjunction with the Use Animation type
option.
Sets the seed to be used in the random number generators.
Resets the AbandonCosinePhase
, AbandonSinePhase
, CreateCosineSymmetry
and CreateSineSymmetry
flags to off.
Sets the values of AbandonCosinePhase
, AbandonSinePhase
, CreateCosineArtefacts
and CreateSineArtefacts
to zero.
Sets the phase to be used in the filtering of the random white noise to <Value>. This phase affects all frequencys equally. Changing it smoothly produces similar effects to animating the texture using the Positive.Boring
animation pattern.
Sets the amplitude of the random white noise used in the filtering to <Value>.
When filtering white noise, eliminate all sin components. This produces a pattern guaranteed to at its maximum at its centre, with a rotational symmetry of two.
When filtering white noise, eliminate all cosine components. This produces a pattern guaranteed to be zero at its centre, with a rotational symmetry of two.
When filtering white noise, this eliminates all cosine components with an amplitude less than a certain value. Its effect is like CreateSineSymmetry
but not as extreme.
When filtering white noise, this eliminates all sine components with an amplitude less than a certain value. Its effect is like CreateCosineSymmetry
but not as extreme.
When filtering white noise, this eliminates the effect of the noise on the cosine components of the result. Instead of white noise, bright white light
may be thought of as being used.
See AbandonCosinePhase
substituting Sine
for Cosine
.
The next three commands affect the way dithering is used in the generation of palettes and sprites.
Dithering0 affects the red component of palettes defined using RGB data, the hue
component of palettes defined using HSV data and general (within-palette) dithering when making Sprites.
Dithering1 affects the green component of palettes defined using RGB data and the saturation
component of palettes defined using HSV data.
Dithering2 affects the blue component of palettes defined using RGB data and the value
component of palettes defined using HSV data.
Floyd-Steinberg dithering is available if virtual sprites are being used through the Dithering(FloydSteinberg)
command. Note that ScaledDithering(FloydSteinberg)
will not usually work.
Sets Dithering0, Dithering1 and Dithering2 to be equal to <Value>.
Sets Dithering1 to be equal to <Value>.
Sets Dithering2 to be equal to <Value>.
Sets Dithering0 to be equal to a value which depends on the colour depth of the mode being used. The precise Value given to Dithering0 varies as follows:
Depth Result
16M 0
32K Value * 3 / 8
256 Value / 2
16 Value
4 Value * 2
2 Value * 4
If the result is greater than &FFFF, then it is set to this ceiling.
OneDimensionalProcess(X1,X2,Function,Type)
The section of the main one dimensional buffer defined by (X1,X2) is processed according to Function
and combined with its original self using combination-type Type
. Function
may usefully contain commands such as OneDimensionalPoint(X)
.
Equivalent to the above command, though acting on the specified BufferNumber.
The rectangle in the main two dimensional buffer defined by opposing corners at (X1,Y1) and (X2,Y2) is processed according to Function
and combined with its original self using combination-type Type
. Function
may usefully contain commands such as TwoDimensionalPoint(X,Y)
.
Each point in the one dimensional buffer is processed by adding the values of its two neighbours and itself (multiplied by one of three multipliers) and dividing by &100 before combining it with its original self using combination-type Type
. The following diagram describes the position of the relevant multipliers.
-------------
| L | C | R |
-------------
Equivalent to the above command, though acting on the specified BufferNumber.
Each point in the two dimensional buffer is processed by adding the values of its eight neighbours and itself (multiplied by a series of multipliers) and dividing by &100 before combining it with its original self using combination-type Type
. The following diagram describes the position of the relevant multipliers.
----------------
| TL | TC | TR |
----------------
| ML | MC | MR |
----------------
| BL | BC | BR |
----------------
Multiplies the entire contents of the main one dimensional buffer by <Value>, divides by &100 and then truncates any high bit spillage
.
Equivalent to the above command, though acting on the specified BufferNumber.
Multiplies the entire contents of the main two dimensional buffer by <Value>, divides by &100 and then truncates any high bit spillage
.
If the contents of the main one dimensional buffer at any point is less than <Threshold>, this command multiplies it by <Multiplier>, divides by &100 and then combines it with <Value> using combination-type Type
.
If the contents of the main one dimensional buffer at any point is less than <Threshold>, this command multiplies it by <Multiplier>, divides by &100 and then combines it with <Value> using combination-type Type
.
This expands the range of the contents of the main one dimensional buffer until it covers the range &0000-&FFFF by using linear scaling.
Equivalent to the above command, though acting on the specified BufferNumber.
This expands the range of the contents of the main two dimensional buffer until it covers the range &0000-&FFFF by using linear scaling.
One of the problems with this command (and the one above) emerges when textures using it are animated. Because the height of the highest mountain and the floor of the deepest valley (so to speak) determine the scaling factor to be used, this will be a different factor for different animation frames. An especially high mountain will produce a freak
low gain value. This will have the effect of making the rest of the texture appear lower than it would normally be. Depending on the colouring scheme used, this can result in an unsightly flashing effect in the resultant animation. There is no simple fix for this, but truncating high mountains, and using a fixed gain contrast command are both possible.
Processes the contents of the main one dimensional buffer by comparing it to a bank of white noise and combining those values exceeded by some threshold () by the function (of X) Function
using combination-type Type
.
Equivalent to the above command, though acting on the specified BufferNumber.
Similar to above using the main two dimensional buffer.
Inverts (EORs with &FFFF) the main two dimensional buffer.
Inverts (EORs with &FFFF) the main one dimensional buffer.
Inverts (EORs with &FFFF) the contents of buffer BufferNumber.
Clears the main two dimensional buffer with zeros.
Clears the main one dimensional buffer with zeros.
This command defines a solid block of texture in three dimensions. Its single parameter, Block_Description
is a function of X,Y, and Z. This function usually refers to the various buffers using the 'TwoDimensionalPoint
commands.
This command sculpts a solid shape from the solid block of texture described in the last DefineSolidBlock
command. The parameters, Path_of_X
, Path_of_Y
, Path_of_Z
, define a mapping between X and Y and the three dimensional space. They are all functions of X and Y. The resulting shape is stored in the main two dimensional buffer.
Resizes the texture by XFactor and YFactor.
Actually performs something similar to:
TwoDimensionalShift(&8000,&8000,Overwrite)
TwoDimensionalProcess(0,0,XFactor,YFactor,TwoDimensionalPoint(Combine(Multiplication,&40000 DIV XFactor,LogicalShiftRight(X,&6)),Combine(Multiplication,&40000 DIV YFactor,LogicalShiftRight(Y,&6))),Overwrite).
TwoDimensionalShift(&8000,&8000,Overwrite)
This command is used in a similar context to the Resize(XFactor,YFactor)
command. It is intended for use in resizing bump maps. The front end assumes that if the two dimensional map has been changed since the last virtual sprite was made, then this command has been inserted at the appropriate point.
If called with XFactor and YFactor both equal to &FFFF this command does no processing. Otherwise it performs the action of Resize(XFactor,YFactor)
.
The specified two-dimensional buffer is completely filled with the value <Value>. Memory is allocated if this has not been performed yet.
The specified two-dimensional buffer is completely filled with the value <Value>. Memory is allocated if this has not been performed yet.
Creates a linear field over the entire domain of the main one dimensional buffer. It ranges from H1 ay X = 0 to H2 at X = &FFFF. *
Creates a linear field over the domain (X = X1 to X = X2) in the main one dimensional buffer. It ranges from Y = H1 at X = X1 to Y = H2 at X = X2. *
Creates a linear field over the domain (X = &FFFF - X2 to X = &FFFF - X1) in the main one dimensional buffer. It ranges from Y = H2 at X = &FFFF - X2 to Y = H1 at X = &FFFF - X1. The behaviour of the command when X1 is greater than X2 is always produces a repeatable result, but it is beyond the scope of this document to describe its exact effect. In particular, it should not be assumed that when X1 is greater than X2 this command affects this domain.
This ridiculous specification of the syntax of this command is a legacy from Texture Garden's developmental days. It has been retained to enable old textures to be generated correctly. The command LinearSegment(X1,X2,H1,H2,Type)
should now be used preferentially. *
* Note that by virtue of its nature, the previous three commands may destroy the ability of textures using it to tessellate.
Simply creates a rectangle in the main two dimensional buffer. Of height
<I> and opposing corners at (X1,Y1) and (X2,Y2), the rectangle is combined with the existing pattern using combination-type Type
.
These commands act like those above, only they work on the specified <BufferNumber>.
The main one dimensional buffer is shifted by <Delta_X> and combined with its
original self using combination-type Type
.
The main two dimensional buffer is shifted by (<Delta_X>,<Delta_Y>) and combined with its original self using combination-type Type
.
The specified buffer is shifted by <Delta_X> and combined with itself using
combination-type Type
.
The main two dimensional buffer is rotated by <Theta> rounded to the nearest multiple of 90 degrees and combined with its original self using combination-type Type
. Usually <Theta> is one of Zero
, Ninety
, OneHundredAndEigty
and TwoHundredAndSeventy
.
The main two dimensional buffer is rotated by <Theta> rounded to the nearest multiple of 1/3 of a degree and combined with its original self using combination-type Type
. *
Same as Rotate but with sub-pixel anti-aliasing. *
Similar to Rotate, but the rotation is about an arbitrary point. This is not equivalent to a Shift, Rotate and Shift because of the location of the introduced discontinuities. * #
Same as RotateAbout but with sub-pixel anti-aliasing. *
* Note that by virtue of the nature of its action, this command may destroy the ability of the texture to tessellate unless <Theta> is one of Zero
, Ninety
, OneHundredAndEighty
and TwoHundredAndSeventy
(in which case QuickRotate
should be used). The discontinuities are introduced at what would normally turn into the edges of the sprite. However, further processing may alter their location. The command is also a bit quick and dirty in that no anti-aliasing techniques are used to smooth the rotation. If multiple rotations are used then this might become a problem, though it may also produce some interesting effects as the number of iterations reaches 100.
# Note that there is no QuickRotateAbout as this can be accomplished with a QuickRotate and a TwoDimensionalShift.
Sets up a Repeat
-type loop.
Loops to the matching Repeat
until <Condition> is non-zero.
Sets up a For
-type loop to be executed <Number_of_times_to_loop> times.
Loops to the matching For
for the specified number of times.
Stores the contents of the main one dimensional buffer in the first one dimensional buffer, overwriting its contents.
Stores the contents of the main one dimensional buffer in the second one dimensional buffer, overwriting its contents.
Swaps the contents of the main one dimensional buffer with the contents of the first one dimensional buffer.
Swaps the contents of the main one dimensional buffer with the contents of the second one dimensional buffer.
Combines the contents of the main one dimensional buffer with the contents of the first one dimensional buffer using combination-type Type
.
Stores the contents of the main two dimensional buffer in the first two dimensional buffer, overwriting its contents. *
Swaps the contents of the main two dimensional buffer with the contents of the first two dimensional buffer. *
Combines the contents of the main two dimensional buffer with the contents of the first two dimensional buffer using combination-type Type
. *
Overwrites the contents of the specified <DestinationBuffer> with the
contents of the main one dimensional buffer.
Combines the contents of the two specified buffers and stores the result
in the <DestinationBuffer>. Combination-type Type
is used.
Swaps the contents of the two specified buffers.
* Note that the memory used in manipulating the first two dimensional buffer is not allocated by default, and this will cause the process of texture generation to use more memory than normal. This is only important in if textures are to be generated in low-memory environments.
Applies a series of vertical displacements to the contents of the main two dimensional buffer according to the contents of the main one dimensional buffer. The maximum displacement is twice the dimensions of the main two dimensional buffer. Combination-type Type
is used.
See VerticalDistortion
which is similar.
Applies a shaped smear
of waves to the contents of the main two dimensional buffer whose horizontal displacements vary according to the contents of the main one dimensional buffer. The exact form of the smear is controlled by the first one dimensional buffer. The maximum amplitude of the waves is twice the dimensions of the main two dimensional buffer. Combination-type Type
is used.
See HorizontalWaveWarp
which is similar.
Applies a smear
of waves to the contents of the main two dimensional buffer. The exact form of the smear is controlled by the main one dimensional buffer. The maximum amplitude of the waves is twice the dimensions of the main two dimensional buffer. Combination-type Type
is used.
See HorizontalWaves
which is similar.
This should occur at the start of every palette definition. It is a marker used by the front end to manipulate texture texts.
This should occur at the end of every palette definition. It is a marker used by the front end to manipulate texture texts.
Selects the current colour to the one specified by Component1
, Component2
and Component3
as set out in the CreateColours(ColourModel)
command (see below).
This command sets up a field of 24 bit RGB values describing the palette which will be used in any MakeSprite
, AddToSprite
or MakeVirtualSprite
commands. The ColourModel
may be one of RGB
, HSV
or CIE
. This command represents the preferred method of performing these actions.
The three one-dimensional buffers are used to supply the colour's components.
With the RGB
ColourModel, buffer two contains the red component, buffer one contains the green component, and the main buffer containing the blue component.
With the HSV
ColourModel, buffer two contains the red component, buffer one contains the green component, and the main buffer containing the blue component.
With the HSV
ColourModel, buffer two contains the hue
component, buffer one contains the saturation
component, and the main buffer contains the value
component.
With the HSV
ColourModel, buffer two contains the X
component, buffer one contains the Y
component, and the main buffer contains the Z
component.
Performs CreateColours(RGB)
.
Performs CreateColours(HSV)
.
Performs CreateColours(CIE)
.
Caution should be exercised when using the leading-diagonal and trailing-diagonal versions of the mirror and flip commands as they may prevent the resulting texture from tessellating correctly. The shear commands may also appear to produce different effects at different
resolutions unless the absolute size of their parameter is kept quite small.
The following commands all combine the main two dimensional buffer with its mirror image in the specified axis before combining it with its original self using combination-type Type
.
The following Flip
commands are similar to the Mirror
commands. However, the result is no longer guaranteed to be symmetrical. They take fractionally longer to perform.
Shears combine a sheared image of the main two dimensional buffer with its original self using combination-type Type
. A shear of Size 1 produces a 45 degree shear; higher numbers may be thought of as representing the effect of repeated shears.
This produces a circular effect in the main two dimensional buffer. The effect is centred at (X,Y) and is of radius <Radius> and height <Intensity>. The effect is composed of concentric ripples modulated by the contents of the main one dimensional buffer.
This produces a near-circular effect in the main two dimensional buffer. The effect is centred at (X,Y) and is of radius <Radius> and height <Intensity>. The effect is composed of distorted ripples combined with radial lines modulated by the contents of the one dimensional buffers. The main one dimensional buffer affects the distortion, the first buffer affects the ripples and the second affects the radial lines and their distribution.
Type
affects the way the radial lines are combined with the background and TypeTwo
affects the way the ripples are combined with the resultant.
Places a marker in the program and gives it a name. This name may contain any characters, but top-bit-set (> &7F), low values (< &20), )
, |
and ,
should not be used for compatibility with future versions of the program.
Jumps directly to the named marker.
Calls a routine at the named marker, setting up a return address. Calls and Gotos may not currently be used as functions or as parameters to functions. They may be used as commands in conditional statements.
Returns from the most recent Call.
Sets up a light source. This comes from angle Theta in the horizontal plane (&0 = East, &4000 = North, etc.) and elevation Phi (&0 = on the horizon, &FFFF = at the zenith).
The colour is defined as the current colour (i.e. the one last defined with a SetColour
command).
If the lighting model requires it, the current Dithering
will be used to define the specular constant.
The <LightModel> may currently be one of Gouraud
, Phong
, Specular
. These may be combined e.g. Add(Specular,Phong)
.
If you use more than one light source, it is easy to saturate the resulting texture, which will appear to have uniform blobs of colour, usually white.
This may also happen when shining bright light souces from near the horizon. Because many bump maps will have tall narrow peaks, shining a light from the side will produce significantly more illumination than shining one from near the zenith.
To stop this from happening, either reduce the intensity of the lights being used, shine them more from overhead, use the PseudoExposure
command, orreduce the bumpiness of the map being used.
Currently, only the first eight lightsources are recognised.
This performs the computation using the main two dimensional buffer as the data for the bumpmap, and the previously defined light sources to specify the lighting.
The virtual sprite contains the data which is to be illuminated, and is used to store the result.
Sets the PseudoExposure
variable. This controls how lightsources produce
highlights. Setting Value to &1000 produces no highlights. Lower values
produce dull, under-exposed images. Higher values cause the lightsources to
wash out, usually to white or one of the six primaryish colours.
NOTES:
1. In order to cooperate with future front ends to this feature, the DefineLightSource
commands, the SetColour
commands and the ShineLightOnVirtualSprite
command should all be grouped together in one section, with a ResizeBumpMap
at the beginning if appropriate.
2. The ResizeBumpMap
should always be used if the bumpmap is altered since the last MakeVirtualSprite command. It should be placed after the bumpmap has been created, and directly before any SetColour
commands. If this is not done, the texture may not resize properly.