Export As: [ PDF | ODT ]

Render To RIB

Summary

Below is an example demonstrating how you can cause a scene to be “rendered” to a RIB file, via script.

API Areas of Interest

Example

Click the name of the example below to save it as a file.

Render_To_RIB.dsa
// DAZ Studio version 4.5 filetype DAZ Script
 
/*****************************
   Script Globals
*****************************/
var g_sToolName = "Render To RIB";
var g_sToolKey = "3Delight";
 
var g_oFileInfo = new DzFileInfo( getScriptFileName() );
var g_sScriptName = String( "%1.%2" ).arg( g_oFileInfo.baseName() ).arg( g_oFileInfo.extension() );
 
var g_bShiftPressed = App.modifierKeyState() & 0x02000000;
var g_bControlPressed = App.modifierKeyState() & 0x04000000;
var g_bAltPressed = App.modifierKeyState() & 0x08000000;
var g_bMetaPressed = App.modifierKeyState() & 0x10000000;
 
var g_sRenderRibKey = "RenderToRIB";
var g_sRibPathKey = "RIBFilename";
var g_sKeepShadowsKey = "RIBKeepShadows";
var g_sCollectAssetsKey = "RIBCollectAll";
var g_sProgressiveRenderKey = "ProgressiveRender";
 
var g_oTmpFile = new DzFileInfo( Scene.getFilename() );
 
var g_sDefaultRibPath = String( "%1/%2" ).arg( App.getTempPath() )
	.arg( g_oTmpFile.exists() ? String( "%1.rib" ).arg( g_oTmpFile.baseName() ) : "dzTest.rib" );
 
delete g_oTmpFile;
g_oTmpFile = undefined;
 
var g_oGui = new DsInterface;
var g_oActions = new DsActions;
var g_oSettingsHelper = new DzSettingsHelper;
var g_oArrayHelper = new DzArrayHelper;
var g_oStringHelper = new DzStringHelper;
 
var g_bDEBUG = false;
 
/***********************************************************************
***** DsInterface Prototype *****
***********************************************************************/
 
/*********************************************************************/
function DsInterface()
{
	// Get the current style
	this.oStyle = App.getStyle();
 
	// List of Boolean options
	this.aBoolNames = [];
	this.aBoolObjs = [];
	// List of String options
	this.aStrNames = [];
	this.aStrObjs = [];
	// List of ComboBox options
	this.aCmbNames = [];
	this.aCmbObjs = [];
	//
	this.wDlg, this.wTabStack;
	this.wOptionPage, this.wPrefsPage;
	this.wPathGB, this.wPrefsGB;
	this.wRibPath;
	this.wKeepShadows, this.wCollect;
	this.wHelpBtn, this.wAcceptBtn, this.wCancelBtn;
	this.wRcrdOnExec, this.wRcrdBtn, this.wRdBtn, this.wDfltBtn;
 
	// Functions for "Static" members
	this.__defineGetter__( "s_nWidgetWidth", function(){ return DsInterface.s_nWidgetWidth; } )
	this.__defineSetter__( "s_nWidgetWidth", function( v ){ DsInterface.s_nWidgetWidth = v; } )
	this.__defineGetter__( "s_nBtnHeight", function(){ return DsInterface.s_nBtnHeight; } )
	this.__defineSetter__( "s_nBtnHeight", function( v ){ DsInterface.s_nBtnHeight = v; } )
	this.__defineGetter__( "s_nBtnMinWidth", function(){ return DsInterface.s_nBtnMinWidth; } )
	this.__defineSetter__( "s_nBtnMinWidth", function( v ){ DsInterface.s_nBtnMinWidth = v; } )
	this.__defineGetter__( "s_nSpacing", function(){ return DsInterface.s_nSpacing; } )
	this.__defineSetter__( "s_nSpacing", function( v ){ DsInterface.s_nSpacing = v; } )
	this.__defineGetter__( "s_nMargin", function(){ return DsInterface.s_nMargin; } )
	this.__defineSetter__( "s_nMargin", function( v ){ DsInterface.s_nMargin = v; } )
}
/***********************************************************************/
DsInterface.superclass = Object;
 
// Initialize "Static" members
DsInterface.s_nMargin = g_oGui.oStyle.pixelMetric( "DZ_GeneralMargin" );
DsInterface.s_nSpacing = g_oGui.s_nMargin;
DsInterface.s_nBtnMinWidth = g_oGui.oStyle.pixelMetric( "DZ_ButtonMinWidth" );;
DsInterface.s_nBtnHeight = g_oGui.oStyle.pixelMetric( "DZ_ButtonHeight" );
DsInterface.s_nWidgetWidth = 290;
 
