Mapping of Physical materials
The following sections contains examples on how to setup, export and import materials through MaxScript and Python in Max 2021 and later. It is recommended to read Shading network concepts before proceeding.
Physical Material
This script loops through all Physical Materials in the scene and sets up Simplygon shading networks accordingly. After the material setup the selected assets gets sent to Simplygon for optimization. When the optimization has completed the result will be returned to Max. This example utilize existing material channels for the Physical Material pipeline and will therefor get mapped back automatically. Custom channels will require manual import (using the query functions at the end of this example).
clear
sgsdk_Reset()
sgsdk_SetTextureOutputDirectory "D:\\CubeExample\\OutputTextures\\"
-- reduction pipeline with material baking
reductionPipelineWithBaking = "D:\\Pipelines\\reductionPipelineWithBaking.json"
-- list that will be populated with Physical Material
MaxPhysicalMaterials = #()
-- loop all scene materials
for mat in scenematerials do
(
print ("Material name: " + mat.name)
print ("\t\t\t.type: " + classOf mat as string)
-- if Physical_Material, store for later use
if classof mat == Physical_Material then
(
appendIfUnique MaxPhysicalMaterials mat
)
-- print all material properties
props = getPropNames mat
for i = 1 to props.count do
(
prop = getProperty mat props[i]
print ("\t\t\t." + props[i] + ": " + prop as string + "")
)
print ("\n")
-- loop through all sub-materials
subMatCount = getNumSubMtls mat
print ("\tNum sub-materials: " + subMatCount as string)
for i = 1 to subMatCount do
(
subMat = getSubMtl mat i
print ("\t\tSub-material name: " + subMat.name)
print ("\t\t\t.type: " + classOf mat as string)
-- if Physical_Material, store for later use
if classof subMat == Physical_Material then
(
appendIfUnique MaxPhysicalMaterials subMat
)
-- print all sub-material properties
props = getPropNames subMat
for i = 1 to props.count do
(
prop = getProperty subMat props[i]
print ("\t\t\t." + props[i] + ": " + prop as string + "")
)
print ("\n")
)
)
-- setup shading network for each physical material
for mat in MaxPhysicalMaterials do
(
MaterialName = mat.name
print ("Setting up shading network for: " + MaterialName)
-- create material override
MyPhysicalMaterial = sgsdk_CreateMaterialMetadata MaterialName
-- override base_color (base_color * base_color_map)
if mat.base_color_map != undefined and mat.base_color_map_on then
(
-- create nodes (map via name)
BaseColor = sgsdk_CreateShadingColorNode "base_color"
BaseColorMap = sgsdk_CreateShadingTextureNode "base_color_map"
-- base_color * base_color_map
BaseColorMultiply = sgsdk_CreateShadingMultiplyNode "multiply"
sgsdk_ConnectNodes BaseColorMultiply 0 BaseColor
sgsdk_ConnectNodes BaseColorMultiply 1 BaseColorMap
-- connect shading network to Simplygon material channel
sgsdk_ConnectNodeToChannel BaseColorMultiply MyPhysicalMaterial "base_color"
)
-- override base_color (if no texture exists)
else
(
BaseColor = sgsdk_CreateShadingColorNode "base_color"
sgsdk_ConnectNodeToChannel BaseColor MyPhysicalMaterial "base_color"
)
-- override bump, if any
if mat.bump_map != undefined and mat.bump_map_on then
(
-- create node, map via name
BumpMap = sgsdk_CreateShadingTextureNode("bump_map");
-- connect shading network to Simplygon material channel
sgsdk_ConnectNodeToChannel BumpMap MyPhysicalMaterial "bump"
)
)
-- execute Simplygon
sgsdk_RunPipelineOnSelection reductionPipelineWithBaking
-- get list with processed meshes
processedMeshes = sgsdk_GetProcessedMeshes()
for mesh in processedMeshes do
(
print ("\tMesh: " + mesh)
-- get materials attached to this mesh
materials = sgsdk_GetMaterialsForMesh mesh
for material in materials do
(
print ("\n\t\tMaterial: " + material)
-- see if there are reused materials
reusingMaterials = sgsdk_GetMeshReusesMaterials mesh
for reuseMaterial in reusingMaterials do
(
print ("\t\tReusing: " + reuseMaterial)
)
-- get material cahnnels for the material, if any
channels = sgsdk_GetChannelsForMaterial material
for channel in channels do
(
print ("\t\t\tChannel: " + channel)
texture = sgsdk_GetTexturePathForChannel material channel
print ("\t\t\t\tTexture: " + texture)
mappingChannel = sgsdk_GetMappingChannelForChannel material channel
print ("\t\t\t\tMappingChannel: " + mappingChannel as string)
)
-- get sub-materials, if any
materials = sgsdk_GetSubMaterials material
for submaterial in materials do
(
print ("\n\t\t\tSubMaterial: " + submaterial)
reusingMaterial = sgsdk_GetMaterialReusesSubMaterial material submaterial
print ("\t\t\tReusing: " + reusingMaterial)
channels = sgsdk_GetChannelsForMaterial submaterial
for channel in channels do
(
print ("\t\t\tChannel: " + channel)
texture = sgsdk_GetTexturePathForChannel submaterial channel
print ("\t\t\t\tTexture: " + texture)
mappingChannel = sgsdk_GetMappingChannelForChannel submaterial channel
print ("\t\t\t\tMappingChannel: " + mappingChannel as string)
)
materialIndex = sgsdk_GetSubMaterialIndex material submaterial
print ("\t\t\tIndex: " + materialIndex as string)
)
)
)
Related
Get to know how to work with Shading Networks: