HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Проблема с зависанием анимации у модели локального игрока
Страницы (3): [1] 2 3 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
SNMetamorph
Житель форума

Дата регистрации: Jun 2018
Проживает: Ижевск
Сообщений: 560

Рейтинг



Question Проблема с зависанием анимации у модели локального игрока

Сидел, значит, спокойно работал над модом, и заметил при игре от 3-го лица, что после смерти игрока, у него при хождении полностью зависает анимация: как ног, так и остального тела. Решил разобраться, в чём же все-таки дело. Оказалось, что когда я реализовывал изменение прозрачности модели игрока при приближении камеры к стене, я записывал значение в curstate->renderamt внутри функции V_CalcRefdef().
При этом в рендере студиомоделей содержался подобного рода код:

C++ Source Code:
1
int CStudioModelRenderer::StudioDrawModel( int flags )
2
{
3
  alight_t lighting;
4
  vec3_t dir;
5
 
6
  m_pCurrentEntity = IEngineStudio.GetCurrentEntity();
7
  IEngineStudio.GetTimes( &m_nFrameCount, &m_clTime, &m_clOldTime );
8
  IEngineStudio.GetViewInfo( m_vRenderOrigin, m_vUp, m_vRight, m_vNormal );
9
  IEngineStudio.GetAliasScale( &m_fSoftwareXScale, &m_fSoftwareYScale );
10
 
11
  if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer)
12
  {
13
    entity_state_t deadplayer;
14
 
15
    int result;
16
    int save_interp;
17
 
18
    if (m_pCurrentEntity->curstate.renderamt <= 0 || m_pCurrentEntity->curstate.renderamt > gEngfuncs.GetMaxClients() )
19
      return 0;
20
 
21
    // get copy of player
22
    deadplayer = *(IEngineStudio.GetPlayerState( m_pCurrentEntity->curstate.renderamt - 1 )); //cl.frames[cl.parsecount & CL_UPDATE_MASK].playerstate[m_pCurrentEntity->curstate.renderamt-1];
23
 
24
    // clear weapon, movement state
25
    deadplayer.number = m_pCurrentEntity->curstate.renderamt;
26
    deadplayer.weaponmodel = 0;
27
    deadplayer.gaitsequence = 0;
28
 
29
    deadplayer.movetype = MOVETYPE_NONE;
30
    VectorCopy( m_pCurrentEntity->curstate.angles, deadplayer.angles );
31
    VectorCopy( m_pCurrentEntity->curstate.origin, deadplayer.origin );
32
 
33
    save_interp = m_fDoInterp;
34
    m_fDoInterp = 0;
35
 
36
    // draw as though it were a player
37
    result = StudioDrawPlayer( flags, &deadplayer );
38
 
39
    m_fDoInterp = save_interp;
40
    return result;
41
  }

Казалось бы, очевидно, в чем тут проблема.
В общем, я переписал этот код, чтобы индекс игрока-хозяина писался в поле owner, вместо поля renderamt. Серверную часть с кодом body que соответственно тоже переписал под эту задумку.

Получилось у меня вот так:
C++ Source Code:
1
int CStudioModelRenderer::StudioDrawModel( int flags )
2
{
3
  alight_t lighting;
4
  vec3_t dir;
5
 
6
  m_pCurrentEntity = IEngineStudio.GetCurrentEntity();
7
  IEngineStudio.GetTimes( &m_nFrameCount, &m_clTime, &m_clOldTime );
8
  IEngineStudio.GetViewInfo( m_vRenderOrigin, m_vUp, m_vRight, m_vNormal );
9
  IEngineStudio.GetAliasScale( &m_fSoftwareXScale, &m_fSoftwareYScale );
10
 
11
  if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer)
12
  {
13
    entity_state_t deadplayer;
14
    int owner_index = m_pCurrentEntity->curstate.owner;
15
    if (owner_index <= 0 || owner_index > gEngfuncs.GetMaxClients())
16
      return 0;
17
 
18
    deadplayer = *(IEngineStudio.GetPlayerState(owner_index));
19
 
20
    // clear weapon, movement state
21
    deadplayer.number		= owner_index + 1;
22
    deadplayer.weaponmodel	= 0;
23
    deadplayer.gaitsequence = 0;
24
    deadplayer.movetype		= MOVETYPE_NONE;
25
    deadplayer.origin		= m_pCurrentEntity->curstate.origin;
26
    deadplayer.angles		= m_pCurrentEntity->curstate.angles;
27
    gEngfuncs.Con_Printf("drawing corpse, owner index %d, ent index %d\n", owner_index, m_pCurrentEntity->index);
28
 
29
    int save_interp = m_fDoInterp;
30
    m_fDoInterp = 0;
31
 
32
    // draw as though it were a player
33
    int result = StudioDrawPlayer( flags, &deadplayer );
34
 
35
    m_fDoInterp = save_interp;
36
    return result;
37
  }


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

