Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Хранение файлов в собственном формате


Автор: ZC1989 18.7.2006, 18:52
Доброго Всем Времени Суток! smile 

я не так давно начал юзать дирекст.. на С++ могу (не без матершины) писать... но в основном это примитив... щас вот взял двух пацанов и мы начали делать игруху, как наверное стало понятно, я единственный программирующий из Нас. 

написал "вход" в игру... развернул сцену и отображением того же примитива, но возник своевременный вопросец - как создать собственную систему архивации и хранения изображений, со сжатием и минимальными потерями качества.
мне нравится эта раелизация в ГТА, в своё время я там весь движок перелопатил и единственное хорошее там именно хранение файлов, на мой взгляд...

Пожалуйста, подскажите, как сверстать что-то подобное?! просто я подошёл к моменту введения текстур и мне не хотелось бы тоскать за собой огромный шлейф БМПшек... smile  

Автор: MoZy 20.7.2006, 19:03
Ну если хочешь сжимать вообще без потерь, то поищи в инете исходники GZIP'а. Пишешь свой запаковщик/распаковщик типа IMG Tool.
Вобщем так:

Открываешь бмпешку в буфер, сжимаешь GZIP'ом  и пишешь в свой файл следущее:

simple.bmp//имя файла
153000     //размер в байтах (сколько читать)
.............    //и тут все 153000 байт сжатого бмп

logo.bmp //имя другого файла
20500
.........

и так по мере надобности добавляешь или перезаписываешь.

потом, когда понадобится прочитать, то поступаешь так:

допустим ты знаешь бмпешку по имени, тогда ты читаешь первую строчку своего файла, если не совпадает, читаешь сколько байт и seek'ом их пропускаешь, затем все повторяется, пока не наткнешься на EOF или свой файл. 
Если тебе повезло, то читаешь его в буфер и декодируешь. Вот, у тебя готовый Bitmap.

Можно еще, при создании твоего архива, делать лог-файл, в котором указывается позиция какого-то файла (ну и число байт), тогда в самом архиве можно хранить все сплошняком. И поиск тогда не нужен: сразу seek и в буфер. 

Автор: Rickert 22.7.2006, 09:11
ZC1989
Текстуры берут без потерь. В большенстве своём аля TGA. А потом всё сжимают архивируя. Таким образом пространства занимается мало и потреь качества нет. 

Автор: ZC1989 5.8.2006, 16:21
блин... забыл я про эту тему....


MoZy, спасибо за мысли, я думаю как раз сделать что-то типа IMG Tool'а, но не БМПшки там хранить а TGA'шки... они мне в дальнейшем как ра- понадобятся... там несколько фич с ними есть... вот только может кто-нибудь разъяснить следующее, когда я загружаю текстуру (ТГА или ДЖПЕГ, не важно) окак мне её использовать в обычном приложеении? я замучался уже... куча примеров, и везде без литра не разобраться... вопрос следующий, как эта текстура будет отпереляться? ей должно задаваться индивидуально имя или что? как она используется?

ЗЫ: мне надо воткнуть её так же как это с битмаппами получается... smile  знаю, вопрос люзерский, но какой есть...

Автор: Pilligrim 12.8.2006, 18:46
ZC1989, я тоже в DirectX новичок. Начал писать графический 3D-движок. Но от использования 3Ds файлов отказался. Ты пробовал их читать? Нормально всё?

Цитата
написал "вход" в игру... развернул сцену и отображением того же примитива


Лучше отобрази не примитив, а готовый объект(а лучше целую сцену), а то вдруг 3Ds-формат подкачает, а ты уже научишься тектуры накладывать. Вот.

Автор: Pilligrim 12.8.2006, 19:37
Кстати:
Цитата
ЗЫ: мне надо воткнуть её так же как это с битмаппами получается...   знаю, вопрос люзерский, но какой есть...


Я думаю, что тебе придется писать свою функцию наложения текстур из тга-файлов.

Автор: ZC1989 12.8.2006, 20:14
Pilligrim, я стал сразу же использовать Х-файлы... они дирекстом понимаются очень просто... а вот относительно загрузки "чужеродных форматов" для графики, так я использовал уже готовые, но пока не занимаюсь отрисовкой сцены... есть всякие мелочи, пока что важнее...

Автор: Pilligrim 12.8.2006, 20:32
Цитата
есть всякие мелочи, пока что важнее...


