HLFX.Ru Forum
Показать все 22 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Xash3D (https://hlfx.ru/forum/forumdisplay.php?forumid=14)
-- GL_StudioDrawShadows - обратная сторона (https://hlfx.ru/forum/showthread.php?threadid=2814)


Отправлено Дядя Миша 09-05-2011 в 15:04:

GL_StudioDrawShadows - обратная сторона

Как известно в HL данная функция выключена, хотя сами тени, конечно никуда не делись и могут быть вызваны при помощи известного хака, который прыгает через возврат и позволяет вызвать функцию.
Я в ксаше пытался проэмулировать подобное поведение, но толи ума не хватило, толи там какая-то хитрость есть, но в общем и целом ничего не вышло. Есть желающие повозиться с этой бедой?

__________________
My Projects: download page

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

Цитата:

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


Отправлено fire64 09-05-2011 в 18:41:

Я кстати понять не могу, зачем они отключили вызов теней, но при этом оставили их рабочий код ?

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено XaeroX 09-05-2011 в 18:41:

fire64
Когда ты какую-то фичу отключаешь - то полностью вырезаешь её код?


Отправлено fire64 09-05-2011 в 18:47:

XaeroX, если я не планирую вернуть её позже, то да.
Иначе со временем код превратится в помойку из старого неработающего кода.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Дядя Миша 09-05-2011 в 18:50:

Цитата:
XaeroX писал:
Когда ты какую-то фичу отключаешь - то полностью вырезаешь её код?

Я так скажу. Если эта фича умещается в одной функции и не тянет за собой никаких изменений - почему бы и не удалить полностью.
Но мне другое непонятно. Зачем ВООБЩЕ надо было отключать тени?
Кому они мешали?

Добавлено 09-05-2011 в 22:50:

ЗЫ. Adamix наговнял вот такое вот чудо, которое даже работает, но мне оно не нравится. Совсем не нравится
C++ Source Code:
1
static void GL_StudioDrawShadow( void )
2
{
3
  // big hack for some other shadows hack.
4
  _asm
5
  {
6
    nop
7
    nop
8
    nop
9
    nop
10
    nop
11
    nop
12
    nop
13
    nop
14
    nop
15
    nop
16
    nop
17
    nop
18
    nop
19
    nop
20
    nop
21
    nop
22
    nop
23
    nop
24
    nop
25
    nop
26
    nop
27
    nop
28
    nop
29
    nop
30
    nop
31
    nop
32
    nop
33
    nop
34
    nop
35
    nop
36
    nop
37
    nop
38
    nop
39
    nop
40
    nop
41
    nop
42
    nop
43
    nop
44
    pop ecx
45
  }
46
 
47
  if( true )// r_shadows.value )
48
  {
49
    StudioDrawShadow( m_pStudioHeader, g_bonestransform );
50
  }
51
}

__________________
My Projects: download page

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

Цитата:

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


Отправлено fire64 09-05-2011 в 19:10:

А в чем смысл забивать функцию nop'ами ?

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено XaeroX 09-05-2011 в 19:16:

Меня больше беспокоит строчка "pop ecx".


Отправлено Дядя Миша 09-05-2011 в 19:28:

Цитата:
XaeroX писал:
Меня больше беспокоит строчка "pop ecx".

ну ничего страшного. подумаешь, будет stack underflow, всего-то делов

__________________
My Projects: download page

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

Цитата:

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


Отправлено Ku2zoff 10-05-2011 в 02:45:

А стенсил буффер в Ксаше включен? Чтобы хакнутую opengl32.dll для теней БУзера или неба из Паранойи не волочить за модом?


Отправлено FiEctro 10-05-2011 в 05:50:

>> Но мне другое непонятно. Зачем ВООБЩЕ надо было отключать тени?
Кому они мешали?

Плоские и мерцающие . Видимо валв они бесили, потом в контерстрайке были другие тени, такие спрайтики под ногами игроков.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!


Отправлено adamix 10-05-2011 в 07:12:

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

__________________
Законы математики, имеющие какое-либо отношение к реальному миру, ненадежны; а надежные математические законы не имеют отношения к реальному миру. © Альберт Эйнштейн


Отправлено Дядя Миша 10-05-2011 в 08:23:

Цитата:
Ku2zoff писал:
А стенсил буффер в Ксаше включен?

ну он через квар gl_stencilbits настраивается. Впрочем параноя без своей любимой дллки серавно не заработает - она же ищет волшебное gl-расширение PARANOIA_HACKS_V1.
И тени бузера тоже не заработают.
Цитата:
adamix писал:
Предлагайте свои идеи

моя идея посмотреть чем они заняты в оригинальной функции.
Правда её сначала нужно найти, но это уже дело техники.
Я начал поиски с DispatchStudioEvent.

__________________
My Projects: download page

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

Цитата:

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


Отправлено XaeroX 10-05-2011 в 08:32:

Цитата:
adamix писал:
Предлагайте свои идеи, чем можно занять первые 32 байта в функции без асма.

Ты для начала объясни, с чего ты взял, что твой код на асме займет первые 32 байта в функции? Причем на всех компиляторах и всех конфигурациях (дебаг, релиз).


Отправлено Ku2zoff 10-05-2011 в 08:35:

>>Впрочем параноя без своей любимой дллки серавно не заработает
Ну дык её клиент можно перекомпилить если чо.

>>И тени бузера тоже не заработают.
Они и с дллкой криво работают, я об этом уже писал.


Отправлено adamix 10-05-2011 в 08:37:

Цитата:
XaeroX писал:
Ты для начала объясни, с чего ты взял, что твой код на асме займет первые 32 байта в функции?

ЕМНИП, канпелятор не оптимизирует асм. Ну там не 32, чуть больше. суть в том, что после джампа мы должны оказатся на 32 байте.

__________________
Законы математики, имеющие какое-либо отношение к реальному миру, ненадежны; а надежные математические законы не имеют отношения к реальному миру. © Альберт Эйнштейн


Отправлено Ku2zoff 10-05-2011 в 08:42:

>>Плоские и мерцающие
У некоторых товарищей (и у меня раньше, когда радеон был) на радеонах они не мерцают. А то, что не на поверхности не ложаться, да плохо.


Отправлено XaeroX 10-05-2011 в 08:47:

Ну и не проще ли было сделать обёртку - naked-функцию, вписать в ее начало нужное число нопов, потом свой пролог и вызов обычной функции? Если в релиз-версии компилятор всунет свой пролог до твоего асм-кода, все изломается.


Отправлено Дядя Миша 10-05-2011 в 10:35:

Цитата:
Ku2zoff писал:
Они и с дллкой криво работают, я об этом уже писал.

очнись! в релизной версии это было исправлено.
Вообщем путём нехитрова реверс-инжинеринга я восстановил (частично) функцию StudioDrawShadows. Выглядит она вот так
C++ Source Code:
1
void __cdecl R_StudioDrawShadows()
2
{
3
  int		rendermode; // ecx@3
4
  float		shadow_alpha; // ST18_4@4
5
  float		shadow_alpha2; // ST14_4@4
6
  GLenum		depthmode; // [sp+14h] [bp-8h]@6
7
  GLenum		depthmode2; // [sp+14h] [bp-8h]@10
8
 
9
  qglDepthMask( GL_TRUE );
10
 
11
  if( r_shadows.value != 0.0f )
12
  {
13
    if( iCurrentMovetype != MOVETYPE_FLY )
14
    {
15
      rendermode = m_pCurrentEntity->baseline.rendermode;
16
 
17
      if( rendermode == kRenderNormal )
18
      {
19
        shadow_alpha = 1.0 - r_shadowalpha->value * 0.5f;
20
        qglDisable( GL_TEXTURE_2D );
21
        qglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
22
        qglEnable( GL_BLEND );
23
        shadow_alpha2 = 1.0 - shadow_alpha;
24
 
25
        qglColor4f( 0.0f, 0.0f, 0.0f, shadow_alpha2 );
26
 
27
        if( flt_100DB994 == 0.0 || flt_107BA8A8 < 0.5 )
28
          depthmode = GL_LESS;
29
        else depthmode = GL_GREATER;
30
        qglDepthFunc( depthmode );
31
 
32
        sub_10073AA0();
33
 
34
        if( flt_100DB994 == 0.0 || flt_107BA8A8 < 0.5 )
35
          depthmode2 = GL_LEQUAL;
36
        else
37
          depthmode2 = GL_GEQUAL;
38
 
39
        qglDepthFunc( depthmode2 );
40
        qglEnable( GL_TEXTURE_2D );
41
        qglDisable( GL_BLEND );
42
 
43
        qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
44
 
45
        if( flt_100DAF14 != 0.0 )
46
          qglShadeModel( GL_SMOOTH );
47
      }
48
    }
49
  }
50
}

Ну а дальше - дело техники

Добавлено 10-05-2011 в 14:35:

ЗЫ. отсюда кстати и становится ясно, что push ecx 1 - это вызов qglDepthMask, который в хаке пропускается и восстановить регистр надо вручную.

__________________
My Projects: download page

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

Цитата:

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


Отправлено XaeroX 10-05-2011 в 11:43:

Дядя Миша
Нет никакой гарантии, что в твоем ехешнике этот же самый код будет работать, с теми же оффсетами. Этот хак привязан к конкретному машинному коду, а он зависит от кучи вещей - компилятора, уровня оптимизации и т.п.


Отправлено Дядя Миша 10-05-2011 в 12:19:

Цитата:
XaeroX писал:
Нет никакой гарантии, что в твоем ехешнике этот же самый код будет работать, с теми же оффсетами

гарантии конечно нет. Однако работает

__________________
My Projects: download page

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

Цитата:

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


Отправлено Ku2zoff 10-05-2011 в 12:33:

Дядя Миша промежуточные билды движка будут? А то ждать до сентября долго А adamix'овскую версию я не хочу качать, мало ли чо там.


Отправлено Дядя Миша 10-05-2011 в 13:18:

Цитата:
Ku2zoff писал:
промежуточные билды движка будут?

будут но без сорцев и в комплекте с ксаш-модом с сорцами.

__________________
My Projects: download page

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

Цитата:

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


Временная зона GMT. Текущее время 15:53.
Показать все 22 сообщений этой темы на одной странице

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