/*********************************************************************/
// void : Build the 'common' portion of the interface (used in hidden and unhidden modes)
DsInterface.prototype.doCommon = function()
{
	// --------------------- 
	// --- Main dialog
	// --------------------- 
	this.wDlg = new DzBasicDialog;
	this.wTabStack = new DzTabWidget( this.wDlg );
	// --------------------- 
	// --- Options Page
	// --------------------- 
	this.wOptionPage = new DzVGroupBox( this.wTabStack );
	// --- Path
	this.wPathGB = new DzVGroupBox( this.wOptionPage );
	this.wRibPath = new DzLineEdit( this.wPathGB );
	this.aStrObjs.push( this.wRibPath );
	this.aStrNames.push( g_sRibPathKey );
	// --- Shadow Maps
	this.wKeepShadows = new DzCheckBox( this.wOptionPage );
	this.aBoolObjs.push( this.wKeepShadows );
	this.aBoolNames.push( g_sKeepShadowsKey );
	// --- Collect
	this.wCollect = new DzCheckBox( this.wOptionPage );
	this.aBoolObjs.push( this.wCollect );
	this.aBoolNames.push( g_sCollectAssetsKey );
	// --------------------- 
	// --- Preferences Page
	// --------------------- 
	this.wPrefsPage = new DzVGroupBox( this.wTabStack );
	this.wPrefsGB = new DzVGroupBox( this.wPrefsPage );
	// --- Record on Execution
	this.wRcrdOnExec = new DzCheckBox( this.wPrefsGB );
	this.aBoolObjs.push( this.wRcrdOnExec );
	this.aBoolNames.push( "rcrdOnExec" );
	// Set the initial options
	this.setDefaults();
}
 
