DirectX9 2d drawing class

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

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


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

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

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

Это в ресет:
Код:
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 сурс примера

СКРИНШОТ ПРИМЕРА:
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
Код:
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);
}
 
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
396
Реакции[?]
194
Поинты[?]
0
Исправил угловатость окружности(у обоих по 32 вершины):

↓↓↓↓↓↓↓↓↓↓↓↓БЫЛО↓↓↓↓↓↓↓↓↓↓↓

↑↑↑↑↑↑↑↑↑↑↑СТАЛО↑↑↑↑↑↑↑↑↑↑↑↑
 
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
396
Реакции[?]
194
Поинты[?]
0
- Переделал отрисовку откружности. Код стал чище и быстрее, круг стал равномерно гладким
- Исправил баг в DrawString, когда при centered == true строка не рисовалась
- Сделал незначительные изменения для сокращения кода и оптимизации

↓↓↓↓↓↓↓↓↓↓↓СТАЛО↓↓↓↓↓↓↓↓↓↓↓

↑↑↑↑↑↑↑↑↑↑↑↑БЫЛО↑↑↑↑↑↑↑↑↑↑↑↑
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
396
Реакции[?]
194
Поинты[?]
0
- Добавил кольцо
- Сделал незначительные изменения для сокращения кода и оптимизации
==========================

↑↑↑↑↑↑↑↑↑↑КОЛЬЦО↑↑↑↑↑↑↑↑↑↑↑
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
396
Реакции[?]
194
Поинты[?]
0
- добавил отрисовку сектора окружности и кольца (задается градусами)
========================================================
↓↓сектор окружности

_______________сектор кольца↑↑
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
396
Реакции[?]
194
Поинты[?]
0
коммит:
Пожалуйста, авторизуйтесь для просмотра ссылки.


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

Пишите что стоит добавить. Использует ли кто-то мой класс вобще ?
 
Забаненный
Статус
Оффлайн
Регистрация
7 Мар 2017
Сообщения
753
Реакции[?]
364
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
base for real
Пользователь
Статус
Оффлайн
Регистрация
1 Авг 2018
Сообщения
267
Реакции[?]
37
Поинты[?]
0
Удивительно, но мой рендер кому то пригодился.

Хотите сделаю поддержку x64 ?
давай :) (хочу научиться делать читы(знаю C++) но не знаю что ещё надо учить :)
 
Участник
Статус
Оффлайн
Регистрация
15 Апр 2017
Сообщения
396
Реакции[?]
194
Поинты[?]
0
лмао, оказывается он и так норм работает на x64.
Возможно сделаю полную документацию.
 
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2018
Сообщения
105
Реакции[?]
39
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Годный класс для тех кто с нуля пишет
 
Забаненный
Статус
Оффлайн
Регистрация
13 Янв 2018
Сообщения
129
Реакции[?]
62
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дополнение в виде спрайта

Создаём локальный объект
Код:
    LPD3DXSPRITE pSprite;
в BeginDraw
C++:
    pSprite->Begin(D3DXSPRITE_ALPHABLEND);
В EndDraw
C++:
pSprite->End();
В конструктор
Код:
D3DXCreateSprite(device, &pSprite);
В OnLostDevice и OnLostDevice Соответствующие строки
Код:
pSprite->OnLostDevice();
----------------------------------------

pSprite->OnResetDevice();

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

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

Инициализируем возможными способами
Код:
D3DXCreateTextureFromFile
D3DXCreateTextureFromFileInMemoryEx
D3DXCreateTextureFromResource
вызываем
Код:
g_pRender->Draw(1, 1, pTexture);
Резуультат
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
13 Янв 2018
Сообщения
129
Реакции[?]
62
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Парочка перегрузок для draw
Честно сказать инициализировать текстуры с каждой итерацией по моему не правильно, если есть свои варианты отпишитесь
Код:
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);
}
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
Код:
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 что бы хранить объекты, назначив им имена. по этим именам и производи рисовку на экран.
 
Забаненный
Статус
Оффлайн
Регистрация
13 Янв 2018
Сообщения
129
Реакции[?]
62
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
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, спасибо за совет
 
Пользователь
Статус
Оффлайн
Регистрация
5 Июн 2017
Сообщения
226
Реакции[?]
239
Поинты[?]
0
Воспользуюсь std::map, спасибо за совет
Хешируй путь к текстуре, и используй это как ключ в unordered_map (hash:texture)
Это лучший способ. Не забудь кстати про OnLost и OnReset.
Но, не думаю что кто-то на самом деле будет рисовать текстуры так (прямо указывая путь, имеется ввиду).

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

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