Einfachkrank
2005-02-20, 19:04:23
Moin,
ich habe mir en simples Texturformat für meine selbstprogrammierten Spiele ausgedacht... Dabei werden einfach mehrere Texturen in einer neuen zusammengelegt. In einer dazugehörenden Textdatei stehen für mehrere Texturestücke dann die dazugehören Koordinaten.
Hier, ein Texturbeispiel:
http://www.michael-eberhardt.de/Files/tex_example.jpg
Hier, ein Texturkoordinaten Beispiel:
s1 0, t1 0, s2 256, t2 256
s1 256, t1 0, s2 512, t2 256
// ...
Jetzt werden die reinen Bilddaten zusammen mit den wichtigesten Information und den Texturkoordinaten in ein neues Dateiformat geschrieben. Hier Code für die Convertier Funktion und den wichtigsten Datenstrukturen:
// CM3DTexture Klasse
class _MDLL CM3DTexture
{
public:
CM3DTexture(void);
~CM3DTexture(void);
bool loadBMP (char *filename);
bool loadTGA (char *filename);
bool loadJPG (char *filename);
bool destroy (void);
bool create (void);
unsigned char *data;
unsigned int object;
int sizex, sizey, channels;
char type;
protected:
bool _memalloc, _used;
void decodeJPG (jpeg_decompress_struct* cinfo, tImageJPG *pImageData);
};
// die Convertierungsfunktion
_MDLL bool convertTextureObject(CM3DTexture texture, char *infoFile, char *outputFile)
{
FILE *info, *output;
int numTiles, sbuf[2], tbuf[2], id, tsize;
float (*s)[2], (*t)[2];
info = fopen(infoFile, "r");
if(!info) return false;
output = fopen(outputFile, "wb");
if(!output) return false;
fscanf(info, "num_tiles %d\n", &numTiles);
s = new float[numTiles][2];
t = new float[numTiles][2];
for(int i=0; i < numTiles; i++)
{
fscanf(info, "s1 %d, t1 %d, s2 %d, t2 %d\n", &sbuf[0], &tbuf[0], &sbuf[1], &tbuf[1]);
s[i][0] = (float)sbuf[0] / (float)texture.sizex;
s[i][1] = (float)sbuf[1] / (float)texture.sizex;
t[i][0] = (float)tbuf[0] / (float)texture.sizey;
t[i][1] = (float)tbuf[1] / (float)texture.sizey;
}
fclose(info);
id = M3D_TILETEX_ID;
switch(texture.type)
{
case M3D_JPG:
tsize = texture.channels * texture.sizey;
break;
case M3D_BMP:
tsize = texture.sizex * texture.sizey * texture.channels;
break;
case M3D_TGA:
case M3D_TGA_A:
tsize = texture.sizex * texture.sizey * texture.channels;
break;
}
fwrite(&id, sizeof(int), 1, output);
fwrite(&numTiles, sizeof(int), 1, output);
fwrite(&tsize, sizeof(int), 1, output);
fwrite(&texture.sizex, sizeof(int), 1, output);
fwrite(&texture.sizey, sizeof(int), 1, output);
for(i = 0; i < numTiles; i++)
{
fwrite(s[i], sizeof(int), 2, output);
fwrite(t[i], sizeof(int), 2, output);
}
fwrite(texture.data, sizeof(unsigned char), tsize, output);
fflush(output);
fclose(output);
return true;
}
Beim Laden und rendern entsteht nun folgener Fehler:
http://www.michael-eberhardt.de/Files/tex_prob.jpg
Habt ihr ne Idee oder Vorschläge?
MFG Einfachkrank
ich habe mir en simples Texturformat für meine selbstprogrammierten Spiele ausgedacht... Dabei werden einfach mehrere Texturen in einer neuen zusammengelegt. In einer dazugehörenden Textdatei stehen für mehrere Texturestücke dann die dazugehören Koordinaten.
Hier, ein Texturbeispiel:
http://www.michael-eberhardt.de/Files/tex_example.jpg
Hier, ein Texturkoordinaten Beispiel:
s1 0, t1 0, s2 256, t2 256
s1 256, t1 0, s2 512, t2 256
// ...
Jetzt werden die reinen Bilddaten zusammen mit den wichtigesten Information und den Texturkoordinaten in ein neues Dateiformat geschrieben. Hier Code für die Convertier Funktion und den wichtigsten Datenstrukturen:
// CM3DTexture Klasse
class _MDLL CM3DTexture
{
public:
CM3DTexture(void);
~CM3DTexture(void);
bool loadBMP (char *filename);
bool loadTGA (char *filename);
bool loadJPG (char *filename);
bool destroy (void);
bool create (void);
unsigned char *data;
unsigned int object;
int sizex, sizey, channels;
char type;
protected:
bool _memalloc, _used;
void decodeJPG (jpeg_decompress_struct* cinfo, tImageJPG *pImageData);
};
// die Convertierungsfunktion
_MDLL bool convertTextureObject(CM3DTexture texture, char *infoFile, char *outputFile)
{
FILE *info, *output;
int numTiles, sbuf[2], tbuf[2], id, tsize;
float (*s)[2], (*t)[2];
info = fopen(infoFile, "r");
if(!info) return false;
output = fopen(outputFile, "wb");
if(!output) return false;
fscanf(info, "num_tiles %d\n", &numTiles);
s = new float[numTiles][2];
t = new float[numTiles][2];
for(int i=0; i < numTiles; i++)
{
fscanf(info, "s1 %d, t1 %d, s2 %d, t2 %d\n", &sbuf[0], &tbuf[0], &sbuf[1], &tbuf[1]);
s[i][0] = (float)sbuf[0] / (float)texture.sizex;
s[i][1] = (float)sbuf[1] / (float)texture.sizex;
t[i][0] = (float)tbuf[0] / (float)texture.sizey;
t[i][1] = (float)tbuf[1] / (float)texture.sizey;
}
fclose(info);
id = M3D_TILETEX_ID;
switch(texture.type)
{
case M3D_JPG:
tsize = texture.channels * texture.sizey;
break;
case M3D_BMP:
tsize = texture.sizex * texture.sizey * texture.channels;
break;
case M3D_TGA:
case M3D_TGA_A:
tsize = texture.sizex * texture.sizey * texture.channels;
break;
}
fwrite(&id, sizeof(int), 1, output);
fwrite(&numTiles, sizeof(int), 1, output);
fwrite(&tsize, sizeof(int), 1, output);
fwrite(&texture.sizex, sizeof(int), 1, output);
fwrite(&texture.sizey, sizeof(int), 1, output);
for(i = 0; i < numTiles; i++)
{
fwrite(s[i], sizeof(int), 2, output);
fwrite(t[i], sizeof(int), 2, output);
}
fwrite(texture.data, sizeof(unsigned char), tsize, output);
fflush(output);
fclose(output);
return true;
}
Beim Laden und rendern entsteht nun folgener Fehler:
http://www.michael-eberhardt.de/Files/tex_prob.jpg
Habt ihr ne Idee oder Vorschläge?
MFG Einfachkrank