/*********************************************************************/
// void : Method for running with the dialog unhidden
DsInterface.prototype.doDialog = function()
{
	// Build the common portion of the dialog
	this.doCommon();
	// Get the Help Manager for "What's This?" and tool tips
	var oHelpMgr = App.getHelpMgr();
	// --------------------- 
	// --- Main dialog
	// --------------------- 
	this.wDlg.caption = g_sToolName;
	this.wDlg.whatsThis =
		String( "<b>File : </b> %1<br>" ).arg( g_sScriptName ) +
		String( "<b>Type : </b> %2<br>" ).arg( getScriptType() ) +
		String( "<b>Size : </b> %3<br>" ).arg( g_oFileInfo.sizeStr() ) +
		String( "<b>Version : </b> %4<br>" ).arg( getScriptVersionString() ) +
		String( "<b>Created : </b> %5<br>" ).arg( g_oFileInfo.created().toString( "dddd, MMMM d yyyy h:mm ap" ) ) +
		String( "<b>Modified : </b> %6" ).arg( g_oFileInfo.lastModified().toString( "dddd, MMMM d yyyy h:mm ap" ) );
	// --- Accept button
	this.wDlg.setAcceptButtonText( "&Render" );
	//this.wAcceptBtn.toolTip = oHelpMgr.getToolTip( "AcceptDialog" );
	//this.wAcceptBtn.whatsThis = "<b>Render:</b><br>"
	//	+ "Click here to render the current scene to the RIB specified.<br><br>"
	//	+ "Accepting this dialog will commit the affect of the settings in this dialog, and close it.";
	// --------------------- 
	// --- Options Page
	// --------------------- 
	this.wOptionPage.whatsThis = oHelpMgr.getHelpString( "PresetOptionTab" );
	this.wOptionPage.flat = true;
	this.wOptionPage.insideMargin = g_oGui.s_nMargin;
	this.wOptionPage.insideSpacing = g_oGui.s_nSpacing;
	// --- Path
	this.wPathGB.title = "Path:";
	this.wPathGB.margin = g_oGui.s_nMargin;
	this.wPathGB.spacing = g_oGui.s_nSpacing;
	this.wPathGB.whatsThis = "<b>" + this.wPathGB.title + "</b><br>"
		+ "This field allows you to specify the absolute path for the RIB file you would like to render to.";
	// --- Keep Shadows
	this.wKeepShadows.text = "Keep Shadows";
	this.wKeepShadows.whatsThis = "<b>" + this.wKeepShadows.text + ":</b><br>" + "This option allows you to choose if you would like to keep the generated shadow map files.";
	// --- Collect
	this.wCollect.text = "Collect and Localize";
	this.wCollect.whatsThis = "<b>" + this.wCollect.text + ":</b><br>"
		+ "This option allows you to choose if you would like to collect all of the associated files and localize their paths in the RIB.";
	// Add the 'Options Page' widget to the tab stack
	this.wTabStack.addTab( this.wOptionPage, "Options" );
	// --------------------- 
	// --- Preferences Page
	// --------------------- 
	this.wPrefsPage.whatsThis = oHelpMgr.getHelpString( "PresetPrefTab" );
	this.wPrefsPage.flat = true;
	this.wPrefsPage.insideMargin = g_oGui.s_nMargin;
	this.wPrefsPage.insideSpacing = g_oGui.s_nSpacing;
	this.wPrefsGB.margin = g_oGui.s_nMargin;
	this.wPrefsGB.spacing = g_oGui.s_nSpacing;
	// --- Record on Execution CheckBox
	this.wRcrdOnExec.text = "Set Preferred Options on Accept";
	this.wRcrdOnExec.whatsThis = oHelpMgr.getHelpString( "PresetPrefOnAccept" );
	// --- Set Preferred Options Button
	this.wRcrdBtn = new DzPushButton( this.wPrefsGB );
	this.wRcrdBtn.text = "&Set Preferred Options";
	this.wRcrdBtn.whatsThis = oHelpMgr.getHelpString( "PresetSetPref" );
	connect( this.wRcrdBtn, "pressed()", this, "setOptions" );
	// --- Read Preferred Options Button
	this.wRdBtn = new DzPushButton( this.wPrefsGB );
	this.wRdBtn.text = "&Read Preferred Options";
	this.wRdBtn.whatsThis = oHelpMgr.getHelpString( "PresetReadPref" );
	connect( this.wRdBtn, "pressed()", this, "getOptions" );
	// --- Restore Default Options Button
	this.wDfltBtn = new DzPushButton( this.wPrefsGB );
	this.wDfltBtn.text = "Restore &Default Options";
	this.wDfltBtn.whatsThis = oHelpMgr.getHelpString( "PresetRestoreDef" );
	connect( this.wDfltBtn, "pressed()", this, "setDefaults" );
	// --- Notes
	var wNotesGB = new DzVGroupBox( this.wPrefsPage );
	wNotesGB.title = "Notes :";
	wNotesGB.margin = g_oGui.s_nMargin;
	wNotesGB.spacing = g_oGui.s_nSpacing;
	wNotesGB.minWidth = g_oGui.s_nWidgetWidth;
	var wKeyLbl = new DzLabel( wNotesGB );
	wKeyLbl.text = oHelpMgr.getHelpString( "PresetNotes" );
	// Add the 'Preferences Page' widget to the tab stack
	this.wTabStack.addTab( this.wPrefsPage, "Preferences" );
	//
	this.wDlg.addWidget( this.wTabStack );
	// --------------------- 
	// --- Polish
	// --------------------- 
	this.wDlg.maxWidth = this.wDlg.minWidth;
	this.wDlg.maxHeight = this.wDlg.minHeight;
	// Get the users prefered options
	this.getOptions();
	// If the dialog is not canceled
	if( this.wDlg.exec() ){
		// If the 'Record on Execute' checkbox is checked, record the current options
		if( this.wRcrdOnExec.checked ){
			this.setOptions();
		}
		// Do... whatever it is that we do
		g_oActions.begin();
	}
}
 
/*********************************************************************/
// void : Method for running with the dialog hidden
DsInterface.prototype.doNoDialog = function()
{
	// Build the common portion of the dialog
	this.doCommon();
	// If the user was holding the shift modifier, update the options from the ones recorded
	if( g_bShiftPressed ){
		this.getOptions();
	}
	// Do... whatever it is that we do
	g_oActions.begin();
}
 
/*********************************************************************/
// void : Method for setting initial option values
DsInterface.prototype.setDefaults = function()
{
	// --- String Options
	this.wRibPath.text = g_sDefaultRibPath;
	// --- Boolean options
	this.wKeepShadows.checked = false;
	this.wCollect.checked = false;
	this.wRcrdOnExec.checked = false;
}
 
