Титульная страница
ISO 9000 ISO 14000
GMP Consulting
 
Mastering 3D Studio MAX R3

Previous Table of Contents Next


In your script, you defined three different axes, which will be called using the CASE expression. The position of the vertex in each axis will be modified, using a sine expression. This expression has another parameter, center, which is the center position of the object. This allows you to use this value as part of the formula. In Listing 18.10, center defines where the deformation is zero, because when p.z is equal to center.z, sine will evaluate zero.


NOTE Notice that this modifier also has Gizmo and Center, which can be animated as any regular modifier.

Creating Render Effects

Render effects can also be created through MAXScript. They can access the rendered image and the rendered channels, manipulate them, and output an image at the end.

This type of script works exactly like a modifier plug-in, but the event that triggers the action is on apply bmp, where bmp is the bitmap containing the rendered image. This way, you can manipulate the image and output another bitmap with the adjusted values.

You will now make a script that shifts the Hue of an image. This script will also have a nice UI, to help the user understand what is happening.


NOTE Render effects scripts that manipulate pixels, like this example, are very slow compared to regular plug-ins.

Start a new script and type the code shown in Listing 18.11, or from the CD open the file plugin_hue.ms.


LISTING 18.11: The Change Hue plug-in script (plugin_hue.ms)
plugin renderEffect Hue_control
 name:”Change Hue”
 classID:#(0x31705a72, 0x4f48bbc7)
 (
 parameters pblock rollout:params
 (
 On_Off type:#boolean default:true animatable:true
 Hue type:#integer default:0 animatable:true ui:(h_level,h_slid)
 on Hue set value do
 (
 if Hue > 127 then Hue = 127
 if Hue < (-127) then Hue = (-127)
 )
 )
 rollout params “Hue Settings”
 (
 local bmp1 = bitmap 255 4
 local bmp2 = bitmap 255 4
 checkbox a_only “Affect Background” checked:false
 label c_mark2 “|” pos:[160,21]
 label c_mark3 “|” pos:[160,34]
 label c_mark1 “|” pos:[160,26]
 bitmap normal_hue bitmap:bmp1 pos:[33,25]
 bitmap adjusted_hue bitmap:bmp2 pos:[33,36]
 label h_lbl “Hue” align:#left pos:[20,53]
 spinner h_level range:[-127,127,0] type:#integer fieldwidth:50 \
 pos:[75,52]
 slider h_slid range:[-127,127,0] type:#integer
 label rnd “Rendering:” align:#left
 progressbar prog align:#center width:300
 button reset_h “Reset” pos:[250,50]
 fn make_ramp val_h =
 (
 local start_clr
 local color_ramp = #()
 start_clr = color 255 0 0
 start_hue = start_clr.hue + 127
 if (start_hue + val_h) > 255 then
 start_hue += (val_h - 255)
 else
 start_hue += val_h
 if start_hue > 255 then start_hue -= 255
 if start_hue > 255 then start_hue -= 255
 start_clr.hue = start_hue
 for i in 1 to 255 do
 (
 mid_clr = copy start_clr
 start_hue = mid_clr.hue
 if (start_hue + i) > 255 then
 start_hue += (i - 255)
 else
 start_hue += i
 if start_hue > 255 then start_hue -= 255
 if start_hue > 255 then start_hue -= 255
 mid_clr.hue = start_hue
 color_ramp[i] = mid_clr
 )
 return color_ramp
 )
 fn upd_ramp =
 (
 bmp2 = bitmap 255 4
 clr = make_ramp h_level.value
 for i in 1 to 4 do setpixels bmp2 [0,i-1] clr
 adjusted_hue.bitmap = bmp2
 )
 on reset_h pressed do (h_level.value = 0; upd_ramp() )
 on h_level changed val do upd_ramp()
 on h_slid changed val do upd_ramp()
 on params open do
 (
 bmp1 = bitmap 255 4
 bmp2 = bitmap 255 4
 clr = make_ramp 0
 for i in 1 to 4 do setpixels bmp1 [0,i-1] clr
 clr = make_ramp h_level.value
 for i in 1 to 4 do setpixels bmp2 [0,i-1] clr
 adjusted_hue.bitmap = bmp2
 normal_hue.bitmap = bmp1
 )
 )
 on apply bmp do
 (
 if On_Off then
 (
 for h=0 to bmp.height do
 (
 local sline = getPixels bmp [0,h] bmp.width
 for w = 1 to sline.count do
 (
 if params.a_only.checked then
 (
 calc = true
 )
 else
 (
 if sline[w].alpha == 0 then calc = false else calc = true
 )
 if calc then
 (
 slineh = sline[w].hue + Hue
 if slineh > 255 then
 slineh = (slineh - 255)
 else
 if slineh < 0 then
 slineh = 255 + slineh
 sline[w].hue = slineh
 )
 )
 params.prog.value = h*100/bmp.height
 setPixels bmp [0,h] sline
 )
 params.prog.value = 0
 )
 )
 )

Evaluate this script and add the Change Hue effect in the Rendering Effects dialog box. Notice that changing the spinner or the slider will update the bitmaps in the UI, helping us visualize the Hue change, as seen in Figure 18.12. These bitmaps are controlled by the functions make_ramp and upd_ramp.


FIGURE 18.12  Change Hue render effect

The script action is in on apply bmp. First, it checks to see if the effect is on. Then it checks to see if the alpha channel should or not be calculated. A temporary variable is created to hold the current hue value. This value will be modified by the spinner value, which will be checked, because it cannot be bigger than 255 or smaller than 0. At the end, the corrected value will be written to the original bmp.

You also used a progressbar UI item, which is updated as the bitmap is processed.

Similarly to the RENDER() command, if you want to work with rendered channels, you need to call a specific event to create them. This event is on channelsrequired do channel_array, where channel_array is the same channel array you specify in the RENDER() command.

This event needs to be called before the on apply bmp event, so you can use these channels in your process. Take some time now and rewrite the Render Channels script you made in Chapter 16 as a Render Effect plug-in script. It will work similarly to the File Output render effect, but you’ll be able to output all channels, instead of only the three channels that are output through File Output.


Previous Table of Contents Next

© 2000, Frol (selection, edition, publication)

 
Rambler's Top100