<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Scenegraph mit unterschiedlichen Nodes und dessen Funktionen]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte gerne Klassen von einer Node klasse ableiten und diese als pointer in einem vector von Node speichern. Allerdings gibt es da Probleme mit den Funktionen die eben nur in den abgeleiteten Klassen existieren.</p>
<p>Hier mal der Code um es zu verdeutlichen:</p>
<pre><code>class Base
{
public:
    virtual void setParent(Base* pParent);
    virtual void addChild(Base* pChild);
    // for simplicity I wont implement all functions
private:
    Base* m_pParent;
    std::vector&lt;Base*&gt; m_pChildren;
};

class DerivedOne : public Base
{
public:
    // virtual function override
    int custom(){return1337;}
}
class DerivedTwo : public Base
{
public:
    int customtwo(){return1337+1;}
}
main(xyz)
{
    DerivedOne* d1 =newDerivedOne();
    DerivedTwo d2 =newDerivedTwo();
    d1-&gt;addChild(d2);
    for(auto e : d1-&gt;getChildren())
    {
        std::cout &lt;&lt;static_cast&lt;DerivedOne*&gt;(e)-&gt;custom(); std::endl;// returns 1337 twice instead of once
    }
}
</code></pre>
<p>Weiß einer vielleicht wie so etwas realisierbar wäre?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332877/scenegraph-mit-unterschiedlichen-nodes-und-dessen-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 10:41:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332877.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 May 2015 17:45:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 20:48:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte gerne Klassen von einer Node klasse ableiten und diese als pointer in einem vector von Node speichern. Allerdings gibt es da Probleme mit den Funktionen die eben nur in den abgeleiteten Klassen existieren.</p>
<p>Hier mal der Code um es zu verdeutlichen:</p>
<pre><code>class Base
{
public:
    virtual void setParent(Base* pParent);
    virtual void addChild(Base* pChild);
    // for simplicity I wont implement all functions
private:
    Base* m_pParent;
    std::vector&lt;Base*&gt; m_pChildren;
};

