Динамическое изменение интерфейса шейдера

Все живет, все усложняется… Эволюция шаг за шагом творит все новые решения, все более сложные и функциональные… Но лишь самое лаконичное и понятное способно выдержать проверку временем…

Каждый из вас наверно уже встречал шейдеры, количество параметров в которых переваливает за мыслимые значения и своим видом пугает новичков. Казалось бы куда проще – делайте коллекции и сворачивайте не самые нужные, но рано или поздно они все равно будут развернуты, хотя половина параметров так и не будет никогда исзменена с дефолтных значений…

Или другой вариант – шейдер делающий сильную математику и реализующий в себе все виды материи от стекла до бетона. Ничего сложного, просто манипуляция десятком параметров и вы получаете нужную физическую модель… Но проблема в том, что все эти параметры не меняются раз за разом и лишь цвет да плотность дисплейса остается переменной величиной, а например коэффициенты отражения на стекле и алмазе – это константы, как и все остальные параметры. Допусти ошибку – и ты получишь не бетон, а кисель серого цвета…

На самом деле решение этих проблемы я вижу в следующем:
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

2 Responses to “Динамическое изменение интерфейса шейдера”

  1. Фархетдинов Ринас Says:

    Спасибо, респект автору

  2. Mpavlos Says:

    Неплохая статья)Спасибо

Leave a Reply

*
To prove you're a person (not a spam script), type the security word shown in the picture.
Anti-Spam Image

Protected by WP-Hashcash.