Вопрос Отрисовка/Drawing

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Как рисовать в Доте что-то(текст, квадрат,полоска/progress bar/)?

Я пробовал создать панельку(даже пустую) через панораму,
C++:
        CUIPanel* HUD = panoramaptrs->FindPanelById("DotaHud");

        WORD resulta = 0;
        WORD thisresultb = panoramaptrs->GetPanelType(this, result, "Panel");

        if (!oCreatePanel)
        {
            oCreatePanel = (_CreatePanel)(VT_METHOD(this, 30));
        }
        WORD some = thisresultb;
         
        CPanel2D* mypanel = oCreatePanel(this, &some, ID, HUD);  ////////////// не стоит критиковать говнокод, который был специально в такой форме написан
        CUIPanel* newresult = mypanel->cuipanel;
        return newresult;




CUIPanel* newpanel = panoramaptr->CreatePanel(panoramaptr, "Manas");
 
                            CMSG("Created Panel\n");
Всё вроде норм вызывается, не крашится.Но ничего не видно. Также убрали походу bloadlayоut(раньше была 14-й функцией CUIPanel класса.
Вопрос заключается в этом: какие способы есть рисования в доте, например манабар?
Просто до этого момента я только занимался сбором информации(хп,мана и остальная дичь). А теперь хочу приступить к изучению выводу этой информации( не в консоль хд).
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
directx?
либо BLoadLayout юзай и с файла грузи xml
А есть какие-то нормальные гайды на Directx? Что с ним делать, и как его юзать? Я пробовал искать на других сайтах, только честно говоря хрень находил.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
А есть какие-то нормальные гайды на Directx? Что с ним делать, и как его юзать? Я пробовал искать на других сайтах, только честно говоря хрень находил.
ну лично я нормальных гайдов не искал и не видел, я искал конкретно "как нарисовать линию" и тд.
можешь для начала почекать готовые рендер классы всякие на юс,
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
ну и сурсы имгуи в помощь(
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
а ну да, сразу сам имгуи можешь юзать там полно хуиты всякой полезной.
хукай презент(байтпатч/вмт хук/шедоу вмт хук).
рендерстейты в дефолтные ставишь предварительно сохранив старые(ну там шейдеры в нуллптр и тд это все в сурсах имгуи есть)
потом по мере рисования ставишь рендерстейты в то что надо(ну например шейдеры свои там подрубаешь и тд)
в некоторых играх(везде все пиздец как по-разному) надо еще OMSetRenderTargets вызывать(ну на юс поищешь), в некоторых наоборот не надо.
возвращаешь рендерстейты как было оригинальные.
ну а потом уже вызываешь оригинал презента.
в дх9 там ваще все по-другому(ну суть та же, типо рендерстейты сейвишь ставишь и тд, но нюансы разные совсем)
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Да, но дота не на дх9. Уже убрали поддержку. Я вот крч хукнул презент но нихрен ане знаю как дальше. Не хочу юзать ИМГУИ
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Да, но дота не на дх9. Уже убрали поддержку. Я вот крч хукнул презент но нихрен ане знаю как дальше. Не хочу юзать ИМГУИ
я на дх11 если че расписывал, еще раз посмотри, у меня все про директикс 11 и только одна строка про то что в директиксе 9 все по-другому и отличается от директикс11, больше про 9 версию я ничего не говорил(разве что слово "рендерстейты" употребил. рендерстейт - это штука из 9 версии, в 11 версии ее убрали но я имел ввиду не саму эту "технологию", а просто саму задумку что у девайса есть "текущее" состояние(то есть активные шейдеры буферы хуюферы настройки и тд)))) имгуи я тоже не люблю(просто не нравится). но это не значит что нельзя оттуда из сурсов посмотреть че там как делается.
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Сможешь сделать гайд по самому рисованию квадратика на центре экрана в игре на ДХ 11 (для нубов как я), пж?
Я смог хукнуть но бля я не понимаю, я следовал 5 видосам по общему директсиу но я хукнул и нихуя не вышло.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Сможешь сделать гайд по самому рисованию квадратика на центре экрана в игре на ДХ 11 (для нубов как я), пж?
Я смог хукнуть но бля я не понимаю, я следовал 5 видосам по общему директсиу но я хукнул и нихуя не вышло.
не планирую в ближайшее время гайды делать. я тебе скинул ссылок, посмотри, там уже готовый код(ну чуть чуть подредачить слегка так придется) есть для отрисовки линии, сам оттуда брал. сначала с этим разберись, потом поймешь это и что-ниудь посложнее уже погуглишь. квадрат который внутри пустой - это 4 линии, можешь просто 4 линии тупо нарисовать.
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Окей, пришлось свою жопу напотеть. Но я всетаdasdasf.jpgки смог хоть что-то нарисовать. Это D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP
но как из этого сделать полностью черный прямоугольник? Ну...заполненный черным цветом.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Окей, пришлось свою жопу напотеть. Но я всетаПосмотреть вложение 194133ки смог хоть что-то нарисовать. Это D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP
но как из этого сделать полностью черный прямоугольник? Ну...заполненный черным цветом.
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST для прямоугольника(прямоугольник = 2 треугольника)Case-n2.jpg
там на тех ссылках которые я скидывал это есть, ctrl+f -> drawFilledRect
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Кароче я хз, либо я чето неправильно делаю. Либо компилятор.

