Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.12.2003, 15:09

Textur aus Speicher für Font erstellen *edit*

Frohes Fest euch allen!!

Ich habe ein "kleines" Problemchen. Ich will jetzt eine Font Klasse schreiben natürlich nach Davids Vorlage, aber eben selbst schreiben und soweit erscheint mir das auch ganz logisch nur schlägt meine methode zum erstellen der Textur aus Speicher fehl...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
    //Texture laden
    if(FAILED( hResult = 
        D3DXCreateTextureFromFileInMemoryEx(g_lpDevice, 
                                            (BYTE*)(fFile.getBuffer()) + fFile.getCursor(),
                                            fFile.getSize() - fFile.getCursor(),
                                            D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, 
                                            D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
                                            D3DX_DEFAULT, D3DX_DEFAULT,
                                            0, NULL, NULL, &m_texture)))
    {
        sbWriteToLog("Error: Texture konnte nicht aus Virtueller Datei ertellt werden!\n");
        return sb_FAIL;
    }


ich denke es wird daran liegen, dass beim erstellen einer virtuellen datei nicht sicher bin wie ich den speicher dafür reservieren muss

Quellcode

1
2
3
4
// Speicherbereich reservieren, der groß genug ist
    void* tmp = ::operator new (FileStats.st_size);
    pData = (BYTE*)(tmp);
    if(pData == NULL) return sb_FAIL;


im original siehts ja so aus

Quellcode

1
2
3
4
5
// Speicher reservieren und leeren. Beim Reservieren werden ein
    // paar Bytes mehr gebraucht, damit der Zeiger auf den Listeneintrag
    // mitgespeichert werden kann.
    pMemory = ::operator new(iSize + sizeof(tbListEntry<tbMemListEntry>*));
    if(pMemory == NULL) return NULL;

und pMemory wird dann als (BYTE*)pMemory zurückgeliefert.. ich dachte mir ich kann mir die funktion "sparen" und es gleich so hinschreiben wie ich es oben gemacht habe.. lieg ich da falsch!? oder stimmt woanders was nicht!? bin für jeden tipp dankbar!

2

26.12.2003, 16:06

ohh siehe da ich hab den fehler gefunden! ziemlich dumm sorry!
man muss ja noch die Größe der virtuellen Datei eintragen m_iSize die ja beim erstellen der Textur gebraucht wird und ich hatte leider die größe des Zeiges auf den Speicher und nicht den eigentlich Wert eingetragen!

Quellcode

1
2
3
4
    // Größe eintragen
    stat(pcFilename, &FileStats);

    m_iSize = FileStats.st_size;


so is richtig...



Edit:

Sind noch ein paar fragen bei mir aufgetaucht.....

1. ich benutze ja nicht das "originale" Vector2 format sondern:

Quellcode

1
2
3
4
5
6
7
8
struct sbVector2
{
    float x,y;

    inline sbVector2() {};
    inline sbVector2(const float px,const float py) : x(px), y(py) {};
    inline operator = (const sbVector2& t) {x = t.x, y = t.y;};
};


aber lese trotzdem mit "meinem" sbVector2 aus einer tbf datei die Werte ein.. kommts dabei zu problemen?.. ich hab die werte mal in eine datei ausgegeben sieht eigentlich vernünftig aus....

Quellcode

1
2
3
4
5
6
7
8
9
10
fWidth =  10.000000
fHeight = 24.000000
fTextureWidth = 256.000000
fTextureHeight = 256.000000
Vector2: x = 0.003922  y = 0.003922 //avTopLeft[0]
Vector2: x = 0.047059  y = 0.094118 //avBottomRigth[o]
Vector2: x = 0.054902  y = 0.003922 //avTopLeft[1]
Vector2: x = 0.098039  y = 0.094118 // und so weiter
Vector2: x = 0.105882  y = 0.003922
Vector2: x = 0.149020  y = 0.094118


2. Bei David wird das ganze mit Effekten gerendert.. aber das ist nicht umbedingt notwendig oder?.. ich wollte es so machen

Quellcode

1
2
3
4
5
6
7
8
9
10
    if(dwVtxCursor >= 600 || dwChar == (DWORD)(iLength -1))
        {
            begin();

            g_lpDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, dwVtxCursor / 3, aVertex, sizeof(sbFontVertex));

            end();

            dwVtxCursor = 0; // Vertexcursor zurücksetzen
        }


bei der methode begin setzte ich die sachen die ich für das Textrendern brauche... Textur, Vertexformat, Zbuffer aus etc.. aber leider sehe ich nichts wenn ich Text rendern will.. obwohl keine der Funktionen einen Fehler zurückliefert.. ???