class DerivedOne : public Base
{
public:
    // virtual function override
    int custom(){return1337;}
}
class DerivedTwo : public Base
{
public:
    int customtwo(){return1337+1;}
}
main(xyz)
{
    DerivedOne* d1 =newDerivedOne();
    DerivedTwo d2 =newDerivedTwo();
    d1-&gt;addChild(d2);
    for(auto e : d1-&gt;getChildren())
    {
        std::cout &lt;&lt;static_cast&lt;DerivedOne*&gt;(e)-&gt;custom(); std::endl;// returns 1337 twice instead of once
    }
}
</code></pre>
<p>Weiß einer vielleicht wie so etwas realisierbar wäre?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454922</guid><dc:creator><![CDATA[Extremo]]></dc:creator><pubDate>Wed, 27 May 2015 20:48:37 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 18:02:24 GMT]]></title><description><![CDATA[<p>Es gibt Probleme - aha.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454924</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 27 May 2015 18:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 18:43:19 GMT]]></title><description><![CDATA[<p>Dein Beispiel ist schon sehr komisch. In der Basisklasse hast du keine custom Funktion angegeben, dann heißt es plötzlich custom override, und dann customtwo. Wenn du mit dem ganzen irgendwas sagen wolltest, ist es nicht rübergekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454929</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 27 May 2015 18:43:19 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 20:42:36 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Dein Beispiel ist schon sehr komisch. In der Basisklasse hast du keine custom Funktion angegeben, dann heißt es plötzlich custom override, und dann customtwo. Wenn du mit dem ganzen irgendwas sagen wolltest, ist es nicht rübergekommen.</p>
</blockquote>
<p>Du hast einfach mal alles völlig falsch verstanden. Ich überschreibe custom nicht, sondern habe nur das Kommentar dort angebracht wo die eigentlichen virtuellen Funktionen überschrieben hätten müssen um mir die Schreibarbeit zu sparen weil sie für das Beispiel irrelevant sind. Es geht mir darum Klassen von der Basisklasse abzuleiten und denen spezielle Funktionen zuzuschreiben die eben <strong>nicht</strong> in der Basisklasse existieren und diese dann mit einer foreach schleife aufrufen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454940</guid><dc:creator><![CDATA[Extremo]]></dc:creator><pubDate>Wed, 27 May 2015 20:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 21:11:28 GMT]]></title><description><![CDATA[<p>beschreib doch mal, wieso du glaubst, das zu brauchen...<br />
falls es nur ums funktionieren geht und du base verändern kannst:</p>
<p><code>virtual bool is_derived_with_custom_fct() const { return false; }</code><br />
bzw <code>return true;</code> in derived</p>
<p>und vor dem blinden static_cast einfach prüfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454943</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 27 May 2015 21:11:28 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 21:31:35 GMT]]></title><description><![CDATA[<p>Ich möchte einen Scenegraph erstellen wo verschiedene Arten von Nodes enthalten sind. Anschließend möchte ich diesen Scenegraph runter und rauf rattern und mit jeder Node etwas bestimmtes machen. <a href="http://de.wikipedia.org/wiki/Szenengraph" rel="nofollow">http://de.wikipedia.org/wiki/Szenengraph</a></p>
<p>z.B. ist eine Node eine &quot;Transformationsnode&quot; wo eine Matrix enthalten ist die ich an das Rendersystem pushen will und eine andere Node z.B. die Modelnode soll einen VBO an OpenGL oder DirectX pushen. Jeweils andere funktionen.. manche sollen auch nichts machen je nach dem und da es bei einem Szenengraphen einfach unpraktisch und unlogisch ist für jede Art von Node nen neuen Baum zu machen sollen die alle in den gleichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454946</guid><dc:creator><![CDATA[Extremo]]></dc:creator><pubDate>Wed, 27 May 2015 21:31:35 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 21:40:25 GMT]]></title><description><![CDATA[<p>Extremo schrieb:</p>
<blockquote>
<p>Es geht mir darum Klassen von der Basisklasse abzuleiten und denen spezielle Funktionen zuzuschreiben die eben <strong>nicht</strong> in der Basisklasse existieren und diese dann mit einer foreach schleife aufrufen zu können.</p>
</blockquote>
<p>Das hab ich schon verstanden. Aber dein Beispiel war eben schlecht und eher irritierend als hilfreich.</p>
<p>Schau dir OpenSceneGraph an. Die machen viel mit dem Visitor Pattern, kann man wenn ich mich recht erinnere auch zum Suchen von Knoten verwenden. Außerdem gibts glaub ich sowas wie asXyz Funktionen für die wichtigen Knotentypen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454947</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 27 May 2015 21:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 22:50:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27927">@Extremo</a><br />
Dein Beispiel ist völlig unverständlich und falsch. (z.B. schonmal syntaktisch falsch, und wenn man davon ausgeht dass du keinen KOMPLETTEN Topfen programmiert hast, dann ist das &quot;returns 1337 twice&quot; auch gänzlich unmöglich, da du nur ein Child hinzufügst.)<br />
Damit wirst du also keine brauchbaren Antworten bekommen.</p>
<p>Extremo schrieb:</p>
<blockquote>
<p>z.B. ist eine Node eine &quot;Transformationsnode&quot; wo eine Matrix enthalten ist die ich an das Rendersystem pushen will und eine andere Node z.B. die Modelnode soll einen VBO an OpenGL oder DirectX pushen. Jeweils andere funktionen.. manche sollen auch nichts machen je nach dem und da es bei einem Szenengraphen einfach unpraktisch und unlogisch ist für jede Art von Node nen neuen Baum zu machen sollen die alle in den gleichen.</p>
</blockquote>
<p>Ich glaube du hast nicht verstanden wie man einen Scene-Graph typischerweise implementiert.</p>
<p>Generell wirst du da sowas finden wie</p>
<pre><code class="language-cpp">class Node
{
// ...
    void Update()
    {
        UpdateDownwardPass();
        for (auto&amp; child : m_children)
            child-&gt;Update();
        UpdateUpwardPass();
    }

    virtual void UpdateDownwardPass() {}
    virtual void UpdateUpwardPass() {}
};
</code></pre>
<p>und das selbe dann nochmal für <code>Render()</code> .<br />
Und in <code>UpdateDownwardPass/UpdateUpwardPass</code> bzw. <code>RenderDownwardPass/RenderUpwardPass</code> <sup>*</sup> machen die Nodes dann was sie halt zu machen haben.<br />
Und evtl. wird bei Update/Render noch ein UpdateContext/RenderContext mitgegeben, worüber die Node dann auf z.B. den aktuellen Timestamp auslesen kann oder auf den Renderer zugreifen.</p>
<p>ps: Dass hier für jedes Child <code>DerivedOne::custom</code> aufgerufen wird liegt schlicht und einfach daran dass du ... für jedes Child <code>DerivedOne::custom</code> aufrufst. Was erwartest du dir von einem <code>static_cast</code> + darauffolgenden Aufruf einer nicht-virtuellen Funktion? =&gt; Bitte 1x C++ Grundlagen lernen.<br />
(Bzw. genaugenommen hat das Programm UB, da du <code>DerivedOne::custom</code> auf Objekte aufrufst die gar kein <code>DerivedOne</code> sind. Was nicht erlaubt ist. Du musst dich allerdings selbst darum kümmer dass du das nicht machst, C++ hilft dir hier nicht magisch aus indem es den verbotenen Aufruf dann einfach weglässt oder sowas.)</p>
<p><sup>*</sup>:<br />
Bin mir nicht sicher ob es üblich ist das Rendern in RenderDownwardPass/RenderUpwardPass zu splitten. Vermutlich nicht. Ist aber auch egal, wenn es nötig ist kommt man während der Entwicklung schon drauf, und splittet es dann halt entsprechend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454955</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 May 2015 22:50:26 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Wed, 27 May 2015 23:05:42 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27927">@Extremo</a><br />
Dein Beispiel ist völlig unverständlich und falsch. (z.B. schonmal syntaktisch falsch, und wenn man davon ausgeht dass du keinen KOMPLETTEN Topfen programmiert hast, ....</p>
</blockquote>
<p>Mir ist vollkommen klar das man normalerweise ein post und pre-render darin stehen hat usw. Mir geht es auch nicht darum wie es im Standardfall implementiert wird, sondern wie ich es in diesem speziellen Fall implementieren <strong>könnte</strong>.</p>
<p>Ja, stimmt. Ich füge nur ein Child hinzu. Natürlich mein Fehler bei dem Beispiel. Allerdings ist sonst soweit alles in Ordnung und ist sogar in fast der gleichen Form in meinem eigenen Programm vorhanden.</p>
<p>Das Problem mit dem Aufruf war eben das entscheidende. Ich habe schon verstanden das beim static_cast beim kompilieren eben genau diese auf eine andere Klasse gecastet wird und somit die Funktion zweimal aufgerufen wird. Was mir eben wichtig war ist das sie nur bei auch tatsächlich übereinstimmenden Klassen aufgerufen wird, die vorher auch bereits diese bestimmte derived Klasse waren oder eben nicht. Das ist übrigens mit dynamic_cast und if(pointer) sehr schön zu lösen.</p>
<p>Beim Rendern wird gesplittet, weil z.B. transformationen aufgehoben werden müssen usw.</p>
<p>Allerdings beantwortet nichts davon meine Frage. Wäre es möglich einen Szenengraphen zu implementieren, der eben nicht nur eine generische Update(post/pre) und Render(post/pre) Funktion beinhaltet?</p>
<p>Ich bin euch ja allen sehr dankbar das ihr immerhin die Zeit genommen habt mir zu antworten, aber solche Antworten die irgendwie an meinem Beispiel rumnörgeln oder mich dazu aufweisen die C++ Grundkentnisse zu lernen helfen mir nicht weiter. Ich bin mir den Grundkentnissen schon bewusst und es fehlt mir hier nicht an Implementationsmöglichkeiten die um das Problem herumspielen. Ich würde aber gerne wissen ob genau DIESE Implementation nach der ich in diesem Thread frage möglich wäre. Es tut mir wirklich leid wenn ich nur ein Child hinzugefügt habe oder mein Beispiel nicht sehr ersichtlich ist. Ich fand es eindeutig, aber wahrscheinlich auch aus dem einfachen Grund das ich mit meinem Problem bekannt bin.</p>
<p>Naja, wie dem auch sei. Beim nächsten mal werde ich versuchen ein deutlicheres Beispiel zu erarbeiten und hoffe dann auch auf bessere Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2454958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454958</guid><dc:creator><![CDATA[Extremo]]></dc:creator><pubDate>Wed, 27 May 2015 23:05:42 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Thu, 28 May 2015 00:32:25 GMT]]></title><description><![CDATA[<p>In Ordnung ist gut, da fehlen ein paar Leerzeichen und Strichpunkte. Wobei die zugegebenermassen zum Verständnis nicht nötig sind. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<blockquote>
<p>Allerdings beantwortet nichts davon meine Frage. Wäre es möglich einen Szenengraphen zu implementieren, der eben nicht nur eine generische Update(post/pre) und Render(post/pre) Funktion beinhaltet?</p>
</blockquote>
<p>Gegenfrage:<br />
Angenommen du hättest eine automagische &quot;für alle Children vom Typ X&quot; Funktion.<br />
Was würdest du damit machen wollen?<br />
Und was für einen Vorteil würdest du dir davon erwarten?</p>
<p>Ich frag' das jetzt nicht um dich zu nerven - sondern ich weiss wirklich nicht worauf du hinaus willst.<br />
Speziell da dir ja anscheinend Lösungsmöglchkeiten für die ursprünglich gestellte Frage bekannt sind.</p>
<p>Bzw. falls es dir wirklich nur darum geht - was mir so auf die Schnelle einfällt:</p>
<ul>
<li><code>dynamic_cast</code> - hast du ja selbst schon erwähnt (ist aber vergleichsweise langsam)<br />
* double dispatch (Visitor pattern) (schon schneller, aber auch net optimal)<br />
* selbstgestrickte Type-Info (z.B. einfach <code>int m_typeId</code> ) (geht nur wenn man immer nur auf den &quot;most derived type&quot; filtern will)<br />
* Bitmaske wo für jede benötigte &quot;Update-Art&quot; einer Node ein Bit gesetzt ist (sollte mMn. ziemlich flott laufen)<br />
* Eigene Liste pro Update-Art (erhöhter Wartungsaufwand, d.h. langsamer beim Einfügen/Löschen neuer Nodes, dafür maximal schnell zu durchlaufen)</li>
</ul>
<p>ps:</p>
<blockquote>
<p>aber solche Antworten die irgendwie an meinem Beispiel rumnörgeln oder mich dazu aufweisen die C++ Grundkentnisse zu lernen helfen mir nicht weiter</p>
</blockquote>
<p>Ich finde schon dass die weiterhelfen, du schreibst ja selbst</p>
<blockquote>
<p>Ich fand es eindeutig, aber wahrscheinlich auch aus dem einfachen Grund das ich mit meinem Problem bekannt bin.</p>
<p>Naja, wie dem auch sei. Beim nächsten mal werde ich versuchen ein deutlicheres Beispiel zu erarbeiten und hoffe dann auch auf bessere Antworten.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2454961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2454961</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 May 2015 00:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Thu, 28 May 2015 09:58:01 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Angenommen du hättest eine automagische &quot;für alle Children vom Typ X&quot; Funktion.<br />
Was würdest du damit machen wollen?<br />
Und was für einen Vorteil würdest du dir davon erwarten?</p>
</blockquote>
<p>Vielleicht macht es aus der technischen Perspektive nicht unbedingt viel Sinn. Schließlich könnte ich ja genau so gut alles in eben diesen vordefinierten Methoden ausführen. Allerdings find ich das es der Lesbarkeit enorm beiträgt und auch die Wartung vereinfacht. Das einzige Plus was mir zur Performance dabei einfällt ist schlicht die Tatsache, manche Sprünge in andere Methoden zu vermeiden, da diese eben überhaupt gar nichts bei den genannten Methoden machen müssen. Es ging mir hier wirklich lediglich darum, es deutlicher darzustellen.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>* double dispatch (Visitor pattern) (schon schneller, aber auch net optimal)</p>
<p>* Eigene Liste pro Update-Art (erhöhter Wartungsaufwand, d.h. langsamer beim Einfügen/Löschen neuer Nodes, dafür maximal schnell zu durchlaufen)</p>
</blockquote>
<p>Könntest du mir vielleicht diese beiden ein wenig genauer erläutern? Mit den anderen Methoden bin ich bereits vertraut. Außer du meinst das ich für jede Node einen Vektor anlege der diese ablegt. Das möchte ich gerne vermeiden, um eben nicht mehrere &quot;Bäume&quot; bzw. Hierarchien zu erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455017</guid><dc:creator><![CDATA[Extremo]]></dc:creator><pubDate>Thu, 28 May 2015 09:58:01 GMT</pubDate></item><item><title><![CDATA[Reply to Scenegraph mit unterschiedlichen Nodes und dessen Funktionen on Thu, 28 May 2015 20:40:48 GMT]]></title><description><![CDATA[<p>Das Visitor-Pattern ist denke ich ausreichend dokumentiert (Wikipedia etc.).</p>
<p>Und mit der &quot;eigene Liste pro Update-Art&quot; meine ich bloss die &quot;Materialisierung&quot; der &quot;benötigt XYZ Update&quot; Flags als eigene Listen.<br />
Also ja, dazu bräuchte dann jede Node eine eigene Liste von Children die z.B. gerendert werden müssen, eine eigene Liste von Children die ein &quot;Logic Update&quot; brauchen usw.<br />
(Bzw. man könnte es auch als eine einzige sortierte Liste implementieren in der man dann mehrere Range-Scans machen muss. Bzw. auch als B-Baum. Ich glaube aber nicht dass diese Variante so &quot;gut&quot; ist dass sich der Aufwand für die sortierte Liste/B-Baum Implementierung lohnen würde.)</p>
<p>Und das geht dann schon ganz leicht in Richtung Component based Design -- wo der Scene Graph dann weitestgehend degradiert wird (oder ganz entfernt). Der wird dann eigentlich nur benötigt falls eine Baumartige Hierarchie der Geometrie. Was oft nicht der Fall ist (bzw. nur lokal benötigt wird, also innerhalb von einzelnen Objekten, damit der Fuss halt am Bein dranhängt).</p>
<p>ps:</p>
<blockquote>
<p>Allerdings find ich das es der Lesbarkeit enorm beiträgt und auch die Wartung vereinfacht.</p>
</blockquote>
<p>Ich kann mir grad nicht vorstellen wie das aussehen könnte so dass es die Lesbarkeit erhöht. Hmmm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455056</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 May 2015 20:40:48 GMT</pubDate></item></channel></rss>