(Получаю через сигу на 48-ю функцию в RenderGameSystem) Я пробовал вызывать функу но она возвращает мне первое значение в матрице.(Хотя передавал туда указатель)

C++:
class Matrix
{
public:
    float Matrix[4][4];

   /// Пробовал float Matrix[16] тоже самое
};

 Matrix* pattern = (Matrix*)GetAbsoluteAddress(ptrs + 0x3, 3, 7); ///// Это указатель на Матрицу

312132.jpg
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Кароче я хз, либо я чето неправильно делаю. Либо компилятор.

(Получаю через сигу на 48-ю функцию в RenderGameSystem) Я пробовал вызывать функу но она возвращает мне первое значение в матрице.(Хотя передавал туда указатель)

C++:
class Matrix
{
public:
    float Matrix[4][4];

   /// Пробовал float Matrix[16] тоже самое
};

Matrix* pattern = (Matrix*)GetAbsoluteAddress(ptrs + 0x3, 3, 7); ///// Это указатель на Матрицу

Посмотреть вложение 194231
так а в чем проблема то? я не понял ничего из того что ты скинул
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Я не очень понял

Вот я так делал прямоугольник(незаполненый)
C++:
/*  Vertex myvertex[] =
    {
        {0.0,0.0,{1,0,0,1}},   //////
        {0.0,0.05,{1,0,0,1}  }, /////////   HEIGHT
        {0.15,0.05,{1,0,0,1}  },/////   WIDTH
        {0.15,0.0,{1,0,0,1} }, /////
        {0.0,0.0,{1,0,0,1}} 
    };*/
И координаты вертиксов типа ну точечные типа, незнаю как правильно сказать ( типо центр это (0.0, 0.0) )
Функцией WorldToScreen(VECTOR,in,out,0) я перевожу координаты юнита в 2д. И оно мне как бы возвращает инт, ну пиксели типа.
И типа что мне с ними делать???????? Как мне их в вертиксы правильно вставить?
 
midnight.im
Администратор
Статус
Оффлайн
Регистрация
1 Июл 2015
Сообщения
1,650
Реакции[?]
2,173
Поинты[?]
162K
Я бы посоветовал лучше бекэнд имгуи подключить. Там уже есть весь готовый рендер для примитивов. Не обязательно весь имгуи тянуть если он вам не нравится. А вот бекэнд там достаточно хороший.

Но забрасывать панораму я бы тоже не советовал. Неплохой вариант для изучения работы панорамы.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Я не очень понял

Вот я так делал прямоугольник(незаполненый)
C++:
/*  Vertex myvertex[] =
    {
        {0.0,0.0,{1,0,0,1}},   //////
        {0.0,0.05,{1,0,0,1}  }, /////////   HEIGHT
        {0.15,0.05,{1,0,0,1}  },/////   WIDTH
        {0.15,0.0,{1,0,0,1} }, /////
        {0.0,0.0,{1,0,0,1}}
    };*/
