247 lines
9.0 KiB
C++
247 lines
9.0 KiB
C++
#pragma once
|
|
|
|
// used: [d3d]
|
|
#include <d3d11.h>
|
|
|
|
#include "../common.h"
|
|
|
|
#include "../sdk/datatypes/color.h"
|
|
#include "../sdk/datatypes/vector.h"
|
|
#include <mutex>
|
|
// used: [ext] imgui
|
|
#include "../../dependencies/imgui/imgui.h"
|
|
#include "../../dependencies/imgui/imgui_internal.h"
|
|
|
|
// forward declarations
|
|
struct KeyBind_t;
|
|
|
|
#pragma region draw_objects_enumerations
|
|
|
|
enum ERectRenderFlags : unsigned int
|
|
{
|
|
DRAW_RECT_NONE = 0,
|
|
DRAW_RECT_OUTLINE = (1 << 0),
|
|
DRAW_RECT_BORDER = (1 << 1),
|
|
DRAW_RECT_FILLED = (1 << 2)
|
|
};
|
|
|
|
enum ECircleRenderFlags : unsigned int
|
|
{
|
|
DRAW_CIRCLE_NONE = 0,
|
|
DRAW_CIRCLE_OUTLINE = (1 << 0),
|
|
DRAW_CIRCLE_FILLED = (1 << 1)
|
|
};
|
|
|
|
enum ETriangleRenderFlags : unsigned int
|
|
{
|
|
DRAW_TRIANGLE_NONE = 0,
|
|
DRAW_TRIANGLE_OUTLINE = (1 << 0),
|
|
DRAW_TRIANGLE_FILLED = (1 << 1)
|
|
};
|
|
|
|
enum EQuadRenderFlags : unsigned int
|
|
{
|
|
DRAW_QUAD_NONE = 0,
|
|
DRAW_QUAD_OUTLINE = (1 << 0),
|
|
DRAW_QUAD_FILLED = (1 << 1)
|
|
};
|
|
|
|
enum EPolygonRenderFlags : unsigned int
|
|
{
|
|
DRAW_POLYGON_NONE = 0,
|
|
DRAW_POLYGON_OUTLINE = (1 << 0),
|
|
DRAW_POLYGON_FILLED = (1 << 1)
|
|
};
|
|
|
|
enum ETextRenderFlags : unsigned int
|
|
{
|
|
DRAW_TEXT_NONE = 0,
|
|
DRAW_TEXT_DROPSHADOW = (1 << 0),
|
|
DRAW_TEXT_OUTLINE = (1 << 1)
|
|
};
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region draw_structures
|
|
struct BBox_t {
|
|
BBox_t() { Invalidate(); }
|
|
|
|
void Invalidate() {
|
|
static constexpr auto MAX_FLOAT = std::numeric_limits<float>::max();
|
|
|
|
m_Mins.x = m_Mins.y = MAX_FLOAT;
|
|
m_Maxs.x = m_Maxs.y = -MAX_FLOAT;
|
|
|
|
std::fill(std::begin(m_Vertices), std::end(m_Vertices), ImVec2{ -MAX_FLOAT, -MAX_FLOAT });
|
|
}
|
|
|
|
ImVec2 m_Mins, m_Maxs;
|
|
ImVec2 m_Vertices[8];
|
|
};
|
|
|
|
// predefined custom user type
|
|
struct ColorPickerVar_t;
|
|
|
|
typedef double (*EasingFunction_t)(double);
|
|
struct AnimationHandler_t
|
|
{
|
|
// default: ease::in/outsine
|
|
AnimationHandler_t(EasingFunction_t fnIn = nullptr, EasingFunction_t fnOut = nullptr) :
|
|
fnEaseIn(fnIn), fnEaseOut(fnOut), bSwitch(false), bLastSwitch(false), flElapsedTime(0.f), flValue(0.1f){};
|
|
~AnimationHandler_t() = default;
|
|
|
|
// Has to be called every frame
|
|
void Update(const float flDeltaTime, const float flDuration);
|
|
|
|
// Get the current value multiplied by a scale
|
|
float GetValue(float flScale = 1.0f)
|
|
{
|
|
return flValue * flScale;
|
|
}
|
|
|
|
const bool GetSwitch() const
|
|
{
|
|
return bSwitch;
|
|
}
|
|
|
|
// switch state
|
|
void Switch()
|
|
{
|
|
bSwitch = !bSwitch;
|
|
}
|
|
|
|
void SetSwitch(const bool bState)
|
|
{
|
|
bSwitch = bState;
|
|
}
|
|
|
|
private:
|
|
// Set to true for ease-in animation, false for ease-out
|
|
bool bSwitch = 0;
|
|
bool bLastSwitch = bSwitch;
|
|
|
|
float flElapsedTime = 0.f;
|
|
|
|
// Current value of the animation
|
|
float flValue = 0.1f;
|
|
|
|
// Ease in and out functions Declaration
|
|
EasingFunction_t fnEaseIn = nullptr;
|
|
EasingFunction_t fnEaseOut = nullptr;
|
|
};
|
|
|
|
#pragma endregion
|
|
|
|
/*
|
|
* FONTS
|
|
*/
|
|
namespace FONT
|
|
{
|
|
// 0. verdana, size: 12px * scaledDPI(1.0f->2.0f); lighthinting
|
|
inline ImFont* pMenu[5];
|
|
inline ImFont* pMenuTabsDesc;
|
|
// 1. verdana, size: 14px; bold
|
|
inline ImFont* pExtra;
|
|
// 2. tahoma, size: 16px; lighthinting
|
|
inline ImFont* pVisual;
|
|
|
|
inline ImFont* pEspName;
|
|
inline ImFont* pEspFlagsName;
|
|
inline ImFont* pEspWepName;
|
|
inline ImFont* pEspHealth;
|
|
inline ImFont* pEspIcons;
|
|
inline ImFont* pEspArmor;
|
|
inline ImFont* gui_icons_font;
|
|
inline ImFont* isis;
|
|
inline ImFont* icon_font;
|
|
inline ImFont* font;
|
|
inline ImFont* mainfont;
|
|
inline ImFont* esp;
|
|
inline ImFont* menuFont;
|
|
inline ImFont* controlFont;
|
|
inline ImFont* boldMenuFont;
|
|
inline ImFont* tabFont;
|
|
inline ImFont* keybinds;
|
|
inline ImFont* weaponzFont;
|
|
inline ImFont* weapon_icons;
|
|
inline ImFont* museoSans;
|
|
inline ImFont* roboto;
|
|
inline ImFont* robotoTitle;
|
|
inline ImFont* iconsLarge;
|
|
inline ImFont* weaponIcons;
|
|
inline ImFont* interfaces;
|
|
inline ImFont* cs;
|
|
inline ImFont* cs_huge;
|
|
}
|
|
|
|
// extended imgui functionality
|
|
namespace ImGui
|
|
{
|
|
/* @section: main */
|
|
void HelpMarker(const char* szDescription);
|
|
bool HotKey(const char* szLabel, unsigned int* pValue);
|
|
bool HotKey(const char* szLabel, KeyBind_t* pKeyBind, const bool bAllowSwitch = true);
|
|
bool MultiCombo(const char* szLabel, unsigned int* pFlags, const char* const* arrItems, int nItemsCount);
|
|
bool BeginListBox(const char* szLabel, int nItemsCount, int nHeightInItems = -1);
|
|
|
|
/* @section: wrappers */
|
|
bool ColorEdit3(const char* szLabel, Color_t* pColor, ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_DisplayHex);
|
|
bool ColorEdit4(const char* szLabel, Color_t* pColor, ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_DisplayHex | ImGuiColorEditFlags_AlphaBar, int type = 0);
|
|
|
|
bool ColorEdit3(const char* szLabel, ColorPickerVar_t* pColor, ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_DisplayHex);
|
|
bool ColorEdit4(const char* szLabel, ColorPickerVar_t* pColorVar, ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_DisplayHex | ImGuiColorEditFlags_AlphaBar, int type = 0);
|
|
}
|
|
inline std::recursive_mutex input_mutex{ };
|
|
|
|
/*
|
|
* DRAW
|
|
* - rendering framework
|
|
*/
|
|
namespace D
|
|
{
|
|
// initialize rendering engine, create fonts, set styles etc
|
|
bool Setup(HWND hWnd, ID3D11Device* pDevice, ID3D11DeviceContext* pContext);
|
|
// shutdown rendering engine
|
|
void Destroy();
|
|
|
|
bool InitImGui();
|
|
void Render();
|
|
/* @section: callbacks */
|
|
// handle input window message and save keys states in array
|
|
bool OnWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
/* @section: get */
|
|
/// convert world space to screen space coordinates by game's conversion matrix
|
|
/// @param[out] pvecScreen output for converted screen position
|
|
/// @returns: true if converted coordinates fit into display size, false otherwise
|
|
bool WorldToScreen(const Vector_t& in, ImVec2& out);
|
|
void RenderDrawData(ImDrawData* data);
|
|
void ResetDrawData();
|
|
void SwapDrawData();
|
|
/* @section: some small utils*/
|
|
Vector_t GetScreenSize();
|
|
float CalculateDPI(const int nScaleTarget = 0);
|
|
|
|
/* @section: bindings */
|
|
void AddDrawListRect(ImDrawList* pDrawList, const ImVec2& vecMin, const ImVec2& vecMax, const Color_t& colRect, const unsigned int uFlags = DRAW_RECT_NONE, const Color_t& colOutline = Color_t(0, 0, 0, 255), const float flRounding = 0.f, const ImDrawFlags roundingCorners = ImDrawFlags_RoundCornersAll, float flThickness = 1.0f, const float flOutlineThickness = 1.0f);
|
|
void AddDrawListRectMultiColor(ImDrawList* pDrawList, const ImVec2& vecMin, const ImVec2& vecMax, const Color_t& colUpperLeft, const Color_t& colUpperRight, const Color_t& colBottomRight, const Color_t& colBottomLeft);
|
|
void AddDrawListCircle(ImDrawList* pDrawList, const ImVec2& vecCenter, const float flRadius, const Color_t& colCircle, const int nSegments, const unsigned int uFlags = DRAW_CIRCLE_NONE, const Color_t& colOutline = Color_t(0, 0, 0, 255), const float flThickness = 1.0f, const float flOutlineThickness = 1.0f);
|
|
void AddDrawListArc(ImDrawList* pDrawList, const ImVec2& vecPosition, const float flRadius, const float flMinimumAngle, const float flMaximumAngle, const Color_t& colArc = Color_t(255, 255, 255, 255), const float flThickness = 1.0f);
|
|
void AddDrawListLine(ImDrawList* pDrawList, const ImVec2& vecFirst, const ImVec2& vecSecond, const Color_t& colLine, const float flThickness = 1.0f);
|
|
void AddDrawListTriangle(ImDrawList* pDrawList, const ImVec2& vecFirst, const ImVec2& vecSecond, const ImVec2& vecThird, const Color_t& colTriangle, const unsigned int uFlags = DRAW_TRIANGLE_NONE, const Color_t& colOutline = Color_t(0, 0, 0, 255), const float flThickness = 0.f);
|
|
void AddDrawListQuad(ImDrawList* pDrawList, const ImVec2& vecFirst, const ImVec2& vecSecond, const ImVec2& vecThird, const ImVec2& vecFourth, const Color_t& colQuad, const unsigned int uFlags = DRAW_QUAD_NONE, const Color_t& colOutline = Color_t(0, 0, 0, 255), const float flThickness = 0.f);
|
|
void AddDrawListPolygon(ImDrawList* pDrawList, const ImVec2* vecPoints, const int nPointsCount, const Color_t& colPolygon, unsigned int uFlags = DRAW_POLYGON_NONE, const Color_t& colOutline = Color_t(0, 0, 0, 255), const bool bClosed = true, const float flThickness = 1.0f);
|
|
void AddDrawListText(ImDrawList* pDrawList, const ImFont* pFont, const ImVec2& vecPosition, const char* szText, const Color_t& colText, const unsigned int uFlags = DRAW_TEXT_NONE, const Color_t& colOutline = Color_t(0, 0, 0, 255), const float flThickness = 1.0f);
|
|
void AddDrawListShadowRect(ImDrawList* pDrawList, const ImVec2& vecMin, const ImVec2& vecMax, const Color_t& colShadow, float flThickness = 32.f, float flRounding = 0.0f, ImDrawFlags roundingCorners = ImDrawFlags_RoundCornersAll);
|
|
|
|
/* @section: values */
|
|
// rendering engine initialization state
|
|
inline bool bInitialized = false;
|
|
// active draw data container used to store
|
|
inline ImDrawList* pDrawListActive = nullptr;
|
|
// safe draw data container
|
|
inline ImDrawList* pDrawListSafe = nullptr;
|
|
// actual draw data container used to render
|
|
inline ImDrawList* pDrawListRender = nullptr;
|
|
}
|