/*********************************************************************/
// void : Method for retrieving options
DsInterface.prototype.getOptions = function()
{
	var i = 0;
 
	// Iterate over all boolean option objects
	for( i = 0; i < this.aBoolObjs.length; i += 1 ){
		// Set the current boolean option to the recorded value
		this.aBoolObjs[ i ].checked = g_oSettingsHelper.get( g_oStringHelper.stripSpaces( g_sToolName ), this.aBoolNames[ i ], this.aBoolObjs[ i ].checked );
	}
	// Iterate over all string option objects
	for( i = 0; i < this.aStrObjs.length; i += 1 ){
		// Set the current string option to the recorded value
		this.aStrObjs[ i ].text = g_oSettingsHelper.get( g_oStringHelper.stripSpaces( g_sToolName ), this.aStrNames[ i ], this.aStrObjs[ i ].text );
	}
	// Iterate over all combobox option objects
	for( i = 0; i < this.aCmbObjs.length; i += 1 ){
		// Get the recorded currentText value
		var tStr = g_oSettingsHelper.get( g_oStringHelper.stripSpaces( g_sToolName ), this.aCmbNames[ i ], this.aCmbObjs[ i ].currentText );
		// Set the currentItem string option to the recorded value
		for( var j = 0; j < this.aCmbObjs[ i ].count; j += 1 ){
			if( this.aCmbObjs[ i ].text( j ) == tStr ){
				this.aCmbObjs[ i ].currentItem = j;
				break;
			}
		}
	}
}
 
/*********************************************************************/
// void : Method for recording options
DsInterface.prototype.setOptions = function()
{
	var i = 0;
 
	// Iterate over all boolean option objects
	for( i = 0; i < this.aBoolObjs.length; i += 1 ){
		// Record the current boolean option
		g_oSettingsHelper.set( g_oStringHelper.stripSpaces( g_sToolName ), this.aBoolNames[ i ], this.aBoolObjs[ i ].checked );
	}
	// Iterate over all string option objects
	for( i = 0; i < this.aStrObjs.length; i += 1 ){
		// Record the current string option
		g_oSettingsHelper.set( g_oStringHelper.stripSpaces( g_sToolName ), this.aStrNames[ i ], this.aStrObjs[ i ].text );
	}
	// Iterate over all combobox option objects
	for( i = 0; i < this.aCmbObjs.length; i += 1 ){
		// Record the currentText string option
		g_oSettingsHelper.set( g_oStringHelper.stripSpaces( g_sToolName ), this.aCmbNames[ i ], this.aCmbObjs[ i ].currentText );
	}
}
 
/*********************************************************************/
// String : Method for retrieving the path
DsInterface.prototype.getPath = function()
{
	return this.wRibPath.text;
}
 
/*********************************************************************/
// Boolean : Method for retrieving the shadows option
DsInterface.prototype.getKeepShadows = function()
{
	return this.wKeepShadows.checked;
}
 
/*********************************************************************/
// Boolean : Method for retrieving the collect option
DsInterface.prototype.getCollect = function()
{
	return this.wCollect.checked;
}
 
/*********************************************************************/
// Boolean : Method for retrieving the record option
DsInterface.prototype.getRecord = function()
{
	return this.wRcrdOnExec.checked;
}
 
/***********************************************************************
***** DsActions Prototype *****
***********************************************************************/
 
/*********************************************************************/
function DsActions()
{
	// Instance Members	
	this.sTmpRibPath;
	this.bTmpShadows, this.bTmpCollect;
	this.oProcess;
}
/***********************************************************************/
DsActions.superclass = Object;
 
 
/*********************************************************************/
// void : Method to inform the user of errors
DsActions.prototype.readFromStderr = function()
{
	MessageBox.critical( this.oProcess.readStderr(), "Process Error", "&OK" );
}
 
