MaxScriptTip: マテリアルのサムネイルBitmapを取得する

3月 26, 2016
マテリアルのサムネイルBitmap取得について。
標準のMaxScriptではこのような機能は無いようなので、DotNet用のMaxAPIを叩いて作成します。
fn createMtlThumb mtl size:#large =
(
    -- MaxAPIインターフェース作成
    local iGlobal = (dotnetClass "Autodesk.Max.GlobalInterface").Instance
    if iGlobal == undefined do
        return undefined
    
    -- マテリアルを.NET APIマテリアルに変換
    local mtlHandle = dotNetObject "System.UIntPtr" (GetHandleByAnim mtl)
    local iMtl = iGlobal.Animatable.GetAnimByHandle mtlHandle
    if iMtl == undefined do
        return undefined

    -- サムネイルを作成
    local ps = dotnetclass "Autodesk.Max.PostageStampSize"
    local pSize = case size of (#large: ps.Large; #small: ps.Small; #tiny: ps.Tiny)
    local pStamp = iMtl.CreatePStamp pSize true
    
    -- サムネイルをBitmapにコピー
    local bytes = pStamp.Image
    local width = pStamp.Width
    local dstBmp = bitmap width width
    local step = width * 3
    
    for y = 1 to bytes.count by step do
    (
        row = (for x = y to (y + step - 1) by 3 collect [bytes[x + 2], bytes[x + 1], bytes[x]])
        setpixels dstBmp [0, width -= 1] row
    )
    
    -- 開放
    pStamp.Dispose()
    iMtl.Dispose()
    
    return dstBmp
)

thumbnail = createMtlThumb $.material size:#large
display thumbnail
第1引数にはMaterialオブジェクトを、第2引数には#large, #small, #tinyを指定できます。
それぞれのサイズは以下のようになります。
#large: 88px
#small: 32px
#tiny: 24px

戻り値はbitmapオブジェクトです。

上記スクリプトを実行すると選択しているオブジェクトのマテリアルがレンダリングされて、以下のようにフレームバッファに表示されます。

勿論、フレームバッファへの表示はテスト用なので表示する必要はありません。

CreatePStampの第二引数をfalseにするとレンダリングせずに取得する(?)ようですが、キャッシュが無かった時にどうなるかは試してません。
現状ではレンダリングにかかる時間も微々たるものですので、普通にレンダリングする仕様でいいかと思います。


最後に

今回の記事作成にあたり、こちらのスレッドを参考にさせて頂きました。
http://forums.cgsociety.org/archive/index.php?t-1239911.html
ありがとう海外のエロ偉い人。

Related Articles