<?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[Designfrage]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich stecke in einem Designproblem und wollte fragen, wie ihr das lösen würdet.</p>
<p>bisher:</p>
<pre><code class="language-cpp">class ITexture
{

};

class D3D9Texture : public ITexture
{

};

class IRenderer
{
public:
	virtual void RenderTexture(shared_ptr&lt;ITexture&gt; texture);
};

class D3D9Renderer : public IRenderer
{
public:
	virtual void RenderTexture(shared_ptr&lt;ITexture&gt; texture)
	{
		shared_ptr&lt;D3D9Texture&gt; temp = static_pointer_cast&lt;D3D9Texture&gt;(texture);

		//zeichne temp
	}
};
</code></pre>
<p>jetzt brauchte ich aber die Möglichkeit eine animierte Textur zu zeichnen. Da ich diese bisher nur an einer Stelle brauchte, hatte ich die Funktionalität nur dort eingebaut, generell möchte ich das ganze aber auch in einer Klasse kapseln, um sie auch an anderen Stellen benutzen zu können.</p>
<p>Vorgestellt hab ich mir die Klasse bisher so:</p>
<pre><code class="language-cpp">class AnimatedTexture
{
public:
	void AddFrame(shared_ptr&lt;ITexture&gt; frame)
	{
		frames.push_back(frame);
	}

private:
	vector&lt;shared_ptr&lt;ITexture&gt; &gt; frames;
	int nextFrame;
	TimeSpan interval;
};
</code></pre>
<p>Doch wie integriere ich das ganze nun in mein bestehendes System? Ich möchte zB einer PictureBox ein Textur Objekt zuweisen können, bei dem es egal ist, ob es animiert ist oder nicht und quasi erst beim Zeichnen wird entschieden, was dort eigentlich gezeichnet werden soll.</p>
<p>Möglichkeit 1:<br />
Ich ersetze alle Vorkommen von ITexture durch AnimatedTextur. Alle statischen Texturen sind dann eine AnimatedTextur mit nur einem Frame. (gefällt mir nicht)</p>
<p>Möglichkeit 2:<br />
AnimatedTexture erbt von ITextur (gefällt mir auch nicht, weil AnimatedTexture keine ITexture <strong>ist</strong>). Würde zur Folge haben, dass ich an den Stellen wo sie eingesetzt wird, entscheiden müsste, was ich denn grad vor mir hab (normal oder animiert).</p>
<p>Möglichkeit 3:<br />
AnimatedTexture und ITexture erben von zB IDrawable. IDrawable bietet eine Methode Get an:</p>
<pre><code class="language-cpp">class IDrawable
{
public:
	virtual IDrawable Get() = 0;
};

class ITexture : public IDrawable
{
public:
	virtual IDrawable Get()
	{
		return *this;
	}
};

class AnimatedTexture : public IDrawable
{
public:
	virtual IDrawable Get()
	{
		//falls interval abgelaufen ++currentFrame
		return frames[currentFrame];
	}
};

class D3D9Renderer : public IRenderer
{
public:
	virtual void RenderTexture(shared_ptr&lt;IDrawable&gt; texture)
	{
		shared_ptr&lt;D3D9Texture&gt; temp = static_pointer_cast&lt;D3D9Texture&gt;(texture.Get());

		//zeichne temp
	}
};
</code></pre>
<p>Gefällt mir aber auch nicht wirklich, weil außer in der Renderer Klasse trotzdem noch überprüft werden muss, was für ein IDrawable ich benutzen will... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Hat jemand eine Idee, wie ich das Problem möglichst gut (besser wie meine Vorschläge) lösen könnte?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293309/designfrage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 10:44:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293309.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Sep 2011 07:08:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:08:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich stecke in einem Designproblem und wollte fragen, wie ihr das lösen würdet.</p>
<p>bisher:</p>
<pre><code class="language-cpp">class ITexture
{

};

class D3D9Texture : public ITexture
{

};

class IRenderer
{
public:
	virtual void RenderTexture(shared_ptr&lt;ITexture&gt; texture);
};

