'ANDREW HAYES CAMERA SWITCHER
'CREATE A SCENE WITH THE DESIRED CAMERAS IN POSITION
'AND RUN THE SCRIPT!

dim cam(1000)
dim cc
cc=0


'CHECK TO SEE IF ANY CAMERAS ACTUALLY EXIST!
SelectAll
set cameras = SIFilter( list, "camera" )
if TypeName( cameras ) <> "Nothing" then
	else msgbox("No cameras!")
	end if

'ADD ALL AVAILABLE CAMERAS TO CAMERA NAME ARRAY
for each myItem in cameras
if myitem.type = "camera" then 
	cam(cc) = myitem
	cc =cc+1
	end if
next

'TRANSFER TOTAL CAMERA AMOUNT TO MEMORY
dim total_cam_amount
total_cam_amount = cc

'FIND THE SCENE ROOT AND ADD A CUSTOM PARAMETER TO IT
set mySceneRoot = EnumElements("Project", TRUE)
set mySceneRoot = SIFilter(mySceneRoot, "Scene", TRUE )(0)
set mySceneRoot = EnumElements( mySceneRoot , TRUE)
set mySceneRoot = SIFilter(mySceneRoot, "SceneObject", TRUE)(0)
set camera_var = AddProp ("Custom_parameter_list",mySceneRoot, , "Camera_Switcher").Value("Value")

'DEFINE CAMERA IN AND OUT ARRAYS
dim camin(50)
dim camout(50)

'STORE THE CURRENT IN AND OUT FRAME NOS
playin = getvalue("PlayControl.In")
playout = getvalue("PlayControl.Out")

'ADD A STRING VARIABLE TO THE CUSTOMER PARAMETER SET FOR EVERY CAMERA
'AND ADD A DEFAULT VALUE TO THE PARAMETERS
for a=1 to total_cam_amount
SIAddCustomParameter camera_var, cam(a-1), siString 
SetValue camera_var&"."&cam(a-1), Cstr(int(((playout-playin)/total_cam_amount)*(a-1)))
next

'CALL THE CUSTOMER PARAMETER WITH AN OKAY/CANCEL OPTION
inspectobj(camera_var),,,4

'ASSIGN ALL VARIABLES IN THE STRING TO AN OBJECT
dim odict(100)

for c =1 to total_cam_amount
a=getvalue(camera_var&"."&cam(c-1))
set odict(c-1)=createobject("scripting.dictionary")
startc=1
curc=1
curw=1

while curc <= len(a)

	if mid(a,curc,1) = "," then 
		s=mid(a,startc,((curc-startc)))
		odict(c-1).add curw,s
		startc=curc+1
		curw=curw+1
		end if
		
	if curc=len(a) then 
		logmessage "at the end!"
		s=mid(a,startc,((curc-startc)+1))
		odict(c-1).add curw,s
		startc=curc+1
		curw=curw+1
		end if
	
	curc=curc+1
	wend
next
for a=1 to total_cam_amount
for each s in odict(a-1)
logmessage odict(a-1).item(s)
next
next

'ADD A CAMERA TO THE SCENE CALLED RENDER_ME
GetPrimCamera "Camera", "Render_Me"
DeleteObj "Render_Me_Interest"

cam_in_use=0
'START LOOPS SO THAT EVERY CAMERA IS EXAMINED ON EVERY FRAME
for frame = playin to playout step 1
for a=1 to total_cam_amount step 1

'STORE CAMERA STRING IN MEMORY
for each c in odict(a-1)
camstart=odict(a-1).item(c)
'CHECK TO SEE IF THE CAMERA NEEDS TO SWITCH TO ANOTHER

if Cstr(camstart)=Cstr(frame) then 
	cam_in_use=a-1
	logmessage "camstart is now " & a
	end if


'STORE ALL CAMERA VARIABLES INTO MEMORY
x=getvalue(cam(cam_in_use)&".kine.global.posx",frame)
y=getvalue(cam(cam_in_use)&".kine.global.posy",frame)
z=getvalue(cam(cam_in_use)&".kine.global.posz",frame)
h=getvalue(cam(cam_in_use)&".kine.global.ori.euler.rotx",frame)
p=getvalue(cam(cam_in_use)&".kine.global.ori.euler.roty",frame)
b=getvalue(cam(cam_in_use)&".kine.global.ori.euler.rotz",frame)
fov=getvalue(cam(cam_in_use)&".fov",frame)
clipin=getvalue(cam(cam_in_use)&".near",frame)
clipout=getvalue(cam(cam_in_use)&".far",frame)

next
next

'SAVE ALL CAMERA VARIABLES TO THE CURRENT FRAME FOR THE RENDER_ME CAMERA
SaveKey "Render_Me.kine.global.pos.posx",frame,x
SaveKey "Render_Me.kine.global.pos.posy",frame,y
SaveKey "Render_Me.kine.global.pos.posz",frame,z
SaveKey "Render_Me.kine.global.ori.euler.rotx",frame,h
SaveKey "Render_Me.kine.global.ori.euler.roty",frame,p
SaveKey "Render_Me.kine.global.ori.euler.rotz",frame,b
savekey "Render_Me.fov",frame,fov
SaveKey "Render_Me.camera.near",frame,clipin
SaveKey "Render_Me.camera.far",frame,clipout

next

deleteobj camera_var

