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

Группа: Опытный
Дата регистрации: Jun 2018
Проживает: деревня
Сообщений: 6

Рейтинг



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

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

C++ Source Code:
int CStudioModelRenderer::StudioDrawModel( int flags )
{
    alight_t lighting;
    vec3_t dir;
    
    m_pCurrentEntity = IEngineStudio.GetCurrentEntity();
    IEngineStudio.GetTimes( &m_nFrameCount, &m_clTime, &m_clOldTime );
    IEngineStudio.GetViewInfo( m_vRenderOrigin, m_vUp, m_vRight, m_vNormal );
    IEngineStudio.GetAliasScale( &m_fSoftwareXScale, &m_fSoftwareYScale );
    
    if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer)
    {
        entity_state_t deadplayer;
        
        int result;
        int save_interp;
        
        if (m_pCurrentEntity->curstate.renderamt <= 0 || m_pCurrentEntity->curstate.renderamt > gEngfuncs.GetMaxClients() )
            return 0;
        
        // get copy of player
        deadplayer = *(IEngineStudio.GetPlayerState( m_pCurrentEntity->curstate.renderamt - 1 )); //cl.frames[cl.parsecount & CL_UPDATE_MASK].playerstate[m_pCurrentEntity->curstate.renderamt-1];
        
        // clear weapon, movement state
        deadplayer.number = m_pCurrentEntity->curstate.renderamt;
        deadplayer.weaponmodel = 0;
        deadplayer.gaitsequence = 0;
        
        deadplayer.movetype = MOVETYPE_NONE;
        VectorCopy( m_pCurrentEntity->curstate.angles, deadplayer.angles );
        VectorCopy( m_pCurrentEntity->curstate.origin, deadplayer.origin );
        
        save_interp = m_fDoInterp;
        m_fDoInterp = 0;
        
        // draw as though it were a player
        result = StudioDrawPlayer( flags, &deadplayer );
        
        m_fDoInterp = save_interp;
        return result;
    }
    

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

Получилось у меня вот так:
C++ Source Code:
int CStudioModelRenderer::StudioDrawModel( int flags )
{
    alight_t lighting;
    vec3_t dir;
    
    m_pCurrentEntity = IEngineStudio.GetCurrentEntity();
    IEngineStudio.GetTimes( &m_nFrameCount, &m_clTime, &m_clOldTime );
    IEngineStudio.GetViewInfo( m_vRenderOrigin, m_vUp, m_vRight, m_vNormal );
    IEngineStudio.GetAliasScale( &m_fSoftwareXScale, &m_fSoftwareYScale );
    
    if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer)
    {
        entity_state_t deadplayer;
        int owner_index = m_pCurrentEntity->curstate.owner;
        if (owner_index <= 0 || owner_index > gEngfuncs.GetMaxClients())
            return 0;
        
        deadplayer = *(IEngineStudio.GetPlayerState(owner_index));
        
        // clear weapon, movement state
        deadplayer.number    = owner_index + 1;
        deadplayer.weaponmodel    = 0;
        deadplayer.gaitsequence = 0;
        deadplayer.movetype    = MOVETYPE_NONE;
        deadplayer.origin    = m_pCurrentEntity->curstate.origin;
        deadplayer.angles    = m_pCurrentEntity->curstate.angles;
        gEngfuncs.Con_Printf("drawing corpse, owner index %d, ent index %d\n", owner_index, m_pCurrentEntity->index);
        
        int save_interp = m_fDoInterp;
        m_fDoInterp = 0;
        
        // draw as though it were a player
        int result = StudioDrawPlayer( flags, &deadplayer );
        
        m_fDoInterp = save_interp;
        return result;
    }
    


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

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

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

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

Дата регистрации: Oct 2005
Проживает: (void)
Сообщений: 3378
Нанёс повреждений: 2 ед.

Рейтинг



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


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

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

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

Старое сообщение вчера 12:07
-
SNMetamorph
Новичок

Группа: Опытный
Дата регистрации: Jun 2018
Проживает: деревня
Сообщений: 6

