Автор Тема: Нижний цвет неба  (Прочитано 9511 раз)

Онлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Нижний цвет неба
« : Январь 09, 2015, 07:23:28 pm »
Кто-нибудь знает, как сменить цвет нижней половины неба? Той, что тёмно-серая. Может адрес какой есть, чтобы изменять его динамически: его можно было бы тогда сменять на тот же, что и у нижнего края "верхнего" неба(у "верхнего" неба 2 градиента цвета).
P.S. скайбокс(или сферу) не предлагать:)

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #1 : Январь 09, 2015, 08:42:43 pm »
Что-то ничего не удалось разглядеть, у меня стандартное небо синее, к горизонту до воды светлеет, только если воду убрать, там что-то коричневое ниже. А почему ты не хочешь использовать "то, что не предлагать", ведь можно добиться большей фотореалистичности. Я, например, после экспериментов обнаружил, что если сделать "то, что не предлагать" монохромным, а не голубым, и нужной прозрачности, то цвета будут правильно отображать настройки timecyc.dat, ночь будет черной, а не фиолетовой, дождь пасмурным серым, а ясное небо голубым. Я бы покопал в сторону создания динамического "того, что не предлагать", чтобы создать эффект движения и смены текстур с изменением прозрачности и всякое такое.
Возвращаясь к теме, покажи что-ли скрин, чтобы понять, что именно тебя интересует.

Онлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Нижний цвет неба
« Ответ #2 : Январь 10, 2015, 12:34:06 am »
Вот эта тёмно-серая фигня, когда находишься на большой высоте:


Если увеличить дистанцию прорисовки и сделать скайсферу "монохромным, а не голубым, и нужной прозрачности" цветом, то серая фигня останется серой фигней :(
Если делать нижнюю часть скайсферы не серым, а цвета неба - то этот низ не будет меняться во время смены суток, т.е. ночью будет голубой/фиолетовый

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #3 : Январь 10, 2015, 09:35:06 am »
А у меня вот так на высоте 1000. По-моему у тебя просто маловато воды, серая фигня определяет уже уровень ниже горизонта.


Онлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Нижний цвет неба
« Ответ #4 : Январь 10, 2015, 03:26:43 pm »
У тебя просто дистанция прорисовки большая. Серая фигня появляется при небольшой.
В том то и дело, что хотелось бы сохранить небольшую дистанцию: когда падаешь с большой высоты, малая дальность видимости сглаживает небольшую игровую территорию.

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #5 : Январь 15, 2017, 01:31:05 pm »
Кстати, под углом камеры это очень заметно.

Онлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Нижний цвет неба
« Ответ #6 : Январь 15, 2017, 02:47:09 pm »
Кстати, под углом камеры это очень заметно.
Да во многих моментах это заметно, нужно найти адреса памяти этого цвета RGB и динамически записывать туда цвет второй половины неба. Увы, я только в последний год начал активно изучать IDA, но сейчас занят MMS, поэтому хз, когда к этому приступлю..

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #7 : Январь 23, 2017, 08:30:12 pm »
Искать надо в местах, где вызывается отрисовка прямоугольника с градиентом.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #8 : Январь 27, 2017, 02:56:02 pm »
Вот здесь надо смотреть:  CClouds::RenderBackground(short, short, short, short, short, short, short)

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #9 : Февраль 11, 2017, 07:53:29 am »
Написал такой патч:
Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class SkyPatch {
  7. public:
  8.          static CRGBA ColorHooked;
  9.  
  10.          static void CSpriteDrawAnyRect(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA* color1, CRGBA* color2, CRGBA* color3, CRGBA* color4)
  11.         {      
  12.                 ColorHooked = *color4;
  13.  
  14.                 CSprite2d Temp;
  15.                 Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, *color1, *color2, *color3, *color4);
  16.         }
  17.  
  18.         SkyPatch() {
  19.                 patch::RedirectCall(0x53F949, CSpriteDrawAnyRect);
  20.  
  21.                 patch::SetPointer(0x53F3B8, &ColorHooked);
  22.                 patch::SetPointer(0x53F3BD, &ColorHooked);
  23.                 patch::SetPointer(0x53F3CA, &ColorHooked);
  24.                 patch::SetPointer(0x53F3CF, &ColorHooked);
  25.  
  26.                 patch::SetPointer(0x53F452, &ColorHooked);
  27.                 patch::SetPointer(0x53F45D, &ColorHooked);
  28.                 patch::SetPointer(0x53F462, &ColorHooked);
  29.                 patch::SetPointer(0x53F46D, &ColorHooked);
  30.  
  31.                 patch::SetPointer(0x53F5EC, &ColorHooked);
  32.                 patch::SetPointer(0x53F5F1, &ColorHooked);
  33.                 patch::SetPointer(0x53F5F6, &ColorHooked);
  34.                 patch::SetPointer(0x53F5FB, &ColorHooked);
  35.     }
  36. } skyPatch;
  37.  
  38. CRGBA SkyPatch::ColorHooked = { 0, 0, 0, 0 };
