Здраствуйте, есть проблема : при выборе в списке доступных материалов во вкладке Vray доступны только три материала, как видно на скриншоте. А где vrayblendmtl и другие? Крякнут врей нормально, выбран рендерером. Вот зацепка: сразу после установки vray в 3ds max начинает постоянно выскакивать ошибка при запуске(второй скриншот) код ошибки выкладываю вконце
include "$startupScripts\\vrayutils.ms"
-- You can call this on any built-in value that will properly convert to a string
-- without any extra work...like floats ints bools strings...
fn value_to_xml value container out = (
if container != undefined then(
format "<%><%></%>\n" container value container to:out
)else(
format "%" value to:out
)
)
fn value_to_xml_string value container =(
s = stringstream ""
value_to_xml value container s
return s as string
)
-- Generic parameter - all inputs are expected to be strings
--Makes parameter element of <parameters>..</parameters> section of xml
--paramType:- bool, integer, float, string, vector, acolor texture, float texture, color, list, componentTransform, transform, output vector texture, output float texture, output acolor texture, plugin
--paramValue:- if there is parameter value it's nested in <value>..</value> element
--out:- output stream(file)
--gammaCorrect:- true if exists such parameter attribute. It is boolean flag tells us whether a given parameter needs gamma correction before being sent to V-Ray.
--handler:- ComboBoxHandler, FileBrowserHandler, TextureTransformHandler, CheckBoxHandler, DoubleSpinBoxHandler, ColorTexFrameHandler, FloatTexFrameHandler, TextureHandler, LockButtonHandler, UVWHandler
--isUserData:- true if exists such parameter attribute. This is helper param for the UI and will not be sent to V-Ray.
fn make_parameter_xml paramName paramType paramValue out gammaCorrect:undefined handler:"default" isUserData:undefined=(
userDataString=""
gammaCorrectString=""
handlerName = handler
if gammaCorrect != undefined then(
gammaCorrectString = " gammaCorrect=\"1\""
)
if isUserData != undefined then(
userDataString=" isUserData=\"1\""
)
format "\t\t\t\t\t<parameter%% handler=\"%\" name=\"%\" type=\"%\">\n\t\t\t\t\t\t<value>%</value>\n\t\t\t\t\t</parameter>\n" userDataString gammaCorrectString handlerName paramName paramType paramValue to:out
)
--Makes list parameter element of <parameters>..</parameters> section of xml
--listType:- it is the type of parameter stored in the list
--paramType:- bool, integer, float, string, vector, acolor texture, float texture, color, list, componentTransform, transform, output vector texture, output float texture, output acolor texture, plugin
--listOfValues:- container of values. Each value nested in <entry>..</entry> element compaund <list>..</list> element
--out:- output stream(file)
--gammaCorrect:- true if exists such parameter attribute. It is boolean flag tells us whether a given parameter needs gamma correction before being sent to V-Ray.
--handler:- ComboBoxHandler, FileBrowserHandler, TextureTransformHandler, CheckBoxHandler, DoubleSpinBoxHandler, ColorTexFrameHandler, FloatTexFrameHandler, TextureHandler, LockButtonHandler, UVWHandler
--isUserData:- true if exists such parameter attribute. This is helper param for the UI and will not be sent to V-Ray.
fn make_list_parameter_xml paramName listType paramType listOfValues out gammaCorrect:undefined handler:"default" isUserData:undefined=(
userDataString=""
gammaCorrectString=""
handlerName = handler
if gammaCorrect != undefined then(
gammaCorrectString = " gammaCorrect=\"1\""
)
if isUserData != undefined then(
userDataString=" isUserData=\"1\""
)
formatedentry = stringstream ""
entry = "\t\t\t\t\t\t\t\t<entry>%</entry>\n"
numOfValues = listOfValues.count
for i=1 to numOfValues - 1 do (
format entry listOfValues[i] to:formatedentry
)
entry = "\t\t\t\t\t\t\t\t<entry>%</entry>"
if numOfValues > 0 then (
format entry listOfValues[numOfValues] to:formatedentry
) else (
format entry "" to:formatedentry
)
paramValue = formatedentry as string
format "\t\t\t\t\t<parameter%% handler=\"%\" name=\"%\" listType=\"%\" type=\"%\">\n\t\t\t\t\t\t<value>\n\t\t\t\t\t\t\t<list>\n%\n\t\t\t\t\t\t\t</list>\n\t\t\t\t\t\t</value>\n\t\t\t\t\t</parameter>\n" userDataString gammaCorrectString handlerName paramName listType paramType paramValue to:out
)
--The next four functions surve bool/color type parameter creation which need of additional work around convertion to string
fn boolToInteger paramVal = (
val = 0
if paramVal != false then(
val = 1
)
return val
)
fn make_bool_parameter_xml paramName paramVal out isUserData:undefined handler:"default"=(
val = boolToInteger( paramVal )
return make_parameter_xml paramName "bool" (value_to_xml_string val undefined ) out isUserData:isUserData handler:handler
)
fn vraymax_color_to_xml_string val =(
s = stringstream ""
format "<r>%</r><g>%</g><b>%</b>" (val.r as float/255.0f) (val.g as float/255.0f) (val.b as float/255.0f) to:s
return s as string
)
fn vraymax_colorwithalpha_to_xml_string val =(
s = stringstream ""
format "<r>%</r><g>%</g><b>%</b><a>%</a>" (val.r as float/255.0f) (val.g as float/255.0f) (val.b as float/255.0f) (val.a as float/255.0f) to:s
return s as string
)
fn make_color_parameter_xml paramName val out gammaCorrect:undefined isUserData:undefined handler:"default" bAlpha:false=(
if bAlpha == true then (
make_parameter_xml paramName "color" (vraymax_colorwithalpha_to_xml_string val ) out gammaCorrect:gammaCorrect isUserData:isUserData handler:handler
) else (
make_parameter_xml paramName "color" (vraymax_color_to_xml_string val ) out gammaCorrect:gammaCorrect isUserData:isUserData handler:handler
)
)
fn make_acolortexture_parameter_xml paramName val out gammaCorrect:undefined isUserData:undefined handler:"default" bAlpha:false=(
if bAlpha == true then (
make_parameter_xml paramName "acolor texture" (vraymax_colorwithalpha_to_xml_string val ) out gammaCorrect:gammaCorrect isUserData:isUserData handler:handler
) else (
make_parameter_xml paramName "acolor texture" (vraymax_color_to_xml_string val ) out gammaCorrect:gammaCorrect isUserData:isUserData handler:handler
)
)
--Generally open_tag and close_tag methods are used for creating root nodes
fn open_tag tag out tabs:""=(
format "%<%>\n" tabs tag to:out
)
fn close_tag tag out tabs:""=(
format "%</%>\n" tabs tag to:out
)
--begin_asset and end_asset are responsible for Asset element creation
--Assets mach V-Ray plugins
--url: - a scene-unique string identifier for the asset
--pluginType: - generally the same as the underlying V-Ray Plugin's type.
--pluginFamily: - usually it is the same as pluginType
--layout: - this lets us know what user interface layout knows how to deal with this kind of asset
--out: - output file
fn begin_asset url pluginType pluginFamily layout out =(
format "\t<Asset url=\"%\" type=\"%\" layout=\"%\" renderer=\"vray\">\n\t\t<plugin>\n\t\t\t<vrayplugin name=\"%\" type=\"%\">\n\t\t\t\t<parameters>\n" url pluginFamily layout pluginType pluginFamily to:out
)
fn end_asset out =(
close_tag "parameters" out tabs:"\t\t\t\t"
close_tag "vrayplugin" out tabs:"\t\t\t"
close_tag "plugin" out tabs:"\t\t"
close_tag "Asset" out tabs:"\t"
)
--
listOfMAPCoordsStyles = #("Point3", "UV")
fn dumpComponentTransformParameterForMapCoords paramName map out=(
s= stringstream ""
local uvMap
if ((classof map) == VRayHDRI ) then uvMap = map.UVGen
else uvMap = map.coords
-- We don't fully support all the rotation, etc, in our material editor at this point. So I can set these values but they will not be editable.
-- At this time I am just bringing over values that will show up and be editable in our material editor.
format "\n" to:s
tabs ="\t\t\t\t\t\t\t\t"
format "\t\t\t\t\t\t\t<componentTransform>\n" to:s
format "%<x_rotation>%</x_rotation>\n" tabs uvMap.u_angle to:s
format "%<y_rotation>%</y_rotation>\n" tabs uvMap.v_angle to:s
local wRot = uvMap.w_angle
local sign = 1
if wRot < 0 then sign = -1
if abs(wRot) > 360 then (
wRot = abs(wRot) - 360
wRot = sign * wRot
)
if wRot > 0 then (
wRot = 360 - wRot
) else if wRot < 0 then (
wRot = -1 * wRot
)
format "%<z_rotation>%</z_rotation>\n" tabs wRot to:s
format "%<x_offset>%</x_offset>\n" tabs uvMap.UVTransform[4][1] to:s
format "%<y_offset>%</y_offset>\n" tabs uvMap.UVTransform[4][2] to:s
format "%<z_offset>%</z_offset>\n" tabs uvMap.UVTransform[4][3] to:s
--width = map.coords.realWorldWidth
--height = map.coords.realWorldHeight
--if not map.coords.realWorldScale then(
--width = 1.0 / width
--height = 1.0 / height
--)
format "%<x_scale>%</x_scale>\n" tabs uvMap.U_Tiling to:s
format "%<y_scale>%</y_scale>\n" tabs uvMap.V_Tiling to:s
format "%<z_scale>1</z_scale>\n" tabs to:s
format "%<x_mirror>%</x_mirror>\n" tabs (boolToInteger uvMap.u_mirror ) to:s
format "%<y_mirror>%</y_mirror>\n" tabs (boolToInteger uvMap.v_mirror ) to:s
format "%<z_mirror>0</z_mirror>\n" tabs to:s
format "\t\t\t\t\t\t\t</componentTransform>\n" to:s
format "\t\t\t\t\t\t" to:s
make_parameter_xml paramName "componentTransform" (s as string) out handler:"TextureTransformHandler"
)
fn dumpComponentTransformParameterForPoint3MapCoords paramName map out=(
s= stringstream ""
local uvMap
if ((classof map) == VRayHDRI ) then uvMap = map.UVGen
else uvMap = map.coords
-- We don't fully support all the rotation, etc, in our material editor at this point. So I can set these values but they will not be editable.
-- At this time I am just bringing over values that will show up and be editable in our material editor.
format "\n" to:s
tabs ="\t\t\t\t\t\t\t\t"
format "\t\t\t\t\t\t\t<componentTransform>\n" to:s
format "%<x_rotation>%</x_rotation>\n" tabs uvMap.angle.x to:s
format "%<y_rotation>%</y_rotation>\n" tabs uvMap.angle.y to:s
format "%<z_rotation>%</z_rotation>\n" tabs uvMap.angle.z to:s
format "%<x_offset>%</x_offset>\n" tabs uvMap.offset.x to:s
format "%<y_offset>%</y_offset>\n" tabs uvMap.offset.y to:s
format "%<z_offset>%</z_offset>\n" tabs uvMap.offset.z to:s
format "%<x_scale>%</x_scale>\n" tabs uvMap.tiling.x to:s
format "%<y_scale>%</y_scale>\n" tabs uvMap.tiling.y to:s
format "%<z_scale>%</z_scale>\n" tabs uvMap.tiling.z to:s
format "%<x_mirror>0</x_mirror>\n" tabs to:s
format "%<y_mirror>0</y_mirror>\n" tabs to:s
format "%<z_mirror>0</z_mirror>\n" tabs to:s
format "\t\t\t\t\t\t\t</componentTransform>\n" to:s
format "\t\t\t\t\t\t" to:s
make_parameter_xml paramName "componentTransform" (s as string) out handler:"TextureTransformHandler"
)
-- If you want to manually specify the url you can but be careful that it is unique for the vismat you are exporting.
fn dumpUVWGenChannelForMap parentURL map style out uvwURL: undefined =(
if uvwURL == undefined then(
uvwURL = parentURL + "/UVWGenChannel"
)
local uvMap
if ((classof map) == VRayHDRI ) then uvMap = map.UVGen
else uvMap = map.coords
begin_asset uvwURL "UVWGenChannel" "UVW" "" out
make_parameter_xml "uvw_channel" "integer" (uvMap.mapChannel as string) out
if style == listOfMAPCoordsStyles[1] then(
dumpComponentTransformParameterForPoint3MapCoords "uvw_transform" map out
)
else(
if (uvMap.U_Tile) then (
make_parameter_xml "wrap_u" "integer" (1 as string) out
make_parameter_xml "crop_u" "integer" (0 as string) out
) else (
make_parameter_xml "wrap_u" "integer" (0 as string) out
make_parameter_xml "crop_u" "integer" (1 as string) out
)
if (uvMap.V_Tile) then (
make_parameter_xml "wrap_v" "integer" (1 as string) out
make_parameter_xml "crop_v" "integer" (0 as string) out
) else (
make_parameter_xml "wrap_v" "integer" (0 as string) out
make_parameter_xml "crop_v" "integer" (1 as string) out
)
make_parameter_xml "wrap_mode" "integer" (1 as string) out
dumpComponentTransformParameterForMapCoords "uvw_transform" map out
)
end_asset out
return uvwURL
)
fn dumpUVWGenObjectForMap parentURL map style out uvwURL: undefined =(
if uvwURL == undefined then(
uvwURL = parentURL + "/UVWGenObject"
)
begin_asset uvwURL "UVWGenObject" "UVW" "" out
make_parameter_xml "duvw_scale" "float" (1.0 as string) out
if style == listOfMAPCoordsStyles[1] then(
dumpComponentTransformParameterForPoint3MapCoords "uvw_transform" map out
)
else(
dumpComponentTransformParameterForMapCoords "uvw_transform" map out
)
end_asset out
return uvwURL
)
fn dumpUVWGenChannel parentURL map_channel out uvwURL: undefined =(
if uvwURL == undefined then(
uvwURL = parentURL + "/UVWGenChannel"
)
begin_asset uvwURL "UVWGenChannel" "UVW" "" out
make_parameter_xml "uvw_channel" "integer" (map_channel as string) out
end_asset out
return uvwURL
)
fn dumpUVWGenObjectScale parentURL map_scale out uvwURL: undefined =(
if uvwURL == undefined then(
uvwURL = parentURL + "/UVWGenObject"
)
begin_asset uvwURL "UVWGenObject" "UVW" "" out
make_parameter_xml "duvw_scale" "float" (map_scale as string) out
end_asset out
return uvwURL
)
fn dumpBitmapBuffer parentURL map out =(
bitmapURL = parentURL +"/BitmapBuffer"
begin_asset bitmapURL "BitmapBuffer" "bitmap" "" out
resolvedPath = filenamefrompath map.fileName
--print "dumpBitmapBuffer------------------------------------->"
--print "saveDirForBMPFiles:"
--print saveDirForBMPFiles
--if saveDirForBMPFiles != undefined then(
--resolvedPath = saveDirForBMPFiles + "\\" + resolvedPath
--)
gammaval = vrayGetBitmapGamma map
make_parameter_xml "file" "string" resolvedPath out handler:"FileBrowserHandler"
-- The bitmap buffer filter type is in a different order than listed in the 3dsmax ui. It goes "No Filter", "Pyramid", "Summed area"
bitmap_buffer_filter_remap= #( 1, 2, 0 )
-- The +1 is to account for 3dsmax 1-based array index math
make_parameter_xml "filter_type" "integer" bitmap_buffer_filter_remap[map.filtering+1] out handler:"ComboBoxHandler"
make_parameter_xml "filter_blur" "float" map.coords.blur out
make_parameter_xml "color_space" "integer" 1 out
if (gammaval != undefined) then (
make_parameter_xml "gamma" "float" (1.0/gammaval) out
)
end_asset out
return bitmapURL
)
fn dumpTexCombineColor url colorVal texUrl texMult texOn out isColor:true=(
begin_asset url "TexCombineColor" "texture" "" out
if isColor then(
make_color_parameter_xml "color" colorVal out
)else(
colorVal = colorVal * 255
floatColor = Color colorVal colorVal colorVal
make_color_parameter_xml "color" floatColor out
)
if (texUrl != undefined) and (texOn) then(
make_parameter_xml "texture" "acolor texture" texUrl out
)else(
make_parameter_xml "texture" "acolor texture" "" out
)
make_parameter_xml "texture_multiplier" "float" texMult out
end_asset out
)
fn dumpTexVRayHDRI=undefined
fn dumpTexMulti=undefined
fn dumpTexFalloff=undefined
fn dumpTexChecker=undefined
arrBitMapTxtPaths = #()
listNormalBumpFeatures = #()
--saveDirForBMPFiles = undefined
-- Right now we are only going to be handling basic bitmaps
-- parentURL is the url of our parent
-- mapUse is a string to help us come up with unique urls...an example would be passing "Diffuse" if this was a diffuse map or "Reflection" if this was a map being used for reflection
fn dumpMap map parentURL mapUse out =(
if map == undefined then(
return undefined
)
--clOfMAP = classof map
--clOf = classof clOfMAP
--print "dumpMap----classof map METHOD:"
--print clOfMAP
--print clOf
mapUrl = parentURL + "/Texture"
case (classof map) of (
Bitmaptexture:(
--resolvedPath = filenamefrompath map.fileName
--filename = resolvedPath
--FileResolutionManager.getFullFilePath &resolvedPath #Bitmap
resolvedPath = mapPaths.getFullFilePath map.fileName
--print "Source path for bitmap file:"
--print resolvedPath
if resolvedPath != "" then (
appendIfUnique arrBitMapTxtPaths resolvedPath
)
else (
print "WARNING!"
format "Unresolved path for %\n" map.fileName
)
--print filename
dumpTexBitmap mapUrl map out
)
Speckle:(
dumpTexSpeckle mapUrl map out
)
Bricks:(
dumpTexTiles mapUrl map out
)
Mix:(
dumpTexMix mapUrl map out
)
Noise:(
dumpTexNoiseMax mapUrl map out
)
Cellular:(
dumpTexCellular mapUrl map out
)
VRayCompTex:(
dumpTexCompMax mapUrl map out
)
Color_Correction:(
dumpTexColorCorrection mapUrl map out
)
VRayMultiSubTex:(
dumpTexMulti mapUrl map out
)
VRayNormalMap:(
dumpMap map.normal_map parentURL mapUse out
)
Normal_Bump:(
listNormalBumpFeatures = #(map.normal_map,map.map1on,map.mult_spin,map.method)
)
Checker:(
dumpTexChecker mapUrl map out
)
Falloff:(
dumpTexFalloff mapUrl map out
)
VRayHDRI:(
resolvedHDRIPath = mapPaths.getFullFilePath map.HDRIMapName
if resolvedHDRIPath != "" then (
appendIfUnique arrBitMapTxtPaths resolvedHDRIPath
)
else (
print "WARNING!"
format "Unresolved path for %\n" map.HDRIMapName
)
dumpTexVRayHDRI mapUrl map out
)
default:(
format "Map of type %: " (classof map)
format "Unknown map - skipped\n"
)
)
)
-- url will be used as the TexBitmap url we don't build url because this gets done in dumpMap
fn dumpTexBitmap url map out =(
uvwURL = ""
if map.coords.mapping == 0 then(
uvwURL = dumpUVWGenChannelForMap url map listOfMAPCoordsStyles[2] out
)
else if map.coords.mapping == 2 then(
uvwURL = dumpUVWGenObjectForMap url map listOfMAPCoordsStyles[2] out
)
bitmapURL = dumpBitmapBuffer url map out
begin_asset url "TexBitmap" "texture" "" out
make_parameter_xml "uvwgen" "plugin" uvwURL out
make_parameter_xml "bitmap" "plugin" bitmapURL out
-- Placement type in TexBitmap has 3 options, "Whole texture", "Crop", and "Place". I am not sure how "Whole texture" is possible in 3dsmax
-- so this will actually only allow "crop" or "place". We add 1 to bypass "Whole texture", map.cropPlace 0 for crop, 1 for place
make_parameter_xml "placement_type" "integer" (map.cropPlace + 1) out handler:"ComboBoxHandler"
if map.apply then (
make_parameter_xml "u" "float" map.clipu out
make_parameter_xml "v" "float" map.clipv out
make_parameter_xml "w" "float" map.clipw out
make_parameter_xml "h" "float" map.cliph out
if map.cropPlace == 1 and map.useJitter then (
make_parameter_xml "jitter" "float" map.jitter out
)
)
if map.coords.Noise_On then (
make_bool_parameter_xml "uv_noise_on" map.coords.Noise_On out
make_bool_parameter_xml "uv_noise_animate" map.coords.Noise_Animate out
make_parameter_xml "uv_noise_amount" "float" map.coords.Noise_Amount out
make_parameter_xml "uv_noise_levels" "float" map.coords.Noise_Levels out
make_parameter_xml "uv_noise_size" "float" map.coords.Noise_Size out
make_parameter_xml "un_noise_phase" "float" map.coords.phase out
)
make_parameter_xml "alpha_from_intensity" "integer" map.alphaSource out
make_acolortexture_parameter_xml "nouvw_color" (Color 0 0 0 0) out bAlpha:true
end_asset out
)
fn dumpTexSpeckle url map out =(
uvwURL = ""
if map.coords.coordType == 2 then(
uvwURL = dumpUVWGenChannelForMap url map listOfMAPCoordsStyles[1] out
)
else if map.coords.coordType == 0 then(
uvwURL = dumpUVWGenObjectForMap url map listOfMAPCoordsStyles[1] out
)
finalUrl1 = url + "/color1"
texUrl1 = undefined
if map.map1 != undefined then(
--print "dumpTexSpeckle"
--print map.map1
texUrl1 = finalUrl1 + "/Texture"
dumpMap map.map1 finalUrl1 "color1" out
)
finalUrl2 = url + "/color2"
texUrl2 = undefined
if map.map2 != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap map.map2 finalUrl1 "color2" out
)
dumpTexCombineColor finalUrl1 map.color1 texUrl1 1.0 map.map1On out
dumpTexCombineColor finalUrl2 map.color2 texUrl2 1.0 map.map2On out
begin_asset url "TexSpeckle" "texture" "" out
make_parameter_xml "uvwgen" "plugin" uvwURL out
make_parameter_xml "size" "float" map.size out
make_parameter_xml "color1" "acolor texture" finalUrl1 out
make_parameter_xml "color2" "acolor texture" finalUrl2 out
end_asset out
)
fn dumpTexTiles url map out =(
uvwURL = ""
if map.coords.mapping == 0 then(
uvwURL = dumpUVWGenChannelForMap url map listOfMAPCoordsStyles[2] out
)
else if map.coords.mapping == 2 then(
uvwURL = dumpUVWGenObjectForMap url map listOfMAPCoordsStyles[2] out
)
mapMortar = map.Mortar_Map
mapTiles = map.Bricks
finalUrl1 = url + "/color_mortar"
texUrl1 = undefined
if mapMortar != undefined then(
texUrl1 = finalUrl1 + "/Texture"
dumpMap mapMortar finalUrl1 "color_mortar" out
)
finalUrl2 = url + "/color_tiles"
texUrl2 = undefined
if mapTiles != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap mapTiles finalUrl2 "color_tiles" out
)
--dumpTexCombineColor url colorVal texUrl texMult texOn out isColor:true
mortarColor = map.Mortar_Color
tilesColor = map.Brick_Color
dumpTexCombineColor finalUrl1 mortarColor texUrl1 1.0 true out
dumpTexCombineColor finalUrl2 tilesColor texUrl2 1.0 true out
begin_asset url "TexTiles" "texture" "" out
make_parameter_xml "texture_multiplier_mode" "integer" "1" out handler:"ComboBoxHandler" isUserData:true
make_parameter_xml "uvwgen" "plugin" uvwURL out
--dumpTextureParamsListVals parentURL baseParamName out listOfVals isColor:true shouldGammaCorrect:false
dumpTextureParamsListVals url "color_mortar" out #(mortarColor, mapMortar, 1.0, true) isColor:true
dumpTextureParamsListVals url "color_tiles" out #(tilesColor, mapTiles, 1.0, true) isColor:true
make_parameter_xml "horizontal_count" "float" map.Horizontal_Count out
make_parameter_xml "vertical_count" "float" map.Vertical_Count out
make_parameter_xml "color_variance" "float" map.Color_Variance out
make_parameter_xml "fade_variance" "float" map.Fade_Variance out
make_parameter_xml "horizontal_gap" "float" map.Horizontal_Gap out
make_parameter_xml "vertical_gap" "float" map.Vertical_Gap out
make_parameter_xml "holes" "integer" map.Holes out
make_parameter_xml "edge_roughness" "float" map.Edge_Roughness out
make_parameter_xml "random_seed" "integer" map.Random_Seed out
make_parameter_xml "line_shift" "float" map.Line_Shift out
make_parameter_xml "random_shift" "float" map.Random_Shift out
make_parameter_xml "row_modify" "bool" map.Use_Row_Edit out
make_parameter_xml "per_row" "integer" map.Per_Row out
make_parameter_xml "row_change" "float" map.Change_Row out
make_parameter_xml "column_modify" "bool" map.Use_Column_Edit out
make_parameter_xml "per_column" "integer" map.Per_Column out
make_parameter_xml "column_change" "float" map.Change_Column out
end_asset out
)
fn dumpTexMix url map out =(
map1 = map.map1
map2 = map.map2
mixMap = map.mask
finalUrl1 = url + "/color1"
texUrl1 = undefined
if map1 != undefined then(
texUrl1 = finalUrl1 + "/Texture"
dumpMap map1 finalUrl1 "color1" out
)
finalUrl2 = url + "/color2"
texUrl2 = undefined
if map2 != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap map2 finalUrl2 "color2" out
)
finalUrl3 = url + "/mix_map"
texUrl3 = ""
if mixMap != undefined then(
texUrl3 = finalUrl3 + "/Texture"
dumpMap mixMap finalUrl3 "mix_map" out
)
mapColor1 = map.color1
mapColor2 = map.color2
mixColor = ( Color 0.5 0.5 0.5 )
map1On = map.map1Enabled
map2On = map.map2Enabled
mixOn = map.maskEnabled
dumpTexCombineColor finalUrl1 mapColor1 texUrl1 1.0 map1On out
dumpTexCombineColor finalUrl2 mapColor2 texUrl2 1.0 map2On out
dumpTexCombineColor finalUrl3 mixColor texUrl3 1.0 mixOn out
begin_asset url "TexMix" "texture" "" out
dumpTextureParamsListVals url "color1" out #(mapColor1, map1, 1.0, map1On) isColor:true
dumpTextureParamsListVals url "color2" out #(mapColor2, map2, 1.0, map2On) isColor:true
dumpTextureParamsListVals url "mix_map" out #(mixColor, mixMap, 1.0, mixOn) isColor:true
make_parameter_xml "mix_amount" "float" ( map.mixAmount as float/100.0 ) out
useCurveVal = boolToInteger(map.useCurve)
make_parameter_xml "use_curve" "integer" useCurveVal out
make_parameter_xml "transition_lower" "float" map.lower out
make_parameter_xml "transition_upper" "float" map.upper out
end_asset out
)
fn dumpTexNoiseMax url map out =(
--uvwURL = dumpUVWGenChannel url map.coords.mapChannel out
uvwURL = ""
if map.coords.coordType == 2 then(
uvwURL = dumpUVWGenChannelForMap url map listOfMAPCoordsStyles[1] out
)
else if map.coords.coordType == 0 then(
uvwURL = dumpUVWGenObjectForMap url map listOfMAPCoordsStyles[1] out
)
map1 = map.map1
map2 = map.map2
finalUrl1 = url + "/color1"
texUrl1 = undefined
if map1 != undefined then(
texUrl1 = finalUrl1 + "/Texture"
dumpMap map1 finalUrl1 "color1" out
)
finalUrl2 = url + "/color2"
texUrl2 = undefined
if map2 != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap map2 finalUrl2 "color2" out
)
mapColor1 = map.color1
mapColor2 = map.color2
map1On = map.map1Enabled
map2On = map.map2Enabled
dumpTexCombineColor finalUrl1 mapColor1 texUrl1 1.0 map1On out
dumpTexCombineColor finalUrl2 mapColor2 texUrl2 1.0 map2On out
begin_asset url "TexNoiseMax" "texture" "" out
make_parameter_xml "uvwgen" "plugin" uvwURL out
dumpTextureParamsListVals url "color1" out #(mapColor1, map1, 1.0, map1On) isColor:true
dumpTextureParamsListVals url "color2" out #(mapColor2, map2, 1.0, map2On) isColor:true
make_parameter_xml "size" "float" map.size out
make_parameter_xml "phase" "float" map.phase out
make_parameter_xml "iterations" "float" map.levels out
make_parameter_xml "low" "float" map.thresholdLow out
make_parameter_xml "high" "float" map.thresholdHigh out
make_parameter_xml "type" "integer" map.type out
end_asset out
)
fn dumpTexFalloff url map out =(
map1 = map.map1
map2 = map.map2
finalUrl1 = url + "/color1"
texUrl1 = undefined
if map1 != undefined then(
texUrl1 = finalUrl1 + "/Texture"
dumpMap map1 finalUrl1 "color1" out
)
finalUrl2 = url + "/color2"
texUrl2 = undefined
if map2 != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap map2 finalUrl2 "color2" out
)
mapColor1 = map.color1
mapColor2 = map.color2
mapMult1 = map.map1Amount as float/100.0
mapMult2 = map.map2Amount as float/100.0
map1On = map.map1On
map2On = map.map2On
dumpTexCombineColor finalUrl1 mapColor1 texUrl1 mapMult1 map1On out
dumpTexCombineColor finalUrl2 mapColor2 texUrl2 mapMult2 map2On out
begin_asset url "TexFalloff" "texture" "" out
dumpTextureParamsListVals url "color1" out #(mapColor1, map1, mapMult1, map1On) isColor:true
dumpTextureParamsListVals url "color2" out #(mapColor2, map2, mapMult2, map2On) isColor:true
make_parameter_xml "type" "integer" map.type out
if map.direction == 4 then (
make_parameter_xml "direction_type" "integer" 3 out
)
else if map.direction == 3 then (
make_parameter_xml "direction_type" "integer" 4 out
)
else (
make_parameter_xml "direction_type" "integer" map.direction out
)
make_parameter_xml "fresnel_ior" "float" map.ior out
make_bool_parameter_xml "dist_extrapolate" map.extrapolateOn out
make_parameter_xml "dist_near" "float" map.nearDistance out
make_parameter_xml "dist_far" "float" map.farDistance out
end_asset out
)
fn dumpTexChecker url map out =(
if map.coords.mappingType > 0 then return undefined
uvwURL = ""
if map.coords.mapping == 0 then(
uvwURL = dumpUVWGenChannelForMap url map listOfMAPCoordsStyles[2] out
)
else if map.coords.mapping == 2 then(
uvwURL = dumpUVWGenObjectForMap url map listOfMAPCoordsStyles[2] out
)
map1 = map.map1
map2 = map.map2
finalUrl1 = url + "/black_color"
texUrl1 = undefined
if map1 != undefined then(
texUrl1 = finalUrl1 + "/Texture"
dumpMap map1 finalUrl1 "black_color" out
)
finalUrl2 = url + "/white_color"
texUrl2 = undefined
if map2 != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap map2 finalUrl2 "white_color" out
)
mapColor1 = map.color1
mapColor2 = map.color2
map1On = map.map1Enabled
map2On = map.map2Enabled
dumpTexCombineColor finalUrl1 mapColor1 texUrl1 1.0 map1On out
dumpTexCombineColor finalUrl2 mapColor2 texUrl2 1.0 map2On out
begin_asset url "TexChecker" "texture" "" out
make_parameter_xml "uvwgen" "plugin" uvwURL out
dumpTextureParamsListVals url "white_color" out #(mapColor2, map2, 1.0, map2On) isColor:true
dumpTextureParamsListVals url "black_color" out #(mapColor1, map1, 1.0, map1On) isColor:true
make_parameter_xml "uv_noise_on" "integer" (boolToInteger map.coords.Noise_On) out
make_parameter_xml "uv_noise_amount" "float" map.coords.Noise_Amount out
make_parameter_xml "uv_noise_levels" "float" map.coords.Noise_Levels out
make_parameter_xml "uv_noise_size" "float" map.coords.Noise_Size out
make_parameter_xml "un_noise_phase" "float" map.coords.phase out
end_asset out
)
fn dumpTexCellular url map out =(
uvwURL = ""
if map.coords.coordType == 2 then(
uvwURL = dumpUVWGenChannelForMap url map listOfMAPCoordsStyles[1] out
)
else if map.coords.coordType == 0 then(
uvwURL = dumpUVWGenObjectForMap url map listOfMAPCoordsStyles[1] out
)
mapCell = map.cellMap
mapDiv1 = map.divMap1
mapDiv2 = map.divMap2
finalUrl1 = url + "/center_color"
texUrl1 = ""
if mapCell != undefined then(
texUrl1 = finalUrl1 + "/Texture"
dumpMap mapCell finalUrl1 "center_color" out
)
finalUrl2 = url + "/edge_color"
texUrl2 = ""
if mapDiv1 != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap mapDiv1 finalUrl2 "edge_color" out
)
finalUrl3 = url + "/bg_color"
texUrl3 = ""
if mapDiv2 != undefined then(
texUrl3 = finalUrl3 + "/Texture"
dumpMap mapDiv2 finalUrl3 "bg_color" out
)
mapCellColor = map.cellColor
mapDiv1Color = map.divColor1
mapDiv2Color = map.divColor2
mapCellOn = map.map1Enabled
mapDiv1On = map.map2Enabled
mapDiv2On = map.map3Enabled
dumpTexCombineColor finalUrl1 mapCellColor texUrl1 1.0 mapCellOn out
dumpTexCombineColor finalUrl2 mapDiv1Color texUrl2 1.0 mapDiv1On out
dumpTexCombineColor finalUrl3 mapDiv2Color texUrl3 1.0 mapDiv2On out
begin_asset url "TexCellular" "texture" "" out
make_parameter_xml "uvwgen" "plugin" uvwURL out
dumpTextureParamsListVals url "center_color" out #(mapCellColor, mapCell, 1.0, mapCellOn) isColor:true
dumpTextureParamsListVals url "edge_color" out #(mapDiv1Color, mapDiv1, 1.0, mapDiv1On) isColor:true
dumpTextureParamsListVals url "bg_color" out #(mapDiv2Color, mapDiv2, 1.0, mapDiv2On) isColor:true
make_parameter_xml "size" "float" map.size out
make_parameter_xml "spread" "float" map.spread out
make_parameter_xml "type" "integer" map.type out
make_bool_parameter_xml "fractal" map.fractal out
make_parameter_xml "fractal_iterations" "float" map.iteration out
make_parameter_xml "fractal_roughness" "float" map.roughness out
make_parameter_xml "low" "float" map.lowThresh out
make_parameter_xml "middle" "float" map.midThresh out
make_parameter_xml "high" "float" map.highThresh out
end_asset out
)
fn dumpTexCompMax url map out =(
mapSourceA = map.sourceA
mapSourceB = map.sourceB
finalUrl1 = url + "/sourceA"
texUrl1 = ""
if mapSourceA != undefined then(
texUrl1 = finalUrl1 + "/Texture"
dumpMap mapSourceA finalUrl1 "sourceA" out
)
finalUrl2 = url + "/sourceB"
texUrl2 = ""
if mapSourceB != undefined then(
texUrl2 = finalUrl2 + "/Texture"
dumpMap mapSourceB finalUrl2 "sourceB" out
)
begin_asset url "TexCompMax" "texture" "" out
make_parameter_xml "sourceA" "acolor texture" texUrl1 out handler:"TextureHandler"
make_parameter_xml "sourceB" "acolor texture" texUrl2 out handler:"TextureHandler"
make_parameter_xml "operator" "integer" map.operator out
end_asset out
)
fn dumpTexColorCorrection url map out =(
colcormap = map.map
finalUrl = url + "/texture_map"
texUrl = ""
if colcormap != undefined then(
texUrl = finalUrl + "/Texture"
dumpMap colcormap finalUrl "texture_map" out
)
begin_asset url "ColorCorrection" "texture" "" out
make_parameter_xml "texture_map" "acolor texture" texUrl out handler:"TextureHandler"
make_color_parameter_xml "source_color" map.color out gammaCorrect:false
make_parameter_xml "rewire_red" "integer" map.rewireR out
make_parameter_xml "rewire_green" "integer" map.rewireG out
make_parameter_xml "rewire_blue" "integer" map.rewireB out
make_parameter_xml "rewire_alpha" "integer" map.rewireA out
make_parameter_xml "hue_shift" "float" map.hueShift out
make_parameter_xml "saturation" "float" map.saturation out
make_color_parameter_xml "hue_tint" map.tint out gammaCorrect:false
make_parameter_xml "tint_strength" "float" map.tintStrength out
make_parameter_xml "brightness" "float" map.brightness out
make_parameter_xml "contrast" "float" map.contrast out
make_parameter_xml "lightness_mode" "integer" map.lightnessMode out
end_asset out
)
fn dumpTexAColorFromColor url inColor out=(
begin_asset url "TexAColor" "texture" "" out
make_parameter_xml "texture" "acolor texture" (vraymax_color_to_xml_string inColor) out handler:"ColorPickerHandler"
end_asset out
)
fn dumpTexMulti url map out =(
mapDefault = map.default_texmap
finalUrl = url + "/default_texture"
texUrl = ""
if mapDefault != undefined then(
texUrl = finalUrl + "/Texture"
dumpMap mapDefault finalUrl "default_texture" out
)
local listOfTexMaps = map.texmap
local finalURLList = #()
local texURLList = #()
local entry = "multitex%"
s= stringstream ""
for i=1 to listOfTexMaps.count do (
format entry map.texmap_id[i] to:s
ifinalUrl = url + "/" + (s as string)
itexUrl = ""
if listOfTexMaps[i] != undefined then(
itexUrl = ifinalUrl + "/Texture"
dumpMap listOfTexMaps[i] ifinalUrl (s as string) out
)
append finalURLList ifinalUrl
append texURLList itexUrl
free s
)
mapDefaultColor = map.default_color
mapDefaultMult = map.default_texmap_mult / 100.0f
mapDefaultOn = map.default_texmap_on
dumpTexCombineColor finalUrl mapDefaultColor texUrl mapDefaultMult mapDefaultOn out
for i=1 to listOfTexMaps.count do (
dumpTexCombineColor finalURLList[i] map.texmap_color[i] texURLList[i] (map.texmap_mult[i] / 100.0f) map.texmap_mapOn[i] out
)
begin_asset url "TexMulti" "texture" "" out
make_parameter_xml "mode" "integer" map.fro-m_id out
dumpTextureParamsListVals url "default_texture" out #(mapDefaultColor, mapDefault, mapDefaultMult, mapDefaultOn) isColor:true
make_list_parameter_xml "ids_list" "integer" "list" map.texmap_id out
make_list_parameter_xml "textures_list" "plugin" "list" finalURLList out
end_asset out
)
fn dumpTexVRayHDRI url map out =(
uvwURL = ""
if map.UVGen.mapping == 0 then(
uvwURL = dumpUVWGenChannelForMap url map listOfMAPCoordsStyles[2] out
)
else if map.UVGen.mapping == 2 then(
uvwURL = dumpUVWGenObjectForMap url map listOfMAPCoordsStyles[2] out
)
--dump BitmapBuffer
local bitmapURL = url +"/TexBitmap/BitmapBuffer"
begin_asset bitmapURL "BitmapBuffer" "bitmap" "" out
resolvedPath = filenamefrompath map.HDRIMapName
make_parameter_xml "file" "string" resolvedPath out handler:"FileBrowserHandler"
-- The bitmap buffer filter type is in a different order than listed in the 3dsmax ui. It goes "No Filter", "Pyramid", "Summed area"
--bitmap_buffer_filter_remap= #( 1, 2, 0 )
-- The +1 is to account for 3dsmax 1-based array index math
make_parameter_xml "filter_type" "integer" 1 out handler:"ComboBoxHandler"
make_parameter_xml "filter_blur" "float" map.UVGen.blur out
make_parameter_xml "color_space" "integer" 0 out
make_parameter_xml "gamma" "float" 1.0 out
end_asset out
local multiplier = map.multiplier * map.renderMultiplier
local colorspace = map.color_space
local custgamma = 1.0
if colorspace == 3 then (
local filetype = getFilenameType map.HDRIMapName
if toLower(filetype) == ".exr" then (
colorspace = 0
custgamma = 1.0
) else (
colorSpace=1;
custgamma = vrayGetBitmapGamma map
if (gammaval != undefined) then (
custgamma = 1.0 / custgamma
) else (
custgamma = 1.0
)
)
)
if colorspace == 1 then (
custgamma = map.gamma
)
--If we have any modifications to the color space or the gamma, apply a TexMaxGamma
local texMaxGammaCreate = (colorspace!=0 or abs(custgamma-1.0)>1e-6 or abs(multiplier-1.0)>1e-6)
local texBitmapURL = url
if texMaxGammaCreate then texBitmapURL = url +"/TexBitmap"
begin_asset texBitmapURL "TexBitmap" "texture" "" out
make_parameter_xml "uvwgen" "plugin" uvwURL out
make_parameter_xml "bitmap" "plugin" bitmapURL out
-- Placement type in TexBitmap has 3 options, "Whole texture", "Crop", and "Place". I am not sure how "Whole texture" is possible in 3dsmax
-- so this will actually only allow "crop" or "place". We add 1 to bypass "Whole texture", map.cropPlace 0 for crop, 1 for place
local mapCropPlace = 0
if map.cropplace_on then (
case cropplace_mode of (
0: (
mapCropPlace = 1
)
1: (
mapCropPlace = 2
)
)
)
make_parameter_xml "placement_type" "integer" mapCropPlace out handler:"ComboBoxHandler"
make_parameter_xml "alpha_from_intensity" "integer" map.alphaSource out
make_acolortexture_parameter_xml "nouvw_color" (Color 0 0 0 0) out bAlpha:true
end_asset out
if texMaxGammaCreate then (
begin_asset url "TexMaxGamma" "texture" "" out
make_parameter_xml "input" "acolor texture" texBitmapURL out handler:"TextureHandler"
make_parameter_xml "multiplier" "float" map.multiplier out
make_parameter_xml "color_space" "integer" colorspace out
make_parameter_xml "gamma" "float" custgamma out
end_asset out
)
)
fn getParamType param =(
case( classof param) of (
Color:(
return "color"
)
worldUnits:(
return "float"
)
Float:(
return "float"
)
BooleanClass:(
return "bool"
)
integer:(
return "integer"
)
default:(
return "plugin"
)
)
)
-- If you need to manually specify the type you can pass in the V-Ray parameter type otherwise we'll just try to get it from the classof param
fn dumpParam param paramName out paramType:undefined paramValue:undefined gammaCorrect:undefined isUserData:undefined handler:"default"= (
if param == undefined then
return undefined
paramType = paramType
if paramType == undefined then(
paramType = getParamType param
)
case( paramType ) of(
"color":(
make_color_parameter_xml paramName param out gammaCorrect:gammaCorrect isUserData:isUserData handler:handler
)
"plugin":(
-- to make this a bit easier I'm going to make sure I pass the url
if paramValue != undefined then(
make_parameter_xml paramName "plugin" paramValue out gammaCorrect:gammaCorrect isUserData:isUserData handler:handler
)
)
"bool":(
-- bools don't go into integers without a bit of coercion.
make_bool_parameter_xml paramName param out isUserData:isUserData handler:handler
)
default:(
-- most of our types can just be made generically in their string form
make_parameter_xml paramName paramType (param as string) out gammaCorrect:gammaCorrect isUserData:isUserData handler:handler
)
)
)
-- Some of our color/tex param names don't follow the same protocol so we need to account for them if we want this automated
-- I couldn't see a way to make a lookup table, so I am just using 2 arrays and making sure I place the related names at the same index in each
param_lookup=#("roughness", "hilightGlossiness", "reflectionGlossiness", "reflectionIOR", "refractionGlossiness", "refractionIOR", "translucent", "translucency")
color_lookup=#("diffuse_roughness", "hilight_glossiness", "reflection_glossiness", "reflection_ior", "refraction_glossiness", "refraction_ior", "translucency_color", "translucency")
vraymtl_params = getPropNames(VRayMtl)
vray2sidedmtl_params = getPropNames(VRay2SidedMtl)
-- Some helpers that exist in our userdata params for BRDFVRayMtl do not actually exist as 3dsmax params, so we need to set defaults or our TexCombineColor
-- may not get setup properly
-- although the name is "color", in the case of float params it does expect a float
default_color_names=#("opacity", "environment", "translucency")
default_color_values=#( 1.0, (Color 0 0 0 ), (Color 0 0 0 ) )
-- This will evaluate mat.property
-- mat should be a VRayMtl instance
-- property should be a string
fn execVRayMtlParam mat property=(
-- execute only works on global scope
global execParam_current_object
execParam_current_object = mat
specialParamIndex = findItem param_lookup property
-- some of our params don't follow the naming protocol that others follow
if specialParamIndex > 0 then(
property = color_lookup[specialParamIndex]
)
propIdx = findItem vraymtl_params (property as name)
if propIdx <= 0 then(
return undefined
)
--return execute( "execParam_current_object." + property )
return getproperty mat property
)
fn execVRay2SidedMtlParam mat property=(
specialParamIndex = findItem param_lookup property
-- some of our params don't follow the naming protocol that others follow
if specialParamIndex > 0 then(
property = color_lookup[specialParamIndex]
)
propIdx = findItem vray2sidedmtl_params (property as name)
if propIdx <= 0 then(
return undefined
)
return getproperty mat property
)
-- This will return a list that contains the colorVal / floatVal, the texture, the tex mult, and the tex on flag
fn getTextureParamList mat maxParamName isColor:true=(
--print "getTextureParamList START"
--print mat
--print (classof mat)
--print maxParamName
case( classof mat )of(
VRayMtl:(
colorVal = execVRayMtlParam mat maxParamName
--print colorVal
texVal = execVRayMtlParam mat ("texmap_" + maxParamName)
--print texVal
texOnVal = execVRayMtlParam mat ("texmap_" + maxParamName + "_on" )
texMultVal = execVRayMtlParam mat ("texmap_" + maxParamName + "_multiplier" )
)
VRay2SidedMtl:(
colorVal = execVRay2SidedMtlParam mat maxParamName
--print colorVal
texVal = execVRay2SidedMtlParam mat ("texmap_" + maxParamName)
--print texVal
texOnVal = execVRay2SidedMtlParam mat ("texmap_" + maxParamName + "_on" )
texMultVal = execVRay2SidedMtlParam mat ("texmap_" + maxParamName + "_multiplier" )
)
Standardmaterial:(
if maxParamName == undefined then (
colorVal = (Color 0 0 0)
texVal = undefined
texOnVal = undefined
texMultVal = undefined
)
else(
colorVal = getproperty mat maxParamName
texVal = getproperty mat (maxParamName + "Map")
texOnVal = getproperty mat (maxParamName + "MapEnable")
texMultVal = getproperty mat (maxParamName + "MapAmount")
)
)
default:(
)
)
-- We default to texture on as true, texture mult as 1.0 and color as black
if texOnVal == undefined then(
texOnVal = true
)
if texMultVal == undefined then(
texMultVal = 100
)
if colorVal == undefined then (
defColorIndex = findItem default_color_names maxParamName
if defColorIndex > 0 then(
colorVal = default_color_values[defColorIndex]
)else(
format "unknown default color value for parameter \"%\"\n" maxParamName
)
)
return #(colorVal, texVal, texMultVal, texOnVal )
)
-- url will be the total top-level url,
-- paramName is the name of BRDFVRayMtl parameter
-- mat is the VRayMtl
-- maxParamName is the name of the parameter in the 3dsmax VRayMtl
-- specify isColor:false for float parameters
fn dumpColorTexHandlerParam url paramName mat maxParamName out isColor:true=(
finalUrl = url + "/" + paramName
paramVals = getTextureParamList mat maxParamName isColor:isColor
colorVal = paramVals[1]
texVal = paramVals[2]
texMultVal = paramVals[3]
texOnVal = paramVals[4]
texUrl = undefined
if texVal != undefined then(
texUrl = finalUrl + "/Texture"
)
dumpMap texVal finalUrl paramName out
dumpTexCombineColor finalUrl colorVal texUrl (texMultVal as float / 100.0) texOnVal out isColor:isColor
)
-- This function dumps the 4 userdata params that are plugged into a TexCombineColor.
-- Generally, there will be a color/float, a texture, a texture multiplier, and a texture enable value.
-- The final parameter set will reference the TexCombineColor asset that reduces to the actual BRDFVRayMtl parameter
fn dumpTextureParams parentURL baseParamName mat maxParamName out isColor:true shouldGammaCorrect:false=(
texCombineColorUrl = (parentURL + "/" + baseParamName)
handlerName = ""
colorParamName = ""
paramType = ""
if isColor then(
handlerName = "ColorTexFrameHandler"
colorParamName = baseParamName +"_color"
paramType = "acolor texture"
)else(
handlerName = "FloatTexFrameHandler"
colorParamName = baseParamName +"_float"
paramType = "float texture"
)
gammaCorrectValue = undefined
if shouldGammaCorrect then(
gammaCorrectValue = true
)
-- Our actual tex combine url
make_parameter_xml baseParamName paramType texCombineColorUrl out gammaCorrect:gammaCorrectValue handler:handlerName
-- the 3dsmax parameter values
paramVals = getTextureParamList mat maxParamName isColor:isColor
colorVal = paramVals[1]
texVal = paramVals[2]
texMultVal = paramVals[3]
texOnVal = paramVals[4]
-- the underlying userdata params we use in our xml to store the info that will be fed to the TexCombineColor
texParamName = baseParamName+ "_tex"
texMultParamName = baseParamName + "_tex_mult"
texOnParamName = baseParamName + "_tex_on"
-- And the userdata params we use to setup the TexCombineColor
texUrl = ""
if texVal != undefined then(
texUrl = (texCombineColorURL+"/Texture" )
)
dumpParam texUrl texParamName out paramType:"acolor texture" paramValue:texUrl isUserData:true handler:"TextureHandler"
dumpParam (texMultVal as float / 100.0f) texMultParamName out isUserData:true
dumpParam texOnVal texOnParamName out isUserData:true
dumpParam colorVal colorParamName out isUserData:true
)
fn dumpTextureParamsListVals parentURL baseParamName out listOfVals isColor:true shouldGammaCorrect:false=(
texCombineColorUrl = (parentURL + "/" + baseParamName)
handlerName = ""
colorParamName = ""
paramType = ""
if isColor then(
handlerName = "ColorTexFrameHandler"
colorParamName = baseParamName +"_color"
paramType = "acolor texture"
)else(
handlerName = "FloatTexFrameHandler"
colorParamName = baseParamName +"_float"
paramType = "float texture"
)
gammaCorrectValue = undefined
if shouldGammaCorrect then(
gammaCorrectValue = true
)
-- Our actual tex combine url
make_parameter_xml baseParamName paramType texCombineColorUrl out gammaCorrect:gammaCorrectValue handler:handlerName
colorVal = listOfVals[1]
texVal = listOfVals[2]
texMultVal = listOfVals[3]
texOnVal = listOfVals[4]
-- the underlying userdata params we use in our xml to store the info that will be fed to the TexCombineColor
texParamName = baseParamName+ "_tex"
texMultParamName = baseParamName + "_tex_mult"
texOnParamName = baseParamName + "_tex_on"
-- And the userdata params we use to setup the TexCombineColor
texUrl = ""
if texVal != undefined then(
texUrl = (texCombineColorURL+"/Texture" )
)
dumpParam texUrl texParamName out paramType:"acolor texture" paramValue:texUrl isUserData:true handler:"TextureHandler"
dumpParam texMultVal texMultParamName out isUserData:true
dumpParam texOnVal texOnParamName out isUserData:true
dumpParam colorVal colorParamName out isUserData:true
)
-- This function actually writes out the Texture plugins, it needs to be called prior to serializing the owner asset
-- mat is the VRayMtl to grab maps from
-- parentURL is the url to use as the parent of the textures
fn dumpVRayMtlTexmaps mat parentURL out isTexValOpacity:true doExportEnvironment:false=(
if mat == undefined then(
return undefined
)
dumpColorTexHandlerParam parentURL "diffuse" mat "diffuse" out
dumpColorTexHandlerParam parentURL "roughness" mat "roughness" out isColor:false
dumpColorTexHandlerParam parentURL "reflect" mat "reflection" out
dumpColorTexHandlerParam parentURL "hilight_glossiness" mat "hilightGlossiness" out isColor:false
dumpColorTexHandlerParam parentURL "reflect_glossiness" mat "reflectionGlossiness" out isColor:false
dumpColorTexHandlerParam parentURL "anisotropy" mat "anisotropy" out isColor:false
dumpColorTexHandlerParam parentURL "anisotropy_rotation" mat "anisotropy_rotation" out isColor:false
dumpColorTexHandlerParam parentURL "fresnel_ior" mat "reflectionIOR" out isColor:false
dumpColorTexHandlerParam parentURL "refract" mat "refraction" out
dumpColorTexHandlerParam parentURL "refract_glossiness" mat "refractionGlossiness" out isColor:false
dumpColorTexHandlerParam parentURL "refract_ior" mat "refractionIOR" out isColor:false
dumpColorTexHandlerParam parentURL "translucency_color" mat "translucent" out
if isTexValOpacity then(
dumpColorTexHandlerParam parentURL "opacity" mat "opacity" out isColor:false
)
if doExportEnvironment then(
dumpColorTexHandlerParam parentURL "environment_override" mat "environment" out
)
dumpUVWGenChannel parentURL mat.anisotropy_channel out uvwURL:(parentURL + "/AnisoUVWGen")
-- These would actually require separate materials they are not currently supported as vismats
--.texmap_bump : texturemap
--.texmap_displacement : texturemap
-- maps
--dumpMap mat.texmap_environment parentURL "Environment" out
--dumpMap mat.texmap_opacity parentURL "Opacity" out
)
-- This function fills out the parameters for the BRDFVRayMtl itself
fn dumpBRDFVRayMtl mat out basemat:undefined = (
if mat == undefined then(
return undefined
)
local brdfURL = ""
if (basemat != undefined) then (
brdfURL = "/" + basemat + "/BRDFVRayMtl"
)
else (
brdfURL = "/" + mat.name + "/BRDFVRayMtl"
)
-- params not in BRDFVRayMtl
--.option_traceDiffuse : boolean
--.effect_id : integer
--.override_effect_id : boolean
--.option_clampTextures : boolean
texVal = execVRayMtlParam mat "texmap_opacity"
texValEnvironment = execVRayMtlParam mat "texmap_environment"
--print "######################dumpBRDFVRayMtl#########################"
--format "material % diffuse color: % \n" mat.name mat.diffuse
--format "material % diffuse texmap multiplier: % \n" mat.name mat.texmap_diffuse_multiplier
--print texVal
bTexVal = (texVal != undefined)
bExportEnvironment = (texValEnvironment != undefined)
--print bTexVal
-- Need to look for texmaps and write them out before we write out our brdf
dumpVRayMtlTexmaps mat brdfURL out isTexValOpacity:bTexVal doExportEnvironment:bExportEnvironment
begin_asset brdfURL "BRDFVRayMtl" "BRDF" "BRDFVRayMtlLayout" out
-- reflection
dumpParam mat.reflection_subdivs "reflect_subdivs" out
dumpParam mat.reflection_fresnel "fresnel" out
dumpParam mat.reflection_maxDepth "reflect_depth" out
dumpParam mat.reflection_exitColor "reflect_exit_color" out
dumpParam mat.reflection_fresnel "fresnel" out
dumpParam mat.reflection_useInterpolation "refl_interpolation_on" out
dumpParam mat.reflection_lockGlossiness "hilight_glossiness_lock" out
dumpParam mat.reflection_lockIOR "fresnel_ior_lock" out
dumpParam mat.reflection_dimDistance "reflect_dim_distance" out
dumpParam mat.reflection_dimDistance_on "reflect_dim_distance_on" out
dumpParam mat.reflection_dimDistance_falloff "reflect_dim_distance_falloff" out
dumpParam mat.reflection_affectAlpha "reflect_affect_alpha" out
-- refraction
dumpParam mat.refraction_subdivs "refract_subdivs" out
dumpParam mat.refraction_fogColor "fog_color" out
dumpParam mat.refraction_fogMult "fog_mult" out
dumpParam mat.refraction_fogBias "fog_bias" out
dumpParam mat.refraction_affectShadows "refract_affect_shadows" out
dumpParam mat.refraction_affectAlpha "refract_affect_alpha" out
dumpParam mat.refraction_maxDepth "refract_depth" out
dumpParam mat.refraction_exitColor "refract_exit_color" out
dumpParam mat.refraction_useExitColor "refract_exit_color_on" out
dumpParam mat.refraction_useInterpolation "refr_interpolation_on" out
dumpParam mat.refraction_dispersion "dispersion" out
dumpParam mat.refraction_dispersion_on "dispersion_on" out
dumpParam mat.translucency_on "translucency" out
dumpParam mat.translucency_thickness "translucency_thickness" out
dumpParam mat.translucency_scatterCoeff "translucency_scatter_coeff" out
dumpParam mat.translucency_fbCoeff "translucency_scatter_dir" out
dumpParam mat.translucency_multiplier "translucency_light_mult" out
-- brdf
dumpParam mat.brdf_type "brdf_type" out
dumpParam mat.anisotropy_derivation "anisotropy_derivation" out
dumpParam mat.anisotropy_axis "anisotropy_axis" out
-- we build a uvwgenchannel based on mat.anisotropy_channel in our dumpMaps function
make_parameter_xml "anisotropy_uvwgen" "plugin" (brdfURL + "/AnisoUVWGen") out
dumpParam mat.soften "hilight_soften" out
-- options
dumpParam mat.brdf_fixDarkEdges "option_fix_dark_edges" out
dumpParam mat.option_traceReflection "reflect_trace" out
dumpParam mat.option_traceRefraction "refract_trace" out
dumpParam mat.option_doubleSided "option_double_sided" out
dumpParam mat.option_reflectOnBack "option_reflect_on_back" out
dumpParam mat.option_useIrradMap "option_use_irradiance_map" out
dumpParam mat.refraction_fogUnitsScale_on "fog_unit_scale_on" out
dumpParam mat.option_cutOff "option_cutoff" out
dumpParam mat.preservationMode "option_energy_mode" out
dumpParam mat.option_environment_priority "environment_priority" out
dumpParam mat.option_traceDiffuseAndGlossy "option_glossy_rays_as_gi" out
-- This is a userdata param that marks this material as 3dsmax compatible, it uses multipliers as a blend amount, not a scalar multiplier
make_parameter_xml "texture_multiplier_mode" "integer" "1" out handler:"ComboBoxHandler" isUserData:true
-- interpolation
dumpParam mat.reflect_minRate "refl_imap_min_rate" out
dumpParam mat.reflect_maxRate "refl_imap_max_rate" out
dumpParam mat.reflect_interpSamples "refl_imap_samples" out
dumpParam mat.reflect_colorThreshold "refl_imap_color_thresh" out
dumpParam mat.reflect_normalThreshold "refl_imap_norm_thresh" out
dumpParam mat.refract_minRate "refr_imap_min_rate" out
dumpParam mat.refract_maxRate "refr_imap_max_rate" out
dumpParam mat.refract_interpSamples "refr_imap_samples" out
dumpParam mat.refract_colorThreshold "refr_imap_color_thresh" out
dumpParam mat.refract_normalThreshold "refr_imap_norm_thresh" out
-- maps
dumpTextureParams brdfURL "diffuse" mat "diffuse" out shouldGammaCorrect:true
dumpTextureParams brdfURL "roughness" mat "roughness" out isColor:false
dumpTextureParams brdfURL "reflect" mat "reflection" out
dumpTextureParams brdfURL "hilight_glossiness" mat "hilightGlossiness" out isColor:false
dumpTextureParams brdfURL "reflect_glossiness" mat "reflectionGlossiness" out isColor:false
dumpTextureParams brdfURL "anisotropy" mat "anisotropy" out isColor:false
dumpTextureParams brdfURL "anisotropy_rotation" mat "anisotropy_rotation" out isColor:false
dumpTextureParams brdfURL "fresnel_ior" mat "reflectionIOR" out isColor:false
dumpTextureParams brdfURL "refract" mat "refraction" out
dumpTextureParams brdfURL "refract_glossiness" mat "refractionGlossiness" out isColor:false
dumpTextureParams brdfURL "refract_ior" mat "refractionIOR" out isColor:false
dumpTextureParams brdfURL "translucency_color" mat "translucent" out
if bTexVal then(
dumpTextureParams brdfURL "opacity" mat "opacity" out isColor:false
)
if bExportEnvironment then(
dumpTextureParams brdfURL "environment_override" mat "environment" out shouldGammaCorrect:true
)
-- The following maps would require additional material types / support that is currently not available for our material editor. We can add it in the future
--.texmap_bump : texturemap
--.texmap_bump_on : boolean
--.texmap_bump_multiplier : float
--.texmap_displacement : texturemap
--.texmap_displacement_on : boolean
--.texmap_displacement_multiplier : float
end_asset out
return brdfURL
)
fn dumpBRDFDiffuse mat out basemat:undefined =(
if mat == undefined then(
return undefined
)
local brdfURL = ""
if (basemat != undefined) then (
brdfURL = "/" + basemat + "/BRDFDiffuse"
)
else (
brdfURL = "/" + mat.name + "/BRDFDiffuse"
)
--print "Enter dumpBRDFDiffuse"
colorVal = getproperty mat "diffuse"
--format "diffuse color: %\n" colorVal
texColorVal = getproperty mat "diffuseMap"
texColorValMult = getproperty mat "diffuseMapAmount"
--format "diffuse map amount: %\n" texColorValMult
texColorValOn = getproperty mat "diffuseMapEnable"
local texUrl = ""
if texColorVal != undefined then(
texUrl = (brdfURL+"/color/Texture")
dumpMap texColorVal (brdfURL+"/color") "color_tex" out
)
--dumpColorTexHandlerParam brdfURL "roughness" mat "diffuseRoughness" out isColor:false
begin_asset brdfURL "BRDFDiffuse" "BRDF" "DiffuseLayer" out
make_color_parameter_xml "color" colorVal out gammaCorrect:true
make_parameter_xml "color_tex" "acolor texture" texUrl out gammaCorrect:true
make_parameter_xml "color_tex_mult" "float" (texColorValMult as float / 100.0f) out
make_color_parameter_xml "transparency" (Color 0 0 0) out gammaCorrect:true
--dumpTextureParams brdfURL "roughness" mat "diffuseRoughness" out isColor:false
end_asset out
return brdfURL
)
fn dumpMtlSingleBRDF url brdfURL out =(
begin_asset url "MtlSingleBRDF" "material" "MtlSingleBRDFLayout" out
make_parameter_xml "brdf" "plugin" brdfURL out
end_asset out
)
fn dumpVRayMtl mat out basemat:undefined =(
if mat == undefined then
return undefined
-- We are going to write our VRayMtl out as a BRDFVRayMtl wrapped in a MtlSingleBRDF
local baseMtlURL=undefined
local singleMatURL = ""
if (basemat != undefined) then (
baseMtlURL = (basemat + "_" + mat.name)
singleMatURL = baseMtlURL
)
else (
singleMatURL = mat.name
)
--open_tag "vismat" out
brdfURL = dumpBRDFVRayMtl mat out basemat:baseMtlURL
singleMatURL = ("/" + singleMatURL)
dumpMtlSingleBRDF singleMatURL brdfURL out
--close_tag "vismat" out
return singleMatURL
)
fn dumpSubMaterial mat out basemat:undefined = (
local mtlURL = undefined
case( classof mat )of(
VRayMtl:(
local defDispl = mat.texmap_displacement
local defBump = mat.texmap_bump
if defDispl == undefined and defBump == undefined then(
mtlURL = dumpVRayMtl mat out basemat:basemat
)
else(
mtlURL =dumpMtlASGVIS mat out basemat:basemat
)
)
Standardmaterial:(
mtlURL = dumpMtlASGVIS mat out basemat:basemat
)
VRayMtlWrapper:(
mtlURL = dumpVRayMtlWrapper mat out basemat:basemat
)
Multimaterial:(
mtlURL = dumpMultiMtl mat out basemat:basemat
)
VRay2SidedMtl:(
mtlURL = dumpVRay2SidedMtl mat out basemat:basemat
)
default:(
if ( mat != undefined ) do (
print "WARRNING!"
format "Unsupported material % of class % - skipped\n" mat.name ((classof mat) as string)
)
)
)
return mtlURL
)
fn dumpVRay2SidedMtl mat out basemat:undefined =(
if mat == undefined then
return undefined
local matURL = ""
local baseMtlURL = undefined
if (basemat != undefined) then (
if (basemat == "") then
baseMtlURL = mat.name
else
baseMtlURL = basemat + "_" + mat.name
matURL = baseMtlURL
)
else (
matURL = mat.name
)
local frontMaterialURL = ""
case( classof mat.frontMtl )of(
VRayMtl:(
local defDispl = mat.frontMtl.texmap_displacement
local defBump = mat.frontMtl.texmap_bump
if defDispl == undefined and defBump == undefined then(
frontMaterialURL = dumpVRayMtl mat.frontMtl out basemat:baseMtlURL
)
else(
frontMaterialURL =dumpMtlASGVIS mat.frontMtl out basemat:baseMtlURL
)
)
Standardmaterial:(
frontMaterialURL = dumpMtlASGVIS mat.frontMtl out basemat:baseMtlURL
)
VRayMtlWrapper:(
frontMaterialURL = dumpVRayMtlWrapper mat.frontMtl out basemat:baseMtlURL
)
Multimaterial:(
frontMaterialURL = dumpMultiMtl mat.frontMtl out basemat:baseMtlURL
)
default:(
if ( mat.frontMtl != undefined ) do (
print "WARRNING!"
format "Unsupported front material % for VRay2SidedMtl with name % - skipped\n" mat.frontMtl.name mat.name
)
)
)
local backMaterialURL = ""
case( classof mat.backMtl )of(
VRayMtl:(
local defDispl = mat.backMtl.texmap_displacement
local defBump = mat.backMtl.texmap_bump
if defDispl == undefined and defBump == undefined then(
backMaterialURL = dumpVRayMtl mat.backMtl out basemat:baseMtlURL
)
else(
backMaterialURL =dumpMtlASGVIS mat.backMtl out basemat:baseMtlURL
)
)
Standardmaterial:(
backMaterialURL = dumpMtlASGVIS mat.backMtl out basemat:baseMtlURL
)
VRayMtlWrapper:(
backMaterialURL = dumpVRayMtlWrapper mat.backMtl out basemat:baseMtlURL
)
Multimaterial:(
backMaterialURL = dumpMultiMtl mat.backMtl out basemat:baseMtlURL
)
default:(
if ( mat.backMtl != undefined ) do (
print "WARRNING!"
format "Unsupported back material % for VRay2SidedMtl with name % - skipped\n" mat.backMtl.name mat.name
)
)
)
matURL = ("/" + matURL)
--dumpParam param paramName out paramType:undefined paramValue:undefined gammaCorrect:undefined isUserData:undefined handler:"default"
--dumpTextureParams parentURL baseParamName mat maxParamName out isColor:true shouldGammaCorrect:false
paramType = getParamType mat.translucency
--print paramType
strColorTrans = vraymax_color_to_xml_string mat.translucency
--print strColorTrans
finalUrl = matURL + "/translucency"
texUrl = ""
if mat.texmap_translucency != undefined then(
texUrl = finalUrl + "/Texture"
dumpMap mat.texmap_translucency finalUrl "translucency" out
)
begin_asset matURL "Mtl2Sided" "material" "TwoSidedMatLayout" out
--make_parameter_xml paramName paramType paramValue out gammaCorrect:undefined handler:"default" isUserData:undefined
make_parameter_xml "front" "plugin" frontMaterialURL out handler:"MaterialPickerHandler"
make_parameter_xml "back" "plugin" backMaterialURL out handler:"MaterialPickerHandler"
make_color_parameter_xml "translucency" mat.translucency out
make_parameter_xml "translucency_tex" "acolor texture" texUrl out
make_parameter_xml "translucency_tex_mult" "float" (mat.texmap_translucency_multiplier as float / 100.0f) out
dumpParam mat.force1SidedSubMtls "force_1sided" out
end_asset out
return matURL
)
fn dumpMtlASGVIS mat out basemat:undefined =(
if mat == undefined then
return undefined
local brdfURL=undefined
local baseMtlURL=undefined
local asgvismatURL = ""
if (basemat != undefined) then (
baseMtlURL = (basemat + "_" + mat.name)
asgvismatURL = baseMtlURL
)
else (
asgvismatURL = mat.name
)
local listOfBumpProps = #()
case( classof mat )of(
VRayMtl:(
brdfURL = dumpBRDFVRayMtl mat out basemat:baseMtlURL
listOfBumpProps = #("texmap_bump","texmap_bump_multiplier","texmap_bump_on")
)
Standardmaterial:(
brdfURL = dumpBRDFDiffuse mat out basemat:baseMtlURL
listOfBumpProps = #("bumpMap","bumpMapAmount","bumpMapEnable")
)
default:(
format "Unsupported material % wrapped in MtlASGVIS - skipped\n" mat.name
)
)
texBumpVal = getproperty mat listOfBumpProps[1]
texBumpValMult = getproperty mat listOfBumpProps[2]
texBumpValOn = getproperty mat listOfBumpProps[3]
asgvismatURL = ("/" + asgvismatURL)
local bumptexUrl = ""
listNormalBumpFeatures = #()
if texBumpVal != undefined then (
bumptexUrl = (asgvismatURL+"/Texture")
dumpMap texBumpVal asgvismatURL "bump_tex" out
if (listNormalBumpFeatures.count>0 ) then (
dumpMap listNormalBumpFeatures[1] asgvismatURL "bump_tex" out
)
)
--dumpParam param paramName out paramType:undefined paramValue:undefined gammaCorrect:undefined isUserData:undefined handler:"default"
--dumpTextureParams parentURL baseParamName mat maxParamName out isColor:true shouldGammaCorrect:false
begin_asset asgvismatURL "MtlASGVIS" "material" "defvrmat" out
--make_parameter_xml paramName paramType paramValue out gammaCorrect:undefined handler:"default" isUserData:undefined
--make_list_parameter_xml paramName listType paramType listOfValues out gammaCorrect:undefined handler:"default" isUserData:undefined
make_list_parameter_xml "brdfs" "plugin" "list" #(brdfURL) out
if (listNormalBumpFeatures.count>0 ) then (
make_parameter_xml "bump_tex" "plugin" bumptexUrl out handler:"TextureHandler"
make_parameter_xml "map_type" "integer" (listNormalBumpFeatures[4]+1) out
make_parameter_xml "bump_tex_mult" "float" listNormalBumpFeatures[3] out
make_bool_parameter_xml "bump_on" listNormalBumpFeatures[2] out
)
else (
make_parameter_xml "bump_tex" "plugin" bumptexUrl out handler:"TextureHandler"
make_parameter_xml "bump_tex_mult" "float" (texBumpValMult as float / 100.0f) out
make_bool_parameter_xml "bump_on" texBumpValOn out
)
end_asset out
return asgvismatURL
)
fn dumpVRayMtlWrapper mat out basemat:undefined =(
if mat == undefined then
return undefined
local baseMtlURL = undefined
local wrapMtlURL = ""
if (basemat != undefined) then (
if (basemat == "") then
baseMtlURL = mat.name
else
baseMtlURL = basemat + "_" + mat.name
wrapMtlURL = baseMtlURL
)
else (
wrapMtlURL = mat.name
)
-- We are going to write our VRayMtl out as a BRDFVRayMtl wrapped in a MtlSingleBRDF
--wrapMtlURL = ("/" + mat.name)
--singleMatURL = ("/" + mat.baseMtl.name)
--open_tag "vismat" out
local brdfURL=undefined
case( classof mat.baseMtl )of(
VRayMtl: (
local defDispl = mat.baseMtl.texmap_displacement
local defBump = mat.baseMtl.texmap_bump
if defDispl == undefined and defBump == undefined then(
brdfURL = dumpVRayMtl mat.baseMtl out basemat:baseMtlURL
)
else(
brdfURL =dumpMtlASGVIS mat.baseMtl out basemat:baseMtlURL
)
)
Standardmaterial: brdfURL = dumpMtlASGVIS mat.baseMtl out basemat:baseMtlURL
VRay2SidedMtl:(
brdfURL = dumpVRay2SidedMtl mat.baseMtl out basemat:baseMtlURL
)
Multimaterial:(
brdfURL = dumpMultiMtl mat.baseMtl out basemat:baseMtlURL
)
default:(
if ( mat.baseMtl != undefined ) do (
print "WARRNING!"
format "Unsupported base material % for VRayMtlWrapper with name % - skipped\n" mat.baseMtl.name mat.name
)
)
)
wrapMtlURL = "/" + wrapMtlURL
begin_asset wrapMtlURL "MtlWrapper" "material" "MtlWrapperLayout" out
make_parameter_xml "base_material" "plugin" brdfURL out handler:"MaterialPickerHandler"
dumpParam mat.generateGIMult "generate_gi" out
dumpParam mat.receiveGIMult "receive_gi" out
--dumpParam mat.generateCaustics "generate_caustics" out --bool/float
dumpParam mat.causticsMult "receive_caustics" out
dumpParam mat.matteSurface "matte_surface" out
--dumpParam mat.secondaryMatte "matte_for_secondary_rays" out --bool/int
dumpParam mat.alphaContribution "alpha_contribution" out
dumpParam mat.matteSurface "matte_surface" out
dumpParam mat.matte_shadows "shadows" out
dumpParam mat.matte_shadowsAffectAlpha "affect_alpha" out
dumpParam mat.matte_shadowColor "shadow_tint_color" out
dumpParam mat.matte_shadowBrightness "shadow_brightness" out
dumpParam mat.matte_reflectionMultiplier "reflection_amount" out
dumpParam mat.matte_refractionMultiplier "refraction_amount" out
dumpParam mat.matte_giMultiplier "gi_amount" out
dumpParam mat.matte_noGIOnOtherMattes "no_gi_on_other_mattes" out
dumpParam mat.matte_giSurfaceID "gi_surface_id" out
end_asset out
return wrapMtlURL
)
fn dumpMultiMtl mat out basemat:undefined =(
if mat == undefined then
return undefined
local baseMtlURL = undefined
local multiMtlURL = ""
if (basemat != undefined) then (
if (basemat == "") then
baseMtlURL = mat.name
else
baseMtlURL = basemat + "_" + mat.name
multiMtlURL = baseMtlURL
)
else (
multiMtlURL = mat.name
)
local listMtlMulti = mat.materialList
local urlList = #()
for i=1 to listMtlMulti.count do (
local brdfURL=undefined
case( classof listMtlMulti[i] )of(
VRayMtl: (
local defDispl = listMtlMulti[i].texmap_displacement
local defBump = listMtlMulti[i].texmap_bump
if defDispl == undefined and defBump == undefined then(
brdfURL = dumpVRayMtl listMtlMulti[i] out basemat:baseMtlURL
)
else(
brdfURL =dumpMtlASGVIS listMtlMulti[i] out basemat:baseMtlURL
)
)
Standardmaterial: brdfURL = dumpMtlASGVIS listMtlMulti[i] out basemat:baseMtlURL
VRay2SidedMtl:(
brdfURL = dumpVRay2SidedMtl listMtlMulti[i] out basemat:baseMtlURL
)
default:(
if ( listMtlMulti[i] != undefined ) do (
print "WARRNING!"
format "Unsupported material % for MtlMulti with name % - skipped\n" (listMtlMulti[i]).name mat.name
)
)
)
append urlList brdfURL
)
multiMtlURL = "/" + multiMtlURL
begin_asset multiMtlURL "MtlMulti" "material" "MultiMatLayout" out
--make_parameter_xml paramName paramType paramValue out gammaCorrect:undefined handler:"default" isUserData:undefined
--make_list_parameter_xml paramName listType paramType listOfValues out gammaCorrect:undefined handler:"default" isUserData:undefined
make_list_parameter_xml "ids_list" "integer" "list" mat.materialIDList out
make_list_parameter_xml "mtls_list" "plugin" "list" urlList out
end_asset out
return multiMtlURL
)
fn dumpVRayBRDFLayered mat out basemat:undefined =(
if mat == undefined then
return undefined
local brdfLayeredURL = ""
if (basemat != undefined) then (
brdfLayeredURL = basemat + "/BRDFLayered"
)
else (
brdfLayeredURL = mat.name + "/BRDFLayered"
)
local listCoatBlendTexMaps = mat.texmap_blend
local listCoatBlendColors = mat.blend
local listCoatBlendTexMultipliers = mat.texmap_blend_multiplier
local paramName = ""
local finalUrl = ""
local texURL = ""
local brdfURL = ""
local urlList = #()
local texURLList = #()
local listCoatAvailableMtls = for availMtl in mat.coatMtl where availMtl != undefined collect availMtl
for i=listCoatAvailableMtls.count to 1 by -1 do (
paramName = "texmap_blend_" + ((i-1) as string)
finalUrl = "/" + brdfLayeredURL + "/" + paramName
texURL = finalUrl + "/Texture"
if ( listCoatBlendTexMaps[i] == undefined ) then (
dumpTexAColorFromColor texURL listCoatBlendColors[i] out
append texURLList texURL
) else (
dumpMap listCoatBlendTexMaps[i] finalUrl paramName out
dumpTexCombineColor finalUrl listCoatBlendColors[i] texURL (listCoatBlendTexMultipliers[i] as float / 100.0) true out
append texURLList finalUrl
)
brdfURL=dumpSubMaterial listCoatAvailableMtls[i] out basemat:basemat
append urlList brdfURL
)
brdfURL=dumpSubMaterial mat.baseMtl out basemat:basemat
append urlList brdfURL
append texURLList ""
brdfLayeredURL = "/" + brdfLayeredURL
begin_asset brdfLayeredURL "BRDFLayered" "BRDF" "BRDFLayeredLayout" out
make_list_parameter_xml "weights" "plugin" "list" texURLList out
make_list_parameter_xml "brdfs" "plugin" "list" urlList out
make_bool_parameter_xml "additive_mode" mat.additiveMode out
end_asset out
return brdfLayeredURL
)
fn dumpVRayBlendMtl mat out basemat:undefined =(
if mat == undefined then
return undefined
-- We are going to write our VRayBlendMtl out as a BRDFLayered wrapped in a MtlSingleBRDF
local baseMtlURL = undefined
local singleMatURL = ""
if (basemat != undefined) then (
if (basemat == "") then
baseMtlURL = mat.name
else
baseMtlURL = basemat + "_" + mat.name
singleMatURL = baseMtlURL
)
else (
singleMatURL = mat.name
)
local brdfURL = dumpVRayBRDFLayered mat out basemat:baseMtlURL
singleMatURL = ("/" + singleMatURL)
dumpMtlSingleBRDF singleMatURL brdfURL out
return singleMatURL
)
-- for now we only work on VRayMtl types
fn dumpMaterials = (
saveDir = getSavePath caption:"Vismat Export Directory"
if saveDir == undefined then(
return undefined
)
format "Exporting scene materials...\n"
for i=1 to 24 do (
m = meditmaterials[i]
case( classof m )of(
VRayMtl:(
format "Processing %: " m.name
fileName = (saveDir + "\\" + m.name + ".vismat")
format "saving vismat to %\n" fileName
f = openFile fileName mode:"w"
open_tag "vismat" f
dumpVRayMtl m f
close_tag "vismat" f
flush f
close f
)
VRay2SidedMtl:(
format "Processing %: " m.name
fileName = (saveDir + "\\" + m.name + ".vismat")
format "saving vismat to %\n" fileName
f = openFile fileName mode:"w"
open_tag "vismat" f
dumpVRay2SidedMtl m f
close_tag "vismat" f
flush f
close f
)
default:(
)
)
)
format "Done\n"
)
fn clearArrBitMapTxtPaths = (
arrBitMapTxtPaths = #()
)
fn createBmpFilesInVismatFolder saveDir = (
if saveDir == undefined then(
return undefined
)
--print arrBitMapTxtPaths.count
for i=1 to arrBitMapTxtPaths.count do (
bmpFile = filenamefrompath arrBitMapTxtPaths[i]
--print "File name:"
--print bmpFile
bmpFileTargetPath = saveDir + "\\" + bmpFile
--print "Target path:"
--print bmpFileTargetPath
--print (doesFileExist bmpFileTargetPath)
if (doesFileExist bmpFileTargetPath) then
deleteFile bmpFileTargetPath
copyresult = copyFile arrBitMapTxtPaths[i] bmpFileTargetPath
if copyresult then
format "copying the file % \n from % \n to % \n was Successfully \n" bmpFile (getFilenamePath arrBitMapTxtPaths[i]) saveDir
else
format "copying the file % \n from % \n to % \n was NOT Successfully \n" bmpFile (getFilenamePath arrBitMapTxtPaths[i]) saveDir
)
)
fn openVismatTag f = (
open_tag "vismat" f
)
fn closeVismatTag f = (
close_tag "vismat" f
)
fn dumpSelectedMaterial mat f vismatmode:undefined= (
if mat == undefined then
return undefined
case( classof mat )of(
VRayMtl:(
defDispl = mat.texmap_displacement
defBump = mat.texmap_bump
if defDispl == undefined and defBump == undefined then(
dumpVRayMtl mat f
)
else(
dumpMtlASGVIS mat f
)
)
VRay2SidedMtl:(
if vismatmode == undefined then
dumpVRay2SidedMtl mat f
else
dumpVRay2SidedMtl mat f basemat:""
)
VRayMtlWrapper:(
if vismatmode == undefined then (
dumpVRayMtlWrapper mat f
)
else
dumpVRayMtlWrapper mat f basemat:""
)
Standardmaterial:(
dumpMtlASGVIS mat f
)
Multimaterial:(
dumpMultiMtl mat f
)
VRayBlendMtl:(
if vismatmode == undefined then
dumpVRayBlendMtl mat f
else
dumpVRayBlendMtl mat f basemat:""
)
default:(
format "Convertion for % is not done: " mat.name
format "Unknown material - skipped\n"
)
)
)
macroScript ExportVismats category:"VRay" buttontext:"Export VRMAT from scene materials" tooltip:"Exports vrmat files" (
dumpMaterials()
)
fn registerMenuItems = (
if menuMan.registerMenuContext 0x67e0e9ff then(
local quadMenu=menuMan.getViewportRightClickMenu #nonePressed
if (quadMenu!=undefined) do (
local menu=quadMenu.getMenu 1
)
local menuIndex
if (menu!=undefined) do (
menuIndex=findMenuItemIdx menu "V-Ray scene converter"
appendMenuItem menu "ExportVismats" "VRay"
)
)
)
--registerMenuItems()