try(destroydialog cylindre_camera)catch()
rollout cylindre_camera "Camera for cylindrical hologram"
(
	local hogelSize = 0.5
	--+10% height & width extra
	local outImageMargin = 1.1
	local holoCam = undefined
	local camTarget = undefined
	local holoFrame = undefined
	local cancelRender = true
	
	local iniFileName = "cylHologram.ini"
	local defaultIniPath = ""
	--local defaultPathIniPath = maxfilepath+iniFileName
	local tagSave = "autoSave"
	
	local arrayPaths = #()
	
	global nameBaseName = "cylHolo__"
	global nameCamera = nameBaseName+"camera"
	global nameCamTarget = nameBaseName+"cameraTarget"
	global nameCamArc = nameBaseName+"cameraArc"
	global nameCamFrame = nameBaseName+"frame"
	
	group "Scene management"
	(
		button bt_createHoloRec "Add printing camera"  across:2 align:#left
		button bt_deleteHoloRec "Delete printing camera"  across:2 align:#right
		button bt_refresh "Refresh" align:#left
		
	) 
	group "Hologram Center Coordinates"
	(
		spinner sp_x "x offset (mm):" range:[-999999,999999,0] type:#float
		spinner sp_y "y offset (mm):" range:[-999999,999999,0] type:#float
		spinner sp_z "z offset (mm):" range:[-999999,999999,0] type:#float
		
	)
	group "Hologram parameters"
	(
		spinner sp_mainScale "Scene scale (%):" range:[1,999999,100] type:#float
		spinner sp_sceneW "holoplate width (mm):" range:[1,999999,300] type:#float
		spinner sp_sceneH "holoplate height (mm):" range:[1,999999,400] type:#float
		spinner sp_dcam "camera distance (mm):" range:[1,999999,1000] type:#float
		spinner sp_fovCam "Fov Camera (°):" range:[1,180,60] type:#float enabled:false
		spinner sp_phiOffset "Rotation offset (°):" range:[0,360,270] type:#float scale:0.1 enabled:false
		spinner sp_phi "Horizontal Paralax (°):" range:[1,360,120] type:#float scale:0.1
		spinner sp_maxHeightMm "max view height (mm):" range:[-999999,999999,400] type:#float
		spinner sp_minHeightMm "min view height (mm):" range:[-999999,999999,-400] type:#float
		spinner sp_nTheta "number of vertical views" range:[1,1000,10] type:#integer
	)
	group "Ouput parameters"
	(
		label lsave "Images will be saved in subfolders under this directory :"
		button bt_savedial "Select output path & name" across:2 align:#left
		edittext txt_output readOnly:true
		spinner sp_outImW "output width (pixel):" range:[1,10000,536] type:#integer enabled:false
		spinner sp_outImH "output height (pixel):" range:[1,10000,712] type:#integer enabled:false
		spinner sp_nbImage "Horizontal rendered images" range:[1,2000,768] type:#integer
		spinner sp_scaleFactor "scale factor" range:[1,100,1] type:#integer enabled:false visible:false
	)
	group "Options"
	(
		checkBox cb_Anime "Enable animation" checked:false across:2 align:#left
		spinner sp_animeToRend "animation to render" range:[animationRange.start,animationRange.end,animationRange.start] type:#integer
		spinner sp_astart "From" range:[animationRange.start,animationRange.end,animationRange.start] type:#integer across:2 align:#left enabled:false
		spinner sp_aend "To" range:[animationRange.start,animationRange.end,animationRange.end] type:#integer enabled:false
		spinner sp_nbStepAnime "Nb steps animation" range:[1,768,768] type:#integer enabled:false
		edittext edNbMax  readOnly:true
		button bt_generate "Generate files" width:200 height:50 
		progressBar pg_gen across:2 width:200
		edittext txt_pg align:#right width:60 readOnly:true
	)
	group "Debug"
	(
		checkbox cb_showAll "Show all paths" checked:true
		spinner sp_camConstraint "Asign camera to path" range:[1,1,1] type:#integer
		slider sld_cameraRot "Camera Phi" ticks:0 range:[0,1,0]
	)
	mapped fn mapSetINIPath _elem _path=
	(
		_elem.iniPath = _path+iniFileName
		_elem.load()
	)
	mapped fn mapSetUpdateDelegate _elem _del = (_elem.updateView = _del)
	mapped fn saveParameter _elem = _elem.save()
		
	struct paramFloat( 
		tag = undefined,
		controller = undefined,
		onChange = undefined,
		updateView = undefined,
		iniPath = defaultIniPath,
		value = 0,
		scale = 1,
		fn setEnable state = if controller != undefined then controller.enabled = state,
		fn getValue = return value,
		fn save = 
		(
			if iniPath != "" then
			(
				if (getFiles iniPath).count == 0 Then close (createFile iniPath)
				setINISetting iniPath tagSave tag (controller.value as string)
				if scale != 1 then
					setINISetting iniPath tagSave (tag+"_scaleFactor") (scale as string)
			)
		),
		fn setValue  val= 
		(
			if controller != undefined Then
			(
				if val<controller.range[1] Then val = controller.range[1]
				if val>controller.range[2] Then val = controller.range[2]
				value = val
				controller.value = val/scale
				save()
				if(onChange != undefined) then onChange()
				if(updateView != undefined) then updateView()
			)
		),
		fn scaleValue factor =
		(
			scale = factor
			setValue (controller.value*scale)
		),
		fn load = 
		(
			ret = getINISetting iniPath tagSave tag
			if ret!="" then setValue (ret as float) else setValue(controller.value)
				
			ret = getINISetting iniPath tagSave  (tag+"_scaleFactor")
			if ret!="" then scaleValue (ret as float) else scaleValue 1
		),
		fn setControl ctrl = 
		(
			controller = ctrl
			load()
		),
		fn setRange range =
		(
			r = controller.range
			r[1] = range[1]
			r[2] = range[2]
			value = (amax (amin range[2] value) (range[1]))
			controller.range = r
		)
	)
	
	struct paramBool(
		tag = undefined,
		controller = undefined,
		onChange = undefined,
		updateView = undefined,
		iniPath = defaultIniPath,
		fn setEnable state = if controller != undefined then controller.enabled = state,
		fn getValue = return controller.checked,
		fn save = 
		(
			if iniPath != "" then
			(
				if (getFiles iniPath).count == 0 Then close (createFile iniPath)
				setINISetting iniPath tagSave tag (getValue() as string)
			)
		),
		fn setValue  val = 
		(
			controller.checked = val 
			save()
			if(onChange != undefined) then onChange()
			if(updateView != undefined) then updateView()
		),
		fn load = 
		(
			ret = getINISetting iniPath tagSave tag
			if ret!="" then 
			(
				if val == "true" then setValue true
				else setValue false
			)				
			else setValue(getValue())
		),
		fn setControl ctrl = 
		(
			controller = ctrl
			load()
		),
		fn setRange range = ()
	)
	
	struct paramString(
		tag = undefined,
		controller = undefined,
		onChange = undefined,
		updateView = undefined,
		iniPath = defaultIniPath,
		fn setEnable state = if controller != undefined then controller.enabled = state,
		fn getValue = return controller.text,
		fn save = 
		(
			if iniPath != "" then
			(
				if (getFiles iniPath).count == 0 Then close (createFile iniPath)
				setINISetting iniPath tagSave tag (getValue() as string)
			)
		),
		fn setValue  val = 
		(
			controller.text = val
			save()
			if(onChange != undefined) then onChange()
			if(updateView != undefined) then updateView()
		),
		fn load = 
		(
			ret = getINISetting iniPath tagSave tag
			if ret!="" then setValue ret else setValue(getValue())
		),
		fn setControl ctrl = 
		(
			controller = ctrl
			load()
		),
		fn setRange range = ()
	)
	
	local h_mainScale = paramFloat 					("mainScalePercent")
	
	local h_framePosX = paramFloat					("frameX")		
	local h_framePosY = paramFloat 					("frameY")	
	local h_framePosZ = paramFloat 					("frameZ")				
	
	local h_frameWidthMm = paramFloat 	 		("frameWidthMm")
	local h_frameHeightMm = paramFloat 			("frameHeightMm")	
	
	local h_cameraDistMm = paramFloat 			("cameraDistMm")
	local h_cameraFOVDeg = paramFloat 			("cameraFOVDeg") 
	local h_cameraRotOffsetDeg = paramFloat 	("cameraRotOffsetDeg")
	local h_cameraRotAngleDeg = paramFloat 		("cameraRotAngleDeg")
	local h_cameraMaxHeightMm = paramFloat	("cameraMaxHeightMm")
	local h_cameraMinHeightMm = paramFloat  	("cameraMinHeightMm")
	local h_cameraVResolution = paramFloat 		("cameraVResolution")
	local h_cameraHResolution = paramFloat 		("cameraHResolution")
	
	local h_outimgName = paramString 				("outimgName")
	local h_outimgWidth = paramFloat 				("outimgWidth")
	local h_outimgHeight = paramFloat 				("outimgHeight")
	local h_outimgScaleFactor = paramFloat 		("outimgScaleFactor")
	
	local h_renderEnableAnimation = paramBool 	("renderEnableAnimation")
	local h_renderedAnimation = paramFloat 		("renderedAnimation")
	local h_renderAnimStart = paramFloat 			("renderAnimStart")
	local h_renderAnimEnd = paramFloat 			("renderAnimEnd")
	local h_renderAnimSteps = paramFloat 	 		("renderAnimSteps")
	
	local h_debugShowPath = paramBool			("debugShowPath")
	local h_debugCamPath = paramFloat 	 		("debugCamPath")
	local h_debugCamPhi = paramFloat				("debugCamPhi")
	
	local aControlsSave = #(
			h_mainScale,
			h_framePosX,	h_framePosY,	h_framePosZ,
			h_frameWidthMm,
			h_frameHeightMm,
			h_cameraDistMm,
			h_cameraFOVDeg,
			h_cameraRotOffsetDeg,
			h_cameraRotAngleDeg,
			h_cameraMaxHeightMm,
			h_cameraMinHeightMm,
			h_cameraVResolution,
			h_cameraHResolution,
			h_outimgName,
			h_outimgWidth,
			h_outimgHeight,
			h_outimgScaleFactor, 
			h_renderEnableAnimation, 
			h_renderedAnimation,
			h_renderAnimStart,
			h_renderAnimEnd,
			h_renderAnimSteps 
	)
	local aControlsUIUpdate = #(
			h_framePosX,	h_framePosY,	h_framePosZ,
			h_frameWidthMm,
			h_frameHeightMm,
			h_cameraDistMm,
			h_cameraFOVDeg,
			h_cameraRotOffsetDeg,
			h_cameraRotAngleDeg,
			h_cameraMaxHeightMm,
			h_cameraMinHeightMm,
			h_cameraVResolution,
			h_debugCamPath,
			h_debugShowPath,
			h_debugCamPhi
	)
	
	fn updateScale = 
	(
		scalePercent = 100.0/h_mainScale.getValue()
		h_frameHeightMm.scaleValue(scalePercent)
		h_frameWidthMm.scaleValue(scalePercent)
		h_cameraDistMm.scaleValue(scalePercent)
		h_cameraMaxHeightMm.scaleValue(scalePercent)
		h_cameraMinHeightMm.scaleValue(scalePercent)
		noscale = (scalePercent == 1)
		
		h_frameHeightMm.setEnable noscale
		h_frameWidthMm.setEnable noscale
		h_cameraDistMm.setEnable noscale
		h_cameraMaxHeightMm.setEnable noscale
		h_cameraMinHeightMm.setEnable noscale
	)
	--i starts at 1
	fn getHeightPathNb i =
	(
		ret = h_framePosZ.getValue()
		if h_cameraVResolution.getValue() > 1 Then
		(
			verticalStep = (h_cameraMaxHeightMm.getValue() - h_cameraMinHeightMm.getValue()) / (h_cameraVResolution.getValue()-1)
			ret +=  h_cameraMinHeightMm.getValue() + (h_cameraVResolution.getValue()-i) * verticalStep
		)
		return ret
	)
	fn updateFrame =
	(
		h_outimgWidth.setValue(floor(0.5+ outImageMargin*h_frameWidthMm.controller.value/hogelSize))
		h_outimgHeight.setValue(floor(0.5+  outImageMargin*h_frameHeightMm.controller.value/hogelSize))
		renderWidth =  h_outimgWidth.getValue()
		renderHeight = h_outimgHeight.getValue()
		if holoFrame != undefined then
		(
			holoFrame.pos = [h_framePosX.getValue(),h_framePosY.getValue(),h_framePosZ.getValue()]
			holoFrame.Width = h_frameWidthMm.getValue()
			holoFrame.Length= h_frameHeightMm.getValue()
			holoFrame.rotation = quat 90 [1,0,0] + (quat (90+0.5*h_cameraRotAngleDeg.getValue()+h_cameraRotOffsetDeg.getValue()) [0,1,0])
		)
	)
	fn updatePaths =
	(
 		if not h_debugShowPath.getValue() Then
		(
			if arrayPaths.count >0 then
			(
				for i = 1 to arrayPaths.count do
					delete arrayPaths[i]
				arrayPaths.count = 0
			)
		)
		else
		(
			for i = h_cameraVResolution.getValue()+1 to arrayPaths.count do
				delete arrayPaths[i]
			
			arrayPaths.count = h_cameraVResolution.getValue()
			for i = 1 to arrayPaths.count do
			(
				c_rad = h_cameraDistMm.getValue()
				c_name = nameCamArc + (i as string)
				c_to = h_cameraRotAngleDeg.getValue()
				c_pos = [h_framePosX.getValue(),h_framePosY.getValue(),getHeightPathNb i]
				if arrayPaths[i]==undefined Then
					arrayPaths[i] = arc name:c_name
				arrayPaths[i].radius =c_rad 
				arrayPaths[i].name = c_name 
				arrayPaths[i].pos = c_pos
				arrayPaths[i].from = 0
				arrayPaths[i].to = c_to
				arrayPaths[i].rotation= eulerAngles 0 0 (-h_cameraRotOffsetDeg.getValue()) as quat
			)
		)
	)
	fn updateResolution = 
	(
		h_debugCamPath.setRange [1,h_cameraVResolution.getValue()]
		h_renderAnimSteps.setRange [1,h_cameraHResolution.getValue()]
		edNbMax.text = "Total images =" + (h_cameraVResolution.getValue()*h_cameraHResolution.getValue()) as string
		updatePaths ()
	)
	fn updateCamFov =
	(
		fov = 2*atan(outImageMargin* h_frameWidthMm.getValue()/(2*h_cameraDistMm.getValue())) as float
		h_cameraFOVDeg.setValue(fov)
		if holoCam != undefined Then holoCam.fov = fov
		updateFrame()
	)
	fn updateCamAngle =
	(
		h_cameraRotOffsetDeg.setValue(180 + 0.5*(180-h_cameraRotAngleDeg.getValue()))
		h_debugCamPhi.setRange [0,h_cameraRotAngleDeg.getValue()]
		updatePaths ()
		updateFrame()
	)
	
	
	
	
	fn updateView =
	(
		if camTarget !=undefined Then
			camTarget.pos = [h_framePosX.getValue(),h_framePosY.getValue(),h_framePosZ.getValue()]
		if holoCam != undefined Then
		(
			step = h_cameraRotAngleDeg.getValue()/(h_cameraHResolution.getValue()-1)
			phi = h_cameraRotOffsetDeg.getValue()+ floor(0.5+h_debugCamPhi.getValue()/step)*step
			cx = h_framePosX.getValue() + h_cameraDistMm.getValue()*cos(phi)
			cy = h_framePosY.getValue() + h_cameraDistMm.getValue()*sin(phi)
			cz = getHeightPathNb (h_debugCamPath.getValue())
			holoCam.pos = [cx,cy,cz]
		)
	)
	fn initUI = 
	(
		h_mainScale.setControl sp_mainScale
		h_framePosX.setControl sp_x
		h_framePosY.setControl sp_y
		h_framePosZ.setControl sp_z
		h_frameWidthMm.setControl sp_sceneW
		h_frameHeightMm.setControl sp_sceneH
		
		h_cameraDistMm.setControl sp_dcam
		h_cameraFOVDeg.setControl sp_fovCam
		h_cameraRotOffsetDeg.setControl sp_phiOffset
		h_cameraRotAngleDeg.setControl sp_phi
		h_cameraMaxHeightMm.setControl sp_maxHeightMm
		h_cameraMinHeightMm.setControl sp_minHeightMm
		h_cameraVResolution.setControl sp_nTheta
		h_cameraHResolution.setControl sp_nbImage
		
		h_outimgName.setControl txt_output
		h_outimgWidth.setControl sp_outImW
		h_outimgHeight.setControl sp_outImH
		h_outimgScaleFactor.setControl sp_scaleFactor
		
		h_renderEnableAnimation.setControl cb_Anime	
		h_renderedAnimation.setControl sp_animeToRend
		h_renderAnimStart.setControl sp_astart
		h_renderAnimEnd.setControl sp_aend
		h_renderAnimSteps.setControl sp_nbStepAnime
		
		h_debugShowPath.setControl cb_showAll
		h_debugCamPath.setControl sp_camConstraint
		h_debugCamPhi.setControl sld_cameraRot
		
		h_mainScale.onChange = updateScale
		h_cameraMaxHeightMm.onChange = updateResolution
		h_cameraMinHeightMm.onChange = updateResolution
		h_cameraVResolution.onChange = updateResolution
		h_cameraHResolution.onChange = updateResolution	
		h_framePosX.onChange = updateFrame
		h_framePosY.onChange = updateFrame
		h_framePosZ.onChange = updateFrame
		h_frameHeightMm.onChange = updateFrame
		h_frameWidthMm.onChange = updateCamFov
		h_cameraDistMm.onChange = updateCamFov
		h_cameraRotAngleDeg.onChange = updateCamAngle
		--h_cameraRotOffsetDeg.onChange = updateCamAngle
		h_debugShowPath.onChange = updatePaths
		
		mapSetUpdateDelegate aControlsUIUpdate updateView
		
		updateCamAngle()
		updateResolution()
		updateCamFov()
	)
	

	on sp_mainScale changed value do h_mainScale.setValue(value)
	on sp_x changed value do h_framePosX.setValue(value)
	on sp_y changed value do h_framePosY.setValue(value)
	on sp_z changed value do h_framePosZ.setValue(value)
	on sp_sceneW  changed value do h_frameWidthMm.setValue(value)
	on sp_sceneH  changed value do h_frameHeightMm.setValue(value)
	on sp_dcam  changed value do h_cameraDistMm.setValue(value)
	on sp_phiOffset  changed value do h_cameraRotOffsetDeg.setValue(value)
	on sp_phi  changed value do h_cameraRotAngleDeg.setValue(value)
	on sp_maxHeightMm changed value do h_cameraMaxHeightMm.setValue(value)
	on sp_minHeightMm changed value do h_cameraMinHeightMm.setValue(value)
	on sp_nTheta changed value do h_cameraVResolution.setValue(value)
	on sp_outImW changed value do h_outimgWidth.setValue(value)
	on sp_outImH changed value do h_outimgHeight.setValue(value)
	on sp_nbImage changed value do h_cameraHResolution.setValue(value)
	on sp_scaleFactor changed value do h_outimgScaleFactor.setValue(value)
	on sp_animeToRend changed value do h_renderedAnimation.setValue(value)
	on sp_astart changed value do h_renderAnimStart.setValue(value)
	on sp_aend changed value do h_renderAnimEnd.setValue(value)
	on sp_nbStepAnime changed value do h_renderAnimSteps.setValue(value)
	on sp_camConstraint changed value do h_debugCamPath.setValue(value)
	on sld_cameraRot changed value do h_debugCamPhi.setValue(value)
	on cb_showAll changed state do h_debugShowPath.setValue(state)
	on cb_Anime changed state do 
	( 
		
		sp_animeToRend.enabled = not state
		sp_astart.enabled = state
		sp_aend.enabled = state
		sp_nbStepAnime.enabled = state
	)
	on bt_refresh pressed do
	(
		updateView()
	)
	on  bt_savedial pressed do
	(
		f = getSaveFileName caption:"Chose output name" types:"image files (*.bmp)|*.bmp"
		if f != undefined Then
		(
			h_outimgName.setValue(f)
			outpath = getFilenamePath f
			mapSetINIPath aControlsSave outpath
		)
	)
	
	on bt_deleteHoloRec pressed do
	(
		delete (execute ("$'"+nameBaseName+"*'"))
		holoCam = undefined
		holoFrame = undefined
		arrayPaths.count = 0
	)
	
	fn createObject =
	(
		if holoCam != undefined Then
			return 0
		
		holoPos = [h_framePosX.getValue(),h_framePosY.getValue(),h_framePosZ.getValue()]
		cam = execute ("$"+nameCamera)
		if cam ==undefined Then
		(
			camTarget = Targetobject pos:holoPos
			camTarget.name = nameCamTarget
		
			holoCam = TargetCamera nearclip:1 farclip:1000 nearrange:0 farrange:1000  isSelected:off target:camTarget
			holoCam.name = nameCamera
		)
		else
		(
			holoCam = cam
			camTarget = cam.target
			h_framePosX.setValue(cam.target.pos[1])
			h_framePosY.setValue(cam.target.pos[2])
			h_framePosZ.setValue(cam.target.pos[3])
			holoPos = cam.target.pos
		)
		if holoFrame == undefined Then
		(
			holoFrame = Rectangle pos:holoPos
			holoFrame.name = nameCamFrame
		)
		updateCamFov()
		updateView()
		updatePaths ()
		deleteKeys holoCam #allKeys
	)
	on bt_createHoloRec pressed do createObject()	
	
	--generation
	fn generateSequence =
	(
		imageIdx = 0
		if txt_output.text == "" and not cancelRender Then
		(
			MessageBox "Please selected ouptut name"
			cancelRender = true
			bt_generate.text = "Generate Files"
			return 0
		)
		if holoCam == undefined and not cancelRender Then
		(
			messagebox "Add 0° components first"
			cancelRender = true
			bt_generate.text = "Generate Files"
			return 0
		)
		updateView()
		outpath = getFilenamePath txt_output.text
		outname = getFilenameFile txt_output.text
		outext = getFilenameType txt_output.text
		
		outW = (h_outimgWidth.getValue()/h_outimgScaleFactor.getValue())as float
		outH = (h_outimgHeight.getValue()/h_outimgScaleFactor.getValue())as float
		rendShowVFB = false
		
		tagSaveTmp = tagSave
		tagSave = outname
		saveParameter aControlsSave
		tagSave = tagSaveTmp
			
		rotOffset = h_cameraRotOffsetDeg.getValue() 
		rotStep = h_cameraRotAngleDeg.getValue() / (h_cameraHResolution.getValue()-1)
		verticalRes = h_cameraVResolution.getValue()/h_outimgScaleFactor.getValue()
		horizontalRes = h_cameraHResolution.getValue()/h_outimgScaleFactor.getValue()
		
		animeStep = (h_renderAnimEnd.getValue()-h_renderAnimStart.getValue())/(h_renderAnimSteps.getValue()-1)
			
		for i = 1 to verticalRes do
		(
			txt_pg.text = (i as string)+"/"+(verticalRes as string)
			--outPathFolder = outpath+ (formattedPrint (i as integer) format:"04d")+"\\"
			outPathFolder = outpath+"\\"
			makeDir (outPathFolder)
			
			currentStep= 0
			
			for x = 1 to horizontalRes do
			(
				percent = (x-1)/horizontalRes as float
				
				phiAngle = (rotOffset + (x-1)*rotStep) as float
				
				if cancelRender Then
				(
					pg_gen.value = 0
					txt_pg.text = "Canceled"
					bt_generate.text = "Generate Files"
					bt_generate.enabled = true
					gc()
					return 0
				)
				
				pg_gen.value = (percent *100.) as integer
				
				cx = h_framePosX.getValue() + h_cameraDistMm.getValue()*cos(phiAngle)
				cy = h_framePosY.getValue() + h_cameraDistMm.getValue()*sin(phiAngle)
				cz = getHeightPathNb (i)
				holoCam.pos = [cx,cy,cz]
				
				animation = sp_animeToRend.value
				
				if cb_Anime.checked Then
				(
					animation = (sp_aend.value-sp_astart.value)*percent
					if animeStep >1 Then
						if animation > currentStep + animeStep Then
						(
							currentStep = currentStep + animeStep
							animation = sp_astart.value + currentStep
						)
				)
				
				render camera:holoCam frame:(animation as Time) outputSize:[outW,outH] outputfile:(outPathFolder+outname+ (formattedPrint (imageIdx as integer) format:"06d")+outext)
				imageIdx = imageIdx + 1
				freeSceneBitmaps()
				gc()
			)
		)
		bt_generate.text = "Generate"
		bt_generate.enabled = true
		pg_gen.value = 0
		txt_pg.text = "Done"
		cancelRender = true
		gc()
	)
	on bt_generate pressed do
	(
		if cancelRender Then
		(
			cancelRender = false
			bt_generate.text = "Cancel"
		)
		else
		(
			cancelRender = true
			--bt_generate.enabled = false
		)
		generateSequence()
	)
)--end rollout

delete (execute ("$'"+nameCamArc+"*'"))
delete (execute ("$'"+nameCamFrame+"*'"))
createDialog cylindre_camera 330 860
cylindre_camera.initUI()
cylindre_camera.createObject()