私はカスタム OpenGL レンダラーで QtQuick を使用しています (QtQuick の観点からは、単にOpenSceneGraphであるためカスタムです)。そのために、QQuickFramebufferObject から継承するカスタム QQuickItem を作成し、QQuickFramebufferObject :: RendererからQQuickFramebufferObject ::createRenderer()を継承するカスタム レンダラーを作成します。これは十分に文書化されており、これらの手順に問題はありません。
後でアクセスするために、QQuickFramebufferObject::createRenderer()で作成されたレンダラーが実際にキャッシュされます (実際にはQQuickFramebufferObjectコンストラクターでインスタンス化され、単にQQuickFramebufferObject::createRenderer()で返されます。これは正常に動作し、次のことができます。作成されたレンダラーは、後でgeometryChangedやmousePressEventなどのイベントに反応するために使用されるため、他の簡単なコーディング方法はありません。
////////////////////////////////////////////////////////////////////////////////
void OsgItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry)
{
if (m_renderer)
m_renderer->m_window->getEventQueue()->windowResize(newGeometry.x(), newGeometry.y(), newGeometry.width(), newGeometry.height());
QQuickFramebufferObject::geometryChanged(newGeometry, oldGeometry);
}
////////////////////////////////////////////////////////////////////////////////
void OsgItem::mousePressEvent(QMouseEvent *event)
{
m_renderer->m_window->getEventQueue()->mouseButtonPress(event->x(), event->y(), button(*event));
update();
}
ここで、OsgItem は私のカスタムQQuickFramebufferObjectで、m_rendererは私のカスタムQQuickFramebufferObject::Rendererです。
問題は、createRenderer()が const であることです (これは、実際にはキャッシュすることを勧めるものではありません)。この論文では、レンダラーをキャッシュすべきではないと明確に述べています (ただし、公式ドキュメントには記載されていません)。
ここでのキャッチは何ですか?見逃したものはありますか?物事をコーディングできる別のクリーンな方法がわかりますか?