Choreonoid-1.8におけるシーンビューでの表示について - #2 by nakaoka - Japanese (日本語) - Choreonoid Discourse

# Choreonoid-1.8におけるシーンビューでの表示について

Japanese (日本語)

nishimura.vic
January 16, 2020, 5:11am

1

はじめまして、仕事でChoreonoidのプラグインを開発を行っております。
まだ開発を始めたばかりのため、質問も不慣れですが、どうぞご容赦ください。

環境

OS: Ubuntu 18.04.03 LTS及びWindwos 10
Choreonoidのバージョン: 1.8 開発版

詳細

独自に開発されたChoreonoid-1.7上で動く既存のプラグインを、Choreonoid-1.8上でも動くようにしようとしているところですが、
2019年8月1日 18:45:31のコミット（4c5ae0b）以降において、
シーンビュー上で線量率の二次元カラーマップ（スライス表示）の表示はされるものの、
これに関連付けて平面の位置を変更することのできるダイアログ上のスライダが機能しなくなりました。

このコミットのメッセージ「Unify the implementation of GL1SceneRenderer to that using vertex buffer objects」や他のトピック「 GLSL描画エンジンのデフォルト化に関連するものであり、Base/GL1SceneRenderer.cppのvoid writeVertexBuffersがMeshResource* createMeshResourceに変更されたところで、上記プラグインのスライダがスライス表示にリンクしなくなったのだろうと考えています。

あまりうまく説明ができていないのですが、上記のケースの場合、プラグイン側でどういった修正が必要になってくるでしょうか。

その他、情報が足りない場合は、ご指示頂けますと幸いです。

nakaoka
January 17, 2020, 3:47am

2

ご指摘いただいたコミットと関連して、描画については現在GLSL描画エンジンが標準となっており、今後古い方のGL1描画エンジンは廃止したく思っています。（次のリリースには含めますが、それ以降の開発版では廃止したいです。）両者で多少挙動の違いはありますが、そのような違いは比較的深いところにありますので、プラグインの実装がChoreonoidの内部実装と深く関わるようなコードになっている可能性があります。

ただし、具体的なコードなどの情報がないとどう修正するか回答することは難しいです。

具体的に、「この関数を呼んでこういった効果を期待していたがその挙動が実際にはこうだったのでこうなるように修正できないか」、といったかたちでご質問いただければ回答できる可能性も高くなるかと思います。

もしそのような特定が難しく、回答にあたってプラグインのソースコードを読み込んで設計を理解し修正方法を提示するようなことが求められるのでしたら、恐縮ですがボランティアベースでは荷が重くなりますので、別途コンサルティングのご依頼なども検討していただければと思います。

nishimura.vic
January 17, 2020, 7:18am

3

ご返信ありがとうございます。

ご指摘のように、プラグインからの「この関数を呼んで」の対応部分がまだ理解できていないため、情報が不十分な質問になってしまい、申し訳ございません。

具体的な質問ができるように、もう少し調査してみたいと考えます。

nishimura.vic
January 24, 2020, 5:48am

4

前回は、具体的なコードで説明できず、申し訳ございません。

以下に、独自開発プラグインのシーンビューへのスライス表示部分のコードを示します。

まず、initialize関数において、SgSwitchPtr型のswitch_crossSectionをシーンビューに追加しています。
そして、スライスの表示に係るダイアログでパラメータ変更があった場合に呼び出されるonCrossSectionParamChangedにおいて、種々のパラメータを反映した後、crossSectionDat->update(switch_crossSection);により更新しています。
ここでcrossSectionDatはスライス表示に係るデータクラス（OrthoSlice）です。
以前のchoreonoidだとこれでちゃんとシーンビューの画面が更新され、スライス表示も連動して動いていました。
しかし、上記のコミット以降だと、ダイアログのパラメータ変更にスライス表示が連動しなくなりました。ただ、このスライス表示のオンオフを設定するチェックボックス（prm.showPlane）で、一旦オフにして（switch_crossSection->clearChildren();）、再度オンにすると更新されたスライスが表示されるようになります。

上記のような状況なのですが、何か対応策は考えられますでしょうか。

例えば、スライス表示のチェックボックスがオンの場合にも、一旦switch_crossSection->clearChildren();を行って、crossSectionDat->update(switch_crossSection);を行えば、シーンビューの画面が連動するになるでしょうか。

class XXXPlugin : public cnoid::Plugin
{
public:
bool initialize() override;
std::shared_ptr crossSectionDat = xxx::OrthoSlice::create();
cnoid::SgSwitchPtr switch_crossSection = new cnoid::SgSwitch();

bool XXXPlugin::initialize()
{
SceneView::instance()->scene()->addChild(switch_crossSection); // シーンにスライスを表示するノードを追加
}

void XXXPlugin::onCrossSectionParamChanged(xxx::ParamSetup_crossSection prm)
{
// スライスの表示・非表示
if (isOK_crossSectionData && prm.showPlane) // データが存在し、チェックボックスがtrueの場合
{
crossSectionDat->update(switch_crossSection);
}
else
{
switch_crossSection->clearChildren();
}
switch_crossSection->notifyUpdate();
}

nakaoka
February 14, 2020, 4:11am

5

switch_crossSectionに対してnotifyUpdateを実行されていますが、その中身（子ノード以下のノード）を更新されていて、その更新を反映したい場合は、更新したノード（ShapeとかMeshとか）に対してnotifyUpdateをかける必要があります。

そのようなノードに対してnotifyUpdateを実行されていないようでしたら、まずは実行してどうなるか試してみていただけますでしょうか。

nakaoka
February 14, 2020, 4:13am

6

ちなみに以前は動いていたとのことですが、内部でのキャッシュ（OpenGLでのバッファへの保存等）のとり方によって、どこにnotifyUpdateをかけるとどこまで実際に更新するかということが変わります。

以前は上位のノードにnotifyUpdateをかけるだけで下位のノードまで内部的にも更新されるようにたまたまなっていたものの、そこの部分の実装が変わって、正しくnotifyUpdateをかけないと内部的に更新されなくなった、ということかもしれません。あくまで予想で、上記の対応でうまくいくかはまだ分かりませんが…。

nishimura.vic
February 14, 2020, 12:06pm

ご助言ありがとうございます。
色々と試してみたいと思います。