HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Xash3D (https://hlfx.ru/forum/forumdisplay.php?forumid=14)
-- Экспорт функций из движка (https://hlfx.ru/forum/showthread.php?threadid=4303)
Отправлено domded 20-02-2014 в 04:46:
Экспорт функций из движка
Планируется ли экспорт функций для работы со шрифтами и встроенным imagelib'ом в клиентку? Если я что-то просмотрел, и он есть, подскажите, как называется/какие заголовки подключать надо?
Отправлено Дядя Миша 20-02-2014 в 15:58:
Для работы со шрифтами есть функция gEngfuncs.pfnDrawCharacter
рисует шрифт creditsfont из gfx.wad. Других функций нет и не планируется. По крайней мере в Xash3D.
Для работы с имиджлибом есть функции в RenderAPI. Там достаточно большой набор.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 20-02-2014 в 16:40:
Спасибо. Именно то, что я искал. Ещё одной вещи не могу только найти - какие функции отвечают за показ курсора и захват клавиатурного ввода, либо их надо писать самому?
Отправлено Ku2zoff 20-02-2014 в 16:47:
domded курсор может эмулироваться через ВГУИ. Квар для этого есть. По крайней мере в СДК 2.3. В последней версии я почему-то не нашёл. Если этот код из вгуи модифицировать, можно рисовать любой спрайт вместо тгашного курсора.
Цитата:
domded писал:
захват клавиатурного ввода
Ковыряй TeamFortressViewport. Там есть примеры захвата клавиш. Вызывать свою функцию можно скорее всего из CHud::Redraw или CHud::Think. Это всё на клиентке в оригинальной халфе есть. Только вот в ксашмоде нету ВГУИ.
Отправлено Дядя Миша 20-02-2014 в 16:55:
В input.cpp HUD_KeyEvent.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 20-02-2014 в 17:40:
Буду смотреть в сторону худ_кейевент. Это скорее всего тоже то, что мне нужно, только в ксашхт он находится в cdll_int.
А с вгуи проблема - его нет. Можно ли заблокировать перемещение мышы в худ_маусмув? Чтобы персонаж не двигал головой. С отрисовкой курсора я разберусь.
Отправлено Дядя Миша 20-02-2014 в 18:18:
Лучше в CL_CreateMove.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 08-03-2014 в 13:46:
Проверил я худ_кейевент. Почему он реагирует только на нажатие клавиши? при отпускании её событие не генерируется.
Отправлено Дядя Миша 08-03-2014 в 14:12:
да, действительно. Исправлю в новом билде.
Ну или сам исправь, чтобы не ждать.
В файлике keys.c функция void Key_Event( int key, qboolean down )
и там, где вот это условие:
C++ Source Code:
3 | kb = keys[key].binding; |
5 | Key_AddKeyUpCommands( key, kb ); |
добавить вот так:
C++ Source Code:
3 | kb = keys[key].binding; |
5 | if( cls.key_dest == key_game && ( key != K_ESCAPE )) |
6 | clgame.dllFuncs.pfnKey_Event( down, key, kb ); |
7 | Key_AddKeyUpCommands( key, kb ); |
При этом может вылезти вообще всё что угодно. А может и не вылезти.
Но по идее должно работать.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 08-03-2014 в 14:55:
Спасибо. Исправлю. И маленький последний вопрос. Есть следующий код рисования изображения на экране:
C++ Source Code:
2 | pglTranslatef((float)x,(float)y,(float)0); |
3 | pglBindTexture(GL_TEXTURE_2D,m_glIndexes[0]); |
5 | pglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); |
6 | pglTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); |
8 | pglTexCoord2f(0.0,0.0);pglVertex2f(0,0); |
9 | pglTexCoord2f(1.0,0.0);pglVertex2f((mw>0)?mw:m_w,0); |
10 | pglTexCoord2f(1.0,1.0);pglVertex2f((mw>0)?mw:m_w,(mh>0)?mh:m_h); |
11 | pglTexCoord2f(0.0,1.0);pglVertex2f(0,(mh>0)?mh:m_h); |
14 | pglBindTexture(GL_TEXTURE_2D,0); |
Рисует нормально, картинка отображается. Но если при нахождении картинки на экране подойти к триггеру, который вызывает message на экран (типа того, которое пишется около колёс пушек на карте xash_demo ), либо название главы в оригинальной халве, текст становится нечитабельным. То есть он рисуется, но вместо букв какая-то полупрозрачная мешанина из пикселей. Я не очень хорошо знаю опенгл, может быть что-то забыл отключить после вывода картинки?
Отправлено Дядя Миша 08-03-2014 в 15:22:
В ксаше нельзя использовать pglBind текстуре, поскольку это нарушает внутреннюю синхронизацию стейтов с движком.
Используй GL_Bind, внутреннюю движковую функцию. Она умная, она сама определить тип текстуры 1D\2D\3D\Cubemap и сама включит\выключит нужные стейты. Вообще, всё что касается текстур - надо использовать движковые функции для работы с ними, иначе похеришь стейты.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 08-03-2014 в 16:18:
Исправил, заработало.
Отправлено ~ X ~ 08-03-2014 в 18:55:
О, да... С перехватом клавиш гемор ещё тот!! Я так и не смог сделать нормальный перехват нажатий в доске почёта - если юзер кликнул на доске мышкой, этот клик заедает и игрок стреляет, даже если ЛМБ была авно отпущена. 
Хыхы, как же вы любите ОГЛ дёргать из клиентки... 
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено domded 09-03-2014 в 17:22:
Ну ты-то в вгуи хардкодил, а я пишу это всё нативно через гл и прочее.
Дядя Миша, раз уж тут раздел багрепорта плавно получился, то пишу сюда.
Проблема изменением pglBing на GL_Bind не решилась. То есть, если я в своём контроле вызываю gEngfuncs.pfnDrawCharacter после отрисовки картинки, то получается всё та же мешанина. Единствнный выход - поставить картинку порядком отрисовки ниже текста.
Так же есть ещё одна странная проблема: HUD_Key_Event ловит не все клавиши. Попробуйте поставить простой алерт и понажимать все подряд клавиши на клавиатуре. У меня, например, не ловятся кнопки m,n, ещё какие-то с правой части клавиатуры. Ваш багфикс ещё не имплементировал, дождусь официального обдейда. Если перепишу функцию в движке полностью по-нормальному, то выложу её сюда.
И ещё один вопрос. Так как png-шный шрифт я ещё не имплементировал, хочу сначала попробовать отточить всё на встроенном - появился неприятный глюк этого самого встроенного шрифта - невозможно управлять его прозрачностью. То есть, если я рисую подложку без прозрачности (255), а потом вызываю pfnDrawCharacter, то шрифт этот, который на подложку находит, не рисуется. У него прозрачность, что ли, захардкожена? Подложка рисуется следующим образом.
C++ Source Code:
2 | pglTranslatef((float)x,(float)y,(float)0); |
3 | pglDisable(GL_TEXTURE_2D); |
5 | pglDisable( GL_ALPHA_TEST ); |
6 | pglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); |
7 | pglColor4ub(b_r,b_g,b_b,b_a); |
14 | pglEnable(GL_TEXTURE_2D); |
порядок вызова такой:
C++ Source Code:
drawPodlozhka(255,255,255,255); |
drawText(255,0,0,255,"привет!\0"); |
Добавлено 09-03-2014 в 20:45:
С первой проблемой (HUD_KeyEvent ловит не все клавиши) разобрался. Нужно просто было поменять местами условия:
C++ Source Code:
1 | if( !clgame.dllFuncs.pfnKey_Event(down,key,kb) ) |
3 | // handled in client.dll |
8 | Msg( "%s is unbound, use controls menu to set.\n", Key_KeynumToString( key )); |
В движке.
Добавлено 09-03-2014 в 20:54:
Кстати, странно. Если я перекломпилрую движок (даже чистый) в релизе, то игра вылетает, даже не загружаясь. Билд 2643. В дебаге всё работает.
Может быть это связано с тем, что ксашмод от ноября 23-2013. Буду тестить ещё.
Добавлено 09-03-2014 в 20:55:
Пишет это:
Sys_LoadLibrary: Loading bin/client.dll - ok
CL_LoadProgs: found single callback export
CL_LoadProgs: failed to get address of HUD_ChatInputPosition proc
CL_LoadProgs: failed to get address of HUD_GetPlayerTeam proc
CL_LoadProgs: failed to get address of HUD_ClipMoveToEntity proc
Sys_Crash: call 1009DAC8 at address C0000005
Sys_FreeLibrary: Unloading xash.dll
Отправлено domded 09-03-2014 в 23:11:
Да, с номером билда вышла ошибочка. Билд 2463, самый последний, тестовый. Если его прокомпилировать в релизной конфигурации (xash.dll), то он выдаёт лог, написанный выше. Не важно что, оригинальная халва, ксаш-мод или какие-либо другие моды (типа aom). В дебажной всё нормально, по крайней мере запускается и можно побегать.
Добавлено 10-03-2014 в 03:11:
И, да. Я всё-таки пытаюсь написать эдит, но столкнулся ещё с одной проблемой. Есть ли в клиентке функция для перевода кода клавиши из HUD_KeyEvent в код символа в зависимости от языка и нажатой клавиши шифт? Либо придётся писать полностью свой перехват клавиатуры? Конечно, можно в движке перекодить всю часть, отвечающую за ввод, и вытащить всё, что мне надо, из ввода в консоль, но это не вариант, ибо буду пользоваться своим новомодным поделием только я.
Отправлено domded 10-03-2014 в 11:59:
Пытаюсь сделать так, чтобы код символа получить, но он корректно получает символы только для цифр в верхней части клавиатуры. Этот же код в хуке простом для записи символов в файл в моём старом проекте работает. Где я ошибся?
C++ Source Code:
4 | for (int i = 0; i < 256; i++) k[ i ] = GetKeyState(i); |
6 | HKL h = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),0)); |
7 | if ( ToAsciiEx(vkc,MapVirtualKeyEx(vkc,0,h),k,&r,0,h) ) return r; else return 0; |
vkc - это значение из HUD_KeyEvent
Добавлено 10-03-2014 в 15:59:
То есть, в зависимости от раскладки эта функция возвращает символы при нажатой клавише шифт над числовой клавиатурой, но буквы не возвращает - пишет цифры.
Отправлено domded 18-03-2014 в 20:57:
Так и не смог побороть вышеназванную проблему, плюс хотелось бы комментариев по моему багрепорту.
Отправлено Дядя Миша 19-03-2014 в 14:24:
Цитата:
domded писал:
Проблема изменением pglBing на GL_Bind не решилась. То есть, если я в своём контроле вызываю gEngfuncs.pfnDrawCharacter после отрисовки картинки, то получается всё та же мешанина.
ты картинки рисуешь через glBegin что ли?
Цитата:
domded писал:
То есть, если я рисую подложку без прозрачности (255), а потом вызываю pfnDrawCharacter, то шрифт этот, который на подложку находит, не рисуется. У него прозрачность, что ли, захардкожена?
Я ничего не понял, но вот в консоли буквы рисуются, они же нормально выглядят?
Цитата:
domded писал:
Подложка рисуется следующим образом.
Цитата:
domded писал:
pglLoadIdentity();pglTranslatef((float)x,(float)y,(float)0);
Это что за гамно? Ты зачем сбил ортогональную матрицу? 
Цитата:
domded писал:
pglDisable(GL_TEXTURE_2D);
яж тебе сказал - никаких операций с текстурами без участия движка.
либо должен очень хорошо представлять что ты делаешь. Подложку можно нарисовать через FillRGBA.
Цитата:
domded писал:
Есть ли в клиентке функция для перевода кода клавиши из HUD_KeyEvent в код символа в зависимости от языка и нажатой клавиши шифт?
Там есть ровно то, чего требует халфа. Я не знаю чего ты хочешь.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 19-03-2014 в 19:28:
Картинки я рисую через GL_QUAD с натянутой текстурой. А как ещё?
pglBind я уже не использую, вместо него - GL_Bind. Сбрасываю текстуру после рисования GL_Bind(GL_TEXTURE_2D,0). Всё равно глюки.
Про перевод символа - классическая задача на хуки клавиатуры. Как я понял, в HUD_KeyEvent передаётся сканкод клавиши - от 0 до 255. Кстати, я писал, вы внимания не обратили, что он ловит не все клавиши, а только те, которые есть в текущей таблице биндов, вроде как. Так вот, я его пытаюсь преобразовать в код символа, как указано выше. В хуке это работает. Тут - нет. Не понимаю, в чём причина.
Отправлено Дядя Миша 19-03-2014 в 19:35:
Цитата:
domded писал:
Сбрасываю текстуру после рисования GL_Bind(GL_TEXTURE_2D,0).
Не сбрасываешь. Во первых GL_Bind не даст тебе её так сбросить:
C++ Source Code:
1 | void GL_Bind( GLint tmu, GLenum texnum ) |
6 | if( texnum <= 0 ) texnum = tr.defaultTexture; |
во вторых, это не нужно.
Цитата:
domded писал:
я писал, вы внимания не обратили, что он ловит не все клавиши, а только те, которые есть в текущей таблице биндов, вроде как
Ну логично, HUD_KeyEvent обрабатывает нажатие от забинденных клавиш.
Тебе нужен CL_CharEvent - там остальные символы.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено domded 19-03-2014 в 19:47:
Про Translatef - я затупил. Всё равно потом матрицу восстанавливаю, так что это не критично.
Про FillRGBA - невозможно нарисовать непрозрачный прямоугольник, да и со скруглениями в апи движка туго. Всё равно придётся использовать TRIANGLE_FAN для скруглённых углов.
Добавлено 19-03-2014 в 23:47:
Где лежит этот самый CL_CharEvent? В каком файле? Быстрай поиск по проекту ничего не дал.
Добавлено 19-03-2014 в 23:47:
Где лежит этот самый CL_CharEvent? В каком файле? Быстрый поиск по проекту ничего не дал.
Отправлено Дядя Миша 20-03-2014 в 12:23:
Цитата:
domded писал:
Про FillRGBA - невозможно нарисовать непрозрачный прямоугольник
А, это да. Ну рисуй через SPR_Draw.
Цитата:
domded писал:
со скруглениями в апи движка туго. Всё равно придётся использовать TRIANGLE_FAN для скруглённых углов.
Никто никогда не рисует эти скругления вручную. Их рисуют на текстуре, а потом делают маску в альфа-канале. Не занимайся ерундой.
Цитата:
domded писал:
Где лежит этот самый CL_CharEvent? В каком файле? Быстрай поиск по проекту ничего не дал.
Ну вот смотри, я открываю папку engine и нахожу эту функцию ВИНДОВЫМ поиском, менее чем за секунду. Никаких студий, ничего.
Как вы ищите...__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ku2zoff 20-03-2014 в 19:45:
Цитата:
Дядя Миша писал:
и нахожу эту функцию ВИНДОВЫМ поиском, менее чем за секунду. Никаких студий, ничего.
Как вы ищите...
В win 7 и новее поиск по содержимому файла не работает с исходниками. Поэтому я всегда ищу через студию. domded а ты точно правильно искал?
Отправлено Дядя Миша 20-03-2014 в 20:22:
Цитата:
Ku2zoff писал:
В win 7 и новее поиск по содержимому файла не работает с исходниками
Зато она занимает 15 гигабайт на харде! 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ~ X ~ 20-03-2014 в 20:48:
В вантузе 5.1/5.2 поиск тоже непредсказуемый. Особенно после установки офиса. Может найти слово "жуй" в .доках, а в исходникак злово "void" в упор не видеть. Ищите через ваши ИДЕ.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено domded 21-03-2014 в 05:55:
Я ищу в клиент.длл. Ладно, буду сам думать над этим вопросом.
Всмысле через SPR_Draw? Мне не спрайт рисовать. Мне надо нарисовать просто цветной прямоугольник. И как его на текстурах делать? Радиус углов-то может быть разный.
Отправлено domded 21-03-2014 в 10:01:
Я не те вопросы задаю, что ли? Вроде раньше спрашивал про вещи сложнее, а тут про ваш собственный движок спрашиваю, ответы как-то слабо применимы к реальности. После месяца методом тыка выяснено, что картинка рисуется нормально и не сбивает всё остальное по порядку отрисовки только при использовании GL_Bind(GL_TEXTURE0,index). Во всех остальных случаях ( GL_TEXTURE_2D и прочее ) она всё равно сбивает всё остальное. Так же - баг, либо просто в халфе нет непрозрачного pfnDrawChar. Ещё раз говорю, наверное, в третий уже раз.
Рисую белую непрозрачную подложку.
C++ Source Code:
2 | pglTranslatef((float)x,(float)y,(float)0); |
3 | pglDisable(GL_TEXTURE_2D); |
5 | pglDisable( GL_ALPHA_TEST ); |
6 | pglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); |
7 | pglColor4ub(255,255,255,255); |
14 | pglEnable(GL_TEXTURE_2D); |
Сразу говорю про пгл енабле и дизабле по текстуре - если не использвать, то получается просто месиво из текстур, при передвижении персонажа с какого-то бодуна этот рект мигает, заливается рандомным светом, в общем получается форменная цветомузыка.
Рисую символ на подложке:
gEngfuncs.pfnDrawCharacter(0,0,"A",255,0,0);
Он не отображается. Не отображается, и всё тут.
Так же, если посавить цвет подложки в непрозрачный чёрный либо любой другой - символ отображается. Что это за бред? Я пытаюсь уже месяц ответа добиться. За это время успел дописать пнгшный и тгашный шрифт уже. Думаю, на этот встроенный с такими раскладами лучше забить.
Отправлено Дядя Миша 21-03-2014 в 12:39:
Цитата:
Дядя Миша писал:
GL_Bind(GL_TEXTURE_2D,0).
Я только сейчас эту чуш заметил. Почему ты туда суешь GL_TEXTURE_2D, где ты такое увидел? Ты не мог вообще в ксаш-моде посмотреть как правильно?
Ты понимаешь, что ты суешь что попало и куда попало, а потом спрашиваешь, а почему не работает.
Цитата:
domded писал:
Я ищу в клиент.длл.
нету там, в движке есть
Цитата:
domded писал:
а тут про ваш собственный движок спрашиваю, ответы как-то слабо применимы к реальности
Какие вопросы, такие и ответы. Сначала ты суешь GL_TEXTURE_2D в GL_Bind, а потом спрашиваешь, а почему не работает. Ну вот - поэтому.
Цитата:
domded писал:
Сразу говорю про пгл енабле и дизабле по текстуре - если не использвать, то получается просто месиво из текстур, при передвижении персонажа с какого-то бодуна этот рект мигает, заливается рандомным светом, в общем получается форменная цветомузыка.
Ты понимаешь, что opengl - это стейт-машина, и стейт проставленный фиг знает где, может вылезти именно сейчас. И мне твой кусочек кода вообще ни о чём не говорит, кроме того, что ты попрежнему юзаешь glTranslate.
А смысл вообще что-то советовать, если ты меня не слушаешь?
Добавлено 21-03-2014 в 16:39:
И эта. Долго объяснять почему, но заливку фоном лучше сделать при помощи белой текстуры, вместо её отключения.__________________
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-03-2014 в 22:46:
Я отказался от транслейтф уже.
И про стейт-машину понимаю. Я все стейты вызываю синхронно. То что дисейблю - то енейблю в конце и наоборот.
Про GL_TEXTURE_2D - я всегда им пользовался. В ванильной халве, когда добавлял поддержку пнг, когда пробовал рисовать прицел на винтовке. Мне казалось, что это просто канал для текстуры, как и все остальные. В интернете все примеры для работы с текстурированием квада используют его. GL_TEXTURE0 я вообще нигде не видел, пока не стал копаться в ксаш-ХТ.
Могу выложить недописанный проект ( поскольку логику работы кода и вызовов описывать - страницы на две хватит ).
Отправлено Дядя Миша 22-03-2014 в 13:44:
Цитата:
domded писал:
Про GL_TEXTURE_2D - я всегда им пользовался
Ну ты же понимаешь, что это движковые функции, а не OpenGL. И было бы неплохо узнать, перед тем как ими пользоваться.
Цитата:
domded писал:
Мне казалось, что это просто канал для текстуры, как и все остальные
Это - подсказка, как рассматривать текущую текстуру.
Цитата:
domded писал:
Могу выложить недописанный проект
Ну это на твоё усмотрение. Я тебе хочу дать хороший совет - не трогай матрицы вообще. Они уже давно за тебя настроены. А в 2D их вообще трогать не нужно, разве что захочешь сделать крутящиеся картинки.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'