Sync Local Files

Sync Local Files
pull/30/head
NerfBatInc 3 years ago
parent 1b381acdd0
commit b8c8a5637a

@ -3,7 +3,14 @@
extern Memory apex_mem;
extern bool firing_range;
float smooth = 12.0f;
//glow color and brigtness
extern float glowr;
extern float glowg;
extern float glowb;
extern int glowtype;
extern int glowtype2;
float smooth = 100.0f;
bool aim_no_recoil = true;
int bone = 2;
@ -68,11 +75,24 @@ int Entity::getHealth()
return *(int*)(buffer + OFFSET_HEALTH);
}
#define OFFSET_ARMOR_TYPE 0x4604
int Entity::getArmortype()
{
int armortype;
apex_mem.Read<int>(ptr + OFFSET_ARMOR_TYPE, armortype);
return armortype;
}
int Entity::getShield()
{
return *(int*)(buffer + OFFSET_SHIELD);
}
int Entity::getMaxshield()
{
return *(int*)(buffer + OFFSET_MAXSHIELD);
}
Vector Entity::getAbsVelocity()
{
return *(Vector*)(buffer + OFFSET_ABS_VELOCITY);
@ -111,53 +131,40 @@ float Entity::lastVisTime()
return *(float*)(buffer + OFFSET_VISIBLE_TIME);
}
Vector Entity::getBonePosition(int id)
{
Vector position = getPosition();
uintptr_t boneArray = *(uintptr_t*)(buffer + OFFSET_BONES);
Vector bone = Vector();
uint32_t boneloc = (id * 0x30);
Bone bo = {};
apex_mem.Read<Bone>(boneArray + boneloc, bo);
bone.x = bo.x + position.x;
bone.y = bo.y + position.y;
bone.z = bo.z + position.z;
return bone;
}
//https://www.unknowncheats.me/forum/apex-legends/496984-getting-hitbox-positions-cstudiohdr-externally.html
//https://www.unknowncheats.me/forum/3499185-post1334.html
Vector Entity::getBonePositionByHitbox(int id)
{
Vector origin = getPosition();
//BoneByHitBox
uint64_t Model = *(uint64_t*)(buffer + OFFSET_STUDIOHDR);
//get studio hdr
uint64_t StudioHdr;
apex_mem.Read<uint64_t>(Model + 0x8, StudioHdr);
//get hitbox array
int HitBoxsArray_set;
apex_mem.Read<int>(StudioHdr + 0xB4,HitBoxsArray_set);
uint64_t HitBoxsArray = StudioHdr + HitBoxsArray_set;
int HitboxIndex;
apex_mem.Read<int>(HitBoxsArray + 0x8, HitboxIndex);
int Bone;
apex_mem.Read<int>(HitBoxsArray + HitboxIndex + (id * 0x2C), Bone);
if(Bone < 0 || Bone > 255)
return Vector();
//hitpos
uint64_t BoneArray = *(uint64_t*)(buffer + OFFSET_BONES);
matrix3x4_t Matrix = {};
apex_mem.Read<matrix3x4_t>(BoneArray + Bone * sizeof(matrix3x4_t), Matrix);
return Vector(Matrix.m_flMatVal[0][3] + origin.x, Matrix.m_flMatVal[1][3] + origin.y, Matrix.m_flMatVal[2][3] + origin.z);
}
@ -202,16 +209,19 @@ bool Entity::isZooming()
void Entity::enableGlow()
{
apex_mem.Write<int>(ptr + OFFSET_GLOW_T1, 16256);
apex_mem.Write<int>(ptr + OFFSET_GLOW_T2, 1193322764);
apex_mem.Write<int>(ptr + OFFSET_GLOW_ENABLE, 7);
apex_mem.Write<int>(ptr + OFFSET_GLOW_THROUGH_WALLS, 2);
apex_mem.Write<int>(ptr + OFFSET_GLOW_ENABLE, glowtype);
apex_mem.Write<int>(ptr + OFFSET_GLOW_THROUGH_WALLS, glowtype2);
// Color
apex_mem.Write<float>(ptr + GLOW_COLOR_R, glowr);
apex_mem.Write<float>(ptr + GLOW_COLOR_G, glowg);
apex_mem.Write<float>(ptr + GLOW_COLOR_B, glowb);
}
void Entity::disableGlow()
{
apex_mem.Write<int>(ptr + OFFSET_GLOW_T1, 0);
apex_mem.Write<int>(ptr + OFFSET_GLOW_T2, 0);
apex_mem.Write<float>(ptr + GLOW_COLOR_R, 0.0f);
apex_mem.Write<float>(ptr + GLOW_COLOR_G, 0.0f);
apex_mem.Write<float>(ptr + GLOW_COLOR_B, 0.0f);
apex_mem.Write<int>(ptr + OFFSET_GLOW_ENABLE, 2);
apex_mem.Write<int>(ptr + OFFSET_GLOW_THROUGH_WALLS, 5);
}
@ -252,6 +262,14 @@ bool Item::isItem()
return strncmp(class_name, "CPropSurvival", 13) == 0;
}
bool Item::isBox()
{
char class_name[33] = {};
get_class_name(ptr, class_name);
return strncmp(class_name, "CDeathBoxProp", 13) == 0;
}
bool Item::isGlowing()
{
return *(int*)(buffer + OFFSET_ITEM_GLOW) == 1363184265;
@ -378,6 +396,7 @@ Item getItem(uintptr_t ptr)
return entity;
}
bool WorldToScreen(Vector from, float* m_vMatrix, int targetWidth, int targetHeight, Vector& to)
{
float w = m_vMatrix[12] * from.x + m_vMatrix[13] * from.y + m_vMatrix[14] * from.z + m_vMatrix[15];
@ -421,7 +440,7 @@ void WeaponXEntity::update(uint64_t LocalPlayer)
apex_mem.Read<float>(wep_entity + OFFSET_BULLET_SCALE, projectile_scale);
zoom_fov = 0;
apex_mem.Read<float>(wep_entity + OFFSET_ZOOM_FOV, zoom_fov);
ammo = 0;
ammo = 0;
apex_mem.Read<int>(wep_entity + OFFSET_AMMO, ammo);
}
@ -443,4 +462,4 @@ float WeaponXEntity::get_zoom_fov()
int WeaponXEntity::get_ammo()
{
return ammo;
}
}

@ -29,6 +29,8 @@ public:
int getTeamId();
int getHealth();
int getShield();
int getArmortype();
int getMaxshield();
bool isGlowing();
bool isZooming();
Vector getAbsVelocity();
@ -56,12 +58,14 @@ public:
uint8_t buffer[0x3FF0];
Vector getPosition();
bool isItem();
bool isBox();
bool isGlowing();
void enableGlow();
void disableGlow();
};
class WeaponXEntity
{
public:
@ -90,6 +94,7 @@ struct ClientClass {
Entity getEntity(uintptr_t ptr);
Item getItem(uintptr_t ptr);
bool WorldToScreen(Vector from, float* m_vMatrix, int targetWidth, int targetHeight, Vector& to);
float CalculateFov(Entity& from, Entity& target);
QAngle CalculateBestBoneAim(Entity& from, uintptr_t target, float max_fov);

@ -0,0 +1 @@
# LinuxDMA

@ -8,7 +8,7 @@
#include <cfloat>
#include "Game.h"
#include <thread>
//this is a test, with seconds
Memory apex_mem;
Memory client_mem;
@ -20,20 +20,30 @@ uintptr_t lastaimentity = 0;
float max = 999.0f;
float max_dist = 200.0f*40.0f;
int team_player = 0;
float max_fov = 15;
float max_fov = 25;
const int toRead = 100;
int aim = false;
bool esp = false;
bool item_glow = false;
bool player_glow = false;
int aim = true;
bool esp = true;
bool item_glow = true;
bool player_glow = true;
extern bool aim_no_recoil;
bool aiming = false;
extern float smooth;
extern int bone;
bool thirdperson = false;
//chargerifle hack
bool chargerifle = false;
bool shooting = false;
//Player Glow Color and Brightness
float glowr = 0.0f;
float glowg = 120.0f;
float glowb = 120.0f;
int glowtype = 1;
int glowtype2 = 2;
bool actions_t = false;
bool esp_t = false;
bool aim_t = false;
@ -41,7 +51,7 @@ bool vars_t = false;
bool item_t = false;
uint64_t g_Base;
uint64_t c_Base;
bool next = false;
bool next2 = false;
bool valid = false;
bool lock = false;
@ -59,9 +69,16 @@ typedef struct player
bool visible = false;
int health = 0;
int shield = 0;
int maxshield = 0;
int armortype = 0;
Vector EntityPosition;
Vector LocalPlayerPosition;
QAngle localviewangle;
char name[33] = { 0 };
}player;
struct Matrix
{
float matrix[16];
@ -275,7 +292,7 @@ void DoActions()
aimentity = tmp_aimentity;
else
aimentity = lastaimentity;
if(chargerifle)
{
charge_rifle_hack(LocalPlayer);
@ -298,6 +315,7 @@ void DoActions()
player players[toRead];
static void EspLoop()
{
esp_t = true;
@ -315,8 +333,8 @@ static void EspLoop()
apex_mem.Read<uint64_t>(g_Base + OFFSET_LOCAL_ENT, LocalPlayer);
if (LocalPlayer == 0)
{
next = true;
while(next && g_Base!=0 && c_Base!=0 && esp)
next2 = true;
while(next2 && g_Base!=0 && c_Base!=0 && esp)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
@ -326,8 +344,8 @@ static void EspLoop()
int team_player = LPlayer.getTeamId();
if (team_player < 0 || team_player>50)
{
next = true;
while(next && g_Base!=0 && c_Base!=0 && esp)
next2 = true;
while(next2 && g_Base!=0 && c_Base!=0 && esp)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
@ -345,6 +363,7 @@ static void EspLoop()
uint64_t entitylist = g_Base + OFFSET_ENTITYLIST;
memset(players,0,sizeof(players));
if(firing_range)
{
int c=0;
@ -377,6 +396,7 @@ static void EspLoop()
Vector EntityPosition = Target.getPosition();
float dist = LocalPlayerPosition.DistTo(EntityPosition);
if (dist > max_dist || dist < 50.0f)
{
continue;
@ -384,7 +404,7 @@ static void EspLoop()
Vector bs = Vector();
WorldToScreen(EntityPosition, m.matrix, 1920, 1080, bs);
if (bs.x > 0 && bs.y > 0)
if (esp)
{
Vector hs = Vector();
Vector HeadPosition = Target.getBonePositionByHitbox(0);
@ -394,6 +414,8 @@ static void EspLoop()
float boxMiddle = bs.x - (width / 2.0f);
int health = Target.getHealth();
int shield = Target.getShield();
int maxshield = Target.getMaxshield();
int armortype = Target.getArmortype();
players[c] =
{
dist,
@ -407,7 +429,10 @@ static void EspLoop()
0,
(Target.lastVisTime() > lastvis_esp[c]),
health,
shield
shield,
maxshield,
armortype
};
Target.get_name(g_Base, i-1, &players[c].name[0]);
lastvis_esp[c] = Target.lastVisTime();
@ -459,7 +484,7 @@ static void EspLoop()
Vector bs = Vector();
WorldToScreen(EntityPosition, m.matrix, 1920, 1080, bs);
if (bs.x > 0 && bs.y > 0)
if (esp)
{
Vector hs = Vector();
Vector HeadPosition = Target.getBonePositionByHitbox(0);
@ -469,7 +494,11 @@ static void EspLoop()
float boxMiddle = bs.x - (width / 2.0f);
int health = Target.getHealth();
int shield = Target.getShield();
int maxshield = Target.getMaxshield();
int armortype = Target.getArmortype();
Vector EntityPosition = Target.getPosition();
Vector LocalPlayerPosition = LPlayer.getPosition();
QAngle localviewangle = LPlayer.GetViewAngles();
players[i] =
{
dist,
@ -483,7 +512,12 @@ static void EspLoop()
Target.isKnocked(),
(Target.lastVisTime() > lastvis_esp[i]),
health,
shield
shield,
maxshield,
armortype,
EntityPosition,
LocalPlayerPosition,
localviewangle
};
Target.get_name(g_Base, i-1, &players[i].name[0]);
lastvis_esp[i] = Target.lastVisTime();
@ -492,8 +526,8 @@ static void EspLoop()
}
}
next = true;
while(next && g_Base!=0 && c_Base!=0 && esp)
next2 = true;
while(next2 && g_Base!=0 && c_Base!=0 && esp)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
@ -555,8 +589,8 @@ static void set_vars(uint64_t add_addr)
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*3, aiming_addr);
uint64_t g_Base_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*4, g_Base_addr);
uint64_t next_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*5, next_addr);
uint64_t next2_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*5, next2_addr);
uint64_t player_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*6, player_addr);
uint64_t valid_addr = 0;
@ -585,7 +619,18 @@ static void set_vars(uint64_t add_addr)
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*18, chargerifle_addr);
uint64_t shooting_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*19, shooting_addr);
uint64_t glowr_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*20, glowr_addr);
uint64_t glowg_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*21, glowg_addr);
uint64_t glowb_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*22, glowb_addr);
uint64_t firing_range_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*23, firing_range_addr);
uint64_t glowtype_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*24, glowtype_addr);
uint64_t glowtype2_addr = 0;
client_mem.Read<uint64_t>(add_addr + sizeof(uint64_t)*25, glowtype2_addr);
uint32_t check = 0;
client_mem.Read<uint32_t>(check_addr, check);
@ -612,7 +657,6 @@ static void set_vars(uint64_t add_addr)
client_mem.Write<uint64_t>(g_Base_addr, g_Base);
client_mem.Write<int>(spectators_addr, spectators);
client_mem.Write<int>(allied_spectators_addr, allied_spectators);
client_mem.Read<int>(aim_addr, aim);
client_mem.Read<bool>(esp_addr, esp);
client_mem.Read<bool>(aiming_addr, aiming);
@ -626,28 +670,39 @@ static void set_vars(uint64_t add_addr)
client_mem.Read<bool>(thirdperson_addr, thirdperson);
client_mem.Read<bool>(shooting_addr, shooting);
client_mem.Read<bool>(chargerifle_addr, chargerifle);
if(esp && next)
client_mem.Read<float>(glowr_addr, glowr);
client_mem.Read<float>(glowg_addr, glowg);
client_mem.Read<float>(glowb_addr, glowb);
client_mem.Read<bool>(firing_range_addr, firing_range);
client_mem.Read<int>(glowtype_addr, glowtype);
client_mem.Read<int>(glowtype2_addr, glowtype2);
if(esp && next2)
{
if(valid)
client_mem.WriteArray<player>(player_addr, players, toRead);
client_mem.WriteArray<player>(player_addr, players, toRead);
client_mem.Write<bool>(valid_addr, valid);
client_mem.Write<bool>(next_addr, true); //next
client_mem.Write<bool>(next2_addr, true); //next2
bool next_val = false;
bool next2_val = false;
do
{
client_mem.Read<bool>(next_addr, next_val);
client_mem.Read<bool>(next2_addr, next2_val);
std::this_thread::sleep_for(std::chrono::milliseconds(1));
} while (next_val && g_Base!=0 && c_Base!=0);
} while (next2_val && g_Base!=0 && c_Base!=0);
next = false;
next2 = false;
}
}
}
vars_t = false;
}
// Item Glow Stuff
struct GlowMode {
int8_t GeneralGlowMode, BorderGlowMode, BorderSize, TransparentLevel;
};
static void item_glow_t()
{
item_t = true;
@ -661,33 +716,44 @@ static void item_glow_t()
uint64_t entitylist = g_Base + OFFSET_ENTITYLIST;
if (item_glow)
{
for (int i = 0; i < 10000; i++)
for (int i = 0; i < 20000; i++)
{
uint64_t centity = 0;
apex_mem.Read<uint64_t>(entitylist + ((uint64_t)i << 5), centity);
if (centity == 0) continue;
Item item = getItem(centity);
if (item.isBox())
{
apex_mem.Write<int>(centity + 0x262, 16256);
apex_mem.Write<int>(centity + 0x2dc, 1193322764);
apex_mem.Write<int>(centity + 0x3c8, 7);
apex_mem.Write<int>(centity + 0x3d0, 2);
}
if(item.isItem() && !item.isGlowing())
{
item.enableGlow();
}
}
k=1;
std::this_thread::sleep_for(std::chrono::milliseconds(600));
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
else
{
if(k==1)
{
for (int i = 0; i < 10000; i++)
for (int i = 0; i < 20000; i++)
{
uint64_t centity = 0;
apex_mem.Read<uint64_t>(entitylist + ((uint64_t)i << 5), centity);
if (centity == 0) continue;
Item item = getItem(centity);
if(item.isItem() && item.isGlowing())
{
item.disableGlow();
@ -701,6 +767,7 @@ static void item_glow_t()
item_t = false;
}
int main(int argc, char *argv[])
{
if(geteuid() != 0)
@ -709,12 +776,12 @@ int main(int argc, char *argv[])
return 0;
}
const char* cl_proc = "client_ap.exe";
const char* cl_proc = "MonkeyCure.exe";
const char* ap_proc = "R5Apex.exe";
//const char* ap_proc = "EasyAntiCheat_launcher.exe";
//Client "add" offset
uint64_t add_off = 0x3f880;
uint64_t add_off = 0x12c980;
std::thread aimbot_thr;
std::thread esp_thr;

@ -1,102 +1,66 @@
#define ORIGIN 1
#define STEAM 2
#define VERSION STEAM
//v3.0.10.29
//GameVersion=v3.0.11.32
#if VERSION == STEAM
#define OFFSET_ENTITYLIST 0x1a75038
#define OFFSET_LOCAL_ENT 0x1e25418 //LocalPlayer
#define OFFSET_NAME_LIST 0xba1e650
#define OFFSET_THIRDPERSON 0x01a5a440 + 0x6c //thirdperson_override + 0x6c
#define OFFSET_TIMESCALE 0x0141b2b0 //host_timescale
#define OFFSET_TEAM 0x448 //m_iTeamNum
#define OFFSET_HEALTH 0x438 //m_iHealth
#define OFFSET_SHIELD 0x170 //m_shieldHealth
#define OFFSET_NAME 0x589 //m_iName
#define OFFSET_SIGN_NAME 0x580 //m_iSignifierName
#define OFFSET_ABS_VELOCITY 0x140 //m_vecAbsVelocity
#define OFFSET_VISIBLE_TIME 0x1a44 //CPlayer!lastVisibleTime
#define OFFSET_ZOOMING 0x1bc1 //m_bZooming
#define OFFSET_THIRDPERSON_SV 0x3608 //m_thirdPersonShoulderView
#define OFFSET_YAW 0x2200 - 0x8 //m_currentFramePlayer.m_ammoPoolCount - 0x8
#define OFFSET_LIFE_STATE 0x798 //m_lifeState, >0 = dead
#define OFFSET_BLEED_OUT_STATE 0x2688 //m_bleedoutState, >0 = knocked
#define OFFSET_ORIGIN 0x014c //m_vecAbsOrigin
#define OFFSET_BONES 0x0e88 + 0x48 //m_nForceBone + 0x48
#define OFFSET_STUDIOHDR 0x10d8
#define OFFSET_AIMPUNCH 0x23f8 //m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle
#define OFFSET_CAMERAPOS 0x1ea0 //CPlayer!camera_origin
#define OFFSET_VIEWANGLES 0x24f4 - 0x14 //m_ammoPoolCapacity - 0x14
#define OFFSET_BREATH_ANGLES OFFSET_VIEWANGLES - 0x10
#define OFFSET_OBSERVER_MODE 0x341c //m_iObserverMode
#define OFFSET_OBSERVING_TARGET 0x3428 //m_hObserverTarget
#define OFFSET_MATRIX 0x11a210
#define OFFSET_RENDER 0x7599758
#define OFFSET_WEAPON 0x19ec //m_latestPrimaryWeapons
#define OFFSET_BULLET_SPEED 0x1eb8 //CWeaponX!m_flProjectileSpeed
#define OFFSET_BULLET_SCALE 0x1ec0 //CWeaponX!m_flProjectileScale
#define OFFSET_ZOOM_FOV 0x1698 + 0xb8 //m_playerData + m_curZoomFOV
#define OFFSET_AMMO 0x1624 //m_ammoInClip
#define OFFSET_ITEM_GLOW 0x2c0 //m_highlightFunctionBits
#define OFFSET_GLOW_T1 0x262 //16256 = enabled, 0 = disabled
#define OFFSET_GLOW_T2 0x2dc //1193322764 = enabled, 0 = disabled
#define OFFSET_GLOW_ENABLE 0x3c8 //7 = enabled, 2 = disabled
#define OFFSET_GLOW_THROUGH_WALLS 0x3d0 //2 = enabled, 5 = disabled
#elif VERSION == ORIGIN
#define OFFSET_ENTITYLIST 0x1a75038
#define OFFSET_LOCAL_ENT 0x1e25418 //LocalPlayer
#define OFFSET_NAME_LIST 0xba1e650
#define OFFSET_THIRDPERSON 0x01a5a440 + 0x6c //thirdperson_override + 0x6c
#define OFFSET_TIMESCALE 0x0141b2b0 //host_timescale
#define OFFSET_TEAM 0x448 //m_iTeamNum
#define OFFSET_HEALTH 0x438 //m_iHealth
#define OFFSET_SHIELD 0x170 //m_shieldHealth
#define OFFSET_NAME 0x589 //m_iName
#define OFFSET_SIGN_NAME 0x580 //m_iSignifierName
#define OFFSET_ABS_VELOCITY 0x140 //m_vecAbsVelocity
#define OFFSET_VISIBLE_TIME 0x1a44 //CPlayer!lastVisibleTime
#define OFFSET_ZOOMING 0x1bc1 //m_bZooming
#define OFFSET_THIRDPERSON_SV 0x3608 //m_thirdPersonShoulderView
#define OFFSET_YAW 0x2200 - 0x8 //m_currentFramePlayer.m_ammoPoolCount - 0x8
#define OFFSET_LIFE_STATE 0x798 //m_lifeState, >0 = dead
#define OFFSET_BLEED_OUT_STATE 0x2688 //m_bleedoutState, >0 = knocked
#define OFFSET_ORIGIN 0x014c //m_vecAbsOrigin
#define OFFSET_BONES 0x0e88 + 0x48 //m_nForceBone + 0x48
#define OFFSET_STUDIOHDR 0x10d8
#define OFFSET_AIMPUNCH 0x23f8 //m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle
#define OFFSET_CAMERAPOS 0x1ea0 //CPlayer!camera_origin
#define OFFSET_VIEWANGLES 0x24f4 - 0x14 //m_ammoPoolCapacity - 0x14
#define OFFSET_BREATH_ANGLES OFFSET_VIEWANGLES - 0x10
#define OFFSET_OBSERVER_MODE 0x341c //m_iObserverMode
#define OFFSET_OBSERVING_TARGET 0x3428 //m_hObserverTarget
#define OFFSET_MATRIX 0x11a210
#define OFFSET_RENDER 0x7599758
#define OFFSET_WEAPON 0x19ec //m_latestPrimaryWeapons
#define OFFSET_BULLET_SPEED 0x1eb8 //CWeaponX!m_flProjectileSpeed
#define OFFSET_BULLET_SCALE 0x1ec0 //CWeaponX!m_flProjectileScale
#define OFFSET_ZOOM_FOV 0x1698 + 0xb8 //m_playerData + m_curZoomFOV
#define OFFSET_AMMO 0x1624 //m_ammoInClip
#define OFFSET_ITEM_GLOW 0x2c0 //m_highlightFunctionBits
#define OFFSET_GLOW_T1 0x262 //16256 = enabled, 0 = disabled
#define OFFSET_GLOW_T2 0x2dc //1193322764 = enabled, 0 = disabled
#define OFFSET_GLOW_ENABLE 0x3c8 //7 = enabled, 2 = disabled
#define OFFSET_GLOW_THROUGH_WALLS 0x3d0 //2 = enabled, 5 = disabled
#define OFFSET_ENTITYLIST 0x1a75038 //cl_entitylist
#define OFFSET_LOCAL_ENT 0x1e25418 //LocalPlayer
#define OFFSET_NAME_LIST 0xba1e650 //NameList
#define OFFSET_THIRDPERSON 0x01a5a440 + 0x6c //thirdperson_override + 0x6c
#define OFFSET_TIMESCALE 0x0141b2b0 //host_timescale
#define OFFSET_TEAM 0x448 //m_iTeamNum
#define OFFSET_HEALTH 0x438 //m_iHealth
#define OFFSET_SHIELD 0x170 //m_shieldHealth
#define OFFSET_MAXSHIELD 0x174 //m_shieldHealthMax
#define OFFSET_ARMORTYPE 0x4574 //armortype
#define OFFSET_NAME 0x589 //m_iName
#define OFFSET_SIGN_NAME 0x580 //m_iSignifierName
#define OFFSET_ABS_VELOCITY 0x140 //m_vecAbsVelocity
#define OFFSET_VISIBLE_TIME 0x1a44 //CPlayer!lastVisibleTime
#define OFFSET_ZOOMING 0x1bc1 //m_bZooming
#define OFFSET_THIRDPERSON_SV 0x3608 //m_thirdPersonShoulderView
#define OFFSET_YAW 0x2200 - 0x8 //m_currentFramePlayer.m_ammoPoolCount - 0x8
#define OFFSET_LIFE_STATE 0x798 //m_lifeState, >0 = dead
#define OFFSET_BLEED_OUT_STATE 0x2688 //m_bleedoutState, >0 = knocked
#define OFFSET_ORIGIN 0x014c //m_vecAbsOrigin - 3rd offset after the first int and vector
#define OFFSET_BONES 0x0e88 + 0x48 //m_nForceBone + 0x48
#define OFFSET_STUDIOHDR 0x10d8 //CBaseAnimating!m_pStudioHdr
#define OFFSET_AIMPUNCH 0x23f8 //m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle
#define OFFSET_CAMERAPOS 0x1ea0 //CPlayer!camera_origin
#define OFFSET_VIEWANGLES 0x24f4 - 0x14 //m_ammoPoolCapacity - 0x14
#define OFFSET_BREATH_ANGLES OFFSET_VIEWANGLES - 0x10
#define OFFSET_OBSERVER_MODE 0x341c //m_iObserverMode
#define OFFSET_OBSERVING_TARGET 0x3428 //m_hObserverTarget
#define OFFSET_MATRIX 0x11a210 //ViewMatrix
#define OFFSET_RENDER 0x7599758 //ViewRender
#define OFFSET_WEAPON 0x19ec //m_latestPrimaryWeapons
#define OFFSET_BULLET_SPEED 0x1eb8 //CWeaponX!m_flProjectileSpeed
#define OFFSET_BULLET_SCALE 0x1ec0 //CWeaponX!m_flProjectileScale
#define OFFSET_ZOOM_FOV 0x1698 + 0xb8 //m_playerData + m_curZoomFOV
#define OFFSET_AMMO 0x1624 //m_ammoInClip first offset
#define OFFSET_ITEM_GLOW 0x2c0 //m_highlightFunctionBits
#define OFFSET_GLOW_T1 0x262 //16256 = enabled, 0 = disabled
#define OFFSET_GLOW_T2 0x2dc //1193322764 = enabled, 0 = disabled
#define OFFSET_GLOW_ENABLE 0x3c8 //7 = enabled, 2 = disabled
#define OFFSET_GLOW_THROUGH_WALLS 0x3d0 //2 = enabled, 5 = disabled
#define GLOW_COLOR_R 0x1D0
#define GLOW_COLOR_G 0x1D4
#define GLOW_COLOR_B 0x1D8
#endif

@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

@ -0,0 +1,363 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd

@ -1,11 +1,9 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29519.87
# Visual Studio Version 17
VisualStudioVersion = 17.3.32819.101
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Client", "Client\Client\Client.vcxproj", "{9BF6CD05-63DA-49CF-905E-B82F5F24AC6E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Overlay", "Overlay\Overlay\Overlay.vcxproj", "{68C049A1-7EA4-45D2-942C-7710AF16B1FA}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Client", "Client.vcxproj", "{9BF6CD05-63DA-49CF-905E-B82F5F24AC6E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -17,15 +15,11 @@ Global
{9BF6CD05-63DA-49CF-905E-B82F5F24AC6E}.Debug|x64.Build.0 = Debug|x64
{9BF6CD05-63DA-49CF-905E-B82F5F24AC6E}.Release|x64.ActiveCfg = Release|x64
{9BF6CD05-63DA-49CF-905E-B82F5F24AC6E}.Release|x64.Build.0 = Release|x64
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Debug|x64.ActiveCfg = Debug|x64
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Debug|x64.Build.0 = Debug|x64
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Release|x64.ActiveCfg = Release|x64
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CA1CD6B1-E5B8-4031-A3BE-BCFCBAE43EEA}
SolutionGuid = {2ECB7851-7A97-4557-87A8-48F3FD238BD4}
EndGlobalSection
EndGlobal

@ -22,14 +22,14 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<SpectreMitigation>false</SpectreMitigation>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
@ -51,6 +51,7 @@
<LinkIncremental>true</LinkIncremental>
<LibraryPath>$(DXSDK_DIR)Lib\x64;$(LibraryPath)</LibraryPath>
<IncludePath>$(DXSDK_DIR)Include;$(IncludePath)</IncludePath>
<TargetName>MonkeyCure</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
@ -62,10 +63,12 @@
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<Optimization>MinSpace</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<AdditionalIncludeDirectories>C:\Users\What\Desktop\TESTKVM\ApexWinKVM-master</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@ -104,6 +107,7 @@
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\Desktop\TESTKVM\ApexWinKVM-master\DirectXMath.h" />
<ClInclude Include="imgui\imconfig.h" />
<ClInclude Include="imgui\imgui.h" />
<ClInclude Include="imgui\imgui_impl_dx11.h" />
@ -113,6 +117,7 @@
<ClInclude Include="imgui\imstb_textedit.h" />
<ClInclude Include="imgui\imstb_truetype.h" />
<ClInclude Include="main.h" />
<ClInclude Include="offsets.h" />
<ClInclude Include="overlay.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="XorString.h" />

@ -76,6 +76,12 @@
<ClInclude Include="imgui\imgui_impl_dx11.h">
<Filter>Headers\imgui</Filter>
</ClInclude>
<ClInclude Include="offsets.h">
<Filter>Source</Filter>
</ClInclude>
<ClInclude Include="..\..\..\Desktop\TESTKVM\ApexWinKVM-master\DirectXMath.h">
<Filter>Headers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Client.rc" />

@ -315,6 +315,8 @@ namespace ImGui
IMGUI_API void ShowUserGuide(); // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls).
IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.80 WIP" (essentially the value for IMGUI_VERSION from the compiled version of imgui.cpp)
// Styles
IMGUI_API void StyleColorsDark(ImGuiStyle* dst = NULL); // new, recommended style (default)
IMGUI_API void StyleColorsLight(ImGuiStyle* dst = NULL); // best used with borders and a custom, thicker font
@ -506,6 +508,8 @@ namespace ImGui
IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0));
IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding
IMGUI_API bool Checkbox(const char* label, bool* v);
//Sliderbox
IMGUI_API bool Sliderbox(const char* label, bool* v);
IMGUI_API bool CheckboxFlags(const char* label, int* flags, int flags_value);
IMGUI_API bool CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value);
IMGUI_API bool RadioButton(const char* label, bool active); // use with e.g. if (RadioButton("one", my_value==1)) { my_value = 1; }
@ -2446,7 +2450,10 @@ struct ImDrawList
IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); // Note: Anti-aliased filling requires points to be in clockwise order.
IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points)
IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points)
//Seer
IMGUI_API void AddHexagon(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p5, const ImVec2& p6, ImU32 col, float thickness = 1.0f);
IMGUI_API void AddHexagonFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p5, const ImVec2& p6, ImU32 col);
// Image primitives
// - Read FAQ to understand what ImTextureID is.
// - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle.