Изменяю прозрачность игрока таким образом:
C++ Source Code:
1
cl_entity_t *player = gEngfuncs.GetLocalPlayer();
2
v_origin = CAM_GetClippedOrigin(player->origin, trace_dir, &transparency);
3
player->curstate.renderamt = max(cam_clipalpha->value, transparency);
4
player->curstate.rendermode = kRenderTransTexture;

Сообщить модератору | | IP: Записан
Сообщение: 175953

Старое сообщение 21-03-2019 11:07
- За что?
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Один хак заменил другим
kRenderFxDeadPlayer и body que надо вообще уничтожать.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 175955

Старое сообщение 21-03-2019 12:07
- За что?
SNMetamorph
Житель форума

Дата регистрации: Jun 2018
Проживает: Ижевск
Сообщений: 560

Рейтинг



Цитата:
~ X ~ писал:
kRenderFxDeadPlayer и body que надо вообще уничтожать.

Я тоже склоняюсь к этому мнению, но никаких других идей касательно рисования трупов игрока у меня нет.

Сообщить модератору | | IP: Записан
Сообщение: 175956

Старое сообщение 21-03-2019 12:11
- За что?
Ghoul [BB]
МРАЗЬ ОПАСНАЯ

Дата регистрации: Jan 2006
Проживает: ...и прожигает...
Сообщений: 2567

Рейтинг



Надо отметить, что твоя проблема уже давно решена в XDM

Добавлено 21-03-2019 в 15:43:

А если по сабжу, то обрати внимание на то, что некоторыех режимов rendermode на клиенте попросту нет.
kRenderTransTexture или kRenderTransColor,
Столкнулся, когда делал невидимость. Так вот , в DMC специально хак для этого нагородили...

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo

Сообщить модератору | | IP: Записан
Сообщение: 175959

Старое сообщение 21-03-2019 12:43
- За что?
SNMetamorph
Житель форума

Дата регистрации: Jun 2018
Проживает: Ижевск
Сообщений: 560

Рейтинг



Цитата:
Ghoul [BB] писал:
А если по сабжу, то обрати внимание на то, что некоторыех режимов rendermode на клиенте попросту нет.
kRenderTransTexture или kRenderTransColor

Странно, но несмотря на это, у меня прозрачность работает.

Сообщить модератору | | IP: Записан
Сообщение: 175960

Старое сообщение 21-03-2019 13:37
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
~ X ~ писал:
kRenderFxDeadPlayer и body que надо вообще уничтожать.

Как ты будешь отображать трупы на карте в мультиплеере без bodyque?

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 175961

Старое сообщение 21-03-2019 13:43
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Вместо renderamt заюзать например iuser1.

Добавлено 21-03-2019 в 20:13:

Цитата:
Ghoul [BB] писал:
Надо отметить, что твоя проблема уже давно решена в XDM

Там вообще нету трупов?

Добавлено 21-03-2019 в 20:14:

Цитата:
Ghoul [BB] писал:
А если по сабжу, то обрати внимание на то, что некоторыех режимов rendermode на клиенте попросту нет.

Чего-чего

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 175964

Старое сообщение 21-03-2019 17:14
-
Ghoul [BB]
МРАЗЬ ОПАСНАЯ

Дата регистрации: Jan 2006
Проживает: ...и прожигает...
Сообщений: 2567

Рейтинг



Цитата:
Дядя Миша писал:
Чего-чего



Ну вот так вот:

Добавлено 21-03-2019 в 20:35:

На модель в руках не действует режим отрисовки
- kRenderTransColor
- kRenderTransTexture

режим же
- kRenderTransAdd работает, но не до конца (т.е. модель игрока почти не видна, а оружие - еле прозрачно)

Вот я и говорю, что это какие-то проблемы с отрисовкой режимов и настроек прозрачности.

В DeathMatchClassic сделали хак для именно этого случая (когда подбираешь невидимость)

