Render.ru
Поддержать

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

Leca

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

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😃iffuseCp
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😃iffuseBtn
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, в определении роллаута такая конструкция не вызывает у него вопросов...

Где порылась собака?

Гость

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

похоже, что объект 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
Ага, посмотрела, действительно, очень странное-ведь я указываю в заголовке скрипта что это расширение стандартного материала, а максу похоже этого недостаточно не принимает он его за материал вообще.

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

Гость

удивительная штука, более недокументированного хелпа не видела больше нигде. собственно вопрос, мне нужно сделать кастомное оформление редактора материалов - урезать визуальное представление Стандартного максового материала, вот скрипт:

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
В конце концов заработало вот так:
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