@ -1382,6 +1382,38 @@ void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float th
PathLineTo(p2 + ImVec2(0.5f, 0.5f));
PathStroke(col, 0, thickness);
}
//Seer
void ImDrawList::AddHexagon(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p5, const ImVec2& p6, ImU32 col, float thickness)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
PathLineTo(p1);
PathLineTo(p2);
PathLineTo(p3);
PathLineTo(p4);
PathLineTo(p5);
PathLineTo(p6);
PathStroke(col, ImDrawFlags_Closed, thickness);
}
void ImDrawList::AddHexagonFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p5, const ImVec2& p6, ImU32 col)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
PathLineTo(p1);
PathLineTo(p2);
PathLineTo(p3);
PathLineTo(p4);
PathLineTo(p5);
PathLineTo(p6);
PathFillConvex(col);
}
// p_min = upper-left, p_max = lower-right
// Note we don't render 1 pixels sized rectangles properly.

@ -1,4 +1,4 @@
// dear imgui, v1.85
// dear imgui, v1.85
// (widgets code)
/*
@ -1067,6 +1067,81 @@ bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const I
return ImageButtonEx(id, user_texture_id, size, uv0, uv1, padding, bg_col, tint_col);
}
//Sliderbox
bool ImGui::Sliderbox(const char* label, bool* v)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = ImGuiStyle::ImGuiStyle();
const ImGuiID id = window->GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
const ImVec2 pading = ImVec2(2, 2);
const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.x * 6, label_size.y + style.FramePadding.y / 2));
ItemSize(check_bb, style.FramePadding.y);
ImRect total_bb = check_bb;
if (label_size.x > 0)
SameLine(0, style.ItemInnerSpacing.x);
const ImRect text_bb(window->DC.CursorPos + ImVec2(0, style.FramePadding.y), window->DC.CursorPos + ImVec2(0, style.FramePadding.y) + label_size);
if (label_size.x > 0)
{
ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y);
total_bb = ImRect(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max));
}
if (!ItemAdd(total_bb, id))
return false;
bool hovered, held;
bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);
if (pressed)
*v = !(*v);
const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
const float check_sz2 = check_sz / 2;
const float pad = ImMax(1.0f, (float)(int)(check_sz / 4.f));
//window->DrawList->AddRectFilled(check_bb.Min+ImVec2(pad,pad), check_bb.Max-ImVec2(pad,pad), GetColorU32(ImGuiCol_CheckMark), style.FrameRounding);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 6, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 5, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 4, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 3, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 2, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 1, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 1, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 2, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 3, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 4, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 5, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 0.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 6, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 1.0f, 1.0f, 1.0f)), 12);
if (*v)//от исовка галочки
{
//window->DrawList->AddRectFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2, check_bb.Min.y), check_bb.Max, GetColorU32(ImVec4(0.34f, 1.0f, 0.54f, 1.0f)), 0);
//window->DrawList->AddRectFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2, check_bb.Min.y), check_bb.Max, GetColorU32(ImVec4(0.34f, 1.0f, 0.54f, 1.0f)), 0);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 6, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 5, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 4, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 3, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 2, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 1, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 1, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 2, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 3, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 4, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 5, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 6, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(0.0f, 1.0f, 0.0f, 1.0f)), 12);
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 + 6, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 1.0f, 1.0f, 1.0f)), 12);
}
else
{
window->DrawList->AddCircleFilled(ImVec2(check_bb.Min.x + (check_bb.Max.x - check_bb.Min.x) / 2 - 6, check_bb.Min.y + 9), 7, GetColorU32(ImVec4(1.0f, 1.0f, 1.0f, 1.0f)), 12);
}
if (label_size.x > 0.0f)
RenderText(text_bb.GetTL(), label);
return pressed;
}
bool ImGui::Checkbox(const char* label, bool* v)
{
ImGuiWindow* window = GetCurrentWindow();

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014-2019 Omar Cornut
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,61 @@
//-----------------------------------------------------------------------------
// USER IMPLEMENTATION
// This file contains compile-time options for ImGui.
// Other options (memory allocation overrides, callbacks, etc.) can be set at runtime via the ImGuiIO structure - ImGui::GetIO().
//-----------------------------------------------------------------------------
#pragma once
//---- Define assertion handler. Defaults to calling assert().
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows.
//#define IMGUI_API __declspec( dllexport )
//#define IMGUI_API __declspec( dllimport )
//---- Don't define obsolete functions names. Consider enabling from time to time or when updating to reduce like hood of using already obsolete function/names
//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
//---- Include imgui_user.h at the end of imgui.h
//#define IMGUI_INCLUDE_IMGUI_USER_H
//---- Don't implement default handlers for Windows (so as not to link with OpenClipboard() and others Win32 functions)
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
//---- Don't implement demo windows functionality (ShowDemoWindow()/ShowStyleEditor()/ShowUserGuide() methods will be empty)
//---- It is very strongly recommended to NOT disable the demo windows. Please read the comment at the top of imgui_demo.cpp to learn why.
//#define IMGUI_DISABLE_DEMO_WINDOWS
//---- Don't implement ImFormatString(), ImFormatStringV() so you can reimplement them yourself.
//#define IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS
//---- Pack colors to BGRA instead of RGBA (remove need to post process vertex buffer in back ends)
//#define IMGUI_USE_BGRA_PACKED_COLOR
//---- Implement STB libraries in a namespace to avoid linkage conflicts
//#define IMGUI_STB_NAMESPACE ImGuiStb
//---- Define constructor and implicit cast operators to convert back<>forth from your math types and ImVec2/ImVec4.
/*
#define IM_VEC2_CLASS_EXTRA \
ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \
operator MyVec2() const { return MyVec2(x,y); }
#define IM_VEC4_CLASS_EXTRA \
ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \
operator MyVec4() const { return MyVec4(x,y,z,w); }
*/
//---- Use 32-bit vertex indices (instead of default: 16-bit) to allow meshes with more than 64K vertices
//#define ImDrawIdx unsigned int
//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files.
//---- e.g. create variants of the ImGui::Value() helper for your low-level math types, or your own widgets/helpers.
/*
namespace ImGui
{
void Value(const char* prefix, const MyMatrix44& v, const char* float_format = NULL);
}
*/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -0,0 +1,21 @@
// ImGui Win32 + DirectX11 binding
// In this binding, ImTextureID is used to store a 'ID3D11ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
// https://github.com/ocornut/imgui
#include <windows.h>
struct ID3D11Device;
struct ID3D11DeviceContext;
IMGUI_API bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context);
IMGUI_API void ImGui_ImplDX11_Shutdown();
IMGUI_API void ImGui_ImplDX11_NewFrame();
// Use if you want to reset your rendering device without losing ImGui state.
IMGUI_API void ImGui_ImplDX11_InvalidateDeviceObjects();
IMGUI_API bool ImGui_ImplDX11_CreateDeviceObjects();
IMGUI_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

