--Scene Load Tester UI 1.1 based on STL2.51
--last update 2-6-2006 created 12-9-2005
--by zhangy

/*to be done: 
*/

--Main Parameter Struct with default value
struct SLT_MainStruct (
testVersion="CarPaint",
versionBit="32Bit",
drivePath="d:",
ProjectName="MakaluTest",
fn outImgPath= (drivePath+"/"+ProjectName+"_"+testVersion+"/Render_output/"),
fn saveFilePath=(drivePath+"/"+ProjectName+"_"+testVersion+"/SceneSave/"),
fn logFilePath=(drivePath+"/"+ProjectName+"_"+testVersion+"/log/"),
renderSizeX=320,
renderSizeY=240,
renderFormat="jpg",
sceneMergeFile="C:/Makalu/scenes/teapot_carpaint.max",

--testMode 1:scene test 2:material test
testMode=1,

--options
doAniTest=false,
doMRRender=true,
doScanLineRender=false,
doSaveScene=false,
doReloadScene=false,
doResetScene=true,
doSkipTest=false,
doSceneMerge=true,

--init var
bug_fname="",
imgFList_fname="",
proList_fname="" ,
codename="",
filelog="" as stringStream,
imgFileList="" as stringStream,
proList="" as stringStream,
fileType="",
mVersion=maxversion()
)

--declare the global parameter for the whole script.
SLT_MainParameter=SLT_MainStruct()