C++ Source Code:
1
CStudioModelRenderer::StudioRenderModel
2
{
3
  ....
4
  if ( strstr ( m_pCurrentEntity->model->name, "v_" ) )
5
  {
6
    if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT)
7
    {
8
      m_pCurrentEntity->curstate.renderfx = kRenderFxNone;
9
      StudioRenderFinal( );
10
    }
11
  }
12
  else
13
  {
14
    if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT && m_pCurrentEntity->curstate.rendermode != kRenderTransColor )
15
    {
16
      m_pCurrentEntity->curstate.renderfx = kRenderFxNone;
17
      StudioRenderFinal( );
18
    }
19
  }

[ Вложение ]
renders.jpg

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo

Сообщить модератору | | IP: Записан
Сообщение: 175965

Старое сообщение 21-03-2019 17:35
- За что?
Ghoul [BB]
МРАЗЬ ОПАСНАЯ

Дата регистрации: Jan 2006
Проживает: ...и прожигает...
Сообщений: 2567

Рейтинг



Ну то есть они тупо не рисуют эту модель в руках, чтобы скрыть вышеприведенные уродства...

[ Вложение ]
test0001.jpg

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo

Сообщить модератору | | IP: Записан
Сообщение: 175966

Старое сообщение 21-03-2019 17:38
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
Ghoul [BB] писал:
На модель в руках не действует режим отрисовки
- kRenderTransColor
- kRenderTransTexture

TransColor вообще на студиомодели не действует, это я в ксаше специально заморачивался, чёб работало. А TransTexture должен работать, но там есть одна хитрость. Там надо задавать прозрачность через IEngineStudio.SetRenderamt

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 175968

Старое сообщение 21-03-2019 18:38
-
SNMetamorph
Житель форума

Дата регистрации: Jun 2018
Проживает: Ижевск
Сообщений: 560

Рейтинг



Цитата:
Ghoul [BB] писал:
Надо отметить, что твоя проблема уже давно решена в XDM

Не-не, так просто - не прокатит. Без трупов не обойтись.

Добавлено 22-03-2019 в 16:52:

Цитата:
Дядя Миша писал:
Вместо renderamt заюзать например iuser1.

Так ведь я уже вместо renderamt заюзал поле owner. Или оно для этих целей не подходит?

Добавлено 22-03-2019 в 17:14:

Еще, значит, зашел сегодня в XDM чтобы посмотреть, как там обстоят дела с трупами, и увидел в настройках нечто:



ЧТО ЭТО? 0_0

Сообщить модератору | | IP: Записан
Сообщение: 175972

Старое сообщение 22-03-2019 08:14
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
SNMetamorph писал:
Так ведь я уже вместо renderamt заюзал поле owner. Или оно для этих целей не подходит?

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

Цитата:
SNMetamorph писал:
ЧТО ЭТО? 0_0

Влажные фантазии

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 175997

Старое сообщение 22-03-2019 16:48
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


С каких это пор в халфе - TCP? Там всю жизнь был UDP, а reliable реализуется на уровне кода.

Добавлено 22-03-2019 в 23:52:

А even more reliable это что? Прямой вызов функций client.dll из hl.dll?

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 175998

Старое сообщение 22-03-2019 16:52
-
SNMetamorph
Житель форума

Дата регистрации: Jun 2018
Проживает: Ижевск
Сообщений: 560

Рейтинг



Цитата:
XaeroX писал:
С каких это пор в халфе - TCP?

Видимо, разраб XDM что-то в клиентской DLL намутил с сокетами.

Сообщить модератору | | IP: Записан
Сообщение: 176016

Старое сообщение 23-03-2019 02:20
- За что?
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


SNMetamorph я не понял, что тебя так напугало. В твоей стране за эти слова расстреливают?
Это старый тестовый флаг, когда-то я хотел пустить отдельный поток мессаг, да. Но быстро отказался от идеи, ибо нарушает ярусность, как вы догадались. Сейчас он регулирует только соотношение MSG_RELIABLE/UNRELIABLE. В общем, остатки экспериментов.

Трупов игроков в XDM сейчас реально нет. Но можно, например, respawntime увеличить и полюбоваться, если надо.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 176045

Старое сообщение 23-03-2019 08:47
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 16:04. Новая тема    Ответить
Страницы (3): [1] 2 3 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Проблема с зависанием анимации у модели локального игрока
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024