The constraints for manual parameter translation are similar to those of automatic parameter translation. The names and parameter structures no longer have to match, but the types must still match.
The parameters must be translated into the parameter block of the shader. This parameter block is accessed through imrShader::GerParametersParamBlock(). The structure of this parameter block matches that of the mental ray shader as declared in the .mi file. The types of parameters contained in this parameter block are as follows:
Parameter type in .mi declaration |
Type of parameter in the parameter block of the imrShader |
boolean |
TYPE_BOOL |
integer |
TYPE_INT |
scalar |
TYPE_FLOAT by default, TYPE_WORLD if GUI attribute <"units" "world"> is specified |
vector |
TYPE_POINT3 |
transform |
TYPE_MATRIX3 |
color |
TYPE_FRGBA by default, TYPE_RGBA if GUI attribute "noAlpha" is specified |
shader |
TYPE_TEXMAP by default, TYPE_REFTARG if GUI attribute "referenceTarget" is specified |
colortexture, scalartexture, vectortexture |
TYPE_FILENAME by default (should be the filename of a texture), TYPE_TEXMAP if GUI attribute <"textureInfo" "max_texmap"> is specified |
light |
TYPE_INODE with super class (SClassID) of LIGHT_CLASS_ID |
string |
TYPE_STRING |
data |
TYPE_TEXMAP by default, TYPE_REFTARG if GUI attribute "referenceTarget" is specified |
lightprofile |
TYPE_STRING (cannot be used) |
geometry |
TYPE_INODE with sclassID restriction of GEOMOBJECT_CLASS_ID |
material |
TYPE_MTL |
struct* |
TYPE_PBLOCK2 |
array |
Tab of the appropriate parameter (e.g. TYPE_BOOL_TAB for "array boolean") |
When doing manual translation, make sure you lookup the parameters by name and not by parameter ID, since the parameter IDs are not necessarily in order. To get a parameter ID from a parameter name, you may use the following function:
bool GetParamIDByName(ParamID& paramID, const TCHAR* name, IParamBlock2* pBlock) { DbgAssert(pBlock != NULL); int count = pBlock->NumParams(); for(int i = 0; i < count; ++i) { ParamID id = pBlock->IndextoID(i); ParamDef& paramDef = pBlock->GetParamDef(id); if(_tcsicmp(name, paramDef.int_name) == 0) { paramID = id; return true; } } DbgAssert(false); return false; }
The parameter ID will be returned through the "paramID" reference parameter. The function will return false if no parameter was found with the given name.