« 10,000アクセスありがとうございます。 | トップページ | 最近、ブログの更新をしていなかったのは… »

C4D C.O.F.F.E.E.RenderDataへアクセス…レンダリング設定の取得

C.O.F.F.E.E.SDKのRenderDataで、C4Dのレンダリング設定へアクセスできます。

試しに、レンダリング設定にアクセスしてみましょう。

レンダリング設定は、ドキュメントの中に複数個設定できるわけですね。
このレンダリング設定を取得するには、BaseDocumentからRenderDataを取得します。

このRenderDataもBaseObject同様、リスト管理されているのですが、このリストは階層構造ではないので、親クラスはBaseList4DクラスではなくBaseList2Dクラスです。
BaseList2Dなので、GetNext()やGetPrev()でレンダリング設定のリストを捜索する事ができます。

SDK R9.5には、現在使用中のレンダリング設定を取得する関数はありません。
多分MAXONも、C.O.F.F.E.E.でレンダリング設定を扱う頻度が少ないと想定していたのでしょう。

現在のレンダリング設定の取得は、ご存知の通り…
BaseDocument::GetFirstRenderData()で最初のレンダリング設定のRenderDataを取得します。
それが、アクティブならば、それが現在のレンダリング設定です。
アクティブでなければ、そこからSearchNext()を使い、それで取得したRenderDataが現在の設定ですね。

では、このRenderDataからの設定値の取得は…
RenderDataクラスのメンバ関数は、GetContainer()とSetContainer()の2つのみで、GetContainer()で取得したBaseContainerの中に格納されています。

ここまでは、SDK R9.5の話です。

では、現在のレンダリング設定をC4D R11で取得してみましょう。

/*
レンダリング設定の取得
2009.7.10
*/


//現在のレンダリング設定の取得
GetActiveRenderData(doc)
{
  var rd = doc->GetFirstRenderData();
  if(!rd)return;
  if(!rd->GetBit(BIT_ARDATA))rd = rd->SearchNext(BIT_ARDATA);
  return rd;
}


main(doc , op)
{
  var ard = GetActiveRenderData(doc);
  var ctn = ard->GetContainer();

  println(ctn->GetData(RDATA_NAME) , "--------");
  println(ctn->GetData(RDATA_RENDERMODE));
  println(ctn->GetData(RDATA_ANTIALIASING));
  println(ctn->GetData(RDATA_OVERSAMPLING));
  println(ctn->GetData(RDATA_TRANSPARENCY));
  println(ctn->GetData(RDATA_REFLECTION));
  println(ctn->GetData(RDATA_SHADOW));
}

…なんて事だぁ…
C.O.F.F.E.E.SDKのRenderDataの項目の一覧より取得した定数が…

R11 Demoで上のスクリプトは、RDATA_ANTIALIASINGのみしか明示されていない。
実行してもエラーが出ます。
まぁSDKはR9.5だから仕方が無い。SDK R11には、レンダリング設定の定数一覧は追加されていません。

まぁレンダリング設定はR9/R10は同じようだけど、R11から変更されたようですね。

R9.5のレンダリング設定

Renderdata_01

R10 Demoのレンダリング設定

Renderdata_02

R11 Demoのレンダリング設定

Renderdata_03

となると、C.O.F.F.E.E.SDK R9.5のRenderDataの定数一覧に関しては、C4D R11には当てにならないようだ。

では、上のスクリプトをC4D R9.5に入力してみます。

/*
レンダリング設定の取得
2009.7.10
*/


//現在のレンダリング設定の取得
GetActiveRenderData(doc)
{
  var rd = doc->GetFirstRenderData();
  if(!rd)return;
  if(!rd->GetBit(BIT_ARDATA))rd = rd->SearchNext(BIT_ARDATA);
  return rd;
}


main(doc , op)
{
  var ard = GetActiveRenderData(doc);
  var ctn = ard->GetContainer();

  println(ctn->GetData(RDATA_NAME) , "--------");
  println(ctn->GetData(RDATA_RENDERMODE));
  println(ctn->GetData(RDATA_ANTIALIASING));
  println(ctn->GetData(RDATA_OVERSAMPLING));
  println(ctn->GetData(RDATA_TRANSPARENCY));
  println(ctn->GetData(RDATA_REFLECTION));
  println(ctn->GetData(RDATA_SHADOW));
}

R9.5では、全ての定数が明示されました。
実行しても、問題ありません。

nil--------
3
1
1
2
2
2

