Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Языки программирования

Важная информация

Языки программирования Изучаем С++, Sql, php, Lua, Python

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.03.2012, 13:48   #1
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию DXT декомпрессия

В общем решил начать изучать OpenGL, но все понемногу. Решил разобраться как устроен modelviewer. Естественно, использую Qt4 и его модуль, но вопрос сейчас не по 3D графике

Не могу прочитать BLP %)
Точней могу, но не понимаю как правильно оперировать с данными.

Использую squish библиотеку для декомпрессии изображения, но наверное делаю что-то не так. Никак не получается вывести картинку - вместо нее набор цветопикселей

Вот код (может кому-то он ничего не скажет, но суть, я думаю, поймете)

Код:
QPixmap Texture::getImage()
{
	int mipmax = m_header.hasMips ? 16 : 1;

	QDataStream stream(m_buffer);
	stream.setByteOrder(QDataStream::LittleEndian);

	QVector<quint8> data;
	quint8 d = 0;

	for (quint8 i = 0; i < mipmax; i++)
	{
		stream.skipRawData(m_header.offsets[i]);
		for (quint32 j = 0; j < m_header.lengths[i]; j++)
		{
			stream >> d;
			data << d;
		}
	}
	
	QVector<quint8> v;
	v.resize(m_header.width * m_header.height * 16 * 4);
	squish::DecompressImage(&v[0], m_header.width, m_header.height, data.data(), m_header.encoding);

	QImage img(v.data(), m_header.width, m_header.height, QImage::Format::Format_ARGB32);

	return QPixmap::fromImage(img);
}
Смотрел как в modelviewer считывается BLP, но там декомпрессия через opengl происходит, и этих методов нет в модуле Qt. Поэтому использовал библиотеку. Вопрос - правилен этот код хоть на пару процентов?))

PS WMV 0.4 http://wowmv.svn.sourceforge.net/viewvc/wowmv/src/
WMV Latest http://code.google.com/p/wowmodelviewer/source/browse/
SQUISH http://code.google.com/p/libsquish/
__________________
SpellWork Qt4

Последний раз редактировалось Sid; 24.03.2012 в 13:52.
Sid вне форума   Ответить с цитированием
Старый 24.03.2012, 18:47   #2
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

А зачем его разжимать? DXT это "железный" формат.
zergtmn вне форума   Ответить с цитированием
Старый 24.03.2012, 18:50   #3
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Цитата:
Compression: 1 for uncompressed, 2 for DXTC, 3 (cataclysm) for plain A8R8G8B8 textures (see remarks)
Вроде как надо разжимать)у меня 2.
__________________
SpellWork Qt4
Sid вне форума   Ответить с цитированием
Старый 25.03.2012, 00:26   #4
Evgeniy
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 98
Сказал(а) спасибо: 12
Поблагодарили 33 раз(а) в 21 сообщениях
Evgeniy На верном пути
По умолчанию

http://www.ownedcore.com/forums/worl...lp-images.html
Evgeniy вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Sid (25.03.2012)
Старый 25.03.2012, 09:02   #5
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Вот уже что-то)

Код:
QPixmap Texture::getImage()
{
    QDataStream stream(m_buffer);
    stream.setByteOrder(QDataStream::LittleEndian);

    QVector<quint8> data;
    quint8 d = 0;

    stream.skipRawData(m_header.offsets[0]);
    for (quint32 j = 0; j < m_header.lengths[0]; j++)
    {
        stream >> d;
        data << d;
    }

    squish::u8* uncompressed;
    if (m_header.encoding == 2)
    {
        int dxtver;
        switch (m_header.alphaEncoding)
        {
            case 0: dxtver = squish::kDxt1; break;
            case 1: dxtver = squish::kDxt3; break;
            case 7: dxtver = squish::kDxt5; break;
            //default: std::cout << "DXT version not recognized.\n"; return false; break;
        }
        uncompressed = new squish::u8[m_header.width * m_header.height * 4];
        squish::DecompressImage(uncompressed, m_header.width, m_header.height, data.data(), dxtver);
    }
    else
        uncompressed = data.data();
   
    QVector<QRgb> colors;
    for (quint32 i = 0; i < 256; i++)
    {
        colors.append(qRgba(m_header.colors[i].r,
            m_header.colors[i].g,
            m_header.colors[i].b,
            m_header.colors[i].a));
    }

    QImage img(uncompressed, m_header.width, m_header.height, QImage::Format::Format_Indexed8);

    return QPixmap::fromImage(img);
}
Правда цветовая палитра не накладывается...


Делал setColorTable и заполнял ее из ARGB[256] куска после данных, тогда картинка вообще белая -_-
__________________
SpellWork Qt4
Sid вне форума   Ответить с цитированием
Старый 25.03.2012, 09:27   #6
Evgeniy
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 98
Сказал(а) спасибо: 12
Поблагодарили 33 раз(а) в 21 сообщениях
Evgeniy На верном пути
По умолчанию

палитра находится сразу за mipmapSize блоками
Evgeniy вне форума   Ответить с цитированием
Старый 25.03.2012, 09:44   #7
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Ну я с нее и заполнял.
__________________
SpellWork Qt4
Sid вне форума   Ответить с цитированием
Старый 25.03.2012, 11:18   #8
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Первый намек видимо был не понят.

http://www.opengl.org/registry/specs...ssion_s3tc.txt
glCompressedTexImage2D
GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
zergtmn вне форума   Ответить с цитированием
Старый 25.03.2012, 12:00   #9
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Уже разобрался, я так понял что в дате указан номер цвета из палитры. Прогоняю 256х256 цикл, но не получаю нужного)) Код взял из модельвивера. Получается такая фигня.

http://my.jetscreenshot.com/4271/20120325-gyd8-106kb


PS если убрать все эти манипуляции с uint32 и сделать мой вариант через стурктуру и преобразовение в rgba от qt то тоже самое.

Код:
for (quint32 x = 0; x < m_header.width; x++)
        {
            ARGBColor8 k = m_header.colors[*c++];
            *p++ = qRgba(k.r, k.g, k.b, 255);
        }
__________________
SpellWork Qt4
Sid вне форума   Ответить с цитированием
Старый 25.03.2012, 12:30   #10
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Тема превратилась в "как прочитать BLP"
__________________
SpellWork Qt4
Sid вне форума   Ответить с цитированием
Старый 25.03.2012, 13:24   #11
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Все! Я это сделал) Осенило что картинка была белой после того как я устанавливал палитру, значит альфа была нулевая. Установил палитру так же, только альфу в ней сделал 255 и все четко

http://my.jetscreenshot.com/4271/20120325-jjrz-70kb
__________________
SpellWork Qt4
Sid вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Gerald (25.03.2012)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 11:41. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot