|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
fast hawk Senior JLI'ler
Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
Verfasst am: 17.10.2007, 17:16 Titel: Auslesen eines PNGs aus dem Arbeitsspeicher |
|
|
Hi
hab en kleines Problem:
Ich hab ein archiv in dem alle meine resourcen drinnen sind.
Dann less ich aus dem archiv jetzt zum beispiel ma mal die "menubackground.PNG".
Wenn ich die jetzt aus dem archiv gelessen hab, hab ich die Datei im Arbeitsspeicher... Nun gut aber wie sag ich jetzt meiner Direct3D Rutinne das sie ihrer Textur nicht von der Festplatte sonder aus dem Arbeitsspeicher nehmen soll. Den die Dateistruktur ist vollständig identisch!! Ich könnt natürlich die Datei dann wieder einzeln über einen Binärstream auf die Festplatte speicher und nach dem auslesen wieder löschen aber das scheint mir eine ziemliche Verschwendung! So ist meine Frage jetzt ob jmd eine Möglichkeit kennt Direct3D zu sagen :"Hey du, du bekommst jetzt eine Adresse im Arbeitsspeicher und keinen Pfad von der Festplatte.." Oder müsst ich dann selber eine eigene Funktion schreiben die die Datei entkomprimiert(JPG->BMP) und als Textur anlegt??
Schon jetzt vielen Dank!
gruß f. hawk |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 17.10.2007, 17:30 Titel: |
|
|
Soviel ich weiß gibt es da eine D3DXCreateTextureFromFileInMemory(...) Methode vom IDirect3DDevice9. Der brauchst du dann nur anstatt dem Pfad auf der Festplatte die Adresse im Arbeitsspeicher übergeben. |
|
Nach oben |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 17.10.2007, 20:52 Titel: |
|
|
in meinem Res-Manager nutze ich das:
Code: | // Textur hinzufügen
void Cresmanager::AddTexture(char* lpFileName)
{
// testen, ob die Textur bereits vorhanden ist
LPDIRECT3DTEXTURE9 lpTexture = this->GetTexture(lpFileName);
// wenn sie nicht vorhanden ist, wird sie wie
// gewohnt erzeugt
if(!lpTexture)
{
int size;
void* data;
data = Archiv.LoadFile(lpFileName, &size);
D3DXIMAGE_INFO ImgInfo;
D3DXGetImageInfoFromFileInMemory(data, size, &ImgInfo);
LPDIRECT3DTEXTURE9 lpTexture;
D3DXCreateTextureFromFileInMemoryEx(m_lpD3DDevice,
data,
size,
ImgInfo.Width,
ImgInfo.Height,
1,0,
D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,
D3DX_FILTER_NONE,
D3DX_FILTER_NONE,
0,0,0,
&lpTexture);
// und in die Map unter ihrem Namen eingefügt
this->m_MapTextures[lpFileName] = lpTexture;
}
} |
Hier noch Archiv.LoadFile, aus meiner Klasse, die die Dateien aus einem unkomprimierten Zip-Archiv holt. Ist evt. interessant für den Wert von data ^^
Wobei data halt nur der Zeiger auf das Bild ist ^^
... aber der vollständigkeit halber die methode:
Code: | void* Czipreader::LoadFile(char* FileName, int* ObjectSize)
{
char* ZipFilename = priv_Archiv;
char* ObjectName = FileName;
// Datei zum binären Lesen öffnen
FILE* File = NULL;
fopen_s(&File, ZipFilename, "rb");
if(!File) return 0;
ZipHeader Header;
char Filename[256];
// Schleifenbeginn
while(true)
{
// Header einlesen. Bei Ende der Datei: Abbruch!
fread(&Header, 1, sizeof(ZipHeader), File);
if(feof(File)) {fclose(File); return 0;}
// Dateiname einlesen
ZeroMemory(Filename, 256);
fread(Filename, 1, Header.FilenameLength, File);
// Eventuelle Extradaten werden übersprungen.
fseek(File, Header.ExtraLength, SEEK_CUR);
// Ist dies das gesuchte Objekt?
if(!stricmp(Filename, ObjectName))
{
// Ja! Signatur, Kompression und Verschlüsselung prüfen.
if(Header.Signature != 0x04034B50 ||
Header.CompressionMethod != 0 ||
Header.GeneralPurpose & 0x0001)
{
// Entweder Signatur falsch, oder das Objekt ist
// komprimiert oder verschlüsselt!
fclose(File);
return 0;
}
// Alles OK - Wir verlassen die Schleife!
break;
}
// Das Objekt ist nicht das Gesuchte!
// Wir überspringen seine Daten und die eventuell folgenden
// 12 Bytes.
fseek(File,
Header.CompressedSize
+ ((Header.GeneralPurpose & 0x0008) ? 12 : 0),
SEEK_CUR);
}
// Das Objekt wurde gefunden und der Lesezeiger zeigt nun
// direkt auf seine Daten. Wir reservieren einen Speicherbereich
// von entsprechender Größe und lesen die Daten hinein.
char* Data = new char[Header.CompressedSize];
fread(Data, 1, Header.CompressedSize, File);
// Datei schließen
fclose(File);
// Falls gewünscht: Die Größe der Daten eintragen
if(ObjectSize) *ObjectSize = Header.CompressedSize;
// Zeiger auf die Daten liefern
return Data;
} |
_________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
|
fast hawk Senior JLI'ler
Anmeldedatum: 15.07.2005 Beiträge: 237 Wohnort: Freiburg Medaillen: Keine
|
Verfasst am: 18.10.2007, 14:29 Titel: |
|
|
hey vielen dank genau das was ich brauche!
@asto komisch meine funktion sieht fast genauso aus^^
hast du dich auch von dem einen Tut wo beschreiben ist wie man ein unkomprimiertes zip-archiv ausliest??
nochmal danke an euch beide!
gruß f. hawk _________________ Jetziges Projekt: The Ring War
Status: 40%
-----------------------------------
Nicht weil es schwer ist, wagen wir es nicht, sondern weil wir es nicht wagen, ist es schwer.
--
Lucius Annaeus Seneca (4)
röm. Philosoph, Dramatiker und Staatsmann |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|