« C4D ChannelShader…09 前回の記事を参考に「ChannelShader…06」で失敗したコードを修正してみる | トップページ | C4D 表計算等から吐き出したCSV/TSVファイルをXPresso内で読み込むC.O.F.F.E.E.ノードを作ってみた… »

C4D ChannelShader…10 testChannelPluginクラスの幾つかのメンバ関数にprintln()を取り付けて様子を見る。

前回のtestChannelPlugin-BチャンネルシェーダのtestChannelPluginクラスのInitRender()/InitSettings()/EditData()へprintln()を取り付けて様子を見る。

ただし、前回も説明した通りOutpu()にはprintln()を追加しません。

println()を追加した部分のみ…

testChannelPlugin::EditData(settings)
{
  println("EditData : " , settings->GetData(0));

  var dlg = new(testDialog);
  dlg->d_sc = settings->GetData(0);
  dlg->Open(-1 , -1);
  if(dlg->GetResult()){
    settings->SetData(0 , dlg->d_sc);
    return TRUE;
  }else return FALSE;
}

testChannelPlugin::InitSettings(settings)
{
  println("InitSettings : " , settings->GetData(0));

  settings->SetData(0 , 1.0);
  return TRUE;
}

testChannelPlugin::InitRender(settings)
{
  println("InitRender : " , settings->GetData(0));

  var rd = new(r_data);
  rd->nz = new(Noise);
  return rd;
}

「testchshaderbprintln.ZIP」

これで、マテリアルに新規でチャンネルシェーダを設置したり、値を変更してコンソールに表示される様子を…

InitSettings : nil
InitSettings : nil
InitSettings : nil
InitRender : 1.000000
InitRender : 1.000000
InitRender : 1.000000
InitSettings : nil
InitRender : 1.000000
InitSettings : nil

チャンネルシェーダが設定されていない状態から、新規で設定すると次のようにコンソールに表示されます。

1回目のInitSettings()が呼ばれた直後、渡されたsettingsコンテナのID:0がカラ(nil)なのは納得できますが、2回目以降もnilになっています。

InitSettings()が呼ばれた後のInitRender()に渡されたsettingsコンテナのID:0には値が設定されています。

チャンネルシェーダの初期値1.0をダイアログを使って0.5へ変更してみます。

EditData : 1.000000
InitSettings : nil
InitSettings : nil
InitRender : 0.500000
InitRender : 0.500000
InitSettings : nil
InitRender : 0.500000
InitSettings : nil

EditData()が呼ばれた直後の渡されたsettingsコンテナのID:0には変更前の1.0が設定されています。

やはり、InitSettings()は何度呼ばれても渡されるsettingsコンテナはカラのようです。

ここで、不思議ですがInitSettings()が呼ばれるたびに、
settings->SetData(0 , 1.0);
が実行され、settingsコンテナのID:0へ1.0が入力されているはずなのですが…
InitRender()には0.5が入力されたsettingsコンテナが渡されています。

理解が不能です。

他に数値を保持する何かが別にあって、settingsコンテナで受け渡しをしているのだろうか?

それだと、何度もInitSettings()で1.0で初期化されても問題がないと思う…

InitSettings()にはカラのsettingsコンテナを渡して、値を設定してもらい…
値を保持している別の何かに値が設定されていれば、InitSettings()で変更された数値を適用しないとか…
値を保持している別の何かに値が設定されていたら、EditData()/InitRender()にsettingsコンテナに保持されている値を入力して各メンバ関数に渡たす…
保持している値を変更できるのはEditData()内で変更したのみ。

試しに…InitRender()メンバ関数内でsettingsコンテナのID:0の値を変更してみる。

testChannelPlugin::InitRender(settings)
{
  println("InitRender : " , settings->GetData(0));

  settings->SetData(0 , settings->GetData(0) * 0.9);

  var rd = new(r_data);
  rd->nz = new(Noise);
  return rd;
}

もし、これで、InitRender()メンバ関数内での変更が可能であれば、このメンバ関数がが呼ばれるたびに値が0.9倍になります。
初期値が1.0なので、次の呼び出しで0.9へ、更に呼び出されれば0.81へとなるはずです。

InitSettings : nil
InitSettings : nil
InitSettings : nil
InitRender : 1.000000
InitRender : 1.000000
InitRender : 1.000000
InitSettings : nil
InitRender : 1.000000
InitSettings : nil

結果は、先ほどと同じで保持している値は1.0のまま、0.9倍には変化しません。