@ -0,0 +1,995 @@
// dear imgui, v1.54 WIP
// (internals)
// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
// Set:
// #define IMGUI_DEFINE_MATH_OPERATORS
// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
#pragma once
#ifndef IMGUI_VERSION
#error Must include imgui.h before imgui_internal.h
#endif
#include <stdio.h> // FILE*
#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
#ifdef _MSC_VER
#pragma warning (push)
#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport)
#endif
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
#pragma clang diagnostic ignored "-Wold-style-cast"
#endif
//-----------------------------------------------------------------------------
// Forward Declarations
//-----------------------------------------------------------------------------
struct ImRect;
struct ImGuiColMod;
struct ImGuiStyleMod;
struct ImGuiGroupData;
struct ImGuiMenuColumns;
struct ImGuiDrawContext;
struct ImGuiTextEditState;
struct ImGuiMouseCursorData;
struct ImGuiPopupRef;
struct ImGuiWindow;
struct ImGuiWindowSettings;
typedef int ImGuiLayoutType; // enum: horizontal or vertical // enum ImGuiLayoutType_
typedef int ImGuiButtonFlags; // flags: for ButtonEx(), ButtonBehavior() // enum ImGuiButtonFlags_
typedef int ImGuiItemFlags; // flags: for PushItemFlag() // enum ImGuiItemFlags_
typedef int ImGuiSeparatorFlags; // flags: for Separator() - internal // enum ImGuiSeparatorFlags_
typedef int ImGuiSliderFlags; // flags: for SliderBehavior() // enum ImGuiSliderFlags_
//-------------------------------------------------------------------------
// STB libraries
//-------------------------------------------------------------------------
namespace ImGuiStb
{
#undef STB_TEXTEDIT_STRING
#undef STB_TEXTEDIT_CHARTYPE
#define STB_TEXTEDIT_STRING ImGuiTextEditState
#define STB_TEXTEDIT_CHARTYPE ImWchar
#define STB_TEXTEDIT_GETWIDTH_NEWLINE -1.0f
#include "stb_textedit.h"
} // namespace ImGuiStb
//-----------------------------------------------------------------------------
// Context
//-----------------------------------------------------------------------------
#ifndef GImGui
extern IMGUI_API ImGuiContext* GImGui; // Current implicit ImGui context pointer
#endif
//-----------------------------------------------------------------------------
// Helpers
//-----------------------------------------------------------------------------
#define IM_PI 3.14159265358979323846f
// Helpers: UTF-8 <> wchar
IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count
IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // return input UTF-8 bytes count
IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count
IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string as UTF-8 code-points
// Helpers: Misc
IMGUI_API ImU32 ImHash(const void* data, int data_size, ImU32 seed = 0); // Pass data_size==0 for zero-terminated strings
IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, int* out_file_size = NULL, int padding_bytes = 0);
IMGUI_API FILE* ImFileOpen(const char* filename, const char* file_open_mode);
static inline bool ImCharIsSpace(int c) { return c == ' ' || c == '\t' || c == 0x3000; }
static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
// Helpers: Geometry
IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
// Helpers: String
IMGUI_API int ImStricmp(const char* str1, const char* str2);
IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count);
IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count);
IMGUI_API char* ImStrdup(const char* str);
IMGUI_API char* ImStrchrRange(const char* str_begin, const char* str_end, char c);
IMGUI_API int ImStrlenW(const ImWchar* str);
IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line
IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);
IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
// Helpers: Math
// We are keeping those not leaking to the user by default, in the case the user has implicit cast operators between ImVec2 and its own types (when IM_VEC2_CLASS_EXTRA is defined)
#ifdef IMGUI_DEFINE_MATH_OPERATORS
static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x*rhs, lhs.y*rhs); }
static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); }
static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); }
static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); }
static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x*rhs.x, lhs.y*rhs.y); }
static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); }
static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; }
static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; }
static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; }
static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; }
static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); }
static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); }
static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x*rhs.x, lhs.y*rhs.y, lhs.z*rhs.z, lhs.w*rhs.w); }
#endif
static inline int ImMin(int lhs, int rhs) { return lhs < rhs ? lhs : rhs; }
static inline int ImMax(int lhs, int rhs) { return lhs >= rhs ? lhs : rhs; }
static inline float ImMin(float lhs, float rhs) { return lhs < rhs ? lhs : rhs; }
static inline float ImMax(float lhs, float rhs) { return lhs >= rhs ? lhs : rhs; }
static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); }
static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); }
static inline int ImClamp(int v, int mn, int mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
static inline float ImClamp(float v, float mn, float mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
static inline ImVec2 ImClamp(const ImVec2& f, const ImVec2& mn, ImVec2 mx) { return ImVec2(ImClamp(f.x, mn.x, mx.x), ImClamp(f.y, mn.y, mx.y)); }
static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; }
static inline void ImSwap(int& a, int& b) { int tmp = a; a = b; b = tmp; }
static inline void ImSwap(float& a, float& b) { float tmp = a; a = b; b = tmp; }
static inline int ImLerp(int a, int b, float t) { return (int)(a + (b - a) * t); }
static inline float ImLerp(float a, float b, float t) { return a + (b - a) * t; }
static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); }
static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); }
static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); }
static inline float ImLengthSqr(const ImVec2& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y; }
static inline float ImLengthSqr(const ImVec4& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; }
static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; }
static inline float ImFloor(float f) { return (float)(int)f; }
static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)v.x, (float)(int)v.y); }
static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }
static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }
static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
struct ImNewPlacementDummy {};
inline void* operator new(size_t, ImNewPlacementDummy, void* ptr) { return ptr; }
inline void operator delete(void*, ImNewPlacementDummy, void*) {} // This is only required so we can use the symetrical new()
#define IM_PLACEMENT_NEW(_PTR) new(ImNewPlacementDummy(), _PTR)
#define IM_NEW(_TYPE) new(ImNewPlacementDummy(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE
template <typename T> void IM_DELETE(T*& p) { if (p) { p->~T(); ImGui::MemFree(p); p = NULL; } }
//-----------------------------------------------------------------------------
// Types
//-----------------------------------------------------------------------------
enum ImGuiButtonFlags_
{
ImGuiButtonFlags_Repeat = 1 << 0, // hold to repeat
ImGuiButtonFlags_PressedOnClickRelease = 1 << 1, // return true on click + release on same item [DEFAULT if no PressedOn* flag is set]
ImGuiButtonFlags_PressedOnClick = 1 << 2, // return true on click (default requires click+release)
ImGuiButtonFlags_PressedOnRelease = 1 << 3, // return true on release (default requires click+release)
ImGuiButtonFlags_PressedOnDoubleClick = 1 << 4, // return true on double-click (default requires click+release)
ImGuiButtonFlags_FlattenChildren = 1 << 5, // allow interactions even if a child window is overlapping
ImGuiButtonFlags_AllowItemOverlap = 1 << 6, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
ImGuiButtonFlags_DontClosePopups = 1 << 7, // disable automatically closing parent popup on press // [UNUSED]
ImGuiButtonFlags_Disabled = 1 << 8, // disable interactions
ImGuiButtonFlags_AlignTextBaseLine = 1 << 9, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
ImGuiButtonFlags_NoKeyModifiers = 1 << 10, // disable interaction if a key modifier is held
ImGuiButtonFlags_NoHoldingActiveID = 1 << 11, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
ImGuiButtonFlags_PressedOnDragDropHold = 1 << 12 // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
};
enum ImGuiSliderFlags_
{
ImGuiSliderFlags_Vertical = 1 << 0
};
enum ImGuiColumnsFlags_
{
// Default: 0
ImGuiColumnsFlags_NoBorder = 1 << 0, // Disable column dividers
ImGuiColumnsFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers
ImGuiColumnsFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns
ImGuiColumnsFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window
ImGuiColumnsFlags_GrowParentContentsSize = 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
};
enum ImGuiSelectableFlagsPrivate_
{
// NB: need to be in sync with last value of ImGuiSelectableFlags_
ImGuiSelectableFlags_Menu = 1 << 3, // -> PressedOnClick
ImGuiSelectableFlags_MenuItem = 1 << 4, // -> PressedOnRelease
ImGuiSelectableFlags_Disabled = 1 << 5,
ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 6
};
enum ImGuiSeparatorFlags_
{
ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
ImGuiSeparatorFlags_Vertical = 1 << 1
};
// FIXME: this is in development, not exposed/functional as a generic feature yet.
enum ImGuiLayoutType_
{
ImGuiLayoutType_Vertical,
ImGuiLayoutType_Horizontal
};
enum ImGuiAxis
{
ImGuiAxis_None = -1,
ImGuiAxis_X = 0,
ImGuiAxis_Y = 1
};
enum ImGuiPlotType
{
ImGuiPlotType_Lines,
ImGuiPlotType_Histogram
};
enum ImGuiDataType
{
ImGuiDataType_Int,
ImGuiDataType_Float,
ImGuiDataType_Float2
};
enum ImGuiDir
{
ImGuiDir_None = -1,
ImGuiDir_Left = 0,
ImGuiDir_Right = 1,
ImGuiDir_Up = 2,
ImGuiDir_Down = 3,
ImGuiDir_Count_
};
// 2D axis aligned bounding-box
// NB: we can't rely on ImVec2 math operators being available here
struct IMGUI_API ImRect
{
ImVec2 Min; // Upper-left
ImVec2 Max; // Lower-right
ImRect() : Min(FLT_MAX, FLT_MAX), Max(-FLT_MAX, -FLT_MAX) {}
ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); }
ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
float GetWidth() const { return Max.x - Min.x; }
float GetHeight() const { return Max.y - Min.y; }
ImVec2 GetTL() const { return Min; } // Top-left
ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right
ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left
ImVec2 GetBR() const { return Max; } // Bottom-right
bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; }
bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x < Max.x && r.Max.y < Max.y; }
bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; }
void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; }
void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; }
void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; }
void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; }
void Translate(const ImVec2& v) { Min.x += v.x; Min.y += v.y; Max.x += v.x; Max.y += v.y; }
void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
void FixInverted() { if (Min.x > Max.x) ImSwap(Min.x, Max.x); if (Min.y > Max.y) ImSwap(Min.y, Max.y); }
bool IsFinite() const { return Min.x != FLT_MAX; }
};
// Stacked color modifier, backup of modified data so we can restore it
struct ImGuiColMod
{
ImGuiCol Col;
ImVec4 BackupValue;
};
// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
struct ImGuiStyleMod
{
ImGuiStyleVar VarIdx;
union { int BackupInt[2]; float BackupFloat[2]; };
ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; }
ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; }
ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; }
};
// Stacked data for BeginGroup()/EndGroup()
struct ImGuiGroupData
{
ImVec2 BackupCursorPos;
ImVec2 BackupCursorMaxPos;
float BackupIndentX;
float BackupGroupOffsetX;
float BackupCurrentLineHeight;
float BackupCurrentLineTextBaseOffset;
float BackupLogLinePosY;
bool BackupActiveIdIsAlive;
bool AdvanceCursor;
};
// Simple column measurement currently used for MenuItem() only. This is very short-sighted/throw-away code and NOT a generic helper.
struct IMGUI_API ImGuiMenuColumns
{
int Count;
float Spacing;
float Width, NextWidth;
float Pos[4], NextWidths[4];
ImGuiMenuColumns();
void Update(int count, float spacing, bool clear);
float DeclColumns(float w0, float w1, float w2);
float CalcExtraSpace(float avail_w);
};
// Internal state of the currently focused/edited text input box
struct IMGUI_API ImGuiTextEditState
{
ImGuiID Id; // widget id owning the text state
ImVector<ImWchar> Text; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
ImVector<char> InitialText; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
ImVector<char> TempTextBuffer;
int CurLenA, CurLenW; // we need to maintain our buffer length in both UTF-8 and wchar format.
int BufSizeA; // end-user buffer size
float ScrollX;
ImGuiStb::STB_TexteditState StbState;
float CursorAnim;
bool CursorFollow;
bool SelectedAllMouseLock;
ImGuiTextEditState() { memset(this, 0, sizeof(*this)); }
void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
void CursorClamp() { StbState.cursor = ImMin(StbState.cursor, CurLenW); StbState.select_start = ImMin(StbState.select_start, CurLenW); StbState.select_end = ImMin(StbState.select_end, CurLenW); }
bool HasSelection() const { return StbState.select_start != StbState.select_end; }
void ClearSelection() { StbState.select_start = StbState.select_end = StbState.cursor; }
void SelectAll() { StbState.select_start = 0; StbState.cursor = StbState.select_end = CurLenW; StbState.has_preferred_x = false; }
void OnKeyPressed(int key);
};
// Data saved in imgui.ini file
struct ImGuiWindowSettings
{
char* Name;
ImGuiID Id;
ImVec2 Pos;
ImVec2 Size;
bool Collapsed;
ImGuiWindowSettings() { Name = NULL; Id = 0; Pos = Size = ImVec2(0, 0); Collapsed = false; }
};
struct ImGuiSettingsHandler
{
const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
ImGuiID TypeHash; // == ImHash(TypeName, 0, 0)
void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name);
void(*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line);
void(*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf);
void* UserData;
ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); }
};
// Mouse cursor data (used when io.MouseDrawCursor is set)
struct ImGuiMouseCursorData
{
ImGuiMouseCursor Type;
ImVec2 HotOffset;
ImVec2 Size;
ImVec2 TexUvMin[2];
ImVec2 TexUvMax[2];
};
// Storage for current popup stack
struct ImGuiPopupRef
{
ImGuiID PopupId; // Set on OpenPopup()
ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
ImGuiWindow* ParentWindow; // Set on OpenPopup()
int OpenFrameCount; // Set on OpenPopup()
ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differenciate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
};
struct ImGuiColumnData
{
float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
float OffsetNormBeforeResize;
ImGuiColumnsFlags Flags; // Not exposed
ImRect ClipRect;
ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = 0; }
};
struct ImGuiColumnsSet
{
ImGuiID ID;
ImGuiColumnsFlags Flags;
bool IsFirstFrame;
bool IsBeingResized;
int Current;
int Count;
float MinX, MaxX;
float StartPosY;
float StartMaxPosX; // Backup of CursorMaxPos
float CellMinY, CellMaxY;
ImVector<ImGuiColumnData> Columns;
ImGuiColumnsSet() { Clear(); }
void Clear()
{
ID = 0;
Flags = 0;
IsFirstFrame = false;
IsBeingResized = false;
Current = 0;
Count = 1;
MinX = MaxX = 0.0f;
StartPosY = 0.0f;
StartMaxPosX = 0.0f;
CellMinY = CellMaxY = 0.0f;
Columns.clear();
}
};
struct IMGUI_API ImDrawListSharedData
{
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
float FontSize; // Current/default font size (optional, for simplified AddText overload)
float CurveTessellationTol;
ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
// Const data
// FIXME: Bake rounded corners fill/borders in atlas
ImVec2 CircleVtx12[12];
ImDrawListSharedData();
};
struct ImDrawDataBuilder
{
ImVector<ImDrawList*> Layers[2]; // Global layers for: regular, tooltip
void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); }
void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); }
IMGUI_API void FlattenIntoSingleLayer();
};
// Storage for SetNexWindow** functions
struct ImGuiNextWindowData
{
ImGuiCond PosCond;
ImGuiCond SizeCond;
ImGuiCond ContentSizeCond;
ImGuiCond CollapsedCond;
ImGuiCond SizeConstraintCond;
ImGuiCond FocusCond;
ImVec2 PosVal;
ImVec2 PosPivotVal;
ImVec2 SizeVal;
ImVec2 ContentSizeVal;
bool CollapsedVal;
ImRect SizeConstraintRect; // Valid if 'SetNextWindowSizeConstraint' is true
ImGuiSizeCallback SizeCallback;
void* SizeCallbackUserData;
ImGuiNextWindowData()
{
PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = 0;
PosVal = PosPivotVal = SizeVal = ImVec2(0.0f, 0.0f);
ContentSizeVal = ImVec2(0.0f, 0.0f);
CollapsedVal = false;
SizeConstraintRect = ImRect();
SizeCallback = NULL;
SizeCallbackUserData = NULL;
}
void Clear()
{
PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = 0;
}
};
// Main state for ImGui
struct ImGuiContext
{
bool Initialized;
ImGuiIO IO;
ImGuiStyle Style;
ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
ImDrawListSharedData DrawListSharedData;
float Time;
int FrameCount;
int FrameCountEnded;
int FrameCountRendered;
ImVector<ImGuiWindow*> Windows;
ImVector<ImGuiWindow*> WindowsSortBuffer;
ImVector<ImGuiWindow*> CurrentWindowStack;
ImGuiStorage WindowsById;
int WindowsActiveCount;
ImGuiWindow* CurrentWindow; // Being drawn into
ImGuiWindow* NavWindow; // Nav/focused window for navigation
ImGuiWindow* HoveredWindow; // Will catch mouse inputs
ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)
ImGuiID HoveredId; // Hovered widget
bool HoveredIdAllowOverlap;
ImGuiID HoveredIdPreviousFrame;
float HoveredIdTimer;
ImGuiID ActiveId; // Active widget
ImGuiID ActiveIdPreviousFrame;
float ActiveIdTimer;
bool ActiveIdIsAlive; // Active widget has been seen this frame
bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
ImGuiWindow* ActiveIdWindow;
ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow.
ImGuiID MovingWindowMoveId; // == MovingWindow->MoveId
ImVector<ImGuiColMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor()
ImVector<ImGuiStyleMod> StyleModifiers; // Stack for PushStyleVar()/PopStyleVar()
ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont()
ImVector<ImGuiPopupRef> OpenPopupStack; // Which popups are open (persistent)
ImVector<ImGuiPopupRef> CurrentPopupStack; // Which level of BeginPopup() we are in (reset every frame)
ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
bool NextTreeNodeOpenVal; // Storage for SetNextTreeNode** functions
ImGuiCond NextTreeNodeOpenCond;
// Render
ImDrawData DrawData; // Main ImDrawData instance to pass render information to the user
ImDrawDataBuilder DrawDataBuilder;
float ModalWindowDarkeningRatio;
ImDrawList OverlayDrawList; // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays
ImGuiMouseCursor MouseCursor;
ImGuiMouseCursorData MouseCursorData[ImGuiMouseCursor_Count_];
// Drag and Drop
bool DragDropActive;
ImGuiDragDropFlags DragDropSourceFlags;
int DragDropMouseButton;
ImGuiPayload DragDropPayload;
ImRect DragDropTargetRect;
ImGuiID DragDropTargetId;
float DragDropAcceptIdCurrRectSurface;
ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)
ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source
ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly
unsigned char DragDropPayloadBufLocal[8];
// Widget state
ImGuiTextEditState InputTextState;
ImFont InputTextPasswordFont;
ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
ImVec4 ColorPickerRef;
float DragCurrentValue; // Currently dragged value, always float, not rounded by end-user precision settings
ImVec2 DragLastMouseDelta;
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
float DragSpeedScaleSlow;
float DragSpeedScaleFast;
ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
int TooltipOverrideCount;
ImVector<char> PrivateClipboard; // If no custom clipboard handler is defined
ImVec2 OsImePosRequest, OsImePosSet; // Cursor position request & last passed to the OS Input Method Editor
// Settings
float SettingsDirtyTimer; // Save .ini Settings on disk when time reaches zero
ImVector<ImGuiWindowSettings> SettingsWindows; // .ini settings for ImGuiWindow
ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
// Logging
bool LogEnabled;
FILE* LogFile; // If != NULL log to stdout/ file
ImGuiTextBuffer* LogClipboard; // Else log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
int LogStartDepth;
int LogAutoExpandMaxDepth;
// Misc
float FramerateSecPerFrame[120]; // calculate estimate of framerate for user
int FramerateSecPerFrameIdx;
float FramerateSecPerFrameAccum;
int WantCaptureMouseNextFrame; // explicit capture via CaptureInputs() sets those flags
int WantCaptureKeyboardNextFrame;
int WantTextInputNextFrame;
char TempBuffer[1024 * 3 + 1]; // temporary text buffer
ImGuiContext() : OverlayDrawList(NULL)
{
Initialized = false;
Font = NULL;
FontSize = FontBaseSize = 0.0f;
Time = 0.0f;
FrameCount = 0;
FrameCountEnded = FrameCountRendered = -1;
WindowsActiveCount = 0;
CurrentWindow = NULL;
NavWindow = NULL;
HoveredWindow = NULL;
HoveredRootWindow = NULL;
HoveredId = 0;
HoveredIdAllowOverlap = false;
HoveredIdPreviousFrame = 0;
HoveredIdTimer = 0.0f;
ActiveId = 0;
ActiveIdPreviousFrame = 0;
ActiveIdTimer = 0.0f;
ActiveIdIsAlive = false;
ActiveIdIsJustActivated = false;
ActiveIdAllowOverlap = false;
ActiveIdClickOffset = ImVec2(-1, -1);
ActiveIdWindow = NULL;
MovingWindow = NULL;
MovingWindowMoveId = 0;
NextTreeNodeOpenVal = false;
NextTreeNodeOpenCond = 0;
ModalWindowDarkeningRatio = 0.0f;
OverlayDrawList._Data = &DrawListSharedData;
OverlayDrawList._OwnerName = xorstr("##Overlay"); // Give it a name for debugging
MouseCursor = ImGuiMouseCursor_Arrow;
memset(MouseCursorData, 0, sizeof(MouseCursorData));
DragDropActive = false;
DragDropSourceFlags = 0;
DragDropMouseButton = -1;
DragDropTargetId = 0;
DragDropAcceptIdCurrRectSurface = 0.0f;
DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
DragDropAcceptFrameCount = -1;
memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
ScalarAsInputTextId = 0;
ColorEditOptions = ImGuiColorEditFlags__OptionsDefault;
DragCurrentValue = 0.0f;
DragLastMouseDelta = ImVec2(0.0f, 0.0f);
DragSpeedDefaultRatio = 1.0f / 100.0f;
DragSpeedScaleSlow = 1.0f / 100.0f;
DragSpeedScaleFast = 10.0f;
ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);
TooltipOverrideCount = 0;
OsImePosRequest = OsImePosSet = ImVec2(-1.0f, -1.0f);
SettingsDirtyTimer = 0.0f;
LogEnabled = false;
LogFile = NULL;
LogClipboard = NULL;
LogStartDepth = 0;
LogAutoExpandMaxDepth = 2;
memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
FramerateSecPerFrameIdx = 0;
FramerateSecPerFrameAccum = 0.0f;
WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1;
memset(TempBuffer, 0, sizeof(TempBuffer));
}
};
// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
enum ImGuiItemFlags_
{
ImGuiItemFlags_AllowKeyboardFocus = 1 << 0, // true
ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
ImGuiItemFlags_Disabled = 1 << 2, // false // FIXME-WIP: Disable interactions but doesn't affect visuals. Should be: grey out and disable interactions with widgets that affect data + view widgets (WIP)
//ImGuiItemFlags_NoNav = 1 << 3, // false
//ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false
ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window
ImGuiItemFlags_Default_ = ImGuiItemFlags_AllowKeyboardFocus
};
// Transient per-window data, reset at the beginning of the frame
// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiDrawContext is quite tenuous and could be reconsidered.
struct IMGUI_API ImGuiDrawContext
{
ImVec2 CursorPos;
ImVec2 CursorPosPrevLine;
ImVec2 CursorStartPos;
ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Turned into window->SizeContents at the beginning of next frame
float CurrentLineHeight;
float CurrentLineTextBaseOffset;
float PrevLineHeight;
float PrevLineTextBaseOffset;
float LogLinePosY;
int TreeDepth;
ImGuiID LastItemId;
ImRect LastItemRect;
bool LastItemRectHoveredRect;
bool MenuBarAppending;
float MenuBarOffsetX;
ImVector<ImGuiWindow*> ChildWindows;
ImGuiStorage* StateStorage;
ImGuiLayoutType LayoutType;
// We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.
ImGuiItemFlags ItemFlags; // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default]
float ItemWidth; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window
float TextWrapPos; // == TextWrapPosStack.back() [empty == -1.0f]
ImVector<ImGuiItemFlags>ItemFlagsStack;
ImVector<float> ItemWidthStack;
ImVector<float> TextWrapPosStack;
ImVector<ImGuiGroupData>GroupStack;
int StackSizesBackup[6]; // Store size of various stacks for asserting
float IndentX; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
float GroupOffsetX;
float ColumnsOffsetX; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
ImGuiColumnsSet* ColumnsSet; // Current columns set
ImGuiDrawContext()
{
CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);
CurrentLineHeight = PrevLineHeight = 0.0f;
CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f;
LogLinePosY = -1.0f;
TreeDepth = 0;
LastItemId = 0;
LastItemRect = ImRect();
LastItemRectHoveredRect = false;
MenuBarAppending = false;
MenuBarOffsetX = 0.0f;
StateStorage = NULL;
LayoutType = ImGuiLayoutType_Vertical;
ItemWidth = 0.0f;
ItemFlags = ImGuiItemFlags_Default_;
TextWrapPos = -1.0f;
memset(StackSizesBackup, 0, sizeof(StackSizesBackup));
IndentX = 0.0f;
GroupOffsetX = 0.0f;
ColumnsOffsetX = 0.0f;
ColumnsSet = NULL;
}
};
// Windows data
struct IMGUI_API ImGuiWindow
{
char* Name;
ImGuiID ID; // == ImHash(Name)
ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_
ImVec2 PosFloat;
ImVec2 Pos; // Position rounded-up to nearest pixel
ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
ImVec2 SizeFull; // Size when non collapsed
ImVec2 SizeFullAtLastBegin; // Copy of SizeFull at the end of Begin. This is the reference value we'll use on the next frame to decide if we need scrollbars.
ImVec2 SizeContents; // Size of contents (== extents reach of the drawing cursor) from previous frame. Include decoration, window title, border, menu, etc.
ImVec2 SizeContentsExplicit; // Size of contents explicitly set by the user via SetNextWindowContentSize()
ImRect ContentsRegionRect; // Maximum visible content position in window coordinates. ~~ (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis
ImVec2 WindowPadding; // Window padding at the time of begin.
float WindowRounding; // Window rounding at the time of begin.
float WindowBorderSize; // Window border size at the time of begin.
ImGuiID MoveId; // == window->GetID("#MOVE")
ImVec2 Scroll;
ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
bool ScrollbarX, ScrollbarY;
ImVec2 ScrollbarSizes;
bool Active; // Set to true on Begin(), unless Collapsed
bool WasActive;
bool WriteAccessed; // Set to true when any widget access the current window
bool Collapsed; // Set when collapsing window to become only title-bar
bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
bool CloseButton; // Set when the window has a close button (p_open != NULL)
int BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0.
int BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues.
int BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
int AutoFitFramesX, AutoFitFramesY;
bool AutoFitOnlyGrows;
int AutoFitChildAxises;
ImGuiDir AutoPosLastDirection;
int HiddenFrames;
ImGuiCond SetWindowPosAllowFlags; // store condition flags for next SetWindowPos() call.
ImGuiCond SetWindowSizeAllowFlags; // store condition flags for next SetWindowSize() call.
ImGuiCond SetWindowCollapsedAllowFlags; // store condition flags for next SetWindowCollapsed() call.
ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right.
ImGuiDrawContext DC; // Temporary per-window data, reset at the beginning of the frame
ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack
ImRect ClipRect; // = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.
ImRect WindowRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window.
ImRect InnerRect;
int LastFrameActive;
float ItemWidthDefault;
ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items
ImGuiStorage StateStorage;
ImVector<ImGuiColumnsSet> ColumnsStorage;
float FontWindowScale; // Scale multiplier per-window
ImDrawList* DrawList;
ImGuiWindow* ParentWindow; // If we are a child _or_ popup window, this is pointing to our parent. Otherwise NULL.
ImGuiWindow* RootWindow; // Generally point to ourself. If we are a child window, this is pointing to the first non-child parent window.
ImGuiWindow* RootNonPopupWindow; // Generally point to ourself. Used to display TitleBgActive color and for selecting which window to use for NavWindowing
// Navigation / Focus
int FocusIdxAllCounter; // Start at -1 and increase as assigned via FocusItemRegister()
int FocusIdxTabCounter; // (same, but only count widgets which you can Tab through)
int FocusIdxAllRequestCurrent; // Item being requested for focus
int FocusIdxTabRequestCurrent; // Tab-able item being requested for focus
int FocusIdxAllRequestNext; // Item being requested for focus, for next update (relies on layout to be stable between the frame pressing TAB and the next frame)
int FocusIdxTabRequestNext; // "
public:
ImGuiWindow(ImGuiContext* context, const char* name);
~ImGuiWindow();
ImGuiID GetID(const char* str, const char* str_end = NULL);
ImGuiID GetID(const void* ptr);
ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL);
ImGuiID GetIDFromRectangle(const ImRect& r_abs);
// We don't use g.FontSize because the window may be != g.CurrentWidow.
ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); }
float CalcFontSize() const { return GImGui->FontBaseSize * FontWindowScale; }
float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; }
ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
float MenuBarHeight() const { return (Flags & ImGuiWindowFlags_MenuBar) ? CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; }
ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
};
// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data.
struct ImGuiItemHoveredDataBackup
{
ImGuiID LastItemId;
ImRect LastItemRect;
bool LastItemRectHoveredRect;
ImGuiItemHoveredDataBackup() { Backup(); }
void Backup() { ImGuiWindow* window = GImGui->CurrentWindow; LastItemId = window->DC.LastItemId; LastItemRect = window->DC.LastItemRect; LastItemRectHoveredRect = window->DC.LastItemRectHoveredRect; }
void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemRect = LastItemRect; window->DC.LastItemRectHoveredRect = LastItemRectHoveredRect; }
};
//-----------------------------------------------------------------------------
// Internal API
// No guarantee of forward compatibility here.
//-----------------------------------------------------------------------------
namespace ImGui
{
// We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
// If this ever crash because g.CurrentWindow is NULL it means that either
// - ImGui::NewFrame() has never been called, which is illegal.
// - You are calling ImGui functions after ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
IMGUI_API void FocusWindow(ImGuiWindow* window);
IMGUI_API void BringWindowToFront(ImGuiWindow* window);
IMGUI_API void BringWindowToBack(ImGuiWindow* window);
IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
IMGUI_API void Initialize();
IMGUI_API void MarkIniSettingsDirty();
IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);
IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
IMGUI_API void ClearActiveID();
IMGUI_API void SetHoveredID(ImGuiID id);
IMGUI_API ImGuiID GetHoveredID();
IMGUI_API void KeepAliveID(ImGuiID id);
IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f);
IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);
IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id);
IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id);
IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged);
IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true); // Return true if focus is requested
IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);
IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y);
IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
IMGUI_API void PushMultiItemsWidths(int components, float width_full = 0.0f);
IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled);
IMGUI_API void PopItemFlag();
IMGUI_API void OpenPopupEx(ImGuiID id);
IMGUI_API void ClosePopup(ImGuiID id);
IMGUI_API bool IsPopupOpen(ImGuiID id);
IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);
IMGUI_API int CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate);
IMGUI_API void Scrollbar(ImGuiLayoutType direction);
IMGUI_API void VerticalSeparator(); // Vertical separator, for menu bars (use current line height). not exposed because it is misleading what it doesn't have an effect on regular layout.
IMGUI_API bool SplitterBehavior(ImGuiID id, const ImRect& bb, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f);
IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
IMGUI_API void ClearDragDrop();
IMGUI_API bool IsDragDropPayloadBeingAccepted();
// FIXME-WIP: New Columns API
IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiColumnsFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().
IMGUI_API void EndColumns(); // close columns
IMGUI_API void PushColumnClipRect(int column_index = -1);
// NB: All position are in absolute pixels coordinates (never using window coordinates internally)
// AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.
IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, int rounding_corners_flags = ~0);
IMGUI_API void RenderTriangle(ImVec2 pos, ImGuiDir dir, float scale = 1.0f);
IMGUI_API void RenderBullet(ImVec2 pos);
IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col, float sz);
IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0);
IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos, float radius);
IMGUI_API bool ArrowButton(ImGuiID id, ImGuiDir dir, ImVec2 padding, ImGuiButtonFlags flags = 0);
IMGUI_API bool SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_min, float v_max, float power, int decimal_precision, ImGuiSliderFlags flags = 0, ImVec4 color = ImVec4(0, 0, 0, 0), ImVec2 valuesize = ImVec2(0, 0), const char* label = NULL, char* value = NULL);
IMGUI_API bool SliderFloatN(const char* label, float* v, int components, float v_min, float v_max, const char* display_format, float power);
IMGUI_API bool SliderIntN(const char* label, int* v, int components, int v_min, int v_max, const char* display_format);
IMGUI_API bool DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_speed, float v_min, float v_max, int decimal_precision, float power);
IMGUI_API bool DragFloatN(const char* label, float* v, int components, float v_speed, float v_min, float v_max, const char* display_format, float power);
IMGUI_API bool DragIntN(const char* label, int* v, int components, float v_speed, int v_min, int v_max, const char* display_format);
IMGUI_API bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
IMGUI_API bool InputFloatN(const char* label, float* v, int components, int decimal_precision, ImGuiInputTextFlags extra_flags);
IMGUI_API bool InputIntN(const char* label, int* v, int components, ImGuiInputTextFlags extra_flags);
IMGUI_API bool InputScalarEx(const char* label, ImGuiDataType data_type, void* data_ptr, void* step_ptr, void* step_fast_ptr, const char* scalar_format, ImGuiInputTextFlags extra_flags);
IMGUI_API bool InputScalarAsWidgetReplacement(const ImRect& aabb, const char* label, ImGuiDataType data_type, void* data_ptr, ImGuiID id, int decimal_precision);
IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags);
IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging
IMGUI_API void TreePushRawID(ImGuiID id);
IMGUI_API void PlotEx(ImGuiPlotType plot_type, const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size);
IMGUI_API int ParseFormatPrecision(const char* fmt, int default_value);
IMGUI_API float RoundScalar(float value, int decimal_precision);
// Shade functions
IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
IMGUI_API void ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x);
IMGUI_API void ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
} // namespace ImGui
// ImFontAtlas internals
IMGUI_API bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc);
IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
#ifdef __clang__
#pragma clang diagnostic pop
#endif
#ifdef _MSC_VER
#pragma warning (pop)
#endif

