C++ Smooth Color Modulation

Забаненный
Статус
Оффлайн
Регистрация
1 Фев 2022
Сообщения
32
Реакции[?]
26
Поинты[?]
6K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Аналогично с плавным появлением теней можно сделать и плавную окраску мира. Знаю, можно сделать красивее код и меньше копирования кода. Я делаю этот пост чтоб просто показать суть плавности, как это свичится и как сглаживается. Дальше уже свобода вашей фантазии и мастерства

C++:
void __fastcall hk_get_color_modulation(registers, float& r, float& g, float& b) {
    o_get_color_modulation(ecx, edx, r, g, b);

    if (!g_interfaces.m_engine->IsInGame() || !g_interfaces.m_engine->IsConnected())
        return;

    const auto get_material = reinterpret_cast<IMaterial*>(ecx);

    if (!get_material || get_material->IsErrorMaterial())
        return;

    const auto get_group = get_hash(get_material->GetTextureGroupName());

    if (get_group != utils::get_const(XORSTR("World textures")) && get_group != utils::get_const(XORSTR("StaticProp textures")) && get_group != utils::get_const(XORSTR("SkyBox textures")))
        return;


    static float world_color[3] = { 0.8f, 0.8f, 0.8f };
    static float props_color[3] = { 0.8f, 0.8f, 0.8f };
    static float sky_color[3]   = { 0.8f, 0.8f, 0.8f };

    if (config.misc_world_custom_color_enable)
    {
        if (get_group == utils::get_const(XORSTR("World textures")))
        {
            utils::modern_clamp_world(world_color[0], config.color_misc_world[0], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[1], config.color_misc_world[1], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[2], config.color_misc_world[2], g_interfaces.m_globals->m_frame_time / 24.f);

            r *= world_color[0],
            g *= world_color[1],
            b *= world_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("StaticProp textures")))
        {
            utils::modern_clamp_world(props_color[0], config.color_misc_static_props[0], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[1], config.color_misc_static_props[1], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[2], config.color_misc_static_props[2], g_interfaces.m_globals->m_frame_time / 24.f);

            r *= props_color[0],
            g *= props_color[1],
            b *= props_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("SkyBox textures")))
        {
            utils::modern_clamp_world(sky_color[0], config.color_misc_sky[0], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[1], config.color_misc_sky[1], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[2], config.color_misc_sky[2], g_interfaces.m_globals->m_frame_time / 24.f);

            r *= sky_color[0],
            g *= sky_color[1],
            b *= sky_color[2];
        }
    }
    else
    {
        if (get_group == utils::get_const(XORSTR("World textures")))
        {
            utils::modern_clamp_world(world_color[0], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[1], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[2], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);

            r *= world_color[0],
            g *= world_color[1],
            b *= world_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("StaticProp textures")))
        {
            utils::modern_clamp_world(props_color[0], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[1], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[2], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);

            r *= props_color[0],
            g *= props_color[1],
            b *= props_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("SkyBox textures")))
        {
            utils::modern_clamp_world(sky_color[0], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[1], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[2], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);

            r *= sky_color[0],
            g *= sky_color[1],
            b *= sky_color[2];
        }
    }
}
Ну и снова, как я говорил в прошлом посте, функция клемпа здесь костыльная, но фиксится это добавлением пары аргументов. Сделано, опять же, для примера.
C++:
inline void modern_clamp_world(float& target, float to, float step)
    {
        if (target > to)
        {
            target = clamp(target-step, to, 1.f);
            
        }
        else if (target < to)
        {
            target = clamp(target+step, 0.f, to);
            
        }
    }
Поясняю за 1 и 0: т.к. у конкретно меня цвет задается floatами - его границы от 0.f до 1.f. Если работать с интами то было бы от 0 до 255.
 
Пользователь
Статус
Оффлайн
Регистрация
19 Ноя 2019
Сообщения
263
Реакции[?]
50
Поинты[?]
2K
nice release

signature for anyone that needs
Код:
materialsystem.dll -> 55 8B EC 83 EC ? 56 8B F1 8A 46
 
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,970
Реакции[?]
958
Поинты[?]
19K
Аналогично с плавным появлением теней можно сделать и плавную окраску мира. Знаю, можно сделать красивее код и меньше копирования кода. Я делаю этот пост чтоб просто показать суть плавности, как это свичится и как сглаживается. Дальше уже свобода вашей фантазии и мастерства

