/* CMD: ½RenderMacro                                                    */
/* By Brett Evan Hester      13032 Copenhill Rd. Dallas, Tx. 75240-5302 */
	MacrosName = "RenderMacro"
/* Macro Type:                                                          */
/* SPECIAL     * LAYOUT    * LOOPS        * WARNING!     * TIME NEEDED  */
/* Description:                                                         */

Info1A = "!Render Macro ©                Information 2 of 2"
Info1B = ""
Info1C = "@This macro allows for rendering an infinite num."
Info1D = "@of scenes one right after another and different "
Info1E = "@directories can be chosen for every scene.      "
Info1F = "þ The file paths for saving the different images"
Info1G = "  are chosen after selecting SET... & ... RENDER"
Info1H = "  (IFF/RGB/IMAGES all refer to one file type.)  "
Info1I = "þ ADD ANOTHER SCENE brings up another file req. "
Info1J = "  and another menu for setting its frames/saves."
Info1K = "þ SET FILENAMES & START RENDERING displays a    "
Info1L = "  file requester for each scene & save format.  "
Info1M = "- After that the rendering process will begin! -"
Info1N = "@Every option is set up on a scene-by-scene basis"

Info2A = "!Render Macro ©                Information 2 of 2"
Info2B = "@               Plug-Ins and Go! ©               "
Info2C = "                           Hester and associates"
Info2D = "                           13032 Copenhill Road "
Info2E = "                           Dallas, Texas 75240  "
Info2F = "@Special Thanks to:                              "
Info2G = "Arnie Cachelin  Henry Ribron    Mark J. Holland "
Info2H = "J. Phil Kelso   Terry Wester    Steven K. Simms "
Info2I = "Kevin DeRita    Greg Glaser     William S. Hawes"
Info2J = "NewTek ©        Commodore ©     INOVAtronics ©  "
Info2K = ""
Info2L = "@This macro represents a lot of time & hard work."
Info2M = "@Encourage people to create new ones and not kill"
Info2N = "@that possibility by stealing those that are out."

/* -------------------------------------------------------------------- */
                                             /* Checking Stage of Macro */
IF SHOW(CLIP,"RndStage") = 0 THEN CALL SETCLIP("RndStage","1")
Stage = GETCLIP("RndStage")

SELECT
	WHEN Stage = 1 THEN CALL StageOne
	WHEN Stage = 2 THEN CALL StageTwo
	OTHERWISE EXIT
END

/* ******************************************************************** */
                                       /* STAGE ONE (Main Body Of Code) */
