Object Hierarchy | 関連する C++クラス:UserDataBlob
UserDataBlob
v3.5
The UserDataBlob は、シーンのさまざまなパーツにアタッチできる Property であり、Camera、Light、その他の X3DObject、および Cluster などがあります。プラグインを有効にして、シーンの一部としてバイナリのユーザ データの読み込み、書き込み、保持を行います。
UserDataBlob は、SceneItem.AddProperty を呼び出して作成できます。複数の UserDataBlob を単一オブジェクトに保存することもできますし、単一 UserDataBlob にブランチを適用することもできます。
UserDataBlob の内容は、mental ray に取り込むことができます。シェーダが必要とするコンテキスト情報は UserDataBlob に保存され、Mental Ray ユーザデータ API を介して取得されます。この機能は、UserDataBlob が Camera、Light、X3DObject のいずれかの直下にネストされている場合にのみ使用できます。"RenderData"という名前の Parameter は必ず True に設定し、"UserDataID"パラメータはシェーダが予測する mental ray ユーザデータタグの値にする必要があります。リアルタイムシェーダにはこのデータを取り込む必要はありません。リアルタイムシェーダは C++ API を介して UserDataBlob の内容を直接読み取りできるためです。
C++開発者が UserDataBlob のバイナリデータに簡単かつ効率よくアクセスするには、COM オブジェクトモデルインターフェイスではなく、C++ API(xsi_userdatablob.h を参照)を使用します。
CustomProperty オブジェクトは、バイナリデータをサポートしないオブジェクトに代わる「ローレベル」オブジェクトとして考えられます。UserDataMapは UserDataBlob に似ていますが、オブジェクトレベルのバイナリデータではなく、コンポーネント別のバイナリデータの保存をサポートしています。たとえば、あるユーザデータが頂点クラスタ内のすべてのポイントに適用される場合、そのユーザデータは UserDataBlob に保存されます。一方、ユーザデータが単一の頂点に適用される場合、ユーザデータは UserDataMap の適切なインデックスに保存されます。
'Example of the UserDataBlob 'Store some user data directly under the scene root set oBlob = ActiveSceneRoot.AddProperty( "UserDataBlob", , "data" ) 'Save a string. Because strings are represented as widecharacters 'this takes 12 bytes on Windows and 24 bytes on Linux oBlob.Value = "xyz123" logmessage oBlob.fullname & " is storing this string: " & oBlob.Value & _ " which takes " & oBlob.Size & " bytes." 'Flush that user data ActiveSceneRoot.Properties( "data" ).Clear |
//Example of UserDataBlob //Place the blob on a null var oNull = ActiveSceneRoot.AddPrimitive( "Null" ) ; var oBlob1 = oNull.AddProperty( "UserDataBlob", false, "nulldata" ) ; oBlob1.Value = "xyz123" ; var oBlob2 = oNull.AddProperty( "UserDataBlob", false, "emptynulldata" ) ; //Find all UserDataBlobs on the object and print out their values var e = new Enumerator( oNull.Properties ) ; var item ; for ( ;!e.atEnd();e.moveNext() ) { item = e.item(); if ( item.Type == "UserDataBlob" ) { if ( item.IsEmpty ) { logmessage( "Found empty UserDataBlob called " + item.Name ); } else { logmessage( "Found user data blob called " + item.Name + " with value " + item.Value ); } } } |