Render.ru

Переборка и изменение свойств материалов

aly8

Активный участник
Рейтинг
10
#1
Здравствуйте форумчане.

Надо научиться менять определенные параметры материалов.

Вот примерный код, но он не работает:

(
------------------------------------
fn edit_maps mat =
(
if mat.numsubs != 0 then
(
for i = 1 to mat.numsubs do
(
if mat != undefined then
(
if classof mat == SubAnim then
(
if superclassof mat.object == Missing_TextureMap then
(
print mat
)
)
edit_maps mat
)
)
)
)
------------------------------------
for o in objects do
(
if o.material != undefined do
(
edit_maps o.material
)
)
)


вот его упрощенная и немного измененная версия:
(
------------------------------------
fn edit_maps mat =
(
for i = 1 to mat.numsubs do
(
if mat != undefined then
(
if classof mat == Missing_TextureMap do print mat
edit_maps mat
)
)
)
------------------------------------
for o in objects do edit_maps o.material

)

В данном случае нужно найти все "Missing_TextureMap" и удалить их или заменить на какие-нить другие, например на Cellular () или просто распечатать.

Если обращаться к материалу напрямую, то все работает:
iskindof materialsEditor[2].diffuseMap Missing_TextureMap - хоть так
classOf materialsEditor[2].diffuseMap == Missing_TextureMap или так,
то все работает, легко находит Missing_TextureMap и меняет.

Вышеописанный способ, при запросе СlassOf выдает SubAnim - везде.
Просто офигеть. Помогите, пожалуйста, разобраться.
 

igorznag

Мастер
Рейтинг
103
#2
Попробуй так:
Код:
( 
------------------------------------ 
fn edit_maps mat = 
( 
if mat.numsubs != 0 then 
( 
for i = 1 to mat.numsubs do 
( 
if mat[i] != undefined then 
( 
if classof mat[i] == SubAnim then 
( 
if classof mat[i].value == Missing_TextureMap then 
( 
print mat[i].value
mat[i].value=undefined
--mat[i].value=cellular();
) 
) 
edit_maps mat[i] 
) 
) 
) 
) 
------------------------------------ 
for o in objects do 
( 
if o.material != undefined do 
( 
edit_maps o.material 
) 
) 
)
 

aly8

Активный участник
Рейтинг
10
#3
igorznag - супер! то, что нужно, все работает. спасибо большое! уже думал, что никто не поможет.
 

aly8

Активный участник
Рейтинг
10
#4
Спасибо igorznag! все заработало, но есть небольшое продолжение)
Столкнулся с проблемой в материале VrayDirt. Дело в том, что вышеприведенный перебор свойств материала почему-то не видит материалы на .texmap_radius , .texmap_occluded_color, .texmap_unoccluded_color, .texmap_reflection_glossiness.

К примеру, если на диффуз положить VrayDirt и обратиться через numsubs к диффузу, то получим 10:
meditmaterials[1].diffuseMap.numsubs

если же запросить свойства, то получим гораздо больше:
showproperties meditmaterials[1].diffuseMap
.radius : worldUnits
.occluded_color : RGB color
.unoccluded_color : RGB color
.distribution : float
.falloff : float
.subdivs : integer
.bias : point3
.affect_alpha : boolean
.ignore_for_gi : boolean
.consider_same_object_only : boolean
.invert_normal : boolean
.work_with_transparency : boolean
.environment_occlusion : boolean
.mode : integer
.reflection_glossiness : float
.affect_reflection_elements : boolean
.texmap_radius : texturemap
.texmap_radius_on : boolean
.texmap_radius_multiplier : float
.texmap_occluded_color : texturemap
.texmap_occluded_color_on : boolean
.texmap_occluded_color_multiplier : float
.texmap_unoccluded_color : texturemap
.texmap_unoccluded_color_on : boolean
.texmap_unoccluded_color_multiplier : float
.texmap_reflection_glossiness : texturemap
.texmap_reflection_glossiness_on : boolean
.texmap_reflection_glossiness_mult : float
.excludeList : node array
.includeList : node array
.resultAffectExcludeList : node array
.resultAffectIncludeList : node array
false



Соответсвенно, если у нас в сцене есть VrayDirt с Missing_TextureMap, то вышеприведенный алгоритм Missing_TextureMap просто не увидит (.

Можно ли как-нибудь усовершенствовать код, чтобы были видны все материалы, в том числе и подматериалы VrayDirt???
Как вариант - уже написал доп. функцию, которая проверяет на наличие VrayDirt и и справляет ошибки, если они есть. Но это как-то сложно получается и не автоматизируется. Шаг в сторону и опять дописывать функции) - нехорошо.

Может быть есть вариант, как-нить через функцию getPropNames организовать?

Или никак?

Помогите усовершенствовать, пожалуйста, если это возможно!
Взамен потом могу поделиться исходником )
 

igorznag

Мастер
Рейтинг
103
#5
Можно ли как-нибудь усовершенствовать код, чтобы были видны все материалы, в том числе и подматериалы VrayDirt???
Может быть есть вариант, как-нить через функцию getPropNames организовать?
Vray у меня не установлен, поэтому помочь не могу.
Может быть исходник скрипта set Bitmap Parameters чем-то поможет.
 

aly8

Активный участник
Рейтинг
10
#6
igorznag спасибо за ссылку! отличные скриптики и главное код доступный. Буду изучать, обязательно потом отпишусь)
 
Сверху