/*********************************************************************/
// void : Method to do whatever it is we do
DsActions.prototype.begin = function()
{
	// Get the render manager
	var oRenderMgr = App.getRenderMgr();
	// Find the 3Delight renderer
	var oRenderer = oRenderMgr.findRenderer( "DzDelightRenderer" );
	// If we didn't find the render we want
	if( !oRenderer ){
		// There is no point in continuing... exit early.
		return;
	}
 
	// Set the active renderer to 3Delight
	oRenderMgr.setActiveRenderer( oRenderer );
 
	// Get the user options
	var sRibPath = g_oGui.getPath();
	var bKeepShadows = g_oGui.getKeepShadows();
	var bCollect = g_oGui.getCollect();
	var bRecord = g_oGui.getRecord();
 
	// Create new file info for easy path operations
	var oFile = new DzFileInfo( sRibPath );
 
	// If the user didn't record preferred settings
	if( !bRecord ){
		// Record any previous values
		this.sTmpRibPath = g_oSettingsHelper.get( g_sToolKey, g_sRibPathKey, g_sDefaultRibPath );
		this.bTmpShadows = g_oSettingsHelper.get( g_sToolKey, g_sKeepShadowsKey, false );
		this.bTmpCollect = g_oSettingsHelper.get( g_sToolKey, g_sCollectAssetsKey, false );
 
		// Temporarily set the flags
		g_oSettingsHelper.set( g_sToolKey, g_sRibPathKey, sRibPath );
		g_oSettingsHelper.set( g_sToolKey, g_sKeepShadowsKey, bKeepShadows );
		g_oSettingsHelper.set( g_sToolKey, g_sCollectAssetsKey, bCollect );
	}
 
	// Record whether we're rendering to rib
	var bRenderRib = g_oSettingsHelper.get( g_sToolKey, g_sRenderRibKey, false );
 
	// Set the flag used by DzDelightRenderer
	g_oSettingsHelper.set( g_sToolKey, g_sRenderRibKey, true );
 
	// Get the current render options
	var oRenderOptions = oRenderMgr.getRenderOptions();
 
	// Store the original values of the options we'll be changing
	var nRenderType = oRenderOptions.renderType;
	var nRenderImgToId = oRenderOptions.renderImgToId;
	var sRenderImgFilename = oRenderOptions.renderImgFilename;
	var bShowPreview = oRenderOptions.showPreview;
 
	// Adjust the render options
	oRenderOptions.renderType = oRenderOptions.Software;
	oRenderOptions.renderImgToId = oRenderOptions.DirectToFile;
	oRenderOptions.renderImgFilename = sRibPath + ".png";
	oRenderOptions.showPreview = false;
 
	// Do the "render" using the adjusted options
	oRenderMgr.doRender( oRenderOptions );
 
	// Unset the flag used by DzDelightRenderer
	g_oSettingsHelper.set( g_sToolKey, g_sRenderRibKey, bRenderRib );
 
	// If the user didn't record preferred settings
	if( !bRecord ){
		// Restore to the previous values
		g_oSettingsHelper.set( g_sToolKey, g_sRibPathKey, this.sTmpRibPath );
		g_oSettingsHelper.set( g_sToolKey, g_sKeepShadowsKey, this.bTmpShadows );
		g_oSettingsHelper.set( g_sToolKey, g_sCollectAssetsKey, this.bTmpCollect );
	}
 
	// Reset the options from the last recorded options
	oRenderOptions.renderType = nRenderType;
	oRenderOptions.renderImgToId = nRenderImgToId;
	oRenderOptions.renderImgFilename = sRenderImgFilename;
	oRenderOptions.showPreview = bShowPreview;
 
	// Cause the options to be recorded and reloaded
	oRenderOptions.applyChanges();
	oRenderOptions.resetOptions();
 
	// Let the user know we're busy
	setBusyCursor();
 
	// If we're collecting assets and the path is valid
	if( bCollect && oFile.exists() ){
		// Create a new dir
		var oDir = new DzDir( oFile.path() );
		// Construct the name of a sub-directory to collect into
		var sCollectDir = String( "%1_collected" ).arg( oFile.baseName() );
		// If the sub-directory is successfully created
		if( oDir.mkdir( sCollectDir ) ){
			// Change to the created directory
			oDir.cd( String( "%1/%2" ).arg( oDir.absPath() ).arg( sCollectDir ) );
		}
 
		// Create a new process
		this.oProcess = new DzProcess();
		// Set the communication flags for the process
		this.oProcess.communication = this.oProcess.Stdin | this.oProcess.Stdout | this.oProcess.Stderr;
		// Set the working directory
		this.oProcess.workingDirectory = App.getUtilitiesPath();
		// Connect to recieve error messages
		connect( this.oProcess, "readyReadStderr()", this, "readFromStderr" );
		// Create an array to hold process args
		var aProcessArgs = [];
		// Populate the args array
		aProcessArgs.push( String( "%1/%2" ).arg( this.oProcess.workingDirectory ).arg( "ribdepends" ) );
		aProcessArgs.push( "-noinit" );
		aProcessArgs.push( "-package" );
		aProcessArgs.push( oDir.absPath() );
		aProcessArgs.push( oFile.absFileName() );
		// Assign the args
		this.oProcess.arguments = aProcessArgs;
 
		// If starting the process fails
		if( !this.oProcess.start() ){
			// Inform the user
			MessageBox.critical( "Could not start the process.", "Fatal Error", "&OK" );
		}
 
		// Wait for the process to exit;
		// Otherwise the script will complete and in so cleaning up, the process object
		// will be destroyed before said process can actually do anything
		while( this.oProcess.running ){}
 
	}
 
	// Let the user know we're done
	clearBusyCursor();
}
 
/*********************************************************************/
// If the user was holding the CTRL modifier key launch the dialog, otherwise run without the dialog
g_bControlPressed ? g_oGui.doDialog() : g_oGui.doNoDialog();