Render.ru

Вопрос к профи о MAX script

Leca

Активный участник
Рейтинг
7
#1
Привет!
удивительная штука, более недокументированного хелпа не видела больше нигде. собственно вопрос, мне нужно сделать кастомное оформление редактора материалов - урезать визуальное представление Стандартного максового материала, вот скрипт:

plugin material StandertLTImaterial

name:"Standart LTI mat"
classID:#(695425,446583)
extends:Standard replaceUI:true version:1

(
rollout XXX "Common LTI material"
(
groupBox BPgrp "Basic Parameters" pos:[6,8] width:313 height:120
label AmbientLbl "Ambient:" pos:[41,34] width:50 height:17
label DIffuseLbl "Diffuse:" pos:[40,69] width:41 height:15
label SpecularLbl "Specular:" pos:[40,101] width:47 height:15

colorPicker AmbientCp "" pos:[104,28] width:56 height:25 color:(color 150 150 150)
colorPicker DiffuseCp "" pos:[104,62] width:56 height:25 color:(color 150 150 150)
colorPicker SpecularCp "" pos:[104,96] width:56 height:25 color:(color 150 150 150)

mapButton AmbientBtn "None" pos:[176,32] width:96 height:18 enabled:false toolTip:"Chose a Ambient map"
mapButton DiffuseBtn "None" pos:[176,66] width:96 height:18 enabled:true toolTip:"Chose a Diffuse map"
mapButton SpecularBtn "None" pos:[176,99] width:96 height:18 enabled:false toolTip:"Chose a Specular map"

checkbox AmbDiff pos:[16,48] width:16 height:16 enabled:true checked:true
checkbox DiffSpec pos:[16,87] width:16 height:16
groupBox SHgpr "Specular Highlights" pos:[6,132] width:313 height:54
spinner SpecularSpn "Power " pos:[30,156] range:[0,150,0] width:100 height:16 enabled:true type:#integer scale:1

groupBox MAPgrp "Maps" pos:[6,190] width:313 height:82
label MapsLblShading "Shading" pos:[150,200] width:42 height:18
checkbox MapDiffuseEnable "" pos:[18,215] width:18 height:18
label MapLblDiffuse "Diffuse:" pos:[36,217] width:48 height:18
radioButtons MapDiffuseShade "" pos:[85,217] width:73 height:64 labels:#("100", "50x50", "MO 1x2", "Addsigned")
mapButton MapDiffuseBtn "None" pos:[18,240] width:290 height:18 toolTip:""
)
parameters standartMat rollout: XXX
(
DiffuseColor type:#color default:(color 150 150 150) ui:DiffuseCp
AmbientC type:#color default:(color 150 150 150) ui:AmbientCp
SpecularColor type:#color default:(color 150 150 150) ui:SpecularCp

SpecularLevels type:#integer default:0 ui:SpecularSpn

DiffuseButton type:#textureMap ui:DiffuseBtn
MapDiffuseButton type:#textureMap ui:MapDiffuseBtn

on AmbientC set val do
(
delegate.ambient = val
)
on DiffuseColor set val do
(
delegate.diffuse = val
)
on SpecularColor set val do delegate.Specular = val
on SpecularLevels set val do delegate.Specular_Level = val
on DiffuseButton picked mapxx do delegate.map[2] = mapxx
on MapDiffuseButton picked mapxx do delegate.map[2] = mapxx
)
)

из всего этого работают только Дифузный, спекулярный цвета, Power...
НЕ работают Амбиентный цвет - совсем непонятно почему.
НЕ работают кнопки, ни одна, те текстуру то я задать могу только она не отображается в слоте материала, как и амбиентный цвет (остальные цвета видны)
НЕ понятно почему с разделе parameters standartMat rollout: XXX(), я не могу написать например так
on DiffuseColor set val do
(
delegate.diffuse = val
if AmbDiff.state do delegate.ambient = val
)