何なんだろう…
RDATA_NAMEでレンダリング設定の名前が取得できると思ったのだが、nilとは…
でもレンダリング設定名を取得するには、次のようにRenderDataクラス変数にGetName()メンバ関数を使います。

/*
レンダリング設定の取得
2009.7.10
*/


//現在のレンダリング設定の取得
GetActiveRenderData(doc)
{
  var rd = doc->GetFirstRenderData();
  if(!rd)return;
  if(!rd->GetBit(BIT_ARDATA))rd = rd->SearchNext(BIT_ARDATA);
  return rd;
}


main(doc , op)
{
  var ard = GetActiveRenderData(doc);
  var ctn = ard->GetContainer();

  println(ard->GetName() , "--------");//レンダリング設定名
  println("? " , ctn->GetData(RDATA_NAME));
  println("? " , ctn->GetData(RDATA_RENDERMODE));
  println("アンチエリアス " , ctn->GetData(RDATA_ANTIALIASING));
  println("? " , ctn->GetData(RDATA_OVERSAMPLING));
  println("透過 " , ctn->GetData(RDATA_TRANSPARENCY));
  println("鏡面反射 " , ctn->GetData(RDATA_REFLECTION));
  println("影 " , ctn->GetData(RDATA_SHADOW));
}

さて、R9.5でスクリプトを実行すると…

テスト設定--------
? nil
? 3
アンチエリアス 2
? 1
透過 2
鏡面反射 2
影 2

RDATA_RENDERMODERDATA_OVERSAMPLINGは、レンダリング設定ダイアログの、どの項目に対応しているかわかりません。

設定値と変数の対応は、詳しく調べてみないと分かりませんね。
でも、R9.5やR10の対応定数は、SDKを参照で良いでしょう。

R11の場合は、レンダリング設定ダイアログの項目をドラッグ&ドロップで対応できるので、一々SDKを見なくても良いので楽勝です。

では、レンダリング設定の設定値を変更して見ましょう。

まずはR9.5からです。
影の値を変更してみます。

R9.5の影の値は…

0 なし
1 ソフトのみ
2 全ての種類

この値を0/2で切り替えます。

/*
C4D R9.5レンダリング設定:影の設定を(なし/全ての種類)で切り替えます。
2009.7.10
*/


//現在のレンダリング設定の取得

GetActiveRenderData(doc)
{
  var rd = doc->GetFirstRenderData();
  if(!rd)return;
  if(!rd->GetBit(BIT_ARDATA))rd = rd->SearchNext(BIT_ARDATA);
  return rd;
}


main(doc , op)
{
  var ard = GetActiveRenderData(doc);
  var ctn = ard->GetContainer();

  if(ctn->GetData(RDATA_SHADOW) != 2)
    ctn->SetData(RDATA_SHADOW , 2);
 
else
    ctn->SetData(RDATA_SHADOW , 0);

  ard->
SetContainer(ctn);
}

これで、レンダリング設定の影の値が(なし/全ての種類)で問題なく切り替わります。

ここで、思い出して欲しい事があります。

プリミティブオブジェクトの時のパラメータの設定です。
下のスクリプトは立方体オブジェクトのサイズを(10.0 , 100.0 , 50.0)へ変更します。

/*
立方体のサイズを(10.0 , 100.0 , 50.0)へ変更
2009.7.10
*/


main(doc , op)
{
  if(!instanceof(op , CubeObject))return;

  op#PRIM_CUBE_LEN = vector(10.0 , 100.0 , 50.0);
}

立方体のサイズ定数PRIM_CUBE_LENの取得は、ご存知の通り立方体オブジェクトの属性マネージャに表示されている、サイズの項目をドラッグ&ドロップで取得できますね。

実際、立方体オブジェクトのサイズは、CubeObjectのBaseContainerのID:PRIM_CUBE_LENに格納されています。

/*
立方体のサイズをBaseCOntainerを取得し(10.0 , 100.0 , 50.0)へ変更
2009.7.10
*/


main(doc , op)
{
  if(!instanceof(op , CubeObject))return;

  var ctn = op->GetContainer();
  ctn->SetData(PRIM_CUBE_LEN , vector(10.0 , 100.0 , 50.0));
  op->SetContainer(ctn);
}

立方体のBaseContainerを取得します。
そのBaseContainerのID:PRIM_CUBE_LENにサイズ(10.0 , 100.0 , 50.0)を設定。
変更したBaseContainerを立方体オブジェクトに適用します。

