« C4D ChannelShader…05 出力カラーにNoiseクラスを使用 | トップページ | C4D ChannelShader…07 前回の問題は保留にして… チャンネル値 »

C4D ChannelShader…06 ダイアログを取り付ける…

前回のNoiseを使ったチャンネルシェーダーにダイアログを組み込んで、ポイントpに対するNoise空間へのスケールを変更できるようにしてみよう。

最低限のチャンネルシェーダの記事で削除したEditData()を使います。

/*
ChannelShaderPlugin
testChannelPlugin
*/


var pluginID = 1000007;


//testChannelPlugin ===============================================================
class testChannelPlugin : ChannelPlugin
{
  public:
    var sc;

    testChannelPlugin();//コンストラクタ

    GetName();//チャンネルシェーダ名
    GetID();  //プラグインID

    EditData(settings);

    //ポイントPの色
    Output(settings , render , p , n , d , t , texflag , vd);
};

testChannelPlugin::testChannelPlugin(){super();}

testChannelPlugin::GetName(){return "testCHShader";}

// http://www.plugincafe.comから取得した、このプラグインの為のplugin idを戻す
//テストID:1000001-1000010

testChannelPlugin::GetID(){return pluginID;}

testChannelPlugin::EditData(){return;}

testChannelPlugin::Output(settings , rd , p , n , d , t , texflag , vd){
  if(!sc)sc = 1.0;

  var niz = new(Noise);
  var col = niz->Noise(p.x / sc , p.y / sc , t);

  return vector(col , col , col);
}



//main ============================================================================
main()
{
  Register(testChannelPlugin);
}

Output()で使用していたスケール変数scをダイアログとのやり取りの為、メンバ変数にしました。

ダイアログは、何度も取り上げているから問題は無いね…
ではシンプルに、「スケール」と入力ようフィールド、OK/キャンセルボタンで、モーダルダイアログね。

ダイアログのガジェットのIDはenumを使おう… 表示テキストとフィールドの2個。

enum{
  sc_tx = 1000,
  sc_val
}

では、ダイアログ…
モーダルだから、Command()は、いらないですか?

//testDialog ======================================================================
class testDialog:GeModalDialog
{
  public:
    var d_sc;
   
    testDialog();
    CreateLayout();
    Init();
    AskClose();
}
testDialog::testDialog(){super();}

testDialog::CreateLayout(){
  SetTitle("testCHShader");
 
  AddGroupBeginV(10000 , BFH_SCALEFIT , 2 , "group1" , 0);
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(10 , 5 , 10 , 5);

    AddStaticText(sc_tx , BFH_LEFT , 0 , 0 , "スケール" , 0);
    AddEditNumber(sc_val , BFH_SCALEFIT , 150, 0);
  AddGroupEnd();
  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);}

testDialog::Init(){
  SetFloat(sc_val , d_sc , 0.0 , 4.0 , 0.01);
}

testDialog::AskClose(){
  d_sc = GetFloat(sc_val);
}

これで、EditData()でダイアログを割り当てた後、ダイアログのd_scにスケールを代入する…

ダイアログでOKボタンが押されたら、ダイアログのd_scからscへ代入する…

こんな具合だろうか…
では、EditData()を書き換えよう…

testChannelPlugin::EditData(settings)
{
  var dlg = new(testDialog);
  dlg->d_sc = sc;
  dlg->Open(-1 , -1);
  if(dlg->GetResult())sc = dlg->d_sc;
}

これで、実行してみよう…

Channelshader_13

マテリアルプレビューは更新されていない…

さて、クリックすると…

Channelshader_14

ダイアログだ…
適当に数値を入力… 0.2を入力しました…

Channelshader_13

変化なし…
もう一度クリック…

Channelshader_15

数値は、変更されている…
プレビューアイコンが更新されない…
最小限にしたから、更新に必要なメンバを削除したのだろうか…
今はプレビューアイコンをダブルクリックして更新を促そう…

Channelshader_16

ダブルクリックでプレビューが更新されました。

なるほど…
変更を更新するには、EditData()の戻り値をTRUEにしないと、いけないんだね…

testChannelPlugin::EditData(settings)
{
  var dlg = new(testDialog);
  dlg->d_sc = sc;
  dlg->Open(-1 , -1);
  if(dlg->GetResult()){
    sc = dlg->d_sc;
    return TRUE;
  }
  return FALSE;
}

そうすると、ダイアログのGetResult()値をそのまま返せば…
でも、ダイアロググループガジェットは、OK/Cancel/Helpって組み合わせもあったんだっけ?
はっきり覚えていないが… 勘違いかも…

これで、ダイアログで変更されても、プレビューが更新されるんだ…

さて、ここで…
新たなマテリアルを追加して、このチャンネルシェーダを取り付けてみよう…
新しいマテリアルのスケールを4.0にします…

Channelshader_17

新規で追加したマテリアルの、このチャンネルシェーダのスケールが0.2になっている…

2個のマテリアルのスケールが、同じものになっているのだ…

と言う事は… こう言う事だろうか?

Channelshader_18

じゃぁ配列変数とか使って、マテリアル毎にチャンネルシェーダのパラメータを自分で記憶させないといけないのか?
でも、どうやってマテリアルを識別するんだろうね?

ところで、1つのマテリアルに1つのチャンネルシェーダとは限らないよね…
「合成」とか「レイヤ」とか…複数適用できるし…

|

« C4D ChannelShader…05 出力カラーにNoiseクラスを使用 | トップページ | C4D ChannelShader…07 前回の問題は保留にして… チャンネル値 »