--funcation Loader the main part
fn maxLoader Str_dir =
(
	dir_array=#(Str_dir)
	max_files=#()
	
	for i in dir_array do 
	(
	join dir_array (GetDirectories(i+"/*"))
	join max_files (getFiles(i+"/*."+SLT_MainParameter.fileType))
	)
	
	for f in max_files do 
	(
	format "=========File:% ||On Test start %=============\n" f  localTime to:SLT_MainParameter.filelog
	
	if not keyboard.escPressed then
	(
		loopTime=0
		case SLT_MainParameter.testMode of
		(
			1: loopTime =1 
			2: (loadMaterialLibrary f
			   loopTime=currentMaterialLibrary.count)
		)
		for j=1 to loopTime do 
		(

			--scene load module
			loopName=""
			proList_in=""
			case SLT_MainParameter.testMode of
			(1:
				(
				proList_in=f
				--support skip test
				if  SLT_MainParameter.doSkipTest and (skipToString SLT_MainParameter.proList proList_in)!=undefined do continue
				
				loopName=getFilenameFile f
				loadMAXFile f useFileUnits:true quiet:true				
				)
			 2:	
			 	(if (superclassof currentMaterialLibrary[j])!=material do continue
				proList_in=f+"_"+currentMaterialLibrary[j].name
				--support skip test
				if  SLT_MainParameter.doSkipTest and (skipToString SLT_MainParameter.proList proList_in)!=undefined do continue
				
				MatObj=Teapot radius:5 smooth:on segs:8 pos:[0,0,0] isSelected:on
				MatObj.material=currentMaterialLibrary[j]
				MatObj.name=currentMaterialLibrary[j].name
				loopName=currentMaterialLibrary[j].name
				max zoomext sel all
			  )
			)
			
			print proList_in to:SLT_MainParameter.proList
			flush SLT_MainParameter.proList
			
			--scene merge module
			if SLT_MainParameter.doSceneMerge do
			(
				format "Scene Merge:" to:SLT_MainParameter.filelog
				mergeMAXFile SLT_MainParameter.sceneMergeFile quiet:true #renameMtlDups 
				format "|done!\n" to:SLT_MainParameter.filelog
			)
			
			--animation module
			if SLT_MainParameter.doAniTest do 
				(
				format "Play Animation:" to:SLT_MainParameter.filelog
				playAnimation immediateReturn:false
				format "|done!\n" to:SLT_MainParameter.filelog
				)
			
			--renderingTest module
			if SLT_MainParameter.doMRRender do
				(
				renderImgName=SLT_MainParameter.outImgPath()+SLT_MainParameter.CodeName+"/"+SLT_MainParameter.CodeName+"_"+loopName+"_MR"+"."+SLT_MainParameter.renderFormat
				format "MentalRay Rendered To:% " renderImgName to:SLT_MainParameter.filelog
				renderers.current = mental_ray_renderer()
				render outputwidth:SLT_MainParameter.renderSizeX outputheight:SLT_MainParameter.renderSizeY outputfile:renderImgName
				format "|done!\n" to:SLT_MainParameter.filelog
				--output translation time to log for makalu
				if SLT_MainParameter.mVersion[1]==8800 do 
					(
					format "MR_LastTotalNonRenderTime_ms:% \n" renderers.current.LastTotalNonRenderTime_ms to:SLT_MainParameter.filelog
					format "MR_LastTotalGeomTranslationTime_ms:% \n" renderers.current.LastTotalGeomTranslationTime_ms to:SLT_MainParameter.filelog
					)
				format "%\n" renderImgName to:SLT_MainParameter.imgFileList
				)
				
			if SLT_MainParameter.doScanLineRender do
				(
				renderImgName=SLT_MainParameter.outImgPath()+SLT_MainParameter.CodeName+"/"+SLT_MainParameter.CodeName+"_"+loopName+"_SL"+"."+SLT_MainParameter.renderFormat
				format "Scanline Rendered To:% " renderImgName to:SLT_MainParameter.filelog
				renderers.current=Default_Scanline_Renderer()
				render outputwidth:SLT_MainParameter.renderSizeX outputheight:SLT_MainParameter.renderSizeY outputfile:renderImgName
				format "|done!\n" to:SLT_MainParameter.filelog
				format "%\n" renderImgName to:SLT_MainParameter.imgFileList
				)
			flush SLT_MainParameter.filelog
			flush SLT_MainParameter.imgFileList
			
			--saveLoadTest module
			saveFileName=SLT_MainParameter.saveFilePath()+SLT_MainParameter.CodeName+"/"+SLT_MainParameter.CodeName+"_"+loopName+".max"
			if SLT_MainParameter.doSaveScene do
				(
				format "ReSave File To:% " saveFileName to:SLT_MainParameter.filelog
				saveMaxFile saveFileName
				format "|done!\n" to:SLT_MainParameter.filelog
				)
			
			if SLT_MainParameter.doReloadScene do
				(
				format "ReLoad File From:% " saveFileName to:SLT_MainParameter.filelog
				loadMAXFile saveFileName useFileUnits:true quiet:true
				format "|done!\n" to:SLT_MainParameter.filelog
				)
			
			--clear the scene module
			flush SLT_MainParameter.filelog
			
			case SLT_MainParameter.testMode of
			( 
				2: delete MatObj
			 )
			
			if SLT_MainParameter.doResetScene do
			(
				resetMaxFile #noPrompt
				gc()
				)
			)
			format "========File:%  ||Test Done End: %======\n" f localTime to:SLT_MainParameter.filelog

			
		)
	else
		quitMAX #noPrompt
	endif
	)
	return true
)