StageOne:
                                     /* Start Error Detection (See End) */
	SIGNAL ON ERROR
	SIGNAL ON SYNTAX
                                                     /* Address Modeler */
	VT3DLib = ADDLIB("LWModelerARexx.port",0)
	ADDRESS "LWModelerARexx.port"
                                               /* Add Support Functions */
	SupportLib = "rexxsupport.library"
	IF POS(SupportLib , SHOW('L')) = 0 THEN
		IF ~ADDLIB(SupportLib , 0 , -30 , 0) THEN DO
			CALL Notify(1,"!Can't find "SupportLib)
			CALL Exiting
		END

	CALL RecallSettings

	ReqContinue = 1
	DO i=1 UNTIL ReqContinue = 2
		                                               /* Selecting Scene */
		OKtoContinue = 0
		DO UNTIL OKtoContinue = 1
			FileReq = GetFileName("-- Select Scene --", ScnPath, DfltScn)
			IF FileReq = "(none)" THEN CALL Exiting
			IF EXISTS(FileReq) = 0 THEN DO
				CALL Notify(1,"!Sorry!","@File not found.")
				OKtoContinue = 0
			END
			IF EXISTS(FileReq) = 1 THEN DO
				CALL ExtractName
				OpenFile = OPEN(SceneFile, FileReq, 'R')
				IF OpenFile = 0 THEN CALL Notify(1,"!Sorry!","Selected file unable to be read.")
				IF OpenFile = 1 THEN DO
					FirstLine = READLN(SceneFile)
					IF FirstLine = "LWSC" THEN OKtoContinue = 1
					IF FirstLine ~= "LWSC" THEN DO
						CALL Notify(1,"!Sorry!","Selected file is not a scene file.")
						CLOSE(SceneFile)
					END
				END
			END
		END
		CALL ReadFile
                                                      /* Menu Requester */
		OKtoContinue = 0
		DO UNTIL OKtoContinue = 1 
			OKtoContinue = 1
			CALL MenuRequester
			IF ReqBegFrm < ReqEndFrm THEN FrameDir = 1
			IF ReqBegFrm > ReqEndFrm THEN FrameDir = -1
			IF SIGN(ReqFrmStep) ~= FrameDir THEN DO
				OKtoContinue = 0
				CALL Notify(1,"!Sorry!","@The Frame Step must be able to go","@from the First Frame to the Last Frame.")
			END
			IF (ReqSaveIFF + ReqSaveFS + ReqSaveAlpha) = 6 THEN DO
				OKtoContinue = Notify(3,"!Warning!","No saving format specified","@Render this scene without saving?")
			END
		END

		ScnReq.i = FileReq ; ScnName.i = FileName
		ScnPath = FilePath ; DfltScn = FileName
		BegFrm.i = ReqBegFrm ; EndFrm.i = ReqEndFrm ; FrmStep.i = ReqFrmStep
		SaveIFF.i = ReqSaveIFF ; SaveFS.i = ReqSaveFS ; SaveAlpha.i = ReqSaveAlpha

		TotalScenes = i
	END

	DO i=1 TO TotalScenes
                                          /* Selecting Names for Images */
		IF SaveIFF.i = 1 THEN DO
			OKtoContinue = 0
			DO UNTIL OKtoContinue = 1 
				OKtoContinue = 1
				FileReq = GetFileName("Save" ScnName.i "Images to:", IFFPath, ScnName.i)
				CALL VerifySave
			END
			SaveIFFName.i = FileReq ; IFFPath = FilePath
		END
                                          /* Selecting Names for Frames */
		IF SaveFS.i = 1 THEN DO
			OKtoContinue = 0
			DO UNTIL OKtoContinue = 1 
				OKtoContinue = 1
				FileReq = GetFileName("Save" ScnName.i "Framestores to:", FSPath, ScnName.i)
				CALL VerifySave
			END
			SaveFSName.i = FileReq ; FSPath = FilePath
		END
                                          /* Selecting Names for Alphas */
		IF SaveAlpha.i = 1 THEN DO
			OKtoContinue = 0
			DO UNTIL OKtoContinue = 1 
				OKtoContinue = 1
				FileReq = GetFileName("Save" ScnName.i "Alpha to:", AlphaPath, ScnName.i)
				CALL VerifySave
			END
			SaveAlphaName.i = FileReq ; AlphaPath = FilePath
		END

	END
                                   /* Recording Settings For Each Scene */
	DO i=1 TO TotalScenes

		CALL Notify(1,BEHSettingsSavedTo,i,BEHSettingsSavedTo||"BatchRender"||i)

		IF OPEN(SaveMeFile,BEHSettingsSavedTo||"BatchRender"||i,'W') = 0 THEN DO
			CALL Notify(1,"!Sorry!","@Unable to save Batch Rendering Data")
			CALL Exiting
		END

		CALL WRITELN(SaveMeFile, "BatchRenderData")
		CALL WRITELN(SaveMeFile, i)
		CALL WRITELN(SaveMeFile, ScnReq.i)
		CALL WRITELN(SaveMeFile, BegFrm.i EndFrm.i FrmStep.i)
		CALL WRITELN(SaveMeFile, SaveIFF.i)
		CALL WRITELN(SaveMeFile, SaveFS.i)
		CALL WRITELN(SaveMeFile, SaveAlpha.i)
		CALL WRITELN(SaveMeFile, SaveIFFName.i)
		CALL WRITELN(SaveMeFile, SaveFSName.i)
		CALL WRITELN(SaveMeFile, SaveAlphaName.i)

		CALL CLOSE(SaveMeFile)
	END

	CALL SaveSettings
                                                  /* Restart This Macro */
	CALL SETCLIP("RndStage","2")
	CALL SETCLIP("BatchRenders",TotalScenes)
	PARSE SOURCE TempA TempB ThisMacro TempD TempE TempF
	ADDRESS COMMAND
	"C:RUN C:RX "||ThisMacro
	ADDRESS
	CALL Exit()                     /* Exiting Modeler / Entering Layout */
	EXIT                                  /* Ending This Program / Stage */

