Macroscript BuildingGenerator category: "MaVCArt" tooltip: "Eazy Arrayz" buttontext: "EazyArrayz" ( -- start script here -- functionality: sample custom geometry for instancing to build up giant skyscrapers very fast -- functions: -- samples minium and maximum positions to determine the spacing distance -- can auto-setup materials -- can auto-setup master controller (simple link from geometry to master controller) -- can auto-setup child controllers for each level of the building (auto-linked to the master controllers rollout OldGreenBGScript "old green building generator" width:200 height:504 ( GroupBox grpgeometry "geometry" pos:[8,8] width:184 height:72 pickbutton btnPickGeom "Pick Geometry" pos:[16,48] width:168 height:24 edittext edtGeometry "geometry " pos:[16,24] width:168 height:16 spinner spnRight "" pos:[112,120] width:72 height:16 enabled:false range:[0,100000,0] type:#integer scale:1 spinner spnLeft "" pos:[112,96] width:72 height:16 enabled:false range:[0,100000,0] type:#integer scale:1 label lblLeft "Left" pos:[16,96] width:64 height:16 enabled:false label lblRight "Right" pos:[16,120] width:56 height:16 enabled:false button btnCollapse "Collapse" pos:[8,464] width:184 height:24 enabled:false toolTip:"collapse all geometry" radiobuttons rdoUse "Use" pos:[16,344] width:73 height:46 enabled:false labels:#("Instance", "Copy") columns:1 checkbox chkMasterController "Use Master ctrl" pos:[88,352] width:96 height:16 enabled:false checkbox chkChildControllers "Use Child ctrls" pos:[88,376] width:96 height:16 enabled:false spinner spnDown "" pos:[112,168] width:72 height:16 enabled:false range:[0,100000,0] type:#integer scale:1 spinner spnUp "" pos:[112,144] width:72 height:16 enabled:false range:[0,100000,0] type:#integer scale:1 label lblUp "Up" pos:[16,144] width:64 height:16 enabled:false label lblDown "Down" pos:[16,168] width:56 height:16 enabled:false spinner spnForward "" pos:[112,192] width:72 height:16 enabled:false range:[0,100000,0] type:#integer scale:1 label lblForward "Forward" pos:[16,192] width:56 height:16 enabled:false spinner spnBackward "" pos:[112,216] width:72 height:16 enabled:false range:[0,100000,0] type:#integer scale:1 label lblBackward "Backward" pos:[16,216] width:56 height:16 enabled:false button btnCreateControllers "Create Controllers" pos:[8,432] width:184 height:24 enabled:false toolTip:"Create Controllers" button btnResetValues "Reset Values" pos:[8,400] width:184 height:24 enabled:false toolTip:"Reset Values" spinner spnspacingx "" pos:[72,264] width:112 height:16 range:[0,1e+013,0] enabled:false label lblspacingx "Spacing x" pos:[16,264] width:48 height:16 enabled:false GroupBox grpspacing "Spacing" pos:[8,248] width:184 height:88 enabled:false GroupBox grpnrcopies "nr of copies" pos:[8,80] width:184 height:160 enabled:false spinner spnspacingy "" pos:[72,288] width:112 height:16 range:[0,1e+013,0] enabled:false label lblspacingy "Spacing y" pos:[16,288] width:48 height:16 enabled:false spinner spnspacingz "" pos:[72,312] width:112 height:16 range:[0,1e+013,0] enabled:false label lblspacingz "Spacing z" pos:[16,312] width:48 height:16 enabled:false local InstanceGeomObject local Left_Inst local Right_Inst local Up_Inst local Down_Inst local Forward_Inst local Backward_Inst local UseChildren = false local UseMaster = false local Use_Inst = true local Use_Copy = false local objectvalue = [0,0,0] local spacing = 0.0000f local geoObj_right = #() local geoObj_left = #() local geoObj_up = #() local geoObj_down = #() local geoObj_forward = #() local geoObj_backward = #() local MasterArray = #() local spacingx = 0 local spacingy = 0 local spacingz = 0 fn determinespacing geometryobject = ( -- determines minimum and maximum values of the geometry object used for instancing -- outputs result in float4 vector local min_x = geometryobject.min.x local min_y = geometryobject.min.y local max_x = geometryobject.max.x local max_y = geometryobject.max.y local spacing_x = max_x - min_x local spacing_y = max_y - min_y local min_z = geometryobject.min.z local max_z = geometryobject.max.z local spacing_z = max_z - min_z local valueoutput = [spacing_x,spacing_y,spacing_z] return valueoutput ) fn creategeomfn geometryobject instancearray nrinstances= ( if Use_Inst == true then ( instancearray[nrinstances] = instance geometryobject redrawViews() ) else if Use_Copy == true then ( instancearray[nrinstances] = copy geometryobject redrawViews() ) ) fn positiongeomfn geometryobject instancearray objvalue instancedirection i boolean = ( if boolean == true then ( case instancedirection of ( 1: instancearray[i].pos.x = geometryobject.pos.x + (i*objvalue.x) 2: instancearray[i].pos.y = geometryobject.pos.y + (i*objvalue.y) 3: instancearray[i].pos.z = geometryobject.pos.z + (i*objvalue.z) ) case instancedirection of ( 1: instancearray[i].name = geometryobject.name + "_right" + i as string 2: instancearray[i].name = geometryobject.name + "_forward" + i as string 3: instancearray[i].name = geometryobject.name + "_up" + i as string ) redrawViews() ) if boolean == false then ( case instancedirection of ( 1: instancearray[i].pos.x = geometryobject.pos.x - (i*objvalue.x) 2: instancearray[i].pos.y = geometryobject.pos.y - (i*objvalue.y) 3: instancearray[i].pos.z = geometryobject.pos.z - (i*objvalue.z) ) case instancedirection of ( 1: instancearray[i].name = geometryobject.name - "_left" + i as string 2: instancearray[i].name = geometryobject.name - "_backward" + i as string 3: instancearray[i].name = geometryobject.name - "_down" + i as string ) redrawViews() ) ) fn replacegeom geometryobject instancearray boolean = ( if boolean == true then ( for i = 1 to instancearray.count do ( InstanceReplace instancearray[i] geometryobject redrawViews() ) ) else if boolean == false then ( -- test this, don't use copies for now ) ) on btnPickGeom picked obj do ( if obj != undefined and iskindof obj Editable_Poly == true then ( InstanceGeomObject = obj edtGeometry.text = obj.name objectvalue = determinespacing(InstanceGeomObject) spnForward.enabled = true spnBackward.enabled = true spnLeft.enabled = true spnRight.enabled = true spnUp.enabled = true spnDown.enabled = true lblDown.enabled = true lblUp.enabled = true lblLeft.enabled = true lblRight.enabled = true lblForward.enabled = true lblBackward.enabled = true btnCreateControllers.enabled = true btnResetValues.enabled = true btnCollapse.enabled = true chkMasterController.enabled = true chkChildControllers.enabled = true rdoUse.enabled = true spnspacingx.enabled = true spnspacingy.enabled = true spnspacingz.enabled = true lblspacingx.enabled = true lblspacingy.enabled = true lblspacingz.enabled = true grpspacing.enabled = true grpnrcopies.enabled = true try(replacegeom InstanceGeomObject geoObj_right true) catch() try(replacegeom InstanceGeomObject geoObj_left true) catch() try(replacegeom InstanceGeomObject geoObj_down true) catch() try(replacegeom InstanceGeomObject geoObj_up true) catch() try(replacegeom InstanceGeomObject geoObj_forward true) catch() try(replacegeom InstanceGeomObject geoObj_backward true) catch() ) else if obj == undefined or iskindof obj Editable_Poly == false then ( messagebox "please select editable poly object for custom geometry" ) ) on spnRight changed val do ( print Right_Inst if spnRight.value != Right_Inst then ( Right_Inst = spnRight.value if geoObj_right.count > spnRight.value then ( if geoObj_right.count != 0 then ( if geoObj_right[spnRight.value+1] != 0 then ( if geoObj_right[spnRight.value+1] != undefined then ( delete geoObj_right[spnRight.value+1] deleteItem geoObj_right (spnRight.value+1) ) ) ) ) else ( try(creategeomfn InstanceGeomObject geoObj_right Right_Inst) catch() for counter = 1 to geoObj_right.count do ( try(positiongeomfn InstanceGeomObject geoObj_right objectvalue 1 counter true) catch() ) ) ) ) on spnLeft changed val do ( if spnLeft.value != Left_Inst then ( Left_Inst = spnLeft.value if geoObj_left.count > spnLeft.value then ( if geoObj_left.count != 0 then ( if geoObj_left[spnLeft.value+1] != 0 then ( if geoObj_left[spnLeft.value+1] != undefined then ( delete geoObj_left[spnLeft.value+1] deleteItem geoObj_left (spnLeft.value+1) ) ) ) ) else ( try(creategeomfn InstanceGeomObject geoObj_left Left_Inst) catch() for counter = 1 to geoObj_left.count do ( try(positiongeomfn InstanceGeomObject geoObj_left objectvalue 1 counter false) catch() ) ) ) ) on spnDown changed val do ( if spnDown.value != Down_Inst then ( Down_Inst = spnDown.value if geoObj_down.count > spnDown.value then ( if geoObj_down.count != 0 then ( if geoObj_down[spnDown.value+1] != 0 then ( if geoObj_down[spnDown.value+1] != undefined then ( delete geoObj_down[spnDown.value+1] deleteItem geoObj_down (spnDown.value+1) ) ) ) ) else ( try(creategeomfn InstanceGeomObject geoObj_down Down_Inst) catch() for counter = 1 to geoObj_down.count do ( try(positiongeomfn InstanceGeomObject geoObj_down objectvalue 3 counter false) catch() ) ) ) ) on spnUp changed val do ( if spnUp.value != Up_Inst then ( Up_Inst = spnUp.value if geoObj_up.count > spnUp.value then ( if geoObj_up.count != 0 then ( if geoObj_up[spnUp.value+1] != 0 then ( if geoObj_up[spnUp.value+1] != undefined then ( delete geoObj_up[spnUp.value+1] deleteItem geoObj_up (spnUp.value+1) ) ) ) ) else ( try(creategeomfn InstanceGeomObject geoObj_up Up_Inst) catch() for counter = 1 to geoObj_up.count do ( try(positiongeomfn InstanceGeomObject geoObj_up objectvalue 3 counter true) catch() ) ) ) ) on spnForward changed val do ( if spnForward.value != Forward_Inst then ( Forward_Inst = spnForward.value if geoObj_forward.count > spnForward.value then ( if geoObj_forward.count != 0 then ( if geoObj_forward[spnForward.value+1] != 0 then ( if geoObj_forward[spnForward.value+1] != undefined then ( delete geoObj_forward[spnForward.value+1] deleteItem geoObj_forward (spnForward.value+1) ) ) ) ) else ( try(creategeomfn InstanceGeomObject geoObj_forward Forward_Inst) catch() for counter = 1 to geoObj_forward.count do ( try(positiongeomfn InstanceGeomObject geoObj_forward objectvalue 2 counter true) catch() ) ) ) ) on spnBackward changed val do ( if spnDown.value != Backward_Inst then ( Backward_Inst = spnBackward.value if geoObj_backward.count > spnBackward.value then ( if geoObj_backward.count != 0 then ( if geoObj_backward[spnBackward.value+1] != 0 then ( if geoObj_backward[spnBackward.value+1] != undefined then ( delete geoObj_backward[spnBackward.value+1] deleteItem geoObj_backward (spnBackward.value+1) ) ) ) ) else ( try(creategeomfn InstanceGeomObject geoObj_backward Backward_Inst) catch() for counter = 1 to geoObj_backward.count do ( try(positiongeomfn InstanceGeomObject geoObj_backward objectvalue 2 counter false) catch() ) ) ) ) on btnCollapse pressed do ( -- collapse all arrays into each other, and attach them into one editable poly -- warning: ask the user for persmission! if querybox "this collapses all copies/instances of the geometry to one single editable poly. proceed?" beep:true then ( -- collapse all the arrays, and set them back to 0 -- collapse arrays code is good for i = 1 to geoObj_right.count do ( if geoObj_right[i] != undefined then(append MasterArray geoObj_right[i]) if geoObj_right[i] != undefined then(deleteItem geoObj_right i) ) free geoObj_right for i = 1 to geoObj_left.count do ( if geoObj_left[i] != undefined then(append MasterArray geoObj_left[i]) if geoObj_right[i] != undefined then(deleteItem geoObj_left i) ) free geoObj_left for i = 1 to geoObj_up.count do ( if geoObj_up[i] != undefined then(append MasterArray geoObj_up[i]) if geoObj_right[i] != undefined then(deleteItem geoObj_up i) ) free geoObj_up for i = 1 to geoObj_down.count do ( if geoObj_down[i] != undefined then(append MasterArray geoObj_down[i]) if geoObj_right[i] != undefined then(deleteItem geoObj_down i) ) free geoObj_down for i = 1 to geoObj_forward.count do ( if geoObj_forward[i] != undefined then(append MasterArray geoObj_forward[i]) if geoObj_right[i] != undefined then(deleteItem geoObj_forward i) ) free geoObj_forward for i = 1 to geoObj_backward.count do ( if geoObj_backward[i] != undefined then(append MasterArray geoObj_backward[i]) if geoObj_right[i] != undefined then(deleteItem geoObj_backward i) ) free geoObj_backward for i = 1 to MasterArray.count do ( convertTo MasterArray[i] editable_poly if MasterArray[i] != undefined and MasterArray[i] != 0 then ( --Polyop.attach MasterArray[i] MasterArray[i-1] polyop.attach MasterArray[i] InstanceGeomObject ) ) --free MasterArray -- reset everything spnForward.enabled = false spnBackward.enabled = false spnLeft.enabled = false spnRight.enabled = false spnUp.enabled = false spnDown.enabled = false lblDown.enabled = false lblUp.enabled = false lblLeft.enabled = false lblRight.enabled = false lblForward.enabled = false lblBackward.enabled = false btnCreateControllers.enabled = false btnResetValues.enabled = false btnCollapse.enabled = false btnPickGeom.enabled = true edtGeometry.enabled = true chkMasterController.enabled = false chkChildControllers.enabled = false rdoUse.enabled = false edtGeometry.text = "" ) ) on rdoUse changed state do ( if rdoUse.state == 1 then ( Use_Inst = true Use_Copy = false ) if rdoUse.state == 2 then ( Use_Copy = true Use_Inst = false ) ) on chkMasterController changed state do ( if chkMasterController.checked == true do ( UseMaster = true ) ) on chkChildControllers changed state do ( if chkChildControllers.checked == true do ( UseChildren = true ) ) on btnCreateControllers pressed do ( -- create master and/or child controllers if UseMaster == true then ( global MasterController = circle radius:10 if objectvalue.y > objectvalue.x then (MasterController.radius = objectvalue.y) else (MasterController.radius = objectvalue.x) MasterController.name = "ctrl_Master_" + InstanceGeomObject.name MasterController.pos = InstanceGeomObject.pos InstanceGeomObject.parent = MasterController ) if UseChildren == true then ( for i = 1 to geoObj_left.count do ( if geoObj_left[i] != undefined do ( ChildController = circle radius:10 if objectvalue.y > objectvalue.x then (ChildController.radius = objectvalue.y) else (ChildController.radius = objectvalue.x) ChildController.name = "ctrl_Child_" + InstanceGeomObject.name + "_left_" + i as string ChildController.pos = geoObj_left[i].pos geoObj_left[i].parent = ChildController if UseMaster == true do ( ChildController.parent = MasterController ) ) ) for i = 1 to geoObj_right.count do ( if geoObj_right[i] != undefined do ( ChildController = circle radius:10 if objectvalue.y > objectvalue.x then (ChildController.radius = objectvalue.y) else (ChildController.radius = objectvalue.x) ChildController.name = "ctrl_Child_" + InstanceGeomObject.name + "_right_" + i as string ChildController.pos = geoObj_right[i].pos geoObj_right[i].parent = ChildController if UseMaster == true do ( ChildController.parent = MasterController ) ) ) for i = 1 to geoObj_up.count do ( if geoObj_up[i] != undefined do ( ChildController = circle radius:10 if objectvalue.y > objectvalue.x then (ChildController.radius = objectvalue.y) else (ChildController.radius = objectvalue.x) ChildController.name = "ctrl_Child_" + InstanceGeomObject.name + "_up_" + i as string ChildController.pos = geoObj_up[i].pos geoObj_up[i].parent = ChildController if UseMaster == true do ( ChildController.parent = MasterController ) ) ) for i = 1 to geoObj_down.count do ( if geoObj_down[i] != undefined do ( ChildController = circle radius:10 if objectvalue.y > objectvalue.x then (ChildController.radius = objectvalue.y) else (ChildController.radius = objectvalue.x) ChildController.name = "ctrl_Child_" + InstanceGeomObject.name + "_down_" + i as string ChildController.pos = geoObj_down[i].pos geoObj_down[i].parent = ChildController if UseMaster == true do ( ChildController.parent = MasterController ) ) ) for i = 1 to geoObj_forward.count do ( if geoObj_forward[i] != undefined do ( ChildController = circle radius:10 if objectvalue.y > objectvalue.x then (ChildController.radius = objectvalue.y) else (ChildController.radius = objectvalue.x) ChildController.name = "ctrl_Child_" + InstanceGeomObject.name + "_forward_" + i as string ChildController.pos = geoObj_forward[i].pos geoObj_forward[i].parent = ChildController if UseMaster == true do ( ChildController.parent = MasterController ) ) ) for i = 1 to geoObj_backward.count do ( if geoObj_backward[i] != undefined do ( ChildController = circle radius:10 if objectvalue.y > objectvalue.x then (ChildController.radius = objectvalue.y) else (ChildController.radius = objectvalue.x) ChildController.name = "ctrl_Child_" + InstanceGeomObject.name + "_backward_" + i as string ChildController.pos = geoObj_backward[i].pos geoObj_backward[i].parent = ChildController if UseMaster == true do ( ChildController.parent = MasterController ) ) ) ) else ( for i = 1 to geoObj_right.count do ( if geoObj_right[i] != undefined do ( geoObj_right[i].parent = MasterController ) ) for i = 1 to geoObj_left.count do ( if geoObj_left[i] != undefined do ( geoObj_left[i].parent = MasterController ) ) for i = 1 to geoObj_up.count do ( if geoObj_up[i] != undefined do ( geoObj_up[i].parent = MasterController ) ) for i = 1 to geoObj_down.count do ( if geoObj_down[i] != undefined do ( geoObj_down[i].parent = MasterController ) ) for i = 1 to geoObj_forward.count do ( if geoObj_forward[i] != undefined do ( geoObj_forward[i].parent = MasterController ) ) for i = 1 to geoObj_backward.count do ( if geoObj_backward[i] != undefined do ( geoObj_backward[i].parent = MasterController ) ) ) ) on btnResetValues pressed do ( -- rest spinner values and delete all arrays spnBackward.value = 1 Backward_Inst = 1 for i = 1 to geoObj_backward.count do ( if geoObj_backward[i] != undefined do ( delete geoObj_backward[i] deleteItem geoObj_backward i ) ) spnForward.value = 1 Forward_Inst = 1 for i = 1 to geoObj_forward.count do ( if geoObj_forward[i] != undefined do ( delete geoObj_forward[i] deleteItem geoObj_forward i ) ) spnRight.value = 1 Right_Inst = 1 for i = 1 to geoObj_right.count do ( if geoObj_right[i] != undefined do ( delete geoObj_right[i] deleteItem geoObj_right i ) ) spnLeft.value = 1 Left_Inst = 1 for i = 1 to geoObj_left.count do ( if geoObj_left[i] != undefined do ( delete geoObj_left[i] deleteItem geoObj_left i ) ) spnUp.value = 1 Up_Inst = 1 for i = 1 to geoObj_up.count do ( if geoObj_up[i] != undefined do ( delete geoObj_up[i] deleteItem geoObj_up i ) ) spnDown.value = 1 Down_Inst = 1 for i = 1 to geoObj_down.count do ( if geoObj_down[i] != undefined do ( delete geoObj_down[i] deleteItem geoObj_down i ) ) -- end btnresetValues ) -- begin spacing -- end rollout ) -- end all createDialog OldGreenBGScript )