fn SLT_Main =
(
--createDir
makedir (SLT_MainParameter.drivePath+"/"+SLT_MainParameter.ProjectName+"_"+SLT_MainParameter.testVersion)
makedir (SLT_MainParameter.outImgPath())
makedir (SLT_MainParameter.saveFilePath())
makedir (SLT_MainParameter.logFilePath())



case SLT_MainParameter.testMode of
(
  1: SLT_MainParameter.fileType="max"
  2: SLT_MainParameter.fileType="mat"
)

--version detection 

case SLT_MainParameter.mVersion[1] of
(
8800:
	(
	SLT_MainParameter.bug_fname = SLT_MainParameter.logFilePath()+"fileOpen_Makalu_"+SLT_MainParameter.versionBit+".log"
	SLT_MainParameter.imgFList_fname=SLT_MainParameter.logFilePath()+"fList_Makalu_"+SLT_MainParameter.versionBit+".txt"
	SLT_MainParameter.proList_fname=SLT_MainParameter.logFilePath()+"fProList_Makalu_"+SLT_MainParameter.versionBit+".log"
	SLT_MainParameter.CodeName="Makalu"+SLT_MainParameter.VersionBit
	)
8000:
	(
	SLT_MainParameter.bug_fname = SLT_MainParameter.logFilePath()+"fileOpen_versper.log"
	SLT_MainParameter.imgFList_fname=SLT_MainParameter.logFilePath()+"fList_vesper.txt"
	SLT_MainParameter.proList_fname=SLT_MainParameter.logFilePath()+"fProList_vesper.log"
	SLT_MainParameter.CodeName ="Vesper"
	)
)

--makeDir for test
makeDir (SLT_MainParameter.outImgPath()+SLT_MainParameter.CodeName)
makeDir (SLT_MainParameter.saveFilePath()+SLT_MainParameter.CodeName)

FileDir=getSavePath caption:"Select The Directory"
if FileDir!=Undefined do
	(
	deleteFile SLT_MainParameter.bug_fname
	deleteFile SLT_MainParameter.imgFList_fname
	SLT_MainParameter.filelog = createFile SLT_MainParameter.bug_fname
	SLT_MainParameter.imgFileList=createFile SLT_MainParameter.imgFList_fname
		
	if (doesFileExist SLT_MainParameter.proList_fname) and SLT_MainParameter.doSkipTest then 
		SLT_MainParameter.proList = openFile SLT_MainParameter.proList_fname mode:"a+"
	else
		(
		deleteFile SLT_MainParameter.proList_fname
		SLT_MainParameter.proList = createFile SLT_MainParameter.proList_fname
		)
	endif
	
	maxLoader FileDir
	resetMaxFile #noPrompt
	format "\n \n==============WOW All Test Completed!=============\n" to:SLT_MainParameter.filelog

	close SLT_MainParameter.filelog
	close SLT_MainParameter.imgFileList
	close SLT_MainParameter.proList
	)
)

