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

Snorky

Frischling

  • »Snorky« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

1

14.08.2003, 10:30

Nachtrag: 2D-Grafik-Engine und Texturmanagerfehler

Schön, dass mein Beitrag zur 2D-Grafik Anklang gefunden hat. :jump2:

Nachdem mich David darauf hingewiesen hat, dass das Nichtspeichern der echten Bildgrößen in der tbTextureListEntry im Texturmanager einen Sinn bei der Suche auf doppelte Einträge hat, obwohl ich finde dass in solch einer Struktur eher die tatsächlichen Daten gehören eben damit man sie nicht jedesmal neu ermitteln muss, hab ich meine 2DSprite-Dateien dahingehend abgeändert. Wer also ebenfalls aus Konsistenzgründen den Texturmanager nicht verändern möchte sollte folgende Passagen in der 2DSprite.cpp und 2DVolumeSprite.cpp ändern, damit alles weiterhin klappt:

tb2DSprite.cpp in der Init() folgenden Eintrag im if(tbTextureManager::IsInitialized())-Block

Quellcode

1
2
3
4
5
// Bilddimensionen speichern 
int iTextureIndex = tbTextureManager::GetTextureIndex(m_pTexture); 
tbTextureListEntry* pTextureList = tbTextureManager::GetTextureList(); 
m_2DSpriteInfo.fTextureHeight = (float)pTextureList[iTextureIndex].iHeight; 
m_2DSpriteInfo.fTextureWidth = (float)pTextureList[iTextureIndex].iWidth;

durch diesen hier ersetzen:

Quellcode

1
2
3
4
5
        // Bilddimensionen speichern
        D3DSURFACE_DESC Desc;
        m_pTexture->GetLevelDesc(0, &Desc);
        m_2DSpriteInfo.fTextureHeight = (float)Desc.Height;
        m_2DSpriteInfo.fTextureWidth = (float)Desc.Width;


tb2DVolumeSprite.cpp in der Init() ebenfalls an der gleichen Stelle folgenden Block pasten:

Quellcode

1
2
3
4
5
6
        // Bilddimensionen speichern
        D3DVOLUME_DESC Desc;
        ((IDirect3DVolumeTexture9*)m_pTexture)->GetLevelDesc(0, &Desc);
        m_2DSpriteInfo.fTextureHeight = (float)Desc.Height;
        m_2DSpriteInfo.fTextureWidth = (float)Desc.Width;
        m_2DSpriteInfo.fTextureDepth = (float)Desc.Depth;


Damit kann man den Texturmanager weiterhin so belassen, wie er war und trotzdem in den Genuß von pixelgenauer 2D-Sprite-Darstellung kommen, die auch die richtigen Texturkoordinaten verwendet.

Snorky

Frischling

  • »Snorky« ist der Autor dieses Themas

Beiträge: 34

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

2

14.08.2003, 11:24

Nachtrag zum Nachtrag

Ich glaub ich hab mich nicht ganz korrekt ausgedrückt zur tb2DVolumeSprite.cpp, außerdem ist mir ein Bug aufgefallen und bevor die ersten Verzweiflungsfragen kommen hier das Fixup:

Also in tb2DVolumeSprite.cpp in der Init() gibt es im Texturmanager-Zweig einen if-Block:
// werden keine Volumentexturen unterstützt?
if(m_pTexture == NULL) ...
in diesem Block am Ende muss nach der Fehlerabfrage der folgender Block gepastet werden:

Quellcode

1
2
3
4
5
6
            // Bilddimensionen speichern
            D3DSURFACE_DESC Desc;
            ((IDirect3DTexture9*)m_pTexture)->GetLevelDesc(0, &Desc);
            m_2DSpriteInfo.fTextureHeight = (float)Desc.Height;
            m_2DSpriteInfo.fTextureWidth = (float)Desc.Width;
            m_2DSpriteInfo.fTextureDepth = 1.0f;

im else-Zweig kommt dann der schon bekannte Bereich:

Quellcode

1
2
3
4
5
6
            // Bilddimensionen speichern
            D3DVOLUME_DESC Desc;
            ((IDirect3DVolumeTexture9*)m_pTexture)->GetLevelDesc(0, &Desc);
            m_2DSpriteInfo.fTextureHeight = (float)Desc.Height;
            m_2DSpriteInfo.fTextureWidth = (float)Desc.Width;
            m_2DSpriteInfo.fTextureDepth = (float)Desc.Depth;


Was mir auch gerade aufgefallen ist, ist dass z.Z. der Texturmanager bei Volumensprites garnicht benutzt wird. Das liegt an einem kleinen Debug-Bug:

Quellcode

1
2
// Texturmanager benutzen, wenn er initialisiert ist 
if(false&&tbTextureManager::IsInitialized())

das false&& muss natürlich raus!

Außerdem fehlt im Nicht-Texturmanager-Zweig die Tiefenbestimmung:

Quellcode

1
2
3
4
        // Bilddimensionen speichern
        m_2DSpriteInfo.fTextureHeight = (float)dinfo.Height;
        m_2DSpriteInfo.fTextureWidth = (float)dinfo.Width;
        m_2DSpriteInfo.fTextureDepth = (float)dinfo.Depth;

also die letzte Zeile noch nachtragen.

Ich hoffe das wars jetzt wirklich :-(