C++:
void __fastcall hk_get_color_modulation(registers, float& r, float& g, float& b) {
    o_get_color_modulation(ecx, edx, r, g, b);

    if (!g_interfaces.m_engine->IsInGame() || !g_interfaces.m_engine->IsConnected())
        return;

    const auto get_material = reinterpret_cast<IMaterial*>(ecx);

    if (!get_material || get_material->IsErrorMaterial())
        return;

    const auto get_group = get_hash(get_material->GetTextureGroupName());

    if (get_group != utils::get_const(XORSTR("World textures")) && get_group != utils::get_const(XORSTR("StaticProp textures")) && get_group != utils::get_const(XORSTR("SkyBox textures")))
        return;


    static float world_color[3] = { 0.8f, 0.8f, 0.8f };
    static float props_color[3] = { 0.8f, 0.8f, 0.8f };
    static float sky_color[3]   = { 0.8f, 0.8f, 0.8f };

    if (config.misc_world_custom_color_enable)
    {
        if (get_group == utils::get_const(XORSTR("World textures")))
        {
            utils::modern_clamp_world(world_color[0], config.color_misc_world[0], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[1], config.color_misc_world[1], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[2], config.color_misc_world[2], g_interfaces.m_globals->m_frame_time / 24.f);

            r *= world_color[0],
            g *= world_color[1],
            b *= world_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("StaticProp textures")))
        {
            utils::modern_clamp_world(props_color[0], config.color_misc_static_props[0], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[1], config.color_misc_static_props[1], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[2], config.color_misc_static_props[2], g_interfaces.m_globals->m_frame_time / 24.f);

            r *= props_color[0],
            g *= props_color[1],
            b *= props_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("SkyBox textures")))
        {
            utils::modern_clamp_world(sky_color[0], config.color_misc_sky[0], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[1], config.color_misc_sky[1], g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[2], config.color_misc_sky[2], g_interfaces.m_globals->m_frame_time / 24.f);

            r *= sky_color[0],
            g *= sky_color[1],
            b *= sky_color[2];
        }
    }
    else
    {
        if (get_group == utils::get_const(XORSTR("World textures")))
        {
            utils::modern_clamp_world(world_color[0], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[1], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(world_color[2], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);

            r *= world_color[0],
            g *= world_color[1],
            b *= world_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("StaticProp textures")))
        {
            utils::modern_clamp_world(props_color[0], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[1], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(props_color[2], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);

            r *= props_color[0],
            g *= props_color[1],
            b *= props_color[2];
        }
        else if (get_group == utils::get_const(XORSTR("SkyBox textures")))
        {
            utils::modern_clamp_world(sky_color[0], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[1], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);
            utils::modern_clamp_world(sky_color[2], 0.8f, g_interfaces.m_globals->m_frame_time / 24.f);

            r *= sky_color[0],
            g *= sky_color[1],
            b *= sky_color[2];
        }
    }
}
Ну и снова, как я говорил в прошлом посте, функция клемпа здесь костыльная, но фиксится это добавлением пары аргументов. Сделано, опять же, для примера.
C++:
inline void modern_clamp_world(float& target, float to, float step)
    {
        if (target > to)
        {
            target = clamp(target-step, to, 1.f);
           
        }
        else if (target < to)
        {
            target = clamp(target+step, 0.f, to);
           
        }
    }
Поясняю за 1 и 0: т.к. у конкретно меня цвет задается floatами - его границы от 0.f до 1.f. Если работать с интами то было бы от 0 до 255.
Это можно сделать в две строки обычно лерпом, но мы же умные, и будем делать это костылями и кучей говнокода
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,594
Реакции[?]
603
Поинты[?]
42K
нихуя у тебя modern_clamp_world современный и стильный

no govnocodenz
basic lerp function:
template <typename ret_t>
ret_t modern_clamp_world(ret_t& from, ret_t& to, float amt) {
   return static_cast<ret_t>(from * ( 1.f - amt ) + to * amt);
}
 
꧁꧂
Участник
Статус
Оффлайн
Регистрация
23 Мар 2020
Сообщения
549
Реакции[?]
356
Поинты[?]
10K
давай в следующий раз без флотов пж
если бы ты знал как они сильно бьют по производительности...
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,375
Реакции[?]
2,280
Поинты[?]
184K
давай в следующий раз без флотов пж
если бы ты знал как они сильно бьют по производительности...
Насколько?
1662797392453.png

Оптимизация это конечно хорошо, но давайте не доводить это занятие до абсурда.
 
꧁꧂
Участник
Статус
Оффлайн
Регистрация
23 Мар 2020
Сообщения
549
Реакции[?]
356
Поинты[?]
10K
Начинающий
Статус
Оффлайн
Регистрация
12 Авг 2022
Сообщения
7
Реакции[?]
2
Поинты[?]
0
Насколько?
Посмотреть вложение 220424

Оптимизация это конечно хорошо, но давайте не доводить это занятие до абсурда.
На твоём скриншоте даже видно, что теряется от 20 до 30% производительности, но на самом деле глупость тут что-то менять т.к сам движок игры использовает для цвета диапазон от 0.f до 1.f
 
Сверху Снизу