Динамическое изменение интерфейса шейдера
Все живет, все усложняется… Эволюция шаг за шагом творит все новые решения, все более сложные и функциональные… Но лишь самое лаконичное и понятное способно выдержать проверку временем…
Каждый из вас наверно уже встречал шейдеры, количество параметров в которых переваливает за мыслимые значения и своим видом пугает новичков. Казалось бы куда проще – делайте коллекции и сворачивайте не самые нужные, но рано или поздно они все равно будут развернуты, хотя половина параметров так и не будет никогда исзменена с дефолтных значений…
Или другой вариант – шейдер делающий сильную математику и реализующий в себе все виды материи от стекла до бетона. Ничего сложного, просто манипуляция десятком параметров и вы получаете нужную физическую модель… Но проблема в том, что все эти параметры не меняются раз за разом и лишь цвет да плотность дисплейса остается переменной величиной, а например коэффициенты отражения на стекле и алмазе – это константы, как и все остальные параметры. Допусти ошибку – и ты получишь не бетон, а кисель серого цвета…
На самом деле решение этих проблемы я вижу в следующем:
1. Если вам не нужны какие то параметры – просто уберите их с интерфейса. То есть я предлагаю динамически прятать элементы в зависимости от каких то условий.
2. Пресеты решают проблему повторения монотонных переустановок. Введите в свой шейдер выборку между «Бетон, Вода и Стекло» и все параметры сами переустановятся на нужные значения
Интерфейс SLIM обладает довольно большой гибкостью, но не все знают об этом. Попробуем реализовать заявленные выше возможности:
Опишем интерфейс slim-шейдера таким вот образом
parameter string paramSelector {
subtype selector
range { “use param 1″ 1
“use param 2″ 2
}
default 1
}
parameter float param1 {
subtype slider
default 1
range {0 1 .001}
}
parameter float param2 {
subtype slider
default 1
range {0 1 .001}
}
Довольно знакомо, не правда ли? Селектор выбирает какое значение будет использоваться в коде, но вы всегда видите именно два эти значения в интерфейсе, вне зависимости от того, что одно из них всегда игнорируется…
Для добавления каких либо действий нам надо использовать специальную конструкцию:
msghandler {
SetValue {[некий код]}
}
Выглядеть будет так:
parameter string paramSelector {
subtype selector
range { “use param 1″ 1
“use param 2″ 2
}
default 1
msghandler {
SetValue {[некий код]}
}
}
Конструкция помещается в описание параметра за действиями которого должно быть закреплено какое то изменение окружающего пространства. Msghandler вызывается каждый раз когда в параметре происходит изменение.
msghandler {
SetValue {
// получаем текущий объект (шейдер)
set prop %obj
set val [$prop GetValue]
set app [$prop GetAppearance]// получаем ссылку на интересующий нас параметр в интерфейсе по его имени
set resProp [$app GetProperties -name param1]
// читаем его текущее состояние видимости
set curLevel [$resProp GetDisplayLevel]// проверяем какое знание выбрано в селекторе
if {$val == 1} {
set newLevel “”
} else {
set newLevel hidden
}// не выполняем действий если текущее состояние видимости соотвествует новому
if {$newProvider != $curProvider} {
$resProp SetDisplayLevel $newLevel
// производим перерисовку интерфейса
$app UpdateEditor
}
}
}
Не правда ли все это очень сильно напоминает slim-scripting которым мы пользуемся из MEL например для динамического создания палет и шейдеров?
Я указал полную, развернутую структуру, благодаря которой вы можете реализовать много чего. Если же ограничиться только видимостью, то можно сделать укороченную запись:
msghandler {
SetValue {
::Slim::CustomUI::pixar::Vis::UpdateVisibility %obj {
1 {
“” {param1} // показать параметр
hidden {param2} // скрыть параметр
}
* {
“” {param2} // показать параметр
hidden {param1} // скрыть параметр
}
}
}
}
(в фигурных скобках через пробел вы можете указать несколько параметров)
Вот собственно и все. Есть лишь одна особенность использования: Функция вызывается лишь при смене значения, и как следствие при создании шейдера вам необходимо по дефолтному значению селектора выставить самим видимость параметров. Тоесть если по умолчанию используется первый параметр, то второй описать в интерфейсе как hidden.
parameter string paramSelector {
subtype selector
range { “use param 1″ 1
“use param 2″ 2
}
default 1
msghandler {
SetValue {
::Slim::CustomUI::pixar::Vis::UpdateVisibility %obj {
1 {
“” {param1}
hidden {param2}
}
* {
“” {param2}
hidden {param1}
}
}
}
}
}
parameter float param1 {
subtype slider
default 1
range {0 1 .001}
}
parameter float param2 {
subtype slider
default 1
range {0 1 .001}
display hidden
}
Используя полную версию указанную в начале вы можете так же менять динамически провайдера значения с TCL на Internal, или значения в параметрах и многое другое, все это думаю вы уже сами сможете найти в мануале.
…/programmingRAT/mtor_slim/slimScriptGlossary.html – странчка в мануале с описанием скриптования
©Nikopol.VFX
January 22nd, 2009 at 21:01
Спасибо, респект автору
January 29th, 2009 at 21:30
Неплохая статья)Спасибо