RETURN

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  */
                                       /* STAGE TWO (Main Body Of Code) */
StageTwo:

	ADDRESS 'LightWaveARexx.port'

	CALL SETCLIP("RndStage")
	TotalScenes = GETCLIP("BatchRenders")

	CALL RecallSettings

	DO i=1 TO TotalScenes
                                     /* Getting Settings For This Scene */
		IF EXISTS(BEHSettingsSavedTo||"BatchRender"||i) = 1 THEN DO
			IF OPEN(BatchFile,BEHSettingsSavedTo||"BatchRender"||i, 'R') = 1 THEN DO
				IF READLN(BatchFile) = "BatchRenderData" THEN DO

					SceneNumber = READLN(BatchFile)
					SceneName = READLN(BatchFile)
					PARSE VALUE READLN(BatchFile) WITH BegFrm EndFrm FrmStep

					YNImages = READLN(BatchFile)
					YNFrames = READLN(BatchFile)
					YNAlphas = READLN(BatchFile)
					NameImages = READLN(BatchFile)
					NameFrames = READLN(BatchFile)
					NameAlphas = READLN(BatchFile)

				END
				CALL CLOSE(BatchFile)
         END
		END
                                                /* Rendering This Scene */
		IF EXISTS(SceneName) = 1 THEN DO
			'LoadScene' SceneName

			'FirstFrame' BegFrm
			'LastFrame' EndFrm
			'FrameStep' FrmStep

			IF YNImages = 1 THEN 'SaveImages' NameImages
			IF YNFrames = 1 THEN 'SaveFrames' NameFrames
			IF YNAlphas = 1 THEN 'SaveAlphaImages' NameAlphas

			'Render' 1
		END
	END

	ADDRESS
	EXIT

RETURN

/* ******************************************************************** */
                                    /* Reading Global Macro Preferences */
RecallSettings:

	BEHDefaultFilePath = "Sys:"
	BEHSettingsSavedTo = "T:"
	BEHSpeechAndSound = "1"

	IF (EXISTS("S:PlugInPrefs")) THEN DO
		IF (~OPEN(PlugInPrefs, "S:PlugInPrefs", 'R')) THEN BREAK
		IF (READLN(PlugInPrefs) ~= "PlugInPrefs") THEN BREAK
		BEHDefaultFilePath = READLN(PlugInPrefs)
		BEHSettingsSavedTo = READLN(PlugInPrefs)
		BEHSpeechAndSound = READLN(PlugInPrefs)
		CALL CLOSE PlugInPrefs
	END

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
                                            /* Recalling Macro Settings */
	ScnPath = "Scenes"
	DfltScn = ""
	ReqSaveIFF = 1 ; ReqSaveFS = 2 ; ReqSaveAlpha = 2
	IFFPath = "Images"
	FSPath = "Images"
	AlphaPath = "Images"

	PrefsFileName = BEHSettingsSavedTo||MacrosName||".PLUG"

	IF (EXISTS(PrefsFileName)) THEN DO
		IF (~OPEN(PrefsFile, PrefsFileName, 'R')) THEN BREAK
		IF (READLN(PrefsFile) ~= MacrosName) THEN BREAK

		ScnPath = READLN(PrefsFile)
		DfltScn = READLN(PrefsFile)
		PARSE VALUE READLN(PrefsFile) WITH ReqSaveIFF ReqSaveFS ReqSaveAlpha
		IFFPath = READLN(PrefsFile)
		FSPath = READLN(PrefsFile)
		AlphaPath = READLN(PrefsFile)

		CALL CLOSE PrefsFile
	END

