-ask関数は、「表面材質」のボタンが押されたときに呼ばれます。
+ask関数は、「表面材質」のマッピングでの「その他」ボタンが押されたときに呼ばれます。
+
+!!Shade8でのshader_interfaceの使用
+
+「shader_info_base_class」から派生したクラスを定義します。
+これに、ダイアログのパラメータをweight変数に持たせます。
+「new_shader_info」関数は、shader_interfaceクラスが自動で呼び出す関数です。
+第一引数がstream_interfaceになっています。
+この関数内で、streamの情報を取得します。
+
+戻り値は、shader_info_base_classクラスから派生したspotted_info_classを返しています。
+
+evaluate関数にて、stream_interfaceを呼び出す変わりに
+ spotted_info_class &info = (spotted_info_class &)(*(get_shader_info()));
+にて、spotted_info_classを取得してきます。これは、表面材質のマッピングでの「その他」ボタンで値を変更した場合でも、その情報が反映されています(変数weight内に格納されている)。
+「info.weight」が「その他」ダイアログで指定した値となりますので、
+それを計算に使用します。後は、Shade7.5のときと同じです。
+
+ // ダイアログから取得したパラメータを保持するクラス(Shade8から追加)
+ struct spotted_info_class : shader_info_base_class {
+ float weight;
+ spotted_info_class (float weight) : weight(weight) { }
+ };
+
+ // ダイアログから値を取得するときに呼ばれる
+ virtual shader_info_base_class *new_shader_info (stream_interface *stream, void * = 0) {
+ float weight = 8.0;
+ if (stream) {
+ stream->set_pointer(0);
+ stream->read_float(weight);
+ }
+ return new spotted_info_class(weight);
+ }
+
+ //スカラー値のパターンの生成を有効にする
+ virtual bool supports_evaluate (void * = 0) { return true; }
+
+ //スカラー値のパターンの生成
+ virtual float evaluate (const vec3 &p, void * = 0) {
+
+ //ストリームより値を取得
+ float value = 8.0f;
+
+ // stream_interfaceの値を取得(Shade8から有効)
+ spotted_info_class &info = (spotted_info_class &)(*(get_shader_info()));
+ value = info.weight;
+
+ //位置情報より、その位置での値を返す
+ return noise1(p * value);
+ }
+
+この部分、古いままにしていますとShade自身が落ちやすくなりますので注意です。