@ -0,0 +1,238 @@
/*
* Copyright 2017 - 2018 Justas Masiulis
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef JM_XORSTR_HPP
#define JM_XORSTR_HPP
#include <immintrin.h>
#include <cstdint>
#include <cstddef>
#include <utility>
#define JM_XORSTR_DISABLE_AVX_INTRINSICS
#define xorstr_(str) \
::jm::make_xorstr( \
[]() { return str; }, \
std::make_index_sequence<sizeof(str) / sizeof(*str)>{}, \
std::make_index_sequence<::jm::detail::_buffer_size<sizeof(str)>()>{})
#define xorstr(str) xorstr_(str).crypt_get()
#ifdef _MSC_VER
#define XORSTR_FORCEINLINE __forceinline
#else
#define XORSTR_FORCEINLINE __attribute__((always_inline))
#endif
// you can define this macro to get possibly faster code on gcc/clang
// at the expense of constants being put into data section.
#if !defined(XORSTR_ALLOW_DATA)
// MSVC - no volatile
// GCC and clang - volatile everywhere
#if defined(__clang__) || defined(__GNUC__)
#define XORSTR_VOLATILE volatile
#endif
#endif
#ifndef XORSTR_VOLATILE
#define XORSTR_VOLATILE
#endif
namespace jm {
namespace detail {
template<std::size_t S>
struct unsigned_;
template<>
struct unsigned_<1> {
using type = std::uint8_t;
};
template<>
struct unsigned_<2> {
using type = std::uint16_t;
};
template<>
struct unsigned_<4> {
using type = std::uint32_t;
};
template<auto C, auto...>
struct pack_value_type {
using type = decltype(C);
};
template<std::size_t Size>
constexpr std::size_t _buffer_size() {
return ((Size / 16) + (Size % 16 != 0)) * 2;
}
template<auto... Cs>
struct tstring_ {
using value_type = typename pack_value_type<Cs...>::type;
constexpr static std::size_t size = sizeof...(Cs);
constexpr static value_type str[size] = { Cs... };
constexpr static std::size_t buffer_size = _buffer_size<sizeof(str)>();
constexpr static std::size_t buffer_align =
#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS
((sizeof(str) > 16) ? 32 : 16);
#else
16;
#endif
};
template<std::size_t I, std::uint64_t K>
struct _ki {
constexpr static std::size_t idx = I;
constexpr static std::uint64_t key = K;
};
template<std::uint32_t Seed>
constexpr std::uint32_t key4() noexcept {
std::uint32_t value = Seed;
for (char c : __TIME__)
value = static_cast<std::uint32_t>((value ^ c) * 16777619ull);
return value;
}
template<std::size_t S>
constexpr std::uint64_t key8() {
constexpr auto first_part = key4<2166136261 + S>();
constexpr auto second_part = key4<first_part>();
return (static_cast<std::uint64_t>(first_part) << 32) | second_part;
}
// clang and gcc try really hard to place the constants in data
// sections. to counter that there was a need to create an intermediate
// constexpr string and then copy it into a non constexpr container with
// volatile storage so that the constants would be placed directly into
// code.
template<class T, std::uint64_t... Keys>
struct string_storage {
std::uint64_t storage[T::buffer_size];
XORSTR_FORCEINLINE constexpr string_storage() noexcept : storage{ Keys... } {
using cast_type =
typename unsigned_<sizeof(typename T::value_type)>::type;
constexpr auto value_size = sizeof(typename T::value_type);
// puts the string into 64 bit integer blocks in a constexpr
// fashion
for (std::size_t i = 0; i < T::size; ++i)
storage[i / (8 / value_size)] ^=
(std::uint64_t{ static_cast<cast_type>(T::str[i]) }
<< ((i % (8 / value_size)) * 8 * value_size));
}
};
} // namespace detail
template<class T, class... Keys>
class xor_string {
alignas(T::buffer_align) std::uint64_t _storage[T::buffer_size];
// _single functions needed because MSVC crashes without them
XORSTR_FORCEINLINE void _crypt_256_single(const std::uint64_t *keys,
std::uint64_t *storage) noexcept
{
_mm256_store_si256(
reinterpret_cast<__m256i *>(storage),
_mm256_xor_si256(
_mm256_load_si256(reinterpret_cast<const __m256i *>(storage)),
_mm256_load_si256(reinterpret_cast<const __m256i *>(keys))));
}
template<std::size_t... Idxs>
XORSTR_FORCEINLINE void _crypt_256(const std::uint64_t *keys,
std::index_sequence<Idxs...>) noexcept {
(_crypt_256_single(keys + Idxs * 4, _storage + Idxs * 4), ...);
}
XORSTR_FORCEINLINE void _crypt_128_single(const std::uint64_t *keys,
std::uint64_t *storage) noexcept {
_mm_store_si128(
reinterpret_cast<__m128i *>(storage),
_mm_xor_si128(_mm_load_si128(reinterpret_cast<const __m128i *>(storage)),
_mm_load_si128(reinterpret_cast<const __m128i *>(keys))));
}
template<std::size_t... Idxs>
XORSTR_FORCEINLINE void _crypt_128(const std::uint64_t *keys,
std::index_sequence<Idxs...>) noexcept {
(_crypt_128_single(keys + Idxs * 2, _storage + Idxs * 2), ...);
}
// loop generates vectorized code which places constants in data dir
XORSTR_FORCEINLINE constexpr void _copy() noexcept {
constexpr detail::string_storage<T, Keys::key...> storage;
static_cast<void>(std::initializer_list<std::uint64_t>{
(const_cast<XORSTR_VOLATILE std::uint64_t *>(_storage))[Keys::idx] =
storage.storage[Keys::idx]... });
}
public:
using value_type = typename T::value_type;
using size_type = std::size_t;
using pointer = value_type *;
using const_pointer = const pointer;
XORSTR_FORCEINLINE xor_string() noexcept { _copy(); }
XORSTR_FORCEINLINE constexpr size_type size() const noexcept {
return T::size - 1;
}
XORSTR_FORCEINLINE void crypt() noexcept {
alignas(T::buffer_align) std::uint64_t keys[T::buffer_size];
static_cast<void>(std::initializer_list<std::uint64_t>{
(const_cast<XORSTR_VOLATILE std::uint64_t *>(keys))[Keys::idx] =
Keys::key... });
_copy();
#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS
_crypt_256(keys, std::make_index_sequence<T::buffer_size / 4>{});
if constexpr (T::buffer_size % 4 != 0)
_crypt_128(keys, std::index_sequence<T::buffer_size / 2 - 1>{});
#else
_crypt_128(keys, std::make_index_sequence<T::buffer_size / 2>{});
#endif
}
XORSTR_FORCEINLINE const_pointer get() const noexcept {
return reinterpret_cast<const_pointer>(_storage);
}
XORSTR_FORCEINLINE const_pointer crypt_get() noexcept {
crypt();
return reinterpret_cast<const_pointer>(_storage);
}
};
template<class Tstr, std::size_t... StringIndices, std::size_t... KeyIndices>
XORSTR_FORCEINLINE constexpr auto
make_xorstr(Tstr str_lambda,
std::index_sequence<StringIndices...>,
std::index_sequence<KeyIndices...>) noexcept {
return xor_string<detail::tstring_<str_lambda()[StringIndices]...>,
detail::_ki<KeyIndices, detail::key8<KeyIndices>()>...>{};
}
} // namespace jm
#endif // include guard

@ -0,0 +1,588 @@
// stb_rect_pack.h - v0.10 - public domain - rectangle packing
// Sean Barrett 2014
//
// Useful for e.g. packing rectangular textures into an atlas.
// Does not do rotation.
//
// Not necessarily the awesomest packing method, but better than
// the totally naive one in stb_truetype (which is primarily what
// this is meant to replace).
//
// Has only had a few tests run, may have issues.
//
// More docs to come.
//
// No memory allocations; uses qsort() and assert() from stdlib.
// Can override those by defining STBRP_SORT and STBRP_ASSERT.
//
// This library currently uses the Skyline Bottom-Left algorithm.
//
// Please note: better rectangle packers are welcome! Please
// implement them to the same API, but with a different init
// function.
//
// Credits
//
// Library
// Sean Barrett
// Minor features
// Martins Mozeiko
// Bugfixes / warning fixes
// Jeremy Jaussaud
//
// Version history:
//
// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
// 0.09 (2016-08-27) fix compiler warnings
// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)
// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0)
// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort
// 0.05: added STBRP_ASSERT to allow replacing assert
// 0.04: fixed minor bug in STBRP_LARGE_RECTS support
// 0.01: initial release
//
// LICENSE
//
// This software is dual-licensed to the public domain and under the following
// license: you are granted a perpetual, irrevocable license to copy, modify,
// publish, and distribute this file as you see fit.
//////////////////////////////////////////////////////////////////////////////
//
// INCLUDE SECTION
//
#ifndef STB_INCLUDE_STB_RECT_PACK_H
#define STB_INCLUDE_STB_RECT_PACK_H
#define STB_RECT_PACK_VERSION 1
#ifdef STBRP_STATIC
#define STBRP_DEF static
#else
#define STBRP_DEF extern
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct stbrp_context stbrp_context;
typedef struct stbrp_node stbrp_node;
typedef struct stbrp_rect stbrp_rect;
#ifdef STBRP_LARGE_RECTS
typedef int stbrp_coord;
#else
typedef unsigned short stbrp_coord;
#endif
STBRP_DEF void stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects);
// Assign packed locations to rectangles. The rectangles are of type
// 'stbrp_rect' defined below, stored in the array 'rects', and there
// are 'num_rects' many of them.
//
// Rectangles which are successfully packed have the 'was_packed' flag
// set to a non-zero value and 'x' and 'y' store the minimum location
// on each axis (i.e. bottom-left in cartesian coordinates, top-left
// if you imagine y increasing downwards). Rectangles which do not fit
// have the 'was_packed' flag set to 0.
//
// You should not try to access the 'rects' array from another thread
// while this function is running, as the function temporarily reorders
// the array while it executes.
//
// To pack into another rectangle, you need to call stbrp_init_target
// again. To continue packing into the same rectangle, you can call
// this function again. Calling this multiple times with multiple rect
// arrays will probably produce worse packing results than calling it
// a single time with the full rectangle array, but the option is
// available.
struct stbrp_rect
{
// reserved for your use:
int id;
// input:
stbrp_coord w, h;
// output:
stbrp_coord x, y;
int was_packed; // non-zero if valid packing
}; // 16 bytes, nominally
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes);
// Initialize a rectangle packer to:
// pack a rectangle that is 'width' by 'height' in dimensions
// using temporary storage provided by the array 'nodes', which is 'num_nodes' long
//
// You must call this function every time you start packing into a new target.
//
// There is no "shutdown" function. The 'nodes' memory must stay valid for
// the following stbrp_pack_rects() call (or calls), but can be freed after
// the call (or calls) finish.
//
// Note: to guarantee best results, either:
// 1. make sure 'num_nodes' >= 'width'
// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1'
//
// If you don't do either of the above things, widths will be quantized to multiples
// of small integers to guarantee the algorithm doesn't run out of temporary storage.
//
// If you do #2, then the non-quantized algorithm will be used, but the algorithm
// may run out of temporary storage and be unable to pack some rectangles.
STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem);
// Optionally call this function after init but before doing any packing to
// change the handling of the out-of-temp-memory scenario, described above.
// If you call init again, this will be reset to the default (false).
STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic);
// Optionally select which packing heuristic the library should use. Different
// heuristics will produce better/worse results for different data sets.
// If you call init again, this will be reset to the default.
enum
{
STBRP_HEURISTIC_Skyline_default = 0,
STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default,
STBRP_HEURISTIC_Skyline_BF_sortHeight
};
//////////////////////////////////////////////////////////////////////////////
//
// the details of the following structures don't matter to you, but they must
// be visible so you can handle the memory allocations for them
struct stbrp_node
{
stbrp_coord x, y;
stbrp_node *next;
};
struct stbrp_context
{
int width;
int height;
int align;
int init_mode;
int heuristic;
int num_nodes;
stbrp_node *active_head;
stbrp_node *free_head;
stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2'
};
#ifdef __cplusplus
}
#endif
#endif
//////////////////////////////////////////////////////////////////////////////
//
// IMPLEMENTATION SECTION
//
#ifdef STB_RECT_PACK_IMPLEMENTATION
#ifndef STBRP_SORT
#include <stdlib.h>
#define STBRP_SORT qsort
#endif
#ifndef STBRP_ASSERT
#include <assert.h>
#define STBRP_ASSERT assert
#endif
#ifdef _MSC_VER
#define STBRP__NOTUSED(v) (void)(v)
#else
#define STBRP__NOTUSED(v) (void)sizeof(v)
#endif
enum
{
STBRP__INIT_skyline = 1
};
STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)
{
switch (context->init_mode) {
case STBRP__INIT_skyline:
STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
context->heuristic = heuristic;
break;
default:
STBRP_ASSERT(0);
}
}
STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)
{
if (allow_out_of_mem)
// if it's ok to run out of memory, then don't bother aligning them;
// this gives better packing, but may fail due to OOM (even though
// the rectangles easily fit). @TODO a smarter approach would be to only
// quantize once we've hit OOM, then we could get rid of this parameter.
context->align = 1;
else {
// if it's not ok to run out of memory, then quantize the widths
// so that num_nodes is always enough nodes.
//
// I.e. num_nodes * align >= width
// align >= width / num_nodes
// align = ceil(width/num_nodes)
context->align = (context->width + context->num_nodes - 1) / context->num_nodes;
}
}
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
{
int i;
#ifndef STBRP_LARGE_RECTS
STBRP_ASSERT(width <= 0xffff && height <= 0xffff);
#endif
for (i = 0; i < num_nodes - 1; ++i)
nodes[i].next = &nodes[i + 1];
nodes[i].next = NULL;
context->init_mode = STBRP__INIT_skyline;
context->heuristic = STBRP_HEURISTIC_Skyline_default;
context->free_head = &nodes[0];
context->active_head = &context->extra[0];
context->width = width;
context->height = height;
context->num_nodes = num_nodes;
stbrp_setup_allow_out_of_mem(context, 0);
// node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)
context->extra[0].x = 0;
context->extra[0].y = 0;
context->extra[0].next = &context->extra[1];
context->extra[1].x = (stbrp_coord)width;
#ifdef STBRP_LARGE_RECTS
context->extra[1].y = (1 << 30);
#else
context->extra[1].y = 65535;
#endif
context->extra[1].next = NULL;
}
// find minimum y position if it starts at x1
static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste)
{
stbrp_node *node = first;
int x1 = x0 + width;
int min_y, visited_width, waste_area;
STBRP__NOTUSED(c);
STBRP_ASSERT(first->x <= x0);
#if 0
// skip in case we're past the node
while (node->next->x <= x0)
++node;
#else
STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency
#endif
STBRP_ASSERT(node->x <= x0);
min_y = 0;
waste_area = 0;
visited_width = 0;
while (node->x < x1) {
if (node->y > min_y) {
// raise min_y higher.
// we've accounted for all waste up to min_y,
// but we'll now add more waste for everything we've visted
waste_area += visited_width * (node->y - min_y);
min_y = node->y;
// the first time through, visited_width might be reduced
if (node->x < x0)
visited_width += node->next->x - x0;
else
visited_width += node->next->x - node->x;
}
else {
// add waste area
int under_width = node->next->x - node->x;
if (under_width + visited_width > width)
under_width = width - visited_width;
waste_area += under_width * (min_y - node->y);
visited_width += under_width;
}
node = node->next;
}
*pwaste = waste_area;
return min_y;
}
typedef struct
{
int x, y;
stbrp_node **prev_link;
} stbrp__findresult;
static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height)
{
int best_waste = (1 << 30), best_x, best_y = (1 << 30);
stbrp__findresult fr;
stbrp_node **prev, *node, *tail, **best = NULL;
// align to multiple of c->align
width = (width + c->align - 1);
width -= width % c->align;
STBRP_ASSERT(width % c->align == 0);
node = c->active_head;
prev = &c->active_head;
while (node->x + width <= c->width) {
int y, waste;
y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);
if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL
// bottom left
if (y < best_y) {
best_y = y;
best = prev;
}
}
else {
// best-fit
if (y + height <= c->height) {
// can only use it if it first vertically
if (y < best_y || (y == best_y && waste < best_waste)) {
best_y = y;
best_waste = waste;
best = prev;
}
}
}
prev = &node->next;
node = node->next;
}
best_x = (best == NULL) ? 0 : (*best)->x;
// if doing best-fit (BF), we also have to try aligning right edge to each node position
//
// e.g, if fitting
//
// ____________________
// |____________________|
//
// into
//
// | |
// | ____________|
// |____________|
//
// then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned
//
// This makes BF take about 2x the time
if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) {
tail = c->active_head;
node = c->active_head;
prev = &c->active_head;
// find first node that's admissible
while (tail->x < width)
tail = tail->next;
while (tail) {
int xpos = tail->x - width;
int y, waste;
STBRP_ASSERT(xpos >= 0);
// find the left position that matches this
while (node->next->x <= xpos) {
prev = &node->next;
node = node->next;
}
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
if (y + height < c->height) {
if (y <= best_y) {
if (y < best_y || waste < best_waste || (waste == best_waste && xpos < best_x)) {
best_x = xpos;
STBRP_ASSERT(y <= best_y);
best_y = y;
best_waste = waste;
best = prev;
}
}
}
tail = tail->next;
}
}
fr.prev_link = best;
fr.x = best_x;
fr.y = best_y;
return fr;
}
static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height)
{
// find best position according to heuristic
stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);
stbrp_node *node, *cur;
// bail if:
// 1. it failed
// 2. the best node doesn't fit (we don't always check this)
// 3. we're out of memory
if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) {
res.prev_link = NULL;
return res;
}
// on success, create new node
node = context->free_head;
node->x = (stbrp_coord)res.x;
node->y = (stbrp_coord)(res.y + height);
context->free_head = node->next;
// insert the new node into the right starting point, and
// let 'cur' point to the remaining nodes needing to be
// stiched back in
cur = *res.prev_link;
if (cur->x < res.x) {
// preserve the existing one, so start testing with the next one
stbrp_node *next = cur->next;
cur->next = node;
cur = next;
}
else {
*res.prev_link = node;
}
// from here, traverse cur and free the nodes, until we get to one
// that shouldn't be freed
while (cur->next && cur->next->x <= res.x + width) {
stbrp_node *next = cur->next;
// move the current node to the free list
cur->next = context->free_head;
context->free_head = cur;
cur = next;
}
// stitch the list back in
node->next = cur;
if (cur->x < res.x + width)
cur->x = (stbrp_coord)(res.x + width);
#ifdef _DEBUG
cur = context->active_head;
while (cur->x < context->width) {
STBRP_ASSERT(cur->x < cur->next->x);
cur = cur->next;
}
STBRP_ASSERT(cur->next == NULL);
{
stbrp_node *L1 = NULL, *L2 = NULL;
int count = 0;
cur = context->active_head;
while (cur) {
L1 = cur;
cur = cur->next;
++count;
}
cur = context->free_head;
while (cur) {
L2 = cur;
cur = cur->next;
++count;
}
STBRP_ASSERT(count == context->num_nodes + 2);
}
#endif
return res;
}
static int rect_height_compare(const void *a, const void *b)
{
const stbrp_rect *p = (const stbrp_rect *)a;
const stbrp_rect *q = (const stbrp_rect *)b;
if (p->h > q->h)
return -1;
if (p->h < q->h)
return 1;
return (p->w > q->w) ? -1 : (p->w < q->w);
}
static int rect_width_compare(const void *a, const void *b)
{
const stbrp_rect *p = (const stbrp_rect *)a;
const stbrp_rect *q = (const stbrp_rect *)b;
if (p->w > q->w)
return -1;
if (p->w < q->w)
return 1;
return (p->h > q->h) ? -1 : (p->h < q->h);
}
static int rect_original_order(const void *a, const void *b)
{
const stbrp_rect *p = (const stbrp_rect *)a;
const stbrp_rect *q = (const stbrp_rect *)b;
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
}
#ifdef STBRP_LARGE_RECTS
#define STBRP__MAXVAL 0xffffffff
#else
#define STBRP__MAXVAL 0xffff
#endif
STBRP_DEF void stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
{
int i;
// we use the 'was_packed' field internally to allow sorting/unsorting
for (i = 0; i < num_rects; ++i) {
rects[i].was_packed = i;
#ifndef STBRP_LARGE_RECTS
STBRP_ASSERT(rects[i].w <= 0xffff && rects[i].h <= 0xffff);
#endif
}
// sort according to heuristic
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);
for (i = 0; i < num_rects; ++i) {
if (rects[i].w == 0 || rects[i].h == 0) {
rects[i].x = rects[i].y = 0; // empty rect needs no space
}
else {
stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
if (fr.prev_link) {
rects[i].x = (stbrp_coord)fr.x;
rects[i].y = (stbrp_coord)fr.y;
}
else {
rects[i].x = rects[i].y = STBRP__MAXVAL;
}
}
}
// unsort
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order);
// set was_packed flags
for (i = 0; i < num_rects; ++i)
rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL);
}
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,624 @@
#ifndef LAZY_IMPORTER_HPP
#define LAZY_IMPORTER_HPP
#define lazy_import(name) \
::li::detail::lazy_function<::li::detail::khash(#name), decltype(&name)>()
#define LI_FN_DEF(name) ::li::detail::lazy_function<::li::detail::khash(#name), name>()
#define LI_MODULE(name) ::li::detail::lazy_module<::li::detail::khash(name)>()
// NOTE only std::forward is used from this header.
// If there is a need to eliminate this dependency the function itself is very small.
#include <utility>
#include <cstddef>
#include <intrin.h>
#ifndef LAZY_IMPORTER_NO_FORCEINLINE
#if defined(_MSC_VER)
#define LAZY_IMPORTER_FORCEINLINE __forceinline
#elif defined(__GNUC__) && __GNUC__ > 3
#define LAZY_IMPORTER_FORCEINLINE inline __attribute__((__always_inline__))
#else
#define LAZY_IMPORTER_FORCEINLINE inline
#endif
#else
#define LAZY_IMPORTER_FORCEINLINE inline
#endif
#define LAZY_IMPORTER_TOLOWER(c) (c >= 'A' && c <= 'Z' ? (c | (1 << 5)) : c)
namespace li
{
namespace detail
{
template<class First, class Second>
struct pair
{
First first;
Second second;
};
namespace win
{
struct LIST_ENTRY_T
{
const char *Flink;
const char *Blink;
};
struct UNICODE_STRING_T
{
unsigned short Length;
unsigned short MaximumLength;
wchar_t *Buffer;
};
struct PEB_LDR_DATA_T
{
unsigned long Length;
unsigned long Initialized;
const char *SsHandle;
LIST_ENTRY_T InLoadOrderModuleList;
};
struct PEB_T
{
unsigned char Reserved1[2];
unsigned char BeingDebugged;
unsigned char Reserved2[1];
const char *Reserved3[2];
PEB_LDR_DATA_T *Ldr;
};
struct LDR_DATA_TABLE_ENTRY_T
{
LIST_ENTRY_T InLoadOrderLinks;
LIST_ENTRY_T InMemoryOrderLinks;
LIST_ENTRY_T InInitializationOrderLinks;
const char *DllBase;
const char *EntryPoint;
union
{
unsigned long SizeOfImage;
const char *_dummy;
};
UNICODE_STRING_T FullDllName;
UNICODE_STRING_T BaseDllName;
LAZY_IMPORTER_FORCEINLINE const LDR_DATA_TABLE_ENTRY_T *
load_order_next() const noexcept
{
return reinterpret_cast< const LDR_DATA_TABLE_ENTRY_T * >(
InLoadOrderLinks.Flink );
}
};
struct IMAGE_DOS_HEADER
{ // DOS .EXE header
unsigned short e_magic; // Magic number
unsigned short e_cblp; // Bytes on last page of file
unsigned short e_cp; // Pages in file
unsigned short e_crlc; // Relocations
unsigned short e_cparhdr; // Size of header in paragraphs
unsigned short e_minalloc; // Minimum extra paragraphs needed
unsigned short e_maxalloc; // Maximum extra paragraphs needed
unsigned short e_ss; // Initial (relative) SS value
unsigned short e_sp; // Initial SP value
unsigned short e_csum; // Checksum
unsigned short e_ip; // Initial IP value
unsigned short e_cs; // Initial (relative) CS value
unsigned short e_lfarlc; // File address of relocation table
unsigned short e_ovno; // Overlay number
unsigned short e_res[4]; // Reserved words
unsigned short e_oemid; // OEM identifier (for e_oeminfo)
unsigned short e_oeminfo; // OEM information; e_oemid specific
unsigned short e_res2[10]; // Reserved words
long e_lfanew; // File address of new exe header
};
struct IMAGE_FILE_HEADER
{
unsigned short Machine;
unsigned short NumberOfSections;
unsigned long TimeDateStamp;
unsigned long PointerToSymbolTable;
unsigned long NumberOfSymbols;
unsigned short SizeOfOptionalHeader;
unsigned short Characteristics;
};
struct IMAGE_EXPORT_DIRECTORY
{
unsigned long Characteristics;
unsigned long TimeDateStamp;
unsigned short MajorVersion;
unsigned short MinorVersion;
unsigned long Name;
unsigned long Base;
unsigned long NumberOfFunctions;
unsigned long NumberOfNames;
unsigned long AddressOfFunctions; // RVA from base of image
unsigned long AddressOfNames; // RVA from base of image
unsigned long AddressOfNameOrdinals; // RVA from base of image
};
struct IMAGE_DATA_DIRECTORY
{
unsigned long VirtualAddress;
unsigned long Size;
};
struct IMAGE_OPTIONAL_HEADER64
{
unsigned short Magic;
unsigned char MajorLinkerVersion;
unsigned char MinorLinkerVersion;
unsigned long SizeOfCode;
unsigned long SizeOfInitializedData;
unsigned long SizeOfUninitializedData;
unsigned long AddressOfEntryPoint;
unsigned long BaseOfCode;
unsigned long long ImageBase;
unsigned long SectionAlignment;
unsigned long FileAlignment;
unsigned short MajorOperatingSystemVersion;
unsigned short MinorOperatingSystemVersion;
unsigned short MajorImageVersion;
unsigned short MinorImageVersion;
unsigned short MajorSubsystemVersion;
unsigned short MinorSubsystemVersion;
unsigned long Win32VersionValue;
unsigned long SizeOfImage;
unsigned long SizeOfHeaders;
unsigned long CheckSum;
unsigned short Subsystem;
unsigned short DllCharacteristics;
unsigned long long SizeOfStackReserve;
unsigned long long SizeOfStackCommit;
unsigned long long SizeOfHeapReserve;
unsigned long long SizeOfHeapCommit;
unsigned long LoaderFlags;
unsigned long NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[16];
};
struct IMAGE_OPTIONAL_HEADER32
{
unsigned short Magic;
unsigned char MajorLinkerVersion;
unsigned char MinorLinkerVersion;
unsigned long SizeOfCode;
unsigned long SizeOfInitializedData;
unsigned long SizeOfUninitializedData;
unsigned long AddressOfEntryPoint;
unsigned long BaseOfCode;
unsigned long BaseOfData;
unsigned long ImageBase;
unsigned long SectionAlignment;
unsigned long FileAlignment;
unsigned short MajorOperatingSystemVersion;
unsigned short MinorOperatingSystemVersion;
unsigned short MajorImageVersion;
unsigned short MinorImageVersion;
unsigned short MajorSubsystemVersion;
unsigned short MinorSubsystemVersion;
unsigned long Win32VersionValue;
unsigned long SizeOfImage;
unsigned long SizeOfHeaders;
unsigned long CheckSum;
unsigned short Subsystem;
unsigned short DllCharacteristics;
unsigned long SizeOfStackReserve;
unsigned long SizeOfStackCommit;
unsigned long SizeOfHeapReserve;
unsigned long SizeOfHeapCommit;
unsigned long LoaderFlags;
unsigned long NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[16];
};
struct IMAGE_NT_HEADERS
{
unsigned long Signature;
IMAGE_FILE_HEADER FileHeader;
#ifdef _WIN64
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
#else
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
#endif
};
} // namespace win
// hashing stuff
struct hash_t
{
using value_type = unsigned long;
constexpr static value_type offset = 2166136261;
constexpr static value_type prime = 16777619;
constexpr static unsigned long long prime64 = prime;
LAZY_IMPORTER_FORCEINLINE constexpr static value_type single( value_type value,
char c ) noexcept
{
return static_cast< hash_t::value_type >(
( value ^ LAZY_IMPORTER_TOLOWER( c ) ) *
static_cast< unsigned long long >( prime ) );
}
};
template<class CharT = char>
LAZY_IMPORTER_FORCEINLINE constexpr hash_t::value_type
khash( const CharT *str, hash_t::value_type value = hash_t::offset ) noexcept
{
return ( *str ? khash( str + 1, hash_t::single( value, *str ) ) : value );
}
template<class CharT = char>
LAZY_IMPORTER_FORCEINLINE hash_t::value_type hash( const CharT *str ) noexcept
{
hash_t::value_type value = hash_t::offset;
for ( ;;)
{
char c = *str++;
if ( !c )
return value;
value = hash_t::single( value, c );
}
}
LAZY_IMPORTER_FORCEINLINE hash_t::value_type hash(
const win::UNICODE_STRING_T &str ) noexcept
{
auto *first = str.Buffer;
auto *const last = first + ( str.Length / sizeof( wchar_t ) );
auto value = hash_t::offset;
for ( ; first != last; ++first )
value = hash_t::single( value, static_cast< char >( *first ) );
return value;
}
LAZY_IMPORTER_FORCEINLINE pair<hash_t::value_type, hash_t::value_type> hash_forwarded(
const char *str ) noexcept
{
pair<hash_t::value_type, hash_t::value_type> module_and_function {
hash_t::offset, hash_t::offset
};
for ( ; *str != '.'; ++str )
module_and_function.first = hash_t::single( module_and_function.first, *str );
++str;
for ( ; *str; ++str )
module_and_function.second = hash_t::single( module_and_function.second, *str );
return module_and_function;
}
// some helper functions
LAZY_IMPORTER_FORCEINLINE const win::PEB_T *peb() noexcept
{
#if defined(_WIN64)
return reinterpret_cast< const win::PEB_T * >( __readgsqword( 0x60 ) );
#elif defined(_WIN32)
return reinterpret_cast< const win::PEB_T * >( __readfsdword( 0x30 ) );
#else
#error Unsupported platform. Open an issue and I'll probably add support.
#endif
}
LAZY_IMPORTER_FORCEINLINE const win::PEB_LDR_DATA_T *ldr()
{
return reinterpret_cast< const win::PEB_LDR_DATA_T * >( peb()->Ldr );
}
LAZY_IMPORTER_FORCEINLINE const win::IMAGE_NT_HEADERS *nt_headers(
const char *base ) noexcept
{
return reinterpret_cast< const win::IMAGE_NT_HEADERS * >(
base + reinterpret_cast< const win::IMAGE_DOS_HEADER * >( base )->e_lfanew );
}
LAZY_IMPORTER_FORCEINLINE const win::IMAGE_EXPORT_DIRECTORY *image_export_dir(
const char *base ) noexcept
{
return reinterpret_cast< const win::IMAGE_EXPORT_DIRECTORY * >(
base + nt_headers( base )->OptionalHeader.DataDirectory->VirtualAddress );
}
LAZY_IMPORTER_FORCEINLINE const win::LDR_DATA_TABLE_ENTRY_T *ldr_data_entry() noexcept
{
return reinterpret_cast< const win::LDR_DATA_TABLE_ENTRY_T * >(
ldr()->InLoadOrderModuleList.Flink );
}
struct exports_directory
{
const char *_base;
const win::IMAGE_EXPORT_DIRECTORY *_ied;
unsigned long _ied_size;
public:
using size_type = unsigned long;
LAZY_IMPORTER_FORCEINLINE
exports_directory( const char *base ) noexcept : _base( base )
{
const auto ied_data_dir = nt_headers( base )->OptionalHeader.DataDirectory[0];
_ied = reinterpret_cast< const win::IMAGE_EXPORT_DIRECTORY * >(
base + ied_data_dir.VirtualAddress );
_ied_size = ied_data_dir.Size;
}
LAZY_IMPORTER_FORCEINLINE explicit operator bool() const noexcept
{
return reinterpret_cast< const char * >( _ied ) != _base;
}
LAZY_IMPORTER_FORCEINLINE size_type size() const noexcept
{
return _ied->NumberOfNames;
}
LAZY_IMPORTER_FORCEINLINE const char *base() const noexcept { return _base; }
LAZY_IMPORTER_FORCEINLINE const win::IMAGE_EXPORT_DIRECTORY *ied() const noexcept
{
return _ied;
}
LAZY_IMPORTER_FORCEINLINE const char *name( size_type index ) const noexcept
{
return reinterpret_cast< const char * >(
_base + reinterpret_cast< const unsigned long * >(
_base + _ied->AddressOfNames )[index] );
}
LAZY_IMPORTER_FORCEINLINE const char *address( size_type index ) const noexcept
{
const auto *const rva_table =
reinterpret_cast< const unsigned long * >( _base + _ied->AddressOfFunctions );
const auto *const ord_table = reinterpret_cast< const unsigned short * >(
_base + _ied->AddressOfNameOrdinals );
return _base + rva_table[ord_table[index]];
}
LAZY_IMPORTER_FORCEINLINE bool is_forwarded( const char *export_address ) const
noexcept
{
const auto *const ui_ied = reinterpret_cast< const char * >( _ied );
return ( export_address > ui_ied && export_address < ui_ied + _ied_size );
}
};
struct safe_module_enumerator
{
using value_type = const detail::win::LDR_DATA_TABLE_ENTRY_T;
value_type *value;
value_type *const head;
LAZY_IMPORTER_FORCEINLINE safe_module_enumerator() noexcept
: value( ldr_data_entry() ), head( value )
{ }
LAZY_IMPORTER_FORCEINLINE void reset() noexcept { value = head; }
LAZY_IMPORTER_FORCEINLINE bool next() noexcept
{
value = value->load_order_next();
return value != head && value->DllBase;
}
};
struct unsafe_module_enumerator
{
using value_type = const detail::win::LDR_DATA_TABLE_ENTRY_T *;
value_type value;
LAZY_IMPORTER_FORCEINLINE unsafe_module_enumerator() noexcept
: value( ldr_data_entry() )
{ }
LAZY_IMPORTER_FORCEINLINE void reset() noexcept { value = ldr_data_entry(); }
LAZY_IMPORTER_FORCEINLINE bool next() noexcept
{
value = value->load_order_next();
return true;
}
};
// provides the cached functions which use Derive classes methods
template<class Derived, class DefaultType = void *>
class lazy_base
{
protected:
// This function is needed because every templated function
// with different args has its own static buffer
LAZY_IMPORTER_FORCEINLINE static void *&_cache() noexcept
{
static void *value = nullptr;
return value;
}
public:
template<class T = DefaultType>
LAZY_IMPORTER_FORCEINLINE static T safe() noexcept
{
return Derived::template get<T, safe_module_enumerator>();
}
template<class T = DefaultType, class Enum = unsafe_module_enumerator>
LAZY_IMPORTER_FORCEINLINE static T cached() noexcept
{
auto &cached = _cache();
if ( !cached )
cached = Derived::template get<void *, Enum>();
return ( T ) ( cached );
}
template<class T = DefaultType>
LAZY_IMPORTER_FORCEINLINE static T safe_cached() noexcept
{
return cached<T, safe_module_enumerator>();
}
};
template<hash_t::value_type Hash>
struct lazy_module : lazy_base<lazy_module<Hash>>
{
template<class T = void *, class Enum = unsafe_module_enumerator>
LAZY_IMPORTER_FORCEINLINE static T get() noexcept
{
Enum e;
do
{
if ( hash( e.value->BaseDllName ) == Hash )
return ( T ) ( e.value->DllBase );
} while ( e.next() );
return {};
}
};
template<hash_t::value_type Hash, class T>
struct lazy_function : lazy_base<lazy_function<Hash, T>, T>
{
using base_type = lazy_base<lazy_function<Hash, T>, T>;
template<class... Args>
LAZY_IMPORTER_FORCEINLINE decltype( auto ) operator()( Args&&... args ) const
{
#ifndef LAZY_IMPORTER_CACHE_OPERATOR_PARENS
return get()( std::forward<Args>( args )... );
#else
return this->cached()( std::forward<Args>( args )... );
#endif
}
template<class F = T, class Enum = unsafe_module_enumerator>
LAZY_IMPORTER_FORCEINLINE static F get() noexcept
{
// for backwards compatability.
// Before 2.0 it was only possible to resolve forwarded exports when
// this macro was enabled
#ifdef LAZY_IMPORTER_RESOLVE_FORWARDED_EXPORTS
return forwarded<F, Enum>();
#else
Enum e;
do
{
const exports_directory exports( e.value->DllBase );
if ( exports )
{
auto export_index = exports.size();
while ( export_index-- )
if ( hash( exports.name( export_index ) ) == Hash )
return ( F ) ( exports.address( export_index ) );
}
} while ( e.next() );
return {};
#endif
}
template<class F = T, class Enum = unsafe_module_enumerator>
LAZY_IMPORTER_FORCEINLINE static F forwarded() noexcept
{
detail::win::UNICODE_STRING_T name;
hash_t::value_type module_hash = 0;
auto function_hash = Hash;
Enum e;
do
{
name = e.value->BaseDllName;
name.Length -= 8; // get rid of .dll extension
if ( !module_hash || hash( name ) == module_hash )
{
const exports_directory exports( e.value->DllBase );
if ( exports )
{
auto export_index = exports.size();
while ( export_index-- )
if ( hash( exports.name( export_index ) ) == function_hash )
{
const auto addr = exports.address( export_index );
if ( exports.is_forwarded( addr ) )
{
auto hashes = hash_forwarded(
reinterpret_cast< const char * >( addr ) );
function_hash = hashes.second;
module_hash = hashes.first;
e.reset();
break;
}
return ( F ) ( addr );
}
}
}
} while ( e.next() );
return {};
}
template<class F = T>
LAZY_IMPORTER_FORCEINLINE static F forwarded_safe() noexcept
{
return forwarded<F, safe_module_enumerator>();
}
template<class F = T, class Enum = unsafe_module_enumerator>
LAZY_IMPORTER_FORCEINLINE static F forwarded_cached() noexcept
{
auto &value = base_type::_cache();
if ( !value )
value = forwarded<void *, Enum>();
return ( F ) ( value );
}
template<class F = T>
LAZY_IMPORTER_FORCEINLINE static F forwarded_safe_cached() noexcept
{
return forwarded_cached<F, safe_module_enumerator>();
}
template<class F = T, bool IsSafe = false, class Module>
LAZY_IMPORTER_FORCEINLINE static F in( Module m ) noexcept
{
if ( IsSafe && !m )
return {};
const exports_directory exports( ( const char * ) ( m ) );
if ( IsSafe && !exports )
return {};
for ( unsigned long i {};; ++i )
{
if ( IsSafe && i == exports.size() )
break;
if ( hash( exports.name( i ) ) == Hash )
return ( F ) ( exports.address( i ) );
}
return {};
}
template<class F = T, class Module>
LAZY_IMPORTER_FORCEINLINE static F in_safe( Module m ) noexcept
{
return in<F, true>( m );
}
template<class F = T, bool IsSafe = false, class Module>
LAZY_IMPORTER_FORCEINLINE static F in_cached( Module m ) noexcept
{
auto &value = base_type::_cache();
if ( !value )
value = in<void *, IsSafe>( m );
return ( F ) ( value );
}
template<class F = T, class Module>
LAZY_IMPORTER_FORCEINLINE static F in_safe_cached( Module m ) noexcept
{
return in_cached<F, true>( m );
}
template<class F = T>
LAZY_IMPORTER_FORCEINLINE static F nt() noexcept
{
return in<F>( ldr_data_entry()->load_order_next()->DllBase );
}
template<class F = T>
LAZY_IMPORTER_FORCEINLINE static F nt_safe() noexcept
{
return in_safe<F>( ldr_data_entry()->load_order_next()->DllBase );
}
template<class F = T>
LAZY_IMPORTER_FORCEINLINE static F nt_cached() noexcept
{
return in_cached<F>( ldr_data_entry()->load_order_next()->DllBase );
}
template<class F = T>
LAZY_IMPORTER_FORCEINLINE static F nt_safe_cached() noexcept
{
return in_safe_cached<F>( ldr_data_entry()->load_order_next()->DllBase );
}
};
}
}
#endif

@ -0,0 +1,30 @@
PUBLIC _spoofer_stub
.code
_spoofer_stub PROC
pop r11
add rsp, 8
mov rax, [rsp + 24]
mov r10, [rax]
mov [rsp], r10
mov r10, [rax + 8]
mov [rax + 8], r11
mov [rax + 16], rsi
lea rsi, fixup
mov [rax], rsi
mov rsi, rax
jmp r10
fixup:
sub rsp, 16
mov rcx, rsi
mov rsi, [rcx + 16]
jmp QWORD PTR [rcx + 8]
_spoofer_stub ENDP
END

@ -0,0 +1,269 @@
/*
* Copyright 2017 - 2018 Justas Masiulis
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef JM_XORSTR_HPP
#define JM_XORSTR_HPP
#include <immintrin.h>
#include <cstdint>
#include <cstddef>
#include <utility>
#define JM_XORSTR_DISABLE_AVX_INTRINSICS
#define xorstr_(str) \
::jm::make_xorstr( \
[]() { return str; }, \
std::make_index_sequence<sizeof(str) / sizeof(*str)>{}, \
std::make_index_sequence<::jm::detail::_buffer_size<sizeof(str)>()>{})
#define xorstr(str) xorstr_(str).crypt_get()
#ifdef _MSC_VER
#define XORSTR_FORCEINLINE __forceinline
#else
#define XORSTR_FORCEINLINE __attribute__((always_inline))
#endif
// you can define this macro to get possibly faster code on gcc/clang
// at the expense of constants being put into data section.
#if !defined(XORSTR_ALLOW_DATA)
// MSVC - no volatile
// GCC and clang - volatile everywhere
#if defined(__clang__) || defined(__GNUC__)
#define XORSTR_VOLATILE volatile
#endif
#endif
#ifndef XORSTR_VOLATILE
#define XORSTR_VOLATILE
#endif
namespace jm
{
namespace detail
{
template<std::size_t S>
struct unsigned_;
template<>
struct unsigned_<1>
{
using type = std::uint8_t;
};
template<>
struct unsigned_<2>
{
using type = std::uint16_t;
};
template<>
struct unsigned_<4>
{
using type = std::uint32_t;
};
template<auto C, auto...>
struct pack_value_type
{
using type = decltype( C );
};
template<std::size_t Size>
constexpr std::size_t _buffer_size()
{
return ( ( Size / 16 ) + ( Size % 16 != 0 ) ) * 2;
}
template<auto... Cs>
struct tstring_
{
using value_type = typename pack_value_type<Cs...>::type;
constexpr static std::size_t size = sizeof...( Cs );
constexpr static value_type str[size] = { Cs... };
constexpr static std::size_t buffer_size = _buffer_size<sizeof( str )>();
constexpr static std::size_t buffer_align =
#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS
( ( sizeof( str ) > 16 ) ? 32 : 16 );
#else
16;
#endif
};
template<std::size_t I, std::uint64_t K>
struct _ki
{
constexpr static std::size_t idx = I;
constexpr static std::uint64_t key = K;
};
template<std::uint32_t Seed>
constexpr std::uint32_t key4() noexcept
{
std::uint32_t value = Seed;
for ( char c : __TIME__ )
value = static_cast< std::uint32_t >( ( value ^ c ) * 16777619ull );
return value;
}
template<std::size_t S>
constexpr std::uint64_t key8()
{
constexpr auto first_part = key4<2166136261 + S>();
constexpr auto second_part = key4<first_part>();
return ( static_cast< std::uint64_t >( first_part ) << 32 ) | second_part;
}
// clang and gcc try really hard to place the constants in data
// sections. to counter that there was a need to create an intermediate
// constexpr string and then copy it into a non constexpr container with
// volatile storage so that the constants would be placed directly into
// code.
template<class T, std::uint64_t... Keys>
struct string_storage
{
std::uint64_t storage[T::buffer_size];
XORSTR_FORCEINLINE constexpr string_storage() noexcept : storage { Keys... }
{
using cast_type =
typename unsigned_<sizeof( typename T::value_type )>::type;
constexpr auto value_size = sizeof( typename T::value_type );
// puts the string into 64 bit integer blocks in a constexpr
// fashion
for ( std::size_t i = 0; i < T::size; ++i )
storage[i / ( 8 / value_size )] ^=
( std::uint64_t { static_cast< cast_type >( T::str[i] ) }
<< ( ( i % ( 8 / value_size ) ) * 8 * value_size ) );
}
};
} // namespace detail
template<class T, class... Keys>
class xor_string
{
alignas( T::buffer_align ) std::uint64_t _storage[T::buffer_size];
// _single functions needed because MSVC crashes without them
XORSTR_FORCEINLINE void _crypt_256_single( const std::uint64_t *keys,
std::uint64_t *storage ) noexcept
{
_mm256_store_si256(
reinterpret_cast< __m256i * >( storage ),
_mm256_xor_si256(
_mm256_load_si256( reinterpret_cast< const __m256i * >( storage ) ),
_mm256_load_si256( reinterpret_cast< const __m256i * >( keys ) ) ) );
}
template<std::size_t... Idxs>
XORSTR_FORCEINLINE void _crypt_256( const std::uint64_t *keys,
std::index_sequence<Idxs...> ) noexcept
{
( _crypt_256_single( keys + Idxs * 4, _storage + Idxs * 4 ), ... );
}
XORSTR_FORCEINLINE void _crypt_128_single( const std::uint64_t *keys,
std::uint64_t *storage ) noexcept
{
_mm_store_si128(
reinterpret_cast< __m128i * >( storage ),
_mm_xor_si128( _mm_load_si128( reinterpret_cast< const __m128i * >( storage ) ),
_mm_load_si128( reinterpret_cast< const __m128i * >( keys ) ) ) );
}
template<std::size_t... Idxs>
XORSTR_FORCEINLINE void _crypt_128( const std::uint64_t *keys,
std::index_sequence<Idxs...> ) noexcept
{
( _crypt_128_single( keys + Idxs * 2, _storage + Idxs * 2 ), ... );
}
// loop generates vectorized code which places constants in data dir
XORSTR_FORCEINLINE constexpr void _copy() noexcept
{
constexpr detail::string_storage<T, Keys::key...> storage;
static_cast< void >( std::initializer_list<std::uint64_t>{
( const_cast< XORSTR_VOLATILE std::uint64_t * >( _storage ) )[Keys::idx] =
storage.storage[Keys::idx]... } );
}
public:
using value_type = typename T::value_type;
using size_type = std::size_t;
using pointer = value_type *;
using const_pointer = const pointer;
XORSTR_FORCEINLINE xor_string() noexcept { _copy(); }
XORSTR_FORCEINLINE constexpr size_type size() const noexcept
{
return T::size - 1;
}
XORSTR_FORCEINLINE void crypt() noexcept
{
alignas( T::buffer_align ) std::uint64_t keys[T::buffer_size];
static_cast< void >( std::initializer_list<std::uint64_t>{
( const_cast< XORSTR_VOLATILE std::uint64_t * >( keys ) )[Keys::idx] =
Keys::key... } );
_copy();
#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS
_crypt_256( keys, std::make_index_sequence<T::buffer_size / 4>{} );
if constexpr ( T::buffer_size % 4 != 0 )
_crypt_128( keys, std::index_sequence<T::buffer_size / 2 - 1>{} );
#else
_crypt_128( keys, std::make_index_sequence<T::buffer_size / 2>{} );
#endif
}
XORSTR_FORCEINLINE const_pointer get() const noexcept
{
return reinterpret_cast< const_pointer >( _storage );
}
XORSTR_FORCEINLINE const_pointer crypt_get() noexcept
{
crypt();
return reinterpret_cast< const_pointer >( _storage );
}
};
template<class Tstr, std::size_t... StringIndices, std::size_t... KeyIndices>
XORSTR_FORCEINLINE constexpr auto
make_xorstr( Tstr str_lambda,
std::index_sequence<StringIndices...>,
std::index_sequence<KeyIndices...> ) noexcept
{
return xor_string<detail::tstring_<str_lambda()[StringIndices]...>,
detail::_ki<KeyIndices, detail::key8<KeyIndices>()>...>{};
}
} // namespace jm
#endif // include guard
#define xorstr_(str) \
::jm::make_xorstr( \
[]() { return str; }, \
std::make_index_sequence<sizeof(str) / sizeof(*str)>{}, \
std::make_index_sequence<::jm::detail::_buffer_size<sizeof(str)>()>{})
#define x(str) xorstr_(str).crypt_get()

File diff suppressed because it is too large Load Diff

@ -0,0 +1,197 @@
#pragma once
#include <cheat/internal/core.hpp>
#include <cheat/internal/utility.hpp>
#include <cheat/internal/updater/updater.hpp>
#include <cheat/internal/actor/actors.hpp>
#include <impl/render/font.h>
ID3D11Device *device = nullptr;
ID3D11DeviceContext *immediateContext = nullptr;
ID3D11RenderTargetView *renderTargetView = nullptr;
static IDXGISwapChain *g_pSwapChain;
HRESULT( *presenth )( IDXGISwapChain *swapChain, UINT syncInterval, UINT flags ) = nullptr;
HRESULT( *resizeh )( IDXGISwapChain *swapChain, UINT bufferCount, UINT width, UINT height, DXGI_FORMAT newFormat, UINT swapChainFlags ) = nullptr;
WNDPROC oriWndProc = NULL;
HWND hwnd = NULL;
void Insert()
{
if ( NtGetAsyncKeyState( VK_INSERT ) & 0x8000 )
{
cfg::menu = !cfg::menu;
}
if ( NtGetAsyncKeyState( VK_DELETE ) & 0x8000 )
{
unload = !unload;
}
}
void pkRender()
{
ImGuiStyle *style = &ImGui::GetStyle();
ImVec4 *colors = style->Colors;
//editor.SetLanguageDefinition(TextEditor::LanguageDefinition::Lua());
//editor.SetPalette(TextEditor::GetDarkPalette());
//editor.SetShowDefines(false);
style->WindowRounding = 0;
style->WindowTitleAlign = ImVec2( 0.01, 0.5 );
style->GrabRounding = 1;
style->GrabMinSize = 20;
style->FrameRounding = 0;
style->FramePadding = ImVec2( 5, 5 );
style->TouchExtraPadding = ImVec2( 5, 5 );
style->WindowPadding = ImVec2( 5, 5 );
style->DisplaySafeAreaPadding = ImVec2( 5, 5 );
style->DisplayWindowPadding = ImVec2( 5, 5 );
colors[ImGuiCol_Text] = ImVec4( 1.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_TextDisabled] = ImVec4( 0.00f, 0.40f, 0.41f, 1.00f );
colors[ImGuiCol_WindowBg] = ImVec4( 0.021f, 0.021f, 0.021f, 1.00f );
colors[ImGuiCol_ChildWindowBg] = ImVec4( 0.00f, 0.00f, 0.00f, 0.00f );
colors[ImGuiCol_PopupBg] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_Border] = ImVec4( 1.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_BorderShadow] = ImVec4( 0.00f, 0.00f, 0.00f, 0.00f );
colors[ImGuiCol_FrameBg] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_FrameBgHovered] = ImVec4( 0.44f, 0.80f, 0.80f, 0.27f );
colors[ImGuiCol_FrameBgActive] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_TitleBg] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_TitleBgCollapsed] = ImVec4( 0.00f, 0.00f, 0.00f, 0.54f );
colors[ImGuiCol_TitleBgActive] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_MenuBarBg] = ImVec4( 0.00f, 0.00f, 0.00f, 0.20f );
colors[ImGuiCol_ScrollbarBg] = ImVec4( 0.125f, 0.125f, 0.125f, 0.36f );
colors[ImGuiCol_ScrollbarGrab] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4( 0.125f, 0.125f, 0.125f, 0.36f );
colors[ImGuiCol_ScrollbarGrabActive] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_CheckMark] = ImVec4( 1.00f, 1.00f, 1.00f, 0.68f );
colors[ImGuiCol_SliderGrab] = ImVec4( 1.00f, 1.00f, 1.00f, 0.36f );
colors[ImGuiCol_SliderGrabActive] = ImVec4( 1.00f, 1.00f, 1.00f, 0.76f );
colors[ImGuiCol_Button] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_ButtonHovered] = ImVec4( 0.125f, 0.125f, 0.125f, 0.36f );
colors[ImGuiCol_ButtonActive] = ImVec4( 0.125f, 0.125f, 0.125f, 1.00f );
colors[ImGuiCol_Header] = ImVec4( 1.00f, 1.00f, 1.00f, 0.33f );
colors[ImGuiCol_HeaderHovered] = ImVec4( 1.00f, 1.00f, 1.00f, 0.42f );
colors[ImGuiCol_HeaderActive] = ImVec4( 1.00f, 1.00f, 1.00f, 0.54f );
colors[ImGuiCol_Column] = ImVec4( 0.00f, 0.50f, 0.50f, 0.33f );
colors[ImGuiCol_ColumnHovered] = ImVec4( 0.00f, 0.50f, 0.50f, 0.47f );
colors[ImGuiCol_ColumnActive] = ImVec4( 0.00f, 0.70f, 0.70f, 1.00f );
colors[ImGuiCol_ResizeGrip] = ImVec4( 1.00f, 1.00f, 1.00f, 0.54f );
colors[ImGuiCol_ResizeGripHovered] = ImVec4( 1.00f, 1.00f, 1.00f, 0.74f );
colors[ImGuiCol_ResizeGripActive] = ImVec4( 1.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_PlotLines] = ImVec4( 1.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_PlotLinesHovered] = ImVec4( 0.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_PlotHistogram] = ImVec4( 0.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_PlotHistogramHovered] = ImVec4( 0.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_TextSelectedBg] = ImVec4( 0.00f, 1.00f, 1.00f, 1.00f );
colors[ImGuiCol_ModalWindowDarkening] = ImVec4( 0.04f, 0.10f, 0.09f, 0.51f );
// removed watermark
if ( cfg::fov_circle )
Circle( Width / 2, Height / 2, cfg::fov, { 255, 255, 255, 255 }, 150 );
ImGui::SetWindowSize( ImVec2( 398.000, 477.000 ) );
if ( cfg::menu )
{
// removed menu & P2C name
if ( ImGui::Begin( x( "UC pasta" ), NULL, ImGuiWindowFlags_NoResize) )
{
}
}
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
utility *utility {};
if ( ImGui_ImplWin32_WndProcHandler( hWnd, msg, wParam, lParam ) && menu )
{
return true;
}
return utility->call( CallWindowProcW, oriWndProc, hWnd, msg, wParam, lParam );
}
HRESULT pkHook( IDXGISwapChain *swapchain, UINT sync, UINT flags )
{
utility *utility { };
g_pSwapChain = swapchain;
if ( !device )
{
ID3D11Texture2D *renderTarget = 0;
ID3D11Texture2D *backBuffer = 0;
D3D11_TEXTURE2D_DESC backBufferDesc = { 0 };
swapchain->GetDevice( __uuidof( device ), ( PVOID * ) &device );
device->GetImmediateContext( &immediateContext );
swapchain->GetBuffer( 0, __uuidof( renderTarget ), ( PVOID * ) &renderTarget );
device->CreateRenderTargetView( renderTarget, nullptr, &renderTargetView );
renderTarget->Release();
swapchain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( PVOID * ) &backBuffer );
backBuffer->GetDesc( &backBufferDesc );
hwnd = utility->call( FindWindowW, ( L"Respawn001" ), ( L"Apex Legends" ) );
backBuffer->Release();
ImFontConfig font_config;
font_config.OversampleH = 1;
font_config.OversampleV = 1;
font_config.PixelSnapH = 1;
static const ImWchar ranges[] =
{
0x0020, 0x00FF, // Basic Latin + Latin Supplement
0x0400, 0x044F, // Cyrillic
0,
};
ImGuiIO &io = ImGui::GetIO(); ( void ) io;
//m_pFont = ImGui::GetIO().Fonts->AddFontFromMemoryTTF( ( void * ) menufont, sizeof( menufont ), 15, &font_config, ranges );
m_pFont = io.Fonts->AddFontFromFileTTF( x( "C:\\Windows\\Fonts\\Arial.ttf" ), 15.0f );//ImGui::GetIO().Fonts->AddFontFromMemoryTTF( ( void * ) menufont, sizeof( menufont ), 15, &font_config, ranges );
esp_pFont = ImGui::GetIO().Fonts->AddFontFromMemoryTTF( ( void * ) apexEngineFont, sizeof( apexEngineFont ), 15, &font_config, ranges );
if ( m_pFont == NULL or esp_pFont == NULL)
{
utility->call( MessageBoxA, ( HWND ) 0, ( LPCSTR ) xorstr( "Failed to load font from memory" ), ( LPCSTR ) 0, ( UINT ) 0 );
utility->call( exit, 0 );
}
ImGui_ImplDX11_Init( hwnd, device, immediateContext );
ImGui_ImplDX11_CreateDeviceObjects();
Width = ( float ) backBufferDesc.Width;
Height = ( float ) backBufferDesc.Height;
}
immediateContext->OMSetRenderTargets( 1, &renderTargetView, nullptr );
auto &window = createscene();
//unloadCheat();
pkRender();
cWorld->SetCameraMatrix();
cPlayerLoop();
cItemLoop();
cObjectLoop();
//Insert();
destroyscene( window ); //Destroy
return utility->call( c_original, swapchain, sync, flags );
}

@ -14,42 +14,303 @@ typedef struct player
bool visible = false;
int health = 0;
int shield = 0;
//seer
int maxshield = 0;
int armortype = 0;
D3DXVECTOR3 EntityPosition;
D3DXVECTOR3 LocalPlayerPosition;
D3DXVECTOR3 localviewangle;
char name[33] = { 0 };
}player;
uint32_t check = 0xABCD;
//chargerifle toggle to ~
int chargeriflekp = 0;
//Aiming keys: left and right mouse button
int aim_key = VK_RBUTTON;
int aim_key2 = VK_LBUTTON;
int shoot_key = VK_LBUTTON;
int shoot_key2 = VK_RBUTTON;
bool firing_range = false;
bool use_nvidia = true;
bool active = true;
bool ready = false;
extern visuals v;
int aim = 0; //read
bool esp = false; //read
bool item_glow = false;
bool player_glow = false;
int aim = 2; //read
bool esp = true; //read
bool item_glow = true;
bool player_glow = true;
bool aim_no_recoil = true;
bool aiming = false; //read
uint64_t g_Base = 0; //write
float max_dist = 200.0f * 40.0f; //read
float smooth = 12.0f;
float max_dist = 3800.0f * 40.0f; //read
float smooth = 100.0f;
float max_fov = 15.0f;
int bone = 2;
//Player Glow Color and Brightness
float glowr = 0.0f;
float glowg = 120.0f;
float glowb = 120.0f;
float glowcolor[3] = { 000.0f, 000.0f, 000.0f };
int glowtype = 1;
int glowtype2 = 2;
//Radar Color
bool minimapradar = false;
extern unsigned int radarcolorr;
extern unsigned int radarcolorg;
extern unsigned int radarcolorb;
float radarcolor[3];
//Bigger Radar, Hotket T
bool biggerradartoggle = 0;
bool bigradar = false;
float circradarsize100 = 59.0f;
float circradarsize200 = 118.0f;
float circradarsize300 = 177.0f;
float circradarsize400 = 236.0f;
float circradarsize500 = 295.0f;
//Broken
/*
//Full Map Radar
bool mainradartoggle = 0;
bool mainradarmap = false;
bool stormmap = true;
bool worldsedge = true;
*/
bool thirdperson = false;
int spectators = 0; //write
int allied_spectators = 0; //write
//chargerifle hack
bool chargerifle = false;
bool shooting = false; //read
bool valid = false; //write
bool next = false; //read write
bool valid = true; //write
bool next2 = true; //read write
//Fov Circle stuff, Its not working, have not finished it yet.
float fovsize = max_fov * 8.4;
float fovsize2 = max_fov * 10.7;
int zoomf1 = 0;
int zoomf2 = 0;
bool fovcircle = true;
float fovcolorset[4] = { 000.0f, 000.0f, 000.0f, 000.0f };
float fovcolor1 = 50.0f;
float fovcolor2 = 50.0f;
float fovcolor3 = 50.0f;
float fovthick = 0.0f;
uint64_t add[20];
uint64_t add[27];
bool k_f5 = 0;
bool k_f6 = 0;
bool k_f7 = 0;
bool k_f8 = 0;
bool k_f9 = 0;
bool k_f10 = 0;
bool k_f20 = 0;
bool k_f100 = 0;
//Radar Code
#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h
static D3DXVECTOR3 RotatePoint(D3DXVECTOR3 EntityPos, D3DXVECTOR3 LocalPlayerPos, int posX, int posY, int sizeX, int sizeY, float angle, float zoom, bool* viewCheck)
{
float r_1, r_2;
float x_1, y_1;
r_1 = -(EntityPos.y - LocalPlayerPos.y);
r_2 = EntityPos.x - LocalPlayerPos.x;
float Yaw = angle - 90.0f;
float yawToRadian = Yaw * (float)(M_PI / 180.0F);
x_1 = (float)(r_2 * (float)cos((double)(yawToRadian)) - r_1 * sin((double)(yawToRadian))) / 20;
y_1 = (float)(r_2 * (float)sin((double)(yawToRadian)) + r_1 * cos((double)(yawToRadian))) / 20;
*viewCheck = y_1 < 0;
x_1 *= zoom;
y_1 *= zoom;
int sizX = sizeX / 2;
int sizY = sizeY / 2;
x_1 += sizX;
y_1 += sizY;
if (x_1 < 5)
x_1 = 5;
if (x_1 > sizeX - 5)
x_1 = sizeX - 5;
if (y_1 < 5)
y_1 = 5;
if (y_1 > sizeY - 5)
y_1 = sizeY - 5;
x_1 += posX;
y_1 += posY;
return D3DXVECTOR3(x_1, y_1, 0);
}
typedef struct
{
DWORD R;
DWORD G;
DWORD B;
DWORD A;
}RGBA;
static void FilledRectangle(int x, int y, int w, int h, RGBA color)
{
ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(x, y), ImVec2(x + w, y + h), ImGui::ColorConvertFloat4ToU32(ImVec4(color.R / 255.0, color.G / 255.0, color.B / 255.0, color.A / 255.0)), 0, 0);
}
bool menu = true;
bool firstS = true;
//Radar Settings.. ToDO: Put in ImGui menu to change in game
namespace RadarSettings
{
bool Radar = true;
bool teamRadar = true;
bool enemyRadar = true;
int xAxis_Radar = 0;
int yAxis_Radar = 400;
int radartype = 0;
int width_Radar = 400;
int height_Radar = 400;
int distance_Radar = 250;
int distance_Radar2 = 1000;
};
void DrawRadarPoint(D3DXVECTOR3 EneamyPos, D3DXVECTOR3 LocalPos, float LocalPlayerY, float eneamyDist, int xAxis, int yAxis, int width, int height, D3DXCOLOR color)
{
bool out = false;
D3DXVECTOR3 siz;
siz.x = width;
siz.y = height;
D3DXVECTOR3 pos;
pos.x = xAxis;
pos.y = yAxis;
bool ck = false;
D3DXVECTOR3 single = RotatePoint(EneamyPos, LocalPos, pos.x, pos.y, siz.x, siz.y, LocalPlayerY, 0.3f, &ck);
if (eneamyDist >= 0.f && eneamyDist < RadarSettings::distance_Radar)
{
FilledRectangle(single.x, single.y, 5, 5, { radarcolorr, radarcolorg, radarcolorb, 255 });
}
}
//Bigger Radar Stuff, Hotket T
void DrawRadarPoint2(D3DXVECTOR3 EneamyPos, D3DXVECTOR3 LocalPos, float LocalPlayerY, float eneamyDist, int xAxis, int yAxis, int width, int height, D3DXCOLOR color)
{
bool out = false;
D3DXVECTOR3 siz;
siz.x = width;
siz.y = height;
D3DXVECTOR3 pos;
pos.x = xAxis;
pos.y = yAxis;
bool ck = false;
D3DXVECTOR3 single = RotatePoint(EneamyPos, LocalPos, pos.x, pos.y, siz.x, siz.y, LocalPlayerY, 0.3f, &ck);
if (eneamyDist >= 0.f && eneamyDist < RadarSettings::distance_Radar2)
{
FilledRectangle(single.x, single.y, 5, 5, { radarcolorr, radarcolorg, radarcolorb, 255 });
}
}
//MiniMap Radar Stuff
void MiniMapRadar(D3DXVECTOR3 EneamyPos, D3DXVECTOR3 LocalPos, float LocalPlayerY, float eneamyDist)
{
ImGuiStyle* style = &ImGui::GetStyle();
style->WindowRounding = 0.2f;
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.13529413f, 0.14705884f, 0.15490198f, 0.82f));
ImGuiWindowFlags TargetFlags;
//Radar Window Flags: No Move, Resize, Title bar, Background etc. makes it so you can change it once set.
//slash out | ImGuiWindowFlags_::ImGuiWindowFlags_NoMove to move the minimap
TargetFlags = ImGuiWindowFlags_::ImGuiWindowFlags_NoResize | ImGuiWindowFlags_::ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_::ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_::ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_::ImGuiWindowFlags_NoMove;
if (!firstS)
{
ImGui::SetNextWindowPos(ImVec2{ 1200, 60 }, ImGuiCond_Once);
firstS = true;
}
if (RadarSettings::Radar == true)
{
ImGui::SetNextWindowSize({ 250, 250 });
ImGui::Begin(("Radar"), 0, TargetFlags);
//if (ImGui::Begin(xorstr("Radar", 0, ImVec2(200, 200), -1.f, TargetFlags))) {
{
ImDrawList* Draw = ImGui::GetWindowDrawList();
ImVec2 DrawPos = ImGui::GetCursorScreenPos();
ImVec2 DrawSize = ImGui::GetContentRegionAvail();
ImVec2 midRadar = ImVec2(DrawPos.x + (DrawSize.x / 2), DrawPos.y + (DrawSize.y / 2));
//unslash to set to minimap, it helps line it up
//ImGui::GetWindowDrawList()->AddLine(ImVec2(midRadar.x - DrawSize.x / 2.f, midRadar.y), ImVec2(midRadar.x + DrawSize.x / 2.f, midRadar.y), IM_COL32(255, 255, 255, 255));
//ImGui::GetWindowDrawList()->AddLine(ImVec2(midRadar.x, midRadar.y - DrawSize.y / 2.f), ImVec2(midRadar.x, midRadar.y + DrawSize.y / 2.f), IM_COL32(255, 255, 255, 255));
DrawRadarPoint(EneamyPos, LocalPos, LocalPlayerY, eneamyDist, DrawPos.x, DrawPos.y, DrawSize.x, DrawSize.y, { 255, 255, 255, 255 });
}
ImGui::End();
}
ImGui::PopStyleColor();
}
//Bigger Radar Stuff, Hotket T
void BigMiniMapRadar(D3DXVECTOR3 EneamyPos, D3DXVECTOR3 LocalPos, float LocalPlayerY, float eneamyDist)
{
ImGuiStyle* style = &ImGui::GetStyle();
style->WindowRounding = 0.2f;
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.13529413f, 0.14705884f, 0.15490198f, 0.82f));
ImGuiWindowFlags TargetFlags;
//Radar Window Flags: No Move, Resize, Title bar, Background etc. makes it so you can change it once set.
//slash out | ImGuiWindowFlags_::ImGuiWindowFlags_NoMove
TargetFlags = ImGuiWindowFlags_::ImGuiWindowFlags_NoResize | ImGuiWindowFlags_::ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_::ImGuiWindowFlags_NoTitleBar/* | ImGuiWindowFlags_::ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_::ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_::ImGuiWindowFlags_NoMove*/;
if (!firstS)
{
ImGui::SetNextWindowPos(ImVec2{ 1200, 60 }, ImGuiCond_Once);
firstS = true;
}
if (RadarSettings::Radar == true)
{
ImGui::SetNextWindowSize({ 500, 500 });
ImGui::Begin(("Bigger Radar"), 0, TargetFlags);
//if (ImGui::Begin(xorstr("Radar", 0, ImVec2(200, 200), -1.f, TargetFlags))) {
{
ImDrawList* Draw = ImGui::GetWindowDrawList();
ImVec2 DrawPos = ImGui::GetCursorScreenPos();
ImVec2 DrawSize = ImGui::GetContentRegionAvail();
ImVec2 midRadar = ImVec2(DrawPos.x + (DrawSize.x / 2), DrawPos.y + (DrawSize.y / 2));
//unslash to set to minimap, it helps line it up
ImGui::GetWindowDrawList()->AddCircle(ImVec2(DrawPos.x + DrawSize.x / 2, DrawPos.y + DrawSize.y / 2), circradarsize100, IM_COL32(255, 255, 255, 255));
ImGui::GetWindowDrawList()->AddCircle(ImVec2(DrawPos.x + DrawSize.x / 2, DrawPos.y + DrawSize.y / 2), circradarsize200, IM_COL32(255, 255, 255, 255));
ImGui::GetWindowDrawList()->AddCircle(ImVec2(DrawPos.x + DrawSize.x / 2, DrawPos.y + DrawSize.y / 2), circradarsize300, IM_COL32(255, 255, 255, 255));
ImGui::GetWindowDrawList()->AddCircle(ImVec2(DrawPos.x + DrawSize.x / 2, DrawPos.y + DrawSize.y / 2), circradarsize400, IM_COL32(255, 255, 255, 255));
ImGui::GetWindowDrawList()->AddCircle(ImVec2(DrawPos.x + DrawSize.x / 2, DrawPos.y + DrawSize.y / 2), circradarsize500, IM_COL32(255, 255, 255, 255));
//ImGui::GetWindowDrawList()->AddLine(ImVec2(midRadar.x, midRadar.y - DrawSize.y / 2.f), ImVec2(midRadar.x, midRadar.y + DrawSize.y / 2.f), IM_COL32(255, 255, 255, 255));
DrawRadarPoint2(EneamyPos, LocalPos, LocalPlayerY, eneamyDist, DrawPos.x, DrawPos.y, DrawSize.x, DrawSize.y, { 255, 255, 255, 255 });
}
ImGui::End();
}
ImGui::PopStyleColor();
}
bool IsKeyDown(int vk)
{
@ -58,18 +319,157 @@ bool IsKeyDown(int vk)
player players[100];
/*
//Full map radar test, Broken atm
//ImVec2 can be replaced with Vector2D
class world {
public:
ImVec2 w1; //origin of point 1
ImVec2 w2; //origin of point 2
ImVec2 s1; //screen coord of point 1
ImVec2 s2; //screen coord of point 2
float ratioX;
float ratioY;
world(ImVec2 w1, ImVec2 s1, ImVec2 w2, ImVec2 s2) {
this->w1 = w1;
this->w2 = w2;
this->s1 = s1;
this->s2 = s2;
this->ratioX = (s2.x - s1.x) / (w2.x - w1.x);
this->ratioY = (s1.y - s2.y) / (w2.y - w1.y);
}
};
//These values only work with 1920x1080 fullscreen
//Battel Royal
world KingsCanyon(ImVec2(0, 0), ImVec2(0, 0), ImVec2(0, 0), ImVec2(0, 0)); //to be measured
world WorldsEdge(ImVec2(-9190.608398, 8443.554688), ImVec2(824, 412), ImVec2(-19529.794922, -8933.173828), ImVec2(707, 608));
world Olympus(ImVec2(0, 0), ImVec2(0, 0), ImVec2(0, 0), ImVec2(0, 0)); //to be measured
world StormPoint(ImVec2(-21264.427734, -47086.878906), ImVec2(711, 983), ImVec2(40298.070313, 21163.728516), ImVec2(1321, 306));
//Arena
world Overflow(ImVec2(-3344.994629, -4018.093018), ImVec2(552, 431), ImVec2(5039.592773, -4639.289063), ImVec2(1322, 489));
world DropOff(ImVec2(3135.113281, 1654.107666), ImVec2(1151, 603), ImVec2(-2920.918701, 811.240479), ImVec2(722, 663));
world Habitat4(ImVec2(4482.470215, -604.362854), ImVec2(1205, 544), ImVec2(-4464.019043, 593.067688), ImVec2(650, 470));
world Encore(ImVec2(4144.926270, 468.957611), ImVec2(1184, 472), ImVec2(-3791.070313, 3.092307), ImVec2(692, 501));
world PartyCrasher(ImVec2(-3275.972900, 3646.970703), ImVec2(589, 197), ImVec2(1085.708740, -3869.658936), ImVec2(1022, 943));
ImVec2 worldToScreenMap(D3DXVECTOR3 origin) {
float ratioX;
float ratioY;
ImVec2 w1;
ImVec2 s1;
if (stormmap == true) { //Storm Point
ratioX = StormPoint.ratioX;
ratioY = StormPoint.ratioY;
w1 = StormPoint.w1;
s1 = StormPoint.s1;
}
else if (strncmp(mapname, "mp_rr_aqueduct", 14) == 0) { //arena Overflow
ratioX = Overflow.ratioX;
ratioY = Overflow.ratioY;
w1 = Overflow.w1;
s1 = Overflow.s1;
}
else if (strncmp(mapname, "mp_rr_arena_composite", 21) == 0) { //arena DropOff
ratioX = DropOff.ratioX;
ratioY = DropOff.ratioY;
w1 = DropOff.w1;
s1 = DropOff.s1;
}
else if (strncmp(mapname, "mp_rr_arena_habitat", 19) == 0) { //arena Habitat4
ratioX = Habitat4.ratioX;
ratioY = Habitat4.ratioY;
w1 = Habitat4.w1;
s1 = Habitat4.s1;
}
else if (strncmp(mapname, "mp_rr_arena_skygarden", 21) == 0) { //arena Encore
ratioX = Encore.ratioX;
ratioY = Encore.ratioY;
w1 = Encore.w1;
s1 = Encore.s1;
}
else if (strncmp(mapname, "mp_rr_party_crasher", 19) == 0) { //arena PartyCrasher
ratioX = PartyCrasher.ratioX;
ratioY = PartyCrasher.ratioY;
w1 = PartyCrasher.w1;
s1 = PartyCrasher.s1;
}
else if (strncmp(mapname, "mp_rr_canyonlands_mu", 20) == 0) { //KingsCanyon
ratioX = KingsCanyon.ratioX;
ratioY = KingsCanyon.ratioY;
w1 = KingsCanyon.w1;
s1 = KingsCanyon.s1;
}
if (worldsedge == true) { //WorldsEdge
ratioX = WorldsEdge.ratioX;
ratioY = WorldsEdge.ratioY;
w1 = WorldsEdge.w1;
s1 = WorldsEdge.s1;
}
else if (strncmp(mapname, "mp_rr_olympus", 13) == 0) { //Olympus
ratioX = Olympus.ratioX;
ratioY = Olympus.ratioY;
w1 = Olympus.w1;
s1 = Olympus.s1;
}
else {
return ImVec2(0, 0);
}
//difference from location 1
float world_diff_x = origin.x - w1.x;
float world_diff_y = origin.y - w1.y;
//get the screen offsets by applying the ratio
float scr_diff_x = world_diff_x * ratioX;
float scr_diff_y = world_diff_y * ratioY;
//for x, add the offset to the screen x of location 1
//for y, subtract the offset from the screen y of location 1 (cuz Y is from bottom to up in Apex but it's from up to bottom in screen)
float pos_x = s1.x + scr_diff_x;
float pos_y = s1.y - scr_diff_y;
FilledRectangle(pos_x, pos_y, 5, 5, { radarcolorr, radarcolorg, radarcolorb, 255 });
}
*/
void Overlay::RenderEsp()
{
next = false;
//Fov Circle Stuff
if (fovcircle && zoomf1 == 0)
{
//ImGui::Begin(XorStr("##esp"), (bool*)true, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoBringToFrontOnFocus);
auto draw = ImGui::GetBackgroundDrawList();
draw->AddCircle(ImVec2(1920 / 2, 1080 / 2), fovsize, IM_COL32(fovcolor1, fovcolor2, fovcolor3, 255), 100, fovthick);
//ImGui::End();
}
else if (fovcircle && zoomf1 == 1)
{
//ImGui::Begin(XorStr("##esp"), (bool*)true, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoBringToFrontOnFocus);
auto draw = ImGui::GetBackgroundDrawList();
draw->AddCircle(ImVec2(1920 / 2, 1080 / 2), fovsize2, IM_COL32(fovcolor1, fovcolor2, fovcolor3, 255), 100, fovthick);
//ImGui::End();
}
next2 = false;
if (g_Base != 0 && esp)
{
memset(players, 0, sizeof(players));
while (!next && esp)
while (!next2 && esp)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
if (next && valid)
if (next2 && valid)
{
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(ImVec2((float)getWidth(), (float)getHeight()));
@ -77,46 +477,51 @@ void Overlay::RenderEsp()
for (int i = 0; i < 100; i++)
{
if (players[i].health > 0)
{
std::string distance = std::to_string(players[i].dist / 39.62);
distance = distance.substr(0, distance.find('.')) + "m(" + std::to_string(players[i].entity_team) + ")";
if (v.box)
float radardistance = (int)((players[i].LocalPlayerPosition, players[i].dist) / 39.62);
//Radar Stuff
if (minimapradar == true)
{
if (players[i].visible)
{
if (players[i].dist < 1600.0f)
DrawBox(RED, players[i].boxMiddle, players[i].h_y, players[i].width, players[i].height); //BOX
else
DrawBox(ORANGE, players[i].boxMiddle, players[i].h_y, players[i].width, players[i].height); //BOX
}
else
{
DrawBox(WHITE, players[i].boxMiddle, players[i].h_y, players[i].width, players[i].height); //white if player not visible
}
MiniMapRadar(players[i].EntityPosition, players[i].LocalPlayerPosition, players[i].localviewangle.y, radardistance);
}
if (bigradar)
{
BigMiniMapRadar(players[i].EntityPosition, players[i].LocalPlayerPosition, players[i].localviewangle.y, radardistance);
}
if(v.line)
if (v.line)
DrawLine(ImVec2((float)(getWidth() / 2), (float)getHeight()), ImVec2(players[i].b_x, players[i].b_y), BLUE, 1); //LINE FROM MIDDLE SCREEN
if (v.distance)
{
if (players[i].knocked)
String(ImVec2(players[i].boxMiddle, (players[i].b_y + 1)), RED, distance.c_str()); //DISTANCE
else
String(ImVec2(players[i].boxMiddle, (players[i].b_y + 1)), RED, distance.c_str()); //DISTANCEs else
String(ImVec2(players[i].boxMiddle, (players[i].b_y + 1)), GREEN, distance.c_str()); //DISTANCE
}
if(v.healthbar)
ProgressBar((players[i].b_x - (players[i].width / 2.0f) - 4), (players[i].b_y - players[i].height), 3, players[i].height, players[i].health, 100); //health bar
if (v.shieldbar)
ProgressBar((players[i].b_x + (players[i].width / 2.0f) + 1), (players[i].b_y - players[i].height), 3, players[i].height, players[i].shield, 125); //shield bar
if (v.healthbar)
if (players[i].dist < 16000.0f)
{
DrawSeerLikeHealth((players[i].b_x - (players[i].width / 2.0f) + 5), (players[i].b_y - players[i].height - 10), players[i].shield, players[i].maxshield, players[i].armortype, players[i].health); //health bar
}
/*
//Full Radar map, broken atm
if (mainradarmap == true)
worldToScreenMap(players[i].EntityPosition);
//String(ImVec2(players[i].boxMiddle, (players[i].b_y - players[i].height - 15)), WHITE, players[i].name);
*/
if(v.name)
String(ImVec2(players[i].boxMiddle, (players[i].b_y - players[i].height - 15)), WHITE, players[i].name);
}
}
ImGui::End();
}
}
@ -129,7 +534,7 @@ int main(int argc, char** argv)
add[2] = (uintptr_t)&esp;
add[3] = (uintptr_t)&aiming;
add[4] = (uintptr_t)&g_Base;
add[5] = (uintptr_t)&next;
add[5] = (uintptr_t)&next2;
add[6] = (uintptr_t)&players[0];
add[7] = (uintptr_t)&valid;
add[8] = (uintptr_t)&max_dist;
@ -144,13 +549,18 @@ int main(int argc, char** argv)
add[17] = (uintptr_t)&allied_spectators;
add[18] = (uintptr_t)&chargerifle;
add[19] = (uintptr_t)&shooting;
printf(XorStr("add offset: 0x%I64x\n"), (uint64_t)&add[0] - (uint64_t)GetModuleHandle(NULL));
add[20] = (uintptr_t)&glowr;
add[21] = (uintptr_t)&glowg;
add[22] = (uintptr_t)&glowb;
add[23] = (uintptr_t)&firing_range;
add[24] = (uintptr_t)&glowtype;
add[25] = (uintptr_t)&glowtype2;
printf(XorStr("Game Version 3.0.11.32 |-| Radar Ver With Color Test |-| Add me offset: 0x%I64x\n"), (uint64_t)&add[0] - (uint64_t)GetModuleHandle(NULL));
Overlay ov1 = Overlay();
ov1.Start();
printf(XorStr("Waiting for host process...\n"));
printf(XorStr("Waiting for The Ban .... Never Gonna Get it!\n"));
while (check == 0xABCD)
{
if (IsKeyDown(VK_F4))
@ -163,9 +573,9 @@ int main(int argc, char** argv)
if (active)
{
ready = true;
printf(XorStr("Ready\n"));
printf(XorStr("Ready To Bring The Cure\n"));
}
while (active)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
@ -174,16 +584,74 @@ int main(int argc, char** argv)
active = false;
}
if (IsKeyDown(VK_F5) && k_f5 == 0)
{
k_f5 = 1;
esp = !esp;
//Load at start for saved settings to take effect. Need to save once to make the file.
for (static bool once = true; once; once = false) {
std::ifstream config("Config.txt");
if (config.is_open())
{
config >> std::boolalpha >> firing_range;
config >> aim;
config >> std::boolalpha >> esp;
config >> std::boolalpha >> item_glow;
config >> std::boolalpha >> player_glow;
config >> std::boolalpha >> aim_no_recoil;
config >> max_dist;
config >> smooth;
config >> max_fov;
config >> bone;
config >> glowr;
config >> glowg;
config >> glowb;
config >> glowtype;
config >> glowtype2;
config >> glowcolor[0];
config >> glowcolor[1];
config >> glowcolor[2];
config >> radarcolorr;
config >> radarcolorg;
config >> radarcolorb;
config >> radarcolor[0];
config >> radarcolor[1];
config >> radarcolor[2];
config >> v.healthbar;
config >> v.shieldbar;
config >> v.distance;
config >> thirdperson;
config >> minimapradar;
config >> fovcircle;
config >> fovsize;
config >> fovsize2;
config >> fovcolor1;
config >> fovcolor2;
config >> fovcolor3;
config >> fovcolorset[0];
config >> fovcolorset[1];
config >> fovcolorset[2];
config >> fovcolorset[3];
config >> fovthick;
//config >> item_current; // no idea how to imput a string of words
config.close();
}
}
else if (!IsKeyDown(VK_F5) && k_f5 == 1)
//Charge Rifle Hotkey is ~
if (IsKeyDown(VK_OEM_3) && chargeriflekp == 0)
{
k_f5 = 0;
chargerifle = true;
chargeriflekp = 1;
}
else if (IsKeyDown(VK_OEM_3) && chargeriflekp == 1)
{
chargerifle = false;
chargeriflekp = 0;
}
//Hotkey to Turn on and off Aimbot
if (IsKeyDown(VK_F6) && k_f6 == 0)
{
k_f6 = 1;
@ -207,43 +675,106 @@ int main(int argc, char** argv)
k_f6 = 0;
}
if (IsKeyDown(VK_F8) && k_f8 == 0)
if (IsKeyDown(VK_F9) && k_f100 == 1)
{
k_f100 = 0;
k_f20 = 1;
k_f8 = 1;
item_glow = !item_glow;
}
else if (!IsKeyDown(VK_F8) && k_f8 == 1)
else if (IsKeyDown(VK_F10) && k_f100 == 0)
{
k_f8 = 0;
k_f20 = 0;
k_f100 = 1;
k_f8 = 1;
}
if (IsKeyDown(VK_LEFT))
if (IsKeyDown(VK_F11))
{
if (max_dist > 100.0f * 40.0f)
max_dist -= 50.0f * 40.0f;
std::this_thread::sleep_for(std::chrono::milliseconds(130));
}
k_f20 = 0;
k_f100 = 0;
bone = 1;
smooth = 100;
if (IsKeyDown(VK_RIGHT))
}
//Big Radar Hokey is T
//Main Map Radar
if (IsKeyDown(0x54) && biggerradartoggle == 0)
{
biggerradartoggle = 1;
switch (bigradar)
{
case 0:
bigradar = true;
break;
case 1:
bigradar = false;
break;
default:
break;
}
}
else if (!IsKeyDown(0x54) && biggerradartoggle == 1)
{
if (max_dist < 800.0f * 40.0f)
max_dist += 50.0f * 40.0f;
std::this_thread::sleep_for(std::chrono::milliseconds(130));
biggerradartoggle = 0;
}
/*
//Main Map Radar, Broken atm
if (IsKeyDown(0x4D) && mainradartoggle == 0)
{
mainradartoggle = 1;
switch (mainradarmap)
{
case 0:
mainradarmap = true;
minimapradar = false;
break;
case 1:
mainradarmap = false;
minimapradar = true;
break;
default:
break;
}
}
else if (!IsKeyDown(0x4D) && mainradartoggle == 1)
{
mainradartoggle = 0;
}
*/
if (IsKeyDown(aim_key))
{
aiming = true;
zoomf1 = 1;
}
else if (IsKeyDown(aim_key2))
aiming = true;
else
{
aiming = false;
zoomf1 = 0;
}
if (IsKeyDown(shoot_key))
{
shooting = true;
else
shooting = false;
}
if (IsKeyDown(shoot_key2))
{
shooting = true;
}
}
ready = false;
ov1.Clear();
if(!use_nvidia)
system(XorStr("taskkill /F /T /IM overlay_ap.exe")); //custom overlay process name
if (!use_nvidia)
system(XorStr("taskkill /F /T /IM Nvspcaps64.exe")); //custom overlay process name
return 0;
}
}