rollout SLT_Roll "Scene Load Tester" width:251 height:850
(	
	groupBox grp1 "Main Parameter" pos:[7,11] width:235 height:387
	editText edt1 "Test Title" pos:[24,34] width:185 height:24 text:SLT_MainParameter.testVersion
	editText edt2 "32|64 bit" pos:[26,66] width:100 height:24	text:SLT_MainParameter.versionBit
	editText edt3 "OutputDrive:" pos:[13,101] width:190 height:24 text:SLT_MainParameter.drivePath
	button btn1 "..." pos:[206,101] width:20 height:20
	editText edt6 "TestProjectName:" pos:[13,140] width:220 height:24 text:SLT_MainParameter.ProjectName
	
	groupBox grp3 "Output Setup" pos:[24,180] width:191 height:105 
	spinner spn1 "Width  :" pos:[70,202] width:115 height:16 range:[1,10000,SLT_MainParameter.renderSizeX] type:#integer 
	spinner spn2 "Height  :" pos:[66,227] width:118 height:16 range:[1,10000,SLT_MainParameter.renderSizeY] type:#integer
	editText edt4 "Format:" pos:[64,255] width:120 height:22 text:SLT_MainParameter.renderFormat
	
	groupBox grp4 "Test Task Options" pos:[6,422] width:237 height:152
	checkbox chk1 "Animation Test" pos:[18,443] width:98 height:24 checked:SLT_MainParameter.doAniTest
	checkbox chk2 "MentalRay Render" pos:[126,443] width:110 height:24 checked:SLT_MainParameter.doMRRender
	checkbox chk3 "Scanline Render" pos:[18,476] width:99 height:24 checked:SLT_MainParameter.doScanLineRender
	checkbox chk4 "Save Scene" pos:[127,475] width:104 height:24 checked:SLT_MainParameter.doSaveScene
	checkbox chk5 "Reload Scene" pos:[18,514] width:90 height:24 checked:SLT_MainParameter.doReloadScene
	checkbox chk6 "Reset Scene" pos:[128,513] width:104 height:24 checked:SLT_MainParameter.doResetScene
	checkbox chk7 "Skip Test" pos:[126,546] width:104 height:24 checked:SLT_MainParameter.doSkipTest
	checkbox chk8 "Merge Scene" pos:[18,546] width:104 height:24 checked:SLT_MainParameter.doSceneMerge

	groupBox grp5 "Misc" pos:[6,592] width:236 height:78
	editText edt5 "Merge Scene" pos:[18,612] width:191 height:19 text:SLT_MainParameter.sceneMergeFile
	button btn2 "..." pos:[215,610] width:21 height:21
	button btn3 "Running" pos:[70,697] width:108 height:38
	radioButtons rdo2 "Test Mode" pos:[35,314] width:166 height:62 labels:#("Scene Test Mode", "Material Library Test Mode") default:1 columns:1
	groupBox grp7 "Log File Check" pos:[8,765] width:233 height:74
	button btn4 "Detail Log" pos:[25,790] width:59 height:28
	button btn5 "FileList Log" pos:[166,791] width:59 height:28
	button btn6 "Image Log" pos:[98,790] width:59 height:28
	
	--edit text events
	on edt1 entered text do SLT_MainParameter.testVersion=text
	on edt2 entered text do SLT_MainParameter.versionBit=text
	on edt3 entered text do SLT_MainParameter.drivePath=text
	on edt4 entered text do SLT_MainParameter.renderFormat=text
	on edt5 entered text do SLT_MainParameter.sceneMergeFile=text
	
	--Buttons events
	on btn1 pressed  do 
		( FileDir=getSavePath caption:"Select The Directory"
			if FileDir!=Undefined do
				(
					SLT_MainParameter.drivePath=FileDir
					edt3.text=FileDir
					)
			)
	on btn2 pressed  do 
		( FileDir=getOpenFileName caption:"Select The File For Merge" types:"3ds max File(*.max)|*.max"

			if FileDir!=Undefined do
				(
					SLT_MainParameter.sceneMergeFile=FileDir
					edt5.text=FileDir
					)
			)
			
	on btn4 pressed  do if doesFileExist SLT_MainParameter.bug_fname do shellLaunch SLT_MainParameter.bug_fname ""
	on btn5 pressed  do if doesFileExist SLT_MainParameter.imgFList_fname do shellLaunch SLT_MainParameter.imgFList_fname ""
	on btn5 pressed  do if doesFileExist SLT_MainParameter.proList_fname do shellLaunch SLT_MainParameter.proList_fname ""

	--the go button
	on btn3 pressed  do SLT_Main()
	--Checker Events
	on chk1 changed state do SLT_MainParameter.doAniTest=state
	on chk2 changed state do SLT_MainParameter.doMRRender=state
	on chk3 changed state do SLT_MainParameter.doScanLineRender=state
	on chk4 changed state do SLT_MainParameter.doSaveScene=state
	on chk5 changed state do SLT_MainParameter.doReloadScene=state
	on chk6 changed state do SLT_MainParameter.doResetScene=state
	on chk7 changed state do SLT_MainParameter.doSkipTest=state
	on chk8 changed state do SLT_MainParameter.doSceneMerge=state
	
	--spinner events
	on spn1 changed val do SLT_MainParameter.renderSizeX=val
	on spn2 changed val do SLT_MainParameter.renderSizeX=val
	
	--radio button events
	on rdo2 changed stat do SLT_MainParameter.testMode=stat
)


--add the rollout 
SLT_Floater=newRolloutFloater "Scene Loader UI 1.0 Based On 2.51" 254 700
addRollout SLT_Roll SLT_Floater 