RETURN

/* -------------------------------------------------------------------- */
                                               /* Extract Name and Path */
ExtractName:

	FileReqLength = LENGTH(FileReq)
	FileDivider = LASTPOS("/",FileReq)
	IF FileDivider = 0 THEN FileDivider = LASTPOS(":",FileReq)
	FileNameLength = FileReqLength - FileDivider

	FilePath = STRIP(LEFT(FileReq, FileDivider),"T","/")
	FileName = RIGHT(FileReq, FileNameLength)

RETURN

/* -------------------------------------------------------------------- */
                                                       /* Reading Scene */
ReadFile:

	DO UNTIL EOF(SceneFile)
		TheLine = READLN(SceneFile) 
		IF WORD(TheLine,1) = "FirstFrame" THEN ReqBegFrm = WORD(TheLine,2)
		IF WORD(TheLine,1) = "LastFrame" THEN ReqEndFrm = WORD(TheLine,2)
		IF WORD(TheLine,1) = "FrameStep" THEN ReqFrmStep = WORD(TheLine,2)
	END
	CALL CLOSE(SceneFile)

RETURN

/* -------------------------------------------------------------------- */
                                                      /* User Interface */
MenuRequester:

	CALL Req_Begin("Render Macro ©      by Brett Hester")

	CALL Req_AddControl("",'T',"                   " i " Scene(s)")
	CALL Req_AddControl("",'T',FileName)
	ReqA = Req_AddControl("",'V',0)
	CALL Req_AddControl("",'T',"First Frame Last Frame Frame Step")
	CALL Req_AddControl("",'T',"")
	ReqB = Req_AddControl("",'CH',"Save IFF/RGB/Images     X     ")
	ReqC = Req_AddControl("",'CH'," Save Framestores       X     ")
	ReqD = Req_AddControl("",'CH'," Save Alpha Images      X     ")
	CALL Req_AddControl("",'T',"")
	ReqE = Req_AddControl("",'CV',"Add Another Scene  Set Filenames & Start Rendering")
	CALL Req_AddControl("",'T',"")
	ReqF = Req_AddControl("",'CH',"Information")

	CALL Req_SetVal(ReqA, ReqBegFrm ReqEndFrm ReqFrmStep)
	CALL Req_SetVal(ReqB, ReqSaveIFF)
	CALL Req_SetVal(ReqC, ReqSaveFS)
	CALL Req_SetVal(ReqD, ReqSaveAlpha)
	CALL Req_SetVal(ReqE, ReqContinue)
	CALL Req_SetVal(ReqF, 0)

	IF Req_Post() = 0 THEN CALL Exiting

	PARSE VALUE Req_GetVal(ReqA) WITH ReqBegFrm ReqEndFrm ReqFrmStep
	ReqSaveIFF = Req_GetVal(ReqB)
	ReqSaveFS = Req_GetVal(ReqC)
	ReqSaveAlpha = Req_GetVal(ReqD)
	ReqContinue = Req_GetVal(ReqE)
	BEHInfo = Req_GetVal(ReqF)

	CALL Req_End()

	ReqBegFrm = TRUNC(ReqBegFrm)
	ReqEndFrm = TRUNC(ReqEndFrm)
	ReqFrmStep = TRUNC(ReqFrmStep)
	IF ReqBegFrm < 0 THEN ReqBegFrm = 0
	IF ReqEndFrm < 0 THEN ReqEndFrm = 0

	IF BEHInfo = 1 THEN CALL InformationWindows

RETURN

/* -------------------------------------------------------------------- */
                                             /* Verifying the file name */