@ -2,9 +2,27 @@
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <fstream>
#include <iostream>
#include <locale>
//#include <d3d10_1.h>
//#include "D3DX10Math.h"
#include "math.h"
#include "overlay.h"
#include "overlay.h"
#include <d3d11.h>
#include <thread>
#include <future>
//#include <DirectXMath.h>

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 KiB

@ -0,0 +1,57 @@
#define VERSION STEAM
#if VERSION == STEAM
#define OFFSET_ENTITYLIST 0x1a1e3b8
#define OFFSET_LOCAL_ENT 0x1dcf5e8 //LocalPlayer
#define OFFSET_NAME_LIST 0xba2ea30
#define OFFSET_THIRDPERSON 0x01a02db0 + 0x6c //thirdperson_override + 0x6c
#define OFFSET_TIMESCALE 0x013fa370 //host_timescale
#define OFFSET_TEAM 0x448 //m_iTeamNum
#define OFFSET_HEALTH 0x438 //m_iHealth
#define OFFSET_SHIELD 0x170 //m_shieldHealth
#define OFFSET_NAME 0x589 //m_iName
#define OFFSET_SIGN_NAME 0x580 //m_iSignifierName
#define OFFSET_ABS_VELOCITY 0x140 //m_vecAbsVelocity
#define OFFSET_VISIBLE_TIME 0x1ad4 //CPlayer!lastVisibleTime
#define OFFSET_ZOOMING 0x1c51 //m_bZooming
#define OFFSET_THIRDPERSON_SV 0x36a8 //m_thirdPersonShoulderView
#define OFFSET_YAW 0x22a0 - 0x8 //m_currentFramePlayer.m_ammoPoolCount - 0x8
#define OFFSET_LIFE_STATE 0x798 //m_lifeState, >0 = dead
#define OFFSET_BLEED_OUT_STATE 0x2720 //m_bleedoutState, >0 = knocked
#define OFFSET_ORIGIN 0x014c //m_vecAbsOrigin
#define OFFSET_BONES 0x0f50 - 0x18 //m_bConstrainBetweenEndpoints - 0x18
#define OFFSET_AIMPUNCH 0x2498 //m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle
#define OFFSET_CAMERAPOS 0x1f40 //CPlayer!camera_origin
#define OFFSET_VIEWANGLES 0x2594 - 0x14 //m_ammoPoolCapacity - 0x14
#define OFFSET_BREATH_ANGLES OFFSET_VIEWANGLES - 0x10
#define OFFSET_OBSERVER_MODE 0x34bc //m_iObserverMode
#define OFFSET_OBSERVING_TARGET 0x34c8 //m_hObserverTarget
#define OFFSET_MATRIX 0x11a210
#define OFFSET_RENDER 0x75441d0
#define OFFSET_WEAPON 0x1a6c //m_latestPrimaryWeapons
#define OFFSET_BULLET_SPEED 0x1f28 //CWeaponX!m_flProjectileSpeed
#define OFFSET_BULLET_SCALE 0x1f30 //CWeaponX!m_flProjectileScale
#define OFFSET_ZOOM_FOV 0x1718 + 0xb8 //m_playerData + m_curZoomFOV
#define OFFSET_AMMO 0x16d0 //m_ammoInClip
#define OFFSET_ITEM_GLOW 0x2c0 //m_highlightFunctionBits
#define OFFSET_GLOW_T1 0x262 //16256 = enabled, 0 = disabled
#define OFFSET_GLOW_T2 0x2dc //1193322764 = enabled, 0 = disabled
#define OFFSET_GLOW_ENABLE 0x3c8 //7 = enabled, 2 = disabled
#define OFFSET_GLOW_THROUGH_WALLS 0x3d0 //2 = enabled, 5 = disabled
#define GLOW_COLOR_R 0x1D0
#define GLOW_COLOR_G 0x1D4
#define GLOW_COLOR_B 0x1D8
#endif

