--MAXScript Tutorials --LESSON 05 --by Borislav Petrov [FA] --bobo@email.archlab.tuwien.ac.at ----------------------------------------------- --Visit --http://support.ktx.com/~10 --for more MAXScript information and resources. --Visit the Diner --http://support.ktx.com/~8 --for a public discussion on these Tutorials. ----------------------------------------------- --Open a New Max scene --Load the script --PRESS Ctrl+E to Evaluate --Select from Drop-down list to open utility lesson05 "Lesson05" ( group "About..." ( label lesson_label01 "Lesson 05 Script" label lesson_label02 "by Borislav Petrov" label lesson_label03 "Kinetix Forum Assistant" ) group "Settings:" ( radiobuttons geom_mode "Geometry" labels:#("Box","Sphere","Color-Per-Vertex Mesh") align:#left dropdownlist effect_mode "Effect Source" items:#("Luminosity","Red Channel","Green Channel","Blue Channel","Alpha Channel") spinner sphere_segs "Sphere Segments:" range:[4,16,4] fieldwidth:40 align:#right type:#integer enabled:false spinner base_size "Base Size:" range:[1,1000,100] fieldwidth:40 align:#right spinner multiplier "Effect Multiplier:" range:[0.1,10,2] fieldwidth:40 align:#right spinner nth_pixel "Every Nth Pixel:" range:[1,10,1] fieldwidth:40 align:#right type:#integer button get_image "Get Image File" width:140 edittext bmp_name "File" text:"c:\\mxstut\\m.avi" label size_label "Image Size:???x???" label frame_label "Frames:?" checkbox use_frames "Create Animation" checked:true enabled:false align:#center ) group "Action" ( button start_process "LET'S DO IT!" width:140 height:30 align:#center enabled:false button remove_all "Clean up scene" width:140 align:#center ) fn Check_bmp_size bmp_n = ( try ( bmp_check = openbitmap bmp_n bmp_w = bmp_check.width bmp_h = bmp_check.height num_frames = bmp_check.numframes close bmp_check size_label.text = "Image Size:" + bmp_w as string + "x" + bmp_h as string frame_label.text = "Frames:"+num_frames as string if num_frames > 1 then use_frames.enabled = true else use_frames.enabled = false ) catch ( start_process.enabled = false ) ) on geom_mode changed state do ( if state == 2 then sphere_segs.enabled = true else sphere_segs.enabled = false ) on bmp_name entered txt do ( file_check = getFiles bmp_name.text if file_check.count == 1 then ( start_process.enabled = true Check_bmp_size bmp_name.text ) else ( size_label.text = "Image Size:???x???" start_process.enabled = false ) ) on get_image pressed do ( pick_image = selectBitmap caption:"Get Image File" if pick_image != undefined then ( bmp_name.text = pick_image.filename start_process.enabled = true Check_bmp_size bmp_name.text ) ) on start_process pressed do ( work_bmp = openbitmap bmp_name.text bmp_w = work_bmp.width bmp_h = work_bmp.height progressstart "Generating Objects..." mesh_verts = #() mesh_cpv = #() nodes_array = #() for h = 1 to bmp_h by nth_pixel.value do ( pixel_line = getpixels work_bmp [0,(h-1)] bmp_w if not progressupdate (h as float /bmp_h *100) then exit for w = 1 to bmp_w by nth_pixel.value do ( case effect_mode.selection of ( 1: size_value = base_size.value + multiplier.value*(pixel_line[w].r+pixel_line[w].g+pixel_line[w].b)/3 2: size_value = base_size.value + multiplier.value*(pixel_line[w].r) 3: size_value = base_size.value + multiplier.value*(pixel_line[w].g) 4: size_value = base_size.value + multiplier.value*(pixel_line[w].b) 5: size_value = base_size.value + multiplier.value*(pixel_line[w].alpha) ) case geom_mode.state of ( 1: ( new_object = box length:base_size.value width:base_size.value height:size_value append nodes_array new_object ) 2: ( new_object = sphere radius:(size_value/2) segs:sphere_segs.value append nodes_array new_object ) 3: ( append mesh_verts [w*base_size.value, (-h*base_size.value), size_value] append mesh_cpv pixel_line[w] ) ) if geom_mode.state != 3 then ( new_object.pos = [w*base_size.value, (-h*base_size.value), 0] new_object.name = uniquename "5th_Lesson" new_material = standardmaterial diffuse:pixel_line[w] new_material.name = new_object.name new_object.material = new_material ) )--end w loop )--end h loop if geom_mode.state == 3 then ( new_object = mesh length:(bmp_h*base_size.value) width:(bmp_w*base_size.value) lengthsegs:(bmp_h/nth_pixel.value-1) widthsegs:(bmp_w/nth_pixel.value-1) setnumcpvverts new_object mesh_cpv.count for i = 1 to new_object.numverts do ( setvert new_object i mesh_verts[i] setvertcolor new_object i mesh_cpv[i] ) normal_mod = normalModifier flip:true addmodifier new_object normal_mod collapsestack new_object defaultVCfaces new_object update new_object new_object.name = uniquename "5th_Lesson" vert_color = Vertex_Color () new_material = standardmaterial diffusemap:vert_color new_material.name = new_object.name new_object.material = new_material new_object.showvertexcolors = true ) progressend () if num_frames > 1 and use_frames.checked then ( if geom_mode.state == 3 then animatevertex new_object #all animate on ( for t = 1 to num_frames do ( progressstart ("Animating Frame "+t as string + " of "+num_frames as string) gotoframe work_bmp t mesh_verts = #() mesh_cpv = #() node_counter = 0 anim_len = (animationrange.end - animationrange.start)+1 anim_delta = anim_len/num_frames at time (t*anim_delta) ( for h = 1 to bmp_h by nth_pixel.value do ( pixel_line = getpixels work_bmp [0,(h-1)] bmp_w if not progressupdate (h as float /bmp_h *100) then exit for w = 1 to bmp_w by nth_pixel.value do ( node_counter += 1 case effect_mode.selection of ( 1: size_value = base_size.value + multiplier.value*(pixel_line[w].r+pixel_line[w].g+pixel_line[w].b)/3 2: size_value = base_size.value + multiplier.value*(pixel_line[w].r) 3: size_value = base_size.value + multiplier.value*(pixel_line[w].g) 4: size_value = base_size.value + multiplier.value*(pixel_line[w].b) 5: size_value = base_size.value + multiplier.value*(pixel_line[w].alpha) ) case geom_mode.state of ( 1: ( nodes_array[node_counter].height=size_value nodes_array[node_counter].material.diffuse=pixel_line[w] ) 2: ( nodes_array[node_counter].radius=(size_value/2) nodes_array[node_counter].material.diffuse=pixel_line[w] ) 3: ( new_object[4][node_counter].value = [w*base_size.value, (-h*base_size.value), size_value] ) )--end case )--end w loop )--end h loop progressend () )--end at time )--end t loop )--end anim on )--end num_frames max views redraw close work_bmp )--end on button pressed on remove_all pressed do ( q_answer = queryBox "You are about to delete all objects\ncreated by the Utility.\nAre you sure?" if q_answer then ( delete_array = $5th_Lesson* as array delete delete_array ) ) on lesson05 open do ( file_check = getFiles bmp_name.text if file_check.count == 1 then ( start_process.enabled = true Check_bmp_size bmp_name.text ) else ( messagebox "The Image file couldn't be found!\nPlease select a valid one." ) ) )--end utility