Все бы ничего, если не появилось теперь это:

Онлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Нижний цвет неба
« Ответ #10 : Февраль 11, 2017, 10:37:20 pm »
Круто! Но я не очень понимаю, как это работает: почему так много адресов для патча?

По поводу глюков на скрине - это норма(раньше вместо голубого оно было бы серым): исправляется настройкой ID флагов. Некоторые объекты придется прописать в object.dat. Наверное, для обычной игры заморачиваться с исправлением объектов не стоит(слишком многое придется исправлять), а вот для отдельных глобалок этот патч очень даже подойдет.
« Последнее редактирование: Февраль 11, 2017, 10:39:44 pm от Shagg_E »

Оффлайн GeniusZ

  • Призрак
  • Сообщений: 29
  • Репутация: +0/-0
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #11 : Февраль 12, 2017, 06:47:56 am »
Круто! Но я не очень понимаю, как это работает: почему так много адресов для патча?

Суть в том, что я заменяю аргументы функции на перехваченный цвет неба.

Но все-таки решил, что в интерьерах лучше не активировать патч:
Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class SkyPatch {
  7. public:
  8.          static CRGBA ColorHooked;
  9.  
  10.          static void CSpriteDrawAnyRect(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA* color1, CRGBA* color2, CRGBA* color3, CRGBA* color4)
  11.         {      
  12.                 ColorHooked = *color4;
  13.  
  14.                 CSprite2d Temp;
  15.                 Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, *color1, *color2, *color3, *color4);
  16.         }
  17.  
  18.          static void CSpriteDrawAnyRectHooked(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA* color1, CRGBA* color2, CRGBA* color3, CRGBA* color4)
  19.          {
  20.                  CSprite2d Temp;
  21.  
  22.                  if (*(int*)0x978810) //nCurrentInterior
  23.                          Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, *color1, *color2, *color3, *color4);
  24.                  else
  25.                          Temp.DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, ColorHooked, ColorHooked, ColorHooked, ColorHooked);
  26.          }
  27.  
  28.         SkyPatch() {
  29.                 patch::RedirectCall(0x53F949, CSpriteDrawAnyRect);
  30.                 patch::RedirectCall(0x53F437, CSpriteDrawAnyRectHooked);
  31.                 patch::RedirectCall(0x53F590, CSpriteDrawAnyRectHooked);
  32.                 patch::RedirectCall(0x53F63B, CSpriteDrawAnyRectHooked);
  33.     }
  34. } skyPatch;
  35.  
  36. CRGBA SkyPatch::ColorHooked = { 0, 0, 0, 0 };

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #12 : Февраль 12, 2017, 11:46:41 am »
CSprite2d::DrawAnyRect - это статический метод. Для вызова не требуется обьект CSprite2d, можно вызывать так:
Код: C++
  1. CSprite2d::DrawAnyRect (x1, y1, x2, y2, x3, y3, x4, y4, color1, color2, color3, color4);

Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class SkyPatch {
  7. public:
  8.     static CRGBA ColorHooked;
  9.  
  10.     static void MySpriteDrawAnyRect(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA& color1, CRGBA& color2, CRGBA& color3, CRGBA& color4) {
  11.         ColorHooked = color4;
  12.         CSprite2d::DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, color1, color2, color3, color4);
  13.     }
  14.  
  15.     static void MySpriteDrawAnyRectHooked(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, CRGBA& color1, CRGBA& color2, CRGBA& color3, CRGBA& color4) {
  16.         if (*(int*)0x978810) //nCurrentInterior
  17.             CSprite2d::DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, color1, color2, color3, color4);
  18.         else
  19.             CSprite2d::DrawAnyRect(x1, y1, x2, y2, x3, y3, x4, y4, ColorHooked, ColorHooked, ColorHooked, ColorHooked);
  20.     }
  21.  
  22.     SkyPatch() {
  23.         patch::RedirectCall(0x53F949, MySpriteDrawAnyRect);
  24.         patch::RedirectCall(0x53F437, MySpriteDrawAnyRectHooked);
  25.         patch::RedirectCall(0x53F590, MySpriteDrawAnyRectHooked);
  26.         patch::RedirectCall(0x53F63B, MySpriteDrawAnyRectHooked);
  27.     }
  28. } skyPatch;
  29.  
  30. CRGBA SkyPatch::ColorHooked = { 0, 0, 0, 0 };
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Нижний цвет неба
« Ответ #13 : Август 01, 2019, 11:46:42 am »
Дополнение:
Есть предел прорисовки верхнего цвета неба на высоте 3000.0. Если нужно разместить локацию выше с сохранением привычного отображения цвета, то это меняется в адресе 0x69950C. Актуально для "параллельных миров". Может быть наоборот захочется увидеть другое небо без мелькающих остатков синего, тогда стоит отключить вызов функции 0x4A600B
« Последнее редактирование: Август 01, 2019, 11:49:39 am от xanser »