macroScript Crack category:"ClaverTech" toolTip:"Crack-Crack up an Object" ( global splitterMesh=undefined global BreakerObj=undefined global BackUpObj=undefined global ChunkObjs=#() global OrginalName=undefined global CrackerMaterial=standard diffuse:(color 255 0 0 0) showInViewport:true name:"CrackMat" global RedCrackMaterial=standard diffuse:(color 255 0 0 0) showInViewport:true name:"CrackMat" global BaseMaterial=standard diffuse:(color 0 0 255 0) showInViewport:true name:"SurfaceMat" global MaxCracks=20 global RotValues=#() global ObjectCenterPoint=undefined global CrackStepNum --theNewFloater = newRolloutFloater "ClaverTech - Crack" 310 510 fn g_Filter o = ( superclassof o == Geometryclass) rollout SurfaceRollout "Crack" ( groupBox grp1 "Objects" pos:[7,15] width:284 height:78 pickbutton btnPickerObject "Pick Object" pos:[21,64] width:86 height:19 filter:g_Filter button btnBreakerObject "$" pos:[125,64] width:26 height:19 label lbl1 "Breaker Object" pos:[29,42] width:79 height:14 button btnBackupObject "- - -" pos:[170,65] width:96 height:19 label lbl2 "Backup Object" pos:[177,43] width:79 height:14 groupBox grp2 "Cracker Options" pos:[7,105] width:285 height:225 button btnNewRot "New Rotations" pos:[29,287] width:100 height:32 button btnGenCracks "Generate Cracks" pos:[169,287] width:100 height:32 spinner spnCrackNum "Number of Cracks" pos:[82,131] width:60 height:16 range:[1,MaxCracks,1] type:#integer scale:1 spinner spnThicknessNum "Thickness" pos:[202,131] width:66 height:16 range:[0.001,100,0.001] scale:0.1 groupBox grp3 "Noise Options" pos:[20,164] width:262 height:116 spinner spnNoiseSeed "Noise Seed" pos:[32,246] width:60 height:16 range:[0,1000,0] type:#integer scale:1 align:#left spinner spnNoiseSize "Noise Size" pos:[162,188] width:80 height:16 range:[0.1,1000,10] scale:0.1 align:#left spinner spnNoiseStrength "Noise Strength" pos:[146,217] width:80 height:16 range:[0,1000,10] scale:0.1 align:#left spinner spnSegments "Segments" pos:[176,246] width:60 height:16 range:[1,100,10] type:#integer scale:1 align:#left checkbox chk1 "Noise" pos:[35,188] width:90 height:18 groupBox grp4 "Crack and Break" pos:[7,340] width:286 height:73 button btnClose "Close" pos:[71,440] width:150 height:32 button btnCrackIt "Crack IT!" pos:[72,363] width:150 height:32 on SurfaceRollout open do ( if(CrackStepNum==undefined)then(CrackStepNum=0) ) fn MaxWidthFor obj = ( local MaximumVal=0 local bb= nodeLocalBoundingBox BreakerObj local d=bb[1]-bb[2] MaximumVal = sqrt (d.x*d.x+d.y*d.y+d.z*d.z) ) function NewRotations = ( local i = 1 for i=1 to MaxCracks do ( RotValues[i]= (eulerAngles (random 0 720) (random 0 720) (random 0 720)) ) ) function GeneratePlanes = ( if($splitterMesh != undefined) then ( delete $splitterMesh ) local planeArray=#() splitterMesh=Editable_mesh() convertTo splitterMesh Editable_Poly splitterMesh.name="splitterMesh" move splitterMesh ObjectCenterPoint splitterMesh.visibility=bezier_float() splitterMesh.visibility.controller.value=0.5 splitterMesh.backFaceCull=true splitterMesh.wirecolor = color 255 0 0 splitterMesh.material = RedCrackMaterial local posOffset=50 local Thickness = spnThicknessNum.value as Float local CrackNum=spnCrackNum.value as Integer local SizeOf = (MaxWidthFor BreakerObj) local NoiseStrength =spnNoiseStrength.value local SegementNum=spnSegments.value as Integer local NoiseSize=spnNoiseSize.value local temp=[0,0,0] if(RotValues.count==0)then ( NewRotations() ) for j=1 to CrackNum do( b = box length:0.1 width:0.1 height:0.1 centerPivot b p=plane() move p ObjectCenterPoint p.length=SizeOf p.width=SizeOf p.lengthsegs=SegementNum p.widthsegs=SegementNum p.material=CrackerMaterial p.mapCoords =true addModifier p (Noisemodifier()) n=p.modifiers[#Noise] n.seed=spnNoiseSeed.value + j n.scale = NoiseSize n.fractal = on n.strength = [0,0,NoiseStrength] addModifier p (Shell()) n=p.modifiers[#Shell] n.outerAmount=Thickness/2 n.innerAmount=Thickness/2 --temp=p.pos --p.rotation=RotValues[j] --b.rotation=RotValues[j] --p.pos=temp move b ObjectCenterPoint rotate b RotValues[j] --meshOp.attach splitterMesh p sourceNode:p convertTo p Editable_poly splitterMesh.attach p b delete b ) update splitterMesh ) on spnThicknessNum changed argg do ( if(BreakerObj!=undefined) then(GeneratePlanes())else(messagebox "Select a Breaker Object First") ) on spnCrackNum changed argg do ( if(BreakerObj!=undefined) then(GeneratePlanes())else(messagebox "Select a Breaker Object First") ) on spnNoiseSeed changed argg do ( if(BreakerObj!=undefined) then(GeneratePlanes())else(messagebox "Select a Breaker Object First") ) on spnNoiseSize changed argg do ( if(BreakerObj!=undefined) then(GeneratePlanes())else(messagebox "Select a Breaker Object First") ) on spnSegments changed argg do ( if(BreakerObj!=undefined) then(GeneratePlanes())else(messagebox "Select a Breaker Object First") ) on spnNoiseStrength changed argg do ( if(BreakerObj!=undefined) then(GeneratePlanes())else(messagebox "Select a Breaker Object First") ) on btnClose pressed do ( DestroyDialog SurfaceRollout ) on SurfaceRollout close do ( if($splitterMesh!=undefined) then ( delete $splitterMesh ) if($BackUpObj!=undefined) then ( delete $BackUpObj ) ) on btnBackupObject pressed do -- back up processing ( if(queryBox "Revert to Original?" beep:false) then ( if(ChunkObjs.count>0) then ( for i=1 to ChunkObjs.count do ( delete ChunkObjs[i] ) ChunkObjs=#() ) if(BreakerObj!=undefined) then ( delete BreakerObj ) if(splitterMesh!=undefined) then ( delete splitterMesh splitterMesh=undefined ) BreakerObj=copy BackUpObj BreakerObj.name=OrginalName btnPickerObject.caption="Using:"+OrginalName ) ) on btnPickerObject picked obj do ( -- sel=getCurrentSelection() if(obj!=undefined)then ( if(splitterMesh!=undefined) then ( delete splitterMesh splitterMesh=undefined ) if(BackUpObj!=undefined) then ( delete BackUpObj ) if(ChunkObjs.count>0) then ( ChunkObjs=#() ) BreakerObj=obj cp=copy obj CenterPivot cp ObjectCenterPoint=cp.pos delete cp OrginalName=BreakerObj.name if(BreakerObj.material!=undefined) then ( if(classOf BreakerObj.material ==Multimaterial ) then ( BaseMaterial=BreakerObj.material.materialList[1] CrackerMaterial=BreakerObj.material.materialList[2] ) else ( BaseMaterial=BreakerObj.material ) ) else ( BreakerObj.material = BaseMaterial ) btnPickerObject.caption="Using:"+OrginalName btnBackupObject.text=OrginalName BackUpObj=copy BreakerObj BackUpObj.name="Crack_BackUp_"+(OrginalName as String)+"_Step"+(CrackStepNum as String) CrackStepNum+=1 hide BackUpObj ) else ( messagebox "Select One Piece of Geometry" ) ) on btnBreakerObject pressed do ---- my $ button ( col = getCurrentSelection() if(col.count>1) then ( messagebox "Select One Piece of Geometry" ) else ( if($!=undefined) then ( if(splitterMesh!=undefined) then ( delete splitterMesh splitterMesh=undefined ) if(BackUpObj!=undefined) then ( if(not isDeleted BackUpObj)then(delete BackUpObj) BackUpObj=undefined ) if(ChunkObjs.count>0) then ( ChunkObjs=#() ) BreakerObj=$ cp=copy $ CenterPivot cp ObjectCenterPoint=cp.pos delete cp OrginalName=BreakerObj.name if(BreakerObj.material!=undefined) then ( if(classOf BreakerObj.material ==Multimaterial ) then ( BaseMaterial=BreakerObj.material.materialList[1] CrackerMaterial=BreakerObj.material.materialList[2] ) else ( BaseMaterial=BreakerObj.material ) ) else ( BreakerObj.material = BaseMaterial ) --btnBreakerObject.text="Set to:" +OrginalName btnPickerObject.caption="Using:"+OrginalName btnBackupObject.text=OrginalName BackUpObj=copy BreakerObj BackUpObj.name="Crack_BackUp_"+(OrginalName as String)+"_Step"+(CrackStepNum as String) CrackStepNum+=1 hide BackUpObj ) else ( messagebox "Select a piece of Geometry" ) ) ) on btnNewRot pressed do ( if(BreakerObj!=undefined) then ( NewRotations() GeneratePlanes() ) else ( messagebox "Select a Breaker Object First" ) ) on btnGenCracks pressed do ( if(BreakerObj!=undefined) then ( GeneratePlanes() ) else ( messagebox "Select a Breaker Object First" ) ) on btnCrackIt pressed do ( if(BreakerObj!=undefined and splitterMesh!=undefined) then ( splitterMesh.material = CrackerMaterial ProBoolean.CreateBooleanObjects BreakerObj splitterMesh 2 1 1 splitterMesh=undefined ResetXForm BreakerObj ConvertToMesh BreakerObj if(BreakerObj!=undefined) then ( if(classOf BreakerObj)!=Editable_mesh or BreakerObj.numfaces <1 then ( messagebox "Crack it first" ) else ( local obj =copy BreakerObj local allFaces = #{1..obj.numFaces} local myFace=1 local myElementList=#() local mat=BreakerObj.material ChunkObjs=#() --find all elements do( local myEl= meshOP.getElementsUsingFace obj #{1} if not myEl.isEmpty then ( local newMesh = meshOp.detachFaces obj myEl delete:true asMesh:true update obj local emesh=Editable_mesh() emesh.transform=obj.transform emesh.mesh=newMesh update emesh centerPivot emesh emesh.name=(uniqueName ("frag__")) emesh.wirecolor = random(color 0 0 0) (color 255 255 255) emesh.material=mat convertTo emesh Editable_Poly append ChunkObjs emesh newMesh=undefined ) )while obj.numFaces >1 delete obj delete BreakerObj BreakerObj=undefined btnPickerObject.caption="Pick Object" ) ) ) else ( if(splitterMesh==undefined)then(messagebox "Generate a Cracker First")else(messagebox "Select a Breaker Object First") ) ) ) CreateDialog SurfaceRollout 310 500 )