DirectX9 2d drawing class

  • Автор темы Автор темы Bulb4
  • Дата начала Дата начала
Участник
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
418
Реакции
194
Мой класс для рендера на 9 директ иксе, подойдет для использования в читах или для кастомных меню.
Я над ним работаю, функционал будет пополняться.

Пожалуйста, авторизуйтесь для просмотра ссылки.


Подключаем:
Код:
Expand Collapse Copy
git submodule add https://github.com/Bulb4/renderer.git
Код:
Expand Collapse Copy
#include "..//renderer/include/renderer.h"


Инициализируем:
Код:
Expand Collapse Copy
cRender* pRender = new cRender(g_pd3dDevice);//g_pd3dDevice - наш девайс, находите его сами
ID3DXFont* font1 = nullptr;
pRender->AddFont(&font1, "Consolas", 48, false);
pRender->SetFramerateUpdateRate(400U);//400 это частота обновления показателя фпс в милисекундах


Это в то место где вы рисуете (Present, EndScene...):
Код:
Expand Collapse Copy
pRender->BeginDraw();
//тут рисуем
pRender->EndDraw();


Это в ресет:
Код:
Expand Collapse Copy
pRender->OnLostDevice();
if (g_pd3dDevice->Reset(&g_d3dpp) >= 0)
    pRender->OnResetDevice();


Для получения фпс юзайте pRender->GetFramerate()
Если нужно изменить рендер стейт на время рисования(как например в ксго нам нужно поставить D3DRS_COLORWRITEENABLE в 0xFFFFFFFF на время отрисовки, но потом вернуть старое значение) используйте pRender->PushRenderState(...) сразу после pRender->BeginDraw()


Спасибо @Крайслер, за расчет загрузки процессора. https://yougame.biz/threads/45150/

PS. На гите в папке example сурс примера

СКРИНШОТ ПРИМЕРА:
screenshot.png
 
Последнее редактирование:
Код:
Expand Collapse Copy
void cRender::render_String(float x, float y, Color color, DWORD dwFlag, const TCHAR* fmt, ...)
{
    TCHAR buffer[512];
    va_list args;
    va_start(args, fmt);

#ifdef _UNICODE
    vswprintf_s(buffer, fmt, args);
#else
    vsprintf_s(buffer, fmt, args);
#endif
    
    va_end(args);

    DWORD dwMainFlags = NULL;
    RECT r,
        rs[4];

    dwMainFlags = dwFlag | DT_CALCRECT | DT_NOCLIP;

    if (dwFlag & DT_SHADOW)
    {
        SetRect(&rs[0], (int)x - 1, (int)y, (int)x, 0);
        SetRect(&rs[1], (int)x + 1, (int)y, (int)x, 0);
        SetRect(&rs[2], (int)x, (int)y - 1, (int)x, 0);
        SetRect(&rs[3], (int)x, (int)y + 1, (int)x, 0);
        for (INT i = NULL; i < 4; i++)
        {
            this->m_pFont->DrawText(nullptr, buffer, -1, &rs[i], dwMainFlags, 0xFF000000);
            if (dwMainFlags & DT_CALCRECT)
                this->m_pFont->DrawText(nullptr, buffer, -1, &rs[i], NULL, 0xFF000000);
        }
    }
    SetRect(&r, (int)x, (int)y, (int)x, 0);
    this->m_pFont->DrawText(nullptr, buffer, -1, &r, dwMainFlags, color);
    if (dwMainFlags & DT_CALCRECT)
        this->m_pFont->DrawText(nullptr, buffer, -1, &r, NULL, color);
}
 
Исправил угловатость окружности(у обоих по 32 вершины):

↓↓↓↓↓↓↓↓↓↓↓↓БЫЛО↓↓↓↓↓↓↓↓↓↓↓
circle_demo.png

↑↑↑↑↑↑↑↑↑↑↑СТАЛО↑↑↑↑↑↑↑↑↑↑↑↑
 
- Переделал отрисовку откружности. Код стал чище и быстрее, круг стал равномерно гладким
- Исправил баг в DrawString, когда при centered == true строка не рисовалась
- Сделал незначительные изменения для сокращения кода и оптимизации

↓↓↓↓↓↓↓↓↓↓↓СТАЛО↓↓↓↓↓↓↓↓↓↓↓
unknown.png

↑↑↑↑↑↑↑↑↑↑↑↑БЫЛО↑↑↑↑↑↑↑↑↑↑↑↑
 
Последнее редактирование:
- Добавил кольцо
- Сделал незначительные изменения для сокращения кода и оптимизации
==========================
unknown.png

↑↑↑↑↑↑↑↑↑↑КОЛЬЦО↑↑↑↑↑↑↑↑↑↑↑
 
Последнее редактирование:
блять я тупой можно видео
 
- добавил отрисовку сектора окружности и кольца (задается градусами)
========================================================
↓↓сектор окружности
unknown.png

_______________сектор кольца↑↑
 
Последнее редактирование:
коммит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


-Добавил класс для работы с цветом(всякие преобразования типа float[4] to D3DCOLOR, hsv to rgb), он еще сыроват и я его полностью не тестил
-Немного почистил код, сделал енам вместо дефайнов(render draw type)
-теперь обводка текста имеет ту же прозрачность что и цвет текста, но при прозрачности менее максимальной начинает проступать черный, тк обводка сделана путем рендера текста 4 раза с разными смещениями (вправо, вверх, влево, вниз), буду думать что можно сделать

Пишите что стоит добавить. Использует ли кто-то мой класс вобще ?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Удивительно, но мой рендер кому то пригодился.
unknown.png

Хотите сделаю поддержку x64 ?
давай :) (хочу научиться делать читы(знаю C++) но не знаю что ещё надо учить :)
 