Ты меня, конечно, извини, но, если не секрет, какие мелочи? Что может быть важнее графического движка? Т.е. я считаю, что его нужно писать первым. Т.к. всю логику игры удобнее описывать, когда видишь как это будет выглядеть(а не с помощью раппортов типа: удар, урон 150, блок, здоровье 45 и т.д.) Ведь так?

Цитата
я использовал уже готовые, но пока не занимаюсь отрисовкой сцены...


Значит ты пробовал что-нить нарисовать(например в максе), потом сохранить в *.3Ds, а потом прочитать с помощью проги и прорисовать? Или всё-таки нет? Я то про то, что у тебя это может не получиться(поэтому попробуй, заклинаю тебя  smile ). Я писал свой читатель 3Ds-файлов. У меня прочитать не получилось... Он текстуры не читает, цвет тоже... Только каркас, и то с напрягом! smile 

Автор: ZC1989 12.8.2006, 20:38
Pilligrim, Парнишь, когда ставишь SDK по дирексту на винду и МАКС у тебя уже установлен, там появится возможность экспорта в формат X-File's для его прочтение существует примитивная функция... если надо, я суну её сюда, ток сначала приведу в благочестивый вид... и к тому же этот формат поддерживает текстуры

Автор: Pilligrim 12.8.2006, 20:42
Дык я не про X-File's, а про 3Ds! Их читать пробовал в своей проге?  

Автор: ZC1989 12.8.2006, 20:54
Pilligrim, нет, я не пробовал... говорю же что пока меня устраивает Х... может потом и придётся перейти на что-то сильное, но в таком случае буду писать ваще свой формат... smile 

а чё тебе так уср*лся этот 3Ds?!

кстати, ты знаешь, как толком загрузить ТГАшку и на форму, вместо битмапа сунуть... ну надоело уже... загружаю в переменку, а вот воткнуть на форму никак  smile 

Автор: Pilligrim 13.8.2006, 18:06
Цитата
Pilligrim, нет, я не пробовал... говорю же что пока меня устраивает Х... может потом и придётся перейти на что-то сильное, но в таком случае буду писать ваще свой формат...


Ну, для этого тебе надо:
1) суметь прочитать один из "сильных" форматов
2) как-то представить всё что туда напихали его девелоперы в своей проге
3) создать структуру(причем удобнее) своего формата
4) загнать туда то, что ты прочитал из одного из "сильных" форматов
Вооооот...

Цитата
а чё тебе так уср*лся этот 3Ds?!


