parent
1b381acdd0
commit
b8c8a5637a
@ -0,0 +1 @@
|
||||
# LinuxDMA
|
@ -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
|
@ -0,0 +1 @@
|
||||
Add your own or use minhook
|
@ -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 );
|
||||
}
|
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
|
@ -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,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…
Reference in New Issue