更に、試してみます。
試しに、EditData()メンバ関数で、キャンセルを押されたときに、FALSEを返していますが、TRUEを返し、settingsコンテナのID:0をnilにしたらどうなるのでしょうか…

このテストは、ダイアログで値を設定する限り保持する数値は変更されますが、キャンセルが押されて、保持する値がnilに設定されたときの反応を見ます。

testChannelPlugin::EditData(settings)
{
  println("EditData : " , settings->GetData(0));

  var dlg = new(testDialog);
  dlg->d_sc = settings->GetData(0);
  dlg->Open(-1 , -1);
  if(dlg->GetResult()){
    settings->SetData(0 , dlg->d_sc);
  }else{
    settings->SetData(0 , nil);
  }
  return TRUE;
}

チャンネルシェーダを新規追加後…

InitSettings : nil
InitSettings : nil
InitSettings : nil
InitRender : 1.000000
InitRender : 1.000000
InitRender : 1.000000
InitSettings : nil
InitRender : 1.000000
InitSettings : nil

先ほどと変わりはありません。

同じようにダイアログで0.5へ変更します。

EditData : 1.000000
InitSettings : nil
InitSettings : nil
InitRender : 0.500000
InitRender : 0.500000
InitSettings : nil
InitRender : 0.500000
InitSettings : nil

全く変わりがありません。
では、ダイアログを開いてキャンセルボタンを押してみます。

EditData : 0.500000
InitSettings : nil
InitSettings : nil
InitRender : nil
COFFEE ERROR!
(15)Division by 0
Tile: TestCHShader-B.cof
Line: 126
InitRender : nil
COFFEE ERROR!
(15)Division by 0
Tile: TestCHShader-B.cof
Line: 126
InitSettings : nil
InitRender : nil
COFFEE ERROR!
(15)Division by 0
Tile: TestCHShader-B.cof
Line: 126
InitSettings : nil

あ…
目論見が外れて、0割のエラーが出てしまった…
これで、保持されている値をnilに設定して、InitSettings()の初期値1.0が適用されると予想していたのに…

一応、nilは設定できたわけで…

エラーの出た箇所のLine: 126は、Output()メンバ関数内の…

  var col = rd->nz->Noise(p.x / settings->GetData(0) , p.y / settings->GetData(0) , t);

です。

という事で、下の様な構造を予想しました。

Channelshader_26_2

こんな具合だろうか…?

そんな事C.O.F.F.E.E.SDKに書いてあったかなぁ…?
この考え方は正解かどうかは分かりません…

でも、何か少し分かってきたような気がする… 気のせいだろうか…?

ところで…

本当に、Output()メンバ関数内にOSコールコマンドを書くとまずいのだろうか…?
例えば、ファイルの操作をするBaseFile/Filename/File Manipulationの関数等を書き込むと…
println()以上に処理が遅いので、多分…

とりあえず、println("a")を書き込んで見たら…
予想通り…
チャンネルシェーダの設定/更新等をすると、レスポンスが悪くなり…
場合によっては、C4Dが「応答なし」になりました。

Channelshader_32

少し放っておくと復帰しましたが…

復帰にかかる時間は…?

単色を返すOutput()メンバ関数ならば、復帰も早いと思いますが…
複雑な計算をさせ、平方根等の処理を多用したものであれば、復帰まで相当かかると思います。

プレビューレベルで「応答なし」になるので、本番のレンダリングは実行しませんでした…

チャンネルシェーダの変更等で更新されると思われるプレビューは…

  • マテリアルマネージャのプレビュー
  • 属性マネージャやマテリアルエディタの2D/3Dプレビュー
  • オブジェクトマネージャ内のテクスチャタグ

プレビューのレンダリングは…?

プレビューの少し大きめなものを1つレンダリングして、それぞれの大きさに合わせてBitmap系処理で縮小しているのか?
それとも、プレビュー1つ1つレンダリングしているのかは不明。

多分、InitRender()メンバ関数が何度も呼ばれているので、1つづつだと思うのですが…

そう言う事で…
チャンネルシェーダで、外部のデータファイルを使うときは、InitRender()メンバ関数内で先に読み込んで、データを抽出しRenderDataに格納する。

と、言う事だろうね…

|

« C4D ChannelShader…09 前回の記事を参考に「ChannelShader…06」で失敗したコードを修正してみる | トップページ | C4D 表計算等から吐き出したCSV/TSVファイルをXPresso内で読み込むC.O.F.F.E.E.ノードを作ってみた… »