лмао, оказывается он и так норм работает на x64.
Возможно сделаю полную документацию.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Годный класс для тех кто с нуля пишет
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дополнение в виде спрайта
58.750x0.jpg

Создаём локальный объект
Код:
Expand Collapse Copy
    LPD3DXSPRITE pSprite;
в BeginDraw
C++:
Expand Collapse Copy
    pSprite->Begin(D3DXSPRITE_ALPHABLEND);

В EndDraw
C++:
Expand Collapse Copy
pSprite->End();

В конструктор
Код:
Expand Collapse Copy
D3DXCreateSprite(device, &pSprite);
В OnLostDevice и OnLostDevice Соответствующие строки
Код:
Expand Collapse Copy
pSprite->OnLostDevice();
----------------------------------------

pSprite->OnResetDevice();


Создаем процедуру
Код:
Expand Collapse Copy
void cRender::Draw(int x, int y, LPDIRECT3DTEXTURE9 pTexture)
{
    D3DXVECTOR3 posision;
    posision.x = x;
    posision.y = y;
    pSprite->Draw(pTexture, NULL, NULL, &posision, 0xFFFFFFFF);
}


Далее применяем

Инициализируем возможными способами
Код:
Expand Collapse Copy
D3DXCreateTextureFromFile
D3DXCreateTextureFromFileInMemoryEx
D3DXCreateTextureFromResource

вызываем
Код:
Expand Collapse Copy
g_pRender->Draw(1, 1, pTexture);

Резуультат
qwRViEi8lVo.jpg
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Парочка перегрузок для draw
Честно сказать инициализировать текстуры с каждой итерацией по моему не правильно, если есть свои варианты отпишитесь
Код:
Expand Collapse Copy
void cRender::Draw(const int x, const int y, LPDIRECT3DTEXTURE9 pTexture)
{
    D3DXVECTOR3 posision;
    posision.x = x;
    posision.y = y;
    pSprite->Draw(pTexture, NULL, NULL, &posision, 0xFFFFFFFF);
}

void cRender::Draw(const int x, const int y, const int width, const int height, const LPCSTR path)
{
    LPDIRECT3DTEXTURE9 pTexture;
    D3DXCreateTextureFromFileEx(this->m_pDevice
        , path,
        width, height, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pTexture);

    D3DXVECTOR3 posision;
    posision.x = x;
    posision.y = y;
    pSprite->Draw(pTexture, NULL, NULL, &posision, 0xFFFFFFFF);
}

void cRender::Draw(const int x, const int y, const int width, const int height, LPCVOID Array)
{
    LPDIRECT3DTEXTURE9 pTexture;
    D3DXCreateTextureFromFileInMemoryEx(this->m_pDevice
        , &Array, sizeof(Array),
        width, height, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pTexture);

    D3DXVECTOR3 posision;
    posision.x = x;
    posision.y = y;
    pSprite->Draw(pTexture, NULL, NULL, &posision, 0xFFFFFFFF);
}
 
Код:
Expand Collapse Copy
static IDirect3DTexture9* pTexture = nullptr;
if(pTexture==nullptr)
    D3DXCreateTextureFromFileEx(this->m_pDevice
        , path,
        width, height, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pTexture);

@FGW,дам совет: раз у тебя уже есть класс, то логичнее хранить объект текстуры в классе. +неочень удобная реализация, так как ты можешь создать только один объект(в плане нормальной реализации). Используй std::map что бы хранить объекты, назначив им имена. по этим именам и производи рисовку на экран.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
Expand Collapse Copy
static IDirect3DTexture9* pTexture = nullptr;
if(pTexture==nullptr)
    D3DXCreateTextureFromFileEx(this->m_pDevice
        , path,
        width, height, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pTexture);

@FGW,дам совет: раз у тебя уже есть класс, то логичнее хранить объект текстуры в классе. +неочень удобная реализация, так как ты можешь создать только один объект(в плане нормальной реализации). Используй std::map что бы хранить объекты, назначив им имена. по этим именам и производи рисовку на экран.
Воспользуюсь std::map, спасибо за совет
 
Воспользуюсь std::map, спасибо за совет

Хешируй путь к текстуре, и используй это как ключ в unordered_map (hash:texture)
Это лучший способ. Не забудь кстати про OnLost и OnReset.
Но, не думаю что кто-то на самом деле будет рисовать текстуры так (прямо указывая путь, имеется ввиду).

@OP:
Если все еще хочешь развивать класс:
Стоит сделать то что я описал выше, и заимплиментить текстуры.
Так-же лучше изменить немного класс color, и вместо паршивого D3DColor использовать 4 переменных с типом byte (a,r,g,b)
Так-же стоит подумать над тем что бы заменить std::map на std::unordered_map
Алсо, вместо сохранения всех стейтов в массив лучше использовать state block
 
Последнее редактирование:
Хешируй путь к текстуре, и используй это как ключ в unordered_map (hash:texture)
Это лучший способ. Не забудь кстати про OnLost и OnReset.
Но, не думаю что кто-то на самом деле будет рисовать текстуры так (прямо указывая путь, имеется ввиду).

@OP:
Если все еще хочешь развивать класс:
Стоит сделать то что я описал выше, и заимплиментить текстуры.
Так-же лучше изменить немного класс color, и вместо паршивого D3DColor использовать 4 переменных с типом byte (a,r,g,b)
Так-же стоит подумать над тем что бы заменить std::map на std::unordered_map
Алсо, вместо сохранения всех стейтов в массив лучше использовать state block
Да я думаю насчет того чтобы его глобально переделать, куча вещей есть которые можно сделать лучше, быстрее, удобнее.
 
Назад
Сверху Снизу