Гайд Рендер скелета циклом | Skeleton cycle render

Начинающий
Статус
Оффлайн
Регистрация
27 Дек 2022
Сообщения
23
Реакции[?]
14
Поинты[?]
14K
В очередной раз здравия 👋

Сегодня на повестке дня - скелетон
Если код вашего скелета выглядит как-то так:
Shitcodeeee:
ImGui::GetBackgroundDrawList()->AddLine(matrix.world2screen(BONE_SOMEBONE), matrix.world2screen(BONE_SOMEBONE), ImGui::GetColorU32(ImVec4(1.f,1.f,1.f,1.f)), 1);
ImGui::GetBackgroundDrawList()->AddLine(matrix.world2screen(BONE_SOMEBONE), matrix.world2screen(BONE_SOMEBONE), ImGui::GetColorU32(ImVec4(1.f,1.f,1.f,1.f)), 1);
ImGui::GetBackgroundDrawList()->AddLine(matrix.world2screen(BONE_SOMEBONE), matrix.world2screen(BONE_SOMEBONE), ImGui::GetColorU32(ImVec4(1.f,1.f,1.f,1.f)), 1);
ImGui::GetBackgroundDrawList()->AddLine(matrix.world2screen(BONE_SOMEBONE), matrix.world2screen(BONE_SOMEBONE), ImGui::GetColorU32(ImVec4(1.f,1.f,1.f,1.f)), 1);
ImGui::GetBackgroundDrawList()->AddLine(matrix.world2screen(BONE_SOMEBONE), matrix.world2screen(BONE_SOMEBONE), ImGui::GetColorU32(ImVec4(1.f,1.f,1.f,1.f)), 1);
ImGui::GetBackgroundDrawList()->AddLine(matrix.world2screen(BONE_SOMEBONE), matrix.world2screen(BONE_SOMEBONE), ImGui::GetColorU32(ImVec4(1.f,1.f,1.f,1.f)), 1);
ImGui::GetBackgroundDrawList()->AddLine(matrix.world2screen(BONE_SOMEBONE), matrix.world2screen(BONE_SOMEBONE), ImGui::GetColorU32(ImVec4(1.f,1.f,1.f,1.f)), 1);
//...
То советую проверить гормоно-секреторную функцию вашего мозга, есть подозрения что ваши мендалевидные тела работают примерно как у Байдена, но в случае с дедушкой Джо - его понять мы можем, задумайтесь...

Дак вот, к чему это я, каким бы не был ваш кодик скелетончика - удалите нахуй

Первое что нам понадобится - определить объект драв листа (DrawList)
Думаю вам не нужно объяснять что такое объект, вообще - советую для каждой сцены делать свой обьект, лично я использую два разных обьекта DrawList, 1 для меню, 2 для оверлея


И так, пишем внутри тела ImGui::Begin
C++:
ImDrawList* esp_draw = ImGui::GetBackgroundDrawList();
Тут мы получаем DrawList не фокусного фона для того что-бы меню покрывала есп


Далее нам нужны определения цвета, толщины, а так же один массив vector с парой костей, перечисление которых можете взять тут
C++:
ImVec4 col = ...; //цвет ImVec4(red, green, blue, alpha)
float thickness = ...; //толщина (обычно хватает 1px)

static std::vector<std::pair<bones, bones>> pairs = {
    { BONE_HEAD,BONE_NECK            },
    { BONE_NECK,BONE_SPINE_1        },
    { BONE_SPINE_1,BONE_SPINE_2        },
    { BONE_SPINE_2,BONE_PELVIS        },
    { BONE_PELVIS,BONE_LEG_UP_L        },
    { BONE_LEG_UP_L,BONE_LEG_LOW_L    },
    { BONE_LEG_LOW_L,BONE_ANKLE_L    },
    { BONE_PELVIS,BONE_LEG_UP_R        },
    { BONE_LEG_UP_R,BONE_LEG_LOW_R    },
    { BONE_LEG_LOW_R,BONE_ANKLE_R    },
    { BONE_NECK,BONE_ARM_UP_L        },
    { BONE_ARM_UP_L,BONE_ARM_LOW_L    },
    { BONE_ARM_LOW_L,BONE_HAND_L    },
    { BONE_NECK,BONE_ARM_UP_R        },
    { BONE_ARM_UP_R,BONE_ARM_LOW_R    },
    { BONE_ARM_LOW_R,BONE_HAND_R    },
};

Далее мы переходим к магии: используем функции PathLineTo для патча линии по между двумя координатами, и PathStroke для отрисовки линии
Делать это мы будем в цикле for, примерно так:
C++:
for (auto& it : pairs) {
    esp_draw->PathLineTo(matrix.world2screen(player.pawn.bone_pos(it.first)));
    esp_draw->PathLineTo(matrix.world2screen(player.pawn.bone_pos(it.second)));
    esp_draw->PathStroke(ImGui::GetColorU32(col), 0, thickness);
}
Вуаля!
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,052
Реакции[?]
183
Поинты[?]
72K
Может еще расскажешь как числа складывать?
std::initializer_list > std::vector для этого
 
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
698
Реакции[?]
542
Поинты[?]
155K
ух ты вместо 7 строк в рендере получили 20 строк определения и 3 строки рендера. без костылей в виде ручной набивки pairs слабо?
 
Начинающий
Статус
Оффлайн
Регистрация
27 Дек 2022
Сообщения
23
Реакции[?]
14
Поинты[?]
14K
ух ты вместо 7 строк в рендере получили 20 строк определения и 3 строки рендера. без костылей в виде ручной набивки pairs слабо?
Во 1: Лист с парами статический, и определяется 1 раз
Во 2: Вместо 20 строк мы делаем всё цикломиз трёх строк, которые, при желании можно сократить до банального drawlist->AddLine

Ну и не считаю это костылём, если есть что ответить то можешь предложить свою реализацию скелетона, буду рад
 
Сверху Снизу