3D-Engine Design Frage ...



  • Hi,

    ich bastel immer noch an einer kleine Spielengine herum und bin gerade an einen Punkt gekommen, an dem ich nicht so recht weiß wie ich eine Text-Klasse (macht aus Alphabet-Textur und ascii-text einen Text-Mesh) in die Engine reinbasteln soll.
    Hier mal grob wie ichs mir bis jetzt gedacht habe:

    class clsText
    {
    
    public:
    
    	clsText(clsRenderer* tRenderer);
    	~clsText();
    
    	bool SetFontTexture( int TexID , int cw, int ch);
    	void CreateText(char cText, cTextLen);
    	void RenderText();
    	Vector3 meshPosition;
    	Vector3 meshScalation;
    	Vector3 meshRotation;
    
    private :
    
    	clsRenderer* TextRenderer;
    	int TexCharWidth;
    	int TexCharHeight;
    	int TextureID;
    
             ...
    
    };
    

    Das Problem ist diese Funktion hier (siehe auch oben)

    bool SetFontTexture( int TexID , int cw, int ch);
    

    Die TexID ist ein Nummer die eine Textur im TextureManager identifizert.
    Wenn ich das allerdings so lasse, muss ich die Textur außerhalb der Klasse erstellen und wieder freigeben:

    // Spielstart
    int FontTextureID;
    FontTextureID = Renderer->TextureManager->CreateTexture("alphabet.bmp", ...);
    ...
    
    //im Spiel
    clsText* StatusText = new clsText(Renderer);
    StatusText->SetFontTexture(FontTextureID, 20,30);
    StatusText->CreateText("Blah Blub", 9);
    
    // drei sekunden lang
    StatusText->RenderText();
    
    // danach
    delete StatusText;
    
    ...
    //SpielEnde
    Renderer->TextureManager->ReleaseTexture(FontTextureID);
    

    Diese Variante hätte den Vorteil, das ich die Textur nur einmal laden und für mehrere Texte leicht verwenden kann. Allerdings hab ich ja mehrere Texte und so muss ich mich dann außerhalb der Textklasse um dutzende Texturen kümmern.

    Eine andere Variante wäre das:

    // Spielstart
    clsText* StatusText = new clsText(Renderer);
    StatusText->LoadFontTexture("alphabet.bmp", 20,30, groesse, colorkey, etc....);
    ...
    
    //im Spiel 
    StatusText->CreateText("Blah Blub", 9);
    
    // drei sekunden lang:
    StatusText->RenderText();
    
    ...
    //SpielEnde
    delete StatusText; // Destruktor soll die Texturfreigeben ... aber was wenn sie noch von einer anderen Textkalsse verwendet wird?
    

    Hier würde der TextureManager dann verhindern das die Textur doppelt geladen wird, allerdings müsste ich dann die ganzen Erstellungs-Parameter für die Textur durch die Text-Klasse durchschleifen, was ich auch wieder unschön finde.

    Anmerkung: Das Problem mit der Textur hab ich auch mit dem Material, Lichtern etc. Da hab ist die Frage die Selbe: "Innerhalb oder Außerhalb?"

    Oder ist schon das ganze Desgin an sich Kacke? (Bitte sagen wenn es so ist, ich glaubs inzwischen schon 😞 )

    Wie macht ihr das in euren Engines oder wie würdet ihr es machen?



  • In der Ecopoeisis Engine haben wir es so geregelt, das der Texturmanager das mehrfachladen verhindert.

    Bye, TGGC \-/


Anmelden zum Antworten