HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Телевизор в ХЛ (https://hlfx.ru/forum/showthread.php?threadid=1040)
Отправлено Дядя Миша 18-03-2008 в 15:24:
>>Вообще хорошо бы чтоб и монитор не требовал
ну а как ты будешь рисовать два разных места за один проход?
Телевизор - другое дело, тебе надо всего лишь отрисовать содержание авишки.
Отправлено Ku2zoff 18-03-2008 в 16:01:
Итак, бродя по просторам инета, я наткнулся на код. Это код для ХЛ, код прорисовки видеотекстуры, в нём использован авикит. Но это только отрывок. Вот он:
C++ Source Code:
1 | // Only setup the avi if it's actually a video screen |
3 | if (isVideoScreen && replacement[0] != '\0') { |
4 | char *error_msg = NULL; |
9 | movie = new AVIKit( absolute_replacement, false ); |
10 | if (movie->getError( &error_msg ) != AVIKIT_NOERROR) { |
11 | gEngfuncs.Con_DPrintf( "SetupAvisFromEntities: Error opening %s: %s\n", absolute_replacement, error_msg ); |
15 | movie->getVideoInfo( &xres, &yres, &duration ); |
16 | gEngfuncs.Con_DPrintf( "SetupAvisFromEntities: Opened %s: %ld x %ld (%f secs)\n", replacement, xres, yres, duration ); |
17 | gEngfuncs.Con_DPrintf( "Video screen at (%d %d %d), with extents (%d %d %d)\n", |
18 | (int)origin[0], (int)origin[1], (int)origin[2], |
19 | (int)extents[0], (int)extents[1], (int)extents[2] ); |
21 | // Create the OpenGL texture |
23 | glGenTextures( 1, &texnum ); |
25 | if (!AddComplexAvi( movie, texnum, origin, angles, extents, &error_msg )) { |
26 | gEngfuncs.Con_DPrintf( "SetupAvisFromEntities: Error adding movie: %s\n", error_msg ); |
29 | } else if (isVideoScreen) { |
30 | gEngfuncs.Con_DPrintf( "SetupAvisFromEntities: Video screen didn't have a movie specified!\n" ); |
33 | //Setting up the texture: |
35 | movie->getVideoInfo( &data->width, &data->height, &data->total_length ); |
36 | glEnable( GL_TEXTURE_2D ); |
37 | glBindTexture( GL_TEXTURE_2D, data->texture_index ); |
38 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
39 | glTexImage2D( GL_TEXTURE_2D, 0, 3, data->width, data->height, 0, GL_RGB, GL_UNSIGNED_BYTE, tmpbuffer ); |
41 | //Updating the texture each frame: |
43 | // Calculate the frame needed |
44 | int frame = i->movie->getVideoFrameNumber( i->current_time ); |
46 | // If the frame has changed, re-upload it |
47 | if (frame != i->current_frame) { |
48 | i->current_frame = frame; |
49 | i->movie->getVideoFrame( (char*)i->buffer, frame ); |
51 | // If the video isn't a power of two on all sides, we need to resize it... <img src="images/smilies/frown.gif" border="0" alt=""> |
52 | if (i->resized_buffer) { |
53 | gluScaleImage( GL_RGB, i->realwidth, i->realheight, GL_UNSIGNED_BYTE, i->buffer, i->width, i->height, GL_UNSIGNED_BYTE, i->resized_buffer ); |
54 | // ... and update the OpenGL texture ... |
55 | glEnable(GL_TEXTURE_2D); |
56 | glBindTexture( GL_TEXTURE_2D, i->texture_index ); |
57 | glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, i->width, i->height, GL_RGB, GL_UNSIGNED_BYTE, i->resized_buffer ); |
59 | // ... and update the OpenGL texture ... |
60 | glEnable(GL_TEXTURE_2D); |
61 | glBindTexture( GL_TEXTURE_2D, i->texture_index ); |
62 | glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, i->width, i->height, GL_RGB, GL_UNSIGNED_BYTE, i->buffer ); |
66 | // If this is a complex movie, draw the polygons |
67 | if (i->texture_type == AVI_TEXTURE_USER) { |
69 | glEnable( GL_TEXTURE_2D ); |
70 | glBindTexture( GL_TEXTURE_2D, i->texture_index ); |
71 | glDisable( GL_BLEND ); |
75 | glColor3f( 1.0f, 1.0f, 1.0f ); |
76 | glTexCoord2f( 0.0f, 1.0f ); |
77 | glVertex3f( i->vertexes[0].x, i->vertexes[0].y, i->vertexes[0].z ); |
80 | glColor3f( 1.0f, 1.0f, 1.0f ); |
81 | glTexCoord2f( 0.0f, 0.0f ); |
82 | glVertex3f( i->vertexes[1].x, i->vertexes[1].y, i->vertexes[1].z ); |
85 | glColor3f( 1.0f, 1.0f, 1.0f ); |
86 | glTexCoord2f( 1.0f, 0.0f ); |
87 | glVertex3f( i->vertexes[2].x, i->vertexes[2].y, i->vertexes[2].z ); |
90 | glColor3f( 1.0f, 1.0f, 1.0f ); |
91 | glTexCoord2f( 1.0f, 1.0f ); |
92 | glVertex3f( i->vertexes[3].x, i->vertexes[3].y, i->vertexes[3].z ); |
Имея этот код и исходники демок авикита можно написать видеоплеер для ХЛ. Тут меня тормозит недостаток знаний C++ и OpenGL, а также недостаточное знание структуры клиентской дллки ХЛ(С сервером я намного дружнее). Но я буду думать, постараюсь сделать, тем более что есть образцы мониторов в Xash.
>>ну а как ты будешь рисовать два разных места за один проход?
А если мне надо нарисовать две разных авишки на одной карте? (Маловероятно, но чего в жизни не бывает
)
Значит и у монитора можно ограничиться одним проходом, но лимит мониторов на карте будет более чем скромный: не более одного. Или не более одного в поле зрения игрока?
Отправлено Дядя Миша 18-03-2008 в 16:06:
>>А если мне надо нарисовать две разных авишки на одной карте?
да хоть сто! ты ведь берешь картинку из видеофайла.
>>Значит и у монитора можно ограничиться одним проходом
Xash сам регулирует кол-во проходов в зависимости от кол-ва мониторов в непосредственной видимости игрока.
Например на карте Breakable Demo при непосредственной видимости 3х мониторов делается 4 прохода.
Отправлено Ku2zoff 18-03-2008 в 16:10:
>>да хоть сто! ты ведь берешь картинку из видеофайла.
Точно! Что же я несу! Проходы нужны для извлечения картинки из игрового экрана, а в видеофайле кадр уже есть.
Отправлено Дядя Миша 18-03-2008 в 17:34:
Ku2zoff не в игровом экране дело.
Представь себе ДВА места, которые никоим образом не видны друг из друга. Как же их можно нарисовать иначе, если не за два раза?
Отправлено Ku2zoff 19-03-2008 в 21:31:
Итак, сегодня я полночи провозился с авикитом. В результате при инициализации рендера(в самом конце загрузки) игра повисает и завершается только диспетчером задач. Но прогресс уже есть: играется звук из ролика, чего раньше не было. Вызвал я это дело из V_CalcRefdef. Может надо инициализировать авишку чуть пораньше, например из Худ_ВидИнит, а обновление вызывать из КалкРефдеф? А то я всё из Рефдефа вызвал.
Отправлено Дядя Миша 20-03-2008 в 06:12:
Ku2zoff да забрось ты этот глючный авикит, лучше с нуля написать декомпрессор или использовать виндовый.
Отправлено Ku2zoff 20-03-2008 в 11:07:
Дядя Миша с нуля у меня написать не получится, если использовать виндовый, то мне надо найти исходники... Ещё немного подумаю, не хочется всё бросать, ведь только начал понимать как авикит работает(и как фмод работает)
Добавлено 20-03-2008 в 17:07:
Итак, прогресс налицо. Ролик нормально открывается, воспроизводится и ставится на паузу(если это можно назвать паузой). Но слышен только звук - ОпенГЛ текстура не генерируется. Но думаю с этим можно разобраться.
Отправлено Дядя Миша 20-03-2008 в 15:57:
ну значит нарисовал неверна!
я к чему говорил-то: авикит дллка, да плюс sdl, да еще fmod а ни дохрена ли мусора ради проигрывания видео?
Отправлено Ku2zoff 20-03-2008 в 18:25:
Дядя Миша а sdl обязательно надо? Мож из-за того, что я его отцепил ничё и не работает?
Отправлено Дядя Миша 21-03-2008 в 07:46:
Ku2zoff я уже и не помню. Посмотри мод для хл - есть он там или нету?
Отправлено Ku2zoff 21-03-2008 в 10:34:
Дядя Миша sdl в моде нет, как я понял, он нужен для создания окна и управления сценой - движения камеры и т.п.
Отправлено Дядя Миша 21-03-2008 в 15:37:
Ku2zoff ну значит что-то неверно сделал. Может вертексы у тебя не в том порядке обходятся.
Отправлено Ku2zoff 21-03-2008 в 17:19:
>>я к чему говорил-то: авикит дллка, да плюс sdl, да еще fmod а ни дохрена ли мусора ради проигрывания видео?
Дядя Миша я решил авикит не использовать. Т.К. он действительно глючный. Нашёл статью некоего Джеффа Молофи(Jeff Molofee aka NeHe) Всё тоже самое, тока мусора нету. Используется виндовый видео декомпрессор. Правда, в примере нет проигрования звука, но это не суть важно, его можно воспроизводить через фмод, который уже подключен к спириту Killar'oм.
Отправлено Дядя Миша 21-03-2008 в 19:21:
Ku2zoff что-ни день - удивительные открытия у тебя 
совет тебе дам добрый - не юзай асм из этой статьи, GL_BGR будет вполне достаточно, просто тутору уже лет 6-7.