Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

C++ Smooth Color Modulation

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

C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
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.
 
Аналогично с плавным появлением теней можно сделать и плавную окраску мира. Знаю, можно сделать красивее код и меньше копирования кода. Я делаю этот пост чтоб просто показать суть плавности, как это свичится и как сглаживается. Дальше уже свобода вашей фантазии и мастерства

C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
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.
Это можно сделать в две строки обычно лерпом, но мы же умные, и будем делать это костылями и кучей говнокода
 
нихуя у тебя modern_clamp_world современный и стильный

no govnocodenz
basic lerp function:
Expand Collapse Copy
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);
}
 
давай в следующий раз без флотов пж
если бы ты знал как они сильно бьют по производительности...
Насколько?
1662797392453.png


Оптимизация это конечно хорошо, но давайте не доводить это занятие до абсурда.
 
Насколько?
Посмотреть вложение 220424

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