class D3D9Renderer : public IRenderer
{
public:
	virtual void RenderTexture(shared_ptr&lt;ITexture&gt; texture)
	{
		shared_ptr&lt;D3D9Texture&gt; temp = static_pointer_cast&lt;D3D9Texture&gt;(texture);

		//zeichne temp
	}
};
</code></pre>
<p>jetzt brauchte ich aber die Möglichkeit eine animierte Textur zu zeichnen. Da ich diese bisher nur an einer Stelle brauchte, hatte ich die Funktionalität nur dort eingebaut, generell möchte ich das ganze aber auch in einer Klasse kapseln, um sie auch an anderen Stellen benutzen zu können.</p>
<p>Vorgestellt hab ich mir die Klasse bisher so:</p>
<pre><code class="language-cpp">class AnimatedTexture
{
public:
	void AddFrame(shared_ptr&lt;ITexture&gt; frame)
	{
		frames.push_back(frame);
	}

private:
	vector&lt;shared_ptr&lt;ITexture&gt; &gt; frames;
	int nextFrame;
	TimeSpan interval;
};
</code></pre>
<p>Doch wie integriere ich das ganze nun in mein bestehendes System? Ich möchte zB einer PictureBox ein Textur Objekt zuweisen können, bei dem es egal ist, ob es animiert ist oder nicht und quasi erst beim Zeichnen wird entschieden, was dort eigentlich gezeichnet werden soll.</p>
<p>Möglichkeit 1:<br />
Ich ersetze alle Vorkommen von ITexture durch AnimatedTextur. Alle statischen Texturen sind dann eine AnimatedTextur mit nur einem Frame. (gefällt mir nicht)</p>
<p>Möglichkeit 2:<br />
AnimatedTexture erbt von ITextur (gefällt mir auch nicht, weil AnimatedTexture keine ITexture <strong>ist</strong>). Würde zur Folge haben, dass ich an den Stellen wo sie eingesetzt wird, entscheiden müsste, was ich denn grad vor mir hab (normal oder animiert).</p>
<p>Möglichkeit 3:<br />
AnimatedTexture und ITexture erben von zB IDrawable. IDrawable bietet eine Methode Get an:</p>
<pre><code class="language-cpp">class IDrawable
{
public:
	virtual IDrawable Get() = 0;
};

class ITexture : public IDrawable
{
public:
	virtual IDrawable Get()
	{
		return *this;
	}
};

class AnimatedTexture : public IDrawable
{
public:
	virtual IDrawable Get()
	{
		//falls interval abgelaufen ++currentFrame
		return frames[currentFrame];
	}
};

