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=4180)
Отправлено domded 21-11-2013 в 18:47:
Получение текстуры
Задача такова. Я хочу сделать камеру на оружии ( типа, в прицеле снайперской винтовки виден мир ).
Для этого творю следующие непотребства:
C++ Source Code:
2 | viewent = gEngfuncs.GetViewModel(); |
3 | if (!viewent->model->name) return; |
4 | studiohdr_t *vm = (studiohdr_t*)IEngineStudio.Mod_Extradata(viewent->model); |
6 | gEngfuncs.pfnConsolePrint(pri); |
7 | texture_t *ct = (texture_t*)((byte*)vm + vm->texturedataindex); |
8 | for (int k = 0; k < vm->numtextures; k++) |
10 | if (!stricmp(ct[k].name,"cam_vfind.bmp")) |
11 | gEngfuncs.pfnConsolePrint(ct[k].name); |
Чтобы найти текстуру с именем cam_vfind.bmp. Проблема в том, что имена у нектороых текстур пишутся, а у некоторых нет, следовательно, cam_vfind не ищется. Правильно ли я вообще получаю доступ к списку текстур? Делаю это всё в tri.cpp.
Отправлено Дядя Миша 21-11-2013 в 19:02:
Цитата:
domded писал:
C++ Source Code:
viewent = gEngfuncs.GetViewModel(); |
if (!viewent->model->name) return; |
Так нельзя, надо так:
C++ Source Code:
viewent = gEngfuncs.GetViewModel(); |
if (!viewent->model) return; |
Цитата:
domded писал:
Чтобы найти текстуру с именем cam_vfind.bmp.
Зачем искать отдельно? Когда рисуешь - тогда и проверяй.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 21-11-2013 в 19:36:
viewent пробовал. проблема в том, что он всегда не нуловый. прверял даже с выводом в консоль, следовательно, игра виснет, когда пытаюсь получить указатель на список текстур.
я не нашёл в studiomodelrenderer_hardware, где отдельно натягиваются текстуры. поэтому и понёс всё это в hud_drawtransparenttriangles
Отправлено Дядя Миша 21-11-2013 в 20:41:
Кта не нулловый? А когда у тебя пушки в руках нету чем равен viewent->model? Да ничему.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 22-11-2013 в 02:25:
Почему-то у меня указатель на viewent никогда не равен нуллу, даже если пушки в руках нет. Пишу под чистый хл.
Где конкретно рисуется текстура для модели? В рендерере этого не нашёл.
Попробовал перенести свой код:
C++ Source Code:
1 | //are we processing viewmodel? |
2 | if (m_pCurrentEntity == gEngfuncs.GetViewModel() ) |
4 | //gEngfuncs.pfnConsolePrint(m_pCurrentEntity->model->name); |
5 | //gEngfuncs.pfnConsolePrint("\n"); |
7 | texture_t* tex = (texture_t*)((byte*)m_pStudioHeader+m_pStudioHeader->textureindex); |
8 | for (int i = 0; i < m_pStudioHeader->numtextures; i++ ) |
10 | gEngfuncs.pfnConsolePrint(tex[i].name); |
11 | gEngfuncs.pfnConsolePrint("\n"); |
в StudioRenderFinal_Hardware. И почему-то опять не получается получить нормальные имена текстур - он выводит их не все, хотя те, что выводит - получаются правильные, совпадают с названиями текстур в модели. Некоторые строчки просто получаются равными нулю.
Ещё я заметил, что в туторе по натягиванию видеотекстур в структуре texture_s есть поле gl_texturenum, и уж был нацелился использвоать его для фотографирования экрана и помещения снимка в кам_вфайнд, но возникло огорчение. Почему-то в оригинальной халве его нет. Это нужно подключать полностью параноевский рендерер, я правильно понял?
Отправлено Дядя Миша 22-11-2013 в 09:01:
Цитата:
domded писал:
Некоторые строчки просто получаются равными нулю.
а у тебя модель не с внешними текстурами?
Цитата:
domded писал:
Это нужно подключать полностью параноевский рендерер, я правильно понял?
Достаточно взять com_model.h из паранои. Он тоже наполовину неправильный, но работать будет.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 22-11-2013 в 11:38:
Нет, все текстуры зашиты в модель, в формате бмп. Из-за чего может быть, что не все имена читаются?
Отправлено Дядя Миша 22-11-2013 в 12:56:
Цитата:
domded писал:
Из-за чего может быть, что не все имена читаются?
руки кревыя?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 22-11-2013 в 14:55:
это понятно. можете сказать, как правильно рассчитывать смещение до каждой текстурной структуры? или где они рисуются?
Отправлено Дядя Миша 22-11-2013 в 15:06:
Ты модельку открой в HLMV и там имена посмотри. Потому что код у тебя правильный, там нет проблем.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 22-11-2013 в 15:19:
даже если взять в руки дробовик из оригинальной игры, он пишет мне только название первой текстуры из четырёх (Spas12_Reference.BMP:0), полностью вывод такой ( tex[i]->name, i ):
Spas12_Reference.BMP:0
:1
:2
:3
все мозги себе сломал.
Отправлено Дядя Миша 22-11-2013 в 16:05:
А почему ты представляешь это в виде texture_t?
Кто тебя такой глупости научил?
Вот же
C++ Source Code:
2 | typedef struct mstudiotex_s |
в нее и преобразовывай, а не в texture_t. Додумался.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 22-11-2013 в 16:38:
смотрел по тутору о добавлении видеотекстур. не додумался как-то, что текстуры моделей хранятся в другом формате.
в mstudiotexture еcть индекс. подскажите, куда он ссылается, где хранятся непосредственно пиксели этой самой текстуры ( я так понимаю, формат w*h*3) ?
Отправлено Дядя Миша 22-11-2013 в 16:50:
это gl-index загруженной текстуры.
Добавлено 22-11-2013 в 20:50:
Ну то есть как, сначала это индекс на массив пикселей, а потом он перезаписывается как индекс загруженной в видеопамять текстуры.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 23-11-2013 в 21:59:
Делаю так:
C++ Source Code:
1 | //are we processing viewmodel? |
2 | if (m_pCurrentEntity == gEngfuncs.GetViewModel() ) |
4 | //gEngfuncs.pfnConsolePrint(m_pCurrentEntity->model->name); |
5 | //gEngfuncs.pfnConsolePrint("\n"); |
7 | mstudiotexture_t*tex = (mstudiotexture_t*)((byte*)m_pStudioHeader+m_pStudioHeader->textureindex); |
8 | for (int i = 0; i < m_pStudioHeader->numtextures; i++ ) |
10 | if (!stricmp("cam_vfind.bmp",tex[i].name)) |
12 | sprintf(sz,"%s:%i size %i x %i \n",tex[i].name,tex[i].index,tex[i].width,tex[i].height); |
13 | gEngfuncs.pfnConsolePrint(sz); |
14 | //creating current image of screen |
15 | if (glIsTexture(tex[i].index)) |
18 | unsigned char *worldImg = new unsigned char[ScreenWidth*ScreenHeight*3]; |
20 | glBindTexture(GL_TEXTURE_RECTANGLE_NV,tex[i].index); |
21 | glReadPixels(0,0,ScreenWidth,ScreenHeight,GL_RGB,GL_UNSIGNED_BYTE,worldImg); |
22 | glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGB, tex[i].width, tex[i].height, 0, GL_RGB, GL_UNSIGNED_BYTE, worldImg); |
23 | //glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
24 | //glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
29 | //gEngfuncs.pfnConsolePrint("\n"); |
Изображение в прицеле появляется, но компьютер начинает очень сильно тормозить + оно получается очень растянутое - полосам идёт. Что я делаю не так?
Добавлено 24-11-2013 в 01:59:
Насчёт растяжения разобрался - надо было просто добавить gluScaleImage. А с тормозами вопрос остался. Возможно ли получить пиксели экрана быстрее, чем через glReadPixels?