/*************************** CONVERSION METHODS *****************************/
mapped fn convertPhysicalToStandard mat replace:on = if iskindof mat Physical_Material do
(
std = Standard name:mat.name
--format "mat% >> std:%" mat std
/***************** DO A SIMPLE PROP MAPPING ************************/
std.diffuse = mat.base_color
std.diffusemap = mat.base_color_map
if replace do replaceinstances mat std
std
)
mapped fn renameStandardByDiffuseMap mat upper:on suffix:"_MAT" = if iskindof mat Standard do
(
old = mat.name
txt = mat.diffusemap
if iskindof txt BitmapTexture and iskindof txt.filename String do
(
name = getfilenamefile txt.filename
if upper do name = toupper name
name += suffix
mat.name = name
)
#(old, mat.name)
)
mapped fn groupStandardByName mat dict: = if iskindof mat Standard do
(
if dict[mat.name] == undefined do dict[mat.name] = #()
appendifunique dict[mat.name] mat
)
fn uniqueDupMaterials mats =
(
dict = Dictionary #string
groupStandardByName mats dict:dict
mapped fn _replaceInstances mat trg = replaceinstances mat trg
for d in dict where d.value.count > 1 do _replaceInstances d.value d.value[1]
)
/*************************** MAKE A SAMPLE SCENE *****************************/
delete objects
gc()
with redraw off
(
t0 = teapot mapcoords:on rotation:(eulerangles 0 0 -90) pos:[-30,0,0] wirecolor:green
t1 = teapot mapcoords:on rotation:(eulerangles 0 0 -90) pos:[30,0,0] wirecolor:orange
meditmaterials[1] = mat0 = Physical_Material name:#mat0 base_color:green base_color_map:(bitmaptexture filename:"JAGLEAF.TGA")
meditmaterials[2] = mat1 = Physical_Material name:#mat1 base_color:orange base_color_map:(bitmaptexture filename:"FLOWER3.TGA")
t0.mat = mat0
t1.mat = mat1
for k=1 to 3 do (copy t0 pos:[t0.pos.x, t0.pos.y, t0.pos.z + k*40] material:(copy t0.mat))
for k=1 to 3 do (copy t1 pos:[t1.pos.x, t1.pos.y, t1.pos.z + k*40] material:(copy t1.mat))
)
/***************************** CONVERT AND RENAME MATERIALS ******************/
(
phys = getclassinstances Physical_Material target:rootnode
convertPhysicalToStandard phys -- (join #() sceneMaterials)
stds = getclassinstances Standard target:rootnode
renameStandardByDiffuseMap stds
--dict = Dictionary #string
--groupStandardByName stds dict:dict
uniqueDupMaterials stds
medit.SetActiveMtlSlot (medit.GetActiveMtlSlot()) on
updateSceneMaterialLib()
mats = join #() sceneMaterials
)
Looks like that's all you need. Of course, the conversion of physical to standard may be more fancy, but this is not a point of issue of this topic ...