И координаты вертиксов типа ну точечные типа, незнаю как правильно сказать ( типо центр это (0.0, 0.0) )
Функцией WorldToScreen(VECTOR,in,out,0) я перевожу координаты юнита в 2д. И оно мне как бы возвращает инт, ну пиксели типа.
И типа что мне с ними делать???????? Как мне их в вертиксы правильно вставить?
вертекс шейдеры в NDC рисуют. тебе нужны не коорды экрана а NDC.
NDC это плоскость твоего экрана в границах [-1; 1](в зависимости от игры, апи и тд везде конкретные границы разные, может быть [0;1] и тд).
центр экрана в NDC это 0; 0(x;y). ну точнее середина кароче границ NDC.(x=NDC_HALF; y=NDC_HALF. в нашем случае у нас рейндж -1;1 то есть у нас разница мин макс это 2, 2 делим пополам получаем 1 прибавляем к минимуму(-1) получаем 0)
середина экрана(по y) с правой стороны это 1;0(x=NDC_MAX; y=NDC_HALF)
середина экрана(по y) с левой стороны это -1;0(x=NDC_MIN; y=NDC_HALF)
середина экрана(по x) снизу это 0;-1(x=NDC_HALF; y=NDC_MIN)
середина экрана(по x) сверху это 0;1(x=NDC_HALF; y=NDC_MAX)
в конкретных играх апи и тд сверху/снизу могут быть по-разному определны(либо низ это мин ндс а верх это макс ндс, либо низ это макс ндс а верх это мин ндс) тести кароче.
в общем берешь точку, переводишь в локальную систему камеры(point * camera_matrix) потом это проецируешь(w=1 предварительно ставишь)(result * view_matrix) (альтернативно сразу vertex(point, 1.0) * viewprojection_matrix)
потом клипаешь(обрезаешь чтобы за границы экрана не выходило)(альтернативно можешь просто проверить выходит за границы экрана или нет и не рисовать если выходит за границы)
потом через perspective divide(x /= w, y /=w) переводишь в NDC.
потом из NDC по желанию можно перевести в коорды экрана думаю сам разберешься как.
WorldToScreen делает все то же самое токо он NDC в коорды экрана в самом финале переводит. просто вырежи кароче эти куски кода которые тебе ндс переводят в коорды экрана и кайфуй.
1645984181700.png
vertex-transform-pipeline.png
ну типа если ты возьмешь какой-нибудь в2с с юс ты увидишь что-то вроде(это на игру Rust -
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
C++:
    bool WorldToScreen(vec3_t pos, vec2_t& screen, Matrix4x4 matrix, int windowWidth, int windowHeight)
    {
        vec4 clipCoords;
        clipCoords.x = pos.x * matrix._11 + pos.y * matrix._12 + pos.z * matrix._13 + matrix._14;
        clipCoords.y = pos.x * matrix._21 + pos.y * matrix._22 + pos.z * matrix._23 + matrix._24;
        clipCoords.z = pos.x * matrix._31 + pos.y * matrix._32 + pos.z * matrix._33 + matrix._34;
        clipCoords.w = pos.x * matrix._41 + pos.y * matrix._42 + pos.z * matrix._43 + matrix._44;
   
        if (clipCoords.w < 0.1f)
            return false;
   
        vec3_t NDC;
        NDC.x = clipCoords.x / clipCoords.w;
        NDC.y = clipCoords.y / clipCoords.w;
        NDC.z = clipCoords.z / clipCoords.w;
   
        screen.x = (windowWidth / 2 * NDC.x) + (NDC.x + windowWidth / 2);
        screen.y = -(windowHeight / 2 * NDC.y) + (NDC.y + windowHeight / 2);
        return true;
    }
вот видишь там уже есть NDC. просто вырежи screen оттуда(ну всмысле из твоего в2с который у тебя в доте) и возвращай NDC(это вектор2, там нету z. точнее она выбрасывается. так что vec2 возвращай) (std::tuple<bool, Vector2> точнее. bool будет результатом - тру фалс - в зависимости от того выходит ли за экран, а Vector2 будет результатом в NDC)
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
856da989cf84c122dd3de7a92b2ee31b.jpg

Спасибо,теперь я понял.


Кстате а что делается с оффсетом Healthbar
(Пореверсил кароче и не могу понять что с ним делать, он типа не флоат а инт)1645992544417.png

Как тебе такой вертикс?
C++:
  healthbaroffset = ent->gethealthbaroffset(); //// здесь может быть бред так как я еще не разобрался что делать с оффсетом
dif = 1/width

        HPbar.x = Entityposition.x + ((healthbaroffset + 2)* dif);
        HPbar.y = Entityposition.y + ((healthbaroffset + 2)* dif) ;


        {HPbar.x,HPbar.y,color},
        {HPbar.x + (HPbar.x*0.2),HPbar.y,color},
        {HPbar.x,HPbar.y - (HPbar.y*0.2),color},
        {HPbar.x + (HPbar.x*0.2),HPbar.y - (HPbar.y*0.2),color}
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Мои шейдеры:

C++:
///// vertex shader
float4 main (float2 Input : POSITION) : SV_POSITION
{
    return float4(Input,0, 1);
}


Кароч незнаю в чем проблема, рисуется что-то но оно не передвигается над героем..
1646001301359.png
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Окей, всё збс. Я пофиксил, оказывается у меня в WorldToScreen оно каогото хера конвертировалось в Int. немного переписал и теперь збс( Важное что знать, что коорды NDC это флоаты!)
Только не могу сейчас разобратся с тем, что ты мне скинул. Как работает этот PRIMITIVE_TOPOLOGY_TRIANGLELIST?

У меня почемуто при передвижении героя то что я нарисовал оно переворачивается хддд,
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Окей, я немного исправил и теперь так(Оказывается не надо было умножать, а то будут плохие проблемы)

Вот мои вертиксы
C++:
  ////// vertexshader
  
  
float4 main(float2 input : POSITION) : SV_POSITION
{


    return float4(input, 0, 1);
}

////////// matrix ( worldmatrix получаю через хреф на вордлтускрин, там будет срендерсистем потом делаю хреф на функу индекс 6(Пореверсишь, поймешь :-) ) и просто забираю из 2-й инструкции указатель на матрицу

position.w = ((abs.x * WorldMatrix.m[12]) + (abs.y * WorldMatrix.m[13])) + ((abs.z * WorldMatrix.m[14]) + WorldMatrix.m[15]);
position.y = ((abs.x * WorldMatrix.m[4]) + (abs.y * WorldMatrix.m[5])) + ((abs.z * WorldMatrix.m[6]) + WorldMatrix.m[7]);
position.x  = (((abs.y * WorldMatrix.m[1]) + (abs.x * WorldMatrix.m[0])) + ((abs.z * WorldMatrix.m[2]) + WorldMatrix.m[3])) * dif;
if (position.w >= 0.001)
            {
                dif = 1.0 / position.w;
            }
            else
            {
                dif = 100000.0;
            }

////////////// main loop
    Vector2 HPBar;

    HPbar.x = position.x - 0.06;  ///////////////
    HPbar.y = position.y + healthbaroffset + 0.050;           //// healthbaroffset = HealthbarOffset * W( тоесть 1/W)


    Vertex myvertex[] =
    {
       {HPbar.x,HPbar.y,color},
       {HPbar.x + 0.10,HPbar.y,color},
       {HPbar.x,HPbar.y - 0.06,color},

       {HPbar.x + 0.10,HPbar.y - 0.06},
       {HPbar.x + 0.10,HPbar.y,color},
       {HPbar.x,HPbar.y - 0.06,color}
Вот результат, только незнаю как его исправить чтобы оно над полоской хп бара показывалось. Я уже всё перепробовал, но мои математические знания не могут побороть это.


Dota1.jpg Dota3.jpgDota2.jpg
 
Сверху Снизу