Как правильно расширить материал 3Ds Max - PullRequest
0 голосов
/ 14 мая 2009

По сути, я просто пытаюсь добавить еще несколько свойств к «стандартному» материалу в 3Ds Max 9. Мне действительно удалось сделать это с помощью скрипта max, но это нарушает наш экспортер.

Экспортер отлично работает для всего, что связано с обычным "стандартным" материалом, но расширенная версия, кажется, скрывает свойства базового класса от экспортера.

То, что я имею до сих пор, это:


plugin material Standard_WithOutlines
name:"Standard & Outlines"
classID:#(0x73212413, 0x1ca9e3e6)
extends:Standard replaceUI:false version:1
(
    parameters shaderParameters
    (
        diffuse type:#color
        glossiness type:#float
        specular type:#color
        specularLevel type:#float
        selfIllumColor type:#color
        selfIllumAmount type:#float
        opacity type:#float

        on diffuse get val do delegate.diffuse
        on glossiness get val do delegate.glossiness / 100.0
        on specular get val do delegate.specular
        on specularLevel get val do delegate.specularLevel
        on selfIllumColor get val do delegate.selfIllumColor
        on selfIllumAmount get val do delegate.selfIllumAmount
        on opacity get val do delegate.opacity / 100.0

        on diffuse set val do delegate.diffuse = val
        on glossiness set val do delegate.glossiness = val * 100.0
        on specular set val do delegate.specular = val
        on specularLevel set val do delegate.specularLevel = val
        on selfIllumColor set val do delegate.selfIllumColor = val
        on selfIllumAmount set val do delegate.selfIllumAmount = val
        on opacity set val do delegate.opacity = val * 100.0
    )

    parameters MainParams rollout:ExtendedMatRollout
    (
        ShowOutlining type:#boolean animatable:false default:false ui:outline_Enabled
        OutlineColour type:#color animatable:false default:(color 0 0 0) ui:outline_Colour
        OutlineThickness type:#float animatable:false default:5 ui:outline_Thickness
    )

    rollout ExtendedMatRollout "Extended Parameters"
    (
        groupBox outlinegrp "Outlining" pos:[8,0] width:312 height:62
        checkbox outline_Enabled "Enabled" pos:[18,16] width:128 height:16
        colorPicker outline_Colour "Colour:" pos:[160,34] width:56 height:20 enabled:ShowOutlining
        spinner outline_Thickness "Thickness:" pos:[50,36] width:80 height:16 enabled:ShowOutlining range:[0,100,0]
        on outline_Enabled changed state do
        (
            outline_Colour.enabled = state
            outline_Thickness.enabled = state
        )

    )
)

Объявляя переменные самостоятельно, экспортер мог их прочитать, но это на самом деле не связывалось со значениями, устанавливаемыми пользовательским интерфейсом. Чтобы решить эту проблему, я использовал события 'on XXX get / set' для ссылки на скрытые элементы. Так что теперь они работают правильно, но карты материалов для таких вещей, как диффузный и зеркальный, не работают (это единственный способ текстурировать объект AFAIK).

Как мне поступить, добавив эти пару параметров к типу материала, чтобы он также экспортировал все данные в классе 'делегата' (слишком много базового наследования для запроса)?

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 октября 2010

Вот базовый расширенный шейдер. Я думаю, что проблема у вас в том, что ваш свиток не указан для параметров. Если он не определен, то вы не можете найти его, если он не может их найти, значит, экспортер get все глючит.

plugin material Matte name:"Matte" classID:#(0x61108483, 0x4d218a72) extends:Standard replaceUI:true version:1
( 
    parameters main rollout:params
    (
        kdColor type:#color default:[90,90,90] ui:mkdColor
        on kdColor set val do delegate.diffuse_color = val
    )

    rollout params "Matte Parameters"
    (
        -- Basic matte parameters
        group "Basic Parameters" (
            colorpicker mkdColor "Diffuse: " across:2
        )

    )
)
0 голосов
/ 26 ноября 2009

Две возможности:

  1. Перечисляет ли ваш экспортер все парамблоки? Я полагаю, что ваши параметры в сценарии окажутся в дополнительном блоке. Если ваш экспортер просто смотрит на pblock 0, это может быть вашей проблемой.

  2. Я не видел такого использования раньше, когда параметры имеют одинаковое имя в скрипте и делегате. Я думаю, что вы, как правило, должны создавать новые параметры в сценарии и назначать их соответствующим образом, используя разные имена. По крайней мере, так я это сделал.

...