точнее написать то могу, но такая конструкция почему то вызывает ошибку, макс говорит что не знает свойство .state у объекта AmbDiff, в определении роллаута такая конструкция не вызывает у него вопросов...

Где порылась собака?
 
#2
НЕ работают кнопки, ни одна, те текстуру то я задать могу только она не отображается в слоте материала, как и амбиентный цвет (остальные цвета видны)

похоже, что объект material не создается как таковой. это видно уже при назначении слоту в редакторе материалов материала, созданного вами типа - в окне Material/Map Browser при выборе Standart LTI material отображается крест. также это видно, если в MAXScript Listener набрать команду meditMaterials[xx].maps, где xx - номер слота, в который помещен материал, созданного вами типа. попробуйте эту же команду для standardMaterial и увидите разницу. почему так происходит? пока не ясно.

--------------------------------------------------------------------------------------------------------------------
НЕ понятно почему с разделе parameters standartMat rollout: XXX(), я не могу написать например так
on DiffuseColor set val do
(
delegate.diffuse = val
if AmbDiff.state do delegate.ambient = val
)

надо так:

on DiffuseColor set val do
(
delegate.diffuse = val
if XXX.AmbDiff.state do delegate.ambient = val
)
 

Leca

Активный участник
Рейтинг
7
#3
Ага, посмотрела, действительно, очень странное-ведь я указываю в заголовке скрипта что это расширение стандартного материала, а максу похоже этого недостаточно не принимает он его за материал вообще.

on DiffuseColor set val do
(
delegate.diffuse = val
if XXX.AmbDiff.state do delegate.ambient = val
)
такая конструкция тоже не заработала, на этот раз его не устроило AmbDiff, нет, говорит, свойства у ХХХ...
Изучеине хелпа ничего не дало, как сделать этот скриптовый мтериал материалом непонятно,
 
#4
удивительная штука, более недокументированного хелпа не видела больше нигде. собственно вопрос, мне нужно сделать кастомное оформление редактора материалов - урезать визуальное представление Стандартного максового материала, вот скрипт:

plugin material StandertLTImaterial

name:"Standart LTI mat"
classID:#(695425,446583)
extends:Standard replaceUI:true version:1

(
rollout XXX "Common LTI material"
(
.
.
.
)
parameters standartMat rollout: XXX
(
.
.
.
on DiffuseButton picked mapxx do delegate.map[2] = mapxx
on MapDiffuseButton picked mapxx do delegate.map[2] = mapxx
)
)

надо не "picked", а "set". "picked" было бы, если бы обработчик был в теле блока rollout, а не в теле блока parameters.

--------------------------------------------------------------------------------------------------------------------
НЕ понятно почему с разделе parameters standartMat rollout: XXX(), я не могу написать например так
on DiffuseColor set val do
(
delegate.diffuse = val
if AmbDiff.state do delegate.ambient = val
)

у меня работает так:

if XXX.AmbDiff.state do delegate.ambient = val

где XXX - наименование роллаута. Но если у вас и так не работает, то попробуйте так:

if this.yourRolloutName.AmbDiff.state do delegate.ambient = val
 

Leca

Активный участник
Рейтинг
7
#5
В конце концов заработало вот так:
on DiffuseColor set val do
(
delegate.diffuse = val
if this.XXX.AmbDiff.state do
(
delegate.ambient = val
)
)
Однако, амбиентный цвет все также не видим в слоте материала.

"надо не "picked", а "set". "picked" было бы, если бы обработчик был в теле блока rollout, а не в теле блока parameters."
не заработало, я исполдьзовала вот такую конструкцию:
on DiffuseButton set mapxx do
if mapxx != undefined do delegate.map[2] = mapxx

на что макс сказал: "неизвестное свойство "map" in (null):Standart"
при этом в листенере:
-- Error occurred in DiffuseButton()
-- Frame:
-- mapxx: Map #8:Bitmap

Уррааааа!!! заработало вот так:
on DiffuseButton set mapxx do
if mapxx != undefined do delegate.diffuseMap = mapxx
 
Сверху