VerifySave:

	IF FileReq = "(none)" THEN CALL Exiting

	CALL ExtractName

	IF EXISTS(FilePath) = 0 THEN DO
		OKtoContinue = Notify(3,"!Sorry!",'Directory "'||FilePath||'" not found.',"@Create NEW directory?")
		IF OKtoContinue = 1 THEN CALL MAKEDIR(FilePath)
	END

	IF EXISTS(FileReq) = 1 THEN DO
		DirOrFile = WORD(STATEF(FileReq),1)

		IF DirOrFile = "DIR" THEN DO
			CALL Notify(1,"!Sorry!",'@"'||FileReq||'" is not a valid filename.')
			OKtoContinue = 0
		END
		IF DirOrFile = "FILE" THEN OKtoContinue = Notify(3,"!Warning!","A file with that name already exists.",'@Overwrite "'||FileReq||'" ?')
	END

RETURN

/* -------------------------------------------------------------------- */
                                                  /* Recording Settings */
SaveSettings:

	IF (OPEN(PrefsFile, PrefsFileName, 'W')) THEN DO
		CALL WRITELN(PrefsFile, MacrosName)

		CALL WRITELN(PrefsFile, ScnPath)
		CALL WRITELN(PrefsFile, DfltScn)
		CALL WRITELN(PrefsFile, ReqSaveIFF ReqSaveFS ReqSaveAlpha)
		CALL WRITELN(PrefsFile, IFFPath)
		CALL WRITELN(PrefsFile, FSPath)
		CALL WRITELN(PrefsFile, AlphaPath)

		CALL CLOSE(PrefsFile)
	END

RETURN

/* -------------------------------------------------------------------- */
                                                              /* Ending */
Exiting:

	IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")
	EXIT

RETURN

/* -------------------------------------------------------------------- */
                                                 /* Information Windows */
InformationWindows:

	OKorCancel = Notify(2, Info1A, Info1B, Info1C, Info1D, Info1E, Info1F, Info1G, Info1H, Info1I, Info1J, Info1K, Info1L, Info1M, Info1N)
	IF OKorCancel = 1 THEN CALL Notify(1, Info2A, Info2B, Info2C, Info2D, Info2E, Info2F, Info2G, Info2H, Info2I, Info2J, Info2K, Info2L, Info2M, Info2N)
	OKtoContinue = 0

RETURN                 /* Not actually needed with CALL MainMenu above. */

/* -------------------------------------------------------------------- */
   2)
		IF Option = 3 THEN CALL Req_SetVal(ReqInfo, 3)
		IF Option = 4 THEN CALL Req_SetVal(ReqInfo, 3)
	END
	IF Menu = 4 THEN CALL Req_SetVal(ReqInfo, 2)

	IF Req_Post() = 0 THEN CALL Exiting

	DO i=1 TO 13
		AtFrm = (13*Current)+i
		IF Matches >= AtFrm THEN OnOff.AtFrm = Req_GetVal(Req.AtFrm)
	END
	ReqInfo = Req_GetVal(ReqInfo)

	CALL Req_End()

	CALL FrameChoice

RETURN

/* -------------------------------------------------------------------- */
                                             /* Anylyzing User's Choice */
FrameChoice:

	IF Menu = 1 THEN DO                                  /* --- Info --- */
		IF ReqInfo = 1 THEN Option = 3
		IF ReqInfo = 2 THEN Option = 4
	END
	IF Menu = 2 THEN DO                                  /* --- Info >>> */
		IF ReqInfo = 1 THEN Option = 2
		IF ReqInfo = 2 THEN Option = 3
		IF ReqInfo = 3 THEN Option = 4
	END
	IF Menu = 3 THEN DO                                  /* <<< Info >>> */
		IF ReqInfo = 1 THEN Option = 1
		IF ReqInfo = 2 THEN Option = 2
		IF ReqInfo = 3 THEN Option = 3
		IF ReqInfo = 4 THEN Option = 4
	END
	IF Menu = 4 THEN DO 