class D3D9Renderer : public IRenderer
{
public:
	virtual void RenderTexture(shared_ptr&lt;IDrawable&gt; texture)
	{
		shared_ptr&lt;D3D9Texture&gt; temp = static_pointer_cast&lt;D3D9Texture&gt;(texture.Get());

		//zeichne temp
	}
};
</code></pre>
<p>Gefällt mir aber auch nicht wirklich, weil außer in der Renderer Klasse trotzdem noch überprüft werden muss, was für ein IDrawable ich benutzen will... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Hat jemand eine Idee, wie ich das Problem möglichst gut (besser wie meine Vorschläge) lösen könnte?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125358</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:19:03 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>AnimatedTexture erbt von ITextur (gefällt mir auch nicht, weil AnimatedTexture keine ITexture <strong>ist</strong>).</p>
</blockquote>
<p>Warum denn nicht? Also wahrscheinlich erklärt sich die Frage, wenn man wüsste was denn bei dir eine ITextur ist. Wir sehen nur ein nichts</p>
<pre><code class="language-cpp">class ITexture
{

};
</code></pre>
<p>Nach dieser Definition würde ich sagen, dass alles ein ITexture ist. Aber irgendeine Schnittstelle wird ITexture ja deklarieren. Ich hätte halt vermutet, dass es irgendeine Schnittstelle gibt, mit der man die konkrete Textur halt rendern kann. Und kann eine animierte Texture nicht einfach den aktuellen Frame rendern?</p>
<p>Im übrigen hängst Du immer noch an deinem hier schon ausgiebig kritisierten Design</p>
<pre><code class="language-cpp">virtual void RenderTexture(shared_ptr&lt;IDrawable&gt; texture)
    {
        shared_ptr&lt;D3D9Texture&gt; temp = static_pointer_cast&lt;D3D9Texture&gt;(texture.Get());
</code></pre>
<p>Ich fürchte, dass der Thread wieder in diese Richtung abgleiten wird... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125360</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:20:10 GMT]]></title><description><![CDATA[<p>4. Möglichkeit: Du hast zwei Arten von Texturen: AnimatedTexture und Texture. Die behandelst Du jeweils wie erforderlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125361</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:26:52 GMT]]></title><description><![CDATA[<p>Was genau ist eigentlich der Sinn davon, ein ITexture zu haben, wenn das System doch darauf aufbaut, dass jedes ITexture eine D3D9Texture ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125363</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:38:11 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Im übrigen hängst Du immer noch an deinem hier schon ausgiebig kritisierten Design<br />
Ich fürchte, dass der Thread wieder in diese Richtung abgleiten wird... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Hm jetzt weiß ich gar nicht, ob Du das überhaupt warst. Kam mir nur sehr bekannt vor:<br />
<a href="http://www.c-plusplus.net/forum/288208" rel="nofollow">http://www.c-plusplus.net/forum/288208</a></p>
<p>Beide ein Freund von Übergeneralisierung.<br />
Wenn eine animierte Textur tatsächlich keine Textur ist, dann geht es eben Richtung 4.Möglichkeit von Tachyon. Oder, wenn sie ein gemeinsames Konzept haben, haben sie vielelicht eine gemeinsame Basisklasse wie deine Möglichkeit 3, wobei mir dieses Get auch überhaupt nciht gut gefällt. Mir ist aber halt noch nicht klar, wieso eine anmierte Textur keine Textur ist. Die Anwort auf Deine Frage, liegt eben in den Details, die wir hier nicht haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125366</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:39:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a>: ITexture implementiert Methoden wie Fill, Rotate, Load. Diese Funktionen bietet die AnimatedTexture nicht, weil sie ja mehr oder weniger nur ein Container für ITexturen ist.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: Ich möchte zB aber bei einer PictureBox im Gui einfach der Image Eigenschaft eins von beidem zuweisen. Bisher ist dort Image als shared_ptr&lt;ITexture&gt; implementiert. Ich möchte aber sowas machen können:<br />
[cpp]pictureBox-&gt;Image = statische Texture <strong>oder</strong> animierte Textur[/cpp]</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6496">@dot</a>: Je nach verwendeter Technik gibt es natürlich noch OpenGLTexture, D3D10Texture etc und jede Technik hat ihren eigenen Renderer. Der OpenGLRenderer castet ITexture nach OpenGLTexture etc. Intern wird alles einheitlich über das IRenderer Interface behandelt, weil dort noch nicht klar ist, welche Technik der Benutzer letztendlich einsetzt.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125367</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:41:10 GMT]]></title><description><![CDATA[<p>WIe wäre es mit einem Visitor:</p>
<pre><code class="language-cpp">struct abstract_render_engine
{
    virtual void render(d3d9_texture texture) = 0;
    virtual void render(d3d9_animated_texture texture) = 0;

    virtual void render(ogl_texture texture) = 0;
    virtual ~abstract_render_engine();
};

struct abstract_texture
{
    virtual void render(abstract_render_engine engine) = 0;
    virtual ~abstract_texture();
};

class d3d9_texture : public abstract_texture
{
    render(abstract_render_engine engine){ engine.render(*this); }
};

class d3d9_animated_texture : public abstract_texture
{
    render(abstract_render_engine engine){ engine.render(*this); }
};

class d3d9_renderer : public abstract_render_engine
{
    virtual void render(d3d9_texture texture)
    {
        //do things with texture
    }

    virtual void render(d3d9_animated_texture texture)
    {
        //do things with animated texture
    }

    virtual void render(ogl_texture texture)
    {
        throw texture_not_supported();
    }
};
</code></pre>
<p>? Irgendwie so.</p>
<p>Mit einer abstrakten Fabrik könntest Du dann noch gewährleisten, dass man zu einem Renderer nur die passenden Texturen etc. erzeugt werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125368</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:45:00 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: Ich möchte zB aber bei einer PictureBox im Gui einfach der Image Eigenschaft eins von beidem zuweisen. Bisher ist dort Image als shared_ptr&lt;ITexture&gt; implementiert. Ich möchte aber sowas machen können:</p>
</blockquote>
<p>Dann muss Image eben beide Typen annehmen (Überladung). Wenn Du Sachen nicht einheitlich behandeln kannst, dann <em>musst</em> Du irgendwo separate Behandlungen dafür bereitstellen. Das kannst Du entweder suaber von Anfang an machen oder irgendwo in den Eingeweiden mit Hacks wie dynamic_Cast, die hier aber eigentlich überflüssig wären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125371</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:49:03 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a>: nein, der bin ich nicht.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: ist das nicht meine Möglichkeit 3 mehr oder weniger?</p>
<p>Ich habe mich vom Design her an dem .NET Framework orientiert. Dort hat eine PictureBox die Eigenschaft Image, die sowohl normale Grafiken als auch animierte verwalten kann. Wie genau die Klasse (System.Drawing.Image) das handhabt, weiß ich nicht, dazu schaue ich mir eventuell deren Quellcode später einmal an. Ich nehme an so wie bei mir in Möglichkeit 1.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125372</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 07:52:40 GMT]]></title><description><![CDATA[<p>Ja, eine Lösung über Double Dispatch wäre zumindest sehr viel sauberer.<br />
Aber rein prinzipiell versuchst du da einen API-Wrapper zu basteln. Und meiner Erfahrung nach ist das keine besonders gute Idee. Glaub mir, wo ich noch klein war, hab ich x Mal versucht, genau auf Basis eines solchen Design meine 42ste &quot;Engine&quot; (diesmal klappts bestimmt) zu bauen.<br />
Versuch nicht was zu basteln, was nach Außen wieder gleich aussieht wie die Grafik-API drunter. Dadurch gewinnst du nichts. Bastel dir eine vernünftige Abstraktion für deine Anwendung. Was genau will deine Anwendung tun? Davon, dass es auf API-Ebene sowas wie &quot;Texturen&quot; gibt, muss deine Anwendung normalerweise überhaupt nichts wissen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125374</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 30 Sep 2011 07:52:40 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:02:14 GMT]]></title><description><![CDATA[<p>Ist ein ITexture Interface, dass Methoden zum Bearbeiten von Bitmapdaten anbietet kein vernünftige Abstraktion? Genauer ins Detail gehen möchte ich an dieser Stelle ja nicht, weil für alles weitere eben die Grafik-API zuständig ist.</p>
<p>Insgesamt läuft es also auf eine Basisklasse hinaus, von der beide Versionen erben, was aber irgendwie wieder auf das Get in Möglichkeit 3 hinausläuft, wenn ich meiner AnimatedTexture nicht die Möglichkeit gebe, sich wie eine ITexture zu verhalten (Fill-Methoden, etc) Damit könnte ich ja sogar noch leben, indem sie zB eine Methode SelectFrame(frameNum) bekommt und dann die Methoden nur auf dieses eine Frame ausführt. :|</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125378</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:03:39 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: ist das nicht meine Möglichkeit 3 mehr oder weniger?</p>
</blockquote>
<p>Eher weniger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125379</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:03:39 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:09:02 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Ist ein ITexture Interface, dass Methoden zum Bearbeiten von Bitmapdaten anbietet kein vernünftige Abstraktion?</p>
</blockquote>
<p>Die Tatsache dass du diesen Downcast in <code>RenderTexture</code> brauchst, schreit doch nach Designfehler.</p>
<p>Was genau ist es, das deine Anwendung tut und warum muss es dabei unbedingt <code>Renderer-&gt;RenderTexture()</code> sein und nicht z.B. <code>Texture-&gt;Render()</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125380</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:09:02 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:26:38 GMT]]></title><description><![CDATA[<p>den Downcast brauche ich, damit ich an das eigentliche LPDIRECT3DTEXTURE9 Objekt (in D3D9Texture) komme, das mir das IDirect3DDevice9 (in D3D9Renderer) dann zeichnet.</p>
<pre><code class="language-cpp">class D3D9Renderer : public IRenderer
{
public:
	virtual void RenderTexture(shared_ptr&lt;ITexture&gt; texture)
	{
		shared_ptr&lt;D3D9Texture&gt; temp = static_pointer_cast&lt;D3D9Texture&gt;(texture);

		device-&gt;SetTexture(0, temp-&gt;GetTexture());

		//ob ich hier jetzt in D3D9Texture oder einen Schritt später GetTexture() in LPDIRECT3DTEXTURE9 caste, ist ja egal...

		AddVertex(x, y, 0.0f, 0.0f);
		AddVertex(x + w, y, 1.0f, 0.0f);
		AddVertex(x, y + h, 0.0f, 1.0f);
		AddVertex(x + w, y, 1.0f, 0.0f);
		AddVertex(x + w, y + h, 1.0f, 1.0f);
		AddVertex(x, y + h, 0.0f, 1.0f);

		device-&gt;DrawPrimitiveUP(D3DPT_TRIANGLELIST, verticesNum / 3, &amp;vertices[0], sizeof(Vertex2D));
	}
};
</code></pre>
<p>Die ganze Vertex Verwaltung hat in der Textur nichts zu suchen. IDirect3DDevice9 rendert ja die Textur und nicht umgekehrt. Aus diesem Grund gibt es auch keine Textur-&gt;Render() Funktion (klar, sorum wäre das ganze absolut unproblematisch)</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125386</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:28:41 GMT]]></title><description><![CDATA[<p>Ich greife nochmal meinen Code auf:</p>
<pre><code class="language-cpp">virtual void render(d3d9_texture texture)
    {
        device-&gt;SetTexture(0, texture-&gt;GetTexture()); //kein cast
        AddVertex(x, y, 0.0f, 0.0f);
        AddVertex(x + w, y, 1.0f, 0.0f);
        AddVertex(x, y + h, 0.0f, 1.0f);
        AddVertex(x + w, y, 1.0f, 0.0f);
        AddVertex(x + w, y + h, 1.0f, 1.0f);
        AddVertex(x, y + h, 0.0f, 1.0f);

        device-&gt;DrawPrimitiveUP(D3DPT_TRIANGLELIST, verticesNum / 3, &amp;vertices[0], sizeof(Vertex2D));         
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2125389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125389</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:33:13 GMT]]></title><description><![CDATA[<p>den cast für eine Renderer Klasse einzusparen, die für jeden beliebigen Texturtyp eine RenderMethode bereitstellt, halte ich für etwas fragwürdig. Wenn eine neue Grafik-API dazukommt, muss jeder Renderer (oder nur der BaseRenderer, falls er nicht mehr virtuel gemacht wird) geändert werden, nur um in der Funktionen eine &quot;gibts net&quot; Exception zu werfen. Das kann unmöglich ein gutes Design sein.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125391</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:33:13 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:39:51 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>den cast für eine Renderer Klasse einzusparen, die für jeden beliebigen Texturtyp eine RenderMethode bereitstellt, halte ich für etwas fragwürdig. Wenn eine neue Grafik-API dazukommt, muss jeder Renderer (oder nur der BaseRenderer, falls er nicht mehr virtuel gemacht wird) geändert werden, nur um in der Funktionen eine &quot;gibts net&quot; Exception zu werfen. Das kann unmöglich ein gutes Design sein.</p>
<p>greetz KN4CK3R</p>
</blockquote>
<p>Doch ist es. Denn jeder neue Renderer und die dazu gehörenden Texuren ist unterschiedlich, und das wird dadruch ausgedrückt. Du hingegen versuchst die ganze Zeit, Unterscheide auf &quot;Teufel komm raus&quot; gleich zu biegen. Und <em>das</em> ist scheiss Design. Zu mal die Anzahl der möglichen Renderer vermutlich eher begrenzt sein wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125394</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:39:51 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:44:18 GMT]]></title><description><![CDATA[<p>der Unterschied zwischen OpenGL und D3D Textur tritt im entsprechenden Renderer auf, vorher existiert kein Unterschied. Und der Renderer weiß, was er vor sich hat.</p>
<p>Ein Autohändler stellt ja auch nur ein Schild &quot;kaufe Kraftfahrzeuge&quot; und nicht &quot;kaufe PKWs&quot;, &quot;kaufe Motorräder&quot;, &quot;kaufe LKWs&quot; vor sein Geschäft und sagt dem LKW Fahrer dann &quot;ich kaufe ihren LKW aber nicht ihren PKW und auch nicht ihr Motorrad&quot; eben weil der LKW Fahrer nur einen LKW hat.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125400</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:44:18 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:48:48 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>den Downcast brauche ich, damit ich an das eigentliche LPDIRECT3DTEXTURE9 Objekt (in D3D9Texture) komme, das mir das IDirect3DDevice9 (in D3D9Renderer) dann zeichnet.</p>
</blockquote>
<p>Mir ist klar <em>warum</em> du den Cast brauchst. Das Problem liegt ja eben genau in der Natur dieses Designs, das den Cast erst notwendig macht. Der Cast ist nur Symptom. Worum es geht ist, mal festzustellen, dass hier ein Designfehler vorliegt.</p>
<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Die ganze Vertex Verwaltung hat in der Textur nichts zu suchen. IDirect3DDevice9 rendert ja die Textur und nicht umgekehrt. Aus diesem Grund gibt es auch keine Textur-&gt;Render() Funktion (klar, sorum wäre das ganze absolut unproblematisch)</p>
</blockquote>
<p>Und was interessiert das die Anwendung, dass es intern ein ID3Direct3DDevice9 gibt, das die Textur rendert? Warum muss deine Abstraktionsschicht unbedingt das Interface der zugrundeliegenden Grafik-API widerspiegeln? In D3D11 hast du plötzlich keinen Device mehr, der rendert, sondern einen DeviceContext. Deine D3D11 Implementierung möchte vielleicht multithreaded Rendering einsetzen. Wie löst du das? Ich vermute mal, deine Anwendung will einfach nur 2D Bildchen malen!? Dann bau ein Interface, dass es erlaubt, 2D Bildchen zu malen. Und zwar so wie die Anwendung es will und nicht so wie die Grafik-API es will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125401</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:48:48 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:51:38 GMT]]></title><description><![CDATA[<p>ja macht die Anwendung doch?! Die Anwendung ruft beim Renderer RenderTexture auf, alles was danach passiert, ist Sache der Grafik-API und interessiert die Anwendung nicht. Die Anwendung kann sich ja auch gar nicht dafür interessieren, weil sie nicht weiß, auf welcher Grafik-API sie überhaupt ausgeführt wird.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125403</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 08:54:29 GMT]]></title><description><![CDATA[<p>Warum genau muss die Anwendung ihre Texturen selbst rendern. Sollte das Rendern nicht vielleicht Aufgabe des Renderers sein? Wenn es sich da um einen Sprite Renderer handelt (was ich mal schwer vermute), dann wirst du früher oder später nicht eine Textur pro Bild haben, sondern mehrere Bilder in eine Textur packen wollen, um möglichst viele Sprites in einem Drawcall zu rendern. Wie löst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125406</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 30 Sep 2011 08:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 09:01:41 GMT]]></title><description><![CDATA[<p>Wieso sollte sie sich nicht selbst zeichnen?<br />
Die PictureBox bekommt quasi per WM_PAINT einen IRenderer* geschickt und ruft dann renderer-&gt;RenderTexture(mein anzuzeigendes Bild); auf. Woher sollte der Renderer wissen, wie eine PictureBox aussieht.</p>
<p>Eine Textur beinhaltet nur ein Bild (außer die animierte ;)) und dadran wird sich auch nichts ändern. Dass alles auf einer Textur ist und nur gezeichnete Ausschnitt verschoben wird, ist nicht geplant und auch nicht gewollt.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125408</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Fri, 30 Sep 2011 09:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage on Fri, 30 Sep 2011 09:03:07 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Ein Autohändler stellt ja auch nur ein Schild &quot;kaufe Kraftfahrzeuge&quot; und nicht &quot;kaufe PKWs&quot;, &quot;kaufe Motorräder&quot;, &quot;kaufe LKWs&quot; vor sein Geschäft und sagt dem LKW Fahrer dann &quot;ich kaufe ihren LKW aber nicht ihren PKW und auch nicht ihr Motorrad&quot; eben weil der LKW Fahrer nur einen LKW hat.</p>
</blockquote>
<p>Ein PKW Händler stellt aber das Schild auf &quot;Kaufe PKW&quot; und ein LKW Händler stellt das Schild auf &quot;Kaufe LKW&quot;. Denn ein PKW Händler will nur PKW haben und ein LKW Händler nur LKW. Ein Kraftfahrzeugshandel ist ein abstraktes Gebilde, genau wie ein Kraftfahrzeug. Wenn es kein generelles Konzept gibt, dass jeder Kraftfahrzeughandel ein beliebiges Kraftfahrzeug kaufen kann, dann gibt es kein Schild &quot;Kaufe Kraftfahrzeug&quot;, dass vor jedem Kraftfahrzeughandel steht.</p>
<p>Es ist das gleiche wie <a href="http://www.c-plusplus.net/forum/287913" rel="nofollow">hier</a>, eine Verletzung des LSP. Das Schild &quot;Kaufe Kraftfahrzeuge&quot; ist für den PKW Handel mit einer zusätzlichen Bedingung versehen, der PKW Händler sagt &quot;Ätsch.. kaufe gar nicht alle Kraftfahrzeuge, ich kaufe nur PKW&quot;. Du kannst dem PKW Händler nicht einfach statt einem PKW ein Motorrad verkaufen (Substitution), da wird es irgendwo Ärger geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2125409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2125409</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 30 Sep 2011 09:03:07 GMT</pubDate></item></channel></rss>