IDirect3DDevice9

Vintik

Мечтатель
Автор темы
Проверенный
1,469
917
Пример для тестирования:
C++:
void DrawRect(LPDIRECT3DDEVICE9 m_pDevice, int X, int Y, int L, int H, D3DCOLOR color)
{
D3DRECT rect = { X, Y, X + L, Y + H };
m_pDevice->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0);
}
HRESULT WINAPI myEndScene(IDirect3DDevice9* m_pDevice)
{
DrawRect(m_pDevice, 250, 250, 10, 10, 0xFFFF0000);
return oEndScene(m_pDevice);
}
Получаем:
qAEN8Gn.png

Спасибо, работает.
1708821618349.png

Но пару вопросов, @CleanLegend.
1) Нет полупрозрачности. Использую
C++:
m_pDevice->Clear
и цвет в формате ARGB. Такое впечатление, что там формат просто RGB, потому что альфа канал вообще ни на что не влияет.
2) Не могу понять как рисовать что-то кроме квадратиков.
Хотя бы примитивный кружочек, линию нужной толщины. Но ладно, это я еще кое-как смогу с помощью квадратиков нарисовать...
А как насчёт текста?

И да, я знаю про возможность добавить имгуи, но пока что такой необходимости нет, поэтому просто помоги как писать текст.
И еще, не по теме, но всё же - как включить мышку?
 

Smeruxa

Известный
1,297
681
2) chatgpt

C++:
#include <cmath>

void DrawCircle(LPDIRECT3DDEVICE9 m_pDevice, int X, int Y, int radius, D3DCOLOR color)
{
    const int numSegments = 32; // You can adjust this for smoother or more segmented circles

    const float angleIncrement = 2.0f * D3DX_PI / numSegments;

    std::vector<D3DRECT> rects;
    for (int i = 0; i < numSegments; ++i)
    {
        float angle = angleIncrement * i;
        float x1 = X + static_cast<int>(radius * std::cos(angle));
        float y1 = Y + static_cast<int>(radius * std::sin(angle));
        float x2 = X + static_cast<int>(radius * std::cos(angle + angleIncrement));
        float y2 = Y + static_cast<int>(radius * std::sin(angle + angleIncrement));

        D3DRECT rect = { static_cast<LONG>(x1), static_cast<LONG>(y1), static_cast<LONG>(x2), static_cast<LONG>(y2) };
        rects.push_back(rect);
    }

    m_pDevice->Clear(rects.size(), rects.data(), D3DCLEAR_TARGET, color, 0, 0);
}

HRESULT WINAPI myEndScene(IDirect3DDevice9* m_pDevice)
{
    // Draw a circle centered at (250, 250) with a radius of 10 and red color
    DrawCircle(m_pDevice, 250, 250, 10, 0xFFFF0000);
    
    return oEndScene(m_pDevice);
}
 

Smeruxa

Известный
1,297
681
hola vpn + chat gpt (40 рублей аккаунт стоит личный и меньше) =

C++:
#include <dwrite.h>

IDWriteFactory* dwriteFactory;
IDWriteTextFormat* textFormat;

// Инициализация DirectWrite
HRESULT InitDirectWrite()
{
    if (FAILED(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory),
        reinterpret_cast<IUnknown**>(&dwriteFactory))))
    {
        return E_FAIL;
    }

    if (FAILED(dwriteFactory->CreateTextFormat(L"Arial", nullptr, DWRITE_FONT_WEIGHT_NORMAL,
        DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 12.0f, L"en-US", &textFormat)))
    {
        return E_FAIL;
    }

    return S_OK;
}

// Функция отрисовки текста
void DrawText(IDirect3DDevice9* m_pDevice, const wchar_t* text, int x, int y, D3DCOLOR color)
{
    textFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING);
    textFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR);

    RECT rect = { x, y, 0, 0 };
    textFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING);

    m_pDevice->BeginScene();

    // Установка параметров рендеринга текста (если необходимо)
    // ...

    // Отрисовка текста
    dwriteFactory->CreateTextLayout(text, wcslen(text), textFormat,
        200.0f, 50.0f, nullptr, nullptr, nullptr);

    m_pDevice->EndScene();
}

C++:
//Затем в функции myEndScene вы можете вызвать DrawText так:

HRESULT WINAPI myEndScene(IDirect3DDevice9* m_pDevice)
{
    DrawText(m_pDevice, L"Hello, DirectX!", 100, 100, D3DCOLOR_ARGB(255, 255, 255, 255));
    return oEndScene(m_pDevice);
}

//Этот код предполагает, что InitDirectWrite уже был вызван ранее для инициализации DirectWrite.
 
  • Нравится
Реакции: Vintik