Потому в него не загоняют текстуры, цвет и анимацию((( Лучше переходи на ASE файлы, как я))

Цитата
кстати, ты знаешь, как толком загрузить ТГАшку и на форму, вместо битмапа сунуть... ну надоело уже... загружаю в переменку, а вот воткнуть на форму никак


А в какую переменку загружаешь?

Автор: ZC1989 13.8.2006, 23:14
Pilligrim, я нашёл достойный (как мне кажется) алгоритм загрузги этой самой ТГАшки... резутьтат возвращается в переменную CImage, это собственный для хранения...

Код

class CImage
{
  public:
    CImage();
    ~CImage();

  typedef struct { unsigned char r, g, b; } _RGB;
  typedef struct { unsigned char b, g, r; } _BGR;
  typedef struct { unsigned char b, g, r, a; } _BGRA;

  struct _BMPFILEHEADER
  {
    unsigned short bfType;
    long int       bfSize, bfRes1, bfOffBits; 
  };

  struct _BMPIMAGEHEADER
  {
    long int       biSize, biWidth, biHeight;
    unsigned short biPlanes, biBitCount;
    long int       biCompression, biSizeImage;
    long int       biXPelsPerMeter, biYPelsPerMeter;
    long int       biClrUsed, biClrImportant; 
  };

  struct _TGAHEADER
  {
    unsigned char  tiIdentSize;
    unsigned char  tiPaletteIncluded;
    unsigned char  tiImageType;
    unsigned short tiPaletteStart;
    unsigned short tiPaletteSize;
    unsigned char  tiPaletteBpp;
    unsigned short tiX0;
    unsigned short tiY0;
    unsigned short tiXres;
    unsigned short tiYres;
    unsigned char  tiBitPerPixel;
    unsigned char  tiAttrBits;
  };

  public:
    int  Init( int Xres, int Yres, unsigned short BitPerPixel );
    int  ConvertTo32( void );
    int  SaveBmp(char *szFilename);
    int  LoadBmp(char *szFilename);
    int  SaveTga(char *szFilename, bool bCompressed );
    int  LoadTga(char *szFilename);

  private:
    void Output( char * pcData, int nSize );
    void Output( char c );
    void Output( void );
    unsigned char Input( void );

  public:
    int              m_Xres, m_Yres;
    unsigned short   m_BitPerPixel;
    unsigned char  * m_pBitmap;
    _RGB             m_Pal[256];

  private:
    int              m_NumPixel;
    FILE             * f;
    int              m_nCount;
    char             m_cBuf[32768];
};


вот это... я картинку загружаю в переменку... всё тип-топ... а вот как её присвотить форме?!  мне этот понадобится для вывода на простом диалоге и для загрузки текстур в самом движке... воть...

есть соображения? smile 

Автор: Pilligrim 14.8.2006, 18:29
По мне дык лучше засунуть все в структурку BITMAP. Все предельно просто.
Вот описание:
The BITMAP structure defines the type, width, height, color format, and bit values of a bitmap. 

typedef struct tagBITMAP {  // bm  
   LONG   bmType; 
   LONG   bmWidth; 
   LONG   bmHeight; 
   LONG   bmWidthBytes; 
   WORD   bmPlanes; 
   WORD   bmBitsPixel; 
   LPVOID bmBits; 
} BITMAP; 
 

Members

bmType

Specifies the bitmap type. This member must be zero. 

bmWidth

Specifies the width, in pixels, of the bitmap. The width must be greater than zero. 

bmHeight

Specifies the height, in pixels, of the bitmap. The height must be greater than zero. 

bmWidthBytes

Specifies the number of bytes in each scan line. This value must be divisible by 2, because Windows assumes that the bit values of a bitmap form an array that is word aligned. 

bmPlanes

Specifies the count of color planes. 

bmBitsPixel

Specifies the number of bits required to indicate the color of a pixel. 

bmBits

Points to the location of the bit values for the bitmap. The bmBits member must be a long pointer to an array of character (1-byte) values. 

 

Remarks

The bitmap formats currently used are monochrome and color. The monochrome bitmap uses a one-bit, one-plane format. Each scan is a multiple of 32 bits. 
Scans are organized as follows for a monochrome bitmap of height n: 

    Scan 0  
    Scan 1 
    . 
    . 
    . 
    Scan n-2 
    Scan n-1 
 

The pixels on a monochrome device are either black or white. If the corresponding bit in the bitmap is 1, the pixel is set to the foreground color; if the corresponding bit in the bitmap is zero, the pixel is set to the background color. 
Только на английском))) Переводить не захотелось. Будут вопросы спрашивай)))

Автор: ZC1989 14.8.2006, 19:29
Pilligrim,  вопрос есть, до меня вот просто не доперает, как мне в битмапповую структуру прочитать скажем ТГА?! ведь разве сам БИТМАП понимает этот формат?! помоему нет.. покрайне мере не работало у меня это... smile 

Автор: chozen 29.8.2006, 22:49
Ну вы, блин, и развели:
 - TGA от BMP отличается только двумя пунктами: заголовком и последовательностью байт цветов в триплете. тга проще и логичнее. В нете куча просто кода по загрузке тга из файлов. Отображать можно как созданием BITMAP'а, так и через свойства окон... smile 
 - по сути - X файлы директа - это полная шляпа. Для начала сгодится, потом
надо обязательно писать что-то свое. 3ds формат слишком глючный. Дело в том, что в его спецификации много разделов (chunks), зачастую вложенных. И узнать, что в этот файл пишет, скажем 3ds MAX не предстовляется возможным (нет, представляется, конечно, только если вам времени своего не жалко). НО!
Есть одно большое "НО". 3ds формат - очень правильный. Его обязательно стоит просмотреть (спеки) и сделать свой. А лучше использовать "открытые", не бинарные форматы - ASE, OBJ и т.д. Там, хоть и чтение дольше, но это, имхо, не сильно критично, зато при написании утилит можно видеть, ЧТО там написала она в разделе "Animation . Frame 4"

Кста - сочетание 3ds MAX/*.3ds не советую использовать, ну во всяком случае, не в финальной версии. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)