@ -1,5 +1,10 @@
#include "overlay.h"
#include <fstream>
#include <iomanip>
using namespace std;
extern bool firing_range;
extern int aim;
extern bool esp;
extern bool item_glow;
@ -15,6 +20,31 @@ extern bool thirdperson;
extern int spectators;
extern int allied_spectators;
extern bool chargerifle;
//glow color and type
extern float glowr;
extern float glowg;
extern float glowb;
extern int glowtype;
extern int glowtype2;
extern float glowcolor[3];
//radar color
extern bool minimapradar;
unsigned int radarcolorr = 0;
unsigned int radarcolorg = 0;
unsigned int radarcolorb = 0;
extern float radarcolor[3];
//Main Map Radar
extern bool mainradarmap;
//fov stuff
extern bool fovcircle;
extern float fovsize;
extern float fovsize2;
extern float fovcolorset[4];
extern float fovcolor1;
extern float fovcolor2;
extern float fovcolor3;
extern float fovthick;
int width;
int height;
@ -103,24 +133,20 @@ void Overlay::RenderMenu()
aim_enable = false;
vis_check = false;
}
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(ImVec2(490, 215));
ImGui::Begin(XorStr("##title"), (bool*)true, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar);
if (ImGui::BeginTabBar(XorStr("Tab")))
{
if (ImGui::BeginTabItem(XorStr("Main")))
{
ImGui::Checkbox(XorStr("ESP"), &esp);
ImGui::SetNextWindowSize(ImVec2(450, 860), ImGuiCond_Once);
ImGui::Begin(XorStr("##title"), (bool*)true, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar);
ImGui::Sliderbox(XorStr("ESP Toggle"), &esp);
ImGui::Checkbox(XorStr("AIM"), &aim_enable);
ImGui::Sliderbox(XorStr("AIM Toggle"), &aim_enable);
if (aim_enable)
{
ImGui::SameLine();
ImGui::Checkbox(XorStr("Visibility check"), &vis_check);
ImGui::Sliderbox(XorStr("Visibility Check"), &vis_check);
ImGui::SameLine();
ImGui::Checkbox(XorStr("No recoil/sway"), &aim_no_recoil);
ImGui::Sliderbox(XorStr("No Recoil/Sway"), &aim_no_recoil);
if (vis_check)
{
aim = 2;
@ -135,58 +161,206 @@ void Overlay::RenderMenu()
aim = 0;
}
ImGui::Checkbox(XorStr("Glow items"), &item_glow);
ImGui::Checkbox(XorStr("Glow players"), &player_glow);
ImGui::Checkbox(XorStr("Thirdperson"), &thirdperson);
ImGui::Checkbox(XorStr("Charge rifle hack"), &chargerifle);
ImGui::EndTabItem();
}
if (ImGui::BeginTabItem(XorStr("Config")))
{
ImGui::Sliderbox(XorStr("Glow Items"), &item_glow);
ImGui::SameLine();
ImGui::Sliderbox(XorStr("Glow Players"), &player_glow);
ImGui::Sliderbox(XorStr("Thirdperson"), &thirdperson);
ImGui::Sliderbox(XorStr("Charge Rifle Hack"), &chargerifle);
ImGui::Sliderbox(XorStr("Firing Range Toggle"), &firing_range);
ImGui::Sliderbox(XorStr("Radar"), &minimapradar);
/*
//Full man Radar, Broken atm
ImGui::Sliderbox("Main Map Toggle Test", &mainradarmap);
*/
ImGui::Sliderbox("Circle Fov", &fovcircle);
ImGui::Text(XorStr("Max distance:"));
ImGui::SliderFloat(XorStr("##1"), &max_dist, 100.0f * 40, 800.0f * 40, "%.2f");
ImGui::SameLine();
ImGui::Text("(%d meters)", (int)(max_dist / 40));
ImGui::Text(XorStr("Smooth Aim Value:"));
ImGui::SliderFloat(XorStr("##2"), &smooth, 85.0f, 150.0f, "%.2f");
ImGui::SameLine();
ImGui::Text(XorStr("85 To 100 Is Safe"));
ImGui::Text(XorStr("Max FOV:"));
ImGui::SliderFloat(XorStr("##3"), &max_fov, 1.0f, 50.0f, "%.2f");
ImGui::Text(XorStr("Aiming Bone:"));
ImGui::Text(XorStr("0=Head, 1=Neck, 2=Chest, 3=Stomach"));
ImGui::SliderInt(XorStr("##bone slider"), &bone, 0, 3);
ImGui::Text(XorStr("ESP options:"));
ImGui::Sliderbox(XorStr("Distance"), &v.distance);
ImGui::SameLine();
ImGui::Sliderbox(XorStr("Health bar"), &v.healthbar);
ImGui::SameLine();
ImGui::Sliderbox(XorStr("Shield bar"), &v.shieldbar);
//Glow Color
ImGui::Text(XorStr("Glow Color Picker:"));
ImGui::ColorEdit3("##Glow Color Picker", glowcolor);
{
glowr = glowcolor[0] * 250;
glowg = glowcolor[1] * 250;
glowb = glowcolor[2] * 250;
}
//Radar Color
ImGui::Text(XorStr("Radar Color Picker:"));
ImGui::ColorEdit3("##Radar Color Picker", radarcolor);
{
radarcolorr = radarcolor[0] * 250;
radarcolorg = radarcolor[1] * 250;
radarcolorb = radarcolor[2] * 250;
}
//Fov Circle Color
ImGui::Text(XorStr("Fov Circle Color Picker:"));
ImGui::ColorEdit4("##Fov Circle Color Picker", fovcolorset);
{
ImGui::Text(XorStr("Smooth aim value:"));
ImGui::SliderFloat(XorStr("##2"), &smooth, 12.0f, 150.0f, "%.2f");
fovcolor1 = fovcolorset[0] * 250;
fovcolor2 = fovcolorset[1] * 250;
fovcolor3 = fovcolorset[2] * 250;
fovthick = fovcolorset[3] * 250;
}
ImGui::Text(XorStr("Max FOV:"));
ImGui::SliderFloat(XorStr("##3"), &max_fov, 5.0f, 250.0f, "%.2f");
ImGui::Text(XorStr("Saving and Loading:"));
ImGui::Text(XorStr("Aim at (bone id):"));
ImGui::SliderInt(XorStr("##4"), &bone, 0, 175);
ImGui::EndTabItem();
}
if (ImGui::BeginTabItem(XorStr("Visuals")))
{
ImGui::Text(XorStr("ESP options:"));
ImGui::Checkbox(XorStr("Box"), &v.box);
ImGui::SameLine(0, 70.0f);
ImGui::Checkbox(XorStr("Name"), &v.name);
ImGui::Checkbox(XorStr("Line"), &v.line);
ImGui::Checkbox(XorStr("Distance"), &v.distance);
ImGui::Checkbox(XorStr("Health bar"), &v.healthbar);
ImGui::Checkbox(XorStr("Shield bar"), &v.shieldbar);
ImGui::EndTabItem();
}
ImGui::EndTabBar();
}
//Saving
if (ImGui::Button("Save Config"))
{
ofstream config("Config.txt");
if (config.is_open())
{
config << std::boolalpha << firing_range << "\n";
config << aim << "\n";
config << std::boolalpha << esp << "\n";
config << std::boolalpha << item_glow << "\n";
config << std::boolalpha << player_glow << "\n";
config << std::boolalpha << aim_no_recoil << "\n";
config << max_dist << "\n";
config << smooth << "\n";
config << max_fov << "\n";
config << bone << "\n";
config << glowr << "\n";
config << glowg << "\n";
config << glowb << "\n";
config << glowtype << "\n";
config << glowtype2 << "\n";
config << glowcolor[0] << "\n";
config << glowcolor[1] << "\n";
config << glowcolor[2] << "\n";
config << radarcolorr << "\n";
config << radarcolorg << "\n";
config << radarcolorb << "\n";
config << radarcolor[0] << "\n";
config << radarcolor[1] << "\n";
config << radarcolor[2] << "\n";
config << v.healthbar << "\n";
config << v.shieldbar << "\n";
config << v.distance << "\n";
config << thirdperson<< "\n";
config << std::boolalpha << minimapradar << "\n";
config << fovcircle << "\n";
config << fovsize << "\n";
config << fovsize2 << "\n";
config << fovcolor1 << "\n";
config << fovcolor2 << "\n";
config << fovcolor3 << "\n";
config << fovcolorset[0] << "\n";
config << fovcolorset[1] << "\n";
config << fovcolorset[2] << "\n";
config << fovcolorset[3] << "\n";
config << fovthick;
config.close();
}
}
ImGui::SameLine();
//Loading
if (ImGui::Button("Load Config"))
{
ifstream config("Config.txt");
if (config.is_open())
{
config >> std::boolalpha >> firing_range;
config >> aim;
config >> std::boolalpha >> esp;
config >> std::boolalpha >> item_glow;
config >> std::boolalpha >> player_glow;
config >> std::boolalpha >> aim_no_recoil;
config >> max_dist;
config >> smooth;
config >> max_fov;
config >> bone;
config >> glowr;
config >> glowg;
config >> glowb;
config >> glowtype;
config >> glowtype2;
config >> glowcolor[0];
config >> glowcolor[1];
config >> glowcolor[2];
config >> radarcolorr;
config >> radarcolorg;
config >> radarcolorb;
config >> radarcolor[0];
config >> radarcolor[1];
config >> radarcolor[2];
config >> v.healthbar;
config >> v.shieldbar;
config >> v.distance;
config >> thirdperson;
config >> minimapradar;
config >> fovcircle;
config >> fovsize;
config >> fovsize2;
config >> fovcolor1;
config >> fovcolor2;
config >> fovcolor3;
config >> fovcolorset[0];
config >> fovcolorset[1];
config >> fovcolorset[2];
config >> fovcolorset[3];
config >> fovthick;
config.close();
}
}
ImGui::Text(XorStr("Overlay FPS: %.3f ms/frame (%.1f FPS)"), 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
void Overlay::RenderInfo()
{
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(ImVec2(50, 25));
ImGui::Begin(XorStr("##info"), (bool*)true, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar);
DrawLine(ImVec2(9, 5), ImVec2(45, 5), RED, 2);
ImGui::SetNextWindowSize(ImVec2(150, 25));
ImGui::Begin(XorStr("##info"), (bool*)true, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar);
DrawLine(ImVec2(1, 5), ImVec2(140, 5), RED, 2);
ImGui::TextColored(RED, "%d", spectators);
ImGui::SameLine();
ImGui::Text("-");
ImGui::Text("--");
ImGui::SameLine();
ImGui::TextColored(GREEN, "%d", allied_spectators);
ImGui::SameLine();
ImGui::Text("--");
ImGui::SameLine();
//Aim is on = 2, On but No Vis Check = 1, Off = 0
if (aim == 2)
{
ImGui::TextColored(GREEN, "Aim On %d", aim);
}
else
{
ImGui::TextColored(RED, "Aim Off %d", aim);
}
ImGui::End();
}
@ -433,6 +607,7 @@ void Overlay::DrawBox(ImColor color, float x, float y, float w, float h)
DrawLine(ImVec2(x, y + h), ImVec2(x + w, y + h), color, 1.0f);
}
void Overlay::Text(ImVec2 pos, ImColor color, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect)
{
ImGui::GetWindowDrawList()->AddText(ImGui::GetFont(), ImGui::GetFontSize(), pos, color, text_begin, text_end, wrap_width, cpu_fine_clip_rect);
@ -458,4 +633,304 @@ void Overlay::ProgressBar(float x, float y, float w, float h, int value, int v_m
);
RectFilled(x, y, x + w, y + ((h / float(v_max)) * (float)value), barColor, 0.0f, 0);
}
}
//Seer Hp and Shield bars (never re fixed the armor type so its set to max shield)
void DrawQuadFilled(ImVec2 p1, ImVec2 p2, ImVec2 p3, ImVec2 p4, ImColor color) {
ImGui::GetWindowDrawList()->AddQuadFilled(p1, p2, p3, p4, color);
}
void DrawHexagon(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p5, const ImVec2& p6, ImU32 col, float thickness)
{
ImGui::GetWindowDrawList()->AddHexagon(p1, p2, p3, p4, p5, p6, col, thickness);
}
void DrawHexagonFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p5, const ImVec2& p6, ImU32 col)
{
ImGui::GetWindowDrawList()->AddHexagonFilled(p1, p2, p3, p4, p5, p6, col);
}
void Overlay::DrawSeerLikeHealth(float x, float y, int shield, int max_shield, int armorType, int health) {
int bg_offset = 3;
int bar_width = 158;
// 4steps...2*3=6
// 38*4=152 152+6 = 158
// 5steps...2*4=8
// 30*5=150 150+8 = 158
float max_health = 100.0f;
float shield_step = 25.0f;
int shield_25 = 30;
int steps = 5;
ImVec2 bg1(x - bar_width / 2 - bg_offset, y);
ImVec2 bg2(bg1.x - 10, bg1.y - 16);
ImVec2 bg3(bg2.x + 5, bg2.y - 7);
ImVec2 bg4(bg3.x + bar_width + bg_offset, bg3.y);
ImVec2 bg5(bg4.x + 11, bg4.y + 18);
ImVec2 bg6(x + bar_width / 2 + bg_offset, y);
DrawHexagonFilled(bg1, bg2, bg3, bg4, bg5, bg6, ImColor(0, 0, 0, 120));
ImVec2 h1(bg1.x + 3, bg1.y - 4);
ImVec2 h2(h1.x - 5, h1.y - 8);
ImVec2 h3(h2.x + (float)health / max_health * bar_width, h2.y);
ImVec2 h4(h1.x + (float)health / max_health * bar_width, h1.y);
ImVec2 h3m(h2.x + bar_width, h2.y);
ImVec2 h4m(h1.x + bar_width, h1.y);
DrawQuadFilled(h1, h2, h3m, h4m, ImColor(10, 10, 30, 60));
DrawQuadFilled(h1, h2, h3, h4, WHITE);
ImColor shieldCracked(97, 97, 97);
ImColor shieldCrackedDark(67, 67, 67);
ImColor shieldCol;
ImColor shieldColDark; //not used, but the real seer q has shadow inside
if (max_shield == 50) { //white
shieldCol = ImColor(247, 247, 247);
shieldColDark = ImColor(164, 164, 164);
}
else if (max_shield == 75) { //blue
shieldCol = ImColor(39, 178, 255);
shieldColDark = ImColor(27, 120, 210);
}
else if (max_shield == 100) { //purple
shieldCol = ImColor(206, 59, 255);
shieldColDark = ImColor(136, 36, 220);
}
else if (max_shield == 100) { //gold
shieldCol = ImColor(255, 255, 79);
shieldColDark = ImColor(218, 175, 49);
}
else if (max_shield == 125) { //red
shieldCol = ImColor(219, 2, 2);
shieldColDark = ImColor(219, 2, 2);
}
else {
shieldCol = ImColor(247, 247, 247);
shieldColDark = ImColor(164, 164, 164);
}
int shield_tmp = shield;
int shield1 = 0;
int shield2 = 0;
int shield3 = 0;
int shield4 = 0;
int shield5 = 0;
if (shield_tmp > 25) {
shield1 = 25;
shield_tmp -= 25;
if (shield_tmp > 25) {
shield2 = 25;
shield_tmp -= 25;
if (shield_tmp > 25) {
shield3 = 25;
shield_tmp -= 25;
if (shield_tmp > 25) {
shield4 = 25;
shield_tmp -= 25;
shield5 = shield_tmp;
}
else {
shield4 = shield_tmp;
}
}
else {
shield3 = shield_tmp;
}
}
else {
shield2 = shield_tmp;
}
}
else {
shield1 = shield_tmp;
}
ImVec2 s1(h2.x - 1, h2.y - 2);
ImVec2 s2(s1.x - 3, s1.y - 5);
ImVec2 s3(s2.x + shield1 / shield_step * shield_25, s2.y);
ImVec2 s4(s1.x + shield1 / shield_step * shield_25, s1.y);
ImVec2 s3m(s2.x + shield_25, s2.y);
ImVec2 s4m(s1.x + shield_25, s1.y);
ImVec2 ss1(s4m.x + 2, s1.y);
ImVec2 ss2(s3m.x + 2, s2.y);
ImVec2 ss3(ss2.x + shield2 / shield_step * shield_25, s2.y);
ImVec2 ss4(ss1.x + shield2 / shield_step * shield_25, s1.y);
ImVec2 ss3m(ss2.x + shield_25, s2.y);
ImVec2 ss4m(ss1.x + shield_25, s1.y);
ImVec2 sss1(ss4m.x + 2, s1.y);
ImVec2 sss2(ss3m.x + 2, s2.y);
ImVec2 sss3(sss2.x + shield3 / shield_step * shield_25, s2.y);
ImVec2 sss4(sss1.x + shield3 / shield_step * shield_25, s1.y);
ImVec2 sss3m(sss2.x + shield_25, s2.y);
ImVec2 sss4m(sss1.x + shield_25, s1.y);
ImVec2 ssss1(sss4m.x + 2, s1.y);
ImVec2 ssss2(sss3m.x + 2, s2.y);
ImVec2 ssss3(ssss2.x + shield4 / shield_step * shield_25, s2.y);
ImVec2 ssss4(ssss1.x + shield4 / shield_step * shield_25, s1.y);
ImVec2 ssss3m(ssss2.x + shield_25, s2.y);
ImVec2 ssss4m(ssss1.x + shield_25, s1.y);
ImVec2 sssss1(ssss4m.x + 2, s1.y);
ImVec2 sssss2(ssss3m.x + 2, s2.y);
ImVec2 sssss3(sssss2.x + shield5 / shield_step * shield_25, s2.y);
ImVec2 sssss4(sssss1.x + shield5 / shield_step * shield_25, s1.y);
ImVec2 sssss3m(sssss2.x + shield_25, s2.y);
ImVec2 sssss4m(sssss1.x + shield_25, s1.y);
if (max_shield == 50) {
if (shield <= 25) {
if (shield < 25) {
DrawQuadFilled(s1, s2, s3m, s4m, shieldCracked);
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
}
else if (shield <= 50) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
if (shield != 50) {
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
}
}
else if (max_shield == 75) {
if (shield <= 25) {
if (shield < 25) {
DrawQuadFilled(s1, s2, s3m, s4m, shieldCracked);
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
}
else if (shield <= 50) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
if (shield < 50) {
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
}
else if (shield <= 75) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
if (shield < 75) {
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(sss1, sss2, sss3, sss4, shieldCol);
}
}
else if (max_shield == 100) {
if (shield <= 25) {
if (shield < 25) {
DrawQuadFilled(s1, s2, s3m, s4m, shieldCracked);
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
}
else if (shield <= 50) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
if (shield < 50) {
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
}
else if (shield <= 75) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
if (shield < 75) {
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(sss1, sss2, sss3, sss4, shieldCol);
}
else if (shield <= 100) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
DrawQuadFilled(sss1, sss2, sss3, sss4, shieldCol);
if (shield < 100) {
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(ssss1, ssss2, ssss3, ssss4, shieldCol);
}
}
else if (max_shield == 125) {
if (shield <= 25) {
if (shield < 25) {
DrawQuadFilled(s1, s2, s3m, s4m, shieldCracked);
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
DrawQuadFilled(sssss1, sssss2, sssss3m, sssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
}
else if (shield <= 50) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
if (shield < 50) {
DrawQuadFilled(ss1, ss2, ss3m, ss4m, shieldCracked);
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
DrawQuadFilled(sssss1, sssss2, sssss3m, sssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
}
else if (shield <= 75) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
if (shield < 75) {
DrawQuadFilled(sss1, sss2, sss3m, sss4m, shieldCracked);
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
DrawQuadFilled(sssss1, sssss2, sssss3m, sssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(sss1, sss2, sss3, sss4, shieldCol);
}
else if (shield <= 100) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
DrawQuadFilled(sss1, sss2, sss3, sss4, shieldCol);
if (shield < 100) {
DrawQuadFilled(ssss1, ssss2, ssss3m, ssss4m, shieldCracked);
DrawQuadFilled(sssss1, sssss2, sssss3m, sssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(ssss1, ssss2, ssss3, ssss4, shieldCol);
}
else if (shield <= 125) {
DrawQuadFilled(s1, s2, s3, s4, shieldCol);
DrawQuadFilled(ss1, ss2, ss3, ss4, shieldCol);
DrawQuadFilled(sss1, sss2, sss3, sss4, shieldCol);
DrawQuadFilled(ssss1, ssss2, ssss3, ssss4, shieldCol);
if (shield < 125) {
DrawQuadFilled(sssss1, sssss2, sssss3m, sssss4m, shieldCracked);
}
if (shield != 0)
DrawQuadFilled(sssss1, sssss2, sssss3, sssss4, shieldCol);
}
}
}

@ -15,6 +15,8 @@
#include "imgui/imgui_impl_dx11.h"
#include "imgui/imgui_impl_win32.h"
#include <d3d11.h>
#include <d3d10_1.h>
#include "D3DX10Math.h"
#pragma comment(lib, "d3d11.lib")
#define GREEN ImColor(0, 255, 0)
@ -25,8 +27,8 @@
typedef struct visuals
{
bool box = true;
bool line = true;
bool box = false;
bool line = false;
bool distance = true;
bool healthbar = true;
bool shieldbar = true;
@ -51,7 +53,9 @@ public:
void RectFilled(float x0, float y0, float x1, float y1, ImColor color, float rounding, int rounding_corners_flags);
void ProgressBar(float x, float y, float w, float h, int value, int v_max);
void String(ImVec2 pos, ImColor color, const char* text);
//Seer
void DrawSeerLikeHealth(float x, float y, int shield, int max_shield, int armorType, int health);
private:
bool running;
HWND overlayHWND;
};
};

@ -0,0 +1,28 @@
#include <d3d10_1.h>
#include "D3DX10Math.h"
#ifndef PLAYERDEF_H
#define PLAYERDEF_H
typedef struct player
{
float dist = 0;
int entity_team = 0;
float boxMiddle = 0;
float h_y = 0;
float width = 0;
float height = 0;
float b_x = 0;
float b_y = 0;
bool knocked = false;
bool visible = false;
int health = 0;
int shield = 0;
//seer
int maxshield = 0;
int armortype = 0;
D3DXVECTOR3 EntityPosition;
D3DXVECTOR3 LocalPlayerPosition;
D3DXVECTOR3 localviewangle;
char name[33] = { 0 };
}player;
#endif

@ -0,0 +1,59 @@
#pragma once
#include <utility.hpp>
#include <xstring>
#include <iomanip>
inline uintptr_t BaseAddress = ( uintptr_t ) GetModuleHandle( NULL );
#define ENTITY_MAX_COUNT 15000
enum classes : int32_t
{
pEntityList,
pCInput,
pLocalPlayer,
pNameList,
pViewRender,
pViewMatrix,
pLastVisibleTime,
};
class update
{
public:
static auto GetClass( classes offset_name )
{
uint64_t offset;
switch ( offset_name )
{
case pEntityList:
offset = scanner::find( x( "4C 8D 05 ? ? ? ? 4C 8B 25 ? ? ? ?" ) );
break;
case pViewRender:
offset = scanner::find( x( "48 8B 0D ? ? ? ? 48 8B 01 FF 50 40 48 8B 0D ? ? ? ?" ) );
break;
case pCInput:
offset = scanner::find( x( "4C 8B 05 ? ? ? ? 48 8D 0D ? ? ? ? 49 8B 80 80 00 00 00" ) );
break;
case pLocalPlayer:
offset = scanner::find( x( "48 8B 05 ? ? ? ? 48 0F 44 C7" ) );
break;
case pNameList:
offset = scanner::find( x( "48 8D 05 ? ? ? ? FF CA" ) );
break;
case pViewMatrix:
offset = scanner::find( x( "48 8D 1D ? ? ? ? 66 0F 1F 84 00 00 00 00 00 48 8B 01 48 0F BE F7 49 3B C6 0F 85" ) );
break;
case pLastVisibleTime:
offset = scanner::find( x( "C0 03 00 00 00 00 00" ) );
break;
default:
break;
}
offset -= ( uint64_t ) GetModuleHandle( NULL );
return offset;
}
};

File diff suppressed because it is too large Load Diff

@ -1,25 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29519.87
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Overlay", "Overlay\Overlay.vcxproj", "{68C049A1-7EA4-45D2-942C-7710AF16B1FA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Debug|x64.ActiveCfg = Debug|x64
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Debug|x64.Build.0 = Debug|x64
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Release|x64.ActiveCfg = Release|x64
{68C049A1-7EA4-45D2-942C-7710AF16B1FA}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CA1CD6B1-E5B8-4031-A3BE-BCFCBAE43EEA}
EndGlobalSection
EndGlobal

@ -1,83 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{68C049A1-7EA4-45D2-942C-7710AF16B1FA}</ProjectGuid>
<RootNamespace>Overlay</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>Overlay</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<SpectreMitigation>false</SpectreMitigation>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<SpectreMitigation>false</SpectreMitigation>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<TargetName>overlay_ap</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

@ -1,48 +0,0 @@
#include <Windows.h>
#include <chrono>
#include <Dwmapi.h>
#pragma comment(lib, "dwmapi.lib")
const MARGINS margins = { -1 ,-1, -1, -1 };
const wchar_t g_szClassName[] = L"overlay";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(RGB(0,0,0));
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
hwnd = CreateWindowEx(
WS_EX_LAYERED | WS_EX_TRANSPARENT,
g_szClassName,
g_szClassName,
WS_POPUP | WS_VISIBLE,
0, 0, 1920, 1080,
NULL, NULL, hInstance, NULL);
SetLayeredWindowAttributes(hwnd, RGB(0,0,0), 255, LWA_ALPHA);
DwmExtendFrameIntoClientArea(hwnd, &margins);
while (GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
exit(0);
return Msg.wParam;
}
Loading…
Cancel
Save