Рейтинг



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

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

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

Старое сообщение вчера 12:11
- За что?
Ghoul [BB]
Больше знаний - больше печали
Предупреждения:++++++

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

Рейтинг



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

Добавлено вчера в 15:43:

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

__________________
Видел я в каком-то фильме,
В каком-то старом фильме,
Как льётся солнце на золотые пляжи,
Hо врядли вспонмю, теперь я врядли вспомню.
Дождливый полдень мне не подскажет...

Где-то за семью морями есть золотые страны,
Круглый год лето, улыбки и бананы.
Сегодня ночью я побываю там,
Если опять не кончился феназепам.

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

Старое сообщение вчера 12:43
- За что?
SNMetamorph
Новичок

Группа: Опытный
Дата регистрации: Jun 2018
Проживает: деревня
Сообщений: 6

Рейтинг



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

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

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

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

Дата регистрации: Oct 2005
Проживает: Новосибирск
Сообщений: 28642
Нанёс повреждений: 475 ед.
Возраст: 32

Рейтинг



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


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

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

__________________
So she began again: 'Où est ma chatte?' which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. 'Oh, I beg your pardon!' cried Alice hastily, afraid that she had hurt the poor animal's feelings. 'I quite forgot you didn't like cats.'

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

Старое сообщение вчера 13:43
-
 Дядя Миша
who said meow?

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

Рейтинг



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

Добавлено вчера в 20:13:

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

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

Добавлено вчера в 20:14:

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

Чего-чего

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page

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

Старое сообщение вчера 17:14
-
Ghoul [BB]
Больше знаний - больше печали
Предупреждения:++++++

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

Рейтинг



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



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

Добавлено вчера в 20:35:

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

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

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

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

C++ Source Code:
CStudioModelRenderer::StudioRenderModel
{
    ....
    if ( strstr ( m_pCurrentEntity->model->name, "v_" ) )
    {
        if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT)
        {
            m_pCurrentEntity->curstate.renderfx = kRenderFxNone;
            StudioRenderFinal( );
        }
    }
    else
    {
        if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT && m_pCurrentEntity->curstate.rendermode != kRenderTransColor )
        {
            m_pCurrentEntity->curstate.renderfx = kRenderFxNone;
            StudioRenderFinal( );
        }
    }
    

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

__________________
Видел я в каком-то фильме,
В каком-то старом фильме,
Как льётся солнце на золотые пляжи,
Hо врядли вспонмю, теперь я врядли вспомню.
Дождливый полдень мне не подскажет...

Где-то за семью морями есть золотые страны,
Круглый год лето, улыбки и бананы.
Сегодня ночью я побываю там,
Если опять не кончился феназепам.

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

Старое сообщение вчера 17:35
- За что?
Ghoul [BB]
Больше знаний - больше печали
Предупреждения:++++++

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

Рейтинг



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

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

__________________
Видел я в каком-то фильме,
В каком-то старом фильме,
Как льётся солнце на золотые пляжи,
Hо врядли вспонмю, теперь я врядли вспомню.
Дождливый полдень мне не подскажет...

Где-то за семью морями есть золотые страны,
Круглый год лето, улыбки и бананы.
Сегодня ночью я побываю там,
Если опять не кончился феназепам.

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

Старое сообщение вчера 17:38
- За что?
 Дядя Миша
who said meow?

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

Рейтинг



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

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

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page

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

Старое сообщение вчера 18:38
-
SNMetamorph
Новичок

Группа: Опытный
Дата регистрации: Jun 2018
Проживает: деревня
Сообщений: 6

Рейтинг



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

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

Добавлено сегодня в 16:52:

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

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

Добавлено сегодня в 17:14:

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



ЧТО ЭТО? 0_0

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

Старое сообщение сегодня 08:14
- За что?
Тема: (Опционально)
Ваш ответ:



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


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

Временная зона GMT. Текущее время 12:26. Новая тема    Ответить
  Предыдущая тема   Следующая тема
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-2019