ではC4D R9.5でのレンダリング設定は、BaseContainerを取得せず直接操作する方法で変更できるのでしょうか?

先ほどのレンダリング設定の影の値を変更したスクリプトを変更します。

/*
C4D R9.5レンダリング設定:影の設定を(なし/全てのタイプ)で切り替えます。
2009.7.10
*/


//現在のレンダリング設定の取得
GetActiveRenderData(doc)
{
  var rd = doc->GetFirstRenderData();
  if(!rd)return;
  if(!rd->GetBit(BIT_ARDATA))rd = rd->SearchNext(BIT_ARDATA);
  return rd;
}


main(doc , op)
{
  var ard = GetActiveRenderData(doc);

  if(ard#RDATA_SHADOW != 2)
    ard#RDATA_SHADOW = 2;
  else
    ard#RDATA_SHADOW = 0;
}

実行するとエラーが出ました。
どうやら、オブジェクトと同様にBaseContainerを使用しているからと言っても、同じように値を変更できるとは、限らないという事でしょう。

と、言う事で、SDK R9.5での完成形は、先ほどのBaseContainerを取得した方法のスクリプトです。

では、ここからはSDK R11でのスクリプトです。
勿論、C4DはR11です。

SDK R11には、現在のレンダリング設定を取得する関数が用意されています。

[RenderData]renderdata();//全て小文字

これは、純粋に現在設定されているレンダリング設定の1個のみを取得します。
関数の引数はありません。

ま、考えてみれば…
現在のレンダリング設定(アクティブの状態)は必ず1つでしかないからですね。
レンダリング設定は、複数選択はありえないからですね…

では先ほどと同じく、C4D R11のレンダリング設定の影の値を取得してみます。

Renderdata_04

今度の設定値はブール値なので0/1です。
影の定数はRDATA_OPTION_SHADOWです。

/*
レンダリング設定のオプションの影の値を取得
2009.7.10
*/


main(doc , op)
{
  println(renderdata()#RDATA_OPTION_SHADOW);
}

実行するとレンダリング設定の影の値(0/1)が表示されます。

SDK R9.5では無理だったBaseContainerを取得せずにダイレクトに値を操作できます。

では、この影の値の(On/Off)を切り替えるスクリプトです。

/*
レンダリング設定のオプションの影の値を切り替えます
2009.7.10
*/


main(doc , op)
{
  renderdata()#RDATA_OPTION_SHADOW = !renderdata()#RDATA_OPTION_SHADOW;
}

C4D R11は、簡単ですね。

この、renderdata()関数が特別で、直接設定値を操作できるのではなく、R11からは、RenderDataクラス変数もBaseContainerを取得しなくても、直接設定値を操作できます。

先ほどC4D R9.5でエラーが起きたスクリプトをC4D R11で実行してみます。
定数は、R9.5と共通ではないので、対応した定数に置き換えます。

/*
C4D R9.5でエラーを起こした方法で、C4D R11でレンダリング設定:影の設定を(On/Off)で切り替えます。
2009.7.10
*/

//現在のレンダリング設定の取得

GetActiveRenderData(doc)
{
  var rd = doc->GetFirstRenderData();
  if(!rd)return;
  if(!rd->GetBit(BIT_ARDATA))rd = rd->SearchNext(BIT_ARDATA);
  return rd;
}


main(doc , op)
{
  var ard = GetActiveRenderData(doc);

  if(ard#RDATA_OPTION_SHADOW != 1)
    ard#RDATA_OPTION_SHADOW = 1;
  else
    ard#RDATA_OPTION_SHADOW = 0;
}

if()の4行は、renderdata()関数を使った時の下の様にするのでしょうが、

ard#RDATA_OPTION_SHADOW = !ard#RDATA_OPTION_SHADOW;

C4D R9.5とC4D R11の比較のため、変更箇所を極力最小にしました。

これでC4D R11は、普通に取得したRenderDataクラスのレンダリング設定値をBaseContainerを取得しなくても直接操作が可能だと言う事がわかったと思います。

ごめんなさい、今回のネタはSDK R9.5/SDK R11/C4D R9.5/C4D R11 Demoが混在して分かり辛かったと思います。

次回は、スクリプトマネージャのメニューの状態です。
また、メニューの状態かい?メニューの状態が好きなのかぁ?
そう思った方も中には、いるとは思いますが…

|

« 10,000アクセスありがとうございます。 | トップページ | 最近、ブログの更新をしていなかったのは… »