'***************************************************************
'	CAMERA SHIFT  XSI:"Camera.subfrustum";MR:"offset"
'	javier@internarte.com  
'	
'usage:
'	1. select camera and 
'	2. Run CameraShift.vbs
'	3. if you need to modify parameters just Run script again
'	4. then Export to mi2 file
'	5. Then run the RenderSch.bat on your Project directory
'
'limitations: 	
'	1. unfortunately xsi2.0.1 has a bug, it does not write the offset to 
'	 mental ray, so i wrote a sub to write a batch to translate the values;
'	 in any case, this may be just fine as this script writes your batches for you!
'	2. this won't work in Unix systems as I don't know anithing about them!!
'	 unix users will have to modify the offset manually (multiply subrust * image size)
'***************************************************************
DO	'I know I should use subs instead but i find this easier
' here we check that we have indeed selected a camera
	set sel = selection
	if not sel.count > 0 then
		logmessage "select a camera first", siError
		exit do
	end if
	if sel(0).type <> "camera" then
		logmessage selection(0).fullname & " is not a camera", siError
		exit do
	  end if
	set camera = selection(0)
' this will be valid only once XSI fixes its damn bug!!
	SetValue camera&".camdisp.culviewfrust", True
' this here is for good measure, lest you forget.
	SetValue "Passes.*.RenderOptions.ExportMI2AsciiOutput", True
' here we retrieve existing camera subfrustum parameters	
	sfl = camera.Parameters("subfrustumleft").value
	sfb = camera.Parameters("subfrustumbottom").value
' here we check for custom parameter sets with same names
	On Error Resume Next
		SelectObj ".Camera_Shift_INFO"
		if Err.Number = 0 then
			Deleteobj camera&".Camera_Shift_INFO"
		end if
		Err.Clear
	SelectObj camera&".Camera_Shift"
	if Err.Number = 0 then
		Deleteobj camera&".Camera_Shift"
	end if
' here we set up the dialog input		
	set oProp = camera.AddProperty("custom_parameter_list",,"Camera_Shift")
		set oParam = oProp.AddParameter2( "XSI BUG", siString,,,,,,,2)
			oParam.value = "ShiftCamera works ONLY as wireframe preview & batch"
		set oParam2 = oProp.AddParameter2( "TO RENDER", siString,,,,,,,2)
			oParam2.value = "1.Export mi2 2. Run RenderSch.bat on Project Directory"
		SIAddCustomParameter oProp, "HorizontalShift", siDouble, sfl, -100, 100, , siPersistable, -1, 1
		SIAddCustomParameter oProp, "VerticalShift", siDouble, sfb, -100, 100, , siPersistable, -1, 1
	' I know, I know it ain't proper to mix, but for some reason i couldn't
	' get the values from sfl and sfb with the object method
		set oParam3 = oProp.AddParameter2( "REMEMBER", siString,,,,,,,2)
			oParam3.value = "run this script again after setting render options"
		Err.Clear
	On Error Goto 0
	Selectobj camera
' now we open the dialog 
	on Error Resume Next
		InspectObj oProp,,"Camera Shift",4
			if Err.number <> 0 then 
				Deleteobj oProp
				exit do
			end if
		Err.Clear
	On Error Goto 0
' here we retrieve the values from the input
	set cpsfl = oProp.Parameters("HorizontalShift")
	set cpsfb = oProp.Parameters("VerticalShift")
' this adjusts the values of the camera subfrustum
	SetValue camera&".subfrustumleft", cpsfl.value
		cpsfr = cpsfl.value + 1
	SetValue camera&".subfrustumright", cpsfr
	SetValue camera&".subfrustumbottom", cpsfb.value
		cpsft = cpsfb.value + 1
	SetValue camera&".subfrustumtop", cpsft
' to avoid confusion we delete the custom parameter and set create a proxy
	Deleteobj oProp	
	set oInfo = camera.AddProperty("custom_parameter_list",,"Camera_Shift_INFO")
		oInfo.AddParameter2 "HorizontalShift", siDouble, cpsfl.value, -100, 100, -1, 1, -1, 2
		oInfo.AddParameter2 "VerticalShift", siDouble, cpsfb.value, -100, 100, -1, 1, -1, 2
		set oInfP2 = oInfo.AddParameter2( "INFO", siString,,,,,,,2)
			oInfP2.value = "TO MODIFY SHIFT Run this script again"
	set oInfP3 = oInfo.AddParameter2( "TO RENDER 1.", siString,,,,,,,2)
		oInfP3.value = " RUN this script after having set your Render options"
		
	set oInfP4 = oInfo.AddParameter2( "TO RENDER 2.", siString,,,,,,,2)
		oInfP4.value = " then run the 'Render_CSh.bat' in the Proyect Directory"
			
'call sub to write batch		
	makebat

	Selectobj camera
	
	exit do
Loop

Sub makebat
	set pass = GetCurrentPass
	cam = GetValue (pass&".RenderOptions.PassCamera")
	xpf = GetValue (pass&".RenderOptions.ExportMI2FileName")
	if xpf = "" then
		logmessage "No batch file will be made until you specify an mi2 file name"
		exit sub
	end if
	paz = ActiveProject.Path 
'resolution of your image

	imX = GetValue (pass&".RenderOptions.CameraXRes")
	imY = GetValue (pass&".RenderOptions.CameraXRes")
'new offset values

	offx = imX*cpsfl.value
	offy = imY*cpsfb.value
'for multiple mi2 files
	sfra = GetValue (pass&".RenderOptions.StartFrame")
	efra = GetValue (pass&".RenderOptions.EndFrame")
	step = GetValue (pass&".RenderOptions.Step")
	if efra > sfra then
		count = (efra - sfra)/step
	else
		count = 0
	end if
'batch name
	batn = paz&"\RenderCSh.bat"
	
	
logmessage batn
	Set fso = CreateObject("Scripting.FileSystemObject")
	Set NewBat = fso.OpenTextFile(batn, 2, True)
	NewBat.WriteLine "Call Setenv.bat"
	
	for i=0 to count
		xpfn = xpf&"."&sfra&".mi2"							
		NewBat.WriteLine "ray3 -verbose 5 -offset "&offx&" "&offy&" "&xpfn

		sfra = sfra+step
	next	
	NewBat.WriteLine "pause"	
	NewBat.Close
	
end sub

